The tables below provide a summary and detailed information in relation to the number of tests performed, the count of passing tests and the count of failing tests.
To summarise, VeChain is fully compatible with OpenZeppelin contracts (with v5 being the latest version tested), and the main differences encountered are related to Hardhat:
- The
chainId in VeChain is the genesis block ID of each network
- Custom Hardhat RPC methods like
evm_increaseTime or evm_mine depend on the actual Hardhat VeChain plugin (so differences might be expected in this regard).
You can find detailed analysis of the coverage categories in the pages to follow.
| Category | Short Description | Failures |
|---|
| Set base URI | URI was not set in the ERC721 and ERC721Enumerable test cases, causing 6 tests to remain pending. Since these tests focus on compatibility, URI validation is not essential. | 0 |
| Contract Name | Pass | Fail | Total | Test Coverage |
| Total | 2611 | 0 | 2617 | |
| AccessControl | 30 | 0 | 30 | |
| Ownable | 8 | 0 | 8 | |
| Ownable2Step | 6 | 0 | 6 | |
| AccessControlDefaultAdminRules | 56 | 0 | 56 | |
| AccessControlEnumerable | 36 | 0 | 36 | |
| AccessManaged | 8 | 0 | 8 | |
| AccessManager | 113 | 0 | 113 | |
| AuthorityUtils | 4 | 0 | 4 | |
| VestingWallet | 2 | 0 | 2 | |
| Governor | 136 | 0 | 136 | |
| GovernorERC721 | 2 | 0 | 2 | |
| GovernorPreventLateQuorum | 5 | 0 | 5 | |
| GovernorStorage | 3 | 0 | 3 | |
| GovernorTimelockAccess | 3 | 0 | 3 | |
| GovernorTimelockCompound | 8 | 0 | 8 | |
| GovernorTimelockControl | 12 | 0 | 12 | |
| GovernorVotesQuorumFraction | 4 | 0 | 4 | |
| GovernorWithParams | 7 | 0 | 7 | |
| Votes | 44 | 0 | 44 | |
| ERC2771Context | 11 | 0 | 11 | |
| ERC2771Forwarder | 36 | 0 | 36 | |
| Clones | 30 | 0 | 30 | |
| ERC1967Proxy | 19 | 0 | 19 | |
| BeaconProxy | 6 | 0 | 6 | |
| UpgradeableBeacon | 6 | 0 | 6 | |
| ProxyAdmin | 5 | 0 | 5 | |
| TransparentUpgradeableProxy | 19 | 0 | 19 | |
| Initializable | 29 | 0 | 29 | |
| UUPSupgradeable | 8 | 0 | 8 | |
| ERC721 | 375 | 0 | 378 | |
| ERC721Enumerable | 397 | 0 | 400 | |
| ERC721Wrapper | 18 | 0 | 18 | |
| ERC721Holder | 1 | 0 | 1 | |
| ERC721Burnable | 5 | 0 | 5 | |
| ERC721Consecutive | 34 | 0 | 34 | |
| ERC721Pausable | 9 | 0 | 9 | |
| ERC721Royalty | 16 | 0 | 16 | |
| ERC721URIStorage | 17 | 0 | 17 | |
| ERC721Votes | 23 | 0 | 23 | |
| ERC721Holder | 1 | 0 | 1 | |
| ERC1155 | 89 | 0 | 89 | |
| ERC1155Burnable | 6 | 0 | 6 | |
| ERC1155Pausable | 11 | 0 | 11 | |
| ERC1155Supply | 4 | 0 | 4 | |
| ERC1155URIStorage | 4 | 0 | 4 | |
| ERC1155Holder | 7 | 0 | 7 | |
| Address | 7 | 0 | 7 | |
| Address | 29 | 0 | 29 | |
| Arrays | 20 | 0 | 20 | |
| Base64 | 5 | 0 | 5 | |
| Context | 4 | 0 | 4 | |
| Create2 | 8 | 0 | 8 | |
| Multicall | 4 | 0 | 4 | |
| Nonces | 6 | 0 | 6 | |
| Pausable | 11 | 0 | 11 | |
| ReentrancyGuard | 6 | 0 | 6 | |
| ShortStrings | 14 | 0 | 14 | |
| StorageSlot | 24 | 0 | 24 | |
| Strings | 71 | 0 | 71 | |
| ECDSA | 14 | 0 | 14 | |
| EIP712 | 13 | 0 | 13 | |
| MerkleProof | 10 | 0 | 10 | |
| MessageHashUtils | 4 | 0 | 4 | |
| ERC165 | 5 | 0 | 5 | |
| ERC165Checker | 40 | 0 | 40 | |
| Math | 44 | 0 | 44 | |
| SafeCast | 444 | 0 | 444 | |
| SignedMath | 12 | 0 | 12 | |
| BitMap | 10 | 0 | 10 | |
| Checkpoints | 33 | 0 | 33 | |
| DoubleEndedQueue | 9 | 0 | 9 | |
| EnumerableMap | 60 | 0 | 60 | |
| EnumerableSet | 24 | 0 | 24 | |
| Time | 7 | 0 | 7 | |
| Category | Short Description | Failures |
|---|
| Justifiable | Failures that result from the inherent design differences between VeChain and Ethereum. | 73 |
| Contract Address Prediction | See here. | 14 |
| Failures in Constructor | Contract fails in constructor, resulting in failure to be deployed. | 7 |
| Full, with eth_sign implementation | See here. | 4 |
| Full, with test changes | Some test modifications had to be added for the tests to pass. | 3 |
| BadBeaconProxy Address 0x1 | See here. | 1 |
| Contract Name | Pass | Fail | Total | Test Coverage | Hardhat Total Tests |
|---|
| Total | 2324 | 102 | 2426 | | 2667 |
| ERC1967Proxy | 25 | 3 | 28 | | 28 |
| TransparentUpgradeableProxy | 58 | 3 | 61 | | 61 |
| BeaconProxy | 7 | 2 | 9 | | 9 |
| GovernorTimelockCompound | 7 | 12 | 19 | | 19 |
| GovernorCompatibilityBravo | 7 | 2 | 9 | | 9 |
| TimelockController | 27 | 15 | 42 | | 48 |
| CrossChainEnabled | 4 | 9 | 13 | | 15 |
| GovernorTimelockControl | 12 | 9 | 21 | | 21 |
| AccessControl | 50 | 4 | 54 | | 80 |
| MinimalForwarder | 12 | 4 | 16 | | 15 |
| TokenTimelock | 3 | 4 | 7 | | 7 |
| VestingWallet | 2 | 4 | 6 | | 6 |
| ERC721Enumerable | 233 | 3 | 236 | | 236 |
| DoubleEndedQueue | 7 | 2 | 9 | | 9 |
| ERC2771Context | 5 | 2 | 7 | | 7 |
| ERC721 | 211 | 2 | 213 | | 213 |
| Governor | 42 | 2 | 44 | | 44 |
| Checkpoints | 22 | 1 | 23 | | 23 |
| ERC1155 | 83 | 1 | 84 | | 84 |
| ERC1155Holder | 4 | 1 | 5 | | 5 |
| ERC1155PresetMinterPauser | 16 | 1 | 17 | | 17 |
| ERC165 | 2 | 1 | 3 | | 3 |
| ERC165Storage | 4 | 1 | 5 | | 5 |
| ERC20Votes | 28 | 1 | 29 | | 29 |
| ERC20VotesComp | 27 | 1 | 28 | | 28 |
| ERC721PresetMinterPauserAutoId | 15 | 1 | 16 | | 16 |
| ERC721Royalty | 13 | 1 | 14 | | 14 |
| GovernorWithParams | 3 | 1 | 4 | | 4 |
| MerkleProof | 8 | 1 | 9 | | 9 |
| TimersTimestamp | 4 | 1 | 5 | | 5 |
| ECDSA | 14 | 3 | 17 | | 17 |
| SignatureChecker (ERC1271) | 1 | 1 | 1 | | 7 |
| ERC1820Implementer | 1 | 1 | 1 | | 6 |
| ERC777 | 1 | 1 | 1 | | 193 |
| ERC777PresetFixedSupply | 1 | 1 | 1 | | 6 |
| Address | 29 | 0 | 29 | | 29 |
| Arrays | 15 | 0 | 15 | | 15 |
| BitMap | 10 | 0 | 10 | | 10 |
| Clones | 30 | 0 | 30 | | 30 |
| ConditionalEscrow | 11 | 0 | 11 | | 11 |
| Context | 4 | 0 | 4 | | 4 |
| Counters | 8 | 0 | 8 | | 8 |
| Create2 | 8 | 0 | 8 | | 8 |
| EIP712 | 2 | 0 | 2 | | 2 |
| EnumerableMap | 70 | 0 | 70 | | 70 |
| EnumerableSet | 20 | 0 | 24 | | 24 |
| ERC1155Burnable | 6 | 0 | 6 | | 6 |
| ERC1155Pausable | 11 | 0 | 11 | | 11 |
| ERC1155Supply | 10 | 0 | 10 | | 10 |
| ERC1155URIStorage | 4 | 0 | 4 | | 4 |
| ERC165Checker | 40 | 0 | 40 | | 40 |
| ERC20 | 118 | 0 | 118 | | 118 |
| ERC20Burnable | 13 | 0 | 13 | | 13 |
| ERC20Capped | 5 | 0 | 5 | | 5 |
| ERC20FlashMint | 12 | 0 | 12 | | 12 |
| ERC20Pausable | 12 | 0 | 12 | | 12 |
| ERC20Permit | 6 | 0 | 6 | | 6 |
| ERC20PresetFixedSupply | 4 | 0 | 4 | | 4 |
| ERC20PresetMinterPauser | 12 | 0 | 12 | | 12 |
| ERC20Snapshot | 14 | 0 | 14 | | 14 |
| ERC4626 | 25 | 0 | 25 | | 25 |
| ERC721Burnable | 4 | 0 | 4 | | 4 |
| ERC721Consecutive | 13 | 0 | 13 | | 13 |
| ERC721Holder | 1 | 0 | 1 | | 1 |
| ERC721Pausable | 10 | 0 | 10 | | 10 |
| ERC721URIStorage | 10 | 0 | 10 | | 10 |
| ERC721Votes | 26 | 0 | 26 | | 26 |
| Escrow | 10 | 0 | 10 | | 10 |
| GovernorComp | 2 | 0 | 2 | | 2 |
| GovernorERC721Mock | 2 | 0 | 2 | | 2 |
| GovernorPreventLateQuorum | 5 | 0 | 5 | | 5 |
| GovernorVotesQuorumFraction | 6 | 0 | 6 | | 6 |
| Initializable | 29 | 0 | 29 | | 29 |
| Math | 25 | 0 | 25 | | 25 |
| MulticallToken | 4 | 0 | 4 | | 4 |
| Ownable | 6 | 0 | 6 | | 6 |
| Ownable2Step | 5 | 0 | 5 | | 5 |
| Pausable | 11 | 0 | 11 | | 11 |
| PaymentSplitter | 20 | 0 | 20 | | 20 |
| ProxyAdmin | 12 | 0 | 12 | | 12 |
| PullPayment | 4 | 0 | 4 | | 4 |
| ReentrancyGuard | 6 | 0 | 6 | | 6 |
| RefundEscrow | 17 | 0 | 17 | | 17 |
| SafeCast | 444 | 0 | 444 | | 444 |
| SafeERC20 | 35 | 0 | 35 | | 35 |
| SafeMath | 48 | 0 | 48 | | 48 |
| SignedMath | 12 | 0 | 12 | | 12 |
| SignedSafeMath | 17 | 0 | 17 | | 17 |
| StorageSlot | 12 | 0 | 12 | | 12 |
| Strings | 31 | 0 | 31 | | 31 |
| TimersBlockNumber | 5 | 0 | 5 | | 5 |
| UpgradeableBeacon | 5 | 0 | 5 | | 5 |
| UUPSUpgradeable | 6 | 0 | 6 | | 6 |
| Votes | 23 | 0 | 23 | | 23 |