![使用 Openzeppelin 和 Remix 發幣,可以擴充、投票、分潤、管理](https://rain.tips/wp-content/uploads/2022/05/image-1-1024x785-354136_1024x675.png)
使用 Openzeppelin 和 Remix 發幣,可以擴充、投票、分潤、管理
之前推薦過一鍵發幣,那是懶人作法,適合快速且只想要簡單發幣的人,給點錢就能快速地解決問題,但真實的社會是不是這麼簡單的,真正的發幣行為應該是撰寫智能合約,通過第三方驗證,證明無漏洞後,並且發佈在區塊鏈上,聽起來很難,但看過這篇文章後,整個過程也是5分鐘內而已。
OpenZeppeLin 智能合約範本
首先要使用 OpenZeppeLin 來產生你發幣用智能合約,在 OpenZeppeLin 上面可以找到很多範本,可以直接引入即可,但更簡單的方法是使用 OpenZeppeLine精靈 來快速產生智能合約程式碼。
![](https://rain.tips/wp-content/uploads/2022/05/image-1-1024x785.png)
在這個畫面中如果要簡單發幣的話,可以填入 Name (代幣名稱), Symbol(代幣的代號), Premint (欲鑄的貨幣數量)的資料就可以了,常用的進階功能則有 Burnable, Votes, Pausable, 如果你是為了公司發行,可以在 Access Control 中選擇 Roles 然後建立自己的控制規則,可以多人控管開發行的貨幣
Remix 上發行貨幣
在 OpenZeppeLin 畫面上按下 Open in Remix 按鈕,就可以直接將合約範本直接帶入到 Remix 中
1.先連結你的 MetaMask 小狐狸錢包
2.選擇對應的編譯器,然後按下編譯,以本例是 0.8.4 版本的編譯器,Solidity 語法
![](https://rain.tips/wp-content/uploads/2022/05/image-2-1024x542.png)
3.將代幣發佈到區塊鏈上,環境選擇 Injected Web3, 並且注意你的 MetaMask 連結的網路是那哩,以我的圖片例子是選在 Ploygon 的測試鏈上,然後發佈的合約要選擇倒剛剛寫好的 ShaneToken, 設定無誤後按下 Deploy 即可發行
![](https://rain.tips/wp-content/uploads/2022/05/image-3-1024x538.png)
5.在 MetaMask 中確認合約正確性,注意發行到的網路是否正確,以及看一下 Gas Fee 多少錢,本例是發行在 Ploygon 上,所以使用的代幣是 MATIC ,自己的錢包有沒有對應的代幣可以支付,檢查完畢按下確認後就可以發行成功了
![](https://rain.tips/wp-content/uploads/2022/05/image-4.png)
最後要將代幣匯入到 MetaMask 中
可以在 Polygonscan 中找到你得合約網址
![](https://rain.tips/wp-content/uploads/2022/05/image-6-1024x306.png)
將合約地址填回 MetaMask 就大功告成囉
![](https://rain.tips/wp-content/uploads/2022/05/image-5.png)
可以在自己的錢包中看到自己發行的代幣,當個有錢人
![](https://rain.tips/wp-content/uploads/2022/05/image-7.png)
延伸閱讀,利用 OpenZeppelin 來發NFT
https://www.frank.hk/blog/nft-smart-contract/
https://wizard.openzeppelin.com/#erc721
測試鏈做測試
測試時,需要去水龍頭那邊取得手續費用
Name | Link |
polygon-mumbai | Polygon Faucet |
harmony | Faucet || Harmony Testnet |
Cronos | https://cronos.crypto.org/faucet |
iotex | IoTeX Faucet – Getting IoTeX for development |
Bsc | Binance Smart Chain: Faucet |
Heco | Huobi ECO Chain |
SOL原始程式碼
如果不能用精靈產生程式碼,可以直接複製下面的程式碼
// SPDX-License-Identifier: MIT pragma solidity ^0.8.4; import "@openzeppelin/contracts-upgradeable/token/ERC20/ERC20Upgradeable.sol"; import "@openzeppelin/contracts-upgradeable/token/ERC20/extensions/ERC20BurnableUpgradeable.sol"; import "@openzeppelin/contracts-upgradeable/token/ERC20/extensions/ERC20SnapshotUpgradeable.sol"; import "@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol"; import "@openzeppelin/contracts-upgradeable/security/PausableUpgradeable.sol"; import "@openzeppelin/contracts-upgradeable/token/ERC20/extensions/draft-ERC20PermitUpgradeable.sol"; import "@openzeppelin/contracts-upgradeable/token/ERC20/extensions/ERC20VotesUpgradeable.sol"; import "@openzeppelin/contracts-upgradeable/token/ERC20/extensions/ERC20FlashMintUpgradeable.sol"; import "@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol"; contract TestToken is Initializable, ERC20Upgradeable, ERC20BurnableUpgradeable, ERC20SnapshotUpgradeable, OwnableUpgradeable, PausableUpgradeable, ERC20PermitUpgradeable, ERC20VotesUpgradeable, ERC20FlashMintUpgradeable { /// @custom:oz-upgrades-unsafe-allow constructor constructor() { _disableInitializers(); } function initialize() initializer public { __ERC20_init("Test Token", TST"); __ERC20Burnable_init(); __ERC20Snapshot_init(); __Ownable_init(); __Pausable_init(); __ERC20Permit_init("Shane Token"); __ERC20Votes_init(); __ERC20FlashMint_init(); _mint(msg.sender, 100000000 * 10 ** decimals()); } function snapshot() public onlyOwner { _snapshot(); } function pause() public onlyOwner { _pause(); } function unpause() public onlyOwner { _unpause(); } function mint(address to, uint256 amount) public onlyOwner { _mint(to, amount); } function _beforeTokenTransfer(address from, address to, uint256 amount) internal whenNotPaused override(ERC20Upgradeable, ERC20SnapshotUpgradeable) { super._beforeTokenTransfer(from, to, amount); } // The following functions are overrides required by Solidity. function _afterTokenTransfer(address from, address to, uint256 amount) internal override(ERC20Upgradeable, ERC20VotesUpgradeable) { super._afterTokenTransfer(from, to, amount); } function _mint(address to, uint256 amount) internal override(ERC20Upgradeable, ERC20VotesUpgradeable) { super._mint(to, amount); } function _burn(address account, uint256 amount) internal override(ERC20Upgradeable, ERC20VotesUpgradeable) { super._burn(account, amount); } }
基本的發幣程式碼,支持可以維護以及可以銷毀
// SPDX-License-Identifier: MIT pragma solidity ^0.8.4; import "@openzeppelin/contracts/token/ERC20/ERC20.sol"; import "@openzeppelin/contracts/token/ERC20/extensions/ERC20Burnable.sol"; import "@openzeppelin/contracts/access/Ownable.sol"; /// @custom:security-contact contract TestTokenMintableBurnable is ERC20, ERC20Burnable, Ownable { constructor() ERC20("Test Token Mintable Burnable", "TTMB") { _mint(msg.sender, 100000000 * 10 ** decimals()); } function mint(address to, uint256 amount) public onlyOwner { _mint(to, amount); } }
發幣之後,驗證合約的安全性
發幣前後都要利用 CoinTool ,來驗證的你合約安全,才會讓大眾們信任
![](https://rain.tips/wp-content/uploads/2022/05/image-14.png)
近期留言