@rarible/external-contracts 3.11.4
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/LICENSE.md +201 -0
- package/README.md +144 -0
- package/contracts/base/ERC1155Base.sol +282 -0
- package/contracts/base/ERC1155DelayedReveal.sol +117 -0
- package/contracts/base/ERC1155Drop.sol +368 -0
- package/contracts/base/ERC1155LazyMint.sol +286 -0
- package/contracts/base/ERC1155SignatureMint.sol +132 -0
- package/contracts/base/ERC20Base.sol +111 -0
- package/contracts/base/ERC20Drop.sol +157 -0
- package/contracts/base/ERC20DropVote.sol +135 -0
- package/contracts/base/ERC20SignatureMint.sol +100 -0
- package/contracts/base/ERC20SignatureMintVote.sol +107 -0
- package/contracts/base/ERC20Vote.sol +111 -0
- package/contracts/base/ERC721Base.sol +210 -0
- package/contracts/base/ERC721DelayedReveal.sol +118 -0
- package/contracts/base/ERC721Drop.sol +312 -0
- package/contracts/base/ERC721LazyMint.sol +219 -0
- package/contracts/base/ERC721Multiwrap.sol +262 -0
- package/contracts/base/ERC721SignatureMint.sol +120 -0
- package/contracts/base/Staking1155Base.sol +189 -0
- package/contracts/base/Staking20Base.sol +179 -0
- package/contracts/base/Staking721Base.sol +186 -0
- package/contracts/eip/ERC1155.sol +294 -0
- package/contracts/eip/ERC1271.sol +18 -0
- package/contracts/eip/ERC165.sol +29 -0
- package/contracts/eip/ERC721A.sol +580 -0
- package/contracts/eip/ERC721AUpgradeable.sol +625 -0
- package/contracts/eip/ERC721AVirtualApprove.sol +582 -0
- package/contracts/eip/ERC721AVirtualApproveUpgradeable.sol +598 -0
- package/contracts/eip/interface/IERC1155.sol +132 -0
- package/contracts/eip/interface/IERC1155Enumerable.sol +11 -0
- package/contracts/eip/interface/IERC1155Metadata.sol +15 -0
- package/contracts/eip/interface/IERC1155Receiver.sol +58 -0
- package/contracts/eip/interface/IERC1155Supply.sol +11 -0
- package/contracts/eip/interface/IERC165.sol +25 -0
- package/contracts/eip/interface/IERC20.sol +24 -0
- package/contracts/eip/interface/IERC20Metadata.sol +14 -0
- package/contracts/eip/interface/IERC20Permit.sol +60 -0
- package/contracts/eip/interface/IERC2981.sol +23 -0
- package/contracts/eip/interface/IERC4906.sol +17 -0
- package/contracts/eip/interface/IERC721.sol +128 -0
- package/contracts/eip/interface/IERC721A.sol +109 -0
- package/contracts/eip/interface/IERC721Enumerable.sol +24 -0
- package/contracts/eip/interface/IERC721Metadata.sol +20 -0
- package/contracts/eip/interface/IERC721Receiver.sol +27 -0
- package/contracts/eip/interface/IERC721Supply.sol +13 -0
- package/contracts/eip/queryable/ERC721AQueryable.sol +168 -0
- package/contracts/eip/queryable/ERC721AQueryableUpgradeable.sol +193 -0
- package/contracts/eip/queryable/ERC721AStorage.sol +57 -0
- package/contracts/eip/queryable/ERC721AUpgradeable.sol +1075 -0
- package/contracts/eip/queryable/ERC721A__Initializable.sol +75 -0
- package/contracts/eip/queryable/ERC721A__InitializableStorage.sol +29 -0
- package/contracts/eip/queryable/IERC721AQueryable.sol +69 -0
- package/contracts/eip/queryable/IERC721AQueryableUpgradeable.sol +69 -0
- package/contracts/eip/queryable/IERC721AUpgradeable.sol +269 -0
- package/contracts/extension/AppURI.sol +37 -0
- package/contracts/extension/BatchMintMetadata.sol +143 -0
- package/contracts/extension/BurnToClaim.sol +60 -0
- package/contracts/extension/ContractMetadata.sol +48 -0
- package/contracts/extension/DelayedReveal.sol +111 -0
- package/contracts/extension/Drop.sol +284 -0
- package/contracts/extension/Drop1155.sol +300 -0
- package/contracts/extension/DropSinglePhase.sol +237 -0
- package/contracts/extension/DropSinglePhase1155.sol +215 -0
- package/contracts/extension/Initializable.sol +136 -0
- package/contracts/extension/LazyMint.sol +56 -0
- package/contracts/extension/LazyMintWithTier.sol +112 -0
- package/contracts/extension/Multicall.sol +40 -0
- package/contracts/extension/NFTMetadata.sol +58 -0
- package/contracts/extension/OperatorFilterToggle.sol +22 -0
- package/contracts/extension/OperatorFilterer.sol +73 -0
- package/contracts/extension/OperatorFiltererUpgradeable.sol +69 -0
- package/contracts/extension/Ownable.sol +58 -0
- package/contracts/extension/Permissions.sol +159 -0
- package/contracts/extension/PermissionsEnumerable.sol +111 -0
- package/contracts/extension/PlatformFee.sol +117 -0
- package/contracts/extension/PrimarySale.sol +57 -0
- package/contracts/extension/Proxy.sol +84 -0
- package/contracts/extension/ProxyForUpgradeable.sol +32 -0
- package/contracts/extension/Royalty.sol +134 -0
- package/contracts/extension/SeaportEIP1271.sol +88 -0
- package/contracts/extension/SeaportOrderParser.sol +550 -0
- package/contracts/extension/SharedMetadata.sol +63 -0
- package/contracts/extension/SignatureAction.sol +67 -0
- package/contracts/extension/SignatureActionUpgradeable.sol +71 -0
- package/contracts/extension/SignatureMintERC1155.sol +78 -0
- package/contracts/extension/SignatureMintERC1155Upgradeable.sol +84 -0
- package/contracts/extension/SignatureMintERC20.sol +70 -0
- package/contracts/extension/SignatureMintERC20Upgradeable.sol +77 -0
- package/contracts/extension/SignatureMintERC721.sol +96 -0
- package/contracts/extension/SignatureMintERC721Upgradeable.sol +102 -0
- package/contracts/extension/SoulboundERC721A.sol +51 -0
- package/contracts/extension/Staking1155.sol +516 -0
- package/contracts/extension/Staking1155Upgradeable.sol +516 -0
- package/contracts/extension/Staking20.sol +376 -0
- package/contracts/extension/Staking20Upgradeable.sol +383 -0
- package/contracts/extension/Staking721.sol +362 -0
- package/contracts/extension/Staking721Upgradeable.sol +364 -0
- package/contracts/extension/TokenBundle.sol +130 -0
- package/contracts/extension/TokenStore.sol +97 -0
- package/contracts/extension/Upgradeable.sol +95 -0
- package/contracts/extension/interface/IAccountPermissions.sol +114 -0
- package/contracts/extension/interface/IAppURI.sol +24 -0
- package/contracts/extension/interface/IBurnToClaim.sol +43 -0
- package/contracts/extension/interface/IBurnableERC1155.sol +16 -0
- package/contracts/extension/interface/IBurnableERC20.sol +26 -0
- package/contracts/extension/interface/IBurnableERC721.sol +15 -0
- package/contracts/extension/interface/IClaimCondition.sol +48 -0
- package/contracts/extension/interface/IClaimConditionMultiPhase.sol +39 -0
- package/contracts/extension/interface/IClaimConditionsSinglePhase.sol +31 -0
- package/contracts/extension/interface/IClaimableERC1155.sol +39 -0
- package/contracts/extension/interface/IClaimableERC721.sol +37 -0
- package/contracts/extension/interface/IContractFactory.sol +20 -0
- package/contracts/extension/interface/IContractMetadata.sol +25 -0
- package/contracts/extension/interface/IDelayedReveal.sol +33 -0
- package/contracts/extension/interface/IDelayedRevealDeprecated.sol +38 -0
- package/contracts/extension/interface/IDrop.sol +72 -0
- package/contracts/extension/interface/IDrop1155.sol +75 -0
- package/contracts/extension/interface/IDropSinglePhase.sol +70 -0
- package/contracts/extension/interface/IDropSinglePhase1155.sol +74 -0
- package/contracts/extension/interface/IERC2771Context.sol +6 -0
- package/contracts/extension/interface/ILazyMint.sol +33 -0
- package/contracts/extension/interface/ILazyMintWithTier.sol +43 -0
- package/contracts/extension/interface/IMintableERC1155.sol +24 -0
- package/contracts/extension/interface/IMintableERC20.sol +20 -0
- package/contracts/extension/interface/IMintableERC721.sol +19 -0
- package/contracts/extension/interface/IMulticall.sol +16 -0
- package/contracts/extension/interface/INFTMetadata.sol +17 -0
- package/contracts/extension/interface/IOperatorFilterRegistry.sol +54 -0
- package/contracts/extension/interface/IOperatorFilterToggle.sol +12 -0
- package/contracts/extension/interface/IOwnable.sol +21 -0
- package/contracts/extension/interface/IPermissions.sol +88 -0
- package/contracts/extension/interface/IPermissionsEnumerable.sol +31 -0
- package/contracts/extension/interface/IPlatformFee.sol +33 -0
- package/contracts/extension/interface/IPrimarySale.sol +21 -0
- package/contracts/extension/interface/IRoyalty.sol +39 -0
- package/contracts/extension/interface/IRoyaltyEngineV1.sol +42 -0
- package/contracts/extension/interface/IRoyaltyPayments.sol +37 -0
- package/contracts/extension/interface/IRulesEngine.sol +58 -0
- package/contracts/extension/interface/ISharedMetadata.sol +30 -0
- package/contracts/extension/interface/ISharedMetadataBatch.sol +57 -0
- package/contracts/extension/interface/ISignatureAction.sol +44 -0
- package/contracts/extension/interface/ISignatureMintERC1155.sol +77 -0
- package/contracts/extension/interface/ISignatureMintERC20.sol +64 -0
- package/contracts/extension/interface/ISignatureMintERC721.sol +75 -0
- package/contracts/extension/interface/IStaking1155.sol +110 -0
- package/contracts/extension/interface/IStaking20.sol +97 -0
- package/contracts/extension/interface/IStaking721.sol +83 -0
- package/contracts/extension/interface/ITokenBundle.sol +52 -0
- package/contracts/extension/interface/plugin/IContext.sol +10 -0
- package/contracts/extension/interface/plugin/IPluginMap.sol +31 -0
- package/contracts/extension/interface/plugin/IRouter.sol +30 -0
- package/contracts/extension/plugin/ContractMetadataLogic.sol +52 -0
- package/contracts/extension/plugin/ContractMetadataStorage.sol +25 -0
- package/contracts/extension/plugin/ERC2771ContextConsumer.sol +34 -0
- package/contracts/extension/plugin/ERC2771ContextLogic.sol +43 -0
- package/contracts/extension/plugin/ERC2771ContextStorage.sol +22 -0
- package/contracts/extension/plugin/ERC2771ContextUpgradeableLogic.sol +47 -0
- package/contracts/extension/plugin/ERC2771ContextUpgradeableStorage.sol +20 -0
- package/contracts/extension/plugin/PermissionsEnumerableLogic.sol +101 -0
- package/contracts/extension/plugin/PermissionsEnumerableStorage.sol +41 -0
- package/contracts/extension/plugin/PermissionsLogic.sol +182 -0
- package/contracts/extension/plugin/PermissionsStorage.sol +28 -0
- package/contracts/extension/plugin/PlatformFeeLogic.sol +56 -0
- package/contracts/extension/plugin/PlatformFeeStorage.sol +28 -0
- package/contracts/extension/plugin/PluginMap.sol +81 -0
- package/contracts/extension/plugin/ReentrancyGuardLogic.sol +69 -0
- package/contracts/extension/plugin/ReentrancyGuardStorage.sol +22 -0
- package/contracts/extension/plugin/Router.sol +270 -0
- package/contracts/extension/plugin/RouterImmutable.sol +26 -0
- package/contracts/extension/plugin/RoyaltyPayments.sol +121 -0
- package/contracts/extension/upgradeable/AccountPermissions.sol +253 -0
- package/contracts/extension/upgradeable/BatchMintMetadata.sol +144 -0
- package/contracts/extension/upgradeable/BurnToClaim.sol +83 -0
- package/contracts/extension/upgradeable/ContractMetadata.sol +73 -0
- package/contracts/extension/upgradeable/DelayedReveal.sol +126 -0
- package/contracts/extension/upgradeable/Drop.sol +278 -0
- package/contracts/extension/upgradeable/ERC2771Context.sol +64 -0
- package/contracts/extension/upgradeable/ERC2771ContextConsumer.sol +32 -0
- package/contracts/extension/upgradeable/ERC2771ContextUpgradeable.sol +72 -0
- package/contracts/extension/upgradeable/Initializable.sol +110 -0
- package/contracts/extension/upgradeable/LazyMint.sol +77 -0
- package/contracts/extension/upgradeable/OperatorFilterToggle.sol +47 -0
- package/contracts/extension/upgradeable/OperatorFiltererUpgradeable.sol +58 -0
- package/contracts/extension/upgradeable/Ownable.sol +75 -0
- package/contracts/extension/upgradeable/Permissions.sol +197 -0
- package/contracts/extension/upgradeable/PermissionsEnumerable.sol +134 -0
- package/contracts/extension/upgradeable/PlatformFee.sol +131 -0
- package/contracts/extension/upgradeable/PrimarySale.sol +69 -0
- package/contracts/extension/upgradeable/ReentrancyGuard.sol +53 -0
- package/contracts/extension/upgradeable/Royalty.sol +144 -0
- package/contracts/extension/upgradeable/RoyaltyPayments.sol +121 -0
- package/contracts/extension/upgradeable/RulesEngine.sol +163 -0
- package/contracts/extension/upgradeable/SharedMetadataBatch.sol +98 -0
- package/contracts/extension/upgradeable/impl/ContractMetadataImpl.sol +34 -0
- package/contracts/extension/upgradeable/impl/MetaTx.sol +8 -0
- package/contracts/extension/upgradeable/impl/PermissionsEnumerableImpl.sol +28 -0
- package/contracts/extension/upgradeable/impl/PlatformFeeImpl.sol +34 -0
- package/contracts/extension/upgradeable/init/ContractMetadataInit.sol +17 -0
- package/contracts/extension/upgradeable/init/ERC2771ContextInit.sol +19 -0
- package/contracts/extension/upgradeable/init/ERC721AInit.sol +23 -0
- package/contracts/extension/upgradeable/init/ERC721AQueryableInit.sol +21 -0
- package/contracts/extension/upgradeable/init/OwnableInit.sol +18 -0
- package/contracts/extension/upgradeable/init/PermissionsEnumerableInit.sol +23 -0
- package/contracts/extension/upgradeable/init/PermissionsInit.sol +27 -0
- package/contracts/extension/upgradeable/init/PlatformFeeInit.sol +25 -0
- package/contracts/extension/upgradeable/init/PrimarySaleInit.sol +19 -0
- package/contracts/extension/upgradeable/init/ReentrancyGuardInit.sol +18 -0
- package/contracts/extension/upgradeable/init/RoyaltyInit.sol +22 -0
- package/contracts/external-deps/chainlink/LinkTokenInterface.sol +28 -0
- package/contracts/external-deps/chainlink/VRFV2WrapperConsumerBase.sol +83 -0
- package/contracts/external-deps/chainlink/VRFV2WrapperInterface.sol +35 -0
- package/contracts/external-deps/openzeppelin/ERC1155PresetUpgradeable.sol +160 -0
- package/contracts/external-deps/openzeppelin/cryptography/EIP712ChainlessDomain.sol +100 -0
- package/contracts/external-deps/openzeppelin/finance/PaymentSplitterUpgradeable.sol +231 -0
- package/contracts/external-deps/openzeppelin/governance/utils/IVotes.sol +54 -0
- package/contracts/external-deps/openzeppelin/metatx/ERC2771Context.sol +44 -0
- package/contracts/external-deps/openzeppelin/metatx/ERC2771ContextUpgradeable.sol +50 -0
- package/contracts/external-deps/openzeppelin/metatx/MinimalForwarderEOAOnly.sol +67 -0
- package/contracts/external-deps/openzeppelin/proxy/Clones.sol +88 -0
- package/contracts/external-deps/openzeppelin/proxy/ERC1967/ERC1967Proxy.sol +32 -0
- package/contracts/external-deps/openzeppelin/proxy/ERC1967/ERC1967Upgrade.sol +173 -0
- package/contracts/external-deps/openzeppelin/proxy/IERC1822Proxiable.sol +20 -0
- package/contracts/external-deps/openzeppelin/proxy/Proxy.sol +86 -0
- package/contracts/external-deps/openzeppelin/proxy/beacon/IBeacon.sol +16 -0
- package/contracts/external-deps/openzeppelin/proxy/utils/Initializable.sol +138 -0
- package/contracts/external-deps/openzeppelin/security/ReentrancyGuard.sol +32 -0
- package/contracts/external-deps/openzeppelin/security/ReentrancyGuardUpgradeable.sol +44 -0
- package/contracts/external-deps/openzeppelin/token/ERC1155/IERC1155Receiver.sol +58 -0
- package/contracts/external-deps/openzeppelin/token/ERC1155/utils/ERC1155Holder.sol +36 -0
- package/contracts/external-deps/openzeppelin/token/ERC1155/utils/ERC1155Receiver.sol +19 -0
- package/contracts/external-deps/openzeppelin/token/ERC20/ERC20.sol +359 -0
- package/contracts/external-deps/openzeppelin/token/ERC20/extensions/ERC20Permit.sol +117 -0
- package/contracts/external-deps/openzeppelin/token/ERC20/extensions/ERC20Votes.sol +246 -0
- package/contracts/external-deps/openzeppelin/token/ERC20/utils/SafeERC20.sol +78 -0
- package/contracts/external-deps/openzeppelin/token/ERC721/IERC721Receiver.sol +27 -0
- package/contracts/external-deps/openzeppelin/token/ERC721/utils/ERC721Holder.sol +23 -0
- package/contracts/external-deps/openzeppelin/utils/Base64.sol +92 -0
- package/contracts/external-deps/openzeppelin/utils/Context.sol +24 -0
- package/contracts/external-deps/openzeppelin/utils/Counters.sol +43 -0
- package/contracts/external-deps/openzeppelin/utils/Create2.sol +58 -0
- package/contracts/external-deps/openzeppelin/utils/ERC1155/ERC1155Holder.sol +36 -0
- package/contracts/external-deps/openzeppelin/utils/ERC1155/ERC1155Receiver.sol +19 -0
- package/contracts/external-deps/openzeppelin/utils/ERC721/ERC721Holder.sol +23 -0
- package/contracts/external-deps/openzeppelin/utils/EnumerableSet.sol +367 -0
- package/contracts/external-deps/openzeppelin/utils/cryptography/ECDSA.sol +217 -0
- package/contracts/external-deps/openzeppelin/utils/cryptography/EIP712.sol +104 -0
- package/contracts/external-deps/openzeppelin/utils/math/Math.sol +43 -0
- package/contracts/external-deps/openzeppelin/utils/math/SafeCast.sol +241 -0
- package/contracts/external-deps/openzeppelin/utils/math/SafeMath.sol +215 -0
- package/contracts/external-deps/openzeppelin/utils/structs/EnumerableSet.sol +367 -0
- package/contracts/infra/ContractPublisher.sol +268 -0
- package/contracts/infra/TWFactory.sol +140 -0
- package/contracts/infra/TWFee.sol +162 -0
- package/contracts/infra/TWMinimalFactory.sol +47 -0
- package/contracts/infra/TWMultichainRegistry.sol +116 -0
- package/contracts/infra/TWProxy.sol +42 -0
- package/contracts/infra/TWRegistry.sol +70 -0
- package/contracts/infra/TWStatelessFactory.sol +47 -0
- package/contracts/infra/forwarder/Forwarder.sol +76 -0
- package/contracts/infra/forwarder/ForwarderChainlessDomain.sol +90 -0
- package/contracts/infra/forwarder/ForwarderConsumer.sol +25 -0
- package/contracts/infra/forwarder/ForwarderEOAOnly.sol +23 -0
- package/contracts/infra/interface/IContractDeployer.sol +54 -0
- package/contracts/infra/interface/IContractPublisher.sol +128 -0
- package/contracts/infra/interface/ITWFee.sol +6 -0
- package/contracts/infra/interface/ITWMultichainRegistry.sol +28 -0
- package/contracts/infra/interface/ITWRegistry.sol +24 -0
- package/contracts/infra/interface/IThirdwebContract.sol +19 -0
- package/contracts/infra/interface/IWETH.sol +10 -0
- package/contracts/infra/registry/entrypoint/TWMultichainRegistryRouter.sol +61 -0
- package/contracts/infra/registry/registry-extension/TWMultichainRegistryLogic.sol +120 -0
- package/contracts/infra/registry/registry-extension/TWMultichainRegistryStorage.sol +30 -0
- package/contracts/legacy-contracts/extension/BatchMintMetadata_V1.sol +89 -0
- package/contracts/legacy-contracts/extension/DropSinglePhase1155_V1.sol +268 -0
- package/contracts/legacy-contracts/extension/DropSinglePhase_V1.sol +252 -0
- package/contracts/legacy-contracts/extension/LazyMintWithTier_V1.sol +112 -0
- package/contracts/legacy-contracts/extension/LazyMint_V1.sol +52 -0
- package/contracts/legacy-contracts/extension/PlatformFee_V1.sol +69 -0
- package/contracts/legacy-contracts/extension/PrimarySale_V1.sol +53 -0
- package/contracts/legacy-contracts/extension/interface/IClaimCondition_V1.sol +54 -0
- package/contracts/legacy-contracts/extension/interface/IDropSinglePhase1155_V1.sol +58 -0
- package/contracts/legacy-contracts/extension/interface/IDropSinglePhase_V1.sol +54 -0
- package/contracts/legacy-contracts/extension/interface/IPlatformFee_V1.sol +21 -0
- package/contracts/legacy-contracts/extension/interface/IPrimarySale_V1.sol +21 -0
- package/contracts/legacy-contracts/interface/ISignatureMintERC721_V1.sol +18 -0
- package/contracts/legacy-contracts/interface/drop/IDropClaimCondition_V2.sol +82 -0
- package/contracts/legacy-contracts/interface/drop/IDropERC1155_V2.sol +96 -0
- package/contracts/legacy-contracts/interface/drop/IDropERC20_V2.sol +73 -0
- package/contracts/legacy-contracts/interface/drop/IDropERC721_V3.sol +98 -0
- package/contracts/legacy-contracts/pre-builts/DropERC1155_V2.sol +731 -0
- package/contracts/legacy-contracts/pre-builts/DropERC20_V2.sol +521 -0
- package/contracts/legacy-contracts/pre-builts/DropERC721_V3.sol +745 -0
- package/contracts/legacy-contracts/pre-builts/SignatureDrop_V4.sol +360 -0
- package/contracts/legacy-contracts/smart-wallet/interface/IAccountPermissions_V1.sol +115 -0
- package/contracts/lib/Address.sol +244 -0
- package/contracts/lib/BitMaps.sol +52 -0
- package/contracts/lib/BytesLib.sol +18 -0
- package/contracts/lib/CurrencyTransferLib.sol +96 -0
- package/contracts/lib/FeeType.sol +10 -0
- package/contracts/lib/MerkleProof.sol +40 -0
- package/contracts/lib/NFTMetadataRenderer.sol +91 -0
- package/contracts/lib/StorageSlot.sol +54 -0
- package/contracts/lib/StringSet.sol +107 -0
- package/contracts/lib/Strings.sol +195 -0
- package/contracts/prebuilts/account/dynamic/DynamicAccount.sol +48 -0
- package/contracts/prebuilts/account/dynamic/DynamicAccountFactory.sol +61 -0
- package/contracts/prebuilts/account/interfaces/IAccount.sol +39 -0
- package/contracts/prebuilts/account/interfaces/IAccountCore.sol +11 -0
- package/contracts/prebuilts/account/interfaces/IAccountExecute.sol +17 -0
- package/contracts/prebuilts/account/interfaces/IAccountFactory.sol +16 -0
- package/contracts/prebuilts/account/interfaces/IAccountFactoryCore.sol +40 -0
- package/contracts/prebuilts/account/interfaces/IAggregator.sol +41 -0
- package/contracts/prebuilts/account/interfaces/IEntryPoint.sol +204 -0
- package/contracts/prebuilts/account/interfaces/INonceManager.sol +25 -0
- package/contracts/prebuilts/account/interfaces/IOracle.sol +10 -0
- package/contracts/prebuilts/account/interfaces/IPaymaster.sol +63 -0
- package/contracts/prebuilts/account/interfaces/IStakeManager.sol +94 -0
- package/contracts/prebuilts/account/interfaces/PackedUserOperation.sol +28 -0
- package/contracts/prebuilts/account/managed/ManagedAccount.sol +33 -0
- package/contracts/prebuilts/account/managed/ManagedAccountFactory.sol +68 -0
- package/contracts/prebuilts/account/non-upgradeable/Account.sol +169 -0
- package/contracts/prebuilts/account/non-upgradeable/AccountFactory.sol +54 -0
- package/contracts/prebuilts/account/token-bound-account/TokenBoundAccount.sol +252 -0
- package/contracts/prebuilts/account/token-bound-account/erc6551-utils/ERC6551AccountLib.sol +44 -0
- package/contracts/prebuilts/account/token-bound-account/erc6551-utils/ERC6551BytecodeLib.sol +20 -0
- package/contracts/prebuilts/account/token-bound-account/erc6551-utils/IERC6551Account.sol +51 -0
- package/contracts/prebuilts/account/token-paymaster/BasePaymaster.sol +151 -0
- package/contracts/prebuilts/account/token-paymaster/TokenPaymaster.sol +212 -0
- package/contracts/prebuilts/account/utils/AccountCore.sol +245 -0
- package/contracts/prebuilts/account/utils/AccountCoreStorage.sol +21 -0
- package/contracts/prebuilts/account/utils/AccountExtension.sol +172 -0
- package/contracts/prebuilts/account/utils/AccountSeaportBulkSigSupport.sol +40 -0
- package/contracts/prebuilts/account/utils/BaseAccount.sol +106 -0
- package/contracts/prebuilts/account/utils/BaseAccountFactory.sol +168 -0
- package/contracts/prebuilts/account/utils/EntryPoint.sol +725 -0
- package/contracts/prebuilts/account/utils/Exec.sol +56 -0
- package/contracts/prebuilts/account/utils/Helpers.sol +88 -0
- package/contracts/prebuilts/account/utils/NonceManager.sol +39 -0
- package/contracts/prebuilts/account/utils/OracleHelper.sol +154 -0
- package/contracts/prebuilts/account/utils/SenderCreator.sol +28 -0
- package/contracts/prebuilts/account/utils/StakeManager.sol +126 -0
- package/contracts/prebuilts/account/utils/TokenCallbackHandler.sol +55 -0
- package/contracts/prebuilts/account/utils/UniswapHelper.sol +119 -0
- package/contracts/prebuilts/account/utils/UserOperationLib.sol +127 -0
- package/contracts/prebuilts/airdrop/Airdrop.sol +616 -0
- package/contracts/prebuilts/drop/DropERC1155.sol +388 -0
- package/contracts/prebuilts/drop/DropERC20.sol +262 -0
- package/contracts/prebuilts/drop/DropERC721.sol +397 -0
- package/contracts/prebuilts/evolving-nfts/EvolvingNFT.sol +101 -0
- package/contracts/prebuilts/evolving-nfts/EvolvingNFTLogic.sol +251 -0
- package/contracts/prebuilts/evolving-nfts/extension/RulesEngineExtension.sol +26 -0
- package/contracts/prebuilts/interface/ILoyaltyCard.sol +27 -0
- package/contracts/prebuilts/interface/ILoyaltyPoints.sol +24 -0
- package/contracts/prebuilts/interface/IMultiwrap.sol +49 -0
- package/contracts/prebuilts/interface/IPack.sol +69 -0
- package/contracts/prebuilts/interface/IPackVRFDirect.sol +85 -0
- package/contracts/prebuilts/interface/airdrop/IAirdropERC1155.sol +45 -0
- package/contracts/prebuilts/interface/airdrop/IAirdropERC1155Claimable.sol +40 -0
- package/contracts/prebuilts/interface/airdrop/IAirdropERC20.sol +46 -0
- package/contracts/prebuilts/interface/airdrop/IAirdropERC20Claimable.sol +33 -0
- package/contracts/prebuilts/interface/airdrop/IAirdropERC721.sol +42 -0
- package/contracts/prebuilts/interface/airdrop/IAirdropERC721Claimable.sol +33 -0
- package/contracts/prebuilts/interface/drop/IDropClaimCondition.sol +82 -0
- package/contracts/prebuilts/interface/drop/IDropERC1155.sol +92 -0
- package/contracts/prebuilts/interface/drop/IDropERC20.sol +68 -0
- package/contracts/prebuilts/interface/drop/IDropERC721.sol +94 -0
- package/contracts/prebuilts/interface/marketplace/IMarketplace.sol +329 -0
- package/contracts/prebuilts/interface/staking/IEditionStake.sol +45 -0
- package/contracts/prebuilts/interface/staking/INFTStake.sol +45 -0
- package/contracts/prebuilts/interface/staking/ITokenStake.sol +46 -0
- package/contracts/prebuilts/interface/token/ITokenERC1155.sol +84 -0
- package/contracts/prebuilts/interface/token/ITokenERC20.sol +68 -0
- package/contracts/prebuilts/interface/token/ITokenERC721.sol +77 -0
- package/contracts/prebuilts/loyalty/LoyaltyCard.sol +339 -0
- package/contracts/prebuilts/marketplace/IMarketplace.sol +512 -0
- package/contracts/prebuilts/marketplace/direct-listings/DirectListingsLogic.sol +579 -0
- package/contracts/prebuilts/marketplace/direct-listings/DirectListingsStorage.sol +30 -0
- package/contracts/prebuilts/marketplace/english-auctions/EnglishAuctionsLogic.sol +546 -0
- package/contracts/prebuilts/marketplace/english-auctions/EnglishAuctionsStorage.sol +30 -0
- package/contracts/prebuilts/marketplace/entrypoint/MarketplaceV3.sol +184 -0
- package/contracts/prebuilts/marketplace/offers/OffersLogic.sol +358 -0
- package/contracts/prebuilts/marketplace/offers/OffersStorage.sol +28 -0
- package/contracts/prebuilts/marketplace-legacy/Marketplace.sol +907 -0
- package/contracts/prebuilts/multiwrap/Multiwrap.sol +264 -0
- package/contracts/prebuilts/open-edition/OpenEditionERC721.sol +268 -0
- package/contracts/prebuilts/open-edition/OpenEditionERC721FlatFee.sol +298 -0
- package/contracts/prebuilts/pack/Pack.sol +463 -0
- package/contracts/prebuilts/pack/PackVRFDirect.sol +516 -0
- package/contracts/prebuilts/signature-drop/SignatureDrop.sol +371 -0
- package/contracts/prebuilts/split/Split.sol +182 -0
- package/contracts/prebuilts/staking/EditionStake.sol +211 -0
- package/contracts/prebuilts/staking/NFTStake.sol +201 -0
- package/contracts/prebuilts/staking/TokenStake.sol +197 -0
- package/contracts/prebuilts/tiered-drop/TieredDrop.sol +607 -0
- package/contracts/prebuilts/token/TokenERC1155.sol +576 -0
- package/contracts/prebuilts/token/TokenERC20.sol +312 -0
- package/contracts/prebuilts/token/TokenERC721.sol +469 -0
- package/contracts/prebuilts/unaudited/airdrop/AirdropERC1155.sol +154 -0
- package/contracts/prebuilts/unaudited/airdrop/AirdropERC1155Claimable.sol +199 -0
- package/contracts/prebuilts/unaudited/airdrop/AirdropERC20.sol +194 -0
- package/contracts/prebuilts/unaudited/airdrop/AirdropERC20Claimable.sol +180 -0
- package/contracts/prebuilts/unaudited/airdrop/AirdropERC721.sol +143 -0
- package/contracts/prebuilts/unaudited/airdrop/AirdropERC721Claimable.sol +197 -0
- package/contracts/prebuilts/unaudited/burn-to-claim-drop/BurnToClaimDropERC721.sol +137 -0
- package/contracts/prebuilts/unaudited/burn-to-claim-drop/extension/BurnToClaimDrop721Logic.sol +362 -0
- package/contracts/prebuilts/unaudited/burn-to-claim-drop/extension/BurnToClaimDrop721Storage.sol +21 -0
- package/contracts/prebuilts/unaudited/contract-builder/CoreRouter.sol +60 -0
- package/contracts/prebuilts/unaudited/contract-builder/extension/PermissionOverride.sol +52 -0
- package/contracts/prebuilts/unaudited/loyalty/LoyaltyPoints.sol +249 -0
- package/contracts/prebuilts/vote/VoteERC20.sol +167 -0
- package/js/DropERC1155.d.ts +1198 -0
- package/js/DropERC1155.js +2 -0
- package/js/DropERC1155.js.map +1 -0
- package/js/DropERC721.d.ts +1247 -0
- package/js/DropERC721.js +2 -0
- package/js/DropERC721.js.map +1 -0
- package/js/OpenEditionERC721FlatFee.d.ts +1207 -0
- package/js/OpenEditionERC721FlatFee.js +2 -0
- package/js/OpenEditionERC721FlatFee.js.map +1 -0
- package/js/common.d.ts +22 -0
- package/js/common.js +2 -0
- package/js/common.js.map +1 -0
- package/js/factories/DropERC1155__factory.d.ts +1751 -0
- package/js/factories/DropERC1155__factory.js +2279 -0
- package/js/factories/DropERC1155__factory.js.map +1 -0
- package/js/factories/DropERC721__factory.d.ts +1826 -0
- package/js/factories/DropERC721__factory.js +2380 -0
- package/js/factories/DropERC721__factory.js.map +1 -0
- package/js/factories/OpenEditionERC721FlatFee__factory.d.ts +1707 -0
- package/js/factories/OpenEditionERC721FlatFee__factory.js +2219 -0
- package/js/factories/OpenEditionERC721FlatFee__factory.js.map +1 -0
- package/js/factories/index.d.ts +1 -0
- package/js/factories/index.js +5 -0
- package/js/factories/index.js.map +1 -0
- package/js/index.d.ts +3 -0
- package/js/index.js +3 -0
- package/js/index.js.map +1 -0
- package/package.json +74 -0
|
@@ -0,0 +1,270 @@
|
|
|
1
|
+
// SPDX-License-Identifier: Apache-2.0
|
|
2
|
+
pragma solidity ^0.8.0;
|
|
3
|
+
|
|
4
|
+
/// @author thirdweb
|
|
5
|
+
|
|
6
|
+
import "../interface/plugin/IRouter.sol";
|
|
7
|
+
import "../Multicall.sol";
|
|
8
|
+
import "../../eip/ERC165.sol";
|
|
9
|
+
import "../../external-deps/openzeppelin/utils/EnumerableSet.sol";
|
|
10
|
+
|
|
11
|
+
/**
|
|
12
|
+
* @author thirdweb.com
|
|
13
|
+
*/
|
|
14
|
+
library RouterStorage {
|
|
15
|
+
/// @custom:storage-location erc7201:router.storage
|
|
16
|
+
/// @dev keccak256(abi.encode(uint256(keccak256("router.storage")) - 1)) & ~bytes32(uint256(0xff))
|
|
17
|
+
bytes32 public constant ROUTER_STORAGE_POSITION =
|
|
18
|
+
0x012ef321094c8c682aa635dfdfcd754624a7473f08ad6ac415bb7f35eb12a100;
|
|
19
|
+
|
|
20
|
+
struct Data {
|
|
21
|
+
EnumerableSet.Bytes32Set allSelectors;
|
|
22
|
+
mapping(address => EnumerableSet.Bytes32Set) selectorsForPlugin;
|
|
23
|
+
mapping(bytes4 => IPluginMap.Plugin) pluginForSelector;
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
function routerStorage() internal pure returns (Data storage routerData) {
|
|
27
|
+
bytes32 position = ROUTER_STORAGE_POSITION;
|
|
28
|
+
assembly {
|
|
29
|
+
routerData.slot := position
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
abstract contract Router is Multicall, ERC165, IRouter {
|
|
35
|
+
using EnumerableSet for EnumerableSet.Bytes32Set;
|
|
36
|
+
/*///////////////////////////////////////////////////////////////
|
|
37
|
+
State variables
|
|
38
|
+
//////////////////////////////////////////////////////////////*/
|
|
39
|
+
|
|
40
|
+
address public immutable pluginMap;
|
|
41
|
+
|
|
42
|
+
/*///////////////////////////////////////////////////////////////
|
|
43
|
+
Constructor + initializer logic
|
|
44
|
+
//////////////////////////////////////////////////////////////*/
|
|
45
|
+
|
|
46
|
+
constructor(address _pluginMap) {
|
|
47
|
+
pluginMap = _pluginMap;
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
/*///////////////////////////////////////////////////////////////
|
|
51
|
+
ERC 165
|
|
52
|
+
//////////////////////////////////////////////////////////////*/
|
|
53
|
+
|
|
54
|
+
/**
|
|
55
|
+
* @dev See {IERC165-supportsInterface}.
|
|
56
|
+
*/
|
|
57
|
+
function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
|
|
58
|
+
return interfaceId == type(IRouter).interfaceId || super.supportsInterface(interfaceId);
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
/*///////////////////////////////////////////////////////////////
|
|
62
|
+
Generic contract logic
|
|
63
|
+
//////////////////////////////////////////////////////////////*/
|
|
64
|
+
|
|
65
|
+
fallback() external payable virtual {
|
|
66
|
+
address _pluginAddress = _getPluginForFunction(msg.sig);
|
|
67
|
+
if (_pluginAddress == address(0)) {
|
|
68
|
+
_pluginAddress = IPluginMap(pluginMap).getPluginForFunction(msg.sig);
|
|
69
|
+
}
|
|
70
|
+
_delegate(_pluginAddress);
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
receive() external payable {}
|
|
74
|
+
|
|
75
|
+
function _delegate(address implementation) internal virtual {
|
|
76
|
+
assembly {
|
|
77
|
+
// Copy msg.data. We take full control of memory in this inline assembly
|
|
78
|
+
// block because it will not return to Solidity code. We overwrite the
|
|
79
|
+
// Solidity scratch pad at memory position 0.
|
|
80
|
+
calldatacopy(0, 0, calldatasize())
|
|
81
|
+
|
|
82
|
+
// Call the implementation.
|
|
83
|
+
// out and outsize are 0 because we don't know the size yet.
|
|
84
|
+
let result := delegatecall(gas(), implementation, 0, calldatasize(), 0, 0)
|
|
85
|
+
|
|
86
|
+
// Copy the returned data.
|
|
87
|
+
returndatacopy(0, 0, returndatasize())
|
|
88
|
+
|
|
89
|
+
switch result
|
|
90
|
+
// delegatecall returns 0 on error.
|
|
91
|
+
case 0 {
|
|
92
|
+
revert(0, returndatasize())
|
|
93
|
+
}
|
|
94
|
+
default {
|
|
95
|
+
return(0, returndatasize())
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
/*///////////////////////////////////////////////////////////////
|
|
101
|
+
External functions
|
|
102
|
+
//////////////////////////////////////////////////////////////*/
|
|
103
|
+
|
|
104
|
+
/// @dev Add functionality to the contract.
|
|
105
|
+
function addPlugin(Plugin memory _plugin) external {
|
|
106
|
+
require(_canSetPlugin(), "Router: Not authorized");
|
|
107
|
+
|
|
108
|
+
_addPlugin(_plugin);
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
/// @dev Update or override existing functionality.
|
|
112
|
+
function updatePlugin(Plugin memory _plugin) external {
|
|
113
|
+
require(_canSetPlugin(), "Map: Not authorized");
|
|
114
|
+
|
|
115
|
+
_updatePlugin(_plugin);
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
/// @dev Remove existing functionality from the contract.
|
|
119
|
+
function removePlugin(bytes4 _selector) external {
|
|
120
|
+
require(_canSetPlugin(), "Map: Not authorized");
|
|
121
|
+
|
|
122
|
+
_removePlugin(_selector);
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
/*///////////////////////////////////////////////////////////////
|
|
126
|
+
View functions
|
|
127
|
+
//////////////////////////////////////////////////////////////*/
|
|
128
|
+
|
|
129
|
+
/// @dev View address of the plugged-in functionality contract for a given function signature.
|
|
130
|
+
function getPluginForFunction(bytes4 _selector) public view returns (address) {
|
|
131
|
+
address pluginAddress = _getPluginForFunction(_selector);
|
|
132
|
+
|
|
133
|
+
return pluginAddress != address(0) ? pluginAddress : IPluginMap(pluginMap).getPluginForFunction(_selector);
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
/// @dev View all funtionality as list of function signatures.
|
|
137
|
+
function getAllFunctionsOfPlugin(address _pluginAddress) external view returns (bytes4[] memory registered) {
|
|
138
|
+
RouterStorage.Data storage data = RouterStorage.routerStorage();
|
|
139
|
+
|
|
140
|
+
EnumerableSet.Bytes32Set storage selectorsForPlugin = data.selectorsForPlugin[_pluginAddress];
|
|
141
|
+
bytes4[] memory defaultSelectors = IPluginMap(pluginMap).getAllFunctionsOfPlugin(_pluginAddress);
|
|
142
|
+
|
|
143
|
+
uint256 len = defaultSelectors.length;
|
|
144
|
+
uint256 count = selectorsForPlugin.length() + defaultSelectors.length;
|
|
145
|
+
|
|
146
|
+
for (uint256 i = 0; i < len; i += 1) {
|
|
147
|
+
if (selectorsForPlugin.contains(defaultSelectors[i])) {
|
|
148
|
+
count -= 1;
|
|
149
|
+
defaultSelectors[i] = bytes4(0);
|
|
150
|
+
}
|
|
151
|
+
}
|
|
152
|
+
|
|
153
|
+
registered = new bytes4[](count);
|
|
154
|
+
uint256 index;
|
|
155
|
+
|
|
156
|
+
for (uint256 i = 0; i < len; i += 1) {
|
|
157
|
+
if (defaultSelectors[i] != bytes4(0)) {
|
|
158
|
+
registered[index++] = defaultSelectors[i];
|
|
159
|
+
}
|
|
160
|
+
}
|
|
161
|
+
|
|
162
|
+
len = selectorsForPlugin.length();
|
|
163
|
+
for (uint256 i = 0; i < len; i += 1) {
|
|
164
|
+
registered[index++] = bytes4(data.selectorsForPlugin[_pluginAddress].at(i));
|
|
165
|
+
}
|
|
166
|
+
}
|
|
167
|
+
|
|
168
|
+
/// @dev View all funtionality existing on the contract.
|
|
169
|
+
function getAllPlugins() external view returns (Plugin[] memory registered) {
|
|
170
|
+
RouterStorage.Data storage data = RouterStorage.routerStorage();
|
|
171
|
+
|
|
172
|
+
EnumerableSet.Bytes32Set storage overrideSelectors = data.allSelectors;
|
|
173
|
+
Plugin[] memory defaultPlugins = IPluginMap(pluginMap).getAllPlugins();
|
|
174
|
+
|
|
175
|
+
uint256 overrideSelectorsLen = overrideSelectors.length();
|
|
176
|
+
uint256 defaultPluginsLen = defaultPlugins.length;
|
|
177
|
+
|
|
178
|
+
uint256 totalCount = overrideSelectorsLen + defaultPluginsLen;
|
|
179
|
+
|
|
180
|
+
for (uint256 i = 0; i < overrideSelectorsLen; i += 1) {
|
|
181
|
+
for (uint256 j = 0; j < defaultPluginsLen; j += 1) {
|
|
182
|
+
if (bytes4(overrideSelectors.at(i)) == defaultPlugins[j].functionSelector) {
|
|
183
|
+
totalCount -= 1;
|
|
184
|
+
defaultPlugins[j].functionSelector = bytes4(0);
|
|
185
|
+
}
|
|
186
|
+
}
|
|
187
|
+
}
|
|
188
|
+
|
|
189
|
+
registered = new Plugin[](totalCount);
|
|
190
|
+
uint256 index;
|
|
191
|
+
|
|
192
|
+
for (uint256 i = 0; i < defaultPluginsLen; i += 1) {
|
|
193
|
+
if (defaultPlugins[i].functionSelector != bytes4(0)) {
|
|
194
|
+
registered[index] = defaultPlugins[i];
|
|
195
|
+
index += 1;
|
|
196
|
+
}
|
|
197
|
+
}
|
|
198
|
+
|
|
199
|
+
for (uint256 i = 0; i < overrideSelectorsLen; i += 1) {
|
|
200
|
+
registered[index] = data.pluginForSelector[bytes4(overrideSelectors.at(i))];
|
|
201
|
+
index += 1;
|
|
202
|
+
}
|
|
203
|
+
}
|
|
204
|
+
|
|
205
|
+
/*///////////////////////////////////////////////////////////////
|
|
206
|
+
Internal functions
|
|
207
|
+
//////////////////////////////////////////////////////////////*/
|
|
208
|
+
|
|
209
|
+
/// @dev View address of the plugged-in functionality contract for a given function signature.
|
|
210
|
+
function _getPluginForFunction(bytes4 _selector) public view returns (address) {
|
|
211
|
+
RouterStorage.Data storage data = RouterStorage.routerStorage();
|
|
212
|
+
address _pluginAddress = data.pluginForSelector[_selector].pluginAddress;
|
|
213
|
+
|
|
214
|
+
return _pluginAddress;
|
|
215
|
+
}
|
|
216
|
+
|
|
217
|
+
/// @dev Add functionality to the contract.
|
|
218
|
+
function _addPlugin(Plugin memory _plugin) internal {
|
|
219
|
+
RouterStorage.Data storage data = RouterStorage.routerStorage();
|
|
220
|
+
|
|
221
|
+
// Revert: default plugin exists for function; use updatePlugin instead.
|
|
222
|
+
try IPluginMap(pluginMap).getPluginForFunction(_plugin.functionSelector) returns (address) {
|
|
223
|
+
revert("Router: default plugin exists for function.");
|
|
224
|
+
} catch {
|
|
225
|
+
require(data.allSelectors.add(bytes32(_plugin.functionSelector)), "Router: plugin exists for function.");
|
|
226
|
+
}
|
|
227
|
+
|
|
228
|
+
require(
|
|
229
|
+
_plugin.functionSelector == bytes4(keccak256(abi.encodePacked(_plugin.functionSignature))),
|
|
230
|
+
"Router: fn selector and signature mismatch."
|
|
231
|
+
);
|
|
232
|
+
|
|
233
|
+
data.pluginForSelector[_plugin.functionSelector] = _plugin;
|
|
234
|
+
data.selectorsForPlugin[_plugin.pluginAddress].add(bytes32(_plugin.functionSelector));
|
|
235
|
+
|
|
236
|
+
emit PluginAdded(_plugin.functionSelector, _plugin.pluginAddress);
|
|
237
|
+
}
|
|
238
|
+
|
|
239
|
+
/// @dev Update or override existing functionality.
|
|
240
|
+
function _updatePlugin(Plugin memory _plugin) internal {
|
|
241
|
+
address currentPlugin = getPluginForFunction(_plugin.functionSelector);
|
|
242
|
+
require(
|
|
243
|
+
_plugin.functionSelector == bytes4(keccak256(abi.encodePacked(_plugin.functionSignature))),
|
|
244
|
+
"Router: fn selector and signature mismatch."
|
|
245
|
+
);
|
|
246
|
+
|
|
247
|
+
RouterStorage.Data storage data = RouterStorage.routerStorage();
|
|
248
|
+
data.allSelectors.add(bytes32(_plugin.functionSelector));
|
|
249
|
+
data.pluginForSelector[_plugin.functionSelector] = _plugin;
|
|
250
|
+
data.selectorsForPlugin[currentPlugin].remove(bytes32(_plugin.functionSelector));
|
|
251
|
+
data.selectorsForPlugin[_plugin.pluginAddress].add(bytes32(_plugin.functionSelector));
|
|
252
|
+
|
|
253
|
+
emit PluginUpdated(_plugin.functionSelector, currentPlugin, _plugin.pluginAddress);
|
|
254
|
+
}
|
|
255
|
+
|
|
256
|
+
/// @dev Remove existing functionality from the contract.
|
|
257
|
+
function _removePlugin(bytes4 _selector) internal {
|
|
258
|
+
RouterStorage.Data storage data = RouterStorage.routerStorage();
|
|
259
|
+
address currentPlugin = _getPluginForFunction(_selector);
|
|
260
|
+
require(currentPlugin != address(0), "Router: No plugin available for selector");
|
|
261
|
+
|
|
262
|
+
delete data.pluginForSelector[_selector];
|
|
263
|
+
data.allSelectors.remove(_selector);
|
|
264
|
+
data.selectorsForPlugin[currentPlugin].remove(bytes32(_selector));
|
|
265
|
+
|
|
266
|
+
emit PluginRemoved(_selector, currentPlugin);
|
|
267
|
+
}
|
|
268
|
+
|
|
269
|
+
function _canSetPlugin() internal view virtual returns (bool);
|
|
270
|
+
}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
// SPDX-License-Identifier: Apache-2.0
|
|
2
|
+
pragma solidity ^0.8.0;
|
|
3
|
+
|
|
4
|
+
/// @author thirdweb
|
|
5
|
+
|
|
6
|
+
import "./Router.sol";
|
|
7
|
+
|
|
8
|
+
/**
|
|
9
|
+
* @author thirdweb.com
|
|
10
|
+
*/
|
|
11
|
+
contract RouterImmutable is Router {
|
|
12
|
+
/*///////////////////////////////////////////////////////////////
|
|
13
|
+
Constructor + initializer logic
|
|
14
|
+
//////////////////////////////////////////////////////////////*/
|
|
15
|
+
|
|
16
|
+
constructor(address _pluginMap) Router(_pluginMap) {}
|
|
17
|
+
|
|
18
|
+
/*///////////////////////////////////////////////////////////////
|
|
19
|
+
Internal functions
|
|
20
|
+
//////////////////////////////////////////////////////////////*/
|
|
21
|
+
|
|
22
|
+
/// @dev Returns whether plug-in can be set in the given execution context.
|
|
23
|
+
function _canSetPlugin() internal pure override returns (bool) {
|
|
24
|
+
return false;
|
|
25
|
+
}
|
|
26
|
+
}
|
|
@@ -0,0 +1,121 @@
|
|
|
1
|
+
// SPDX-License-Identifier: Apache-2.0
|
|
2
|
+
pragma solidity ^0.8.0;
|
|
3
|
+
|
|
4
|
+
/// @author thirdweb
|
|
5
|
+
|
|
6
|
+
import "../interface/IRoyaltyPayments.sol";
|
|
7
|
+
import "../interface/IRoyaltyEngineV1.sol";
|
|
8
|
+
import { IERC2981 } from "../../eip/interface/IERC2981.sol";
|
|
9
|
+
|
|
10
|
+
library RoyaltyPaymentsStorage {
|
|
11
|
+
/// @custom:storage-location erc7201:royalty.payments.storage
|
|
12
|
+
/// @dev keccak256(abi.encode(uint256(keccak256("royalty.payments.storage")) - 1)) & ~bytes32(uint256(0xff))
|
|
13
|
+
bytes32 public constant ROYALTY_PAYMENTS_STORAGE_POSITION =
|
|
14
|
+
0xc802b338f3fb784853cf3c808df5ff08335200e394ea2c687d12571a91045000;
|
|
15
|
+
|
|
16
|
+
struct Data {
|
|
17
|
+
/// @dev The address of RoyaltyEngineV1, replacing the one set during construction.
|
|
18
|
+
address royaltyEngineAddressOverride;
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
function royaltyPaymentsStorage() internal pure returns (Data storage royaltyPaymentsData) {
|
|
22
|
+
bytes32 position = ROYALTY_PAYMENTS_STORAGE_POSITION;
|
|
23
|
+
assembly {
|
|
24
|
+
royaltyPaymentsData.slot := position
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
/**
|
|
30
|
+
* @author thirdweb.com
|
|
31
|
+
*
|
|
32
|
+
* @title Royalty Payments
|
|
33
|
+
* @notice Thirdweb's `RoyaltyPayments` is a contract extension to be used with a marketplace contract.
|
|
34
|
+
* It exposes functions for fetching royalty settings for a token.
|
|
35
|
+
* It Supports RoyaltyEngineV1 and RoyaltyRegistry by manifold.xyz.
|
|
36
|
+
*/
|
|
37
|
+
|
|
38
|
+
abstract contract RoyaltyPaymentsLogic is IRoyaltyPayments {
|
|
39
|
+
// solhint-disable-next-line var-name-mixedcase
|
|
40
|
+
address immutable ROYALTY_ENGINE_ADDRESS;
|
|
41
|
+
|
|
42
|
+
constructor(address _royaltyEngineAddress) {
|
|
43
|
+
// allow address(0) in case RoyaltyEngineV1 not present on a network
|
|
44
|
+
require(
|
|
45
|
+
_royaltyEngineAddress == address(0) ||
|
|
46
|
+
IERC165(_royaltyEngineAddress).supportsInterface(type(IRoyaltyEngineV1).interfaceId),
|
|
47
|
+
"Doesn't support IRoyaltyEngineV1 interface"
|
|
48
|
+
);
|
|
49
|
+
|
|
50
|
+
ROYALTY_ENGINE_ADDRESS = _royaltyEngineAddress;
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
/**
|
|
54
|
+
* Get the royalty for a given token (address, id) and value amount. Does not cache the bps/amounts. Caches the spec for a given token address
|
|
55
|
+
*
|
|
56
|
+
* @param tokenAddress - The address of the token
|
|
57
|
+
* @param tokenId - The id of the token
|
|
58
|
+
* @param value - The value you wish to get the royalty of
|
|
59
|
+
*
|
|
60
|
+
* returns Two arrays of equal length, royalty recipients and the corresponding amount each recipient should get
|
|
61
|
+
*/
|
|
62
|
+
function getRoyalty(
|
|
63
|
+
address tokenAddress,
|
|
64
|
+
uint256 tokenId,
|
|
65
|
+
uint256 value
|
|
66
|
+
) external returns (address payable[] memory recipients, uint256[] memory amounts) {
|
|
67
|
+
address royaltyEngineAddress = getRoyaltyEngineAddress();
|
|
68
|
+
|
|
69
|
+
if (royaltyEngineAddress == address(0)) {
|
|
70
|
+
try IERC2981(tokenAddress).royaltyInfo(tokenId, value) returns (address recipient, uint256 amount) {
|
|
71
|
+
require(amount < value, "Invalid royalty amount");
|
|
72
|
+
|
|
73
|
+
recipients = new address payable[](1);
|
|
74
|
+
amounts = new uint256[](1);
|
|
75
|
+
recipients[0] = payable(recipient);
|
|
76
|
+
amounts[0] = amount;
|
|
77
|
+
} catch {}
|
|
78
|
+
} else {
|
|
79
|
+
(recipients, amounts) = IRoyaltyEngineV1(royaltyEngineAddress).getRoyalty(tokenAddress, tokenId, value);
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
/**
|
|
84
|
+
* Set or override RoyaltyEngine address
|
|
85
|
+
*
|
|
86
|
+
* @param _royaltyEngineAddress - RoyaltyEngineV1 address
|
|
87
|
+
*/
|
|
88
|
+
function setRoyaltyEngine(address _royaltyEngineAddress) external {
|
|
89
|
+
if (!_canSetRoyaltyEngine()) {
|
|
90
|
+
revert("Not authorized");
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
require(
|
|
94
|
+
_royaltyEngineAddress != address(0) &&
|
|
95
|
+
IERC165(_royaltyEngineAddress).supportsInterface(type(IRoyaltyEngineV1).interfaceId),
|
|
96
|
+
"Doesn't support IRoyaltyEngineV1 interface"
|
|
97
|
+
);
|
|
98
|
+
|
|
99
|
+
_setupRoyaltyEngine(_royaltyEngineAddress);
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
/// @dev Returns original or overridden address for RoyaltyEngineV1
|
|
103
|
+
function getRoyaltyEngineAddress() public view returns (address royaltyEngineAddress) {
|
|
104
|
+
RoyaltyPaymentsStorage.Data storage data = RoyaltyPaymentsStorage.royaltyPaymentsStorage();
|
|
105
|
+
address royaltyEngineOverride = data.royaltyEngineAddressOverride;
|
|
106
|
+
royaltyEngineAddress = royaltyEngineOverride != address(0) ? royaltyEngineOverride : ROYALTY_ENGINE_ADDRESS;
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
/// @dev Lets a contract admin update the royalty engine address
|
|
110
|
+
function _setupRoyaltyEngine(address _royaltyEngineAddress) internal {
|
|
111
|
+
RoyaltyPaymentsStorage.Data storage data = RoyaltyPaymentsStorage.royaltyPaymentsStorage();
|
|
112
|
+
address currentAddress = data.royaltyEngineAddressOverride;
|
|
113
|
+
|
|
114
|
+
data.royaltyEngineAddressOverride = _royaltyEngineAddress;
|
|
115
|
+
|
|
116
|
+
emit RoyaltyEngineUpdated(currentAddress, _royaltyEngineAddress);
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
/// @dev Returns whether royalty engine address can be set in the given execution context.
|
|
120
|
+
function _canSetRoyaltyEngine() internal view virtual returns (bool);
|
|
121
|
+
}
|
|
@@ -0,0 +1,253 @@
|
|
|
1
|
+
// SPDX-License-Identifier: Apache-2.0
|
|
2
|
+
pragma solidity ^0.8.0;
|
|
3
|
+
|
|
4
|
+
/// @author thirdweb
|
|
5
|
+
|
|
6
|
+
import "../interface/IAccountPermissions.sol";
|
|
7
|
+
import "../../external-deps/openzeppelin/utils/cryptography/EIP712.sol";
|
|
8
|
+
import "../../external-deps/openzeppelin/utils/structs/EnumerableSet.sol";
|
|
9
|
+
|
|
10
|
+
library AccountPermissionsStorage {
|
|
11
|
+
/// @custom:storage-location erc7201:account.permissions.storage
|
|
12
|
+
/// @dev keccak256(abi.encode(uint256(keccak256("account.permissions.storage")) - 1)) & ~bytes32(uint256(0xff))
|
|
13
|
+
bytes32 public constant ACCOUNT_PERMISSIONS_STORAGE_POSITION =
|
|
14
|
+
0x3181e78fc1b109bc611fd2406150bf06e33faa75f71cba12c3e1fd670f2def00;
|
|
15
|
+
|
|
16
|
+
struct Data {
|
|
17
|
+
/// @dev The set of all admins of the wallet.
|
|
18
|
+
EnumerableSet.AddressSet allAdmins;
|
|
19
|
+
/// @dev The set of all signers with permission to use the account.
|
|
20
|
+
EnumerableSet.AddressSet allSigners;
|
|
21
|
+
/// @dev Map from address => whether the address is an admin.
|
|
22
|
+
mapping(address => bool) isAdmin;
|
|
23
|
+
/// @dev Map from signer address => active restrictions for that signer.
|
|
24
|
+
mapping(address => IAccountPermissions.SignerPermissionsStatic) signerPermissions;
|
|
25
|
+
/// @dev Map from signer address => approved target the signer can call using the account contract.
|
|
26
|
+
mapping(address => EnumerableSet.AddressSet) approvedTargets;
|
|
27
|
+
/// @dev Mapping from a signed request UID => whether the request is processed.
|
|
28
|
+
mapping(bytes32 => bool) executed;
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
function data() internal pure returns (Data storage data_) {
|
|
32
|
+
bytes32 position = ACCOUNT_PERMISSIONS_STORAGE_POSITION;
|
|
33
|
+
assembly {
|
|
34
|
+
data_.slot := position
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
abstract contract AccountPermissions is IAccountPermissions, EIP712 {
|
|
40
|
+
using ECDSA for bytes32;
|
|
41
|
+
using EnumerableSet for EnumerableSet.AddressSet;
|
|
42
|
+
|
|
43
|
+
bytes32 private constant TYPEHASH =
|
|
44
|
+
keccak256(
|
|
45
|
+
"SignerPermissionRequest(address signer,uint8 isAdmin,address[] approvedTargets,uint256 nativeTokenLimitPerTransaction,uint128 permissionStartTimestamp,uint128 permissionEndTimestamp,uint128 reqValidityStartTimestamp,uint128 reqValidityEndTimestamp,bytes32 uid)"
|
|
46
|
+
);
|
|
47
|
+
|
|
48
|
+
function _onlyAdmin() internal virtual {
|
|
49
|
+
require(isAdmin(msg.sender), "!admin");
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
/*///////////////////////////////////////////////////////////////
|
|
53
|
+
External functions
|
|
54
|
+
//////////////////////////////////////////////////////////////*/
|
|
55
|
+
|
|
56
|
+
/// @notice Sets the permissions for a given signer.
|
|
57
|
+
function setPermissionsForSigner(SignerPermissionRequest calldata _req, bytes calldata _signature) external {
|
|
58
|
+
address targetSigner = _req.signer;
|
|
59
|
+
|
|
60
|
+
require(
|
|
61
|
+
_req.reqValidityStartTimestamp <= block.timestamp && block.timestamp < _req.reqValidityEndTimestamp,
|
|
62
|
+
"!period"
|
|
63
|
+
);
|
|
64
|
+
|
|
65
|
+
(bool success, address signer) = verifySignerPermissionRequest(_req, _signature);
|
|
66
|
+
require(success, "!sig");
|
|
67
|
+
|
|
68
|
+
_accountPermissionsStorage().executed[_req.uid] = true;
|
|
69
|
+
|
|
70
|
+
//isAdmin > 0, set admin or remove admin
|
|
71
|
+
if (_req.isAdmin > 0) {
|
|
72
|
+
//isAdmin = 1, set admin
|
|
73
|
+
//isAdmin > 1, remove admin
|
|
74
|
+
bool _isAdmin = _req.isAdmin == 1;
|
|
75
|
+
|
|
76
|
+
_setAdmin(targetSigner, _isAdmin);
|
|
77
|
+
return;
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
require(!isAdmin(targetSigner), "admin");
|
|
81
|
+
|
|
82
|
+
_accountPermissionsStorage().allSigners.add(targetSigner);
|
|
83
|
+
|
|
84
|
+
_accountPermissionsStorage().signerPermissions[targetSigner] = SignerPermissionsStatic(
|
|
85
|
+
_req.nativeTokenLimitPerTransaction,
|
|
86
|
+
_req.permissionStartTimestamp,
|
|
87
|
+
_req.permissionEndTimestamp
|
|
88
|
+
);
|
|
89
|
+
|
|
90
|
+
address[] memory currentTargets = _accountPermissionsStorage().approvedTargets[targetSigner].values();
|
|
91
|
+
uint256 len = currentTargets.length;
|
|
92
|
+
|
|
93
|
+
for (uint256 i = 0; i < len; i += 1) {
|
|
94
|
+
_accountPermissionsStorage().approvedTargets[targetSigner].remove(currentTargets[i]);
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
len = _req.approvedTargets.length;
|
|
98
|
+
for (uint256 i = 0; i < len; i += 1) {
|
|
99
|
+
_accountPermissionsStorage().approvedTargets[targetSigner].add(_req.approvedTargets[i]);
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
_afterSignerPermissionsUpdate(_req);
|
|
103
|
+
|
|
104
|
+
emit SignerPermissionsUpdated(signer, targetSigner, _req);
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
/*///////////////////////////////////////////////////////////////
|
|
108
|
+
View functions
|
|
109
|
+
//////////////////////////////////////////////////////////////*/
|
|
110
|
+
|
|
111
|
+
/// @notice Returns whether the given account is an admin.
|
|
112
|
+
function isAdmin(address _account) public view virtual returns (bool) {
|
|
113
|
+
return _accountPermissionsStorage().isAdmin[_account];
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
/// @notice Returns whether the given account is an active signer on the account.
|
|
117
|
+
function isActiveSigner(address signer) public view returns (bool) {
|
|
118
|
+
SignerPermissionsStatic memory permissions = _accountPermissionsStorage().signerPermissions[signer];
|
|
119
|
+
|
|
120
|
+
return
|
|
121
|
+
permissions.startTimestamp <= block.timestamp &&
|
|
122
|
+
block.timestamp < permissions.endTimestamp &&
|
|
123
|
+
_accountPermissionsStorage().approvedTargets[signer].length() > 0;
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
/// @notice Returns the restrictions under which a signer can use the smart wallet.
|
|
127
|
+
function getPermissionsForSigner(address signer) external view returns (SignerPermissions memory) {
|
|
128
|
+
SignerPermissionsStatic memory permissions = _accountPermissionsStorage().signerPermissions[signer];
|
|
129
|
+
|
|
130
|
+
return
|
|
131
|
+
SignerPermissions(
|
|
132
|
+
signer,
|
|
133
|
+
_accountPermissionsStorage().approvedTargets[signer].values(),
|
|
134
|
+
permissions.nativeTokenLimitPerTransaction,
|
|
135
|
+
permissions.startTimestamp,
|
|
136
|
+
permissions.endTimestamp
|
|
137
|
+
);
|
|
138
|
+
}
|
|
139
|
+
|
|
140
|
+
/// @dev Verifies that a request is signed by an authorized account.
|
|
141
|
+
function verifySignerPermissionRequest(
|
|
142
|
+
SignerPermissionRequest calldata req,
|
|
143
|
+
bytes calldata signature
|
|
144
|
+
) public view virtual returns (bool success, address signer) {
|
|
145
|
+
signer = _recoverAddress(_encodeRequest(req), signature);
|
|
146
|
+
success = !_accountPermissionsStorage().executed[req.uid] && isAdmin(signer);
|
|
147
|
+
}
|
|
148
|
+
|
|
149
|
+
/// @notice Returns all active and inactive signers of the account.
|
|
150
|
+
function getAllSigners() external view returns (SignerPermissions[] memory signers) {
|
|
151
|
+
address[] memory allSigners = _accountPermissionsStorage().allSigners.values();
|
|
152
|
+
|
|
153
|
+
uint256 len = allSigners.length;
|
|
154
|
+
signers = new SignerPermissions[](len);
|
|
155
|
+
for (uint256 i = 0; i < len; i += 1) {
|
|
156
|
+
address signer = allSigners[i];
|
|
157
|
+
SignerPermissionsStatic memory permissions = _accountPermissionsStorage().signerPermissions[signer];
|
|
158
|
+
|
|
159
|
+
signers[i] = SignerPermissions(
|
|
160
|
+
signer,
|
|
161
|
+
_accountPermissionsStorage().approvedTargets[signer].values(),
|
|
162
|
+
permissions.nativeTokenLimitPerTransaction,
|
|
163
|
+
permissions.startTimestamp,
|
|
164
|
+
permissions.endTimestamp
|
|
165
|
+
);
|
|
166
|
+
}
|
|
167
|
+
}
|
|
168
|
+
|
|
169
|
+
/// @notice Returns all signers with active permissions to use the account.
|
|
170
|
+
function getAllActiveSigners() external view returns (SignerPermissions[] memory signers) {
|
|
171
|
+
address[] memory allSigners = _accountPermissionsStorage().allSigners.values();
|
|
172
|
+
|
|
173
|
+
uint256 len = allSigners.length;
|
|
174
|
+
uint256 numOfActiveSigners = 0;
|
|
175
|
+
|
|
176
|
+
for (uint256 i = 0; i < len; i += 1) {
|
|
177
|
+
if (isActiveSigner(allSigners[i])) {
|
|
178
|
+
numOfActiveSigners++;
|
|
179
|
+
} else {
|
|
180
|
+
allSigners[i] = address(0);
|
|
181
|
+
}
|
|
182
|
+
}
|
|
183
|
+
|
|
184
|
+
signers = new SignerPermissions[](numOfActiveSigners);
|
|
185
|
+
uint256 index = 0;
|
|
186
|
+
for (uint256 i = 0; i < len; i += 1) {
|
|
187
|
+
if (allSigners[i] != address(0)) {
|
|
188
|
+
address signer = allSigners[i];
|
|
189
|
+
SignerPermissionsStatic memory permissions = _accountPermissionsStorage().signerPermissions[signer];
|
|
190
|
+
|
|
191
|
+
signers[index++] = SignerPermissions(
|
|
192
|
+
signer,
|
|
193
|
+
_accountPermissionsStorage().approvedTargets[signer].values(),
|
|
194
|
+
permissions.nativeTokenLimitPerTransaction,
|
|
195
|
+
permissions.startTimestamp,
|
|
196
|
+
permissions.endTimestamp
|
|
197
|
+
);
|
|
198
|
+
}
|
|
199
|
+
}
|
|
200
|
+
}
|
|
201
|
+
|
|
202
|
+
/// @notice Returns all admins of the account.
|
|
203
|
+
function getAllAdmins() external view returns (address[] memory) {
|
|
204
|
+
return _accountPermissionsStorage().allAdmins.values();
|
|
205
|
+
}
|
|
206
|
+
|
|
207
|
+
/*///////////////////////////////////////////////////////////////
|
|
208
|
+
Internal functions
|
|
209
|
+
//////////////////////////////////////////////////////////////*/
|
|
210
|
+
|
|
211
|
+
/// @notice Runs after every `changeRole` run.
|
|
212
|
+
function _afterSignerPermissionsUpdate(SignerPermissionRequest calldata _req) internal virtual;
|
|
213
|
+
|
|
214
|
+
/// @notice Makes the given account an admin.
|
|
215
|
+
function _setAdmin(address _account, bool _isAdmin) internal virtual {
|
|
216
|
+
_accountPermissionsStorage().isAdmin[_account] = _isAdmin;
|
|
217
|
+
|
|
218
|
+
if (_isAdmin) {
|
|
219
|
+
_accountPermissionsStorage().allAdmins.add(_account);
|
|
220
|
+
} else {
|
|
221
|
+
_accountPermissionsStorage().allAdmins.remove(_account);
|
|
222
|
+
}
|
|
223
|
+
|
|
224
|
+
emit AdminUpdated(_account, _isAdmin);
|
|
225
|
+
}
|
|
226
|
+
|
|
227
|
+
/// @dev Returns the address of the signer of the request.
|
|
228
|
+
function _recoverAddress(bytes memory _encoded, bytes calldata _signature) internal view virtual returns (address) {
|
|
229
|
+
return _hashTypedDataV4(keccak256(_encoded)).recover(_signature);
|
|
230
|
+
}
|
|
231
|
+
|
|
232
|
+
/// @dev Encodes a request for recovery of the signer in `recoverAddress`.
|
|
233
|
+
function _encodeRequest(SignerPermissionRequest calldata _req) internal pure virtual returns (bytes memory) {
|
|
234
|
+
return
|
|
235
|
+
abi.encode(
|
|
236
|
+
TYPEHASH,
|
|
237
|
+
_req.signer,
|
|
238
|
+
_req.isAdmin,
|
|
239
|
+
keccak256(abi.encodePacked(_req.approvedTargets)),
|
|
240
|
+
_req.nativeTokenLimitPerTransaction,
|
|
241
|
+
_req.permissionStartTimestamp,
|
|
242
|
+
_req.permissionEndTimestamp,
|
|
243
|
+
_req.reqValidityStartTimestamp,
|
|
244
|
+
_req.reqValidityEndTimestamp,
|
|
245
|
+
_req.uid
|
|
246
|
+
);
|
|
247
|
+
}
|
|
248
|
+
|
|
249
|
+
/// @dev Returns the AccountPermissions storage.
|
|
250
|
+
function _accountPermissionsStorage() internal pure returns (AccountPermissionsStorage.Data storage data) {
|
|
251
|
+
data = AccountPermissionsStorage.data();
|
|
252
|
+
}
|
|
253
|
+
}
|