使用 OpenZeppelin Monitor 监控智能合约的链上活动
可升级合约中可以使用 immutable 变量么? 让我们深入探索一番
PaymentSplitter库可以在一组领取地址无感知的情况下,将定量eth或某ERC20 token按照shares占比释放给该组中的某地址。当eth或ERC20 token被转入该合约后,在册的领取地址就可以来领取属于自己占比的那部分。各领取人的shares数量只能在该合约部署时被设置。
ProxyAdmin库是指定用于做透明代理TransparentUpgradeableProxy库admin的管理员合约。
ERC20Wrapper库是一种对某ERC20 token作为标的资产进行包装的wrapped ERC20 token。用户可以质押或赎回标的token,同时获得或销毁相同数量的wrapped token。
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库是是一个锁币合约。它允许指定地址在某一时间点及之后取出全部锁存的代币,实现了一个代币时间锁的功能。
ERC20Burnable库是ERC20的拓展。该库允许用户销毁自己和给自己授权的人名下的token。
ERC20Capped库是ERC20的拓展。该库设置了ERC20发行量的上限。
ERC1967Upgrade库实现了基于ERC1967标准(代理合约的slot分布)的slots读写函数,并在对应slot更新时emit出标准中相应的event。对于各种可升级合约和代理合约的实现而言,本库的作用举足轻重。
ERC1967Proxy库实现了一个基于ERC1967标准的代理合约。通过改变存储于ERC1967标准规定的_IMPLEMENTATION_SLOT号slot中的代理合约地址,代理合约便实现了合约逻辑可升级的功能。