Solidity 學習 -練氣期(六)

抽象合約和接口

  1. 抽象合約
    如果一個智能合約至少有一個未實現(xiàn)的函數(shù),某個函數(shù)缺少花括號中的主體內容,則必須將該合約標記為abstract,不然編譯報錯。
    未實現(xiàn)的合約需要加virtual 修改,以便子合約重寫
abstract contract InsertionSort {
    function insertionSort(uint[] memory a) public pure virtual returns(uint[] memory);    
}
  1. 接口
    接口類似抽象合約,但是他不實現(xiàn)任何功能。便攜一個接口需要遵循:
    (1)不能包含狀態(tài)變量
    (2)不能包含構造函數(shù)
    (3)不能繼承除了接口之外的其他合約。
    (4)所有函數(shù)必須external關鍵字聲明,且不能有函數(shù)題。
    (5)繼承接口的合約必須實現(xiàn)接口定義的所有函數(shù)。
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.30;
import "@openzeppelin/contracts/token/ERC721/IERC721.sol";

contract interactBAYC {
    IERC721 BAYC = IERC721(0xAb8483F64d9C6d1EcF9b849Ae677dD3315835cb2);
    function balanceOfBAYC(address owner) external view returns (uint256 balance) {
        return BAYC.balanceOf(owner);
    }

    function safeTransferFromBAYC(address from,address to,uint256 tokenId) external {
        BAYC.safeTransferForm(from,to,tokenId);
    }
}

庫引入
remix 點擊后會打開插件市場,你可以搜索:
OpenZeppelin → 會看到 "OpenZeppelin Contracts" 插件

如我們知道了一個合約實現(xiàn)了IERC721接口我們不需要知道具體實現(xiàn)代碼,就可以與他交互。
用balanceOf來查詢某和地址的BAYC余額,safeTransferFrom() 來轉賬BAYC

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.30;
contract interactBAYC {
    IERC721 BAYC = IERC721(0xAb8483F64d9C6d1EcF9b849Ae677dD3315835cb2);
    function balanceOfBAYC(address owner) external view returns (uint256 balance) {
        return BAYAC.balanceOf(owner);
    }

    function safeTransferFromBAYC(address from,address to,uint256 tokenId) external {
        BAYC.safeTransferForm(from,to,tokenId);
    }
}

ERC721接口合約IERC721為例,它定義了3個event和9個function,所有ERC721標準的NFT都實現(xiàn)了這些函數(shù)。

interface IERC721 is IERC165 {
    event Transfer(address indexed from, address indexed to, uint256 indexed tokenId);
    event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId);
    event ApprovalForAll(address indexed owner, address indexed operator, bool approved);
    
    function balanceOf(address owner) external view returns (uint256 balance);

    function ownerOf(uint256 tokenId) external view returns (address owner);

    function safeTransferFrom(address from, address to, uint256 tokenId) external;

    function transferFrom(address from, address to, uint256 tokenId) external;

    function approve(address to, uint256 tokenId) external;

    function getApproved(uint256 tokenId) external view returns (address operator);

    function setApprovalForAll(address operator, bool _approved) external;

    function isApprovedForAll(address owner, address operator) external view returns (bool);

    function safeTransferFrom( address from, address to, uint256 tokenId, bytes calldata data) external;
}

IERC721事件

IERC721包含3個事件,其中TransferApproval事件在ERC20中也有。

  • Transfer事件:在轉賬時被釋放,記錄代幣的發(fā)出地址from,接收地址totokenId。
  • Approval事件:在授權時被釋放,記錄授權地址owner,被授權地址approvedtokenId。
  • ApprovalForAll事件:在批量授權時被釋放,記錄批量授權的發(fā)出地址owner,被授權地址operator和授權與否的approved。

IERC721函數(shù)

  • balanceOf:返回某地址的NFT持有量balance。
  • ownerOf:返回某tokenId的主人owner。
  • transferFrom:普通轉賬,參數(shù)為轉出地址from,接收地址totokenId。
  • safeTransferFrom:安全轉賬(如果接收方是合約地址,會要求實現(xiàn)ERC721Receiver接口)。參數(shù)為轉出地址from,接收地址totokenId。
  • approve:授權另一個地址使用你的NFT。參數(shù)為被授權地址approvetokenId。
  • getApproved:查詢tokenId被批準給了哪個地址。
  • setApprovalForAll:將自己持有的該系列NFT批量授權給某個地址operator
  • isApprovedForAll:查詢某地址的NFT是否批量授權給了另一個operator地址。
  • safeTransferFrom:安全轉賬的重載函數(shù),參數(shù)里面包含了data。
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

友情鏈接更多精彩內容