@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,140 @@
|
|
|
1
|
+
// SPDX-License-Identifier: Apache-2.0
|
|
2
|
+
pragma solidity ^0.8.11;
|
|
3
|
+
|
|
4
|
+
/// @author thirdweb
|
|
5
|
+
|
|
6
|
+
// $$\ $$\ $$\ $$\ $$\
|
|
7
|
+
// $$ | $$ | \__| $$ | $$ |
|
|
8
|
+
// $$$$$$\ $$$$$$$\ $$\ $$$$$$\ $$$$$$$ |$$\ $$\ $$\ $$$$$$\ $$$$$$$\
|
|
9
|
+
// \_$$ _| $$ __$$\ $$ |$$ __$$\ $$ __$$ |$$ | $$ | $$ |$$ __$$\ $$ __$$\
|
|
10
|
+
// $$ | $$ | $$ |$$ |$$ | \__|$$ / $$ |$$ | $$ | $$ |$$$$$$$$ |$$ | $$ |
|
|
11
|
+
// $$ |$$\ $$ | $$ |$$ |$$ | $$ | $$ |$$ | $$ | $$ |$$ ____|$$ | $$ |
|
|
12
|
+
// \$$$$ |$$ | $$ |$$ |$$ | \$$$$$$$ |\$$$$$\$$$$ |\$$$$$$$\ $$$$$$$ |
|
|
13
|
+
// \____/ \__| \__|\__|\__| \_______| \_____\____/ \_______|\_______/
|
|
14
|
+
|
|
15
|
+
import { TWRegistry } from "./TWRegistry.sol";
|
|
16
|
+
import "./interface/IThirdwebContract.sol";
|
|
17
|
+
import "../extension/interface/IContractFactory.sol";
|
|
18
|
+
|
|
19
|
+
import { AccessControlEnumerable, Context } from "@openzeppelin/contracts/access/AccessControlEnumerable.sol";
|
|
20
|
+
import { ERC2771Context } from "../external-deps/openzeppelin/metatx/ERC2771Context.sol";
|
|
21
|
+
import { Create2 } from "@openzeppelin/contracts/utils/Create2.sol";
|
|
22
|
+
import { Multicall } from "../extension/Multicall.sol";
|
|
23
|
+
import "@openzeppelin/contracts/utils/Address.sol";
|
|
24
|
+
import { Clones } from "@openzeppelin/contracts/proxy/Clones.sol";
|
|
25
|
+
|
|
26
|
+
contract TWFactory is Multicall, ERC2771Context, AccessControlEnumerable, IContractFactory {
|
|
27
|
+
/// @dev Only FACTORY_ROLE holders can approve/unapprove implementations for proxies to point to.
|
|
28
|
+
bytes32 public constant FACTORY_ROLE = keccak256("FACTORY_ROLE");
|
|
29
|
+
|
|
30
|
+
TWRegistry public immutable registry;
|
|
31
|
+
|
|
32
|
+
/// @dev Emitted when a proxy is deployed.
|
|
33
|
+
event ProxyDeployed(address indexed implementation, address proxy, address indexed deployer);
|
|
34
|
+
event ImplementationAdded(address implementation, bytes32 indexed contractType, uint256 version);
|
|
35
|
+
event ImplementationApproved(address implementation, bool isApproved);
|
|
36
|
+
|
|
37
|
+
/// @dev mapping of implementation address to deployment approval
|
|
38
|
+
mapping(address => bool) public approval;
|
|
39
|
+
|
|
40
|
+
/// @dev mapping of implementation address to implementation added version
|
|
41
|
+
mapping(bytes32 => uint256) public currentVersion;
|
|
42
|
+
|
|
43
|
+
/// @dev mapping of contract type to module version to implementation address
|
|
44
|
+
mapping(bytes32 => mapping(uint256 => address)) public implementation;
|
|
45
|
+
|
|
46
|
+
/// @dev mapping of proxy address to deployer address
|
|
47
|
+
mapping(address => address) public deployer;
|
|
48
|
+
|
|
49
|
+
constructor(address[] memory _trustedForwarders, address _registry) ERC2771Context(_trustedForwarders) {
|
|
50
|
+
_setupRole(DEFAULT_ADMIN_ROLE, _msgSender());
|
|
51
|
+
_setupRole(FACTORY_ROLE, _msgSender());
|
|
52
|
+
|
|
53
|
+
registry = TWRegistry(_registry);
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
/// @dev Deploys a proxy that points to the latest version of the given contract type.
|
|
57
|
+
function deployProxy(bytes32 _type, bytes memory _data) external returns (address) {
|
|
58
|
+
bytes32 salt = bytes32(registry.count(_msgSender()));
|
|
59
|
+
return deployProxyDeterministic(_type, _data, salt);
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
/**
|
|
63
|
+
* @dev Deploys a proxy at a deterministic address by taking in `salt` as a parameter.
|
|
64
|
+
* Proxy points to the latest version of the given contract type.
|
|
65
|
+
*/
|
|
66
|
+
function deployProxyDeterministic(bytes32 _type, bytes memory _data, bytes32 _salt) public returns (address) {
|
|
67
|
+
address _implementation = implementation[_type][currentVersion[_type]];
|
|
68
|
+
return deployProxyByImplementation(_implementation, _data, _salt);
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
/// @dev Deploys a proxy that points to the given implementation.
|
|
72
|
+
function deployProxyByImplementation(
|
|
73
|
+
address _implementation,
|
|
74
|
+
bytes memory _data,
|
|
75
|
+
bytes32 _salt
|
|
76
|
+
) public override returns (address deployedProxy) {
|
|
77
|
+
require(approval[_implementation], "implementation not approved");
|
|
78
|
+
|
|
79
|
+
bytes32 salthash = keccak256(abi.encodePacked(_msgSender(), _salt));
|
|
80
|
+
deployedProxy = Clones.cloneDeterministic(_implementation, salthash);
|
|
81
|
+
|
|
82
|
+
deployer[deployedProxy] = _msgSender();
|
|
83
|
+
|
|
84
|
+
emit ProxyDeployed(_implementation, deployedProxy, _msgSender());
|
|
85
|
+
|
|
86
|
+
registry.add(_msgSender(), deployedProxy);
|
|
87
|
+
|
|
88
|
+
if (_data.length > 0) {
|
|
89
|
+
// slither-disable-next-line unused-return
|
|
90
|
+
Address.functionCall(deployedProxy, _data);
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
/// @dev Lets a contract admin set the address of a contract type x version.
|
|
95
|
+
function addImplementation(address _implementation) external {
|
|
96
|
+
require(hasRole(FACTORY_ROLE, _msgSender()), "not admin.");
|
|
97
|
+
|
|
98
|
+
IThirdwebContract module = IThirdwebContract(_implementation);
|
|
99
|
+
|
|
100
|
+
bytes32 ctype = module.contractType();
|
|
101
|
+
require(ctype.length > 0, "invalid module");
|
|
102
|
+
|
|
103
|
+
uint8 version = module.contractVersion();
|
|
104
|
+
uint8 currentVersionOfType = uint8(currentVersion[ctype]);
|
|
105
|
+
require(version >= currentVersionOfType, "wrong module version");
|
|
106
|
+
|
|
107
|
+
currentVersion[ctype] = version;
|
|
108
|
+
implementation[ctype][version] = _implementation;
|
|
109
|
+
approval[_implementation] = true;
|
|
110
|
+
|
|
111
|
+
emit ImplementationAdded(_implementation, ctype, version);
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
/// @dev Lets a contract admin approve a specific contract for deployment.
|
|
115
|
+
function approveImplementation(address _implementation, bool _toApprove) external {
|
|
116
|
+
require(hasRole(FACTORY_ROLE, _msgSender()), "not admin.");
|
|
117
|
+
|
|
118
|
+
approval[_implementation] = _toApprove;
|
|
119
|
+
|
|
120
|
+
emit ImplementationApproved(_implementation, _toApprove);
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
/// @dev Returns the implementation given a contract type and version.
|
|
124
|
+
function getImplementation(bytes32 _type, uint256 _version) external view returns (address) {
|
|
125
|
+
return implementation[_type][_version];
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
/// @dev Returns the latest implementation given a contract type.
|
|
129
|
+
function getLatestImplementation(bytes32 _type) external view returns (address) {
|
|
130
|
+
return implementation[_type][currentVersion[_type]];
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
function _msgSender() internal view virtual override(Context, ERC2771Context, Multicall) returns (address sender) {
|
|
134
|
+
return ERC2771Context._msgSender();
|
|
135
|
+
}
|
|
136
|
+
|
|
137
|
+
function _msgData() internal view virtual override(Context, ERC2771Context) returns (bytes calldata) {
|
|
138
|
+
return ERC2771Context._msgData();
|
|
139
|
+
}
|
|
140
|
+
}
|
|
@@ -0,0 +1,162 @@
|
|
|
1
|
+
// SPDX-License-Identifier: Apache-2.0
|
|
2
|
+
pragma solidity ^0.8.11;
|
|
3
|
+
|
|
4
|
+
/// @author thirdweb
|
|
5
|
+
|
|
6
|
+
import "./TWFactory.sol";
|
|
7
|
+
import "./interface/ITWFee.sol";
|
|
8
|
+
|
|
9
|
+
import "@openzeppelin/contracts/access/AccessControlEnumerable.sol";
|
|
10
|
+
import { Multicall } from "../extension/Multicall.sol";
|
|
11
|
+
import "../external-deps/openzeppelin/metatx/ERC2771Context.sol";
|
|
12
|
+
|
|
13
|
+
interface IFeeTierPlacementExtension {
|
|
14
|
+
/// @dev Returns the fee tier for a given proxy contract address and proxy deployer address.
|
|
15
|
+
function getFeeTier(
|
|
16
|
+
address deployer,
|
|
17
|
+
address proxy
|
|
18
|
+
) external view returns (uint128 tierId, uint128 validUntilTimestamp);
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
contract TWFee is ITWFee, Multicall, ERC2771Context, AccessControlEnumerable, IFeeTierPlacementExtension {
|
|
22
|
+
/// @dev The factory for deploying contracts.
|
|
23
|
+
TWFactory public immutable factory;
|
|
24
|
+
|
|
25
|
+
/// @dev The maximum threshold for fees. 1%
|
|
26
|
+
uint256 public constant MAX_FEE_BPS = 100;
|
|
27
|
+
|
|
28
|
+
/// @dev TIER_FEE_ROLE holders can create tiers.
|
|
29
|
+
bytes32 private constant TIER_FEE_ROLE = keccak256("TIER_FEE_ROLE");
|
|
30
|
+
|
|
31
|
+
/// @dev TIER_CONTROLLER_ROLE holders can assign tiers to deployer or proxy.
|
|
32
|
+
bytes32 private constant TIER_CONTROLLER_ROLE = keccak256("TIER_CONTROLLER_ROLE");
|
|
33
|
+
|
|
34
|
+
/// @dev Mapping from proxy contract or proxy deployer address => pricing tier.
|
|
35
|
+
mapping(address => Tier) private tier;
|
|
36
|
+
|
|
37
|
+
/// @dev Mapping from pricing tier id => Fee Type (lib/FeeType.sol) => FeeInfo
|
|
38
|
+
mapping(uint256 => mapping(uint256 => FeeInfo)) public feeInfo;
|
|
39
|
+
|
|
40
|
+
/// @dev If we want to extend the logic for fee tier placement, we
|
|
41
|
+
/// could easily points it to a different extension implementation.
|
|
42
|
+
IFeeTierPlacementExtension public tierPlacementExtension;
|
|
43
|
+
|
|
44
|
+
struct Tier {
|
|
45
|
+
uint128 id;
|
|
46
|
+
uint128 validUntilTimestamp;
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
struct FeeInfo {
|
|
50
|
+
uint256 bps;
|
|
51
|
+
address recipient;
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
/// @dev Events
|
|
55
|
+
event TierUpdated(address indexed proxyOrDeployer, uint256 tierId, uint256 validUntilTimestamp);
|
|
56
|
+
event FeeTierUpdated(uint256 indexed tierId, uint256 indexed feeType, address recipient, uint256 bps);
|
|
57
|
+
|
|
58
|
+
constructor(address[] memory _trustedForwarders, address _factory) ERC2771Context(_trustedForwarders) {
|
|
59
|
+
factory = TWFactory(_factory);
|
|
60
|
+
|
|
61
|
+
_setupRole(DEFAULT_ADMIN_ROLE, _msgSender());
|
|
62
|
+
_setupRole(TIER_FEE_ROLE, _msgSender());
|
|
63
|
+
_setupRole(TIER_CONTROLLER_ROLE, _msgSender());
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
function setFeeTierPlacementExtension(address _extension) public onlyRole(DEFAULT_ADMIN_ROLE) {
|
|
67
|
+
tierPlacementExtension = IFeeTierPlacementExtension(_extension);
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
/// @dev Returns the fee tier for a proxy deployer wallet or contract address.
|
|
71
|
+
function getFeeTier(
|
|
72
|
+
address _deployer,
|
|
73
|
+
address _proxy
|
|
74
|
+
) public view override returns (uint128 tierId, uint128 validUntilTimestamp) {
|
|
75
|
+
Tier memory targetTier = tier[_proxy];
|
|
76
|
+
if (block.timestamp <= targetTier.validUntilTimestamp) {
|
|
77
|
+
tierId = targetTier.id;
|
|
78
|
+
validUntilTimestamp = targetTier.validUntilTimestamp;
|
|
79
|
+
} else {
|
|
80
|
+
tierId = 0;
|
|
81
|
+
validUntilTimestamp = 0;
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
// if the proxy doesn't have a tier, then look up the deployer's tier
|
|
85
|
+
if (tierId == 0 && validUntilTimestamp == 0) {
|
|
86
|
+
targetTier = tier[_deployer];
|
|
87
|
+
if (block.timestamp <= targetTier.validUntilTimestamp) {
|
|
88
|
+
tierId = targetTier.id;
|
|
89
|
+
validUntilTimestamp = targetTier.validUntilTimestamp;
|
|
90
|
+
} else {
|
|
91
|
+
tierId = 0;
|
|
92
|
+
validUntilTimestamp = 0;
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
/// @dev Returns the fee info for a given module and fee type.
|
|
98
|
+
function getFeeInfo(address _proxy, uint256 _feeType) external view returns (address recipient, uint256 bps) {
|
|
99
|
+
address deployer = factory.deployer(_proxy);
|
|
100
|
+
uint128 tierId = 0;
|
|
101
|
+
uint128 validUntilTimestamp = 0;
|
|
102
|
+
|
|
103
|
+
if (address(tierPlacementExtension) != address(0)) {
|
|
104
|
+
// https://github.com/crytic/slither/issues/982
|
|
105
|
+
// slither-disable-next-line unused-return
|
|
106
|
+
try tierPlacementExtension.getFeeTier(deployer, _proxy) returns (
|
|
107
|
+
// slither-disable-next-line uninitialized-local,variable-scope
|
|
108
|
+
uint128 retTierId,
|
|
109
|
+
// slither-disable-next-line uninitialized-local,variable-scope
|
|
110
|
+
uint128 retValidUntilTimestamp
|
|
111
|
+
) {
|
|
112
|
+
tierId = retTierId;
|
|
113
|
+
validUntilTimestamp = retValidUntilTimestamp;
|
|
114
|
+
// solhint-disable-next-line no-empty-blocks
|
|
115
|
+
} catch {}
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
// if extension doesn't return a tier, then we fetch the local states
|
|
119
|
+
if (tierId == 0 && validUntilTimestamp == 0) {
|
|
120
|
+
(tierId, ) = getFeeTier(deployer, _proxy);
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
FeeInfo memory targetFeeInfo = feeInfo[tierId][_feeType];
|
|
124
|
+
(recipient, bps) = (targetFeeInfo.recipient, targetFeeInfo.bps);
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
/// @dev Lets a TIER_CONTROLLER_ROLE holder assign a tier to a proxy deployer.
|
|
128
|
+
function setTier(
|
|
129
|
+
address _proxyOrDeployer,
|
|
130
|
+
uint128 _tierId,
|
|
131
|
+
uint128 _validUntilTimestamp
|
|
132
|
+
) external onlyRole(TIER_CONTROLLER_ROLE) {
|
|
133
|
+
tier[_proxyOrDeployer] = Tier({ id: _tierId, validUntilTimestamp: _validUntilTimestamp });
|
|
134
|
+
|
|
135
|
+
emit TierUpdated(_proxyOrDeployer, _tierId, _validUntilTimestamp);
|
|
136
|
+
}
|
|
137
|
+
|
|
138
|
+
/// @dev Lets the admin set fee bps and recipient for the given pricing tier and fee type.
|
|
139
|
+
function setFeeInfoForTier(
|
|
140
|
+
uint256 _tierId,
|
|
141
|
+
uint256 _feeBps,
|
|
142
|
+
address _feeRecipient,
|
|
143
|
+
uint256 _feeType
|
|
144
|
+
) external onlyRole(TIER_FEE_ROLE) {
|
|
145
|
+
require(_feeBps <= MAX_FEE_BPS, "fee too high.");
|
|
146
|
+
|
|
147
|
+
FeeInfo memory feeInfoToSet = FeeInfo({ bps: _feeBps, recipient: _feeRecipient });
|
|
148
|
+
feeInfo[_tierId][_feeType] = feeInfoToSet;
|
|
149
|
+
|
|
150
|
+
emit FeeTierUpdated(_tierId, _feeType, _feeRecipient, _feeBps);
|
|
151
|
+
}
|
|
152
|
+
|
|
153
|
+
// ===== Getters =====
|
|
154
|
+
|
|
155
|
+
function _msgSender() internal view virtual override(Context, ERC2771Context, Multicall) returns (address sender) {
|
|
156
|
+
return ERC2771Context._msgSender();
|
|
157
|
+
}
|
|
158
|
+
|
|
159
|
+
function _msgData() internal view virtual override(Context, ERC2771Context) returns (bytes calldata) {
|
|
160
|
+
return ERC2771Context._msgData();
|
|
161
|
+
}
|
|
162
|
+
}
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
// SPDX-License-Identifier: Apache-2.0
|
|
2
|
+
pragma solidity ^0.8.11;
|
|
3
|
+
|
|
4
|
+
/// @author thirdweb
|
|
5
|
+
|
|
6
|
+
// $$\ $$\ $$\ $$\ $$\
|
|
7
|
+
// $$ | $$ | \__| $$ | $$ |
|
|
8
|
+
// $$$$$$\ $$$$$$$\ $$\ $$$$$$\ $$$$$$$ |$$\ $$\ $$\ $$$$$$\ $$$$$$$\
|
|
9
|
+
// \_$$ _| $$ __$$\ $$ |$$ __$$\ $$ __$$ |$$ | $$ | $$ |$$ __$$\ $$ __$$\
|
|
10
|
+
// $$ | $$ | $$ |$$ |$$ | \__|$$ / $$ |$$ | $$ | $$ |$$$$$$$$ |$$ | $$ |
|
|
11
|
+
// $$ |$$\ $$ | $$ |$$ |$$ | $$ | $$ |$$ | $$ | $$ |$$ ____|$$ | $$ |
|
|
12
|
+
// \$$$$ |$$ | $$ |$$ |$$ | \$$$$$$$ |\$$$$$\$$$$ |\$$$$$$$\ $$$$$$$ |
|
|
13
|
+
// \____/ \__| \__|\__|\__| \_______| \_____\____/ \_______|\_______/
|
|
14
|
+
|
|
15
|
+
import "@openzeppelin/contracts/utils/Address.sol";
|
|
16
|
+
import "@openzeppelin/contracts/proxy/Clones.sol";
|
|
17
|
+
|
|
18
|
+
contract TWMinimalFactory {
|
|
19
|
+
/// @dev Deploys a proxy that points to the given implementation.
|
|
20
|
+
constructor(address _implementation, bytes memory _data, bytes32 _salt) payable {
|
|
21
|
+
address instance;
|
|
22
|
+
bytes32 salthash = keccak256(abi.encodePacked(msg.sender, _salt));
|
|
23
|
+
assembly {
|
|
24
|
+
let ptr := mload(0x40)
|
|
25
|
+
mstore(ptr, 0x3d602d80600a3d3981f3363d3d373d3d3d363d73000000000000000000000000)
|
|
26
|
+
mstore(add(ptr, 0x14), shl(0x60, _implementation))
|
|
27
|
+
mstore(add(ptr, 0x28), 0x5af43d82803e903d91602b57fd5bf30000000000000000000000000000000000)
|
|
28
|
+
instance := create2(0, ptr, 0x37, salthash)
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
if (_data.length > 0) {
|
|
32
|
+
// instance.call{ value: msg.value }(_data);
|
|
33
|
+
|
|
34
|
+
// solhint-disable-next-line avoid-low-level-calls
|
|
35
|
+
(bool success, bytes memory result) = instance.call{ value: msg.value }(_data);
|
|
36
|
+
|
|
37
|
+
if (!success) {
|
|
38
|
+
// Next 5 lines from https://ethereum.stackexchange.com/a/83577
|
|
39
|
+
if (result.length < 68) revert("Transaction reverted silently");
|
|
40
|
+
assembly {
|
|
41
|
+
result := add(result, 0x04)
|
|
42
|
+
}
|
|
43
|
+
revert(abi.decode(result, (string)));
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
}
|
|
@@ -0,0 +1,116 @@
|
|
|
1
|
+
// SPDX-License-Identifier: Apache-2.0
|
|
2
|
+
pragma solidity ^0.8.11;
|
|
3
|
+
|
|
4
|
+
/// @author thirdweb
|
|
5
|
+
|
|
6
|
+
// $$\ $$\ $$\ $$\ $$\
|
|
7
|
+
// $$ | $$ | \__| $$ | $$ |
|
|
8
|
+
// $$$$$$\ $$$$$$$\ $$\ $$$$$$\ $$$$$$$ |$$\ $$\ $$\ $$$$$$\ $$$$$$$\
|
|
9
|
+
// \_$$ _| $$ __$$\ $$ |$$ __$$\ $$ __$$ |$$ | $$ | $$ |$$ __$$\ $$ __$$\
|
|
10
|
+
// $$ | $$ | $$ |$$ |$$ | \__|$$ / $$ |$$ | $$ | $$ |$$$$$$$$ |$$ | $$ |
|
|
11
|
+
// $$ |$$\ $$ | $$ |$$ |$$ | $$ | $$ |$$ | $$ | $$ |$$ ____|$$ | $$ |
|
|
12
|
+
// \$$$$ |$$ | $$ |$$ |$$ | \$$$$$$$ |\$$$$$\$$$$ |\$$$$$$$\ $$$$$$$ |
|
|
13
|
+
// \____/ \__| \__|\__|\__| \_______| \_____\____/ \_______|\_______/
|
|
14
|
+
|
|
15
|
+
import "@openzeppelin/contracts/utils/structs/EnumerableSet.sol";
|
|
16
|
+
import "@openzeppelin/contracts/access/AccessControlEnumerable.sol";
|
|
17
|
+
import "../extension/Multicall.sol";
|
|
18
|
+
import "../external-deps/openzeppelin/metatx/ERC2771Context.sol";
|
|
19
|
+
|
|
20
|
+
import "./interface/ITWMultichainRegistry.sol";
|
|
21
|
+
|
|
22
|
+
contract TWMultichainRegistry is ITWMultichainRegistry, Multicall, ERC2771Context, AccessControlEnumerable {
|
|
23
|
+
bytes32 public constant OPERATOR_ROLE = keccak256("OPERATOR_ROLE");
|
|
24
|
+
|
|
25
|
+
using EnumerableSet for EnumerableSet.AddressSet;
|
|
26
|
+
using EnumerableSet for EnumerableSet.UintSet;
|
|
27
|
+
|
|
28
|
+
/// @dev wallet address => [contract addresses]
|
|
29
|
+
mapping(address => mapping(uint256 => EnumerableSet.AddressSet)) private deployments;
|
|
30
|
+
/// @dev contract address deployed => imported metadata uri
|
|
31
|
+
mapping(uint256 => mapping(address => string)) private addressToMetadataUri;
|
|
32
|
+
|
|
33
|
+
EnumerableSet.UintSet private chainIds;
|
|
34
|
+
|
|
35
|
+
constructor(address[] memory _trustedForwarders) ERC2771Context(_trustedForwarders) {
|
|
36
|
+
_setupRole(DEFAULT_ADMIN_ROLE, _msgSender());
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
// slither-disable-next-line similar-names
|
|
40
|
+
function add(address _deployer, address _deployment, uint256 _chainId, string memory metadataUri) external {
|
|
41
|
+
require(hasRole(OPERATOR_ROLE, _msgSender()) || _deployer == _msgSender(), "not operator or deployer.");
|
|
42
|
+
|
|
43
|
+
bool added = deployments[_deployer][_chainId].add(_deployment);
|
|
44
|
+
require(added, "failed to add");
|
|
45
|
+
|
|
46
|
+
chainIds.add(_chainId);
|
|
47
|
+
|
|
48
|
+
if (bytes(metadataUri).length > 0) {
|
|
49
|
+
addressToMetadataUri[_chainId][_deployment] = metadataUri;
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
emit Added(_deployer, _deployment, _chainId, metadataUri);
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
// slither-disable-next-line similar-names
|
|
56
|
+
function remove(address _deployer, address _deployment, uint256 _chainId) external {
|
|
57
|
+
require(hasRole(OPERATOR_ROLE, _msgSender()) || _deployer == _msgSender(), "not operator or deployer.");
|
|
58
|
+
|
|
59
|
+
bool removed = deployments[_deployer][_chainId].remove(_deployment);
|
|
60
|
+
require(removed, "failed to remove");
|
|
61
|
+
|
|
62
|
+
emit Deleted(_deployer, _deployment, _chainId);
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
function getAll(address _deployer) external view returns (Deployment[] memory allDeployments) {
|
|
66
|
+
uint256 totalDeployments;
|
|
67
|
+
uint256 chainIdsLen = chainIds.length();
|
|
68
|
+
|
|
69
|
+
for (uint256 i = 0; i < chainIdsLen; i += 1) {
|
|
70
|
+
uint256 chainId = chainIds.at(i);
|
|
71
|
+
|
|
72
|
+
totalDeployments += deployments[_deployer][chainId].length();
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
allDeployments = new Deployment[](totalDeployments);
|
|
76
|
+
uint256 idx;
|
|
77
|
+
|
|
78
|
+
for (uint256 j = 0; j < chainIdsLen; j += 1) {
|
|
79
|
+
uint256 chainId = chainIds.at(j);
|
|
80
|
+
|
|
81
|
+
uint256 len = deployments[_deployer][chainId].length();
|
|
82
|
+
address[] memory deploymentAddrs = deployments[_deployer][chainId].values();
|
|
83
|
+
|
|
84
|
+
for (uint256 k = 0; k < len; k += 1) {
|
|
85
|
+
allDeployments[idx] = Deployment({
|
|
86
|
+
deploymentAddress: deploymentAddrs[k],
|
|
87
|
+
chainId: chainId,
|
|
88
|
+
metadataURI: addressToMetadataUri[chainId][deploymentAddrs[k]]
|
|
89
|
+
});
|
|
90
|
+
idx += 1;
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
function count(address _deployer) external view returns (uint256 deploymentCount) {
|
|
96
|
+
uint256 chainIdsLen = chainIds.length();
|
|
97
|
+
|
|
98
|
+
for (uint256 i = 0; i < chainIdsLen; i += 1) {
|
|
99
|
+
uint256 chainId = chainIds.at(i);
|
|
100
|
+
|
|
101
|
+
deploymentCount += deployments[_deployer][chainId].length();
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
function getMetadataUri(uint256 _chainId, address _deployment) external view returns (string memory metadataUri) {
|
|
106
|
+
metadataUri = addressToMetadataUri[_chainId][_deployment];
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
function _msgSender() internal view virtual override(Context, ERC2771Context, Multicall) returns (address sender) {
|
|
110
|
+
return ERC2771Context._msgSender();
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
function _msgData() internal view virtual override(Context, ERC2771Context) returns (bytes calldata) {
|
|
114
|
+
return ERC2771Context._msgData();
|
|
115
|
+
}
|
|
116
|
+
}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
// SPDX-License-Identifier: Apache-2.0
|
|
2
|
+
pragma solidity ^0.8.11;
|
|
3
|
+
|
|
4
|
+
/// @author thirdweb
|
|
5
|
+
|
|
6
|
+
// $$\ $$\ $$\ $$\ $$\
|
|
7
|
+
// $$ | $$ | \__| $$ | $$ |
|
|
8
|
+
// $$$$$$\ $$$$$$$\ $$\ $$$$$$\ $$$$$$$ |$$\ $$\ $$\ $$$$$$\ $$$$$$$\
|
|
9
|
+
// \_$$ _| $$ __$$\ $$ |$$ __$$\ $$ __$$ |$$ | $$ | $$ |$$ __$$\ $$ __$$\
|
|
10
|
+
// $$ | $$ | $$ |$$ |$$ | \__|$$ / $$ |$$ | $$ | $$ |$$$$$$$$ |$$ | $$ |
|
|
11
|
+
// $$ |$$\ $$ | $$ |$$ |$$ | $$ | $$ |$$ | $$ | $$ |$$ ____|$$ | $$ |
|
|
12
|
+
// \$$$$ |$$ | $$ |$$ |$$ | \$$$$$$$ |\$$$$$\$$$$ |\$$$$$$$\ $$$$$$$ |
|
|
13
|
+
// \____/ \__| \__|\__|\__| \_______| \_____\____/ \_______|\_______/
|
|
14
|
+
|
|
15
|
+
import "@openzeppelin/contracts/proxy/Proxy.sol";
|
|
16
|
+
import "@openzeppelin/contracts/utils/Address.sol";
|
|
17
|
+
import "@openzeppelin/contracts/utils/StorageSlot.sol";
|
|
18
|
+
|
|
19
|
+
contract TWProxy is Proxy {
|
|
20
|
+
/**
|
|
21
|
+
* @dev Storage slot with the address of the current implementation.
|
|
22
|
+
* This is the keccak-256 hash of "eip1967.proxy.implementation" subtracted by 1, and is
|
|
23
|
+
* validated in the constructor.
|
|
24
|
+
*/
|
|
25
|
+
bytes32 internal constant _IMPLEMENTATION_SLOT = 0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc;
|
|
26
|
+
|
|
27
|
+
constructor(address _logic, bytes memory _data) payable {
|
|
28
|
+
assert(_IMPLEMENTATION_SLOT == bytes32(uint256(keccak256("eip1967.proxy.implementation")) - 1));
|
|
29
|
+
StorageSlot.getAddressSlot(_IMPLEMENTATION_SLOT).value = _logic;
|
|
30
|
+
if (_data.length > 0) {
|
|
31
|
+
// slither-disable-next-line unused-return
|
|
32
|
+
Address.functionDelegateCall(_logic, _data);
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
/**
|
|
37
|
+
* @dev Returns the current implementation address.
|
|
38
|
+
*/
|
|
39
|
+
function _implementation() internal view override returns (address impl) {
|
|
40
|
+
return StorageSlot.getAddressSlot(_IMPLEMENTATION_SLOT).value;
|
|
41
|
+
}
|
|
42
|
+
}
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
// SPDX-License-Identifier: Apache-2.0
|
|
2
|
+
pragma solidity ^0.8.11;
|
|
3
|
+
|
|
4
|
+
/// @author thirdweb
|
|
5
|
+
|
|
6
|
+
// $$\ $$\ $$\ $$\ $$\
|
|
7
|
+
// $$ | $$ | \__| $$ | $$ |
|
|
8
|
+
// $$$$$$\ $$$$$$$\ $$\ $$$$$$\ $$$$$$$ |$$\ $$\ $$\ $$$$$$\ $$$$$$$\
|
|
9
|
+
// \_$$ _| $$ __$$\ $$ |$$ __$$\ $$ __$$ |$$ | $$ | $$ |$$ __$$\ $$ __$$\
|
|
10
|
+
// $$ | $$ | $$ |$$ |$$ | \__|$$ / $$ |$$ | $$ | $$ |$$$$$$$$ |$$ | $$ |
|
|
11
|
+
// $$ |$$\ $$ | $$ |$$ |$$ | $$ | $$ |$$ | $$ | $$ |$$ ____|$$ | $$ |
|
|
12
|
+
// \$$$$ |$$ | $$ |$$ |$$ | \$$$$$$$ |\$$$$$\$$$$ |\$$$$$$$\ $$$$$$$ |
|
|
13
|
+
// \____/ \__| \__|\__|\__| \_______| \_____\____/ \_______|\_______/
|
|
14
|
+
|
|
15
|
+
import "@openzeppelin/contracts/utils/structs/EnumerableSet.sol";
|
|
16
|
+
import "@openzeppelin/contracts/access/AccessControlEnumerable.sol";
|
|
17
|
+
import "../extension/Multicall.sol";
|
|
18
|
+
import "../external-deps/openzeppelin/metatx/ERC2771Context.sol";
|
|
19
|
+
|
|
20
|
+
contract TWRegistry is Multicall, ERC2771Context, AccessControlEnumerable {
|
|
21
|
+
bytes32 public constant OPERATOR_ROLE = keccak256("OPERATOR_ROLE");
|
|
22
|
+
|
|
23
|
+
using EnumerableSet for EnumerableSet.AddressSet;
|
|
24
|
+
|
|
25
|
+
/// @dev wallet address => [contract addresses]
|
|
26
|
+
mapping(address => EnumerableSet.AddressSet) private deployments;
|
|
27
|
+
|
|
28
|
+
event Added(address indexed deployer, address indexed deployment);
|
|
29
|
+
event Deleted(address indexed deployer, address indexed deployment);
|
|
30
|
+
|
|
31
|
+
constructor(address[] memory _trustedForwarders) ERC2771Context(_trustedForwarders) {
|
|
32
|
+
_setupRole(DEFAULT_ADMIN_ROLE, _msgSender());
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
// slither-disable-next-line similar-names
|
|
36
|
+
function add(address _deployer, address _deployment) external {
|
|
37
|
+
require(hasRole(OPERATOR_ROLE, _msgSender()) || _deployer == _msgSender(), "not operator or deployer.");
|
|
38
|
+
|
|
39
|
+
bool added = deployments[_deployer].add(_deployment);
|
|
40
|
+
require(added, "failed to add");
|
|
41
|
+
|
|
42
|
+
emit Added(_deployer, _deployment);
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
// slither-disable-next-line similar-names
|
|
46
|
+
function remove(address _deployer, address _deployment) external {
|
|
47
|
+
require(hasRole(OPERATOR_ROLE, _msgSender()) || _deployer == _msgSender(), "not operator or deployer.");
|
|
48
|
+
|
|
49
|
+
bool removed = deployments[_deployer].remove(_deployment);
|
|
50
|
+
require(removed, "failed to remove");
|
|
51
|
+
|
|
52
|
+
emit Deleted(_deployer, _deployment);
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
function getAll(address _deployer) external view returns (address[] memory) {
|
|
56
|
+
return deployments[_deployer].values();
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
function count(address _deployer) external view returns (uint256) {
|
|
60
|
+
return deployments[_deployer].length();
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
function _msgSender() internal view virtual override(Context, ERC2771Context, Multicall) returns (address sender) {
|
|
64
|
+
return ERC2771Context._msgSender();
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
function _msgData() internal view virtual override(Context, ERC2771Context) returns (bytes calldata) {
|
|
68
|
+
return ERC2771Context._msgData();
|
|
69
|
+
}
|
|
70
|
+
}
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
// SPDX-License-Identifier: Apache-2.0
|
|
2
|
+
pragma solidity ^0.8.11;
|
|
3
|
+
|
|
4
|
+
/// @author thirdweb
|
|
5
|
+
|
|
6
|
+
// $$\ $$\ $$\ $$\ $$\
|
|
7
|
+
// $$ | $$ | \__| $$ | $$ |
|
|
8
|
+
// $$$$$$\ $$$$$$$\ $$\ $$$$$$\ $$$$$$$ |$$\ $$\ $$\ $$$$$$\ $$$$$$$\
|
|
9
|
+
// \_$$ _| $$ __$$\ $$ |$$ __$$\ $$ __$$ |$$ | $$ | $$ |$$ __$$\ $$ __$$\
|
|
10
|
+
// $$ | $$ | $$ |$$ |$$ | \__|$$ / $$ |$$ | $$ | $$ |$$$$$$$$ |$$ | $$ |
|
|
11
|
+
// $$ |$$\ $$ | $$ |$$ |$$ | $$ | $$ |$$ | $$ | $$ |$$ ____|$$ | $$ |
|
|
12
|
+
// \$$$$ |$$ | $$ |$$ |$$ | \$$$$$$$ |\$$$$$\$$$$ |\$$$$$$$\ $$$$$$$ |
|
|
13
|
+
// \____/ \__| \__|\__|\__| \_______| \_____\____/ \_______|\_______/
|
|
14
|
+
|
|
15
|
+
import "../extension/interface/IContractFactory.sol";
|
|
16
|
+
|
|
17
|
+
import "../external-deps/openzeppelin/metatx/ERC2771Context.sol";
|
|
18
|
+
import "../extension/Multicall.sol";
|
|
19
|
+
import "@openzeppelin/contracts/proxy/Clones.sol";
|
|
20
|
+
|
|
21
|
+
contract TWStatelessFactory is Multicall, ERC2771Context, IContractFactory {
|
|
22
|
+
/// @dev Emitted when a proxy is deployed.
|
|
23
|
+
event ProxyDeployed(address indexed implementation, address proxy, address indexed deployer);
|
|
24
|
+
|
|
25
|
+
constructor(address[] memory _trustedForwarders) ERC2771Context(_trustedForwarders) {}
|
|
26
|
+
|
|
27
|
+
/// @dev Deploys a proxy that points to the given implementation.
|
|
28
|
+
function deployProxyByImplementation(
|
|
29
|
+
address _implementation,
|
|
30
|
+
bytes memory _data,
|
|
31
|
+
bytes32 _salt
|
|
32
|
+
) public override returns (address deployedProxy) {
|
|
33
|
+
bytes32 salthash = keccak256(abi.encodePacked(_msgSender(), _salt));
|
|
34
|
+
deployedProxy = Clones.cloneDeterministic(_implementation, salthash);
|
|
35
|
+
|
|
36
|
+
emit ProxyDeployed(_implementation, deployedProxy, _msgSender());
|
|
37
|
+
|
|
38
|
+
if (_data.length > 0) {
|
|
39
|
+
// slither-disable-next-line unused-return
|
|
40
|
+
Address.functionCall(deployedProxy, _data);
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
function _msgSender() internal view virtual override(Multicall, ERC2771Context) returns (address sender) {
|
|
45
|
+
return ERC2771Context._msgSender();
|
|
46
|
+
}
|
|
47
|
+
}
|