1pub mod action;
71pub mod constants;
72#[cfg(feature = "dynamodb")]
73pub mod dynamo;
74pub mod gateway;
75#[cfg(feature = "notifications")]
76pub mod notifications;
77pub mod perception;
78#[cfg(feature = "privacy")]
79pub mod privacy;
80pub mod reputation_engine;
81pub mod state;
82#[cfg(feature = "supabase")]
83pub mod supabase;
84pub mod vault_action;
85#[cfg(feature = "webhook")]
86pub mod webhook;
87
88#[cfg(feature = "lambda")]
90pub use aws_lambda_runtime as lambda_runtime;
91
92pub use action::{
94 VaultAction, SessionKey, PermissionScope, ZkProof, ProofType,
95 CaptureResult, StakingPosition, YieldRecommendation, ActionError,
96 DISTRIBUTION, YIELD_RATES_BPS,
97};
98
99pub use perception::{
100 PerceptionEvent, PerceptionHandler, PerceptionError,
101 TransactionEvent, LocationEvent, ProofEvent, UnlockEvent,
102 Processor, GeoEventType,
103};
104
105pub use state::{
106 StateStore, StateError, UserContext, VaultState,
107 UserPreferences, ContextEvent, init_user_context,
108};
109
110pub use vault_action::SolanaVaultAction;
111
112#[cfg(feature = "dynamodb")]
113pub use dynamo::{
114 DynamoStateStore, DynamoConfig, CardMapping, PendingCapture, SessionKeyData,
115 create_table,
116};
117
118#[cfg(feature = "privacy")]
119pub use privacy::{
120 PrivacyLayer, PrivacyConfig, LoopFingerprint, PrivacyError,
121 generate_pepper, create_pepper_secret,
122};
123
124#[cfg(feature = "webhook")]
125pub use webhook::{
126 WebhookHandler, WebhookSecrets, FidelSecrets, WebhookContext,
127 WebhookSource, WebhookError, NormalizedTransaction, TransactionType,
128 verify_fidel_signature, verify_square_signature, verify_stripe_signature,
129 parse_fidel_webhook, parse_square_webhook,
130};
131
132#[cfg(feature = "notifications")]
133pub use notifications::{
134 NotificationService, NotificationConfig, NotificationError,
135 PushNotification, NotificationData, NotificationPriority, NotificationResult,
136};
137
138#[cfg(feature = "supabase")]
139pub use supabase::{
140 SupabaseClient, SupabaseConfig, SupabaseAttestation, SupabaseReputationScore,
141};
142
143pub use constants::{
144 Network, ProgramIds, TokenMints, MainnetState,
145 CaptureType, PermissionLevel, EscrowStatus, AgentType, AgentStatus,
146 CRED_DECIMALS, OXO_DECIMALS, LAMPORTS_PER_CRED, LAMPORTS_PER_OXO,
147 USER_SHARE_BPS, TREASURY_SHARE_BPS, STAKER_SHARE_BPS,
148 STAKING_APY, MIN_STAKE_DAYS, MAX_STAKE_DAYS,
149 rpc_endpoint, DEVNET_RPC, MAINNET_RPC,
150 STAKE_30D_APY_BPS, STAKE_90D_APY_BPS, STAKE_180D_APY_BPS, STAKE_365D_APY_BPS,
151 SESSION_KEY_TTL_HOURS, SESSION_KEY_MAX_ACTIONS, CONTEXT_RELOAD_TARGET_MS,
152};
153
154pub use reputation_engine::{
156 ReputationEngine, TrustScore, TrustTier, CaptureLayer, LayerGroup,
157 Attestation, AttestationRecord, AttestationMetadata, VaultAttestation, VaultAction as VaultAttestAction,
158 ReputationDimension, ReputationResponse, ReputationCapabilities, LayerActivity,
159 ProfessionalAttestation, CredentialCategory, DifficultyTier, VerificationLevel,
161 SWARM_COORDINATOR_THRESHOLD, COLLATERAL_THRESHOLD, MAX_SCORE,
162};
163
164pub use gateway::{
166 Gateway, GatewayError, A2ARequest, A2AResponse, SwarmAction, PermissionCheck,
167};
168
169pub const VERSION: &str = env!("CARGO_PKG_VERSION");
171
172pub mod utils {
174 use super::constants::LAMPORTS_PER_CRED;
175
176 pub fn lamports_to_cred(lamports: u64) -> f64 {
178 lamports as f64 / LAMPORTS_PER_CRED as f64
179 }
180
181 pub fn cred_to_lamports(cred: f64) -> u64 {
183 (cred * LAMPORTS_PER_CRED as f64) as u64
184 }
185
186 pub fn calculate_yield(
188 principal: u64,
189 apy_bps: u16,
190 days: u16,
191 ) -> u64 {
192 let daily_rate = apy_bps as f64 / 10000.0 / 365.0;
193 let multiplier = (1.0 + daily_rate).powi(days as i32);
194 let final_amount = principal as f64 * multiplier;
195 (final_amount - principal as f64) as u64
196 }
197
198 pub fn calculate_split(total: u64) -> (u64, u64, u64) {
200 let user = (total as u128 * 8000 / 10000) as u64;
201 let treasury = (total as u128 * 1400 / 10000) as u64;
202 let stakers = total - user - treasury; (user, treasury, stakers)
204 }
205}
206
207#[cfg(test)]
208mod tests {
209 use super::*;
210
211 #[test]
212 fn lamport_conversion_roundtrip() {
213 let cred = 42.5;
214 let lamports = utils::cred_to_lamports(cred);
215 let back = utils::lamports_to_cred(lamports);
216 assert!((back - cred).abs() < 0.000001);
217 }
218
219 #[test]
220 fn split_adds_up() {
221 let total = 1_000_000_000u64; let (user, treasury, stakers) = utils::calculate_split(total);
223 assert_eq!(user + treasury + stakers, total);
224 assert_eq!(user, 800_000_000); assert_eq!(treasury, 140_000_000); assert_eq!(stakers, 60_000_000); }
228
229 #[test]
230 fn yield_calculation() {
231 let principal = 1_000_000_000_000u64; let yield_amount = utils::calculate_yield(principal, 1200, 90); assert!(yield_amount > 28_000_000_000);
235 assert!(yield_amount < 32_000_000_000);
236 }
237}