Solidity 学习 -练气期(六)

抽象合约和接口

  1. 抽象合约
    如果一个智能合约至少有一个未实现的函数,某个函数缺少花括号中的主体内容,则必须将该合约标记为abstract,不然编译报错。
    未实现的合约需要加virtual 修改,以便子合约重写
abstract contract InsertionSort {
    function insertionSort(uint[] memory a) public pure virtual returns(uint[] memory);    
}
  1. 接口
    接口类似抽象合约,但是他不实现任何功能。便携一个接口需要遵循:
    (1)不能包含状态变量
    (2)不能包含构造函数
    (3)不能继承除了接口之外的其他合约。
    (4)所有函数必须external关键字声明,且不能有函数题。
    (5)继承接口的合约必须实现接口定义的所有函数。
// 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" 插件

如我们知道了一个合约实现了IERC721接口我们不需要知道具体实现代码,就可以与他交互。
用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都实现了这些函数。

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事件:在转账时被释放,记录代币的发出地址from,接收地址totokenId
  • Approval事件:在授权时被释放,记录授权地址owner,被授权地址approvedtokenId
  • ApprovalForAll事件:在批量授权时被释放,记录批量授权的发出地址owner,被授权地址operator和授权与否的approved

IERC721函数

  • balanceOf:返回某地址的NFT持有量balance
  • ownerOf:返回某tokenId的主人owner
  • transferFrom:普通转账,参数为转出地址from,接收地址totokenId
  • safeTransferFrom:安全转账(如果接收方是合约地址,会要求实现ERC721Receiver接口)。参数为转出地址from,接收地址totokenId
  • approve:授权另一个地址使用你的NFT。参数为被授权地址approvetokenId
  • getApproved:查询tokenId被批准给了哪个地址。
  • setApprovalForAll:将自己持有的该系列NFT批量授权给某个地址operator
  • isApprovedForAll:查询某地址的NFT是否批量授权给了另一个operator地址。
  • safeTransferFrom:安全转账的重载函数,参数里面包含了data

版权声明:
作者:玉兰
链接:https://www.techfm.club/p/227810.html
来源:TechFM
文章版权归作者所有,未经允许请勿转载。

THE END
分享
二维码
< <上一篇
下一篇>>