How to Create a Yield Farming Contract

Posted By : Jagveer

Jul 01, 2024

Yield farming, also known as liquidity mining, is a popular method in decentralized finance (DeFi) where users can earn rewards by staking their cryptocurrency assets in a liquidity pool. This article will explain the concept of yield farming and provide an example of a simple yield farming smart contract. If you are looking to develop your DeFi project, explore our DeFi development services

 

How Yield Farming Works

 

In yield farming, users deposit their crypto assets into a DeFi protocol's smart contract, known as a liquidity pool. These assets are then utilized by the protocol for various operations such as lending, borrowing, or trading. In exchange, the protocol rewards users with interest or additional cryptocurrency tokens.

 

You may also like | Yield Farming | Fuelling the Decentralized Finance (DeFI) Space

 

Components of a Yield Farming Contract

 

A basic yield farming contract typically includes:

 

Liquidity Pool: Where users deposit their assets.

Reward Distribution: Reward concept to distribute rewards to users.

Staking Mechanism: Method used to stake allowed tokens.

Unstaking Mechanism: Allows users to withdraw their staked tokens and any earned rewards.

 

Also, Check | LSDFi  | Exploring Why It Is the Hottest DeFi

 

Sample Yield Farming Contract


 Below is a simple example of a yield farming contract written in Solidity, a widely used programming language for creating Ethereum smart contracts.

 

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;

interface IERC20 {
    function transferFrom(address senderAddress, address recipientAddress, uint256 value) external returns (bool);
    function transfer(address recipientAddress, uint256 value) external returns (bool);
}

contract YieldFarm {
    IERC20 public stakingToken;
    IERC20 public rewardToken;

    mapping(address => uint256) public stakedBalance;
    mapping(address => uint256) public rewards;
    uint256 public totalStaked;
    uint256 public rewardRate;

    event Staked(address indexed user, uint256 amount);
    event Unstaked(address indexed user, uint256 amount);
    event RewardClaimed(address indexed user, uint256 amount);

    constructor(IERC20 _stakingTokenAddress, IERC20 _rewardTokenAddress, uint256 _rewardRateValue) {
        stakingToken = _stakingTokenAddress;
        rewardToken = _rewardTokenAddress;
        rewardRate = _rewardRateValue;
    }

    function stake(uint256 amount) external {
        require(amount > 0, 'Amount can not be zero');
        stakingToken.transferFrom(msg.sender, address(this), amount);
        stakedBalance[msg.sender] += amount;
        totalStaked += amount;
        emit Staked(msg.sender, amount);
    }

    function unstake(uint256 amount) external {
        require(stakedBalance[msg.sender] >= amount, 'Insufficient staked balance');
        stakingToken.transfer(msg.sender, amount);
        stakedBalance[msg.sender] -= amount;
        totalStaked -= amount;
        emit Unstaked(msg.sender, amount);
    }

    function claimRewards() external {
        uint256 reward = calculateRewardTokens(msg.sender);
        rewards[msg.sender] = 0;
        rewardToken.transfer(msg.sender, reward);
        emit RewardClaimed(msg.sender, reward);
    }

    function calculateRewardTokens(address userAddress) public view returns (uint256) {
        return stakedBalance[user] * rewardRate;
    }
}

 

Also, Explore | Crypto Staking Platform Development: A Step-by-Step Guide 

 

Testing the Contract 

 

To test this contract, set up a development environment using tools like Hardhat. Here's a basic test script:

 

const { expect } = require('chai');

describe('YieldFarm', function () {
  let stakingToken, rewardToken, yieldFarm;
  let ownerAddress, user1, user2;

  beforeEach(async function () {
    [ownerAddress, user1, user2, _] = await ethers.getSigners();

    const Token = await ethers.getContractFactory('Token');
    stakingToken = await Token.deploy('Staking Token', 'STK', 1000000);
    rewardToken = await Token.deploy('Reward Token', 'RWD', 1000000);

    const YieldFarm = await ethers.getContractFactory('YieldFarm');
    yieldFarm = await YieldFarm.deploy(stakingToken.address, rewardToken.address, 1);

    await stakingToken.transfer(user1.address, 1000);
    await stakingToken.transfer(user2.address, 1000);
    await rewardToken.transfer(yieldFarm.address, 1000);
  });

  it('Stake and earn', async function () {
    await stakingToken.connect(user1).approve(yieldFarm.address, 100);
    await yieldFarm.connect(user1).stake(100);
    expect(await stakingToken.balanceOf(user1.address)).to.equal(900);
    expect(await stakingToken.balanceOf(yieldFarm.address)).to.equal(100);

    await yieldFarm.connect(user1).claimRewards();
    expect(await rewardToken.balanceOf(user1.address)).to.equal(100);
  });

  it('Should allow users to unstake tokens', async function () {
    await stakingToken.connect(user1).approve(yieldFarm.address, 100);
    await yieldFarm.connect(user1).stake(100);

    await yieldFarm.connect(user1).unstake(100);
    expect(await stakingToken.balanceOf(user1.address)).to.equal(1000);
  });
});

 

Also, Discover | DeFi Trends for 2024 and Beyond | Insights and Projections

 

Conclusion


Yield farming is a fundamental aspect of DeFi, enabling users to earn rewards by providing liquidity to protocols. The provided contract is a simplified example to illustrate the core concepts. In real-world applications, additional security measures and optimizations are essential. If you are looking for more information about smart contracts for DeFi development, connect with our skilled blockchain developers

Leave a

Comment

Name is required

Invalid Name

Comment is required

Recaptcha is required.

blog-detail

September 7, 2024 at 05:26 pm

Your comment is awaiting moderation.

By using this site, you allow our use of cookies. For more information on the cookies we use and how to delete or block them, please read our cookie notice.

Chat with Us
Telegram Button
Youtube Button
Contact Us

Oodles | Blockchain Development Company

Name is required

Please enter a valid Name

Please enter a valid Phone Number

Please remove URL from text