type
status
date
slug
summary
tags
category
icon
password
前言:
这篇文章主要是为了与各位分享Farming的具体用途,并且通过代码实现如何完成该板块的前端及合约项目。
🤔什么是Farming (流动性挖矿)
用户通过向去中心化交易所(如Uniswap, PancakeSwap)的流动性资金池提供资金(例如 ETH/USDT 对),从而获得项目代币作为奖励的过程。这是激励用户为项目提供流动性的核心机制。
🔑Farming的作用
1. 对项目方而言(核心目的):
- 创造初始流动性(Bootstrapping Liquidity):这是最根本的作用。一个新代币没有足够的流动性,交易滑点会极高,几乎无法买卖。Farming通过奖励激励用户将资金注入资金池,是解决“冷启动”问题的最有效手段。
- 代币分发与价值捕获:以一种“有价值”(提供流动性)的方式将代币分发给用户,而不是免费空投。用户为获得奖励,会购买并质押代币,从而创造了真实的需求和买压。
- 提升用户粘性与构建社区:将用户(尤其是流动性提供者LP)的利益与项目的发展深度绑定。用户质押资产后,会更关心项目的长期发展。
- 维持价格稳定:更深的流动性意味着更大的交易量才能对价格产生显著影响,这有助于减缓币价的剧烈波动。
2. 对用户而言:
- 提高资金收益(Yield Farming):用户除了获得交易手续费收益(来自DEX),还能获得额外的项目代币奖励,从而大幅提高资产的整体年化收益率(APR/APY)。
- 参与项目早期发展:用户通过提供流动性支持项目,并有机会在早期积累项目代币。
3. 对生态系统而言:
- 促进资金效率:激励闲置资产被投入使用,提高整个DeFi市场的资本效率。
- 驱动“收益农耕”(Yield Farming)策略:用户在不同协议间转移资产以追求最高收益,形成了复杂的DeFi策略生态。
🎆 目标页面
奖励激励用户将资金注入资金池,精确计算每个用户应得的奖励。


👜 环境安装
NodeJs:https://nodejs.org/zh-cn
Yarn: npm install yarn -g
Chrome 应用商店中安装MetaMask
📝 智能合约
安装相关依赖
相关依赖的安装教程请移步至【从零构建LaunchPad平台[一](Airdrop)】
智能合约的编写
AshCoin合约的详细编写方案请移步 【从零构建ERC20 MINT DEMO】 必看(教你如何铸造专属于你的代币)
在contracts文件夹下创建一个名为Farming.sol的文件


核心函数拆解
质押函数 stake()
这是用户存入资产的核心入口。
- 作用:确保用户在追加质押金额前,能够先获得从上一次操作到当前时刻所累积的所有奖励。
- 机制:
user.stakedAmount > 0:检查用户是否已经是现有质押者。- 如果用户已有质押,则通过
pendingReward(msg.sender)计算出自上次操作(质押、解押或领取)以来所累积的应得奖励数额。 - 如果计算出的待领取奖励
pending大于0,则调用内部函数_claimReward将这些奖励发放给用户。
- 重要性:这是实现自动复利和奖励结算的关键步骤。它防止了用户因追加质押而损失掉此前已累积但未领取的奖励,确保了奖励分配的公平性和准确性。
解押函数 (unstake) 中的奖励结算检查
- 作用:确保用户在取回质押本金时,能够同时领取所有已累积的奖励。
- 机制:
- 在进行解押操作前,首先计算用户当前的所有待领取奖励
pending。 - 只要有待领取的奖励,就优先调用
_claimReward函数将奖励发放给用户。
- 重要性:提供了便利性和安全性。用户无需在解押前手动执行一次领取操作,简化了流程。同时,这保证了用户在任何时候解除质押关系时,都能获得其应得的全部回报,避免因忘记领取而造成损失。
内部奖励发放函数 (_claimReward) 中的余额检查
- 作用:在执行奖励发放前,检查合约中奖励代币的余额是否足够支付给用户。
- 限制条件(资金充足性):
rewardToken.balanceOf(address(this))获取当前合约地址持有的奖励代币数量。- 如果合约余额小于待发放的奖励数量 (
_amount),函数会回滚交易并抛出错误InsufficientRewardBalance。 - 这是最核心的安全限制,它防止了合约超发奖励代币,确保了合约的偿付能力。如果项目方没有向合约中转入足够的奖励代币,所有的领取操作都会失败。
- 重要性:这是保障合约财务健全和安全运行的基石。它确保了每一笔发放的奖励都有真实的资产作为支撑,维护了系统的可信度。
待领取奖励计算函数 (pendingReward) 中的零值检查
- 作用:对于未质押任何代币的用户,直接返回其待领取奖励为0。
- 限制条件(质押前提):
stakedAmount表示用户的质押数量。- 如果该值为0,说明用户并未参与质押,因此不具备产生收益的基础,其待领取奖励自然为0。
- 这是一个优化判断,避免了为零质押用户进行不必要的计算,节省了Gas。
- 重要性:明确了质押是获得奖励的前提这一核心规则,提高了代码执行效率。
智能合约的编译、本地链启动与部署
在完成了相关的合约编写后,需要按照顺序对合约进行编译、部署
🤭关于测试单元的编写,建议结合AI工具生成相关的代码进行编译测试,偷一个懒惰。
📝 前端板块
开发框架与依赖
环境配置
在根目录下创建了.env.local文件用于统一管理合约地址,便于修改。
核心代码解析
farming/page.tsx
📎 项目链接
- Author:Ashland
- URL:http://preview.tangly1024.com/article/25ecccc0-3782-80a7-9a46-c2879188fa48
- Copyright:All articles in this blog, except for special statements, adopt BY-NC-SA agreement. Please indicate the source!










