Every event the metavault emits, with the payload and when it fires.
event SeniorDeposited(
address indexed account,
address indexed receiver,
uint256 assets,
uint256 shares
);
event JuniorDeposited(
address indexed account,
address indexed receiver,
uint256 assets,
uint256 shares
);Fire after the deposit completes. account is the underlying-asset payer (msg.sender); receiver is the address credited with the freshly minted lcSEN / lcJUN shares.
event SeniorWithdrawalNoticeRequested(
address indexed account,
uint256 shares,
uint256 executableAt
);
event SeniorWithdrawalNoticeCancelled(
address indexed account
);
event JuniorWithdrawalNoticeRequested(
address indexed account,
uint256 shares,
uint256 executableAt
);
event JuniorWithdrawalNoticeCancelled(
address indexed account
);
event SeniorWithdrawalNoticeCleared(
address indexed account,
address indexed caller
);*NoticeRequested events emit the fresh noticed share count and executableAt, the timestamp at which the notice can be executed. Filing while an active notice exists reverts with WithdrawalNoticeActive, so re-filing does not stack or reset an existing notice.
SeniorWithdrawalNoticeCleared fires when a stale senior notice is cleared after its execution window. It returns the locked shares to account and releases the senior-side liquidity reservation. Junior notices do not have a clear event because they do not reserve liquidity globally; stale junior notices are cancellable by the holder.
event SeniorWithdrawn(
address indexed account,
address indexed receiver,
uint256 shares,
uint256 assets
);
event JuniorWithdrawn(
address indexed account,
address indexed receiver,
uint256 shares,
uint256 assets
);
event KeeperRewarded(
address indexed owner,
address indexed keeper,
uint256 fee
);Fire on every successful execution of withdrawSenior / withdrawJunior. shares is the burned amount of lcSEN / lcJUN; assets is the underlying transferred to receiver. There is no "claim filed" half-event. Exits are atomic.
KeeperRewarded fires before the matching *Withdrawn event when msg.sender != owner and the keeper fee rounds to a non-zero amount. The fee is skimmed from the holder's proceeds.
event PooledNavSynced(
uint256 underlyingAssets,
uint256 seniorNav,
uint256 juniorNav,
int256 delta
);Fires inside _syncAccounting() when the protocol's accounted total (seniorNav + juniorNav) is reconciled with the actual underlying value. delta is the signed change applied: positive on gain, negative on loss. The new NAVs are emitted post-application.
event ProtectionPremiumAccrued(
uint256 from,
uint256 to,
uint256 premiumAssets
);Fires inside _accruePremium(). from and to are the accrual-window timestamps; premiumAssets is the amount moved from senior NAV to junior NAV. Skipped (no event) when premium-active conditions aren't met.
event ProtectionPremiumRateSet(uint256 rateBps);Fires when an OPERATOR_ROLE holder calls setProtectionPremiumRate. The rate flips atomically; _syncAccounting() runs first so the previous rate accrues up to the call. Deployments that need a delay between scheduling and activation route the role through an external TimelockController and observe its CallScheduled / CallExecuted events.
event PerformanceFeeAccrued(
address indexed recipient,
uint256 gainAssets,
uint256 feeAssets,
uint256 feeShares
);
event PerformanceFeeRateSet(uint256 rateBps);
event FeeRecipientSet(address indexed recipient);PerformanceFeeAccrued fires inside _syncAccounting()'s gain branch when performanceFeeBps > 0 and junior is non-empty. gainAssets is the underlying NAV gain observed on this sync; feeAssets is the slice taken (gainAssets × performanceFeeBps / BPS); feeShares is the freshly-minted parcel of lcJUN issued to recipient at the post-distribution junior unit price (so existing junior holders' share value is unchanged).
PerformanceFeeRateSet fires from setPerformanceFeeRate after the metavault pre-syncs at the old fee rate. FeeRecipientSet fires from setFeeRecipient; the recipient change takes effect immediately and applies to the next gain.
event DepositsPausedSet(bool paused);
event KeeperRestrictedSet(bool restricted);Single global pause; affects both senior and junior deposits. Withdrawals are never gated by this flag.
KeeperRestrictedSet toggles whether non-owner notice execution is permissionless or restricted to PROTOCOL_ROLE. Holder self-execution is always allowed.
account on a deposit/withdrawal event is the caller (msg.sender); receiver is the recipient of shares (deposit) or assets (withdraw). They're often equal but don't have to be.SeniorWithdrawalNoticeRequested fired more than once on the same address means the holder filed a new notice after the prior one was executed, cancelled, or cleared. Filing onto an active notice reverts, so the shares field is the fresh notice size.PooledNavSynced is your single source of truth for share-price changes. Read seniorNav / seniorToken.totalSupply() and juniorNav / juniorToken.totalSupply() at the same block to derive share prices.PerformanceFeeAccrued fires before ProtectionPremiumAccrued, and PooledNavSynced fires after both. The fee is taken from the gain before the pro-rata distribution updates the cached NAVs.Transfer(from, to, value) events on seniorToken and juniorToken fire on mint (from == 0), burn (to == 0), and ordinary transfer. For aggregate-tracking purposes, mints + burns reconcile against the deposit/withdraw/fee events.