This commit is contained in:
2026-07-23 16:37:12 +02:00
parent 99c345f2f2
commit 0da75c1311
2159 changed files with 230833 additions and 0 deletions

View File

@@ -0,0 +1,62 @@
<!-- file: config/README.md -->
<!-- version: 13 -->
# Configuration locale
Ce dossier contient les exemples et le schéma de configuration JSON.
## Règles
- Le fichier versionné doit rester sans secret.
- Les placeholders de clés restent directement dans les URLs.
- Le champ `active_profile` sélectionne un seul profil actif.
- Un profil actif doit être présent et unique.
- Les profils non actifs peuvent rester dans le fichier pour les tests devnet, mainnet lecture seule, backfill ou future production.
- Le contrat courant couvre HTTP JSON-RPC Solana et WebSocket JSON-RPC générique.
- Helius `transactionSubscribe` et Yellowstone gRPC seront ajoutés plus tard dans `kb_rpc`, avec évolution explicite du schéma quand les transports seront réellement utilisés.
- Les IDLs restent des artefacts de développement et ne font pas partie de la configuration runtime.
## Fichiers
- `example.config.json` : exemple complet avec profils `local_devnet`, `mainnet_research` et `mainnet`.
- `schema.config.json` : JSON Schema de validation du fichier de configuration.
## Phase `0.3.x`
`0.3.x` utilise les endpoints HTTP des profils de recherche existants pour :
```text
getSignaturesForAddress
getTransaction
getSignatureStatuses
```
Aucun profil Helius payant ou Yellowstone nest activé à ce stade.
Les sources futures devront déclarer séparément :
- provider ;
- protocole ;
- rôle ;
- limites de streams et filtres ;
- authentification ;
- région éventuelle.
## Évolution du schéma
`schema.config.json` est le contrat de validation runtime. Il évolue seulement lorsquun champ est réellement utilisé par lexécution.
## Logging de développement
Lexemple configure, pour chacun des trois profils, quatre fichiers globaux puis trois fichiers dédiés par crate opérationnelle utilisant `tracing` : `debug.log`, `info.log` et `error.jsonl`.
`pre.020` rend `kb_materializer_admin` et `kb_materializer_compliance_audit` opérationnelles. `pre.021` active ensuite `kb_materializer_staking`. Elles rejoignent donc la console et disposent de leurs routes propres sous :
```text
logs/<profil>/kb_materializer_admin/
logs/<profil>/kb_materializer_compliance_audit/
logs/<profil>/kb_materializer_staking/
```
Le test de configuration découvre dynamiquement toutes les crates déclarant `tracing.workspace = true` et vérifie leurs trois routes dans chaque profil. Les logs ne doivent contenir ni secret, ni DSN non masqué, ni payload Config ou bytecode complet.

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,774 @@
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"$id": "https://khadhroony.local/schema/config.schema.json",
"title": "Khadhroony Bot2 configuration",
"type": "object",
"additionalProperties": false,
"required": [
"active_profile",
"profiles"
],
"properties": {
"active_profile": {
"$ref": "#/$defs/non_empty_string"
},
"profiles": {
"type": "array",
"minItems": 1,
"items": {
"$ref": "#/$defs/profile"
}
}
},
"$defs": {
"non_empty_string": {
"type": "string",
"minLength": 1
},
"log_level": {
"type": "string",
"enum": [
"trace",
"debug",
"info",
"warn",
"error",
"off"
]
},
"profile": {
"type": "object",
"additionalProperties": false,
"required": [
"name",
"app",
"logging",
"database",
"data",
"solana",
"wallet",
"execution",
"demo"
],
"properties": {
"name": {
"$ref": "#/$defs/non_empty_string"
},
"app": {
"$ref": "#/$defs/app_section"
},
"logging": {
"$ref": "#/$defs/logging"
},
"database": {
"$ref": "#/$defs/database"
},
"data": {
"$ref": "#/$defs/data"
},
"solana": {
"$ref": "#/$defs/solana"
},
"wallet": {
"$ref": "#/$defs/wallet"
},
"execution": {
"$ref": "#/$defs/execution"
},
"demo": {
"$ref": "#/$defs/demo"
}
}
},
"app_section": {
"type": "object",
"additionalProperties": false,
"required": [
"name",
"environment",
"auto_reconnect_default"
],
"properties": {
"name": {
"$ref": "#/$defs/non_empty_string"
},
"environment": {
"$ref": "#/$defs/non_empty_string"
},
"auto_reconnect_default": {
"type": "boolean"
}
}
},
"logging": {
"type": "object",
"additionalProperties": false,
"required": [
"default_level",
"targets",
"target_filters"
],
"properties": {
"default_level": {
"$ref": "#/$defs/log_level"
},
"targets": {
"type": "array",
"minItems": 1,
"items": {
"$ref": "#/$defs/log_target"
}
},
"target_filters": {
"type": "array",
"items": {
"$ref": "#/$defs/log_target_filter"
}
}
}
},
"log_target": {
"type": "object",
"additionalProperties": false,
"required": [
"name",
"enabled",
"sink",
"level",
"path",
"rotation",
"format",
"ansi",
"targets"
],
"properties": {
"name": {
"$ref": "#/$defs/non_empty_string"
},
"enabled": {
"type": "boolean"
},
"sink": {
"type": "string",
"enum": [
"console",
"file"
]
},
"level": {
"$ref": "#/$defs/log_level"
},
"path": {
"type": "string"
},
"rotation": {
"type": "string",
"enum": [
"none",
"never",
"daily",
"hourly"
]
},
"format": {
"type": "string",
"enum": [
"human",
"compact",
"pretty",
"json"
]
},
"ansi": {
"type": "boolean"
},
"targets": {
"type": "array",
"items": {
"$ref": "#/$defs/non_empty_string"
}
}
}
},
"log_target_filter": {
"type": "object",
"additionalProperties": false,
"required": [
"target",
"level"
],
"properties": {
"target": {
"$ref": "#/$defs/non_empty_string"
},
"level": {
"$ref": "#/$defs/log_level"
}
}
},
"database": {
"type": "object",
"additionalProperties": false,
"required": [
"enabled",
"backend",
"postgres",
"sqlite"
],
"properties": {
"enabled": {
"type": "boolean"
},
"backend": {
"type": "string",
"enum": [
"postgres",
"sqlite"
]
},
"postgres": {
"$ref": "#/$defs/postgres"
},
"sqlite": {
"$ref": "#/$defs/sqlite"
}
}
},
"postgres": {
"type": "object",
"additionalProperties": false,
"required": [
"url",
"max_connections",
"connect_timeout_ms",
"auto_initialize_schema"
],
"properties": {
"url": {
"$ref": "#/$defs/non_empty_string"
},
"max_connections": {
"type": "integer",
"minimum": 1
},
"connect_timeout_ms": {
"type": "integer",
"minimum": 1
},
"auto_initialize_schema": {
"type": "boolean"
}
}
},
"sqlite": {
"type": "object",
"additionalProperties": false,
"required": [
"path",
"create_if_missing",
"busy_timeout_ms",
"max_connections",
"auto_initialize_schema",
"use_wal"
],
"properties": {
"path": {
"$ref": "#/$defs/non_empty_string"
},
"create_if_missing": {
"type": "boolean"
},
"busy_timeout_ms": {
"type": "integer",
"minimum": 1
},
"max_connections": {
"type": "integer",
"minimum": 1
},
"auto_initialize_schema": {
"type": "boolean"
},
"use_wal": {
"type": "boolean"
}
}
},
"data": {
"type": "object",
"additionalProperties": false,
"required": [
"wallets_directory",
"logs_directory"
],
"properties": {
"wallets_directory": {
"$ref": "#/$defs/non_empty_string"
},
"logs_directory": {
"$ref": "#/$defs/non_empty_string"
}
}
},
"solana": {
"type": "object",
"additionalProperties": false,
"required": [
"http_endpoints",
"ws_endpoints",
"listeners"
],
"properties": {
"http_endpoints": {
"type": "array",
"minItems": 1,
"items": {
"$ref": "#/$defs/http_endpoint"
}
},
"ws_endpoints": {
"type": "array",
"minItems": 1,
"items": {
"$ref": "#/$defs/ws_endpoint"
}
},
"listeners": {
"$ref": "#/$defs/listeners"
}
}
},
"http_endpoint": {
"type": "object",
"additionalProperties": false,
"required": [
"name",
"enabled",
"provider",
"cluster",
"url",
"connect_timeout_ms",
"request_timeout_ms",
"max_idle_connections_per_host",
"roles"
],
"properties": {
"name": {
"$ref": "#/$defs/non_empty_string"
},
"enabled": {
"type": "boolean"
},
"provider": {
"$ref": "#/$defs/non_empty_string"
},
"cluster": {
"$ref": "#/$defs/non_empty_string"
},
"url": {
"type": "string",
"pattern": "^https?://"
},
"connect_timeout_ms": {
"type": "integer",
"minimum": 1
},
"request_timeout_ms": {
"type": "integer",
"minimum": 1
},
"max_idle_connections_per_host": {
"type": "integer",
"minimum": 1
},
"roles": {
"type": "array",
"minItems": 1,
"items": {
"$ref": "#/$defs/endpoint_role"
}
}
}
},
"ws_endpoint": {
"type": "object",
"additionalProperties": false,
"required": [
"name",
"enabled",
"provider",
"cluster",
"url",
"connect_timeout_ms",
"request_timeout_ms",
"unsubscribe_timeout_ms",
"write_channel_capacity",
"event_channel_capacity",
"auto_reconnect",
"roles"
],
"properties": {
"name": {
"$ref": "#/$defs/non_empty_string"
},
"enabled": {
"type": "boolean"
},
"provider": {
"$ref": "#/$defs/non_empty_string"
},
"cluster": {
"$ref": "#/$defs/non_empty_string"
},
"url": {
"type": "string",
"pattern": "^wss?://"
},
"connect_timeout_ms": {
"type": "integer",
"minimum": 1
},
"request_timeout_ms": {
"type": "integer",
"minimum": 1
},
"unsubscribe_timeout_ms": {
"type": "integer",
"minimum": 1
},
"write_channel_capacity": {
"type": "integer",
"minimum": 1
},
"event_channel_capacity": {
"type": "integer",
"minimum": 1
},
"auto_reconnect": {
"type": "boolean"
},
"roles": {
"type": "array",
"minItems": 1,
"items": {
"$ref": "#/$defs/endpoint_role"
}
}
}
},
"endpoint_role": {
"type": "object",
"additionalProperties": false,
"required": [
"role",
"enabled",
"request_kinds",
"priority",
"requests_per_second",
"burst_capacity",
"max_concurrent_requests",
"max_subscriptions",
"pause_after_rate_limit_ms"
],
"properties": {
"role": {
"$ref": "#/$defs/non_empty_string"
},
"enabled": {
"type": "boolean"
},
"request_kinds": {
"type": "array",
"minItems": 1,
"items": {
"$ref": "#/$defs/non_empty_string"
}
},
"priority": {
"type": "integer"
},
"requests_per_second": {
"type": "integer",
"minimum": 1
},
"burst_capacity": {
"type": "integer",
"minimum": 1
},
"max_concurrent_requests": {
"type": "integer",
"minimum": 1
},
"max_subscriptions": {
"type": "integer"
},
"pause_after_rate_limit_ms": {
"type": "integer",
"minimum": 1
}
}
},
"listeners": {
"type": "object",
"additionalProperties": false,
"required": [
"enabled",
"default_commitment",
"log_listeners",
"program_listeners",
"account_listeners"
],
"properties": {
"enabled": {
"type": "boolean"
},
"default_commitment": {
"$ref": "#/$defs/non_empty_string"
},
"log_listeners": {
"type": "array",
"items": {
"$ref": "#/$defs/log_listener"
}
},
"program_listeners": {
"type": "array",
"items": {
"$ref": "#/$defs/program_listener"
}
},
"account_listeners": {
"type": "array",
"items": {
"$ref": "#/$defs/account_listener"
}
}
}
},
"log_listener": {
"type": "object",
"additionalProperties": false,
"required": [
"name",
"enabled",
"endpoint_role",
"program_id",
"purpose"
],
"properties": {
"name": {
"$ref": "#/$defs/non_empty_string"
},
"enabled": {
"type": "boolean"
},
"endpoint_role": {
"$ref": "#/$defs/non_empty_string"
},
"program_id": {
"$ref": "#/$defs/non_empty_string"
},
"purpose": {
"$ref": "#/$defs/non_empty_string"
}
}
},
"program_listener": {
"type": "object",
"additionalProperties": false,
"required": [
"name",
"enabled",
"endpoint_role",
"program_id",
"purpose"
],
"properties": {
"name": {
"$ref": "#/$defs/non_empty_string"
},
"enabled": {
"type": "boolean"
},
"endpoint_role": {
"$ref": "#/$defs/non_empty_string"
},
"program_id": {
"$ref": "#/$defs/non_empty_string"
},
"purpose": {
"$ref": "#/$defs/non_empty_string"
}
}
},
"account_listener": {
"type": "object",
"additionalProperties": false,
"required": [
"name",
"enabled",
"endpoint_role",
"account_pubkey",
"purpose"
],
"properties": {
"name": {
"$ref": "#/$defs/non_empty_string"
},
"enabled": {
"type": "boolean"
},
"endpoint_role": {
"$ref": "#/$defs/non_empty_string"
},
"account_pubkey": {
"$ref": "#/$defs/non_empty_string"
},
"purpose": {
"$ref": "#/$defs/non_empty_string"
}
}
},
"wallet": {
"type": "object",
"additionalProperties": false,
"required": [
"wallet_dir",
"cluster",
"temporary_wallet_enabled",
"temporary_wallet_alias",
"temporary_wallet_persist",
"localnet_send_enabled",
"devnet_send_enabled",
"testnet_send_enabled",
"mainnet_send_enabled"
],
"properties": {
"wallet_dir": {
"$ref": "#/$defs/non_empty_string"
},
"cluster": {
"$ref": "#/$defs/non_empty_string"
},
"temporary_wallet_enabled": {
"type": "boolean"
},
"temporary_wallet_alias": {
"type": "string",
"minLength": 1,
"maxLength": 64,
"pattern": "^[A-Za-z0-9][A-Za-z0-9_-]*$"
},
"temporary_wallet_persist": {
"type": "boolean"
},
"localnet_send_enabled": {
"type": "boolean"
},
"devnet_send_enabled": {
"type": "boolean"
},
"testnet_send_enabled": {
"type": "boolean"
},
"mainnet_send_enabled": {
"type": "boolean"
}
}
},
"execution": {
"type": "object",
"additionalProperties": false,
"required": [
"dry_run_default",
"require_simulation",
"require_operator_confirmation",
"localnet_max_spend_lamports",
"devnet_max_spend_lamports",
"testnet_max_spend_lamports",
"mainnet_max_spend_lamports",
"max_fee_lamports",
"max_compute_unit_price_micro_lamports",
"recent_blockhash_max_age_slots",
"send_max_retries",
"confirmation_poll_interval_ms",
"confirmation_max_attempts",
"devnet_airdrop_max_lamports"
],
"properties": {
"dry_run_default": {
"type": "boolean"
},
"require_simulation": {
"type": "boolean"
},
"require_operator_confirmation": {
"type": "boolean"
},
"localnet_max_spend_lamports": {
"type": "integer",
"minimum": 0
},
"devnet_max_spend_lamports": {
"type": "integer",
"minimum": 0
},
"testnet_max_spend_lamports": {
"type": "integer",
"minimum": 0
},
"mainnet_max_spend_lamports": {
"type": "integer",
"minimum": 0
},
"max_fee_lamports": {
"type": "integer",
"minimum": 1
},
"max_compute_unit_price_micro_lamports": {
"type": "integer",
"minimum": 0
},
"recent_blockhash_max_age_slots": {
"type": "integer",
"minimum": 1
},
"send_max_retries": {
"type": "integer",
"minimum": 0,
"maximum": 4294967295
},
"confirmation_poll_interval_ms": {
"type": "integer",
"minimum": 1,
"maximum": 60000
},
"confirmation_max_attempts": {
"type": "integer",
"minimum": 1,
"maximum": 10000
},
"devnet_airdrop_max_lamports": {
"type": "integer",
"minimum": 0
}
}
},
"demo": {
"type": "object",
"additionalProperties": false,
"required": [
"live_demo_enabled",
"trading_demo_enabled"
],
"properties": {
"live_demo_enabled": {
"type": "boolean"
},
"trading_demo_enabled": {
"type": "boolean"
}
}
}
}
}