arr00-testing-oz-contracts 0.0.0 → 5.8.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +121 -0
- package/access/AccessControl.sol +206 -0
- package/access/IAccessControl.sol +98 -0
- package/access/Ownable.sol +100 -0
- package/access/Ownable2Step.sol +67 -0
- package/access/extensions/AccessControlDefaultAdminRules.sol +372 -0
- package/access/extensions/AccessControlEnumerable.sol +81 -0
- package/access/extensions/IAccessControlDefaultAdminRules.sol +192 -0
- package/access/extensions/IAccessControlEnumerable.sol +31 -0
- package/access/manager/AccessManaged.sol +118 -0
- package/access/manager/AccessManager.sol +781 -0
- package/access/manager/AuthorityUtils.sol +36 -0
- package/access/manager/IAccessManaged.sol +32 -0
- package/access/manager/IAccessManager.sol +410 -0
- package/access/manager/IAuthority.sol +14 -0
- package/account/Account.sol +151 -0
- package/account/extensions/draft-AccountERC7579.sol +430 -0
- package/account/extensions/draft-AccountERC7579Hooked.sol +113 -0
- package/account/extensions/draft-ERC7821.sol +70 -0
- package/account/paymaster/Paymaster.sol +170 -0
- package/account/paymaster/extensions/PaymasterERC20.sol +394 -0
- package/account/paymaster/extensions/PaymasterERC20Guarantor.sol +190 -0
- package/account/paymaster/extensions/PaymasterERC721Owner.sol +54 -0
- package/account/paymaster/extensions/PaymasterSigner.sol +125 -0
- package/account/utils/EIP7702Utils.sol +25 -0
- package/account/utils/ERC4337Utils.sol +317 -0
- package/account/utils/draft-ERC7579Utils.sol +314 -0
- package/build/contracts/AbstractSigner.json +13 -0
- package/build/contracts/AccessControl.json +239 -0
- package/build/contracts/AccessControlDefaultAdminRules.json +467 -0
- package/build/contracts/AccessControlEnumerable.json +301 -0
- package/build/contracts/AccessManaged.json +104 -0
- package/build/contracts/AccessManager.json +1189 -0
- package/build/contracts/Account.json +150 -0
- package/build/contracts/AccountERC7579.json +515 -0
- package/build/contracts/AccountERC7579Hooked.json +539 -0
- package/build/contracts/Accumulators.json +13 -0
- package/build/contracts/Address.json +25 -0
- package/build/contracts/Arrays.json +13 -0
- package/build/contracts/AuthorityUtils.json +13 -0
- package/build/contracts/Base58.json +25 -0
- package/build/contracts/Base64.json +25 -0
- package/build/contracts/BeaconProxy.json +97 -0
- package/build/contracts/BitMaps.json +13 -0
- package/build/contracts/BlockHeader.json +25 -0
- package/build/contracts/Blockhash.json +13 -0
- package/build/contracts/BridgeERC1155.json +508 -0
- package/build/contracts/BridgeERC20.json +260 -0
- package/build/contracts/BridgeERC721.json +270 -0
- package/build/contracts/BridgeERC7802.json +249 -0
- package/build/contracts/BridgeFungible.json +236 -0
- package/build/contracts/BridgeMultiToken.json +236 -0
- package/build/contracts/BridgeNonFungible.json +212 -0
- package/build/contracts/Bytes.json +13 -0
- package/build/contracts/CAIP10.json +13 -0
- package/build/contracts/CAIP2.json +13 -0
- package/build/contracts/Calldata.json +13 -0
- package/build/contracts/Checkpoints.json +19 -0
- package/build/contracts/CircularBuffer.json +19 -0
- package/build/contracts/Clones.json +19 -0
- package/build/contracts/Comparators.json +13 -0
- package/build/contracts/Context.json +13 -0
- package/build/contracts/Create2.json +19 -0
- package/build/contracts/Create3.json +19 -0
- package/build/contracts/CrosschainLinked.json +145 -0
- package/build/contracts/CrosschainRemoteExecutor.json +199 -0
- package/build/contracts/DoubleEndedQueue.json +13 -0
- package/build/contracts/ECDSA.json +41 -0
- package/build/contracts/EIP712.json +79 -0
- package/build/contracts/EIP7702Utils.json +13 -0
- package/build/contracts/ERC1155.json +428 -0
- package/build/contracts/ERC1155Burnable.json +474 -0
- package/build/contracts/ERC1155Crosschain.json +796 -0
- package/build/contracts/ERC1155Holder.json +111 -0
- package/build/contracts/ERC1155Pausable.json +477 -0
- package/build/contracts/ERC1155Supply.json +479 -0
- package/build/contracts/ERC1155URIStorage.json +428 -0
- package/build/contracts/ERC1155Utils.json +13 -0
- package/build/contracts/ERC1363.json +585 -0
- package/build/contracts/ERC1363Utils.json +36 -0
- package/build/contracts/ERC165.json +33 -0
- package/build/contracts/ERC165Checker.json +13 -0
- package/build/contracts/ERC1967Clones.json +13 -0
- package/build/contracts/ERC1967Proxy.json +84 -0
- package/build/contracts/ERC1967Utils.json +52 -0
- package/build/contracts/ERC20.json +322 -0
- package/build/contracts/ERC20Bridgeable.json +427 -0
- package/build/contracts/ERC20Burnable.json +353 -0
- package/build/contracts/ERC20Capped.json +362 -0
- package/build/contracts/ERC20Crosschain.json +573 -0
- package/build/contracts/ERC20FlashMint.json +432 -0
- package/build/contracts/ERC20Pausable.json +371 -0
- package/build/contracts/ERC20Permit.json +532 -0
- package/build/contracts/ERC20TemporaryApproval.json +346 -0
- package/build/contracts/ERC20TransferAuthorization.json +836 -0
- package/build/contracts/ERC20Votes.json +781 -0
- package/build/contracts/ERC20Wrapper.json +405 -0
- package/build/contracts/ERC2771Context.json +46 -0
- package/build/contracts/ERC2771Forwarder.json +439 -0
- package/build/contracts/ERC2981.json +126 -0
- package/build/contracts/ERC3009.json +668 -0
- package/build/contracts/ERC4337Utils.json +13 -0
- package/build/contracts/ERC4626.json +807 -0
- package/build/contracts/ERC6372Utils.json +19 -0
- package/build/contracts/ERC6909.json +415 -0
- package/build/contracts/ERC6909ContentURI.json +472 -0
- package/build/contracts/ERC6909Metadata.json +529 -0
- package/build/contracts/ERC6909TokenSupply.json +434 -0
- package/build/contracts/ERC721.json +447 -0
- package/build/contracts/ERC721Burnable.json +460 -0
- package/build/contracts/ERC721Consecutive.json +509 -0
- package/build/contracts/ERC721Crosschain.json +674 -0
- package/build/contracts/ERC721Enumerable.json +524 -0
- package/build/contracts/ERC721Holder.json +48 -0
- package/build/contracts/ERC721Pausable.json +496 -0
- package/build/contracts/ERC721Royalty.json +540 -0
- package/build/contracts/ERC721URIStorage.json +479 -0
- package/build/contracts/ERC721Utils.json +13 -0
- package/build/contracts/ERC721Votes.json +835 -0
- package/build/contracts/ERC721Wrapper.json +553 -0
- package/build/contracts/ERC7579Utils.json +119 -0
- package/build/contracts/ERC7739.json +103 -0
- package/build/contracts/ERC7739Utils.json +13 -0
- package/build/contracts/ERC7786Recipient.json +59 -0
- package/build/contracts/ERC7821.json +112 -0
- package/build/contracts/ERC7913P256Verifier.json +43 -0
- package/build/contracts/ERC7913RSAVerifier.json +43 -0
- package/build/contracts/ERC7913WebAuthnVerifier.json +43 -0
- package/build/contracts/EnumerableMap.json +36 -0
- package/build/contracts/EnumerableSet.json +13 -0
- package/build/contracts/Errors.json +51 -0
- package/build/contracts/Governor.json +1381 -0
- package/build/contracts/GovernorCountingFractional.json +1455 -0
- package/build/contracts/GovernorCountingOverridable.json +1612 -0
- package/build/contracts/GovernorCountingSimple.json +1410 -0
- package/build/contracts/GovernorCrosschain.json +1409 -0
- package/build/contracts/GovernorNoncesKeyed.json +1405 -0
- package/build/contracts/GovernorPreventLateQuorum.json +1461 -0
- package/build/contracts/GovernorProposalGuardian.json +1426 -0
- package/build/contracts/GovernorSequentialProposalId.json +1399 -0
- package/build/contracts/GovernorSettings.json +1477 -0
- package/build/contracts/GovernorStorage.json +1506 -0
- package/build/contracts/GovernorSuperQuorum.json +1429 -0
- package/build/contracts/GovernorTimelockAccess.json +1582 -0
- package/build/contracts/GovernorTimelockCompound.json +1449 -0
- package/build/contracts/GovernorTimelockControl.json +1426 -0
- package/build/contracts/GovernorVotes.json +1399 -0
- package/build/contracts/GovernorVotesQuorumFraction.json +1497 -0
- package/build/contracts/GovernorVotesSuperQuorumFraction.json +1657 -0
- package/build/contracts/Hashes.json +13 -0
- package/build/contracts/Heap.json +13 -0
- package/build/contracts/IAccessControl.json +207 -0
- package/build/contracts/IAccessControlDefaultAdminRules.json +406 -0
- package/build/contracts/IAccessControlEnumerable.json +250 -0
- package/build/contracts/IAccessManaged.json +104 -0
- package/build/contracts/IAccessManager.json +1085 -0
- package/build/contracts/IAccount.json +90 -0
- package/build/contracts/IAccountExecute.json +79 -0
- package/build/contracts/IAggregator.json +211 -0
- package/build/contracts/IAuthority.json +43 -0
- package/build/contracts/IBeacon.json +27 -0
- package/build/contracts/ICompoundTimelock.json +427 -0
- package/build/contracts/IERC1155.json +307 -0
- package/build/contracts/IERC1155Errors.json +116 -0
- package/build/contracts/IERC1155MetadataURI.json +326 -0
- package/build/contracts/IERC1155Receiver.json +111 -0
- package/build/contracts/IERC1271.json +38 -0
- package/build/contracts/IERC1363.json +385 -0
- package/build/contracts/IERC1363Receiver.json +48 -0
- package/build/contracts/IERC1363Spender.json +43 -0
- package/build/contracts/IERC165.json +33 -0
- package/build/contracts/IERC1820Implementer.json +38 -0
- package/build/contracts/IERC1820Registry.json +227 -0
- package/build/contracts/IERC1822Proxiable.json +27 -0
- package/build/contracts/IERC1967.json +59 -0
- package/build/contracts/IERC20.json +197 -0
- package/build/contracts/IERC20Errors.json +100 -0
- package/build/contracts/IERC20Metadata.json +236 -0
- package/build/contracts/IERC20Permit.json +89 -0
- package/build/contracts/IERC2309.json +45 -0
- package/build/contracts/IERC2612.json +89 -0
- package/build/contracts/IERC2981.json +62 -0
- package/build/contracts/IERC3009.json +163 -0
- package/build/contracts/IERC3009Cancel.json +66 -0
- package/build/contracts/IERC3156FlashBorrower.json +53 -0
- package/build/contracts/IERC3156FlashLender.json +91 -0
- package/build/contracts/IERC4626.json +626 -0
- package/build/contracts/IERC4906.json +331 -0
- package/build/contracts/IERC5267.json +63 -0
- package/build/contracts/IERC5313.json +27 -0
- package/build/contracts/IERC5805.json +233 -0
- package/build/contracts/IERC6372.json +40 -0
- package/build/contracts/IERC6909.json +319 -0
- package/build/contracts/IERC6909ContentURI.json +351 -0
- package/build/contracts/IERC6909Metadata.json +376 -0
- package/build/contracts/IERC6909TokenSupply.json +338 -0
- package/build/contracts/IERC721.json +299 -0
- package/build/contracts/IERC721Enumerable.json +355 -0
- package/build/contracts/IERC721Errors.json +117 -0
- package/build/contracts/IERC721Metadata.json +344 -0
- package/build/contracts/IERC721Receiver.json +48 -0
- package/build/contracts/IERC7579AccountConfig.json +65 -0
- package/build/contracts/IERC7579Execution.json +56 -0
- package/build/contracts/IERC7579Hook.json +101 -0
- package/build/contracts/IERC7579Module.json +59 -0
- package/build/contracts/IERC7579ModuleConfig.json +127 -0
- package/build/contracts/IERC7579Validator.json +159 -0
- package/build/contracts/IERC7674.json +221 -0
- package/build/contracts/IERC7751.json +40 -0
- package/build/contracts/IERC777.json +405 -0
- package/build/contracts/IERC777Recipient.json +52 -0
- package/build/contracts/IERC777Sender.json +52 -0
- package/build/contracts/IERC7786GatewaySource.json +116 -0
- package/build/contracts/IERC7786Recipient.json +43 -0
- package/build/contracts/IERC7802.json +119 -0
- package/build/contracts/IERC7821.json +51 -0
- package/build/contracts/IERC7913SignatureVerifier.json +43 -0
- package/build/contracts/IEntryPoint.json +305 -0
- package/build/contracts/IEntryPointExtra.json +80 -0
- package/build/contracts/IEntryPointNonces.json +38 -0
- package/build/contracts/IEntryPointStake.json +97 -0
- package/build/contracts/IGovernor.json +1095 -0
- package/build/contracts/IPaymaster.json +123 -0
- package/build/contracts/ITransparentUpgradeableProxy.json +77 -0
- package/build/contracts/IVotes.json +207 -0
- package/build/contracts/Initializable.json +37 -0
- package/build/contracts/InteroperableAddress.json +30 -0
- package/build/contracts/LowLevelCall.json +13 -0
- package/build/contracts/Math.json +13 -0
- package/build/contracts/Memory.json +13 -0
- package/build/contracts/MerkleProof.json +19 -0
- package/build/contracts/MerkleTree.json +35 -0
- package/build/contracts/MessageHashUtils.json +19 -0
- package/build/contracts/MultiSignerERC7913.json +176 -0
- package/build/contracts/MultiSignerERC7913Weighted.json +264 -0
- package/build/contracts/Multicall.json +49 -0
- package/build/contracts/Nonces.json +49 -0
- package/build/contracts/NoncesKeyed.json +73 -0
- package/build/contracts/Ownable.json +88 -0
- package/build/contracts/Ownable2Step.json +127 -0
- package/build/contracts/P256.json +13 -0
- package/build/contracts/Packing.json +19 -0
- package/build/contracts/Panic.json +13 -0
- package/build/contracts/Pausable.json +63 -0
- package/build/contracts/Paymaster.json +147 -0
- package/build/contracts/PaymasterERC20.json +209 -0
- package/build/contracts/PaymasterERC20Guarantor.json +234 -0
- package/build/contracts/PaymasterERC721Owner.json +160 -0
- package/build/contracts/PaymasterSigner.json +212 -0
- package/build/contracts/Proxy.json +18 -0
- package/build/contracts/ProxyAdmin.json +135 -0
- package/build/contracts/RLP.json +19 -0
- package/build/contracts/RSA.json +13 -0
- package/build/contracts/RateLimiter.json +19 -0
- package/build/contracts/ReentrancyGuard.json +19 -0
- package/build/contracts/ReentrancyGuardTransient.json +19 -0
- package/build/contracts/RelayedCall.json +13 -0
- package/build/contracts/SafeCast.json +68 -0
- package/build/contracts/SafeERC20.json +46 -0
- package/build/contracts/ShortStrings.json +30 -0
- package/build/contracts/SignatureChecker.json +13 -0
- package/build/contracts/SignedMath.json +13 -0
- package/build/contracts/SignerECDSA.json +27 -0
- package/build/contracts/SignerEIP7702.json +13 -0
- package/build/contracts/SignerERC7913.json +27 -0
- package/build/contracts/SignerP256.json +48 -0
- package/build/contracts/SignerRSA.json +32 -0
- package/build/contracts/SignerWebAuthn.json +48 -0
- package/build/contracts/SimulateCall.json +13 -0
- package/build/contracts/SlotDerivation.json +13 -0
- package/build/contracts/StorageSlot.json +13 -0
- package/build/contracts/Strings.json +40 -0
- package/build/contracts/Time.json +13 -0
- package/build/contracts/TimelockController.json +1010 -0
- package/build/contracts/TransientSlot.json +13 -0
- package/build/contracts/TransparentUpgradeableProxy.json +131 -0
- package/build/contracts/TrieProof.json +25 -0
- package/build/contracts/UUPSUpgradeable.json +119 -0
- package/build/contracts/UpgradeableBeacon.json +154 -0
- package/build/contracts/VestingWallet.json +364 -0
- package/build/contracts/VestingWalletCliff.json +367 -0
- package/build/contracts/Votes.json +402 -0
- package/build/contracts/VotesExtended.json +450 -0
- package/build/contracts/WebAuthn.json +13 -0
- package/crosschain/CrosschainLinked.sol +114 -0
- package/crosschain/CrosschainRemoteExecutor.sol +99 -0
- package/crosschain/ERC7786Recipient.sol +66 -0
- package/crosschain/bridges/BridgeERC1155.sol +131 -0
- package/crosschain/bridges/BridgeERC20.sol +42 -0
- package/crosschain/bridges/BridgeERC721.sol +62 -0
- package/crosschain/bridges/BridgeERC7802.sol +34 -0
- package/crosschain/bridges/abstract/BridgeFungible.sol +86 -0
- package/crosschain/bridges/abstract/BridgeMultiToken.sol +99 -0
- package/crosschain/bridges/abstract/BridgeNonFungible.sol +79 -0
- package/finance/VestingWallet.sol +160 -0
- package/finance/VestingWalletCliff.sol +55 -0
- package/governance/Governor.sol +825 -0
- package/governance/IGovernor.sol +454 -0
- package/governance/TimelockController.sol +470 -0
- package/governance/extensions/GovernorCountingFractional.sol +190 -0
- package/governance/extensions/GovernorCountingOverridable.sol +226 -0
- package/governance/extensions/GovernorCountingSimple.sol +96 -0
- package/governance/extensions/GovernorCrosschain.sol +31 -0
- package/governance/extensions/GovernorNoncesKeyed.sol +91 -0
- package/governance/extensions/GovernorPreventLateQuorum.sol +119 -0
- package/governance/extensions/GovernorProposalGuardian.sol +59 -0
- package/governance/extensions/GovernorSequentialProposalId.sol +75 -0
- package/governance/extensions/GovernorSettings.sol +106 -0
- package/governance/extensions/GovernorStorage.sol +134 -0
- package/governance/extensions/GovernorSuperQuorum.sol +59 -0
- package/governance/extensions/GovernorTimelockAccess.sol +346 -0
- package/governance/extensions/GovernorTimelockCompound.sol +162 -0
- package/governance/extensions/GovernorTimelockControl.sol +167 -0
- package/governance/extensions/GovernorVotes.sol +64 -0
- package/governance/extensions/GovernorVotesQuorumFraction.sol +113 -0
- package/governance/extensions/GovernorVotesSuperQuorumFraction.sol +135 -0
- package/governance/utils/IVotes.sol +60 -0
- package/governance/utils/Votes.sol +245 -0
- package/governance/utils/VotesExtended.sol +85 -0
- package/interfaces/IERC1155.sol +6 -0
- package/interfaces/IERC1155MetadataURI.sol +6 -0
- package/interfaces/IERC1155Receiver.sol +6 -0
- package/interfaces/IERC1271.sol +17 -0
- package/interfaces/IERC1363.sol +86 -0
- package/interfaces/IERC1363Receiver.sol +32 -0
- package/interfaces/IERC1363Spender.sol +26 -0
- package/interfaces/IERC165.sol +6 -0
- package/interfaces/IERC1820Implementer.sol +20 -0
- package/interfaces/IERC1820Registry.sol +112 -0
- package/interfaces/IERC1967.sol +24 -0
- package/interfaces/IERC20.sol +6 -0
- package/interfaces/IERC20Metadata.sol +6 -0
- package/interfaces/IERC2309.sol +19 -0
- package/interfaces/IERC2612.sol +8 -0
- package/interfaces/IERC2981.sol +26 -0
- package/interfaces/IERC3156.sol +7 -0
- package/interfaces/IERC3156FlashBorrower.sol +27 -0
- package/interfaces/IERC3156FlashLender.sol +41 -0
- package/interfaces/IERC4337.sol +255 -0
- package/interfaces/IERC4626.sol +230 -0
- package/interfaces/IERC4906.sol +20 -0
- package/interfaces/IERC5267.sol +28 -0
- package/interfaces/IERC5313.sol +16 -0
- package/interfaces/IERC5805.sol +9 -0
- package/interfaces/IERC6093.sol +162 -0
- package/interfaces/IERC6372.sol +19 -0
- package/interfaces/IERC6909.sol +131 -0
- package/interfaces/IERC721.sol +6 -0
- package/interfaces/IERC721Enumerable.sol +6 -0
- package/interfaces/IERC721Metadata.sol +6 -0
- package/interfaces/IERC721Receiver.sol +6 -0
- package/interfaces/IERC7751.sol +12 -0
- package/interfaces/IERC777.sol +200 -0
- package/interfaces/IERC777Recipient.sol +35 -0
- package/interfaces/IERC777Sender.sol +35 -0
- package/interfaces/IERC7786.sol +64 -0
- package/interfaces/IERC7913.sol +18 -0
- package/interfaces/draft-IERC1822.sol +20 -0
- package/interfaces/draft-IERC3009.sol +87 -0
- package/interfaces/draft-IERC7579.sol +227 -0
- package/interfaces/draft-IERC7674.sol +17 -0
- package/interfaces/draft-IERC7802.sol +32 -0
- package/interfaces/draft-IERC7821.sol +44 -0
- package/metatx/ERC2771Context.sol +90 -0
- package/metatx/ERC2771Forwarder.sol +376 -0
- package/package.json +29 -1
- package/proxy/Clones.sol +294 -0
- package/proxy/ERC1967/ERC1967Clones.sol +219 -0
- package/proxy/ERC1967/ERC1967Proxy.sol +62 -0
- package/proxy/ERC1967/ERC1967Utils.sol +177 -0
- package/proxy/Proxy.sol +69 -0
- package/proxy/beacon/BeaconProxy.sol +57 -0
- package/proxy/beacon/IBeacon.sol +16 -0
- package/proxy/beacon/UpgradeableBeacon.sol +70 -0
- package/proxy/transparent/ProxyAdmin.sol +45 -0
- package/proxy/transparent/TransparentUpgradeableProxy.sol +118 -0
- package/proxy/utils/Initializable.sol +238 -0
- package/proxy/utils/UUPSUpgradeable.sol +148 -0
- package/token/ERC1155/ERC1155.sol +417 -0
- package/token/ERC1155/IERC1155.sol +123 -0
- package/token/ERC1155/IERC1155Receiver.sol +59 -0
- package/token/ERC1155/extensions/ERC1155Burnable.sol +22 -0
- package/token/ERC1155/extensions/ERC1155Crosschain.sol +87 -0
- package/token/ERC1155/extensions/ERC1155Pausable.sol +38 -0
- package/token/ERC1155/extensions/ERC1155Supply.sol +88 -0
- package/token/ERC1155/extensions/ERC1155URIStorage.sol +58 -0
- package/token/ERC1155/extensions/IERC1155MetadataURI.sol +20 -0
- package/token/ERC1155/utils/ERC1155Holder.sol +42 -0
- package/token/ERC1155/utils/ERC1155Utils.sol +88 -0
- package/token/ERC20/ERC20.sol +305 -0
- package/token/ERC20/IERC20.sol +79 -0
- package/token/ERC20/extensions/ERC1363.sol +135 -0
- package/token/ERC20/extensions/ERC20Burnable.sol +38 -0
- package/token/ERC20/extensions/ERC20Capped.sol +54 -0
- package/token/ERC20/extensions/ERC20Crosschain.sol +39 -0
- package/token/ERC20/extensions/ERC20FlashMint.sol +130 -0
- package/token/ERC20/extensions/ERC20Pausable.sol +33 -0
- package/token/ERC20/extensions/ERC20Permit.sol +77 -0
- package/token/ERC20/extensions/ERC20TransferAuthorization.sol +91 -0
- package/token/ERC20/extensions/ERC20Votes.sol +83 -0
- package/token/ERC20/extensions/ERC20Wrapper.sol +93 -0
- package/token/ERC20/extensions/ERC4626.sol +304 -0
- package/token/ERC20/extensions/IERC20Metadata.sol +26 -0
- package/token/ERC20/extensions/IERC20Permit.sol +90 -0
- package/token/ERC20/extensions/draft-ERC20Bridgeable.sol +51 -0
- package/token/ERC20/extensions/draft-ERC20TemporaryApproval.sol +119 -0
- package/token/ERC20/extensions/draft-ERC3009.sol +152 -0
- package/token/ERC20/utils/ERC1363Utils.sol +95 -0
- package/token/ERC20/utils/SafeERC20.sol +292 -0
- package/token/ERC6909/ERC6909.sol +224 -0
- package/token/ERC6909/extensions/ERC6909ContentURI.sol +59 -0
- package/token/ERC6909/extensions/ERC6909Metadata.sol +83 -0
- package/token/ERC6909/extensions/ERC6909TokenSupply.sol +41 -0
- package/token/ERC721/ERC721.sol +433 -0
- package/token/ERC721/IERC721.sol +135 -0
- package/token/ERC721/IERC721Receiver.sol +28 -0
- package/token/ERC721/extensions/ERC721Burnable.sol +26 -0
- package/token/ERC721/extensions/ERC721Consecutive.sol +176 -0
- package/token/ERC721/extensions/ERC721Crosschain.sol +38 -0
- package/token/ERC721/extensions/ERC721Enumerable.sol +165 -0
- package/token/ERC721/extensions/ERC721Pausable.sol +37 -0
- package/token/ERC721/extensions/ERC721Royalty.sol +26 -0
- package/token/ERC721/extensions/ERC721URIStorage.sol +62 -0
- package/token/ERC721/extensions/ERC721Votes.sol +47 -0
- package/token/ERC721/extensions/ERC721Wrapper.sol +102 -0
- package/token/ERC721/extensions/IERC721Enumerable.sol +29 -0
- package/token/ERC721/extensions/IERC721Metadata.sol +27 -0
- package/token/ERC721/utils/ERC721Holder.sol +26 -0
- package/token/ERC721/utils/ERC721Utils.sol +50 -0
- package/token/common/ERC2981.sol +140 -0
- package/utils/Address.sol +167 -0
- package/utils/Arrays.sol +905 -0
- package/utils/Base58.sol +240 -0
- package/utils/Base64.sol +234 -0
- package/utils/BlockHeader.sol +312 -0
- package/utils/Blockhash.sol +54 -0
- package/utils/Bytes.sol +329 -0
- package/utils/CAIP10.sol +54 -0
- package/utils/CAIP2.sol +51 -0
- package/utils/Calldata.sol +25 -0
- package/utils/Comparators.sol +19 -0
- package/utils/Context.sol +28 -0
- package/utils/Create2.sol +91 -0
- package/utils/Create3.sol +133 -0
- package/utils/ERC6372Utils.sol +53 -0
- package/utils/Errors.sol +34 -0
- package/utils/LowLevelCall.sol +127 -0
- package/utils/Memory.sol +151 -0
- package/utils/Multicall.sol +37 -0
- package/utils/Nonces.sol +47 -0
- package/utils/NoncesKeyed.sol +75 -0
- package/utils/Packing.sol +1656 -0
- package/utils/Panic.sol +57 -0
- package/utils/Pausable.sol +112 -0
- package/utils/RLP.sol +487 -0
- package/utils/RateLimiter.sol +310 -0
- package/utils/ReentrancyGuard.sol +119 -0
- package/utils/ReentrancyGuardTransient.sol +84 -0
- package/utils/RelayedCall.sol +145 -0
- package/utils/ShortStrings.sol +122 -0
- package/utils/SimulateCall.sol +114 -0
- package/utils/SlotDerivation.sol +155 -0
- package/utils/StorageSlot.sol +143 -0
- package/utils/Strings.sol +532 -0
- package/utils/TransientSlot.sol +183 -0
- package/utils/cryptography/ECDSA.sol +284 -0
- package/utils/cryptography/EIP712.sol +168 -0
- package/utils/cryptography/Hashes.sol +31 -0
- package/utils/cryptography/MerkleProof.sol +510 -0
- package/utils/cryptography/MessageHashUtils.sol +228 -0
- package/utils/cryptography/P256.sol +409 -0
- package/utils/cryptography/RSA.sol +159 -0
- package/utils/cryptography/SignatureChecker.sol +199 -0
- package/utils/cryptography/TrieProof.sol +256 -0
- package/utils/cryptography/WebAuthn.sol +269 -0
- package/utils/cryptography/draft-ERC7739Utils.sol +215 -0
- package/utils/cryptography/signers/AbstractSigner.sol +23 -0
- package/utils/cryptography/signers/MultiSignerERC7913.sol +336 -0
- package/utils/cryptography/signers/MultiSignerERC7913Weighted.sol +208 -0
- package/utils/cryptography/signers/SignerECDSA.sol +56 -0
- package/utils/cryptography/signers/SignerEIP7702.sol +25 -0
- package/utils/cryptography/signers/SignerERC7913.sol +63 -0
- package/utils/cryptography/signers/SignerP256.sol +64 -0
- package/utils/cryptography/signers/SignerRSA.sol +65 -0
- package/utils/cryptography/signers/SignerWebAuthn.sol +45 -0
- package/utils/cryptography/signers/draft-ERC7739.sol +99 -0
- package/utils/cryptography/verifiers/ERC7913P256Verifier.sol +29 -0
- package/utils/cryptography/verifiers/ERC7913RSAVerifier.sol +23 -0
- package/utils/cryptography/verifiers/ERC7913WebAuthnVerifier.sol +45 -0
- package/utils/draft-InteroperableAddress.sol +245 -0
- package/utils/introspection/ERC165.sol +25 -0
- package/utils/introspection/ERC165Checker.sol +142 -0
- package/utils/introspection/IERC165.sol +25 -0
- package/utils/math/Math.sol +763 -0
- package/utils/math/SafeCast.sol +1162 -0
- package/utils/math/SignedMath.sol +68 -0
- package/utils/structs/Accumulators.sol +135 -0
- package/utils/structs/BitMaps.sol +61 -0
- package/utils/structs/Checkpoints.sol +881 -0
- package/utils/structs/CircularBuffer.sol +152 -0
- package/utils/structs/DoubleEndedQueue.sol +280 -0
- package/utils/structs/EnumerableMap.sol +1870 -0
- package/utils/structs/EnumerableSet.sol +1177 -0
- package/utils/structs/Heap.sol +259 -0
- package/utils/structs/MerkleTree.sol +267 -0
- package/utils/types/Time.sol +133 -0
- package/vendor/compound/ICompoundTimelock.sol +86 -0
|
@@ -0,0 +1,317 @@
|
|
|
1
|
+
// SPDX-License-Identifier: MIT
|
|
2
|
+
// OpenZeppelin Contracts (last updated v5.8.0) (account/utils/ERC4337Utils.sol)
|
|
3
|
+
|
|
4
|
+
pragma solidity ^0.8.20;
|
|
5
|
+
|
|
6
|
+
import {IEntryPoint, PackedUserOperation} from "../../interfaces/IERC4337.sol";
|
|
7
|
+
import {Calldata} from "../../utils/Calldata.sol";
|
|
8
|
+
import {Math} from "../../utils/math/Math.sol";
|
|
9
|
+
import {SafeCast} from "../../utils/math/SafeCast.sol";
|
|
10
|
+
import {Packing} from "../../utils/Packing.sol";
|
|
11
|
+
|
|
12
|
+
/// @dev This is available on all entrypoint since v0.4.0, but is not formally part of the ERC.
|
|
13
|
+
interface IEntryPointExtra {
|
|
14
|
+
function getUserOpHash(PackedUserOperation calldata userOp) external view returns (bytes32);
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
/**
|
|
18
|
+
* @dev Library with common ERC-4337 utility functions.
|
|
19
|
+
*
|
|
20
|
+
* See https://eips.ethereum.org/EIPS/eip-4337[ERC-4337].
|
|
21
|
+
*/
|
|
22
|
+
library ERC4337Utils {
|
|
23
|
+
using Packing for *;
|
|
24
|
+
|
|
25
|
+
/// @dev Address of the entrypoint v0.7.0
|
|
26
|
+
IEntryPoint internal constant ENTRYPOINT_V07 = IEntryPoint(0x0000000071727De22E5E9d8BAf0edAc6f37da032);
|
|
27
|
+
|
|
28
|
+
/// @dev Address of the entrypoint v0.8.0
|
|
29
|
+
IEntryPoint internal constant ENTRYPOINT_V08 = IEntryPoint(0x4337084D9E255Ff0702461CF8895CE9E3b5Ff108);
|
|
30
|
+
|
|
31
|
+
/// @dev Address of the entrypoint v0.9.0
|
|
32
|
+
IEntryPoint internal constant ENTRYPOINT_V09 = IEntryPoint(0x433709009B8330FDa32311DF1C2AFA402eD8D009);
|
|
33
|
+
|
|
34
|
+
/// @dev For simulation purposes, validateUserOp (and validatePaymasterUserOp) return this value on success.
|
|
35
|
+
uint256 internal constant SIG_VALIDATION_SUCCESS = 0;
|
|
36
|
+
|
|
37
|
+
/// @dev For simulation purposes, validateUserOp (and validatePaymasterUserOp) must return this value in case of signature failure, instead of revert.
|
|
38
|
+
uint256 internal constant SIG_VALIDATION_FAILED = 1;
|
|
39
|
+
|
|
40
|
+
/// @dev Magic value used in EntryPoint v0.9+ to detect the presence of a paymaster signature in `paymasterAndData`.
|
|
41
|
+
bytes8 internal constant PAYMASTER_SIG_MAGIC = 0x22e325a297439656; // keccak256("PaymasterSignature")[:8]
|
|
42
|
+
|
|
43
|
+
/// @dev Highest bit set to 1 in a 6-bytes field.
|
|
44
|
+
uint48 internal constant BLOCK_RANGE_FLAG = 0x800000000000;
|
|
45
|
+
|
|
46
|
+
/// @dev Mask for the lower 47 bits of a 6-bytes field (equivalent to uint48(~BLOCK_RANGE_FLAG)).
|
|
47
|
+
uint48 internal constant BLOCK_RANGE_MASK = 0x7fffffffffff;
|
|
48
|
+
|
|
49
|
+
/// @dev Validity range of the validation data.
|
|
50
|
+
enum ValidationRange {
|
|
51
|
+
TIMESTAMP,
|
|
52
|
+
BLOCK
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
/**
|
|
56
|
+
* @dev Parses the validation data into its components and the validity range. See {packValidationData}.
|
|
57
|
+
*
|
|
58
|
+
* This mirrors, step for step, how the EntryPoint reads a validation data word:
|
|
59
|
+
*
|
|
60
|
+
* * a zero `validUntil` means "indefinitely" and is replaced with `type(uint48).max`, *before* the validity
|
|
61
|
+
* range is detected;
|
|
62
|
+
* * the range is a block range if and only if both `validAfter` and `validUntil` carry {BLOCK_RANGE_FLAG};
|
|
63
|
+
* * {BLOCK_RANGE_FLAG} is stripped from both fields for a block range, and left untouched otherwise.
|
|
64
|
+
*
|
|
65
|
+
* NOTE: For a timestamp range, `validAfter` or `validUntil` may still carry {BLOCK_RANGE_FLAG}, in which case
|
|
66
|
+
* the corresponding bound is out of reach of `block.timestamp` (never valid, resp. never expiring). This is
|
|
67
|
+
* deliberate: the EntryPoint compares `block.timestamp` against the raw fields, so stripping the flag here
|
|
68
|
+
* would silently turn such a bound into a plausible timestamp and make {getValidationData} disagree with the
|
|
69
|
+
* EntryPoint. Encoders should not produce such a mismatch in the first place; {packValidationData} never does.
|
|
70
|
+
*/
|
|
71
|
+
function parseValidationData(
|
|
72
|
+
uint256 validationData
|
|
73
|
+
) internal pure returns (address aggregator, uint48 validAfter, uint48 validUntil, ValidationRange range) {
|
|
74
|
+
validAfter = uint48(bytes32(validationData).extract_32_6(0));
|
|
75
|
+
validUntil = uint48(bytes32(validationData).extract_32_6(6));
|
|
76
|
+
aggregator = address(bytes32(validationData).extract_32_20(12));
|
|
77
|
+
|
|
78
|
+
validUntil |= type(uint48).max * uint48(SafeCast.toUint(validUntil == 0));
|
|
79
|
+
|
|
80
|
+
if ((validAfter & validUntil & BLOCK_RANGE_FLAG) == 0) {
|
|
81
|
+
range = ValidationRange.TIMESTAMP;
|
|
82
|
+
} else {
|
|
83
|
+
range = ValidationRange.BLOCK;
|
|
84
|
+
validAfter &= BLOCK_RANGE_MASK;
|
|
85
|
+
validUntil &= BLOCK_RANGE_MASK;
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
/// @dev Packs the validation data into a single uint256. See {parseValidationData}.
|
|
90
|
+
function packValidationData(
|
|
91
|
+
address aggregator,
|
|
92
|
+
uint48 validAfter,
|
|
93
|
+
uint48 validUntil
|
|
94
|
+
) internal pure returns (uint256) {
|
|
95
|
+
return
|
|
96
|
+
packValidationData(
|
|
97
|
+
aggregator,
|
|
98
|
+
validAfter,
|
|
99
|
+
validUntil,
|
|
100
|
+
(validAfter & BLOCK_RANGE_FLAG != 0) && (validUntil & BLOCK_RANGE_FLAG != 0 || validUntil == 0)
|
|
101
|
+
? ValidationRange.BLOCK
|
|
102
|
+
: ValidationRange.TIMESTAMP
|
|
103
|
+
);
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
/**
|
|
107
|
+
* @dev Variant of {packValidationData} that forces which validity range to use. This overwrites the presence of
|
|
108
|
+
* flags in `validAfter` and `validUntil`).
|
|
109
|
+
*/
|
|
110
|
+
function packValidationData(
|
|
111
|
+
address aggregator,
|
|
112
|
+
uint48 validAfter,
|
|
113
|
+
uint48 validUntil,
|
|
114
|
+
ValidationRange range
|
|
115
|
+
) internal pure returns (uint256) {
|
|
116
|
+
if (range == ValidationRange.TIMESTAMP) {
|
|
117
|
+
validAfter &= BLOCK_RANGE_MASK;
|
|
118
|
+
validUntil &= BLOCK_RANGE_MASK;
|
|
119
|
+
} else if (range == ValidationRange.BLOCK) {
|
|
120
|
+
validAfter |= BLOCK_RANGE_FLAG;
|
|
121
|
+
validUntil |= BLOCK_RANGE_FLAG * uint48(SafeCast.toUint(validUntil > 0));
|
|
122
|
+
}
|
|
123
|
+
return _packRaw(aggregator, validAfter, validUntil);
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
/// @dev Variant of {packValidationData} that uses a boolean success flag instead of an aggregator address.
|
|
127
|
+
function packValidationData(bool sigSuccess, uint48 validAfter, uint48 validUntil) internal pure returns (uint256) {
|
|
128
|
+
return
|
|
129
|
+
packValidationData(
|
|
130
|
+
address(uint160(Math.ternary(sigSuccess, SIG_VALIDATION_SUCCESS, SIG_VALIDATION_FAILED))),
|
|
131
|
+
validAfter,
|
|
132
|
+
validUntil
|
|
133
|
+
);
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
/**
|
|
137
|
+
* @dev Variant of {packValidationData} that uses a boolean success flag instead of an aggregator address and that
|
|
138
|
+
* forces which validity range to use. This overwrites the presence of flags in `validAfter` and `validUntil`).
|
|
139
|
+
*/
|
|
140
|
+
function packValidationData(
|
|
141
|
+
bool sigSuccess,
|
|
142
|
+
uint48 validAfter,
|
|
143
|
+
uint48 validUntil,
|
|
144
|
+
ValidationRange range
|
|
145
|
+
) internal pure returns (uint256) {
|
|
146
|
+
return
|
|
147
|
+
packValidationData(
|
|
148
|
+
address(uint160(Math.ternary(sigSuccess, SIG_VALIDATION_SUCCESS, SIG_VALIDATION_FAILED))),
|
|
149
|
+
validAfter,
|
|
150
|
+
validUntil,
|
|
151
|
+
range
|
|
152
|
+
);
|
|
153
|
+
}
|
|
154
|
+
|
|
155
|
+
/**
|
|
156
|
+
* @dev Combines two validation data into a single one.
|
|
157
|
+
*
|
|
158
|
+
* The `aggregator` is set to {SIG_VALIDATION_SUCCESS} if both are successful, while
|
|
159
|
+
* the `validAfter` is the maximum and the `validUntil` is the minimum of both.
|
|
160
|
+
*
|
|
161
|
+
* NOTE: Returns `SIG_VALIDATION_FAILED` if the validation ranges differ.
|
|
162
|
+
*/
|
|
163
|
+
function combineValidationData(uint256 validationData1, uint256 validationData2) internal pure returns (uint256) {
|
|
164
|
+
(address aggregator1, uint48 validAfter1, uint48 validUntil1, ValidationRange range1) = parseValidationData(
|
|
165
|
+
validationData1
|
|
166
|
+
);
|
|
167
|
+
(address aggregator2, uint48 validAfter2, uint48 validUntil2, ValidationRange range2) = parseValidationData(
|
|
168
|
+
validationData2
|
|
169
|
+
);
|
|
170
|
+
|
|
171
|
+
return
|
|
172
|
+
range1 == range2
|
|
173
|
+
? _packRaw(
|
|
174
|
+
address(
|
|
175
|
+
uint160(
|
|
176
|
+
Math.ternary(
|
|
177
|
+
aggregator1 == address(uint160(SIG_VALIDATION_SUCCESS)) &&
|
|
178
|
+
aggregator2 == address(uint160(SIG_VALIDATION_SUCCESS)),
|
|
179
|
+
SIG_VALIDATION_SUCCESS,
|
|
180
|
+
SIG_VALIDATION_FAILED
|
|
181
|
+
)
|
|
182
|
+
)
|
|
183
|
+
),
|
|
184
|
+
uint48(
|
|
185
|
+
Math.max(validAfter1, validAfter2) |
|
|
186
|
+
(BLOCK_RANGE_FLAG * SafeCast.toUint(range1 == ValidationRange.BLOCK))
|
|
187
|
+
),
|
|
188
|
+
uint48(
|
|
189
|
+
Math.min(validUntil1, validUntil2) |
|
|
190
|
+
(BLOCK_RANGE_FLAG * SafeCast.toUint(range1 == ValidationRange.BLOCK))
|
|
191
|
+
)
|
|
192
|
+
)
|
|
193
|
+
: SIG_VALIDATION_FAILED;
|
|
194
|
+
}
|
|
195
|
+
|
|
196
|
+
/// @dev Encodes the fields of a validation data word verbatim, without normalizing {BLOCK_RANGE_FLAG}.
|
|
197
|
+
function _packRaw(address aggregator, uint48 validAfter, uint48 validUntil) private pure returns (uint256) {
|
|
198
|
+
return uint256(bytes6(validAfter).pack_6_6(bytes6(validUntil)).pack_12_20(bytes20(aggregator)));
|
|
199
|
+
}
|
|
200
|
+
|
|
201
|
+
/// @dev Returns the aggregator of the `validationData` and whether it is out of time range.
|
|
202
|
+
function getValidationData(uint256 validationData) internal view returns (address aggregator, bool outOfTimeRange) {
|
|
203
|
+
(address aggregator_, uint48 validAfter, uint48 validUntil, ValidationRange range) = parseValidationData(
|
|
204
|
+
validationData
|
|
205
|
+
);
|
|
206
|
+
uint256 current = Math.ternary(range == ValidationRange.TIMESTAMP, block.timestamp, block.number);
|
|
207
|
+
return (aggregator_, current <= validAfter || validUntil < current);
|
|
208
|
+
}
|
|
209
|
+
|
|
210
|
+
/// @dev Get the hash of a user operation for a given entrypoint
|
|
211
|
+
function hash(PackedUserOperation calldata self, address entrypoint) internal view returns (bytes32) {
|
|
212
|
+
// NOTE: getUserOpHash is available since v0.4.0
|
|
213
|
+
//
|
|
214
|
+
// Prior to v0.8.0, this was easy to replicate for any entrypoint and chainId. Since v0.8.0 of the
|
|
215
|
+
// entrypoint, this depends on the Entrypoint's domain separator, which cannot be hardcoded and is complex
|
|
216
|
+
// to recompute. Domain separator could be fetched using the `getDomainSeparatorV4` getter, or recomputed from
|
|
217
|
+
// the ERC-5267 getter, but both operation would require doing a view call to the entrypoint. Overall it feels
|
|
218
|
+
// simpler and less error prone to get that functionality from the entrypoint directly.
|
|
219
|
+
return IEntryPointExtra(entrypoint).getUserOpHash(self);
|
|
220
|
+
}
|
|
221
|
+
|
|
222
|
+
/// @dev Returns `factory` from the {PackedUserOperation}, or address(0) if the initCode is empty or not properly formatted.
|
|
223
|
+
function factory(PackedUserOperation calldata self) internal pure returns (address) {
|
|
224
|
+
return self.initCode.length < 20 ? address(0) : address(bytes20(self.initCode[0:20]));
|
|
225
|
+
}
|
|
226
|
+
|
|
227
|
+
/// @dev Returns `factoryData` from the {PackedUserOperation}, or empty bytes if the initCode is empty or not properly formatted.
|
|
228
|
+
function factoryData(PackedUserOperation calldata self) internal pure returns (bytes calldata) {
|
|
229
|
+
return self.initCode.length < 20 ? Calldata.emptyBytes() : self.initCode[20:];
|
|
230
|
+
}
|
|
231
|
+
|
|
232
|
+
/// @dev Returns `verificationGasLimit` from the {PackedUserOperation}.
|
|
233
|
+
function verificationGasLimit(PackedUserOperation calldata self) internal pure returns (uint256) {
|
|
234
|
+
return uint128(self.accountGasLimits.extract_32_16(0));
|
|
235
|
+
}
|
|
236
|
+
|
|
237
|
+
/// @dev Returns `callGasLimit` from the {PackedUserOperation}.
|
|
238
|
+
function callGasLimit(PackedUserOperation calldata self) internal pure returns (uint256) {
|
|
239
|
+
return uint128(self.accountGasLimits.extract_32_16(16));
|
|
240
|
+
}
|
|
241
|
+
|
|
242
|
+
/// @dev Returns the first section of `gasFees` from the {PackedUserOperation}.
|
|
243
|
+
function maxPriorityFeePerGas(PackedUserOperation calldata self) internal pure returns (uint256) {
|
|
244
|
+
return uint128(self.gasFees.extract_32_16(0));
|
|
245
|
+
}
|
|
246
|
+
|
|
247
|
+
/// @dev Returns the second section of `gasFees` from the {PackedUserOperation}.
|
|
248
|
+
function maxFeePerGas(PackedUserOperation calldata self) internal pure returns (uint256) {
|
|
249
|
+
return uint128(self.gasFees.extract_32_16(16));
|
|
250
|
+
}
|
|
251
|
+
|
|
252
|
+
/// @dev Returns the total gas price for the {PackedUserOperation} (ie. `maxFeePerGas` or `maxPriorityFeePerGas + basefee`).
|
|
253
|
+
function gasPrice(PackedUserOperation calldata self) internal view returns (uint256) {
|
|
254
|
+
unchecked {
|
|
255
|
+
// Following values are "per gas"
|
|
256
|
+
uint256 maxPriorityFee = maxPriorityFeePerGas(self);
|
|
257
|
+
uint256 maxFee = maxFeePerGas(self);
|
|
258
|
+
return Math.min(maxFee, maxPriorityFee + block.basefee);
|
|
259
|
+
}
|
|
260
|
+
}
|
|
261
|
+
|
|
262
|
+
/// @dev Returns the first section of `paymasterAndData` from the {PackedUserOperation}.
|
|
263
|
+
function paymaster(PackedUserOperation calldata self) internal pure returns (address) {
|
|
264
|
+
return self.paymasterAndData.length < 52 ? address(0) : address(bytes20(self.paymasterAndData[0:20]));
|
|
265
|
+
}
|
|
266
|
+
|
|
267
|
+
/// @dev Returns the second section of `paymasterAndData` from the {PackedUserOperation}.
|
|
268
|
+
function paymasterVerificationGasLimit(PackedUserOperation calldata self) internal pure returns (uint256) {
|
|
269
|
+
return self.paymasterAndData.length < 52 ? 0 : uint128(bytes16(self.paymasterAndData[20:36]));
|
|
270
|
+
}
|
|
271
|
+
|
|
272
|
+
/// @dev Returns the third section of `paymasterAndData` from the {PackedUserOperation}.
|
|
273
|
+
function paymasterPostOpGasLimit(PackedUserOperation calldata self) internal pure returns (uint256) {
|
|
274
|
+
return self.paymasterAndData.length < 52 ? 0 : uint128(bytes16(self.paymasterAndData[36:52]));
|
|
275
|
+
}
|
|
276
|
+
|
|
277
|
+
/**
|
|
278
|
+
* @dev Returns the fourth section of `paymasterAndData` from the {PackedUserOperation}.
|
|
279
|
+
* If a paymaster signature is present, it is excluded from the returned data.
|
|
280
|
+
*/
|
|
281
|
+
function paymasterData(PackedUserOperation calldata self) internal pure returns (bytes calldata) {
|
|
282
|
+
bool hasSignature = self.paymasterAndData.length > 9 &&
|
|
283
|
+
bytes8(self.paymasterAndData[self.paymasterAndData.length - 8:]) == PAYMASTER_SIG_MAGIC;
|
|
284
|
+
uint256 suffixLength = hasSignature ? _paymasterSignatureSize(self) + 10 : 0;
|
|
285
|
+
return
|
|
286
|
+
self.paymasterAndData.length < 52 + suffixLength
|
|
287
|
+
? Calldata.emptyBytes()
|
|
288
|
+
: self.paymasterAndData[52:self.paymasterAndData.length - suffixLength];
|
|
289
|
+
}
|
|
290
|
+
|
|
291
|
+
/**
|
|
292
|
+
* @dev Returns the paymaster signature from `paymasterAndData` (EntryPoint v0.9+).
|
|
293
|
+
* Returns empty bytes if no paymaster signature is present.
|
|
294
|
+
*/
|
|
295
|
+
function paymasterSignature(PackedUserOperation calldata self) internal pure returns (bytes calldata) {
|
|
296
|
+
if (
|
|
297
|
+
self.paymasterAndData.length < 10 ||
|
|
298
|
+
bytes8(self.paymasterAndData[self.paymasterAndData.length - 8:]) != PAYMASTER_SIG_MAGIC
|
|
299
|
+
) return Calldata.emptyBytes();
|
|
300
|
+
|
|
301
|
+
uint256 sigSize = _paymasterSignatureSize(self);
|
|
302
|
+
uint256 sigEnd = self.paymasterAndData.length - 10;
|
|
303
|
+
return
|
|
304
|
+
self.paymasterAndData.length < 62 + sigSize
|
|
305
|
+
? Calldata.emptyBytes()
|
|
306
|
+
: self.paymasterAndData[sigEnd - sigSize:sigEnd];
|
|
307
|
+
}
|
|
308
|
+
|
|
309
|
+
/**
|
|
310
|
+
* @dev Returns the size of the paymaster signature in `paymasterAndData` (EntryPoint v0.9+).
|
|
311
|
+
* Does not check minimum length of `paymasterAndData`.
|
|
312
|
+
*/
|
|
313
|
+
function _paymasterSignatureSize(PackedUserOperation calldata self) private pure returns (uint256) {
|
|
314
|
+
return
|
|
315
|
+
uint16(bytes2(self.paymasterAndData[self.paymasterAndData.length - 10:self.paymasterAndData.length - 8]));
|
|
316
|
+
}
|
|
317
|
+
}
|
|
@@ -0,0 +1,314 @@
|
|
|
1
|
+
// SPDX-License-Identifier: MIT
|
|
2
|
+
// OpenZeppelin Contracts (last updated v5.8.0) (account/utils/draft-ERC7579Utils.sol)
|
|
3
|
+
|
|
4
|
+
pragma solidity ^0.8.20;
|
|
5
|
+
|
|
6
|
+
import {Execution} from "../../interfaces/draft-IERC7579.sol";
|
|
7
|
+
import {Address} from "../../utils/Address.sol";
|
|
8
|
+
import {Packing} from "../../utils/Packing.sol";
|
|
9
|
+
|
|
10
|
+
type Mode is bytes32;
|
|
11
|
+
type CallType is bytes1;
|
|
12
|
+
type ExecType is bytes1;
|
|
13
|
+
type ModeSelector is bytes4;
|
|
14
|
+
type ModePayload is bytes22;
|
|
15
|
+
|
|
16
|
+
/**
|
|
17
|
+
* @dev Library with common ERC-7579 utility functions.
|
|
18
|
+
*
|
|
19
|
+
* See https://eips.ethereum.org/EIPS/eip-7579[ERC-7579].
|
|
20
|
+
*/
|
|
21
|
+
// slither-disable-next-line unused-state
|
|
22
|
+
library ERC7579Utils {
|
|
23
|
+
using Packing for *;
|
|
24
|
+
|
|
25
|
+
/// @dev A single `call` execution.
|
|
26
|
+
CallType internal constant CALLTYPE_SINGLE = CallType.wrap(0x00);
|
|
27
|
+
|
|
28
|
+
/// @dev A batch of `call` executions.
|
|
29
|
+
CallType internal constant CALLTYPE_BATCH = CallType.wrap(0x01);
|
|
30
|
+
|
|
31
|
+
/// @dev A `delegatecall` execution.
|
|
32
|
+
CallType internal constant CALLTYPE_DELEGATECALL = CallType.wrap(0xFF);
|
|
33
|
+
|
|
34
|
+
/// @dev Default execution type that reverts on failure.
|
|
35
|
+
ExecType internal constant EXECTYPE_DEFAULT = ExecType.wrap(0x00);
|
|
36
|
+
|
|
37
|
+
/// @dev Execution type that does not revert on failure.
|
|
38
|
+
ExecType internal constant EXECTYPE_TRY = ExecType.wrap(0x01);
|
|
39
|
+
|
|
40
|
+
/**
|
|
41
|
+
* @dev Emits when an {EXECTYPE_TRY} execution fails.
|
|
42
|
+
* @param batchExecutionIndex The index of the failed call in the execution batch.
|
|
43
|
+
* @param returndata The returned data from the failed call.
|
|
44
|
+
*/
|
|
45
|
+
event ERC7579TryExecuteFail(uint256 batchExecutionIndex, bytes returndata);
|
|
46
|
+
|
|
47
|
+
/// @dev The provided {CallType} is not supported.
|
|
48
|
+
error ERC7579UnsupportedCallType(CallType callType);
|
|
49
|
+
|
|
50
|
+
/// @dev The provided {ExecType} is not supported.
|
|
51
|
+
error ERC7579UnsupportedExecType(ExecType execType);
|
|
52
|
+
|
|
53
|
+
/// @dev The provided module doesn't match the provided module type.
|
|
54
|
+
error ERC7579MismatchedModuleTypeId(uint256 moduleTypeId, address module);
|
|
55
|
+
|
|
56
|
+
/// @dev The module is not installed.
|
|
57
|
+
error ERC7579UninstalledModule(uint256 moduleTypeId, address module);
|
|
58
|
+
|
|
59
|
+
/// @dev The module is already installed.
|
|
60
|
+
error ERC7579AlreadyInstalledModule(uint256 moduleTypeId, address module);
|
|
61
|
+
|
|
62
|
+
/// @dev The module type is not supported.
|
|
63
|
+
error ERC7579UnsupportedModuleType(uint256 moduleTypeId);
|
|
64
|
+
|
|
65
|
+
/// @dev Input calldata not properly formatted and possibly malicious.
|
|
66
|
+
error ERC7579DecodingError();
|
|
67
|
+
|
|
68
|
+
/// @dev Executes a single call.
|
|
69
|
+
function execSingle(
|
|
70
|
+
bytes calldata executionCalldata,
|
|
71
|
+
ExecType execType
|
|
72
|
+
) internal returns (bytes[] memory returnData) {
|
|
73
|
+
(address target, uint256 value, bytes calldata callData) = decodeSingle(executionCalldata);
|
|
74
|
+
returnData = new bytes[](1);
|
|
75
|
+
returnData[0] = _call(0, execType, target, value, callData);
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
/// @dev Executes a batch of calls.
|
|
79
|
+
function execBatch(
|
|
80
|
+
bytes calldata executionCalldata,
|
|
81
|
+
ExecType execType
|
|
82
|
+
) internal returns (bytes[] memory returnData) {
|
|
83
|
+
Execution[] calldata executionBatch = decodeBatch(executionCalldata);
|
|
84
|
+
returnData = new bytes[](executionBatch.length);
|
|
85
|
+
for (uint256 i = 0; i < executionBatch.length; ++i) {
|
|
86
|
+
returnData[i] = _call(
|
|
87
|
+
i,
|
|
88
|
+
execType,
|
|
89
|
+
executionBatch[i].target,
|
|
90
|
+
executionBatch[i].value,
|
|
91
|
+
executionBatch[i].callData
|
|
92
|
+
);
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
/// @dev Executes a delegate call.
|
|
97
|
+
function execDelegateCall(
|
|
98
|
+
bytes calldata executionCalldata,
|
|
99
|
+
ExecType execType
|
|
100
|
+
) internal returns (bytes[] memory returnData) {
|
|
101
|
+
(address target, bytes calldata callData) = decodeDelegate(executionCalldata);
|
|
102
|
+
returnData = new bytes[](1);
|
|
103
|
+
returnData[0] = _delegatecall(0, execType, target, callData);
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
/// @dev Encodes the mode with the provided parameters. See {decodeMode}.
|
|
107
|
+
function encodeMode(
|
|
108
|
+
CallType callType,
|
|
109
|
+
ExecType execType,
|
|
110
|
+
ModeSelector selector,
|
|
111
|
+
ModePayload payload
|
|
112
|
+
) internal pure returns (Mode mode) {
|
|
113
|
+
return
|
|
114
|
+
Mode.wrap(
|
|
115
|
+
CallType
|
|
116
|
+
.unwrap(callType)
|
|
117
|
+
.pack_1_1(ExecType.unwrap(execType))
|
|
118
|
+
.pack_2_4(bytes4(0))
|
|
119
|
+
.pack_6_4(ModeSelector.unwrap(selector))
|
|
120
|
+
.pack_10_22(ModePayload.unwrap(payload))
|
|
121
|
+
);
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
/// @dev Decodes the mode into its parameters. See {encodeMode}.
|
|
125
|
+
function decodeMode(
|
|
126
|
+
Mode mode
|
|
127
|
+
) internal pure returns (CallType callType, ExecType execType, ModeSelector selector, ModePayload payload) {
|
|
128
|
+
return (
|
|
129
|
+
CallType.wrap(Packing.extract_32_1(Mode.unwrap(mode), 0x00)),
|
|
130
|
+
ExecType.wrap(Packing.extract_32_1(Mode.unwrap(mode), 0x01)),
|
|
131
|
+
ModeSelector.wrap(Packing.extract_32_4(Mode.unwrap(mode), 0x06)),
|
|
132
|
+
ModePayload.wrap(Packing.extract_32_22(Mode.unwrap(mode), 0x0a))
|
|
133
|
+
);
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
/// @dev Encodes a single call execution. See {decodeSingle}.
|
|
137
|
+
function encodeSingle(
|
|
138
|
+
address target,
|
|
139
|
+
uint256 value,
|
|
140
|
+
bytes calldata callData
|
|
141
|
+
) internal pure returns (bytes memory executionCalldata) {
|
|
142
|
+
return abi.encodePacked(target, value, callData);
|
|
143
|
+
}
|
|
144
|
+
|
|
145
|
+
/// @dev Decodes a single call execution. See {encodeSingle}.
|
|
146
|
+
function decodeSingle(
|
|
147
|
+
bytes calldata executionCalldata
|
|
148
|
+
) internal pure returns (address target, uint256 value, bytes calldata callData) {
|
|
149
|
+
target = address(bytes20(executionCalldata));
|
|
150
|
+
value = uint256(bytes32(executionCalldata[20:52]));
|
|
151
|
+
callData = executionCalldata[52:];
|
|
152
|
+
}
|
|
153
|
+
|
|
154
|
+
/// @dev Encodes a delegate call execution. See {decodeDelegate}.
|
|
155
|
+
function encodeDelegate(
|
|
156
|
+
address target,
|
|
157
|
+
bytes calldata callData
|
|
158
|
+
) internal pure returns (bytes memory executionCalldata) {
|
|
159
|
+
return abi.encodePacked(target, callData);
|
|
160
|
+
}
|
|
161
|
+
|
|
162
|
+
/// @dev Decodes a delegate call execution. See {encodeDelegate}.
|
|
163
|
+
function decodeDelegate(
|
|
164
|
+
bytes calldata executionCalldata
|
|
165
|
+
) internal pure returns (address target, bytes calldata callData) {
|
|
166
|
+
target = address(bytes20(executionCalldata));
|
|
167
|
+
callData = executionCalldata[20:];
|
|
168
|
+
}
|
|
169
|
+
|
|
170
|
+
/// @dev Encodes a batch of executions. See {decodeBatch}.
|
|
171
|
+
function encodeBatch(Execution[] memory executionBatch) internal pure returns (bytes memory executionCalldata) {
|
|
172
|
+
return abi.encode(executionBatch);
|
|
173
|
+
}
|
|
174
|
+
|
|
175
|
+
/// @dev Decodes a batch of executions. See {encodeBatch}.
|
|
176
|
+
///
|
|
177
|
+
/// NOTE: This function runs some checks and will throw a {ERC7579DecodingError} if the input is not properly formatted.
|
|
178
|
+
function decodeBatch(bytes calldata executionCalldata) internal pure returns (Execution[] calldata executionBatch) {
|
|
179
|
+
unchecked {
|
|
180
|
+
uint256 bufferPtr;
|
|
181
|
+
uint256 bufferLength;
|
|
182
|
+
assembly ("memory-safe") {
|
|
183
|
+
bufferPtr := executionCalldata.offset
|
|
184
|
+
bufferLength := executionCalldata.length
|
|
185
|
+
}
|
|
186
|
+
|
|
187
|
+
// Check executionCalldata is not empty.
|
|
188
|
+
if (bufferLength < 0x20) revert ERC7579DecodingError();
|
|
189
|
+
|
|
190
|
+
// Get the offset of the array (pointer to the array length).
|
|
191
|
+
uint256 arrayLengthOffset = uint256(bytes32(executionCalldata[0x00:0x20]));
|
|
192
|
+
|
|
193
|
+
// The array length (at arrayLengthOffset) should be 32 bytes long. We check that this is within the
|
|
194
|
+
// buffer bounds. Since we know bufferLength is at least 32, we can subtract with no overflow risk.
|
|
195
|
+
if (arrayLengthOffset > bufferLength - 0x20) revert ERC7579DecodingError();
|
|
196
|
+
|
|
197
|
+
// Get the array length. arrayLengthOffset + 32 is bounded by bufferLength so it does not overflow.
|
|
198
|
+
uint256 arrayLength = uint256(bytes32(executionCalldata[arrayLengthOffset:arrayLengthOffset + 0x20]));
|
|
199
|
+
|
|
200
|
+
// Check that the buffer is long enough to store the array elements as "offset pointer":
|
|
201
|
+
// - each element of the array is an "offset pointer" to the data.
|
|
202
|
+
// - each "offset pointer" (to an array element) takes 32 bytes.
|
|
203
|
+
// - validity of the calldata at that location is checked when the array element is accessed, so we only
|
|
204
|
+
// need to check that the buffer is large enough to hold the pointers.
|
|
205
|
+
//
|
|
206
|
+
// Since we know bufferLength is at least arrayLengthOffset + 32, we can subtract with no overflow risk.
|
|
207
|
+
// Solidity limits length of such arrays to 2**64-1, this guarantees `arrayLength * 32` does not overflow.
|
|
208
|
+
if (arrayLength > type(uint64).max || bufferLength - arrayLengthOffset - 0x20 < arrayLength * 0x20)
|
|
209
|
+
revert ERC7579DecodingError();
|
|
210
|
+
|
|
211
|
+
assembly ("memory-safe") {
|
|
212
|
+
executionBatch.offset := add(add(bufferPtr, arrayLengthOffset), 0x20)
|
|
213
|
+
executionBatch.length := arrayLength
|
|
214
|
+
}
|
|
215
|
+
|
|
216
|
+
_validateCalldataBound(executionBatch, bufferPtr + bufferLength);
|
|
217
|
+
}
|
|
218
|
+
}
|
|
219
|
+
|
|
220
|
+
/**
|
|
221
|
+
* @dev Calldata sanity check
|
|
222
|
+
*
|
|
223
|
+
* Solidity performs "lazy" verification that all calldata objects are valid, by checking that they are
|
|
224
|
+
* within calldatasize. This check is performed when objects are dereferenced. If the `executionCalldata`
|
|
225
|
+
* is not the last element (buffer) in msg.data, this check will not detect potentially ill-formed objects
|
|
226
|
+
* that point to the memory space between the end of the `executionCalldata` buffer.
|
|
227
|
+
* If we are in a situation where the lazy checks are not sufficient, we do an in-depth traversal of the
|
|
228
|
+
* array, checking that everything is valid.
|
|
229
|
+
*/
|
|
230
|
+
function _validateCalldataBound(Execution[] calldata executionBatch, uint256 bound) private pure {
|
|
231
|
+
if (bound < msg.data.length) {
|
|
232
|
+
for (uint256 i = 0; i < executionBatch.length; ++i) {
|
|
233
|
+
Execution calldata item = executionBatch[i];
|
|
234
|
+
bytes calldata itemCalldata = item.callData;
|
|
235
|
+
|
|
236
|
+
uint256 itemEnd;
|
|
237
|
+
uint256 itemCalldataEnd;
|
|
238
|
+
assembly ("memory-safe") {
|
|
239
|
+
itemEnd := add(item, 0x60)
|
|
240
|
+
itemCalldataEnd := add(itemCalldata.offset, itemCalldata.length)
|
|
241
|
+
}
|
|
242
|
+
if (itemEnd > bound || itemCalldataEnd > bound) revert ERC7579DecodingError();
|
|
243
|
+
}
|
|
244
|
+
}
|
|
245
|
+
}
|
|
246
|
+
|
|
247
|
+
/// @dev Executes a `call` to the target with the provided {ExecType}.
|
|
248
|
+
function _call(
|
|
249
|
+
uint256 index,
|
|
250
|
+
ExecType execType,
|
|
251
|
+
address target,
|
|
252
|
+
uint256 value,
|
|
253
|
+
bytes calldata data
|
|
254
|
+
) private returns (bytes memory) {
|
|
255
|
+
(bool success, bytes memory returndata) = (target == address(0) ? address(this) : target).call{value: value}(
|
|
256
|
+
data
|
|
257
|
+
);
|
|
258
|
+
return _validateExecutionMode(index, execType, success, returndata);
|
|
259
|
+
}
|
|
260
|
+
|
|
261
|
+
/// @dev Executes a `delegatecall` to the target with the provided {ExecType}.
|
|
262
|
+
function _delegatecall(
|
|
263
|
+
uint256 index,
|
|
264
|
+
ExecType execType,
|
|
265
|
+
address target,
|
|
266
|
+
bytes calldata data
|
|
267
|
+
) private returns (bytes memory) {
|
|
268
|
+
(bool success, bytes memory returndata) = (target == address(0) ? address(this) : target).delegatecall(data);
|
|
269
|
+
return _validateExecutionMode(index, execType, success, returndata);
|
|
270
|
+
}
|
|
271
|
+
|
|
272
|
+
/// @dev Validates the execution mode and returns the returndata.
|
|
273
|
+
function _validateExecutionMode(
|
|
274
|
+
uint256 index,
|
|
275
|
+
ExecType execType,
|
|
276
|
+
bool success,
|
|
277
|
+
bytes memory returndata
|
|
278
|
+
) private returns (bytes memory) {
|
|
279
|
+
if (execType == ERC7579Utils.EXECTYPE_DEFAULT) {
|
|
280
|
+
Address.verifyCallResult(success, returndata);
|
|
281
|
+
} else if (execType == ERC7579Utils.EXECTYPE_TRY) {
|
|
282
|
+
if (!success) emit ERC7579TryExecuteFail(index, returndata);
|
|
283
|
+
} else {
|
|
284
|
+
revert ERC7579UnsupportedExecType(execType);
|
|
285
|
+
}
|
|
286
|
+
return returndata;
|
|
287
|
+
}
|
|
288
|
+
}
|
|
289
|
+
|
|
290
|
+
// Operators
|
|
291
|
+
using {eqCallType as ==} for CallType global;
|
|
292
|
+
using {eqExecType as ==} for ExecType global;
|
|
293
|
+
using {eqModeSelector as ==} for ModeSelector global;
|
|
294
|
+
using {eqModePayload as ==} for ModePayload global;
|
|
295
|
+
|
|
296
|
+
/// @dev Compares two `CallType` values for equality.
|
|
297
|
+
function eqCallType(CallType a, CallType b) pure returns (bool) {
|
|
298
|
+
return CallType.unwrap(a) == CallType.unwrap(b);
|
|
299
|
+
}
|
|
300
|
+
|
|
301
|
+
/// @dev Compares two `ExecType` values for equality.
|
|
302
|
+
function eqExecType(ExecType a, ExecType b) pure returns (bool) {
|
|
303
|
+
return ExecType.unwrap(a) == ExecType.unwrap(b);
|
|
304
|
+
}
|
|
305
|
+
|
|
306
|
+
/// @dev Compares two `ModeSelector` values for equality.
|
|
307
|
+
function eqModeSelector(ModeSelector a, ModeSelector b) pure returns (bool) {
|
|
308
|
+
return ModeSelector.unwrap(a) == ModeSelector.unwrap(b);
|
|
309
|
+
}
|
|
310
|
+
|
|
311
|
+
/// @dev Compares two `ModePayload` values for equality.
|
|
312
|
+
function eqModePayload(ModePayload a, ModePayload b) pure returns (bool) {
|
|
313
|
+
return ModePayload.unwrap(a) == ModePayload.unwrap(b);
|
|
314
|
+
}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
{
|
|
2
|
+
"_format": "hh3-artifact-1",
|
|
3
|
+
"contractName": "AbstractSigner",
|
|
4
|
+
"sourceName": "contracts/utils/cryptography/signers/AbstractSigner.sol",
|
|
5
|
+
"abi": [],
|
|
6
|
+
"bytecode": "0x",
|
|
7
|
+
"deployedBytecode": "0x",
|
|
8
|
+
"linkReferences": {},
|
|
9
|
+
"deployedLinkReferences": {},
|
|
10
|
+
"immutableReferences": {},
|
|
11
|
+
"inputSourceName": "project/contracts/utils/cryptography/signers/AbstractSigner.sol",
|
|
12
|
+
"buildInfoId": "solc-0_8_35-c2903afec1b369cf73b6885b12c338655542e5ad"
|
|
13
|
+
}
|