# v9.1 Update

## 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`


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://docs.gains.trade/developer/technical-reference/contracts/changelogs/v9.1-update.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
