# VotingKSP

&#x20;This contract is responsible for the ecosystem behavior related to staking KSP. Voting rights (vKSP) are issued according to the staking quantity and period, and 40% of the daily KSP mining quantity is distributed to staking participants. (KSP distribution for staking participants may be changed through governance voting)

## Code

Github Link: (Will be updated after official launch)<br>

## Address

* Cypress : [0x2F3713F388BC4b8b364a7A2d8D57c5Ff4E054830](https://scope.klaytn.com/account/0x2F3713F388BC4b8b364a7A2d8D57c5Ff4E054830?tabId=txList)

## Events, Read-Only Functions, and State-Changing Functions

{% tabs %}
{% tab title="Events" %}

## Events

**LockKSP**

```solidity
event LockKSP(address user, uint lockPeriod, uint KSPAmount, uint totalLockedKSP, uint unlockTime);
```

* Event log of KSP staking
* Parameters
  * `user` : user address
  * `lockPeriod` :&#x20;
    * 4 months : 10,368,000
    * 8 months : 20,736,000
    * 12 months : 31,104,000
    * x8 : 1,555,200,000
  * `KSPAmount` : Number of KSP
  * `totalLockedKSP`: Total number of staked KSP&#x20;
  * `unlockTime` : Available unstaking time (timestamp)

**UnlockKSP**&#x20;

```solidity
event UnlockKSP(address user, uint vKSPAmount, uint KSPAmount);
```

* Event log of KSP unstaking
* Parameters
  * `user` : user address
  * `vKSPAmount` : Number of vKSP
  * `KSPAmount` : Number of KSP

**UnlockKSPUnlimited**

```solidity
event UnlockKSPUnlimited(address user, uint vKSPBefore, uint vKSPAfter, uint KSPAmount, uint unlockTime);
```

* Event log that occurs when unstaking vKSP x8
* Parameters
  * `user` : user address
  * `vKSPBefore` : The amount of vKSP held
  * `vKSPAfter` : Amount of vKSP held after unstaking
  * `KSPAmount` : Amount of KSP staked
  * `unlockTime` : Available unstaking time (timestamp)

**RefixBoosting**

```solidity
event RefixBoosting(address user, uint lockPeriod, uint boostingAmount, uint unlockTime);
```

* Event log of staking period is changed
* Parameter
  * `user` : user address
  * `lockPeriod` : period
  * `boostingAmount` : Number of vKSP after period changed
  * `unlockTime` : Available unstaking time (timestamp)

**ChangeMiningRate**

```solidity
event ChangeMiningRate(uint _mining);
```

* Event log of daily KSP distrivution rate changed

**GiveReward**

```solidity
event GiveReward(address user, uint amount, uint lastIndex, uint rewardSum);
```

* Event log of when mined KSP is claimed and distributed

**Compound**

```solidity
event Compound(address user, uint reward, uint compoundAmount, uint transferAmount, uint mintAmount);
```

* Event log of when mined KSP restaking.
* The compound amount can be entered in integer units&#x20;
* The amount minus the compund amount from the mined amount is returned to the wallet.&#x20;
  {% endtab %}

{% tab title="Read-Only Functions" %}

## Read-Only Functions

**balanceOf**

* Number of vKSP tokens held by each address

**getCurrentBalance**

* Number of vKSP tokens held by each address recent snapshot&#x20;

**getUserUnlockTime**

* Possible time of unstake

**lockedKSP**

* Number of KSP tokens stakes

**mining**

* KSP distribution rate&#x20;
* It is a value between 0 and 10000, in units of 0.0001%

**snapShotBalance**

* Number of vKSP tokens held by each address and snapshot&#x20;

**snapShotCount**

* Number of snapshot index each address&#x20;

**getPriorBalance**

```solidity
function getPriorBalance(address user, uint blockNumber) public view returns (uint) 
```

* Historical user vKSP holdings per block&#x20;
* Parameter
  * `user` : user address
  * `blockNumber` : prior blockNumber

**snapShotBalance**

```solidity
function snapShotBalance(address user, uint index) public view returns (uint) 
```

* Historical vKSP holdings each address
* Parameter
  * `user` : user address
  * `index` : index

{% endtab %}

{% tab title="State-Changing Functions" %}

## **State-Changing Functions**

**lockKSP**

```solidity
function lockKSP(uint amount, uint lockPeriodRequested) public
```

* Method for KSP staking&#x20;
* The amount can be entered in integer units &#x20;

**unlockKSP**

```solidity
function unlockKSP() public
```

* Method for KSP unstaking
* Unstaking is only possible during the unstaking period.

**unlockKSPUnlimited**

```solidity
function unlockKSPUnlimited() public
```

* Method for unstake KSP x8
* Changed to x4 staking from execution

**refixBoosting**

```solidity
function refixBoosting(uint lockPeriodRequested)
```

* Method for KSP staking period change&#x20;

**claimReward**

```solidity
function claimReward() public
```

* Method that a user calls to claim the claimable KSP&#x20;

**compoundReward**

```solidity
function compoundReward() public
```

* Method for mined KSP staking&#x20;
* Can be called when the reward is 1 KSP or more&#x20;
* It is possible to stake in integer units, and the rest is to the wallet address.
  {% endtab %}
  {% endtabs %}
