通过本课学习,你将掌握:
DeFi(去中心化金融)是区块链最活跃的应用场景,核心合约一般分为:
在本课,我们会实战实现前三个基础模块。
用户把 代币 A 存入合约,获得奖励(一般是代币 B)。
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.20;
import "@openzeppelin/contracts/token/ERC20/IERC20.sol";
contract Staking {
IERC20 public stakingToken;
IERC20 public rewardToken;
uint256 public rewardRate = 100; // 每秒奖励数量
mapping(address => uint256) public staked;
mapping(address => uint256) public lastUpdate;
mapping(address => uint256) public rewards;
constructor(address _stakingToken, address _rewardToken) {
stakingToken = IERC20(_stakingToken);
rewardToken = IERC20(_rewardToken);
}
function stake(uint256 amount) external {
_updateReward(msg.sender);
stakingToken.transferFrom(msg.sender, address(this), amount);
staked[msg.sender] += amount;
}
function withdraw(uint256 amount) external {
_updateReward(msg.sender);
staked[msg.sender] -= amount;
stakingToken.transfer(msg.sender, amount);
}
function claimReward() external {
_updateReward(msg.sender);
uint256 reward = rewards[msg.sender];
rewards[msg.sender] = 0;
rewardToken.transfer(msg.sender, reward);
}
function _updateReward(address account) internal {
if (account != address(0)) {
uint256 timeDiff = block.timestamp - lastUpdate[account];
rewards[account] += staked[account] * rewardRate * timeDiff / 1e18;
lastUpdate[account] = block.timestamp;
}
}
}
👉 这里的 rewardRate
简化处理了,实际项目会结合总奖励池、质押总量动态计算。
Uniswap V2 的核心公式是:
$$
x \times y = k
$$
k
不变// SPDX-License-Identifier: MIT
pragma solidity ^0.8.20;
import "@openzeppelin/contracts/token/ERC20/IERC20.sol";
contract SimpleAMM {
IERC20 public tokenA;
IERC20 public tokenB;
uint256 public reserveA;
uint256 public reserveB;
constructor(address _tokenA, address _tokenB) {
tokenA = IERC20(_tokenA);
tokenB = IERC20(_tokenB);
}
function addLiquidity(uint256 amountA, uint256 amountB) external {
tokenA.transferFrom(msg.sender, address(this), amountA);
tokenB.transferFrom(msg.sender, address(this), amountB);
reserveA += amountA;
reserveB += amountB;
}
function swapAforB(uint256 amountIn) external returns (uint256 amountOut) {
tokenA.transferFrom(msg.sender, address(this), amountIn);
uint256 newReserveA = reserveA + amountIn;
// x*y=k => amountOut = reserveB - (k / newReserveA)
uint256 k = reserveA * reserveB;
amountOut = reserveB - (k / newReserveA);
reserveA = newReserveA;
reserveB -= amountOut;
tokenB.transfer(msg.sender, amountOut);
}
}
👉 这是 最小可运行版本,省略了手续费、LP Token 等。你可以扩展它来模拟 Uniswap 的完整逻辑。
// Pseudo code
deposit(collateral)
borrow(asset)
repay(asset)
liquidate(user) // 当抵押价值 < 借出价值 * 安全因子
完整实现涉及 价格预言机、清算机制、抵押率参数,后面课程会专门深入。
简化版的实现可以参照前文。
这三个模块是 DeFi 世界的基石,之后的 DEX、借贷协议、流动性挖矿、稳定币,都是在这些基本模式上扩展出来的。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。