Pre:
OpenZeppelin代码库概览,了解有什么功能的库,方便后续使用
文件夹:
folder |
模块功能 |
简述 |
Access |
权限控制 |
限制谁可以访问合约功能或何时可以访问的方法 |
crosschain |
跨链 |
代币可跨链 |
finance |
金融系统原型 |
支付拆分模式(单笔支付可自定义比例拆分成ether、erc20)、退休金模式(合约锁仓、按自定义时间释放给受益人) |
governance |
链上治理 |
链上投票协议 |
interfaces |
标准接口 |
各类erc提案的标准接口库 |
metatx |
元交易 |
—— |
mocks |
模拟 |
—— |
proxy |
可升级的代理合约模式 |
Transparent(可由管理员升级的代理)、UUPS(基于UUPS设计的可升级机制) |
security |
安全库 |
常见的安全实践:防重入、紧急响应机制 |
token |
代币 |
ERC20(可替代代币)、ERC721(不可替代代币)、ERC1155(可/半可/不可替代代币)、ERC777(erc20+转账通知机制) |
utils |
实用工具 |
处理新数据类型、签名验证、安全数学计算等 |
vendor |
第三方合约库 |
arbitrum、compound、optimism等 |
QuickView:
access (权限控制)
1 2 3 4 5 6 7
| ├── access (权限控制) │ ├── AccessControl.sol (基于角色的访问控制机制) │ ├── AccessControlCrossChain.sol (扩展:跨链) │ ├── AccessControlEnumerable.sol (扩展:可枚举各角色的成员) │ ├── IAccessControl.sol │ ├── IAccessControlEnumerable.sol │ ├── Ownable.sol (管理员访问控制机制)
|
crosschain (跨链)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
| ├── crosschain (跨链) │ ├── CrossChainEnabled.sol (接收跨链消息时的控制执行流程) │ │ │ ├── amb (在两个evm链之间中继任意数据) │ │ ├── CrossChainEnabledAMB.sol (基于amb bridge) │ │ └── LibAMB.sol │ ├── arbitrum │ │ ├── CrossChainEnabledArbitrumL1.sol (基于ArbitrumL1 bridge) │ │ ├── CrossChainEnabledArbitrumL2.sol (基于ArbitrumL2 bridge) │ │ ├── LibArbitrumL1.sol │ │ └── LibArbitrumL2.sol │ ├── errors.sol │ ├── optimism │ │ ├── CrossChainEnabledOptimism.sol (基于Optimism bridge) │ │ └── LibOptimism.sol │ └── polygon │ └── CrossChainEnabledPolygonChild.sol (基于Polygon bridge)
|
finance (金融系统原型)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25
| ├── finance (金融系统原型) │ ├── PaymentSplitter.sol (支付拆分模式:单笔支付可自定义比例拆分成ether、erc20) │ └── VestingWallet.sol (退休金模式:锁仓、按自定义时间释放给受益人) ├── governance (链上治理) │ ├── Governor.sol (抽象合约:只包含治理系统的核心部分,需要用其他模块进行拓展) │ ├── IGovernor.sol │ ├── README.adoc │ ├── TimelockController.sol (时间锁控制器) │ ├── compatibility (兼容层) │ │ ├── GovernorCompatibilityBravo.sol │ │ └── IGovernorCompatibilityBravo.sol │ ├── extensions (拓展方案) │ │ ├── GovernorCountingSimple.sol (简单的投票机制,有3个投票选项:反对、赞成和弃权) │ │ ├── GovernorPreventLateQuorum.sol (防止持票巨鲸最后时刻控制投票结果) │ │ ├── GovernorProposalThreshold.sol (限制具有最低余额的代币持有者的提案) │ │ ├── GovernorSettings.sol (可更新治理方案的设置) │ │ ├── GovernorTimelockCompound.sol (加上复合时间锁) │ │ ├── GovernorTimelockControl.sol (加上时间锁) │ │ ├── GovernorVotes.sol (从代币中提取投票权重) │ │ ├── GovernorVotesComp.sol (从多个代币中提取投票权重) │ │ ├── GovernorVotesQuorumFraction.sol (从代币和法定人数中提取投票权重) │ │ └── IGovernorTimelock.sol │ └── utils │ ├── IVotes.sol │ └── Votes.sol (抽象合约:投票权可转移/委托,可汇集给代表代投)
|
interfaces (标准接口):
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27
| ├── interfaces (标准接口) │ ├── IERC1155.sol (单合约可存多个代币) │ ├── IERC1155MetadataURI.sol │ ├── IERC1155Receiver.sol │ ├── IERC1271.sol (让智能合约验证其它智能合约的签名) │ ├── IERC1363.sol (在单个交易中,在转移/批准后允许回调) │ ├── IERC1363Receiver.sol │ ├── IERC1363Spender.sol │ ├── IERC165.sol (检测合约实现了哪些接口) │ ├── IERC1820Implementer.sol │ ├── IERC1820Registry.sol │ ├── IERC20.sol (可替代代币) │ ├── IERC20Metadata.sol │ ├── IERC2981.sol (NFT版权标准) │ ├── IERC3156.sol (闪电贷) │ ├── IERC3156FlashBorrower.sol │ ├── IERC3156FlashLender.sol │ ├── IERC4626.sol (代币化的金库) │ ├── IERC721.sol (不可替代代币) │ ├── IERC721Enumerable.sol │ ├── IERC721Metadata.sol │ ├── IERC721Receiver.sol │ ├── IERC777.sol (erc20+转账通知机制) │ ├── IERC777Recipient.sol │ ├── IERC777Sender.sol │ ├── draft-IERC1822.sol │ └── draft-IERC2612.sol
|
1 2 3
| ├── metatx (元交易) │ ├── ERC2771Context.sol │ └── MinimalForwarder.sol
|
mocks (模拟)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109
| │ ├── mocks (模拟) │ ├── AccessControlCrossChainMock.sol │ ├── AccessControlEnumerableMock.sol │ ├── AccessControlMock.sol │ ├── AddressImpl.sol │ ├── ArraysImpl.sol │ ├── BadBeacon.sol │ ├── Base64Mock.sol │ ├── BitmapMock.sol │ ├── CallReceiverMock.sol │ ├── CheckpointsImpl.sol │ ├── ClashingImplementation.sol │ ├── ClonesMock.sol │ ├── ConditionalEscrowMock.sol │ ├── ContextMock.sol │ ├── CountersImpl.sol │ ├── Create2Impl.sol │ ├── DoubleEndedQueueMock.sol │ ├── DummyImplementation.sol │ ├── ECDSAMock.sol │ ├── EIP712External.sol │ ├── ERC1155BurnableMock.sol │ ├── ERC1155Mock.sol │ ├── ERC1155PausableMock.sol │ ├── ERC1155ReceiverMock.sol │ ├── ERC1155SupplyMock.sol │ ├── ERC1155URIStorageMock.sol │ ├── ERC1271WalletMock.sol │ ├── ERC165 │ │ ├── ERC165InterfacesSupported.sol │ │ ├── ERC165MissingData.sol │ │ └── ERC165NotSupported.sol │ ├── ERC165CheckerMock.sol │ ├── ERC165Mock.sol │ ├── ERC165StorageMock.sol │ ├── ERC1820ImplementerMock.sol │ ├── ERC20BurnableMock.sol │ ├── ERC20CappedMock.sol │ ├── ERC20DecimalsMock.sol │ ├── ERC20FlashMintMock.sol │ ├── ERC20Mock.sol │ ├── ERC20PausableMock.sol │ ├── ERC20PermitMock.sol │ ├── ERC20SnapshotMock.sol │ ├── ERC20TokenizedVaultMock.sol │ ├── ERC20VotesCompMock.sol │ ├── ERC20VotesMock.sol │ ├── ERC20WrapperMock.sol │ ├── ERC2771ContextMock.sol │ ├── ERC3156FlashBorrowerMock.sol │ ├── ERC721BurnableMock.sol │ ├── ERC721EnumerableMock.sol │ ├── ERC721Mock.sol │ ├── ERC721PausableMock.sol │ ├── ERC721ReceiverMock.sol │ ├── ERC721RoyaltyMock.sol │ ├── ERC721URIStorageMock.sol │ ├── ERC721VotesMock.sol │ ├── ERC777Mock.sol │ ├── ERC777SenderRecipientMock.sol │ ├── EnumerableMapMock.sol │ ├── EnumerableSetMock.sol │ ├── EtherReceiverMock.sol │ ├── GovernorCompMock.sol │ ├── GovernorCompatibilityBravoMock.sol │ ├── GovernorMock.sol │ ├── GovernorPreventLateQuorumMock.sol │ ├── GovernorTimelockCompoundMock.sol │ ├── GovernorTimelockControlMock.sol │ ├── GovernorVoteMock.sol │ ├── GovernorWithParamsMock.sol │ ├── InitializableMock.sol │ ├── MathMock.sol │ ├── MerkleProofWrapper.sol │ ├── MulticallTest.sol │ ├── MulticallTokenMock.sol │ ├── MultipleInheritanceInitializableMocks.sol │ ├── OwnableMock.sol │ ├── PausableMock.sol │ ├── PullPaymentMock.sol │ ├── ReentrancyAttack.sol │ ├── ReentrancyMock.sol │ ├── RegressionImplementation.sol │ ├── SafeCastMock.sol │ ├── SafeERC20Helper.sol │ ├── SafeMathMock.sol │ ├── SignatureCheckerMock.sol │ ├── SignedMathMock.sol │ ├── SignedSafeMathMock.sol │ ├── SingleInheritanceInitializableMocks.sol │ ├── StorageSlotMock.sol │ ├── StringsMock.sol │ ├── TimersBlockNumberImpl.sol │ ├── TimersTimestampImpl.sol │ ├── UUPS │ │ ├── UUPSLegacy.sol │ │ └── UUPSUpgradeableMock.sol │ ├── VotesMock.sol │ ├── compound │ │ └── CompTimelock.sol │ ├── crosschain │ │ ├── bridges.sol │ │ └── receivers.sol │ └── wizard │ ├── MyGovernor1.sol │ ├── MyGovernor2.sol │ └── MyGovernor3.sol │
|
proxy (代理模式):
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
| ├── proxy (代理模式) │ ├── Clones.sol (部署最简单代理合约的标准) │ ├── ERC1967 │ │ ├── ERC1967Proxy.sol (调用委托给可更改的执行合约,防存储冲突) │ │ └── ERC1967Upgrade.sol │ ├── Proxy.sol │ ├── beacon │ │ ├── BeaconProxy.sol (执行合约地址存储在uint256(keccak256('eip1967.proxy.beacon')) - 1中,防存储冲突) │ │ ├── IBeacon.sol │ │ └── UpgradeableBeacon.sol │ ├── transparent (透明代理) │ │ ├── ProxyAdmin.sol │ │ └── TransparentUpgradeableProxy.sol (可由管理员升级的代理。管理员可以访问管理功能,调用不会被转发) │ └── utils │ ├── Initializable.sol (基础合约,用于编写可升级合约) │ └── UUPSUpgradeable.sol (为 UUPS 代理设计的可升级机制)
|
security (安全机制库)
1 2 3 4
| ├── security (安全机制库) │ ├── Pausable.sol (一种可用于避免重入攻击的模式) │ ├── PullPayment.sol (在某些功能期间可以防止重入的修饰符) │ └── ReentrancyGuard.sol (一种常见的紧急响应机制,可以在修复待处理时暂停合约)
|
token (代币)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66
| ├── token (代币) │ ├── ERC1155 │ │ ├── ERC1155.sol │ │ ├── IERC1155.sol │ │ ├── IERC1155Receiver.sol │ │ ├── extensions (拓展) │ │ │ ├── ERC1155Burnable.sol (可销毁) │ │ │ ├── ERC1155Pausable.sol (可暂停) │ │ │ ├── ERC1155Supply.sol (可跟踪每个id的总供应量) │ │ │ ├── ERC1155URIStorage.sol (可管理uri的存储) │ │ │ └── IERC1155MetadataURI.sol │ │ ├── presets │ │ │ ├── ERC1155PresetMinterPauser.sol │ │ │ └── README.md │ │ └── utils │ │ ├── ERC1155Holder.sol │ │ └── ERC1155Receiver.sol │ ├── ERC20 (同质化代币) │ │ ├── ERC20.sol │ │ ├── IERC20.sol │ │ ├── extensions (拓展) │ │ │ ├── ERC20Burnable.sol (销毁自己的代币) │ │ │ ├── ERC20Capped.sol (在铸币时对总供应量设定一个不可变的上限值) │ │ │ ├── ERC20FlashMint.sol (支持闪电贷) │ │ │ ├── ERC20Pausable.sol (可暂停) │ │ │ ├── ERC20Snapshot.sol (有效存储过去的代币余额/供应量,以便以后随时查询) │ │ │ ├── ERC20TokenizedVault.sol │ │ │ ├── ERC20Votes.sol (支持投票和投票委托) │ │ │ ├── ERC20VotesComp.sol (支持投票和投票委托,兼容Compound的token,有uint96限制) │ │ │ ├── ERC20Wrapper.sol │ │ │ ├── IERC20Metadata.sol │ │ │ ├── draft-ERC20Permit.sol │ │ │ └── draft-IERC20Permit.sol │ │ ├── presets (预设、已废弃) │ │ │ ├── ERC20PresetFixedSupply.sol (预设固定供应量) │ │ │ ├── ERC20PresetMinterPauser.sol │ │ │ └── README.md │ │ └── utils │ │ ├── SafeERC20.sol │ │ └── TokenTimelock.sol (时间锁) │ ├── ERC721 非同质化代币 │ │ ├── ERC721.sol │ │ ├── IERC721.sol │ │ ├── IERC721Receiver.sol │ │ ├── extensions (拓展) │ │ │ ├── ERC721Burnable.sol (可销毁) │ │ │ ├── ERC721Enumerable.sol │ │ │ ├── ERC721Pausable.sol (可暂停) │ │ │ ├── ERC721Royalty.sol () │ │ │ ├── ERC721URIStorage.sol (可管理uri的存储) │ │ │ ├── IERC721Enumerable.sol │ │ │ ├── IERC721Metadata.sol │ │ │ └── draft-ERC721Votes.sol │ │ ├── presets │ │ │ └── ERC721PresetMinterPauserAutoId.sol │ │ └── utils │ │ └── ERC721Holder.sol │ ├── ERC777 (ERC20+转账通知机制) │ │ ├── ERC777.sol │ │ ├── IERC777.sol │ │ ├── IERC777Recipient.sol │ │ ├── IERC777Sender.sol │ │ └── presets │ │ └── ERC777PresetFixedSupply.sol │ └── common │ └── ERC2981.sol
|
utils (实用工具库)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42
| ├── utils (实用工具库) │ ├── Address.sol │ ├── Arrays.sol │ ├── Base64.sol │ ├── Checkpoints.sol │ ├── Context.sol │ ├── Counters.sol │ ├── Create2.sol │ ├── Multicall.sol │ ├── README.adoc │ ├── StorageSlot.sol │ ├── Strings.sol │ ├── Timers.sol │ ├── cryptography │ │ ├── ECDSA.sol │ │ ├── MerkleProof.sol │ │ ├── SignatureChecker.sol │ │ └── draft-EIP712.sol │ ├── escrow │ │ ├── ConditionalEscrow.sol │ │ ├── Escrow.sol │ │ └── RefundEscrow.sol │ ├── introspection │ │ ├── ERC165.sol │ │ ├── ERC165Checker.sol │ │ ├── ERC165Storage.sol │ │ ├── ERC1820Implementer.sol │ │ ├── IERC165.sol │ │ ├── IERC1820Implementer.sol │ │ └── IERC1820Registry.sol │ ├── math │ │ ├── Math.sol │ │ ├── SafeCast.sol │ │ ├── SafeMath.sol │ │ ├── SignedMath.sol │ │ └── SignedSafeMath.sol │ └── structs │ ├── BitMaps.sol │ ├── DoubleEndedQueue.sol │ ├── EnumerableMap.sol │ └── EnumerableSet.sol
|
vendor (第三方库)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
| └── vendor (第三方库) ├── amb │ └── IAMB.sol ├── arbitrum │ ├── IArbSys.sol │ ├── IBridge.sol │ ├── IInbox.sol │ ├── IMessageProvider.sol │ └── IOutbox.sol ├── compound │ └── ICompoundTimelock.sol │ ├── optimism │ └── ICrossDomainMessenger.sol │ └── polygon └── IFxMessageProcessor.sol
|
Refs: