和区块链Say Hi(6)--- 通过Remix发布以太坊Solidity智能合约 ...

打印 上一主题 下一主题

主题 1821|帖子 1821|积分 5463

我们来学习一下怎样通过Remix发布一个简单的ERC20智能合约。以下操纵都是基于ETH Sepolia测试网来举行的。
1.打开Remix工具

https://remix.ethereum.org/


2.贴上智能合约代码

这里的智能合约只是简单地mint一个ERC20的数字货币
  1. //SPDX-License-Identifier: UNLICENSED
  2. pragma solidity >=0.4.22<0.9.0;
  3. import "@openzeppelin/contracts/token/ERC20/ERC20.sol";
  4. contract JokerCoin is ERC20 {
  5. constructor() ERC20("JokerCoin", "JOKER") {
  6. _mint(msg.sender, 100000000000000000000000000);
  7. }
  8. }
复制代码
3.编译智能合约


4.连接钱包

这里选择的是MetaMask小狐狸钱包,关联钱包地点

5.水龙头网站领取测试代币

上面可以看到当前钱包地点是余额是0,发布智能合约需要手续费gas,以是我们通过水龙头网站领取一下测试代币。
https://www.alchemy.com/faucets/ethereum-sepolia

领取后:

6.发布智能合约


7.相关信息确认

交易信息:
https://sepolia.etherscan.io/tx/0x03d3475779a042d29465c0be0768cbef7d818575b34e786c9560dff51c7f553d

查看对应钱包地点:

智能合约:
https://sepolia.etherscan.io/token/0xde8d49a648e425a7e1de70e7030bc566581d9e49?a=0x55c37ba076187fdf42863951e5252c8e15f0a47e

8.简单的智能合约案例

案例一:
  1. // SPDX-License-Identifier: MIT
  2. pragma solidity >=0.6.12 <0.9.0;
  3. contract BlackHole {
  4.     string public constant name = "BlackHole"; // 数字货币名称
  5.     string public constant symbol = "BH"; // 数字货币符号
  6.     uint8 public constant decimals = 18; // 小数位数,与以太币相同
  7.     uint256 public totalSupply = 100000000 * (10 ** uint256(decimals)); // 初始总供应量,100000000 个 BlackHole
  8.     mapping(address => uint256) public balanceOf; // 用户余额映射
  9.     address public blackHoleAccount; // 黑洞账户地址
  10.     // 事件,用于记录转账操作
  11.     event Transfer(address indexed _from, address indexed _to, uint256 _value);
  12.     // 构造函数,在部署合约时初始化黑洞账户
  13.     constructor() {
  14.         blackHoleAccount = 0x8Ae4BA8e6cB6b9F9A155Cafb5FAd558A4D253cf2;
  15.         balanceOf[msg.sender] = totalSupply;
  16.     }
  17.     // 转账函数,每次交易都会将交易金额的1%转移到黑洞账户
  18.     function transfer(address _to, uint256 _value) public returns (bool success) {
  19.         require(_to != address(0)); // 检查目标地址是否合法
  20.         require(balanceOf[msg.sender] >= _value); // 检查发送者余额是否足够
  21.         require(balanceOf[_to] + _value >= balanceOf[_to]); // 检查溢出
  22.         uint256 amountToBlackHole = _value / 100; // 交易金额的1%
  23.         uint256 amountToRecipient = _value - amountToBlackHole; // 交易金额减去转移到黑洞账户的部分
  24.         balanceOf[msg.sender] -= _value; // 扣除发送者余额
  25.         balanceOf[_to] += amountToRecipient; // 增加接收者余额
  26.         balanceOf[blackHoleAccount] += amountToBlackHole; // 增加黑洞账户余额
  27.         emit Transfer(msg.sender, _to, amountToRecipient); // 记录转账到接收者的交易
  28.         emit Transfer(msg.sender, blackHoleAccount, amountToBlackHole); // 记录转移到黑洞账户的交易
  29.         return true;
  30.     }
  31. }
复制代码
案例二:
  1. // SPDX-License-Identifier: MIT
  2. pragma solidity ^0.8.0;
  3. // 导入 OpenZeppelin 中的 ERC20 合约,用于创建代币
  4. import "@openzeppelin/contracts/token/ERC20/ERC20.sol";
  5. // 导入 OpenZeppelin 中的 Ownable 合约,用于实现权限控制
  6. import "@openzeppelin/contracts/access/Ownable.sol";
  7. // 导入 OpenZeppelin 中的 SafeMath 库,用于安全的数学运算
  8. import "@openzeppelin/contracts/utils/math/SafeMath.sol";
  9. // 定义 DeFiToken 合约,继承 ERC20 合约和 Ownable 合约
  10. contract DeFiToken is ERC20, Ownable {
  11.     using SafeMath for uint256; // 使用 SafeMath 库来进行安全的数学运算
  12.     uint256 public constant TOTAL_SUPPLY = 100000000 * (10 ** 18); // 初始总供应量为 100000000 枚
  13.     uint256 public ANNUAL_INTEREST_RATE; // 年利率
  14.     uint256 public DAILY_INTEREST_RATE; // 日利率
  15.     // 定义映射,用于存储用户的存款金额和存款时间戳
  16.     mapping(address => uint256) public depositedAmount;
  17.     mapping(address => uint256) public depositTimestamp;
  18.     // 定义事件,用于记录存款和提款操作
  19.     event Deposit(address indexed user, uint256 amount); // 存款事件
  20.     event Withdrawal(address indexed user, uint256 amount); // 提款事件
  21.     // 合约构造函数,初始化 DeFiToken 合约,分发总供应量给合约创建者,并设置初始利率
  22.     constructor(address initialOwner) ERC20("DeFi Token", "DEFI") Ownable(initialOwner) {
  23.         _mint(msg.sender, TOTAL_SUPPLY); // 在构造函数中调用 _mint 函数,向合约创建者分发总供应量的代币
  24.         // 初始化利率为 30% 的年利率和 1% 的日利率
  25.         ANNUAL_INTEREST_RATE = 30;
  26.         DAILY_INTEREST_RATE = 1;
  27.     }
  28.     // 存款函数,允许用户将代币存入合约
  29.     function deposit(uint256 _amount) external {
  30.         require(_amount > 0, "Amount must be greater than 0"); // 断言:检查存款金额是否大于 0
  31.         require(balanceOf(msg.sender) >= _amount, "Insufficient balance"); // 断言:检查用户余额是否足够
  32.         
  33.         // 调用 ERC20 合约的 transferFrom 方法,将代币转移到合约地址
  34.         transferFrom(msg.sender, address(this), _amount);
  35.         // 更新存款记录
  36.         depositedAmount[msg.sender] = depositedAmount[msg.sender].add(_amount);
  37.         depositTimestamp[msg.sender] = block.timestamp; // 存储当前区块的时间戳作为存款时间
  38.         // 触发 Deposit 事件,记录存款操作
  39.         emit Deposit(msg.sender, _amount);
  40.     }
  41.     // 提款函数,允许用户从合约提取存款及利息
  42.     function withdraw(uint256 _amount) external {
  43.         require(_amount > 0, "Amount must be greater than 0"); // 断言:检查提款金额是否大于 0
  44.         require(depositedAmount[msg.sender] >= _amount, "Insufficient deposited amount"); // 断言:检查用户存款是否足够
  45.         // 计算应得利息并计算总提款金额
  46.         uint256 interest = calculateInterest(msg.sender);
  47.         uint256 totalWithdrawAmount = _amount.add(interest);
  48.         // 调用 ERC20 合约的 transfer 方法,将代币转移给用户
  49.         transfer(msg.sender, totalWithdrawAmount);
  50.         // 更新存款记录
  51.         depositedAmount[msg.sender] = depositedAmount[msg.sender].sub(_amount);
  52.         depositTimestamp[msg.sender] = block.timestamp;
  53.         // 触发 Withdrawal 事件,记录提款操作
  54.         emit Withdrawal(msg.sender, totalWithdrawAmount);
  55.     }
  56.     // 查询用户余额函数
  57.     function getBalance(address _user) external view returns (uint256) {
  58.         return balanceOf(_user); // 返回用户的代币余额
  59.     }
  60.     // 计算利息函数
  61.     function calculateInterest(address _user) internal view returns (uint256) {
  62.         // 计算存款时间
  63.         uint256 depositedTime = block.timestamp.sub(depositTimestamp[_user]);
  64.         uint256 daysElapsed = depositedTime.div(1 days); // 将时间差转换为天数
  65.         // 计算利息并返回
  66.         return depositedAmount[_user].mul(ANNUAL_INTEREST_RATE).mul(daysElapsed).div(36500); // 年利率转换为每天的利率
  67.     }
  68.     // 设置利率函数,只有合约所有者可以调用
  69.     function setInterestRate(uint256 _annualInterestRate, uint256 _dailyInterestRate) external onlyOwner {
  70.         require(_annualInterestRate > 0 && _dailyInterestRate > 0, "Interest rate must be greater than 0");
  71.         // 更新年利率和日利率
  72.         ANNUAL_INTEREST_RATE = _annualInterestRate;
  73.         DAILY_INTEREST_RATE = _dailyInterestRate;
  74.     }
  75.     // 接收以太币函数,防止用户直接向合约地址发送代币
  76.     receive() external payable {
  77.         revert("Direct deposits are not allowed");
  78.     }
  79.     // 提供转移误转入合约的以太币给合约所有者的方法
  80.     function withdrawEther(uint256 _amount) external onlyOwner {
  81.         payable(owner()).transfer(_amount);
  82.     }
  83. }
复制代码
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

正序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

河曲智叟

论坛元老
这个人很懒什么都没写!
快速回复 返回顶部 返回列表