算是ERC20 的改良版本,多了一個角色 Operator (操作員或運營者)加以改善
以下解釋ERC777 各 function :
function totalSupply
()
代幣總量,回傳代幣的發行總量。
function balanceOf
()
特定地址持有的代幣總量,這部分誰都可以查,畢竟區塊鏈的訊息都是公開的。
function send
()
移轉代幣給他人,注意這裡只能是錢包→錢包的發送,如果你用合約的地址是不行的。
function burn
()
銷毀。
function authorizeOperator
()
設定address是操作員,
function revokeOperator
()
撤銷address操作員的
function isOperatorFor
()
某個地址是否是操作員身份
function operatorSend
()
如果是操作員身份,就可以將代幣直接發送到另外帳戶,請確定這個設定使用上需要非常小心不然會是一個漏洞(畢竟ERC20 裡面也是要**approve
**之後才可以發送)
function defaultOperators
()
如果你在建立合約時,可以設定預設的一些地址是操作員身份
event Minted
()
新的代幣被鑄造時就會觸發這個事件,記錄代幣的數量和目標地址。(必要)
event Burned
()
代幣被銷毀時就會觸發這個事件,記錄代幣的數量和目標地址。(必要)
event Send
()
代幣轉移時就會觸發這個事件,記錄代幣的數量,發送和接收者訊息。(必要)
event AuthorizedOperator
()
新增控制員就會觸法紀錄。(必要)
event RevokedOperator
()
刪除控制員就會觸法紀錄。(必要)
實作ERC777
// contracts/GLDToken.sol
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
import "<https://github.com/OpenZeppelin/openzeppelin-contracts/blob/v4.5.0/contracts/token/ERC777/ERC777.sol>";
contract GLDToken is ERC777 {
constructor(uint256 initialSupply, address[] memory defaultOperators)
ERC777("Gold", "GLD", defaultOperators)
{
_mint(msg.sender, initialSupply, "", "");
}
}