Karma is Lux's on-chain reputation system. Each address accumulates a Karma score based on verifiable on-chain activity: staking, governance participation, protocol usage, and community contributions. Karma is soul-bound (non-transferable) and decays over time, ensuring the score reflects recent behavior. Karma feeds into credit lending (LP-054), governance weight (LP-058), and protocol fee discounts.
karma(address) = sum(activityWeight_i * amount_i * decayFactor(time_i))
Where decayFactor(t) = 0.5^(daysSinceActivity / HALF_LIFE) with HALF_LIFE = 180 days.
Activities are recorded by attester contracts deployed per protocol:
interface IKarmaAttester {
function attest(address account, uint8 activityType, uint256 amount) external;
}
Attesters are registered by governance. Only registered attesters can record activities.
Karma decays continuously. An activity from 180 days ago contributes half its original weight. After 360 days, one quarter. This ensures inactive accounts lose reputation over time.
interface IKarma {
function scoreOf(address account) external view returns (uint256);
function activityCount(address account, uint8 activityType) external view returns (uint256);
function lastActive(address account) external view returns (uint256 timestamp);
}
1. Sybil resistance: Karma accumulation requires economic activity (staking, LPing) with real capital at risk. Sybil accounts must deploy capital per address.
2. Attester compromise: a compromised attester could inflate Karma. Governance can deregister attesters and invalidate their historical attestations.
3. Privacy: Karma scores are public. Users who desire privacy should use separate addresses for reputation-sensitive activities.
github.com/luxfi/standard/contracts/karma/ |KarmaRegistry.sol |IKarmaAttester.sol |Copyright (C) 2024-2026, Lux Partners Limited. All rights reserved.
Licensed under the MIT License.