---
# System prepended metadata

title: veDF Kovan Testnet

---

# veDF Kovan Testnet

## Contract address


### **DF lock up protocol(02-14)**
| Contract Name | Contract Address                           | Link                                                                                  |
| ------------- | ------------------------------------------ |:------------------------------------------------------------------------------------- |
| DF            | 0x79E40d67DA6eAE5eB4A93Fc6a56A7961625E15F3 | [link](https://kovan.etherscan.io/address/0x79E40d67DA6eAE5eB4A93Fc6a56A7961625E15F3) |
| vault address | 0xF4Db6BB2bd78b42e3cFbA47B667ff8A2CebB570D | [link](https://kovan.etherscan.io/address/0xF4Db6BB2bd78b42e3cFbA47B667ff8A2CebB570D) |
| sDF           | 0x22A0938f726D0542Dc20e6C9D57BB97cCF940d6a | [link](https://kovan.etherscan.io/address/0x22A0938f726D0542Dc20e6C9D57BB97cCF940d6a) |
| veDF           | 0x047099D138449c6e9378aa452e5F686B5625f466 | [link](https://kovan.etherscan.io/address/0x047099D138449c6e9378aa452e5F686B5625f466) |
| veDFManager    | 0xdf3476DdB734497eB58E6cfc235389846153B3fe | [link](https://kovan.etherscan.io/address/0xdf3476DdB734497eB58E6cfc235389846153B3fe) |



### **DF lock up protocol(03-4)**
| Contract Name | Contract Address                           | Link                                                                                  |
| ------------- | ------------------------------------------ |:------------------------------------------------------------------------------------- |
| DF            | 0x79E40d67DA6eAE5eB4A93Fc6a56A7961625E15F3 | [link](https://kovan.etherscan.io/address/0x79E40d67DA6eAE5eB4A93Fc6a56A7961625E15F3) |
| vault address | 0x3Ea0EA578cd03036d98279A8293ca19ddE4Bf09B | [link](https://kovan.etherscan.io/address/0x3Ea0EA578cd03036d98279A8293ca19ddE4Bf09B) |
| sDF           | 0xBE3a263537F8Dc97c29d5884544Cf9F4e42299fe | [link](https://kovan.etherscan.io/address/0xBE3a263537F8Dc97c29d5884544Cf9F4e42299fe) |
| veDF           | 0x65d538A6E4C06989171e24B7A4c7d74667497967 | [link](https://kovan.etherscan.io/address/0x65d538A6E4C06989171e24B7A4c7d74667497967) |
| veDFManager    | 0xAf14959178d59776200E84Da9Ab92c294663A3f1 | [link](https://kovan.etherscan.io/address/0xAf14959178d59776200E84Da9Ab92c294663A3f1) |


### **DF lock up protocol(03-11)**
| Contract Name | Contract Address                           | Link                                                                                  |
| ------------- | ------------------------------------------ |:------------------------------------------------------------------------------------- |
| DF            | 0x79E40d67DA6eAE5eB4A93Fc6a56A7961625E15F3 | [link](https://kovan.etherscan.io/address/0x79E40d67DA6eAE5eB4A93Fc6a56A7961625E15F3) |
| vault address | 0x3Ea0EA578cd03036d98279A8293ca19ddE4Bf09B | [link](https://kovan.etherscan.io/address/0x3Ea0EA578cd03036d98279A8293ca19ddE4Bf09B) |
| sDF           | 0xBE3a263537F8Dc97c29d5884544Cf9F4e42299fe | [link](https://kovan.etherscan.io/address/0xBE3a263537F8Dc97c29d5884544Cf9F4e42299fe) |
| veDF           | 0x2C9671f4f7fd226D092A2c1715b9f03749358366 | [link](https://kovan.etherscan.io/address/0x2C9671f4f7fd226D092A2c1715b9f03749358366) |
| veDFManager    | 0x7259153980146593E1128d3460f356eC08FC25A5 | [link](https://kovan.etherscan.io/address/0x7259153980146593E1128d3460f356eC08FC25A5) |

### **Governance(02-23)**

| Contract Name        | Contract Address                           | Link |
| -------------------- |:------------------------------------------ | ---- |
| veDF           | 0x047099D138449c6e9378aa452e5F686B5625f466 | [link](https://kovan.etherscan.io/address/0x047099D138449c6e9378aa452e5F686B5625f466) |
| time lock            | 0x32CCeCCb9e2911037C0A04E9844bC52A8ff1134B | [link](https://kovan.etherscan.io/address/0x32CCeCCb9e2911037C0A04E9844bC52A8ff1134B) |
| governance delegate  | 0xfa4CF57D02E97140219D63DEb15a96d81eEbd8b0 | [link](https://kovan.etherscan.io/address/0xfa4CF57D02E97140219D63DEb15a96d81eEbd8b0) |
| governance delegator | 0x97628b2d36872ff5A1c8e1211DA62943a6245130 | [link](https://kovan.etherscan.io/address/0x97628b2d36872ff5A1c8e1211DA62943a6245130) |


### **Governance(03-14)**

| Contract Name        | Contract Address                           | Link |
| -------------------- |:------------------------------------------ | ---- |
| veDF           | 0x2C9671f4f7fd226D092A2c1715b9f03749358366 | [link](https://kovan.etherscan.io/address/0x2C9671f4f7fd226D092A2c1715b9f03749358366) |
| time lock            | 0x9211Bfa57620284FdE2D8318Fd35b9a9eB56D862 | [link](https://kovan.etherscan.io/address/0x9211Bfa57620284FdE2D8318Fd35b9a9eB56D862) |
| governance delegate  | 0x03aAAd8D8c30eD091f5e23658f5C08371561b0c5 | [link](https://kovan.etherscan.io/address/0x03aAAd8D8c30eD091f5e23658f5C08371561b0c5) |
| governance delegator | 0x5904B22e786437b46DA651F91e5f116945276592 | [link](https://kovan.etherscan.io/address/0x5904B22e786437b46DA651F91e5f116945276592) |




## **Calculation**

### **veDF Calculation**


**veDF amount**
```
veDFAmount = amount * weightedRate
```
~~weightedRate = ((1 + linearRate) ** 2) * linearRate~~
```
weightedRate = linearRate
```
```
linearRate = duration / (3600 * 24 * 7 * 52 * 4)
```
* **param rule**

```
 param:     inputAmount, inputDuration
 getLocker: locker.dueTime, locker.duration, locker.amount
```

```
if (_locker.dueTime < Currentblock.timestamp)
    amount = inputAmount
    duration = inputDuration
```
    
```
if (locker.dueTime > Currentblock.timestamp)
    
    if (inputDuration > 0)
    
        amount = locker.amount
        duration = inputDuration
        
    if (inputAmount > 0)
    
        amount = inputAmount
        duration = locker.dueTime + inputDuration - currentBlock.timestamp
```
 
**Annual interest rate**


* **veDF Holder APY**

```
annualInterestRate:
    
    rewardRate * year(365 * 24 * 3600) * 1e18 / sDFLockedAmount
```
<!--     rewardRate * year(365 * 24 * 3600) / DFLockedAmount
    
    DFLockedAmount = sDFLockedAmount * sDF ExchangeRate -->

* **veDF Annual interest rate**

```
(annualInterest / principal) + sDF annualInterestRate
```
```
annualInterest:
    
    rewardRate * user veDF amount * year(365 * 24 * 3600) * 1e18 / (veDF totalSupply - accSettledBalance + increase veDF amount)

user veDF amount: 

    if (_locker.dueTime < Currentblock.timestamp)
        
        increase veDF amount
    else
        
        user veDF Balance + increase veDF amount
    
rewardRate:
    
    call.veDFManager.getLockInfo()[3]

accSettledBalance:
    
    call.veDFManager.getLockInfo()[2]
    
sDF annualInterestRate:

    call.sDF.getAnnualInterestRate()
```
```
principal:
    
    call.veDFManager.getLockerInfo(userAddress)[3] + input sDFAmount
```
<!--     lock-up sDF amount * sDF ExchangeRate -->

### **sDF Calculation**

* **sDF <-> DF**
```
DF -> sDF:
    
    DF amount * 1e18 / exchangeRate
    
sDF -> DF:
    
    sDF amount * exchangeRate / 1e18
    
exchangeRate:
    
    call.sDF.getCurrentExchangeRate()
```



## **Interface Document**

_**notice: In the absence of special instructions, the data is scaled by 1e18.**_

<hr>

### **veDFManager**


**Introduction**

Welcome to Contract veDFManager's Interface Documentation!

We provide some interfaces to query infomation about dForce veDF, you can get information about.

### **User Action**

<hr>

#### **createInOne (dfCreate)**

*When the user does not have any lock information, you can call this function*
 * Check whether the sender's DF allowance needs to approve.

> DF.allowance(sender, veDFManager) > deposit amount
> true: Not approve
> false: approve

**`Parameters`**

| type    | description       | detail                            |
| ------- | ----------------- |:--------------------------------- |
| uint256 | DF deposit amount | decimal(scaled by DF's decimals)  |
| uint256 | Due time          | Greenwich timestamp               |




#### **create**

*When the user does not have any lock information, you can call this function*
 * Check whether the sender's sDF allowance needs to approve.

> sDF.allowance(sender, veDFManager) > deposit amount
> true: Not approve
> false: approve

**`Parameters`**

| type    | description        | detail                            |
| ------- | ------------------ | --------------------------------- |
| uint256 | sDF deposit amount | decimal(scaled by sDF's decimals) |
| uint256 | Due time           | Greenwich timestamp               |

<hr>


#### **refillInOne**

*The user has locked position information and it has not expired yet. If yo.u need an additional amount, you can call this function*
 * Check whether the sender's DF allowance needs to approve.

> DF.allowance(sender, veDFManager) > deposit amount
> true: Not approve
> false: approve

**`Parameters`**

| type    | description        | detail                            |
| ------- | ------------------ | --------------------------------- |
| uint256 | DF deposit amount  | decimal(scaled by DF's decimals)  |


#### **refill**

*The user has locked position information and it has not expired yet. If yo.u need an additional amount, you can call this function*
 * Check whether the sender's sDF allowance needs to approve.

> sDF.allowance(sender, veDFManager) > deposit amount
> true: Not approve
> false: approve

**`Parameters`**

| type    | description        | detail                            |
| ------- | ------------------ | --------------------------------- |
| uint256 | sDF deposit amount | decimal(scaled by sDF's decimals) |

<hr>


#### **extend**

*The user has locked the position information and has not expired. If you need to extend the deadline, you can call this function*

**`Parameters`**

| type    | description | detail              |
| ------- | ----------- | ------------------- |
| uint256 | Due time    | Greenwich timestamp |

<hr>

#### **refreshInOne**

*This function can be called when the user needs to lock the position again after the lock position expires*
 * When the input amount is greater than the lock-up amount, Check whether the sender's sDF allowance needs to approve.

> DF.allowance(sender, veDFManager) > deposit amount - user lock-up amount
> true: Not approve
> false: approve

> input amount > lock amount 
> veDF.allowance(sender, veDFManager) > amount
> true: Not approve
> false: approve

**`Parameters`**

| type    | description         | detail                           |
| ------- | ------------------- | -------------------------------- |
| uint256 | DF increment amount | decimal(scaled by DF's decimals) |
| uint256 | Due time            | Greenwich timestamp              |


#### **refresh**

*This function can be called when the user needs to lock the position again after the lock position expires*
 * When the input amount is greater than the lock-up amount, Check whether the sender's sDF allowance needs to approve.

> sDF.allowance(sender, veDFManager) > deposit amount - user lock-up amount
> true: Not approve
> false: approve

> input amount > lock amount 
> veDF.allowance(sender, veDFManager) > amount
> true: Not approve
> false: approve

**`Parameters`**

| type    | description        | detail                            |
| ------- | ------------------ | --------------------------------- |
| uint256 | sDF deposit amount | decimal(scaled by sDF's decimals) |
| uint256 | Due time           | Greenwich timestamp               |

<hr>


<!-- ## withdraw

*After the lock-up period expires, the user can call this function to take out sDF*
 * Check whether the sender's veDF allowance needs to approve.

> veDF.allowance(sender, veDFManager) > sender veDF balance
> true: Not approve
> false: approve

**`Parameters`**

| type | description | detail |
| ---- | ----------- | ------ |
| none | none        |        | -->

<hr>

#### **getRewardInOne**

*User acquisition reward function, and reward converted to DF*

* reward: DF

**`Parameters`**


| type | description | detail |
| ---- | ----------- | ------ |
| none | none        |        |


#### **getReward**

*User acquisition reward function*

 * reward: DF

**`Parameters`**


| type | description | detail |
| ---- | ----------- | ------ |
| none | none        |        |

<hr>


#### **exitInOne**

*User withdraw and getReward function*

 * When the input amount is greater than the lock-up amount, Check whether the sender's veDF allowance needs to approve.

> input amount > lock amount 
> veDF.allowance(sender, veDFManager) > amount
> true: Not approve
> false: approve

 * withdraw: DF
 * reward: DF


**`Parameters`**

| type | description | detail |
| ---- | ----------- | ------ |
| none | none        |        |


#### **exit2**

*User withdraw and getReward function*

 * When the input amount is greater than the lock-up amount, Check whether the sender's veDF allowance needs to approve.

> input amount > lock amount 
> veDF.allowance(sender, veDFManager) > amount
> true: Not approve
> false: approve

 * withdraw: DF
 * reward: sDF

**`Parameters`**

| type | description | detail |
| ---- | ----------- | ------ |
| none | none        |        |


#### **exit**

*User withdraw and getReward function*

 * When the input amount is greater than the lock-up amount, Check whether the sender's sDF allowance needs to approve.

> input amount > lock amount 
> veDF.allowance(sender, veDFManager) > amount
> true: Not approve
> false: approve

 * withdraw: sDF
 * reward: sDF

**`Parameters`**

| type | description | detail |
| ---- | ----------- | ------ |
| none | none        |        |

<hr>



### **Global Data**

#### **getLockersInfo (getLockInfo)**

**`Parameters`**

| type | description |
| ---- | ----------- |
| none | none        |

**`Return value`**

| type    | description              | detail                                        |
| ------- | ------------------------ | --------------------------------------------- |
| uint256 | veDF total supply         | decimal(scaled by veDF decimals)               |
| uint256 | Total sDF locked amount  | decimal(scaled by sDF decimals)               |
| uint256 | Total settled            | decimal(scaled by veDF decimals)               |
| uint256 | Reward distribution rate | decimal(scaled by rewardToken(DF)’s decimals) |

#### **startTime**

**`Parameters`**

| type | description |
| ---- | ----------- |
| none | none        |

**`Return value`**

| type    | description | detail                                                                                                              |
| ------- | ----------- | ------------------------------------------------------------------------------------------------------------------- |
| uint256 | Start time  | Greenwich timestamp(Through the start time, you can determine whether the deadline is in compliance with the rules) |

####  **rewardRate**

**`Parameters`**

| type | description |
| ---- | ----------- |
| none | none        |

**`Return value`**

| type    | description              | detail                                        |
| ------- | ------------------------ | --------------------------------------------- |
| uint256 | Reward distribution rate | decimal(scaled by rewardToken(DF)’s decimals) |



### **User Data**

####  **getLocker**

**`Parameters`**

| type    | description           |
| ------- | --------------------- |
| address | User Ethereum address |

**`Return value`**

| type   | description         | detail                            |
| ------ | ------------------- | --------------------------------- |
| uint32 | User lock deadline  | Greenwich timestamp               |
| uint32 | User lock duration  | In seconds                        |
| uint96 | User lock-up amount | decimal(scaled by sDF's decimals) |


####  **getLockerInfo**

**`Parameters`**

| type    | description           |
| ------- | --------------------- |
| address | User Ethereum address |

**`Return value`**

| type    | description          | detail                                   |
| ------- | -------------------- | ---------------------------------------- |
| uint32  | User lock start time | Greenwich timestamp                      |
| uint32  | User lock deadline   | Greenwich timestamp                      |
| uint32  | User lock duration   | In seconds                               |
| uint96  | User lock-up amount  | decimal(scaled by sDF's decimals)        |
| uint256 | User veDF amount      | decimal(scaled by veDF's decimals)        |
| uint256 | User staked veDF      | decimal(scaled by veDF's decimals)        |
| uint256 | User reward amount   | decimal(scaled by DF's decimals)         |
| uint256 | User locked status   | 0: no lockup; 1: locked; 2: Lock expired |


####  **calcBalanceReceived (getExpectedAmount)**

**`Parameters`**

| type    | description           | detail                            |
| ------- | --------------------- | --------------------------------- |
| address | User Ethereum address |                                   |
| uint256 | sDF deposit amount    | decimal(scaled by sDF's decimals) |
| uint256 | Lock-up duration      | In seconds                        |

**`Return value`**


| type    | description | detail                            |
| ------- | ----------- | --------------------------------- |
| uint256 | veDF amount  | decimal(scaled by veDF's decimals) |

####  **estimateLockerAPY (getAnnualInterestRate)**

**`Parameters`**

| type    | description           | detail                            |
| ------- | --------------------- | --------------------------------- |
| address | User Ethereum address |                                   |
<!-- | uint256 | sDF deposit amount    | decimal(scaled by sDF's decimals) |
| uint256 | Lock-up duration      | In seconds                        | -->

**`Return value`**


| type    | description     | detail        |
| ------- | --------------- |:------------- |
| uint256 | annual interest | decimal(1e18) |


## **StakedDF**

**Introduction**


Welcome to Contract StakedDF's Interface Documentation!

We provide some interfaces to query infomation about dForce veDF, you can get information about.

### **Global Data**


####  **getAnnualInterestRate**

**`Parameters`**

| type | description |
| ---- | ----------- |
| none | none        |

**`Return value`**


| type    | description     | detail        |
| ------- | --------------- |:------------- |
| uint256 | annual interest | decimal(1e18) |


####  **getCurrentExchangeRate**

**`Parameters`**

| type | description |
| ---- | ----------- |
| none | none        |

**`Return value`**


| type    | description            | detail        |
| ------- | ---------------------- |:------------- |
| uint256 | sDF exchange DF amount | decimal(1e18) |


|Assets|Current LTV|Recommended LTV|
|---|---|---|
|USDC|80%|85%|