抽象合約和接口
- 抽象合約
如果一個智能合約至少有一個未實現(xiàn)的函數(shù),某個函數(shù)缺少花括號中的主體內容,則必須將該合約標記為abstract,不然編譯報錯。
未實現(xiàn)的合約需要加virtual 修改,以便子合約重寫
abstract contract InsertionSort {
function insertionSort(uint[] memory a) public pure virtual returns(uint[] memory);
}
- 接口
接口類似抽象合約,但是他不實現(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個事件,其中Transfer和Approval事件在ERC20中也有。
-
Transfer事件:在轉賬時被釋放,記錄代幣的發(fā)出地址from,接收地址to和tokenId。 -
Approval事件:在授權時被釋放,記錄授權地址owner,被授權地址approved和tokenId。 -
ApprovalForAll事件:在批量授權時被釋放,記錄批量授權的發(fā)出地址owner,被授權地址operator和授權與否的approved。
IERC721函數(shù)
-
balanceOf:返回某地址的NFT持有量balance。 -
ownerOf:返回某tokenId的主人owner。 -
transferFrom:普通轉賬,參數(shù)為轉出地址from,接收地址to和tokenId。 -
safeTransferFrom:安全轉賬(如果接收方是合約地址,會要求實現(xiàn)ERC721Receiver接口)。參數(shù)為轉出地址from,接收地址to和tokenId。 -
approve:授權另一個地址使用你的NFT。參數(shù)為被授權地址approve和tokenId。 -
getApproved:查詢tokenId被批準給了哪個地址。 -
setApprovalForAll:將自己持有的該系列NFT批量授權給某個地址operator。 -
isApprovedForAll:查詢某地址的NFT是否批量授權給了另一個operator地址。 -
safeTransferFrom:安全轉賬的重載函數(shù),參數(shù)里面包含了data。