# VotingMESH

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

## Code

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

## Address

* Polygon Mainnet : [0x176b29289f66236c65c7ac5db2400abb5955df13](https://polygonscan.com/address/0x176b29289f66236c65c7ac5db2400abb5955df13)

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

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

## Events

**LockMESH**

```solidity
event LockMESH(address user, uint lockPeriod, uint MESHAmount, uint totalLockedMESH, uint unlockTime);
```

* Event log of MESH 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
  * `MESHAmount` : Number of MESH locked b
  * `totalLockedMESH` : Total Number of staked MESH
  * `unlockTime` : Available unstaking time (timestamp)

**UnlockMESH**&#x20;

```solidity
event UnlockMESH(address user, uint vMESHAmount, uint MESHAmount);
```

* Event log of MESH unstaking
* Parameters
  * `user` : user address
  * `vMESHAmount` : Number of vMESH&#x20;
  * `MESHAmount` : Number of MESH&#x20;

**UnlockMESHUnlimited**

```solidity
event UnlockMESHUnlimited(address user, uint vMESHBefore, uint vMESHAfter, uint MESHAmount, uint unlockTime);
```

* Event log that occurs when unstaking vMESH x8
* Parameters
  * `user` : user address
  * `vMESHBefore` : The amount of vMESH held
  * `vMESHAfter` : Amount of vMESH held after unstaking
  * `MESHAmount` : Amount of MESH staked
  * `unlockTime` : Available unstaking time (timestamp)

**RefixBoosting**

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

* Event log of staking period is changed
* Parameter
  * `user` : user addres
  * `lockPeriod` : period
  * `boostingAmount` : Number of vMESH after period changed

**ChangeMiningRate**

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

* Event log of daily MESH distribution rate changed

**GiveReward**

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

* Event log of when mined MESH is claimed and distributed

**Compound**

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

* Event log of when mined MESH 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 vMESH tokens held by each address

**getCurrentBalance**

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

**getUserUnlockTime**

* Possible time of unstake

**lockedMESH**

* Number of MESH tokens stakes

**mining**

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

**snapShotBalance**

* Number of vMESH 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 vMESH holdings per block&#x20;
* Parameter
  * `user` : user address
  * `blockNumber` : prior blockNumber

**snapShotBalance**

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

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

{% endtab %}

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

## **State-Changing Functions**

**lockMESH**

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

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

**unlockMESH**

```solidity
function unlockMESH() public
```

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

**unlockMESHUnlimited**

```solidity
function unlockMESHUnlimited() public
```

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

**refixBoosting**

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

* Method for MESH staking period change&#x20;

**claimReward**

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

* Method that a user calls to claim the claimable MESH

**compoundReward**

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

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