In on-chain identity and governance systems, a static reputation score can become a liability. A user who earned a high score years ago may no longer be active, yet their influence remains. Reputation decay addresses this by automatically reducing scores over time, ensuring that voting power, airdrop eligibility, or access rights reflect current participation and contribution. This mechanism is critical for maintaining the health of Decentralized Autonomous Organizations (DAOs), Sybil-resistant airdrops, and credentialing systems like Ethereum Attestation Service (EAS) schemas.
How to Design Reputation Decay Mechanisms
Introduction to Reputation Decay
Reputation decay is a mechanism that reduces a user's reputation score over time to ensure systems remain current, secure, and resistant to Sybil attacks.
Designing an effective decay function requires balancing several factors. A linear decay, where a fixed percentage is subtracted per epoch, is simple to implement and understand. Exponential decay, which reduces the score by a percentage of its current value, ensures scores never hit zero but diminishes influence faster initially. The key parameters are the decay rate (e.g., 5% per month) and the decay interval (the block or time period between adjustments). Systems must also define whether decay stops at a minimum floor (e.g., 10 points) or can reduce to zero.
Implementation in a smart contract involves tracking a user's last update timestamp and applying the decay calculation on-chain before any score-based operation. Here's a simplified conceptual example:
solidityfunction getScoreWithDecay(address user) public view returns (uint256) { UserData storage data = userData[user]; uint256 timePassed = block.timestamp - data.lastUpdate; uint256 periods = timePassed / DECAY_INTERVAL; uint256 currentScore = data.score; for (uint i = 0; i < periods; i++) { // Apply exponential decay: score = score * (1 - DECAY_RATE) currentScore = currentScore * (DECAY_DENOMINATOR - DECAY_RATE) / DECAY_DENOMINATOR; if (currentScore < SCORE_FLOOR) { currentScore = SCORE_FLOOR; break; } } return currentScore; }
This pattern ensures the score is always current when queried, though optimizations like pre-calculated decay in storage updates are used in production.
Real-world protocols implement variations of this pattern. The SourceCred algorithm weights recent contributions more heavily. Gitcoin Passport may decay the weight of stale stamps. When designing your system, consider allowing users to reactivate decayed scores through new, verifiable actions—creating a cycle where reputation must be continually earned. This aligns incentives for long-term, genuine engagement rather than one-time farming events. Always clearly communicate decay rules to users to maintain trust in the system's fairness.
How to Design Reputation Decay Mechanisms
A guide to the core principles and trade-offs for implementing time-based reputation decay in on-chain systems.
Reputation decay, or the gradual reduction of a user's score over time, is a critical design pattern for Sybil resistance and governance health. Its primary goal is to ensure that influence reflects current participation, not just past contributions. This prevents stale or inactive accounts from wielding disproportionate power in systems like DAO voting, airdrop distribution, or access control. Before implementing decay, you must define your system's core objectives: are you combating voter apathy, preventing token hoarding, or ensuring active community moderation? The answer dictates the decay model.
The foundational prerequisite is a quantifiable, on-chain reputation score. This is often derived from staked tokens, governance participation, or contribution metrics. The score must be stored in a smart contract, typically as a mapping like mapping(address => uint256) public reputation. You'll also need a reliable source of time, which can be a challenge on-chain. Using block.timestamp is common but introduces minor inaccuracies; for precise intervals, consider an oracle like Chainlink Keepers or a commit-reveal scheme based on block numbers.
Designing the decay function involves key trade-offs between simplicity and sophistication. A linear decay model reduces the score by a fixed amount per time unit (e.g., 1% per month), which is easy to implement and audit. An exponential decay model applies a percentage reduction repeatedly, causing scores to diminish faster initially, which can be more effective at clearing stale influence. The choice impacts user experience: linear decay is predictable, while exponential decay can feel punitive but may better incentivize consistent activity.
You must decide between continuous and epoch-based decay. Continuous decay recalculates the score on every interaction, which is gas-intensive but precise. Epoch-based decay, used by systems like Hop Protocol's governance, updates scores at regular intervals (e.g., weekly snapshots), which is more efficient. For example, an epoch update function might look like: reputation[user] = reputation[user] * (100 - decayRate) / 100. This is called only once per epoch, significantly reducing gas costs compared to per-transaction math.
A crucial design goal is mitigating negative externalities. Aggressive decay can discourage long-term holding or penalize users during natural inactivity periods. To address this, consider implementing decay cliffs (no decay for a set period), activity resets (decay pauses upon a qualifying action), or a reputation floor below which scores cannot fall. These mechanisms preserve core contributor status while still addressing inactivity. The parameters—decay rate, epoch length, and mitigation rules—must be transparent and governable by the community they affect.
Finally, test your mechanism thoroughly. Use forked mainnet environments with tools like Foundry or Hardhat to simulate long-term decay over hundreds of blocks. Analyze scenarios like user churn, flash loan attacks on governance, and the impact of major protocol upgrades. The goal is a system that is mathematically sound, economically secure, and transparently documented. Well-designed decay creates a dynamic reputation layer that aligns long-term protocol health with active user participation.
Core Decay Models: Linear vs. Exponential
A guide to implementing time-based reputation decay, a critical mechanism for maintaining system health and incentivizing ongoing participation.
Reputation decay, or the gradual reduction of a user's score over time, is essential for preventing reputation stagnation. Without it, early users can accumulate permanent, outsized influence, creating barriers for newcomers and reducing the incentive for continued, high-quality contributions. Decay ensures that reputation reflects current behavior and value, not just historical activity. This mechanism is foundational in systems like Aave's Governance where voting power diminishes over time to promote active delegation.
The linear decay model reduces reputation by a fixed amount per unit of time. For example, a user might lose 10 reputation points every week. It's predictable and simple to implement. In Solidity, this can be calculated as: currentScore = lastStoredScore - (decayRate * elapsedTimeUnits). This model is effective for systems requiring steady, predictable attrition, such as a contributor score in a forum that resets partially each month. Its main drawback is that it applies the same pressure to all users regardless of their total score.
In contrast, exponential decay reduces reputation by a percentage of the current score over time. The formula follows: currentScore = lastStoredScore * (decayFactor ^ elapsedTimeUnits). A decay factor of 0.95 per month means a score of 1000 becomes 950, then 902.5, and so on. This model, used in projects like SourceCred, proportionally affects high-reputation users more, preventing the permanent consolidation of power. It's computationally slightly more intensive but better models many real-world trust dynamics where influence fades proportionally.
Choosing between models depends on your system's goals. Use linear decay for predictable, uniform attrition where you want to encourage consistent periodic actions. Use exponential decay to aggressively combat score inflation and prevent a permanent elite class, as it ensures even the highest scores will meaningfully decay without constant maintenance. A hybrid approach is also possible, such as applying exponential decay only after a score passes a certain threshold.
Implementation requires careful state management to avoid gas-intensive calculations. The common pattern is to store a user's lastUpdated timestamp and lastScore snapshot. The decayed score is calculated on-demand (e.g., when checking voting power) using the elapsed time since the last update. This lazy evaluation pattern, as seen in ERC-20 token vesting contracts, minimizes on-chain computation and storage writes, making it gas-efficient for frequent reputation checks.
Decay Model Comparison
A comparison of common mathematical models used to implement reputation decay, highlighting their computational characteristics and typical use cases.
| Model / Characteristic | Exponential Decay | Linear Decay | Stepwise Decay |
|---|---|---|---|
Mathematical Formula | R_t = R_0 * e^(-λt) | R_t = max(R_0 - βt, 0) | R_t = R_0 - (floor(t / τ) * δ) |
Decay Rate | Continuous | Constant | Periodic (e.g., monthly) |
Implementation Complexity | Medium | Low | Medium |
Gas Cost (Typical) | High | Low | Medium |
Suitable For | High-frequency systems | Simple governance | Epoch-based protocols |
Resistance to Gaming | |||
Requires On-Chain Time | |||
Common Use Case | Real-time credit scores | Forum activity points | DAO voting power |
Solidity Implementation Patterns
This guide explains how to design and implement reputation decay mechanisms in Solidity smart contracts, covering key patterns, mathematical models, and security considerations for sustainable on-chain systems.
Reputation decay, or the gradual reduction of a user's score over time, is a critical mechanism for maintaining the health of on-chain systems. It prevents reputation from becoming a permanent, tradable asset and incentivizes continued positive participation. In Solidity, this is typically implemented by storing a lastUpdated timestamp alongside the reputation score and recalculating the current value using a decay function on each query or state-changing interaction. This pattern ensures the score is always up-to-date without requiring constant, expensive on-chain updates.
The core of the mechanism is the decay function. A common and gas-efficient approach is linear decay, where reputation decreases by a fixed amount per unit of time (e.g., 1 point per week). More sophisticated systems use exponential decay, modeled as currentScore = initialScore * e^(-k * elapsedTime). While mathematically elegant, exponential operations are expensive in the EVM. A practical alternative is polynomial decay using fixed-point arithmetic or lookup tables to approximate the curve, balancing accuracy with gas costs. The choice depends on the required precision and the frequency of updates.
Here is a basic implementation skeleton for a linear decay system:
soliditycontract ReputationSystem { mapping(address => uint256) public rawScore; mapping(address => uint256) public lastUpdate; uint256 public constant DECAY_RATE_PER_SECOND = 1; // e.g., 1 wei per second function getCurrentScore(address user) public view returns (uint256) { uint256 elapsed = block.timestamp - lastUpdate[user]; uint256 decayAmount = elapsed * DECAY_RATE_PER_SECOND; if (decayAmount >= rawScore[user]) return 0; return rawScore[user] - decayAmount; } function _updateScore(address user, int256 delta) internal { uint256 current = getCurrentScore(user); lastUpdate[user] = block.timestamp; // Apply delta to current score and store in rawScore if (delta > 0) { rawScore[user] = current + uint256(delta); } else { // Handle subtraction, ensuring no underflow rawScore[user] = current - uint256(-delta); } } }
The key is separating the stored rawScore from the calculated currentScore, updating the timestamp only when the score is modified.
When integrating decay, consider the epoch-based reset pattern. Instead of continuous decay, reputation can be reset or halved at regular intervals (e.g., monthly or quarterly). This simplifies calculations and creates clear incentive cycles, as seen in some governance token distribution models like Curve's veCRV. Another pattern is activity-based decay mitigation, where performing a positive action (like a successful governance vote) pauses or reduces the decay rate for a period, directly rewarding engagement.
Security and gas optimization are paramount. Always use block.timestamp for time calculations, but be aware of minor manipulation risks (up to ~30 seconds). Use SafeMath libraries or Solidity 0.8.x's built-in overflow checks for all arithmetic. To save gas, consider batching decay calculations in an off-chain indexer and providing a signed claim for the user to submit on-chain, or using a keep-alive pattern where users must periodically check-in to maintain their score, shifting the gas cost to the user.
Effective reputation decay requires careful parameter tuning. The decay rate must be slow enough to reward long-term contributors but fast enough to flush out inactive participants. Test different rates using forked mainnet simulations with tools like Foundry or Hardhat. Analyze historical data from similar protocols to inform your design. A well-tuned decay mechanism creates a dynamic, Sybil-resistant reputation layer that underpins sustainable decentralized applications, from governance and curation markets to social networks.
Code Snippet Examples
Practical implementations for designing and integrating time-based reputation decay into on-chain systems.
Linear Decay with Time-Locked Stakes
A common pattern where a user's reputation score decreases linearly over time unless they actively participate. This snippet uses a block timestamp to calculate decay.
solidityuint256 public constant DECAY_PERIOD = 30 days; uint256 public constant DECAY_RATE = 10; // 10% decay per period function calculateDecayedScore(uint256 initialScore, uint256 lastUpdate) public view returns (uint256) { uint256 periodsElapsed = (block.timestamp - lastUpdate) / DECAY_PERIOD; uint256 decayFactor = (DECAY_RATE * periodsElapsed) / 100; if (decayFactor >= 100) return 0; return initialScore * (100 - decayFactor) / 100; }
- Key Variables:
DECAY_PERIOD,DECAY_RATE. - Use Case: Staked governance power that diminishes with inactivity.
Exponential Decay for Sybil Resistance
Implements exponential decay to aggressively reduce the influence of old, unused identities, making Sybil attacks more costly over time. This is based on a half-life model.
solidity// Reputation halves every `HALF_LIFE` seconds uint256 public constant HALF_LIFE = 90 days; function exponentialDecay(uint256 score, uint256 lastActiveTime) public view returns (uint256) { uint256 intervals = (block.timestamp - lastActiveTime) / HALF_LIFE; // Use bit-shifting for division by 2^intervals (approximation) return score >> intervals; }
- Mechanism: Score is halved each full
HALF_LIFEperiod. - Advantage: Rapidly devalues stale accounts without linear cliffs.
Activity-Based Decay Reset
Decay is paused or reversed when a user performs a qualifying on-chain action. This snippet shows a checkpoint system that resets the decay clock.
soliditymapping(address => UserRep) public userRep; struct UserRep { uint256 score; uint256 lastDecayUpdate; uint256 lastActivity; } function recordActivity(address user) external { // First, apply any accrued decay up to now _applyDecay(user); // Reset the activity timestamp, pausing future decay userRep[user].lastActivity = block.timestamp; // Optionally, grant a small score boost for activity userRep[user].score += 10; }
- Core Logic: Decay calculation uses
lastActivity, notblock.timestamp. - Design Goal: Incentivize consistent participation.
Decay with Minimum Score Floor
Prevents reputation from decaying below a certain baseline, preserving some utility for dormant but historically good actors. Uses a saturating subtraction pattern.
solidityuint256 public constant MINIMUM_SCORE = 100; uint256 public constant DAILY_DECAY = 1; function applyDailyDecay(address user) internal { UserRep storage rep = userRep[user]; uint256 decayAmount = (block.timestamp - rep.lastUpdate) / 1 days * DAILY_DECAY; if (rep.score > decayAmount + MINIMUM_SCORE) { rep.score -= decayAmount; } else { rep.score = MINIMUM_SCORE; } rep.lastUpdate = block.timestamp; }
- Safety Feature: The
MINIMUM_SCOREacts as a non-zero floor. - Application: Useful for tiered access systems.
Testing Decay Mechanics with Foundry
A Foundry test example to verify decay logic works correctly over simulated time jumps. Critical for ensuring economic security.
solidity// test/ReputationDecay.t.sol function test_LinearDecayOverTwoPeriods() public { uint256 initialScore = 1000; reputationContract.setScore(user, initialScore); // Warp forward 60 days (2 decay periods of 30 days) vm.warp(block.timestamp + 60 days); // Apply decay reputationContract.applyDecay(user); // With a 10% decay per period, score should be 1000 * 0.9 * 0.9 = 810 uint256 newScore = reputationContract.getScore(user); assertEq(newScore, 810); } function test_DecayStopsAtFloor() public { // Set score to minimum floor + 1 reputationContract.setScore(user, 101); vm.warp(block.timestamp + 365 days); // Decay would reduce by 365 points reputationContract.applyDecay(user); // Assert score is at the floor of 100, not 0 assertEq(reputationContract.getScore(user), 100); }
- Tool: Use
vm.warpin Foundry to simulate time. - Best Practice: Test edge cases like minimum floors and long durations.
Configuring Activity-Based Refresh Triggers
Designing effective reputation decay mechanisms that automatically refresh scores based on user activity to maintain data relevance and system security.
Activity-based refresh triggers are a core component of dynamic reputation systems, designed to prevent score stagnation and incentivize ongoing participation. Unlike static scores, which become outdated, these mechanisms automatically initiate a reputation recalculation when a user performs a qualifying on-chain action. This ensures that a user's reputation reflects their recent behavior, not just historical activity. Common triggers include submitting a new transaction, casting a governance vote, or providing liquidity to a protocol. By linking score updates to verifiable on-chain events, the system maintains a self-updating ledger of trust without requiring manual intervention.
The primary goal of decay is to mitigate risks associated with stale reputation, such as sybil attacks or the misuse of old, high-reputation accounts that are no longer active. A well-designed decay function, often a time-based exponential or linear decay, reduces a score's weight or value over time. The refresh trigger resets or mitigates this decay. For example, a user's reputation score might decay by 10% per month of inactivity, but performing a governance vote could reset the decay timer or add a positive activity bonus. This creates a continuous incentive loop where users must remain engaged to preserve their standing and influence within the ecosystem.
Implementing this requires defining the decay parameters and the refresh logic. A basic Solidity structure for a time-based decay with an activity reset might look like this:
soliditystruct Reputation { uint256 score; uint256 lastUpdated; uint256 decayRatePerSecond; } function applyDecay(address user) public view returns (uint256) { Reputation storage rep = reputation[user]; uint256 timeElapsed = block.timestamp - rep.lastUpdated; uint256 decayAmount = rep.score * rep.decayRatePerSecond * timeElapsed / 1e18; return rep.score - decayAmount; } function refreshOnActivity(address user) internal { reputation[user].lastUpdated = block.timestamp; // Optionally add a small activity bonus reputation[user].score += ACTIVITY_BONUS; }
The refreshOnActivity function is called within other protocol functions (e.g., castVote) to reset the decay clock.
When designing triggers, consider the cost and frequency of the qualifying actions. Requiring a high-gas transaction for a refresh may disincentivize participation. Instead, integrate with low-cost, high-signal actions. For instance, the Optimism Governance system uses voting power that decays over time, which can be refreshed by delegating votes or participating in polls. The key is to align the refresh activity with behaviors that provide positive externalities to the network. This ensures the mechanism not only maintains data freshness but also steers user behavior toward ecosystem health, creating a sustainable and secure reputation layer for DAOs, credit systems, and access control.
Half-Life Configurations for Reputation Types
Comparison of half-life parameterization strategies for different reputation use cases.
| Reputation Type | Linear Decay | Exponential Decay | Stepwise Decay |
|---|---|---|---|
Typical Half-Life | 30 days | 90 days | Fixed Epochs |
Decay Rate per Epoch | 3.33% | 0.76% | 10% |
Parameter Tuning | Manual | Formula-based | Governance Vote |
Gas Cost per Update | Low | Medium | High |
Resistance to Sybil Attacks | |||
Suitable for Staking | |||
Suitable for Social | |||
Implementation Example | Aave Governance | Compound's COMP | Curve Voting Escrow |
How to Design Reputation Decay Mechanisms
Reputation decay is a critical economic mechanism for maintaining system health, preventing stake stagnation, and incentivizing continuous participation.
Reputation decay, also known as reputation erosion or stake slashing via time, is a design pattern where a user's influence or stake in a system diminishes over time unless actively maintained. Unlike punitive slashing for malicious acts, decay is a predictable, continuous process. Its primary functions are to prevent the ossification of power—where early participants gain permanent, disproportionate control—and to create a continuous cost for holding reputation, incentivizing active contribution or delegation. This mechanism is foundational in systems like SourceCred for contributor rewards and is a proposed feature for many DAO governance models to combat voter apathy.
Implementing decay requires defining key parameters: the decay rate, update period, and activation threshold. A common approach is exponential decay, similar to unbonding periods in proof-of-stake. For example, a reputation balance R could decay every epoch t according to R_t = R_{t-1} * (1 - d), where d is the decay rate (e.g., 0.5% per month). This must be paired with a function to add fresh reputation for recent actions. In code, a simplified on-chain update might look like:
solidityfunction decayReputation(address user) public { uint256 epochsElapsed = (block.timestamp - lastUpdate[user]) / EPOCH_DURATION; if (epochsElapsed > 0) { reputation[user] = reputation[user] * (DECAY_BASE ** epochsElapsed) / DECAY_DENOMINATOR; lastUpdate[user] = block.timestamp; } }
The DECAY_BASE would be a fraction representing (1 - d).
The economic security of a decay mechanism hinges on aligning its parameters with desired user behavior. A rate that is too high (e.g., 10% per week) forces excessive engagement and may drive users away. A rate that is too low (e.g., 1% per year) fails to achieve its anti-ossification goal. Designers must model the half-life of reputation—the time it takes for a balance to halve without new contributions. A 6-month half-life creates a different incentive structure than a 2-year one. Furthermore, decay should often be applied only to reputation used for governance, not necessarily to all earned rewards, to avoid unfairly penalizing past contributors.
A major security consideration is the last-update problem. Naive implementations that require users to trigger their own decay updates are vulnerable to griefing; an attacker could prevent a user from updating, causing their reputation to decay unfairly. The system should either have a permissionless, incentivized function for anyone to trigger updates, or, preferably, batch-process all user decay in a single, regular transaction. Additionally, designers must decide if decay "burns" the reputation permanently or recycles it into a common pool for redistribution. Redistribution can fund new contributors, creating a circular economy.
Effective decay mechanisms are transparent and predictable. Users should be able to easily calculate their future reputation balance given no further actions. Frontends should visualize decay trajectories. This predictability transforms decay from a punitive measure into a clear economic parameter, similar to an annual fee for influence. When combined with sybil-resistance and a robust reputation-earning mechanism, decay ensures a dynamic, secure, and participatory ecosystem where current influence reflects ongoing value addition.
Implementation Resources and Tools
These resources focus on practical ways to design and implement reputation decay mechanisms in onchain and offchain systems. Each card covers a concrete approach, algorithm, or tooling choice that developers can apply when building Sybil-resistant reputation, governance weighting, or trust scoring systems.
Exponential and Linear Time Decay Functions
Time-based decay is the baseline mechanism for preventing stale reputation from dominating system outcomes. Instead of treating reputation as a permanent score, decay functions continuously reduce its weight as time passes.
Common implementation patterns:
- Exponential decay:
R_t = R_0 * e^(-λt)where λ controls half-life - Linear decay: reputation decreases by a fixed amount per epoch
- Step-based decay: score drops after discrete inactivity windows
Key design decisions:
- Choose a half-life that matches protocol cadence. Governance systems often use 30–180 day half-lives, while marketplaces may use 7–30 days.
- Apply decay per block, epoch, or interaction window to reduce gas costs.
- Store only the last update timestamp and recompute lazily to avoid per-block writes.
This approach is simple, gas-efficient, and composable with staking or voting weight. It does not require social graph data and works well for systems where activity frequency directly correlates with trust.
Negative Reputation and Slashing-Based Decay
Instead of passive decay, some systems actively reduce reputation through penalties and slashing. This approach treats misbehavior as a stronger signal than inactivity.
Common penalty triggers:
- Proven fraud or dispute loss
- Invalid attestations or oracle errors
- Governance actions overturned by quorum
Design considerations:
- Slashing events should apply multiplicative decay rather than flat reductions to prevent recovery exploits
- Penalties often decay slower than positive reputation, for example 2–4× longer half-life
- Combine with staking so that reputation loss also has an economic cost
This model is common in validator systems, oracle networks, and prediction markets. It increases security but requires reliable dispute resolution and clear evidence standards. Poorly designed slashing can discourage participation, so penalty magnitude and recovery curves must be explicitly modeled.
Frequently Asked Questions
Common questions and technical considerations for designing effective reputation decay mechanisms in on-chain systems.
Reputation decay is a mechanism that reduces a user's reputation score over time if they are inactive or do not maintain positive behavior. It prevents reputation from becoming a permanent, inflated asset that no longer reflects current trustworthiness.
Key reasons for implementing decay:
- Prevents Sybil attacks: Makes it costly for an attacker to farm a high reputation once and then use it indefinitely for malicious purposes.
- Encourages ongoing participation: Ensures users remain active and engaged with the protocol to maintain their standing.
- Reflects current reality: A user's trustworthiness from two years ago may not be relevant today; decay ensures the score is a live metric.
Protocols like Aave's Governance use time-based decay for voting power to ensure recent, active participants have more influence.
Conclusion and Next Steps
Designing an effective reputation decay mechanism requires balancing user engagement, system security, and long-term data accuracy. This guide has outlined the core principles and models.
Reputation decay is not a one-size-fits-all solution. The optimal model depends on your protocol's specific goals. For governance systems like Compound or Uniswap, a slow, linear decay of voting power can prevent voter apathy and stale delegation. In contrast, a Quadratic Funding round or a prediction market might employ rapid, event-triggered decay to ensure only recent, relevant contributions are weighted heavily. Always align the decay rate and function with your core incentive structure.
When implementing decay, consider these technical next steps. First, audit the state bloat; calculate how user scores will grow over time and ensure your storage solution (like a Merkle tree or a state channel) can handle the historical data efficiently. Second, simulate the economic effects using agent-based modeling or tools like cadCAD to test for unintended consequences, such as users gaming decay cycles. Finally, publish a clear, on-chain decay schedule so users can trust the system's rules are transparent and immutable.
To deepen your understanding, explore live implementations. Study Gitcoin Passport's scoring, which incorporates stamp expiration. Examine how Optimism's AttestationStation or EAS (Ethereum Attestation Service) handle the revocation and temporal validity of attestations, a form of social decay. For further research, academic papers on schelling point mechanisms and time-weighted averages provide rigorous models for weighting recent activity more heavily than past actions.