本文档介绍了如何在使用OpenZeppelin升级插件等工具部署可升级合约时,使用@openzeppelin/contracts-upgradeable包。 该包通过使用initializer函数替换构造函数,并在小版本之间检查存储不兼容性,遵循可升级合约的编写规则,同时还讨论了多重继承和命名空间存储等问题。
@openzeppelin/contracts-upgradeable
本文介绍了OpenZeppelin Hardhat Upgrades插件如何通过.openzeppelin文件夹中的网络文件来跟踪已部署的合约版本。
.openzeppelin
本文档介绍了如何在Solidity中使用OpenZeppelin Contracts进行合约扩展。主要讨论了通过继承进行功能扩展和通过重写(override)改变父合约行为的方法,包括如何调用super来扩展父合约的行为。同时强调了自定义重写可能带来的安全风险,并建议开发者在更新OpenZeppelin Contracts版本时重新验证其假设。
super
本文介绍了OpenZeppelin的升级插件,该插件集成了Hardhat和Foundry,用于在以太坊上部署和管理可升级合约。插件支持部署和升级合约,管理代理管理员权限,并易于在测试中使用,支持UUPS、透明和信标代理模式。
ERC20Wrapper库是一种对某ERC20 token作为标的资产进行包装的wrapped ERC20 token。用户可以质押或赎回标的token,同时获得或销毁相同数量的wrapped token。
ERC721.sol源码解读ERC721是ETH上的一种非同质化代币(NFT)标准,定义了一种唯一、不可分割、不可互换的代币类型。每一个ERC721代币都有唯一的tokenId和所有者,可以代表数字资产或现实世界中的物品,比如:数字艺术游戏道具虚拟地产门票......
Hook 编程会增加智能合约的复杂度,从而加大攻击向量。而 Hook 合约与普通合约相比,需要更严格的“安全使用约束”。因此,Hook 编程要广泛应用,还需要一个全面的框架:需要有安全执行环境、适用 Hook 的编程范式,和更严格的使用约束。
BeaconProxy库是信标代理合约的实现。与ERC1967Proxy和TransparentUpgradeableProxy两种代理合约不同,信标代理合约背后的逻辑合约地址并不是存储在代理合约内,而是存储于信标合约中。信标代理合约自身只存储信标合约的地址。
SafeERC20库封装了ERC20的操作,使各操作执行失败时触发revert。因为标准IERC20的转账和授权等需通过一个bool返回值来表示操作是否成功,可能实现合约内部没有设置revert机制。有的ERC20合约的授权或转账的实现并无返回值(以太坊上的USDT合约),此时可通过本库与其交互。
ERC20PresetMinterPauser库是一种带mint和pause权限管理的ERC20实现,同时支持销毁和委托销毁的功能。当合约进入paused状态后,全部token的转移功能都将被停止。权限管理功能是直接继承AccessControlEnumerable库。
VestingWallet库可给指定的受益人按时间线性释放锁在合约内的Eth或Erc20 token。任何转移至本合约的token都必须遵循释放模型。开发者可通过重写vestedAmount(uint64)或vestedAmount(address,uint64)来自定义token释放模型。
vestedAmount(uint64)
vestedAmount(address,uint64)
TokenTimelock库是是一个锁币合约。它允许指定地址在某一时间点及之后取出全部锁存的代币,实现了一个代币时间锁的功能。
本文介绍了 ERC-20 token 的概念和使用场景,例如作为交易媒介、投票权和 staking。通过 OpenZeppelin Contracts 可以轻松创建 ERC-20 token 合约,并以一个游戏中的 Gold (GLD) 代币为例,展示了如何构建、部署和转账 ERC-20 token,还讨论了 decimals 字段在处理小数方面的作用。
本文介绍了 ERC-721 标准,用于表示非同质化代币(NFT)的所有权,每个代币都是独一无二的。文章提供了一个 GameItem 合约的示例,该合约使用 ERC721URIStorage 扩展来跟踪游戏中的物品,并包含如何创建新物品以及查询物品的所有者和元数据方法。
ERC20Burnable库是ERC20的拓展。该库允许用户销毁自己和给自己授权的人名下的token。