Berachain Docs 中文版
by DocsZH
  • 入门学习
    • 介绍 Berachain
      • 什么是 Berachain
      • 什么是流动性证明
      • 什么是 BeaconKit
      • 连接到 Berachain
      • 如何获得 $BERA
    • Berachain 测试网
      • Berachain 测试网 V1 与 V2
    • PoL 流动性证明
      • 流动性证明概述
      • 流动性证明参与者
      • 奖励金库
      • 激励系统
      • 原生代币系统
        • $BERA
        • $BGT
        • $HONEY
    • 治理模型
      • 治理模型概述
      • 奖励金库白名单
    • 指南
      • 流动性证明常见问题
    • 原生 dApps
      • 测试网水龙头
      • 区块浏览器
      • BEX
      • Bend
      • Berps
      • BGT Station
      • Honey Swap
    • 帮助中心
      • 常见问题
      • 名词解释
  • 开发者文档
    • 面向开发者的 Berachain
      • 流动性证明架构
      • 网络配置
      • 已部署合约
      • 开发者工具
      • 测试网水龙头
      • 测试网区块浏览器
    • 开发者快速入门
      • 智能合约部署
      • 前端部署
    • 开发者指南
      • 使用 Hardhat 部署 HelloWorld 合约
      • 使用 Foundry 部署 ERC20 合约
      • 使用 NextJS & WalletConnect 部署合约
      • 开发者外部资源
      • 非 ERC20 代币流动性证明集成
    • 已部署合约参考
  • 节点运行文档
    • Berachain 节点
      • 节点架构概述
      • BeaconKit 共识层
      • EVM 执行层
      • 节点运行快速入门
      • BeaconKit GitHub 存储库
    • 节点指南
      • 使用 Kurtosis 运行本地开发网
      • 从快照同步节点
由 GitBook 提供支持
在本页
  • 先决条件​
  • 初始化Repository​
  • 安装依赖项​
  • 创建代币合约​
  • 设置转账销毁机制
  • 部署代币合约​到Berachain
  • 验证代币合约​
  • 后续步骤​
  1. 开发者文档
  2. 开发者快速入门

智能合约部署

上一页开发者快速入门下一页前端部署

最后更新于7个月前

为Berachain网络代币部署提供了通用接口。ERC-20遵循标准接口,因此其他应用程序可以轻松地在链上与它们交互,并且可以扩展更多功能。该标准为用户提供从简单代币转移到复杂DeFi交互的全方位支持。

本节中,我们将介绍如何使用Solidity创建ERC-20代币,并将其部署到Berachain测试网。

先决条件

在开始之前,请确保您已准备好以下内容:

  • Foundry工具包

  • 你选择的文本编辑器

初始化Repository

首先,我们将使用Forge的init命令创建一个新项目:

forge init my_token;

这将创建一个名为my_token的新目录,其中包含基本的Forge项目结构和示例合约。如果使用VS Code作为文本编辑器,您可以添加--vscode flag,以初始化一些额外的默认设置。

forge init my_token --vscode;

现在您可以cd进入该目录,以便稍后运行代码:

cd my_token;

使用Foundry Forge格式化编写合约和测试合约,你可以随意删除下方生成的文件,因为本节不需要。

  • src/Counter.sol

  • test/Counter.t.sol

  • script/Counter.s.sol

# FROM: ./my_token

rm src/Counter.sol test/Counter.t.sol script/Counter.s.sol;

OpenZeppelin提供了各种ERC代币标准(包括ERC-20)的常用接口和示例,这些代币经过审计和测试,因此可以使用他们的ERC-20标准接口来创建代币。这可以让我们更轻松地快速上手,而无需从头开始。

Foundry

如使用Foundry,请使用下方代码安装OpenZeppelin库:

# FROM: ./my_token

forge install openzeppelin/openzeppelin-contracts --no-commit;

上方代码将拉取OpenZeppelin请求,以暂存.gitmodules文件,并提交一条消息"Installed openzeppelin-contracts"。

要使用该库,请在项目的根目录下编辑 remappings.txt文件。

文件位置:./remappings.txt,运行以下代码:

ds-test/=lib/forge-std/lib/ds-test/src/
forge-std/=lib/forge-std/src/
@openzeppelin/=lib/openzeppelin-contracts/ // [!code++]

以上为了指引Foundry在编译合约时能正确调用@openzeppelin。

现在你可以开始创建代币合约了,首先在src/文件夹中创建一个名为MyToken.sol的新文件。

# FROM: ./my_token

touch src/MyToken.sol;

然后,导入OpenZeppelin的ERC-20代币合约。

文件位置: ./src/MyToken.sol,运行以下代码:

// SPDX-License-Identifier: UNLICENSED
pragma solidity ^0.8.13;

import “@openzeppelin/contracts/token/ERC20/ERC20.sol”;

这将从OpenZeppelin中导入ERC20代币合约,其中包含ERC-20代币标准中所有函数的基本功能实现,可以以此作为代币合约的基础。

接下来,将创建可供实际使用的代币合约,该合约在导入的ERC-20合约基础上扩展。

  • 代币名称设置为“MyToken”

  • 代币符号设置为“MT”

  • 代币初始供应设置为1,000,000

文件位置:./src/MyToken.sol,运行以下代码:

// SPDX-License-Identifier: UNLICENSED
pragma solidity ^0.8.13;

import “@openzeppelin/contracts/token/ERC20/ERC20.sol”; 
import {ERC20} from “@openzeppelin/contracts/token/ERC20/ERC20.sol”; 

contract MyToken is ERC20 {
    uint256 public constant INITIAL_SUPPLY = 1_000_000 * 1 ether;

    constructor() ERC20(“MyToken”, “MT”){
        _mint(msg.sender, INITIAL_SUPPLY);
    }
}

从技术上讲,完成以上操作,你已经成功创建代币!如果满意,你可以部署此合约,它会将100万个$MT代币发送到你部署合约的钱包(msg.sender)。接下来你可以随意处理这些代币,例如在Berachain BEX中将$MT与另一种代币创建流动性,以便其他用户可以交换获得$MT。

然而,我们通常希望代币的用途更广,以便脱颖而出。接下来,让我们为$MT代币添加更多功能。

设置转账销毁机制

通过重写OpenZeppelin ERC20.sol中的默认_update函数,添加一些常量。

文件位置:ERC20.sol,运行以下代码:

// SPDX-License-Identifier: UNLICENSED
pragma solidity ^0.8.13;

import {ERC20} from "@openzeppelin/contracts/token/ERC20/ERC20.sol";

contract MyToken is ERC20 {
    uint256 public constant INITIAL_SUPPLY = 1_000_000 * 1 ether;
    uint256 public constant BURN_PERCENTAGE = 1; // 1%
    address public constant BURN_ADDRESS = 0xDeaDbeefdEAdbeefdEadbEEFdeadbeEFdEaDbeeF; 

    constructor() ERC20("MyToken", "MT"){
        _mint(msg.sender, INITIAL_SUPPLY);
    }

    function _update(address sender, address recipient, uint256 amount) internal override { 
        uint256 burnAmount = (amount * BURN_PERCENTAGE) / 100;
        super._update(sender, recipient, amount - burnAmount);
        super._update(sender, BURN_ADDRESS, burnAmount);
    }
}

我们通过在$MT代币合约中使用override 修饰符重写了父合约 _transfer函数。我们仍然可以使用super._transfer调用父合约的默认_transfer函数,以在计算完销毁金额后运行实际的代币转账逻辑。

上方合约部署可以解释为:每次转账时,合约会自动计算并销毁 1% 的代币,同时将剩余的 99% 转给接收者。

使用forge脚本将$MT代币合约部署到Berachain测试网。

# FROM: ./my_token

forge create --rpc-url https://bartio.rpc.berachain.com/ --private-key <YOUR_PRIVATE_KEY> src/MyToken.sol:MyToken --legacy;

# [Expected Output]:
# Deployer: 0x852Fc561Fd842ef1Af923ABfc64acC8A5624fe80
# Deployed to: 0x53E365fE5fDF332dD475E90bA8383B7F9853a49F
# Transaction hash: 0x59254ddcbb8dc1da89c7a1c7e300d8c6bd2f906b816b4497d046c717102d5725

验证Berachain测试网上的$MT代币合约是否成功部署。

forge verify-contract 0x53E365fE5fDF332dD475E90bA8383B7F9853a49F src/MyToken.sol:MyToken --verifier-url 'https://api.routescan.io/v2/network/testnet/evm/80084/etherscan/api/' --etherscan-api-key "verifyContract" --num-of-optimizations 200

# [Expected Output]:
# Start verifying contract `0x53E365fE5fDF332dD475E90bA8383B7F9853a49F` deployed on mainnet
#
# Submitting verification for [src/MyToken.sol:MyToken] 0x53E365fE5fDF332dD475E90bA8383B7F9853a49F.
# Submitted contract for verification:
# Response: `OK`
# GUID: `321091ec-e529-5a11-a75c-cf1ffc6987d7`
# URL: https://etherscan.io/address/0x53e365fe5fdf332dd475e90ba8383b7f9853a49f
#
# !NOTE: Should be https://bartio.beratrail.io//address/0x53e365fe5fdf332dd475e90ba8383b7f9853a49f

安装依赖项

OpenZeppelin ERC-20

创建代币合约

ERC-20代币标准的默认小数位数为18位,例如,1ETH只是以太坊代币的基本单位,还可以是0.00000001ETH。了解更多信息,请查看 上方合约部署可以解释为:创建了一个名为MyToken,代币符号为MT,代币初始供应量为100万,代币最小交易单位为小数点后18位的代币。

部署代币合约到Berachain

验证代币合约

后续步骤

现在,你已经掌握了如何使用Foundry将ERC20代币合约部署到Berachain测试网,请查看,学习部署其他合约或构建dApp。

ERC-20代币标准
​
​
​
​
​
OpenZeppelin Docs
​
​
​
开发者指南