v0.3.15-pre.004
This commit is contained in:
@@ -1,12 +1,12 @@
|
||||
# file: Cargo.toml
|
||||
# version: 597
|
||||
# version: 598
|
||||
|
||||
[workspace]
|
||||
resolver = "3"
|
||||
members = ["crates/ksp-app-backfill-desk", "crates/ksp-app-config-desk", "crates/ksp-app-solprices-desk", "crates/ksp-app-store-desk", "crates/ksp-app-wallet-desk", "crates/ksp-config-lib", "crates/ksp-core-lib", "crates/ksp-interface-lib", "crates/ksp-job-api", "crates/ksp-job-backfill-lib", "crates/ksp-logging-lib", "crates/ksp-offchain-transport-lib", "crates/ksp-onchain-transport-lib", "crates/ksp-program-api", "crates/ksp-raw-transaction-lib", "crates/ksp-store-api", "crates/ksp-store-lib", "crates/ksp-store-postgres-lib", "crates/ksp-wallet-lib", "crates/ksp-worker-api", "crates/ksp-worker-raw-transaction-ingest-lib"]
|
||||
|
||||
[workspace.package]
|
||||
version = "0.3.15-pre.3"
|
||||
version = "0.3.15-pre.4"
|
||||
edition = "2024"
|
||||
license = "MIT"
|
||||
repository = "https://git.sasedev.com/Sasedev/khadhroony-solana-project"
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
<!-- file: crates/ksp-worker-raw-transaction-ingest-lib/README.md -->
|
||||
<!-- version: 12 -->
|
||||
<!-- version: 13 -->
|
||||
|
||||
# ksp-worker-raw-transaction-ingest-lib
|
||||
|
||||
@@ -93,14 +93,14 @@ Un inventaire privé `source_key -> latest processing/source state`, borné à 3
|
||||
`RawTransactionIngestStandardLogsSource::new` reçoit :
|
||||
|
||||
```text
|
||||
WsEndpointSettings kind solana_standard
|
||||
WsEndpointSettings kind solana_standard avec capability Logs déclarée
|
||||
SolanaLogsSubscribeFilter
|
||||
SolanaCommitment Confirmed ou Finalized
|
||||
HttpTransportPool
|
||||
HttpRoleName d'hydration
|
||||
```
|
||||
|
||||
La construction est sans I/O. Elle refuse un endpoint WS invalide ou non standard, `Processed`, un réseau/provenance non représentable et l'absence de route HTTP `getTransaction` compatible sur le même réseau. Le filtre `All`, `AllWithVotes` ou `Mentions(pubkey)` participe uniquement à une empreinte privée ; le pubkey d'un filtre `Mentions` n'est pas recopié dans `Debug`, snapshot ou provenance textuelle.
|
||||
La construction est sans I/O. Elle refuse un endpoint WS invalide ou non standard, une capability `Logs` absente ou non déclarée, `Processed`, un réseau/provenance non représentable et l'absence de route HTTP `getTransaction` compatible sur le même réseau. Le filtre `All`, `AllWithVotes` ou `Mentions(pubkey)` participe uniquement à une empreinte privée ; le pubkey d'un filtre `Mentions` n'est pas recopié dans `Debug`, snapshot ou provenance textuelle.
|
||||
|
||||
Au runtime, le Worker ouvre `SolanaStandardWsSession::connect`, puis `logs_subscribe`. Les lignes de logs et `err` restent dans Transport et ne sont jamais stockées dans le signal Worker. Seuls `context.slot` et `signature` sont projetés vers l'hydration commune. Reconnect, resubscribe et backpressure de la subscription restent possédés par Transport.
|
||||
|
||||
@@ -109,12 +109,12 @@ Au runtime, le Worker ouvre `SolanaStandardWsSession::connect`, puis `logs_subsc
|
||||
`RawTransactionIngestStandardBlockSource::new` reçoit :
|
||||
|
||||
```text
|
||||
WsEndpointSettings kind solana_standard
|
||||
WsEndpointSettings kind solana_standard avec capability Block déclarée
|
||||
SolanaBlockSubscribeFilter
|
||||
SolanaCommitment Confirmed ou Finalized
|
||||
```
|
||||
|
||||
Le runtime ouvre la `SolanaStandardWsSession` existante et demande exactement `Base64`, `Full`, `maxSupportedTransactionVersion = 1` et `showRewards = false`. Aucun `HttpTransportPool` n'est attaché à cette source : les transactions dont la version est explicitement `Legacy`, `0` ou `1` sont transformées directement en `RawTransactionMaterial` à partir du wire Base64 du bloc, avec signature embarquée, slot, block time, meta, version et index de transaction.
|
||||
La construction est sans I/O et refuse un endpoint qui ne déclare pas explicitement la capability `Block`. Le runtime ouvre ensuite la `SolanaStandardWsSession` existante et demande exactement `Base64`, `Full`, `maxSupportedTransactionVersion = 1` et `showRewards = false`. Aucun `HttpTransportPool` n'est attaché à cette source : les transactions dont la version est explicitement `Legacy`, `0` ou `1` sont transformées directement en `RawTransactionMaterial` à partir du wire Base64 du bloc, avec signature embarquée, slot, block time, meta, version et index de transaction.
|
||||
|
||||
La qualification est fermée : une version omise/nulle ou supérieure à `1`, une transaction non Base64, `block: null`, une erreur distante de notification, un slot de contexte incohérent ou un champ transactions absent/nul termine la source par une erreur sûre. Aucun de ces cas n'est converti en bloc vide, en succès silencieux ou en progression artificielle de frontier.
|
||||
|
||||
@@ -125,14 +125,14 @@ Pour un bloc multi-transaction, le slot n'est projeté settled qu'après l'admis
|
||||
`RawTransactionIngestHeliusTransactionSource::new` reçoit :
|
||||
|
||||
```text
|
||||
WsEndpointSettings kind helius_laserstream
|
||||
WsEndpointSettings kind helius_laserstream avec capability HeliusTransaction déclarée
|
||||
HeliusTransactionSubscribeFilter
|
||||
SolanaCommitment Confirmed ou Finalized
|
||||
HttpTransportPool
|
||||
HttpRoleName d'hydration
|
||||
```
|
||||
|
||||
La construction est sans I/O. Elle réutilise le contrat Transport existant et impose `Full`, `Base64`, `showRewards = false` et `maxSupportedTransactionVersion = 1`. Le Worker ne lit pas Config, ne lit pas `KSP_SECRET_HELIUS_API_KEY` et ne code aucun tier provider ; l'URL résolue et le credential restent dans l'endpoint Transport fourni par le caller.
|
||||
La construction est sans I/O. Elle exige la capability Transport `HeliusTransaction`, puis réutilise le contrat Transport existant et impose `Full`, `Base64`, `showRewards = false` et `maxSupportedTransactionVersion = 1`. Le Worker ne lit pas Config, ne lit pas `KSP_SECRET_HELIUS_API_KEY` et ne code aucun tier provider ; l'URL résolue et le credential restent dans l'endpoint Transport fourni par le caller.
|
||||
|
||||
Au runtime, `HeliusLaserStreamWsSession::connect` puis `transaction_subscribe` sont utilisés. Seule une notification `Full` conforme au mode demandé est admise ; une forme `Signature`, `Unknown` ou future devient une faute source sûre. Le payload Helius `transaction` n'est jamais copié dans l'état Worker : la projection conserve uniquement signature, slot et transaction index, puis réutilise le coordinateur d'hydration commun `getTransaction observed`.
|
||||
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
<!-- file: crates/ksp-worker-raw-transaction-ingest-lib/USAGE.md -->
|
||||
<!-- version: 12 -->
|
||||
<!-- version: 13 -->
|
||||
|
||||
# Utilisation de ksp-worker-raw-transaction-ingest-lib
|
||||
|
||||
@@ -145,7 +145,7 @@ fn standard_logs_runtime_resources(
|
||||
}
|
||||
```
|
||||
|
||||
`ws_endpoint` doit être un endpoint Transport valide de kind `solana_standard`. Le commitment doit être explicitement `Confirmed` ou `Finalized`. Le pool HTTP doit exposer `getTransaction` via le rôle indiqué sur le même réseau. `All`, `AllWithVotes` et `Mentions(pubkey)` sont acceptés par le contrat Transport ; la valeur du filtre reste privée dans le Worker.
|
||||
`ws_endpoint` doit être un endpoint Transport valide de kind `solana_standard` déclarant explicitement `WsSubscriptionKind::Logs`. Un endpoint legacy dont les capabilities sont absentes est refusé fail-closed. Le commitment doit être explicitement `Confirmed` ou `Finalized`. Le pool HTTP doit exposer `getTransaction` via le rôle indiqué sur le même réseau. `All`, `AllWithVotes` et `Mentions(pubkey)` sont acceptés par le contrat Transport ; la valeur du filtre reste privée dans le Worker.
|
||||
|
||||
### Source Standard Block productive
|
||||
|
||||
@@ -165,7 +165,7 @@ fn standard_block_runtime_resources(
|
||||
}
|
||||
```
|
||||
|
||||
Le Worker demande `Base64`, `Full`, `maxSupportedTransactionVersion = 1` et `showRewards = false`. Une transaction n'est RAW-direct que si sa version est explicitement `Legacy`, `0` ou `1`. Une version omise/nulle ou supérieure, `block: null`, une erreur de bloc, un champ transactions absent/nul ou une transaction non Base64 provoque une faute sûre ; ces cas ne sont jamais assimilés à une progression vide.
|
||||
`ws_endpoint` doit déclarer explicitement `WsSubscriptionKind::Block`; l'absence de déclaration est refusée avant toute connexion. Le Worker demande `Base64`, `Full`, `maxSupportedTransactionVersion = 1` et `showRewards = false`. Une transaction n'est RAW-direct que si sa version est explicitement `Legacy`, `0` ou `1`. Une version omise/nulle ou supérieure, `block: null`, une erreur de bloc, un champ transactions absent/nul ou une transaction non Base64 provoque une faute sûre ; ces cas ne sont jamais assimilés à une progression vide.
|
||||
|
||||
### Source Helius Transaction productive
|
||||
|
||||
@@ -193,7 +193,7 @@ fn helius_transaction_runtime_resources(
|
||||
}
|
||||
```
|
||||
|
||||
`ws_endpoint` doit être un endpoint Transport de kind `helius_laserstream`. Le caller supérieur résout éventuellement `KSP_SECRET_HELIUS_API_KEY` via Config avant de construire l'endpoint ; le Worker ne lit jamais l'environnement ni Config. Le commitment est limité à `Confirmed`/`Finalized` et la route HTTP doit supporter `getTransaction` sur le même réseau.
|
||||
`ws_endpoint` doit être un endpoint Transport de kind `helius_laserstream` déclarant explicitement `WsSubscriptionKind::HeliusTransaction`. L'état capability undeclared est refusé avant toute connexion. Le caller supérieur résout éventuellement `KSP_SECRET_HELIUS_API_KEY` via Config avant de construire l'endpoint ; le Worker ne lit jamais l'environnement ni Config. Le commitment est limité à `Confirmed`/`Finalized` et la route HTTP doit supporter `getTransaction` sur le même réseau.
|
||||
|
||||
Le Worker demande la forme Helius `Full` avec `Base64`, `showRewards = false` et `maxSupportedTransactionVersion = 1`, mais ne fait pas confiance au nested payload pour construire directement le Common RAW. Il conserve seulement signature/slot/index et hydrate par `getTransaction observed`. Une notification d'une autre forme est fail-closed.
|
||||
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
// file: crates/ksp-worker-raw-transaction-ingest-lib/src/runtime_resources.rs
|
||||
// version: 43
|
||||
// version: 44
|
||||
|
||||
use sha2::Digest; // rust-rules: trait-import
|
||||
|
||||
@@ -1201,8 +1201,8 @@ impl crate::RawTransactionIngestYellowstoneSource {
|
||||
|
||||
/// Validated Helius `transactionSubscribe` plus HTTP hydration source owned by the continuous RAW transaction ingest Worker.
|
||||
///
|
||||
/// The caller provides one Transport-owned Helius LaserStream WebSocket endpoint, one Helius transaction filter, a Confirmed/Finalized commitment and one HTTP
|
||||
/// hydration pool/role. The Worker always requests Full/Base64 notifications with `maxSupportedTransactionVersion = 1` but projects only the provider
|
||||
/// The caller provides one Transport-owned Helius LaserStream WebSocket endpoint explicitly declaring `HeliusTransaction`, one Helius transaction filter, a
|
||||
/// Confirmed/Finalized commitment and one HTTP hydration pool/role. The Worker always requests Full/Base64 notifications with `maxSupportedTransactionVersion = 1` but projects only the provider
|
||||
/// signature/slot/index reference into the source-neutral hydration coordinator; the nested Helius payload is never copied into Worker state, while endpoint
|
||||
/// URLs and sensitive endpoint material remain encapsulated by Transport-owned settings and are never exposed by Worker APIs or diagnostics.
|
||||
pub struct RawTransactionIngestHeliusTransactionSource {
|
||||
@@ -1233,6 +1233,9 @@ impl crate::RawTransactionIngestHeliusTransactionSource {
|
||||
if ws_endpoint.protocol() != ksp_onchain_transport_lib::WsProtocolKind::HeliusLaserStream {
|
||||
return std::result::Result::Err(crate::runtime_error("runtime_resources.helius_transaction_protocol_invalid"));
|
||||
}
|
||||
if !ws_endpoint.supports_subscription(ksp_onchain_transport_lib::WsSubscriptionKind::HeliusTransaction) {
|
||||
return std::result::Result::Err(crate::runtime_error("runtime_resources.helius_transaction_capability_missing"));
|
||||
}
|
||||
match commitment {
|
||||
ksp_onchain_transport_lib::SolanaCommitment::Confirmed | ksp_onchain_transport_lib::SolanaCommitment::Finalized => {},
|
||||
ksp_onchain_transport_lib::SolanaCommitment::Processed => {
|
||||
@@ -1788,8 +1791,9 @@ impl std::fmt::Debug for crate::RawTransactionIngestHttpBlockPollingSource {
|
||||
|
||||
/// Validated standard Solana `blockSubscribe` direct RAW source owned by the continuous RAW transaction ingest Worker.
|
||||
///
|
||||
/// The caller provides one Transport-owned standard WebSocket endpoint, one block filter and a Confirmed/Finalized commitment. The source requests Full/Base64
|
||||
/// blocks with `maxSupportedTransactionVersion = 1`, admits only explicitly qualified Legacy/V0/V1 transactions, and treats `block: null`, remote block errors,
|
||||
/// The caller provides one Transport-owned standard WebSocket endpoint explicitly declaring `Block`, one block filter and a Confirmed/Finalized commitment.
|
||||
/// The source requests Full/Base64 blocks with `maxSupportedTransactionVersion = 1`, admits only explicitly qualified Legacy/V0/V1 transactions, and treats
|
||||
/// `block: null`, remote block errors,
|
||||
/// unsupported versions and incomplete block transaction shapes as safe terminal source failures rather than empty progress.
|
||||
pub struct RawTransactionIngestStandardBlockSource {
|
||||
ws_endpoint: ksp_onchain_transport_lib::WsEndpointSettings,
|
||||
@@ -1815,6 +1819,9 @@ impl crate::RawTransactionIngestStandardBlockSource {
|
||||
if ws_endpoint.protocol() != ksp_onchain_transport_lib::WsProtocolKind::SolanaStandard {
|
||||
return std::result::Result::Err(crate::runtime_error("runtime_resources.standard_block_protocol_invalid"));
|
||||
}
|
||||
if !ws_endpoint.supports_subscription(ksp_onchain_transport_lib::WsSubscriptionKind::Block) {
|
||||
return std::result::Result::Err(crate::runtime_error("runtime_resources.standard_block_capability_missing"));
|
||||
}
|
||||
match commitment {
|
||||
ksp_onchain_transport_lib::SolanaCommitment::Confirmed | ksp_onchain_transport_lib::SolanaCommitment::Finalized => {},
|
||||
ksp_onchain_transport_lib::SolanaCommitment::Processed => {
|
||||
@@ -2021,8 +2028,8 @@ impl std::fmt::Debug for crate::RawTransactionIngestStandardBlockSource {
|
||||
|
||||
/// Validated standard Solana `logsSubscribe` plus HTTP hydration source owned by the continuous RAW transaction ingest Worker.
|
||||
///
|
||||
/// The caller provides one Transport-owned standard WebSocket endpoint, one standard logs filter, a Confirmed/Finalized commitment and one HTTP hydration
|
||||
/// pool/role. The source keeps the WebSocket URL and filter private, never copies remote logs/errors into Worker state, and emits only signature/slot
|
||||
/// The caller provides one Transport-owned standard WebSocket endpoint explicitly declaring `Logs`, one standard logs filter, a Confirmed/Finalized commitment
|
||||
/// and one HTTP hydration pool/role. The source keeps the WebSocket URL and filter private, never copies remote logs/errors into Worker state, and emits only signature/slot
|
||||
/// references into the source-neutral hydration coordinator.
|
||||
pub struct RawTransactionIngestStandardLogsSource {
|
||||
ws_endpoint: ksp_onchain_transport_lib::WsEndpointSettings,
|
||||
@@ -2052,6 +2059,9 @@ impl crate::RawTransactionIngestStandardLogsSource {
|
||||
if ws_endpoint.protocol() != ksp_onchain_transport_lib::WsProtocolKind::SolanaStandard {
|
||||
return std::result::Result::Err(crate::runtime_error("runtime_resources.standard_logs_protocol_invalid"));
|
||||
}
|
||||
if !ws_endpoint.supports_subscription(ksp_onchain_transport_lib::WsSubscriptionKind::Logs) {
|
||||
return std::result::Result::Err(crate::runtime_error("runtime_resources.standard_logs_capability_missing"));
|
||||
}
|
||||
match commitment {
|
||||
ksp_onchain_transport_lib::SolanaCommitment::Confirmed | ksp_onchain_transport_lib::SolanaCommitment::Finalized => {},
|
||||
ksp_onchain_transport_lib::SolanaCommitment::Processed => {
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
// file: crates/ksp-worker-raw-transaction-ingest-lib/unit_tests/runtime_resources.rs
|
||||
// version: 34
|
||||
// version: 35
|
||||
|
||||
fn grpc_endpoint(cluster: &str) -> std::option::Option<ksp_onchain_transport_lib::YellowstoneGrpcEndpointSettings> {
|
||||
return grpc_endpoint_with_identity(cluster, "yellowstone-fixture", "fixture-provider");
|
||||
@@ -115,12 +115,48 @@ fn ws_endpoint(
|
||||
endpoint_name: &str,
|
||||
provider: &str,
|
||||
protocol: ksp_onchain_transport_lib::WsProtocolKind,
|
||||
) -> std::option::Option<ksp_onchain_transport_lib::WsEndpointSettings> {
|
||||
let capabilities = if protocol == ksp_onchain_transport_lib::WsProtocolKind::SolanaStandard {
|
||||
std::vec![
|
||||
ksp_onchain_transport_lib::WsSubscriptionKind::Account,
|
||||
ksp_onchain_transport_lib::WsSubscriptionKind::Block,
|
||||
ksp_onchain_transport_lib::WsSubscriptionKind::Logs,
|
||||
ksp_onchain_transport_lib::WsSubscriptionKind::Program,
|
||||
ksp_onchain_transport_lib::WsSubscriptionKind::Root,
|
||||
ksp_onchain_transport_lib::WsSubscriptionKind::Signature,
|
||||
ksp_onchain_transport_lib::WsSubscriptionKind::Slot,
|
||||
ksp_onchain_transport_lib::WsSubscriptionKind::SlotsUpdates,
|
||||
ksp_onchain_transport_lib::WsSubscriptionKind::Vote,
|
||||
]
|
||||
} else if protocol == ksp_onchain_transport_lib::WsProtocolKind::HeliusLaserStream {
|
||||
std::vec![
|
||||
ksp_onchain_transport_lib::WsSubscriptionKind::Account,
|
||||
ksp_onchain_transport_lib::WsSubscriptionKind::Logs,
|
||||
ksp_onchain_transport_lib::WsSubscriptionKind::Program,
|
||||
ksp_onchain_transport_lib::WsSubscriptionKind::Root,
|
||||
ksp_onchain_transport_lib::WsSubscriptionKind::Signature,
|
||||
ksp_onchain_transport_lib::WsSubscriptionKind::Slot,
|
||||
ksp_onchain_transport_lib::WsSubscriptionKind::SlotsUpdates,
|
||||
ksp_onchain_transport_lib::WsSubscriptionKind::HeliusTransaction,
|
||||
]
|
||||
} else {
|
||||
return std::option::Option::None;
|
||||
};
|
||||
return ws_endpoint_with_capabilities(cluster, endpoint_name, provider, protocol, std::option::Option::Some(capabilities));
|
||||
}
|
||||
|
||||
fn ws_endpoint_with_capabilities(
|
||||
cluster: &str,
|
||||
endpoint_name: &str,
|
||||
provider: &str,
|
||||
protocol: ksp_onchain_transport_lib::WsProtocolKind,
|
||||
capabilities: std::option::Option<std::vec::Vec<ksp_onchain_transport_lib::WsSubscriptionKind>>,
|
||||
) -> std::option::Option<ksp_onchain_transport_lib::WsEndpointSettings> {
|
||||
let url = match ksp_onchain_transport_lib::WsEndpointUrl::parse("ws://127.0.0.1:10001/WS-SECRET-CANARY") {
|
||||
std::result::Result::Ok(value) => value,
|
||||
std::result::Result::Err(_) => return std::option::Option::None,
|
||||
};
|
||||
return std::option::Option::Some(ksp_onchain_transport_lib::WsEndpointSettings::new(
|
||||
let endpoint = ksp_onchain_transport_lib::WsEndpointSettings::new(
|
||||
endpoint_name,
|
||||
true,
|
||||
ksp_onchain_transport_lib::WsProviderName::new(provider),
|
||||
@@ -128,7 +164,11 @@ fn ws_endpoint(
|
||||
protocol,
|
||||
url,
|
||||
ksp_onchain_transport_lib::WsSessionSettings::default(),
|
||||
));
|
||||
);
|
||||
return std::option::Option::Some(match capabilities {
|
||||
std::option::Option::Some(value) => endpoint.with_subscription_capabilities(value),
|
||||
std::option::Option::None => endpoint,
|
||||
});
|
||||
}
|
||||
|
||||
fn supervisor_contracts(
|
||||
@@ -1971,6 +2011,159 @@ fn pre_006_coalescence_key_separates_network_signature_and_commitment() {
|
||||
return;
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn v0_3_15_pre_004_websocket_route_constructors_require_explicit_capability_before_io() {
|
||||
let hydration_pool = match http_pool("devnet", "hydration", "get_transaction") {
|
||||
std::option::Option::Some(value) => value,
|
||||
std::option::Option::None => return,
|
||||
};
|
||||
let undeclared_logs = match ws_endpoint_with_capabilities(
|
||||
"devnet",
|
||||
"standard-logs-undeclared",
|
||||
"fixture-ws-provider",
|
||||
ksp_onchain_transport_lib::WsProtocolKind::SolanaStandard,
|
||||
std::option::Option::None,
|
||||
) {
|
||||
std::option::Option::Some(value) => value,
|
||||
std::option::Option::None => return,
|
||||
};
|
||||
let undeclared_logs = crate::RawTransactionIngestStandardLogsSource::new(
|
||||
undeclared_logs,
|
||||
ksp_onchain_transport_lib::SolanaLogsSubscribeFilter::All,
|
||||
ksp_onchain_transport_lib::SolanaCommitment::Confirmed,
|
||||
hydration_pool.clone(),
|
||||
ksp_onchain_transport_lib::HttpRoleName::new("hydration"),
|
||||
);
|
||||
let undeclared_logs = match undeclared_logs {
|
||||
std::result::Result::Ok(_) => return,
|
||||
std::result::Result::Err(value) => value,
|
||||
};
|
||||
assert!(undeclared_logs.context().iter().any(|context| return context.value() == "runtime_resources.standard_logs_capability_missing"));
|
||||
let wrong_logs = match ws_endpoint_with_capabilities(
|
||||
"devnet",
|
||||
"standard-logs-wrong",
|
||||
"fixture-ws-provider",
|
||||
ksp_onchain_transport_lib::WsProtocolKind::SolanaStandard,
|
||||
std::option::Option::Some(std::vec![ksp_onchain_transport_lib::WsSubscriptionKind::Slot]),
|
||||
) {
|
||||
std::option::Option::Some(value) => value,
|
||||
std::option::Option::None => return,
|
||||
};
|
||||
let wrong_logs = crate::RawTransactionIngestStandardLogsSource::new(
|
||||
wrong_logs,
|
||||
ksp_onchain_transport_lib::SolanaLogsSubscribeFilter::All,
|
||||
ksp_onchain_transport_lib::SolanaCommitment::Confirmed,
|
||||
hydration_pool.clone(),
|
||||
ksp_onchain_transport_lib::HttpRoleName::new("hydration"),
|
||||
);
|
||||
let wrong_logs = match wrong_logs {
|
||||
std::result::Result::Ok(_) => return,
|
||||
std::result::Result::Err(value) => value,
|
||||
};
|
||||
assert!(wrong_logs.context().iter().any(|context| return context.value() == "runtime_resources.standard_logs_capability_missing"));
|
||||
let logs = match ws_endpoint_with_capabilities(
|
||||
"devnet",
|
||||
"standard-logs-exact",
|
||||
"fixture-ws-provider",
|
||||
ksp_onchain_transport_lib::WsProtocolKind::SolanaStandard,
|
||||
std::option::Option::Some(std::vec![ksp_onchain_transport_lib::WsSubscriptionKind::Logs]),
|
||||
) {
|
||||
std::option::Option::Some(value) => value,
|
||||
std::option::Option::None => return,
|
||||
};
|
||||
assert!(
|
||||
crate::RawTransactionIngestStandardLogsSource::new(
|
||||
logs,
|
||||
ksp_onchain_transport_lib::SolanaLogsSubscribeFilter::All,
|
||||
ksp_onchain_transport_lib::SolanaCommitment::Confirmed,
|
||||
hydration_pool.clone(),
|
||||
ksp_onchain_transport_lib::HttpRoleName::new("hydration"),
|
||||
)
|
||||
.is_ok()
|
||||
);
|
||||
let undeclared_block = match ws_endpoint_with_capabilities(
|
||||
"devnet",
|
||||
"standard-block-undeclared",
|
||||
"fixture-ws-provider",
|
||||
ksp_onchain_transport_lib::WsProtocolKind::SolanaStandard,
|
||||
std::option::Option::None,
|
||||
) {
|
||||
std::option::Option::Some(value) => value,
|
||||
std::option::Option::None => return,
|
||||
};
|
||||
let undeclared_block = crate::RawTransactionIngestStandardBlockSource::new(
|
||||
undeclared_block,
|
||||
ksp_onchain_transport_lib::SolanaBlockSubscribeFilter::All,
|
||||
ksp_onchain_transport_lib::SolanaCommitment::Confirmed,
|
||||
);
|
||||
let undeclared_block = match undeclared_block {
|
||||
std::result::Result::Ok(_) => return,
|
||||
std::result::Result::Err(value) => value,
|
||||
};
|
||||
assert!(undeclared_block.context().iter().any(|context| return context.value() == "runtime_resources.standard_block_capability_missing"));
|
||||
let block = match ws_endpoint_with_capabilities(
|
||||
"devnet",
|
||||
"standard-block-exact",
|
||||
"fixture-ws-provider",
|
||||
ksp_onchain_transport_lib::WsProtocolKind::SolanaStandard,
|
||||
std::option::Option::Some(std::vec![ksp_onchain_transport_lib::WsSubscriptionKind::Block]),
|
||||
) {
|
||||
std::option::Option::Some(value) => value,
|
||||
std::option::Option::None => return,
|
||||
};
|
||||
assert!(
|
||||
crate::RawTransactionIngestStandardBlockSource::new(
|
||||
block,
|
||||
ksp_onchain_transport_lib::SolanaBlockSubscribeFilter::All,
|
||||
ksp_onchain_transport_lib::SolanaCommitment::Confirmed,
|
||||
)
|
||||
.is_ok()
|
||||
);
|
||||
let missing_helius = match ws_endpoint_with_capabilities(
|
||||
"devnet",
|
||||
"helius-transaction-missing",
|
||||
"fixture-helius-provider",
|
||||
ksp_onchain_transport_lib::WsProtocolKind::HeliusLaserStream,
|
||||
std::option::Option::Some(std::vec![ksp_onchain_transport_lib::WsSubscriptionKind::Logs]),
|
||||
) {
|
||||
std::option::Option::Some(value) => value,
|
||||
std::option::Option::None => return,
|
||||
};
|
||||
let missing_helius = crate::RawTransactionIngestHeliusTransactionSource::new(
|
||||
missing_helius,
|
||||
helius_transaction_filter(false),
|
||||
ksp_onchain_transport_lib::SolanaCommitment::Confirmed,
|
||||
hydration_pool.clone(),
|
||||
ksp_onchain_transport_lib::HttpRoleName::new("hydration"),
|
||||
);
|
||||
let missing_helius = match missing_helius {
|
||||
std::result::Result::Ok(_) => return,
|
||||
std::result::Result::Err(value) => value,
|
||||
};
|
||||
assert!(missing_helius.context().iter().any(|context| return context.value() == "runtime_resources.helius_transaction_capability_missing"));
|
||||
let helius = match ws_endpoint_with_capabilities(
|
||||
"devnet",
|
||||
"helius-transaction-exact",
|
||||
"fixture-helius-provider",
|
||||
ksp_onchain_transport_lib::WsProtocolKind::HeliusLaserStream,
|
||||
std::option::Option::Some(std::vec![ksp_onchain_transport_lib::WsSubscriptionKind::HeliusTransaction]),
|
||||
) {
|
||||
std::option::Option::Some(value) => value,
|
||||
std::option::Option::None => return,
|
||||
};
|
||||
assert!(
|
||||
crate::RawTransactionIngestHeliusTransactionSource::new(
|
||||
helius,
|
||||
helius_transaction_filter(false),
|
||||
ksp_onchain_transport_lib::SolanaCommitment::Confirmed,
|
||||
hydration_pool,
|
||||
ksp_onchain_transport_lib::HttpRoleName::new("hydration"),
|
||||
)
|
||||
.is_ok()
|
||||
);
|
||||
return;
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn v0_3_13_pre_003_standard_logs_source_validates_protocol_commitment_and_hydration_route() {
|
||||
let accepted = standard_logs_source(
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
<!-- file: docs/plans/036-V0_3_15_RAW_TRANSACTION_INGEST_DESK_PLAN.md -->
|
||||
<!-- version: 3 -->
|
||||
<!-- version: 4 -->
|
||||
|
||||
# Plan v0.3.15 — Raw Transaction Ingest Desk
|
||||
|
||||
@@ -702,6 +702,8 @@ Budget cible : une tranche Config.
|
||||
|
||||
Faire refuser avant I/O les constructions de sources dont les capabilities WS requises ne sont pas déclarées, avec canaris des constructeurs de routes. Aucune logique provider dans la Desk.
|
||||
|
||||
**État : implémenté.** Les constructeurs `Standard Logs`, `Standard Block` et `Helius Transaction` interrogent désormais uniquement `WsEndpointSettings::supports_subscription(...)` après validation du protocole et avant toute ouverture de session. L'état legacy `undeclared` est donc refusé fail-closed par le Worker. Yellowstone et HTTP Block Polling restent hors de ce gate car ils n'ouvrent aucune source WS. Aucun type Worker public ni dépendance Config n'est ajouté.
|
||||
|
||||
Budget cible : une tranche Worker.
|
||||
|
||||
### `pre.005` — scaffold Raw Transaction Ingest Desk
|
||||
|
||||
Reference in New Issue
Block a user