npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2024 – Pkg Stats / Ryan Hefner

@athenalend/safety-module

v0.0.2

Published

Safety Module for the Athena Protocol

Downloads

26

Readme

License: AGPL v3 Build pass codecov

Athena Incentives contracts

Sets of smart contracts to enable stake of Athena-related assets and rewards distribution based on them.

Specification

Architecture

General architecture

A common parent contract AthenaDistributionManager is used to keep the "accounting" logic for a set of children front contracts taking care of each type of incentive; being these, initially, a StakedAthena contract for stake of Athena tokens on the Athena SM (Security Module) which will which be used as security fund in the near future, and a AthenaIncentivesController contract through which the Athena protocol will interact in order to provider rewards as incentives to users. The rationale of this inheritance chain in 2 main layers is the clearly conceptual separation between a common part of configurations of the distributions and mathematical calculation, and one specific part for each type of incentive (locking funds in a stake, providing liquidity to a protocol and potentially more in the future). Additionally, there will be a Rewards vault where the ATHENA rewards will be keep, to distribute through the StakedAthena and the AthenaIncentivesController. Both will be granted in advance with allowance to pull funds from. The following sections will go in detail on the specification of both the AthenaDistributionManager and the different front contracts.

AthenaDistributionManager

Core contract for calculation of multiple distributions with different configurations. All the front contracts which users/athena protocol will interact with inherit from the AthenaDistributionManager. It calculates how many rewards belong to a certain user depending on the user's situation defined by the front contract of the distribution. This calculation is done by using a distribution index representing the accumulation of rewards from an emission per second and snapshoting that index on each user to take into account how much of the total belongs to him.

Data

  • assets. Mapping of AssetData structs which, for each front contract connected to the AthenaDistributionManager stores 1 or more of:
    • emissionPerSecond: Amount of rewards per second distribution-wide. It's used to calculate the raw amount of rewards to distribute in a time delta since the last update of the following described index.
    • index: Variable representing the accumulated rewards distributed distribution-wide per unit of token used in the specific child contract of the distribution (per unit of staked Athena in the case of the StakedAthena child contract). The next index is calculated by the formula on _getNormalizedDistribution() emissionPerSecond _ timeDelta _ 10^PRECISION / balanceOnFrontContract + previousIndex, scaling it up multiplying by 10^18 in order to not lose precision.
    • lastUpdateTimestamp: timestamp when the struct was updated.
    • userIndexes: mapping user address => index snapshotted on the user from the one of the distribution.

For the child StakedAthena, they key of the mapping used is the address of the StakedAthena itself. In the case of the AthenaIncentivesController, there is a different key and struct for each aToken and debtToken submitted to incentives.

Logic

This contract allows to do the following:

  • Configuration of multiple distributions: only allowed to a trusted EMISSION_MANAGER, allows to list an specific distribution, with some emission per second and front contract.
  • Update of user/distribution state on interaction: called by the child contract when something happened concerning the situation on the user, for example when he stakes on StakedAthena, redeems, deposit on the Athena protocol, etc...
  • Get the unclaimed rewards of an user: self-explanatory, used by the children contracts to check how much rewards were accrued for an user and store the data if needed on their side, by interacting with the claimRewards() function.
  • Query information about distributions/users: by using the different view functions available.

StakedAthena

Contract to stake ATHENA token, to be connected with a slashing mechanism in the near future in order to secure the Athena protocol, forming the so called Athena SM (Security Module). Holders of Athena tokens stae them in this contract, they receive equivalent amount in stkATHENA tokens and start accruing rewards in ATHENA; rewards previously configured on the father contract AthenaDistributionManager by the a trusted EMISSION_MANAGER. Once they accrued ATHENA rewards, they can claim them at any moment but, to withdraw their staked ATHENA tokens, they need to activate and wait a cooldown period, and withdraw just after it, during a withdrawal time window.

Data

  • stakerRewardsToClaim: mapping storing the accrued rewards accrued and stored for an user, not taking into account those accrued but not stored yet.
  • stakersCooldowns: mapping the timestamp of activation of cooldown period for an user, if activated.

Logic

This contract allows to do the following:

  • Stake ATHENA tokens to start accruing rewards: through the stake() function. The ATHENA tokens will be locked in this same contract, and stkATHENA tokens will be minted for the user in the same proportion as ATHENA staked, the state in the father AthenaDistributionManager will be updated and the timestamp of the cooldown will be updated too.
  • Withdraw staked ATHENA tokens: if an user has stkATHENA, he can call the redeem() function, burning the stkATHENA and receiving the same proportion of previously staked ATHENA. The withdrawal will only suceed if the user in on the withdrawal window after the cooldown period.
  • Activate the cooldown period: self-explanatory, calling the cooldown() function and needed to withdraw the staked ATHENA.
  • Claim the accrued rewards: by calling the claimRewards() function, used to update the state and transfer to the user the accrued rewards, consequence of the time he was/is staking.
  • Query information about users: about their rewards or cooldown period.

Cooldown period

The main objective of the cooldown period is to avoid situations on the future Security Module when, if an slashing event happens, people starts withdrawing in mass their staked funds, leaving the protocol uncover and removing the utility on the stake itself. To achieve this, the most important condition to be fullfilled on any state update/operation involving the StakedAthena contract is that, if a user staking withdraws, he already respected a cooldown period, which leads that movement of funds should only affect "negatively" the cooldown period. Depending on the type of operation, the cooldown period is affected in the following way:

  • If an user stakes ATHENA with/without having any fund staked before, if he didn't have the cooldown activated, it remains the same way.
  • If an user stakes ATHENA holding already stkATHENA and with cooldown period activated:
    • If the cooldown is expired, remains expired.
    • If the cooldown is still valid, using the amount staked and the current timestamp, it does the weighted average with the current cooldown timestamp of the user.
  • If the user redeems ATHENA, the cooldown timestamp is set to 0.
  • If the user claims rewards, the cooldown timestamp is not affected.
  • On transfer of stkATHENA:
  • The cooldown timestamp of the sender remains as it is.
  • On the recipient:
    • If the recipient is on a valid cooldown period finishing before that the one of the sender, we do the same weighted average as in stake().
    • If the recipient has an expired cooldown timestamp, his cooldown timetamp is set to 0.
    • If both sender and recipient have valid cooldown period activated and the one of the sender ends before than the recipient, the recipient keeps his own.

AthenaIncentivesController

Contract in charge of the incentives for activity on the Athena protocol, inheriting from the AthenaDistributionManager. Each time an action involving any incentive for an user happens on the Athena protocol, this contract is called to manage the update of the incentives state.

Data

  • _usersUnclaimedRewards: mapping storing the accrued rewards accrued and stored for an user, not taking into account those accrued but not stored yet.

Logic

This contract allows to do the following:

  • Communication Athena protocol -> incentives: through the whitelisted function handleAction(), only callable by the Athena lending pool. For every asset and user, one call to this function needs to be done, which will trigger a state update in both the rewards of the user and the distribution data.
  • Claim of user rewards: by claimRewards() function, transferring to the user the ATHENA rewards. If the user tries to claim his rewards with the StakedAthena as target, a bonus will applied on the rewards accumulated from his activity on the protocol, and the stake() function on the StakedAthena will be called.
  • Query information about users: mainly about the state of their rewards.

Audits

The Solidity code in this repository has undergone 2 traditional smart contracts' audits by Consensys Diligence and Certik. The reports are:

  • Consensys Diligence
  • Certik

Current Mainnet contracts (25/09/2020)

[MAIN]

Credits

For the proxy-related contracts, we have used the implementation of our friend from OpenZeppelin.

License

The contents of this repository are under the AGPLv3 license.