@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,579 @@
|
|
|
1
|
+
// SPDX-License-Identifier: Apache-2.0
|
|
2
|
+
pragma solidity ^0.8.11;
|
|
3
|
+
|
|
4
|
+
/// @author thirdweb
|
|
5
|
+
|
|
6
|
+
import "./DirectListingsStorage.sol";
|
|
7
|
+
|
|
8
|
+
// ====== External imports ======
|
|
9
|
+
import "@openzeppelin/contracts/token/ERC1155/IERC1155.sol";
|
|
10
|
+
import "../../../eip/interface/IERC721.sol";
|
|
11
|
+
import "@openzeppelin/contracts/token/ERC20/IERC20.sol";
|
|
12
|
+
import "@openzeppelin/contracts/interfaces/IERC2981.sol";
|
|
13
|
+
|
|
14
|
+
// ====== Internal imports ======
|
|
15
|
+
|
|
16
|
+
import "../../../extension/interface/IPlatformFee.sol";
|
|
17
|
+
import "../../../extension/upgradeable/ERC2771ContextConsumer.sol";
|
|
18
|
+
import "../../../extension/upgradeable/ReentrancyGuard.sol";
|
|
19
|
+
import "../../../extension/upgradeable/PermissionsEnumerable.sol";
|
|
20
|
+
import { RoyaltyPaymentsLogic } from "../../../extension/upgradeable/RoyaltyPayments.sol";
|
|
21
|
+
import { CurrencyTransferLib } from "../../../lib/CurrencyTransferLib.sol";
|
|
22
|
+
|
|
23
|
+
/**
|
|
24
|
+
* @author thirdweb.com
|
|
25
|
+
*/
|
|
26
|
+
contract DirectListingsLogic is IDirectListings, ReentrancyGuard, ERC2771ContextConsumer {
|
|
27
|
+
/*///////////////////////////////////////////////////////////////
|
|
28
|
+
Constants / Immutables
|
|
29
|
+
//////////////////////////////////////////////////////////////*/
|
|
30
|
+
|
|
31
|
+
/// @dev Only lister role holders can create listings, when listings are restricted by lister address.
|
|
32
|
+
bytes32 private constant LISTER_ROLE = keccak256("LISTER_ROLE");
|
|
33
|
+
/// @dev Only assets from NFT contracts with asset role can be listed, when listings are restricted by asset address.
|
|
34
|
+
bytes32 private constant ASSET_ROLE = keccak256("ASSET_ROLE");
|
|
35
|
+
|
|
36
|
+
/// @dev The max bps of the contract. So, 10_000 == 100 %
|
|
37
|
+
uint64 private constant MAX_BPS = 10_000;
|
|
38
|
+
|
|
39
|
+
address private constant DEFAULT_FEE_RECIPIENT = 0x1Af20C6B23373350aD464700B5965CE4B0D2aD94;
|
|
40
|
+
uint16 private constant DEFAULT_FEE_BPS = 100;
|
|
41
|
+
|
|
42
|
+
/// @dev The address of the native token wrapper contract.
|
|
43
|
+
address private immutable nativeTokenWrapper;
|
|
44
|
+
|
|
45
|
+
/*///////////////////////////////////////////////////////////////
|
|
46
|
+
Modifier
|
|
47
|
+
//////////////////////////////////////////////////////////////*/
|
|
48
|
+
|
|
49
|
+
/// @dev Checks whether the caller has LISTER_ROLE.
|
|
50
|
+
modifier onlyListerRole() {
|
|
51
|
+
require(Permissions(address(this)).hasRoleWithSwitch(LISTER_ROLE, _msgSender()), "!LISTER_ROLE");
|
|
52
|
+
_;
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
/// @dev Checks whether the caller has ASSET_ROLE.
|
|
56
|
+
modifier onlyAssetRole(address _asset) {
|
|
57
|
+
require(Permissions(address(this)).hasRoleWithSwitch(ASSET_ROLE, _asset), "!ASSET_ROLE");
|
|
58
|
+
_;
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
/// @dev Checks whether caller is a listing creator.
|
|
62
|
+
modifier onlyListingCreator(uint256 _listingId) {
|
|
63
|
+
require(
|
|
64
|
+
_directListingsStorage().listings[_listingId].listingCreator == _msgSender(),
|
|
65
|
+
"Marketplace: not listing creator."
|
|
66
|
+
);
|
|
67
|
+
_;
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
/// @dev Checks whether a listing exists.
|
|
71
|
+
modifier onlyExistingListing(uint256 _listingId) {
|
|
72
|
+
require(
|
|
73
|
+
_directListingsStorage().listings[_listingId].status == IDirectListings.Status.CREATED,
|
|
74
|
+
"Marketplace: invalid listing."
|
|
75
|
+
);
|
|
76
|
+
_;
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
/*///////////////////////////////////////////////////////////////
|
|
80
|
+
Constructor logic
|
|
81
|
+
//////////////////////////////////////////////////////////////*/
|
|
82
|
+
|
|
83
|
+
constructor(address _nativeTokenWrapper) {
|
|
84
|
+
nativeTokenWrapper = _nativeTokenWrapper;
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
/*///////////////////////////////////////////////////////////////
|
|
88
|
+
External functions
|
|
89
|
+
//////////////////////////////////////////////////////////////*/
|
|
90
|
+
|
|
91
|
+
/// @notice List NFTs (ERC721 or ERC1155) for sale at a fixed price.
|
|
92
|
+
function createListing(
|
|
93
|
+
ListingParameters calldata _params
|
|
94
|
+
) external onlyListerRole onlyAssetRole(_params.assetContract) returns (uint256 listingId) {
|
|
95
|
+
listingId = _getNextListingId();
|
|
96
|
+
address listingCreator = _msgSender();
|
|
97
|
+
TokenType tokenType = _getTokenType(_params.assetContract);
|
|
98
|
+
|
|
99
|
+
uint128 startTime = _params.startTimestamp;
|
|
100
|
+
uint128 endTime = _params.endTimestamp;
|
|
101
|
+
require(startTime < endTime, "Marketplace: endTimestamp not greater than startTimestamp.");
|
|
102
|
+
if (startTime < block.timestamp) {
|
|
103
|
+
require(startTime + 60 minutes >= block.timestamp, "Marketplace: invalid startTimestamp.");
|
|
104
|
+
|
|
105
|
+
startTime = uint128(block.timestamp);
|
|
106
|
+
endTime = endTime == type(uint128).max
|
|
107
|
+
? endTime
|
|
108
|
+
: startTime + (_params.endTimestamp - _params.startTimestamp);
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
_validateNewListing(_params, tokenType);
|
|
112
|
+
|
|
113
|
+
Listing memory listing = Listing({
|
|
114
|
+
listingId: listingId,
|
|
115
|
+
listingCreator: listingCreator,
|
|
116
|
+
assetContract: _params.assetContract,
|
|
117
|
+
tokenId: _params.tokenId,
|
|
118
|
+
quantity: _params.quantity,
|
|
119
|
+
currency: _params.currency,
|
|
120
|
+
pricePerToken: _params.pricePerToken,
|
|
121
|
+
startTimestamp: startTime,
|
|
122
|
+
endTimestamp: endTime,
|
|
123
|
+
reserved: _params.reserved,
|
|
124
|
+
tokenType: tokenType,
|
|
125
|
+
status: IDirectListings.Status.CREATED
|
|
126
|
+
});
|
|
127
|
+
|
|
128
|
+
_directListingsStorage().listings[listingId] = listing;
|
|
129
|
+
|
|
130
|
+
emit NewListing(listingCreator, listingId, _params.assetContract, listing);
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
/// @notice Update parameters of a listing of NFTs.
|
|
134
|
+
function updateListing(
|
|
135
|
+
uint256 _listingId,
|
|
136
|
+
ListingParameters memory _params
|
|
137
|
+
) external onlyExistingListing(_listingId) onlyAssetRole(_params.assetContract) onlyListingCreator(_listingId) {
|
|
138
|
+
address listingCreator = _msgSender();
|
|
139
|
+
Listing memory listing = _directListingsStorage().listings[_listingId];
|
|
140
|
+
TokenType tokenType = _getTokenType(_params.assetContract);
|
|
141
|
+
|
|
142
|
+
require(listing.endTimestamp > block.timestamp, "Marketplace: listing expired.");
|
|
143
|
+
|
|
144
|
+
require(
|
|
145
|
+
listing.assetContract == _params.assetContract && listing.tokenId == _params.tokenId,
|
|
146
|
+
"Marketplace: cannot update what token is listed."
|
|
147
|
+
);
|
|
148
|
+
|
|
149
|
+
uint128 startTime = _params.startTimestamp;
|
|
150
|
+
uint128 endTime = _params.endTimestamp;
|
|
151
|
+
require(startTime < endTime, "Marketplace: endTimestamp not greater than startTimestamp.");
|
|
152
|
+
require(
|
|
153
|
+
listing.startTimestamp > block.timestamp ||
|
|
154
|
+
(startTime == listing.startTimestamp && endTime > block.timestamp),
|
|
155
|
+
"Marketplace: listing already active."
|
|
156
|
+
);
|
|
157
|
+
if (startTime != listing.startTimestamp && startTime < block.timestamp) {
|
|
158
|
+
require(startTime + 60 minutes >= block.timestamp, "Marketplace: invalid startTimestamp.");
|
|
159
|
+
|
|
160
|
+
startTime = uint128(block.timestamp);
|
|
161
|
+
|
|
162
|
+
endTime = endTime == listing.endTimestamp || endTime == type(uint128).max
|
|
163
|
+
? endTime
|
|
164
|
+
: startTime + (_params.endTimestamp - _params.startTimestamp);
|
|
165
|
+
}
|
|
166
|
+
|
|
167
|
+
{
|
|
168
|
+
uint256 _approvedCurrencyPrice = _directListingsStorage().currencyPriceForListing[_listingId][
|
|
169
|
+
_params.currency
|
|
170
|
+
];
|
|
171
|
+
require(
|
|
172
|
+
_approvedCurrencyPrice == 0 || _params.pricePerToken == _approvedCurrencyPrice,
|
|
173
|
+
"Marketplace: price different from approved price"
|
|
174
|
+
);
|
|
175
|
+
}
|
|
176
|
+
|
|
177
|
+
_validateNewListing(_params, tokenType);
|
|
178
|
+
|
|
179
|
+
listing = Listing({
|
|
180
|
+
listingId: _listingId,
|
|
181
|
+
listingCreator: listingCreator,
|
|
182
|
+
assetContract: _params.assetContract,
|
|
183
|
+
tokenId: _params.tokenId,
|
|
184
|
+
quantity: _params.quantity,
|
|
185
|
+
currency: _params.currency,
|
|
186
|
+
pricePerToken: _params.pricePerToken,
|
|
187
|
+
startTimestamp: startTime,
|
|
188
|
+
endTimestamp: endTime,
|
|
189
|
+
reserved: _params.reserved,
|
|
190
|
+
tokenType: tokenType,
|
|
191
|
+
status: IDirectListings.Status.CREATED
|
|
192
|
+
});
|
|
193
|
+
|
|
194
|
+
_directListingsStorage().listings[_listingId] = listing;
|
|
195
|
+
|
|
196
|
+
emit UpdatedListing(listingCreator, _listingId, _params.assetContract, listing);
|
|
197
|
+
}
|
|
198
|
+
|
|
199
|
+
/// @notice Cancel a listing.
|
|
200
|
+
function cancelListing(uint256 _listingId) external onlyExistingListing(_listingId) onlyListingCreator(_listingId) {
|
|
201
|
+
_directListingsStorage().listings[_listingId].status = IDirectListings.Status.CANCELLED;
|
|
202
|
+
emit CancelledListing(_msgSender(), _listingId);
|
|
203
|
+
}
|
|
204
|
+
|
|
205
|
+
/// @notice Approve a buyer to buy from a reserved listing.
|
|
206
|
+
function approveBuyerForListing(
|
|
207
|
+
uint256 _listingId,
|
|
208
|
+
address _buyer,
|
|
209
|
+
bool _toApprove
|
|
210
|
+
) external onlyExistingListing(_listingId) onlyListingCreator(_listingId) {
|
|
211
|
+
require(_directListingsStorage().listings[_listingId].reserved, "Marketplace: listing not reserved.");
|
|
212
|
+
|
|
213
|
+
_directListingsStorage().isBuyerApprovedForListing[_listingId][_buyer] = _toApprove;
|
|
214
|
+
|
|
215
|
+
emit BuyerApprovedForListing(_listingId, _buyer, _toApprove);
|
|
216
|
+
}
|
|
217
|
+
|
|
218
|
+
/// @notice Approve a currency as a form of payment for the listing.
|
|
219
|
+
function approveCurrencyForListing(
|
|
220
|
+
uint256 _listingId,
|
|
221
|
+
address _currency,
|
|
222
|
+
uint256 _pricePerTokenInCurrency
|
|
223
|
+
) external onlyExistingListing(_listingId) onlyListingCreator(_listingId) {
|
|
224
|
+
Listing memory listing = _directListingsStorage().listings[_listingId];
|
|
225
|
+
require(
|
|
226
|
+
_currency != listing.currency || _pricePerTokenInCurrency == listing.pricePerToken,
|
|
227
|
+
"Marketplace: approving listing currency with different price."
|
|
228
|
+
);
|
|
229
|
+
require(
|
|
230
|
+
_directListingsStorage().currencyPriceForListing[_listingId][_currency] != _pricePerTokenInCurrency,
|
|
231
|
+
"Marketplace: price unchanged."
|
|
232
|
+
);
|
|
233
|
+
|
|
234
|
+
_directListingsStorage().currencyPriceForListing[_listingId][_currency] = _pricePerTokenInCurrency;
|
|
235
|
+
|
|
236
|
+
emit CurrencyApprovedForListing(_listingId, _currency, _pricePerTokenInCurrency);
|
|
237
|
+
}
|
|
238
|
+
|
|
239
|
+
/// @notice Buy NFTs from a listing.
|
|
240
|
+
function buyFromListing(
|
|
241
|
+
uint256 _listingId,
|
|
242
|
+
address _buyFor,
|
|
243
|
+
uint256 _quantity,
|
|
244
|
+
address _currency,
|
|
245
|
+
uint256 _expectedTotalPrice
|
|
246
|
+
) external payable nonReentrant onlyExistingListing(_listingId) {
|
|
247
|
+
Listing memory listing = _directListingsStorage().listings[_listingId];
|
|
248
|
+
address buyer = _msgSender();
|
|
249
|
+
|
|
250
|
+
require(
|
|
251
|
+
!listing.reserved || _directListingsStorage().isBuyerApprovedForListing[_listingId][buyer],
|
|
252
|
+
"buyer not approved"
|
|
253
|
+
);
|
|
254
|
+
require(_quantity > 0 && _quantity <= listing.quantity, "Buying invalid quantity");
|
|
255
|
+
require(
|
|
256
|
+
block.timestamp < listing.endTimestamp && block.timestamp >= listing.startTimestamp,
|
|
257
|
+
"not within sale window."
|
|
258
|
+
);
|
|
259
|
+
|
|
260
|
+
require(
|
|
261
|
+
_validateOwnershipAndApproval(
|
|
262
|
+
listing.listingCreator,
|
|
263
|
+
listing.assetContract,
|
|
264
|
+
listing.tokenId,
|
|
265
|
+
_quantity,
|
|
266
|
+
listing.tokenType
|
|
267
|
+
),
|
|
268
|
+
"Marketplace: not owner or approved tokens."
|
|
269
|
+
);
|
|
270
|
+
|
|
271
|
+
uint256 targetTotalPrice;
|
|
272
|
+
|
|
273
|
+
if (_directListingsStorage().currencyPriceForListing[_listingId][_currency] > 0) {
|
|
274
|
+
targetTotalPrice = _quantity * _directListingsStorage().currencyPriceForListing[_listingId][_currency];
|
|
275
|
+
} else {
|
|
276
|
+
require(_currency == listing.currency, "Paying in invalid currency.");
|
|
277
|
+
targetTotalPrice = _quantity * listing.pricePerToken;
|
|
278
|
+
}
|
|
279
|
+
|
|
280
|
+
require(targetTotalPrice == _expectedTotalPrice, "Unexpected total price");
|
|
281
|
+
|
|
282
|
+
// Check: buyer owns and has approved sufficient currency for sale.
|
|
283
|
+
if (_currency == CurrencyTransferLib.NATIVE_TOKEN) {
|
|
284
|
+
require(msg.value == targetTotalPrice, "Marketplace: msg.value must exactly be the total price.");
|
|
285
|
+
} else {
|
|
286
|
+
require(msg.value == 0, "Marketplace: invalid native tokens sent.");
|
|
287
|
+
_validateERC20BalAndAllowance(buyer, _currency, targetTotalPrice);
|
|
288
|
+
}
|
|
289
|
+
|
|
290
|
+
if (listing.quantity == _quantity) {
|
|
291
|
+
_directListingsStorage().listings[_listingId].status = IDirectListings.Status.COMPLETED;
|
|
292
|
+
}
|
|
293
|
+
_directListingsStorage().listings[_listingId].quantity -= _quantity;
|
|
294
|
+
|
|
295
|
+
_payout(buyer, listing.listingCreator, _currency, targetTotalPrice, listing);
|
|
296
|
+
_transferListingTokens(listing.listingCreator, _buyFor, _quantity, listing);
|
|
297
|
+
|
|
298
|
+
emit NewSale(
|
|
299
|
+
listing.listingCreator,
|
|
300
|
+
listing.listingId,
|
|
301
|
+
listing.assetContract,
|
|
302
|
+
listing.tokenId,
|
|
303
|
+
buyer,
|
|
304
|
+
_quantity,
|
|
305
|
+
targetTotalPrice
|
|
306
|
+
);
|
|
307
|
+
}
|
|
308
|
+
|
|
309
|
+
/*///////////////////////////////////////////////////////////////
|
|
310
|
+
View functions
|
|
311
|
+
//////////////////////////////////////////////////////////////*/
|
|
312
|
+
|
|
313
|
+
/**
|
|
314
|
+
* @notice Returns the total number of listings created.
|
|
315
|
+
* @dev At any point, the return value is the ID of the next listing created.
|
|
316
|
+
*/
|
|
317
|
+
function totalListings() external view returns (uint256) {
|
|
318
|
+
return _directListingsStorage().totalListings;
|
|
319
|
+
}
|
|
320
|
+
|
|
321
|
+
/// @notice Returns whether a buyer is approved for a listing.
|
|
322
|
+
function isBuyerApprovedForListing(uint256 _listingId, address _buyer) external view returns (bool) {
|
|
323
|
+
return _directListingsStorage().isBuyerApprovedForListing[_listingId][_buyer];
|
|
324
|
+
}
|
|
325
|
+
|
|
326
|
+
/// @notice Returns whether a currency is approved for a listing.
|
|
327
|
+
function isCurrencyApprovedForListing(uint256 _listingId, address _currency) external view returns (bool) {
|
|
328
|
+
return _directListingsStorage().currencyPriceForListing[_listingId][_currency] > 0;
|
|
329
|
+
}
|
|
330
|
+
|
|
331
|
+
/// @notice Returns the price per token for a listing, in the given currency.
|
|
332
|
+
function currencyPriceForListing(uint256 _listingId, address _currency) external view returns (uint256) {
|
|
333
|
+
if (_directListingsStorage().currencyPriceForListing[_listingId][_currency] == 0) {
|
|
334
|
+
revert("Currency not approved for listing");
|
|
335
|
+
}
|
|
336
|
+
|
|
337
|
+
return _directListingsStorage().currencyPriceForListing[_listingId][_currency];
|
|
338
|
+
}
|
|
339
|
+
|
|
340
|
+
/// @notice Returns all non-cancelled listings.
|
|
341
|
+
function getAllListings(uint256 _startId, uint256 _endId) external view returns (Listing[] memory _allListings) {
|
|
342
|
+
require(_startId <= _endId && _endId < _directListingsStorage().totalListings, "invalid range");
|
|
343
|
+
|
|
344
|
+
_allListings = new Listing[](_endId - _startId + 1);
|
|
345
|
+
|
|
346
|
+
for (uint256 i = _startId; i <= _endId; i += 1) {
|
|
347
|
+
_allListings[i - _startId] = _directListingsStorage().listings[i];
|
|
348
|
+
}
|
|
349
|
+
}
|
|
350
|
+
|
|
351
|
+
/**
|
|
352
|
+
* @notice Returns all valid listings between the start and end Id (both inclusive) provided.
|
|
353
|
+
* A valid listing is where the listing creator still owns and has approved Marketplace
|
|
354
|
+
* to transfer the listed NFTs.
|
|
355
|
+
*/
|
|
356
|
+
function getAllValidListings(
|
|
357
|
+
uint256 _startId,
|
|
358
|
+
uint256 _endId
|
|
359
|
+
) external view returns (Listing[] memory _validListings) {
|
|
360
|
+
require(_startId <= _endId && _endId < _directListingsStorage().totalListings, "invalid range");
|
|
361
|
+
|
|
362
|
+
Listing[] memory _listings = new Listing[](_endId - _startId + 1);
|
|
363
|
+
uint256 _listingCount;
|
|
364
|
+
|
|
365
|
+
for (uint256 i = _startId; i <= _endId; i += 1) {
|
|
366
|
+
_listings[i - _startId] = _directListingsStorage().listings[i];
|
|
367
|
+
if (_validateExistingListing(_listings[i - _startId])) {
|
|
368
|
+
_listingCount += 1;
|
|
369
|
+
}
|
|
370
|
+
}
|
|
371
|
+
|
|
372
|
+
_validListings = new Listing[](_listingCount);
|
|
373
|
+
uint256 index = 0;
|
|
374
|
+
uint256 count = _listings.length;
|
|
375
|
+
for (uint256 i = 0; i < count; i += 1) {
|
|
376
|
+
if (_validateExistingListing(_listings[i])) {
|
|
377
|
+
_validListings[index++] = _listings[i];
|
|
378
|
+
}
|
|
379
|
+
}
|
|
380
|
+
}
|
|
381
|
+
|
|
382
|
+
/// @notice Returns a listing at a particular listing ID.
|
|
383
|
+
function getListing(uint256 _listingId) external view returns (Listing memory listing) {
|
|
384
|
+
listing = _directListingsStorage().listings[_listingId];
|
|
385
|
+
}
|
|
386
|
+
|
|
387
|
+
/*///////////////////////////////////////////////////////////////
|
|
388
|
+
Internal functions
|
|
389
|
+
//////////////////////////////////////////////////////////////*/
|
|
390
|
+
|
|
391
|
+
/// @dev Returns the next listing Id.
|
|
392
|
+
function _getNextListingId() internal returns (uint256 id) {
|
|
393
|
+
id = _directListingsStorage().totalListings;
|
|
394
|
+
_directListingsStorage().totalListings += 1;
|
|
395
|
+
}
|
|
396
|
+
|
|
397
|
+
/// @dev Returns the interface supported by a contract.
|
|
398
|
+
function _getTokenType(address _assetContract) internal view returns (TokenType tokenType) {
|
|
399
|
+
if (IERC165(_assetContract).supportsInterface(type(IERC1155).interfaceId)) {
|
|
400
|
+
tokenType = TokenType.ERC1155;
|
|
401
|
+
} else if (IERC165(_assetContract).supportsInterface(type(IERC721).interfaceId)) {
|
|
402
|
+
tokenType = TokenType.ERC721;
|
|
403
|
+
} else {
|
|
404
|
+
revert("Marketplace: listed token must be ERC1155 or ERC721.");
|
|
405
|
+
}
|
|
406
|
+
}
|
|
407
|
+
|
|
408
|
+
/// @dev Checks whether the listing creator owns and has approved marketplace to transfer listed tokens.
|
|
409
|
+
function _validateNewListing(ListingParameters memory _params, TokenType _tokenType) internal view {
|
|
410
|
+
require(_params.quantity > 0, "Marketplace: listing zero quantity.");
|
|
411
|
+
require(_params.quantity == 1 || _tokenType == TokenType.ERC1155, "Marketplace: listing invalid quantity.");
|
|
412
|
+
|
|
413
|
+
require(
|
|
414
|
+
_validateOwnershipAndApproval(
|
|
415
|
+
_msgSender(),
|
|
416
|
+
_params.assetContract,
|
|
417
|
+
_params.tokenId,
|
|
418
|
+
_params.quantity,
|
|
419
|
+
_tokenType
|
|
420
|
+
),
|
|
421
|
+
"Marketplace: not owner or approved tokens."
|
|
422
|
+
);
|
|
423
|
+
}
|
|
424
|
+
|
|
425
|
+
/// @dev Checks whether the listing exists, is active, and if the lister has sufficient balance.
|
|
426
|
+
function _validateExistingListing(Listing memory _targetListing) internal view returns (bool isValid) {
|
|
427
|
+
isValid =
|
|
428
|
+
_targetListing.startTimestamp <= block.timestamp &&
|
|
429
|
+
_targetListing.endTimestamp > block.timestamp &&
|
|
430
|
+
_targetListing.status == IDirectListings.Status.CREATED &&
|
|
431
|
+
_validateOwnershipAndApproval(
|
|
432
|
+
_targetListing.listingCreator,
|
|
433
|
+
_targetListing.assetContract,
|
|
434
|
+
_targetListing.tokenId,
|
|
435
|
+
_targetListing.quantity,
|
|
436
|
+
_targetListing.tokenType
|
|
437
|
+
);
|
|
438
|
+
}
|
|
439
|
+
|
|
440
|
+
/// @dev Validates that `_tokenOwner` owns and has approved Marketplace to transfer NFTs.
|
|
441
|
+
function _validateOwnershipAndApproval(
|
|
442
|
+
address _tokenOwner,
|
|
443
|
+
address _assetContract,
|
|
444
|
+
uint256 _tokenId,
|
|
445
|
+
uint256 _quantity,
|
|
446
|
+
TokenType _tokenType
|
|
447
|
+
) internal view returns (bool isValid) {
|
|
448
|
+
address market = address(this);
|
|
449
|
+
|
|
450
|
+
if (_tokenType == TokenType.ERC1155) {
|
|
451
|
+
isValid =
|
|
452
|
+
IERC1155(_assetContract).balanceOf(_tokenOwner, _tokenId) >= _quantity &&
|
|
453
|
+
IERC1155(_assetContract).isApprovedForAll(_tokenOwner, market);
|
|
454
|
+
} else if (_tokenType == TokenType.ERC721) {
|
|
455
|
+
address owner;
|
|
456
|
+
address operator;
|
|
457
|
+
|
|
458
|
+
// failsafe for reverts in case of non-existent tokens
|
|
459
|
+
try IERC721(_assetContract).ownerOf(_tokenId) returns (address _owner) {
|
|
460
|
+
owner = _owner;
|
|
461
|
+
|
|
462
|
+
// Nesting the approval check inside this try block, to run only if owner check doesn't revert.
|
|
463
|
+
// If the previous check for owner fails, then the return value will always evaluate to false.
|
|
464
|
+
try IERC721(_assetContract).getApproved(_tokenId) returns (address _operator) {
|
|
465
|
+
operator = _operator;
|
|
466
|
+
} catch {}
|
|
467
|
+
} catch {}
|
|
468
|
+
|
|
469
|
+
isValid =
|
|
470
|
+
owner == _tokenOwner &&
|
|
471
|
+
(operator == market || IERC721(_assetContract).isApprovedForAll(_tokenOwner, market));
|
|
472
|
+
}
|
|
473
|
+
}
|
|
474
|
+
|
|
475
|
+
/// @dev Validates that `_tokenOwner` owns and has approved Markeplace to transfer the appropriate amount of currency
|
|
476
|
+
function _validateERC20BalAndAllowance(address _tokenOwner, address _currency, uint256 _amount) internal view {
|
|
477
|
+
require(
|
|
478
|
+
IERC20(_currency).balanceOf(_tokenOwner) >= _amount &&
|
|
479
|
+
IERC20(_currency).allowance(_tokenOwner, address(this)) >= _amount,
|
|
480
|
+
"!BAL20"
|
|
481
|
+
);
|
|
482
|
+
}
|
|
483
|
+
|
|
484
|
+
/// @dev Transfers tokens listed for sale in a direct or auction listing.
|
|
485
|
+
function _transferListingTokens(address _from, address _to, uint256 _quantity, Listing memory _listing) internal {
|
|
486
|
+
if (_listing.tokenType == TokenType.ERC1155) {
|
|
487
|
+
IERC1155(_listing.assetContract).safeTransferFrom(_from, _to, _listing.tokenId, _quantity, "");
|
|
488
|
+
} else if (_listing.tokenType == TokenType.ERC721) {
|
|
489
|
+
IERC721(_listing.assetContract).safeTransferFrom(_from, _to, _listing.tokenId, "");
|
|
490
|
+
}
|
|
491
|
+
}
|
|
492
|
+
|
|
493
|
+
/// @dev Pays out stakeholders in a sale.
|
|
494
|
+
function _payout(
|
|
495
|
+
address _payer,
|
|
496
|
+
address _payee,
|
|
497
|
+
address _currencyToUse,
|
|
498
|
+
uint256 _totalPayoutAmount,
|
|
499
|
+
Listing memory _listing
|
|
500
|
+
) internal {
|
|
501
|
+
address _nativeTokenWrapper = nativeTokenWrapper;
|
|
502
|
+
uint256 amountRemaining;
|
|
503
|
+
|
|
504
|
+
// Payout platform fee
|
|
505
|
+
{
|
|
506
|
+
uint256 platformFeesTw = (_totalPayoutAmount * DEFAULT_FEE_BPS) / MAX_BPS;
|
|
507
|
+
(address platformFeeRecipient, uint16 platformFeeBps) = IPlatformFee(address(this)).getPlatformFeeInfo();
|
|
508
|
+
uint256 platformFeeCut = (_totalPayoutAmount * platformFeeBps) / MAX_BPS;
|
|
509
|
+
|
|
510
|
+
// Transfer platform fee
|
|
511
|
+
CurrencyTransferLib.transferCurrencyWithWrapper(
|
|
512
|
+
_currencyToUse,
|
|
513
|
+
_payer,
|
|
514
|
+
DEFAULT_FEE_RECIPIENT,
|
|
515
|
+
platformFeesTw,
|
|
516
|
+
_nativeTokenWrapper
|
|
517
|
+
);
|
|
518
|
+
CurrencyTransferLib.transferCurrencyWithWrapper(
|
|
519
|
+
_currencyToUse,
|
|
520
|
+
_payer,
|
|
521
|
+
platformFeeRecipient,
|
|
522
|
+
platformFeeCut,
|
|
523
|
+
_nativeTokenWrapper
|
|
524
|
+
);
|
|
525
|
+
|
|
526
|
+
amountRemaining = _totalPayoutAmount - platformFeeCut - platformFeesTw;
|
|
527
|
+
}
|
|
528
|
+
|
|
529
|
+
// Payout royalties
|
|
530
|
+
{
|
|
531
|
+
// Get royalty recipients and amounts
|
|
532
|
+
(address payable[] memory recipients, uint256[] memory amounts) = RoyaltyPaymentsLogic(address(this))
|
|
533
|
+
.getRoyalty(_listing.assetContract, _listing.tokenId, _totalPayoutAmount);
|
|
534
|
+
|
|
535
|
+
uint256 royaltyRecipientCount = recipients.length;
|
|
536
|
+
|
|
537
|
+
if (royaltyRecipientCount != 0) {
|
|
538
|
+
uint256 royaltyCut;
|
|
539
|
+
address royaltyRecipient;
|
|
540
|
+
|
|
541
|
+
for (uint256 i = 0; i < royaltyRecipientCount; ) {
|
|
542
|
+
royaltyRecipient = recipients[i];
|
|
543
|
+
royaltyCut = amounts[i];
|
|
544
|
+
|
|
545
|
+
// Check payout amount remaining is enough to cover royalty payment
|
|
546
|
+
require(amountRemaining >= royaltyCut, "fees exceed the price");
|
|
547
|
+
|
|
548
|
+
// Transfer royalty
|
|
549
|
+
CurrencyTransferLib.transferCurrencyWithWrapper(
|
|
550
|
+
_currencyToUse,
|
|
551
|
+
_payer,
|
|
552
|
+
royaltyRecipient,
|
|
553
|
+
royaltyCut,
|
|
554
|
+
_nativeTokenWrapper
|
|
555
|
+
);
|
|
556
|
+
|
|
557
|
+
unchecked {
|
|
558
|
+
amountRemaining -= royaltyCut;
|
|
559
|
+
++i;
|
|
560
|
+
}
|
|
561
|
+
}
|
|
562
|
+
}
|
|
563
|
+
}
|
|
564
|
+
|
|
565
|
+
// Distribute price to token owner
|
|
566
|
+
CurrencyTransferLib.transferCurrencyWithWrapper(
|
|
567
|
+
_currencyToUse,
|
|
568
|
+
_payer,
|
|
569
|
+
_payee,
|
|
570
|
+
amountRemaining,
|
|
571
|
+
_nativeTokenWrapper
|
|
572
|
+
);
|
|
573
|
+
}
|
|
574
|
+
|
|
575
|
+
/// @dev Returns the DirectListings storage.
|
|
576
|
+
function _directListingsStorage() internal pure returns (DirectListingsStorage.Data storage data) {
|
|
577
|
+
data = DirectListingsStorage.data();
|
|
578
|
+
}
|
|
579
|
+
}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
// SPDX-License-Identifier: Apache-2.0
|
|
2
|
+
pragma solidity ^0.8.11;
|
|
3
|
+
|
|
4
|
+
/// @author thirdweb
|
|
5
|
+
|
|
6
|
+
import { IDirectListings } from "../IMarketplace.sol";
|
|
7
|
+
|
|
8
|
+
/**
|
|
9
|
+
* @author thirdweb.com
|
|
10
|
+
*/
|
|
11
|
+
library DirectListingsStorage {
|
|
12
|
+
/// @custom:storage-location erc7201:direct.listings.storage
|
|
13
|
+
/// @dev keccak256(abi.encode(uint256(keccak256("direct.listings.storage")) - 1)) & ~bytes32(uint256(0xff))
|
|
14
|
+
bytes32 public constant DIRECT_LISTINGS_STORAGE_POSITION =
|
|
15
|
+
0xa5370dfa5e46a36b8e1214352e211aa04006b977c8fd45a98e6b8c6e230ba000;
|
|
16
|
+
|
|
17
|
+
struct Data {
|
|
18
|
+
uint256 totalListings;
|
|
19
|
+
mapping(uint256 => IDirectListings.Listing) listings;
|
|
20
|
+
mapping(uint256 => mapping(address => bool)) isBuyerApprovedForListing;
|
|
21
|
+
mapping(uint256 => mapping(address => uint256)) currencyPriceForListing;
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
function data() internal pure returns (Data storage data_) {
|
|
25
|
+
bytes32 position = DIRECT_LISTINGS_STORAGE_POSITION;
|
|
26
|
+
assembly {
|
|
27
|
+
data_.slot := position
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
}
|