Skip to main content

Summary

  • New features: GNS staking fees are all used to buy GNS, sends an adjustable % to treasury, burn, and GNS staking rewards and uses an adjustable price premium; new compound function in GNS staking
  • Other changes: There is a 100 seconds cooldown to wait before one can unstake after staking GNS to prevent flashloans (vests must be 100 seconds long at least too now)

Full Changelog

core/GNSStaking.sol (update)

  • New UNSTAKING_COOLDOWN_SECONDS constant (= 100 seconds)
  • New stakerInfos mapping to store each user’s lastDepositTs
  • New notInCooldown modifier, used by unstakeGns, reverts if user deposited less than UNSTAKING_COOLDOWN_SECONDS ago
  • _harvestToken, _harvestFromUnlock, _harvestTokenFromUnlock, harvestToken, harvestTokenFromUnlock, harvestTokenAll now all return the pending token rewards (needed for compound function)
  • New compoundGnsRewards function: harvests pending regular rewards and vest rewards (accepts vests _ids as input) and stakes them in the same transaction
  • stakeGns: now public (called by compoundGnsRewards) and stores current timestamp in stakerInfos mapping for caller
  • unstakeGns: now uses notInCooldown modifier
  • createUnlockSchedule: now checks vest duration >= UNSTAKING_COOLDOWN_SECONDS instead of accepting any non-zero value

core/abstract/GNSDiamondStorage.sol (update)

  • Added otcStorage private state var for new GNSOtc facet

core/facets/GNSOtc.sol (new)

  • New facet which handles the collateral -> GNS OTC buying process and transfer to treasury, burn, and GNS staking rewards (adjustable percentages)
  • initializeOtc: infinite approval of GNS staking contract for GNS token and config initialization
  • updateOtcConfig: update treasury address and percentages
  • addOtcCollateralBalance: increases available collateral balance for OTC buying (used by GNSTradingCallbacks when distributing GNS staking fee)
  • sellGnsForCollateral: executes OTC transaction; diamond receives GNS and sender receives collateral tokens, available collateral balance for OTC decreases accordingly
  • getOtcConfig, getOtcBalance, getOtcRate getters

interfaces/IGNSMultiCollatDiamond.sol (update)

  • Now inherits IOtcUtils

interfaces/IGNSStaking.sol (update)

  • New StakerInfo struct (lastDepositTs and placeholder)

interfaces/IGeneralErrors.sol (update)

  • New InsufficientBalance() error

interfaces/libraries/IOtcUtils.sol (new)

  • Interface for new GNSOtc facet: contains all types, functions, events, and custom errors

interfaces/types/IOtc.sol (new)

  • Interface for new GNSOtc facet: contains all types
  • OtcStorage struct: collateralBalances mapping, otcConfig struct
  • OtcConfig struct: treasury address, percentages (treasury, GNS staking, burn), price premium

interfaces/types/IPriceAggregator.sol (update)

  • Fixed __gap array length, reduced from 41 to 39

interfaces/types/ITypes.sol (update)

  • Now inherits new facet types IOtc

libraries/OtcUtils.sol (new)

  • Internal library for new GNSOtc facet

libraries/StorageUtils.sol (update)

  • Added GLOBAL_OTC_SLOT constant for new GNSOtc facet

libraries/TradingCommonUtils.sol (update)

  • convertCollateralToGns, transferCollateralTo, and _getMultiCollatDiamond are now internal: allows not linking TradingCommonUtils to GNSOtc as internal functions are imported directly into the bytecode, should only make functions external when it becomes an issue for size
  • New transferGnsTo and transferGnsFrom helpers to handle simple GNS transfers between users and the diamond
  • distributeGnsStakingFeeCollateral now calls _getMultiCollatDiamond().addOtcCollateralBalance instead of gnsStaking.distributeReward