diff --git a/contracts/claims-processor/src/types.rs b/contracts/claims-processor/src/types.rs index ac63522..56c4c72 100644 --- a/contracts/claims-processor/src/types.rs +++ b/contracts/claims-processor/src/types.rs @@ -301,3 +301,66 @@ pub struct PayoutDelayUpdated { pub delay_seconds: u64, } +/// Supported payout currencies for claim settlements. +#[contracttype] +#[derive(Clone, Debug, Eq, PartialEq)] +pub enum PayoutCurrency { + /// Default USDC (7-decimal) + USDC, + /// Alternative stablecoin (address stored separately) + Custom(Address), +} + +/// Multi-currency payout configuration for a claim. +#[contracttype] +#[derive(Clone, Debug, Eq, PartialEq)] +pub struct PayoutOption { + /// Currency to pay out in. + pub currency: PayoutCurrency, + /// Exchange rate (basis points) relative to USDC. 10000 = 1:1 parity. + /// Used to convert USDC coverage amounts to equivalent other-currency amounts. + pub exchange_rate_bps: u32, + /// Whether this payout option is currently enabled. + pub enabled: bool, +} + +/// Record of available payout currencies and their exchange rates. +#[contracttype] +#[derive(Clone, Debug, Eq, PartialEq)] +pub struct PayoutCurrencyRegistry { + /// Address of the USDC token contract (default payout currency). + pub usdc_token: Address, + /// Optional alternative payout currencies with their exchange rates. + pub alt_currencies: Vec
, + /// Exchange rates for alt currencies (index matches alt_currencies). + pub exchange_rates_bps: Vec, +} + +/// Emitted when a new payout currency is registered. +#[contracttype] +#[derive(Clone, Debug, Eq, PartialEq)] +pub struct PayoutCurrencyAdded { + pub token: Address, + pub exchange_rate_bps: u32, +} + +/// Emitted when a payout currency's exchange rate is updated. +#[contracttype] +#[derive(Clone, Debug, Eq, PartialEq)] +pub struct PayoutCurrencyRateUpdated { + pub token: Address, + pub old_rate_bps: u32, + pub new_rate_bps: u32, +} + +/// Emitted when a claim is paid out in an alternate currency. +#[contracttype] +#[derive(Clone, Debug, Eq, PartialEq)] +pub struct ClaimPaidInAlternativeCurrency { + pub claim_id: u128, + pub claimant: Address, + pub usdc_equivalent: i128, + pub token: Address, + pub actual_amount: i128, + pub exchange_rate_bps: u32, +} \ No newline at end of file diff --git a/contracts/governance-dao/src/types.rs b/contracts/governance-dao/src/types.rs index 0e85481..cb9107f 100644 --- a/contracts/governance-dao/src/types.rs +++ b/contracts/governance-dao/src/types.rs @@ -91,6 +91,13 @@ pub struct Proposal { /// Mandatory impact analysis describing potential consequences of this proposal. /// Max 4096 bytes to provide comprehensive risk assessment. pub impact_analysis: Bytes, + /// Optional verification callback function on the target contract to confirm + /// execution produced the intended state change. Called as `target::verify_proposal_execution(proposal_id)`. + /// If specified and fails, execution is marked as failed with audit trail. + /// Signature: fn verify_proposal_execution(env: Env, proposal_id: u64) -> Result + pub verification_callback: Option, + /// Whether execution has been verified (callback succeeded or not required). + pub execution_verified: bool, } /// A single vote record stored per (proposal_id, voter) key. @@ -432,3 +439,23 @@ pub struct DelegationRecorded { pub action: Symbol, pub recorded_at: u64, } + +#[contracttype] +#[derive(Clone, Debug, Eq, PartialEq)] +pub struct ExecutionVerified { + pub proposal_id: u64, + pub executor: Address, + pub target: Address, + pub verification_callback: Symbol, + pub verified_at: u64, +} + +#[contracttype] +#[derive(Clone, Debug, Eq, PartialEq)] +pub struct ExecutionVerificationFailed { + pub proposal_id: u64, + pub executor: Address, + pub target: Address, + pub callback: Symbol, + pub error: Symbol, +} diff --git a/contracts/oracle-verifier/src/types.rs b/contracts/oracle-verifier/src/types.rs index 3cc273d..96e49d5 100644 --- a/contracts/oracle-verifier/src/types.rs +++ b/contracts/oracle-verifier/src/types.rs @@ -499,6 +499,26 @@ pub struct StalenessReport { pub freshness_ratio_bps: u32, } +/// Temporal decay configuration for oracle submissions. +/// Applies exponential decay to older submissions, giving more weight to recent data. +/// Prevents stale oracles from permanently distorting aggregation as data ages. +#[contracttype] +#[derive(Clone, Debug, Eq, PartialEq)] +pub struct TemporalDecayConfig { + pub data_type: Symbol, + /// Whether temporal decay weighting is enabled for this data type. + pub enabled: bool, + /// Half-life in seconds: age at which submission weight drops to 50%. + /// For example: 86400 = 1 day, 3600 = 1 hour. + pub half_life_seconds: u64, + /// Minimum weight floor (basis points). Submissions never drop below this. + /// 0 = no floor, 1000 = 10% minimum weight. + pub min_weight_bps: u32, + /// Maximum weight ceiling (basis points) for the newest submissions. + /// 10000 = no ceiling, newest always get full weight. + pub max_weight_bps: u32, +} + /// Emitted when stale oracle data is detected during submission or verification. #[contracttype] #[derive(Clone, Debug, Eq, PartialEq)] @@ -509,4 +529,29 @@ pub struct StaleDataDetected { pub total_count: u32, pub oldest_age: u64, pub max_age: u64, -} \ No newline at end of file +} + + +#[contracttype] +#[derive(Clone, Debug, Eq, PartialEq)] +pub struct TemporalDecayConfigUpdated { + pub data_type: Symbol, + pub enabled: bool, + pub half_life_seconds: u64, + pub min_weight_bps: u32, + pub max_weight_bps: u32, +} + +#[contracttype] +#[derive(Clone, Debug, Eq, PartialEq)] +pub struct AggregatedDataWeighted { + pub data_type: Symbol, + pub key: Symbol, + pub median_value: i128, + /// Whether temporal decay weighting was applied. + pub temporal_decay_applied: bool, + /// Average age in seconds of submissions included in aggregation. + pub average_submission_age: u64, + /// Total decay factor applied (0-10000 basis points). + pub decay_factor_bps: u32, +} diff --git a/contracts/risk-pool/src/types.rs b/contracts/risk-pool/src/types.rs index ea86c4e..5c45df7 100644 --- a/contracts/risk-pool/src/types.rs +++ b/contracts/risk-pool/src/types.rs @@ -568,6 +568,38 @@ pub struct FeeTier { pub name: Symbol, } +/// Optional vesting schedule for LP deposits to prevent large LPs from exiting immediately. +/// Vesting ensures LPs gradually unlock their shares over time, reducing exit risk. +#[contracttype] +#[derive(Clone, Debug, Eq, PartialEq)] +pub struct VestingSchedule { + /// Total number of vesting periods. + pub total_periods: u32, + /// Duration of each vesting period in seconds. + pub period_duration: u64, + /// Shares that vest per period (can be 0 for cliff vesting). + pub amount_per_period: i128, + /// Cliff period (shares locked until this many periods have passed). + /// 0 = no cliff, vesting starts immediately. + pub cliff_periods: u32, + /// Absolute timestamp when vesting started. + pub vesting_start: u64, + /// Shares already vested and available for withdrawal. + pub vested_amount: i128, + /// Total shares subject to this vesting schedule. + pub total_amount: i128, +} + +/// LP position with optional vesting constraint. +#[contracttype] +#[derive(Clone, Debug, Eq, PartialEq)] +pub struct VestedLpPosition { + pub provider: Address, + pub position: LpPosition, + /// Optional vesting schedule. If present, constrains withdrawals. + pub vesting: Option, +} + #[contracttype] #[derive(Clone, Debug, Eq, PartialEq)] pub struct FeeTierUpdated { @@ -585,3 +617,32 @@ pub struct PositionLiquidated { pub amount_recovered: i128, pub collateralization_bps: u32, } + + +#[contracttype] +#[derive(Clone, Debug, Eq, PartialEq)] +pub struct VestingScheduleCreated { + pub provider: Address, + pub total_periods: u32, + pub period_duration: u64, + pub cliff_periods: u32, + pub vesting_start: u64, +} + +#[contracttype] +#[derive(Clone, Debug, Eq, PartialEq)] +pub struct VestingSharesReleased { + pub provider: Address, + pub newly_vested_amount: i128, + pub total_vested: i128, + pub vesting_period: u32, +} + +#[contracttype] +#[derive(Clone, Debug, Eq, PartialEq)] +pub struct WithdrawalBlockedByVesting { + pub provider: Address, + pub requested_shares: i128, + pub available_shares: i128, + pub vesting_period: u32, +}