@artblocks/contracts 0.0.1
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/.env.example +10 -0
- package/LICENSE +165 -0
- package/README.md +286 -0
- package/artifacts/contracts/AdminACLV0.sol/AdminACLV0.json +164 -0
- package/artifacts/contracts/AdminACLV1.sol/AdminACLV1.json +248 -0
- package/artifacts/contracts/BasicRandomizer.sol/BasicRandomizer.json +24 -0
- package/artifacts/contracts/BasicRandomizerV2.sol/BasicRandomizerV2.json +102 -0
- package/artifacts/contracts/DependencyRegistryV0.sol/DependencyRegistryV0.json +1020 -0
- package/artifacts/contracts/GenArt721CoreV3.sol/GenArt721CoreV3.json +1928 -0
- package/artifacts/contracts/GenArt721CoreV3_Engine.sol/GenArt721CoreV3_Engine.json +1942 -0
- package/artifacts/contracts/engine/GenArt721CoreV2_ENGINE_FLEX.sol/GenArt721CoreV2_ENGINE_FLEX.json +1708 -0
- package/artifacts/contracts/engine/GenArt721CoreV2_PBAB.sol/GenArt721CoreV2_PBAB.json +1410 -0
- package/artifacts/contracts/engine/GenArt721CoreV2_PRTNR.sol/GenArt721CoreV2_PRTNR.json +1436 -0
- package/artifacts/contracts/engine/GenArt721MinterBurner_PBAB.sol/GenArt721MinterBurner_PBAB.json +437 -0
- package/artifacts/contracts/engine/GenArt721MinterDAExp_PBAB.sol/GenArt721MinterDAExp_PBAB.json +508 -0
- package/artifacts/contracts/engine/GenArt721Minter_PBAB.sol/GenArt721Minter_PBAB.json +381 -0
- package/artifacts/contracts/engine-registry/EngineRegistryV0.sol/EngineRegistryV0.json +109 -0
- package/artifacts/contracts/engine-registry/future/EngineRegistryV1.sol/EngineRegistryV1.json +109 -0
- package/artifacts/contracts/explorations/GenArt721CoreV3_Explorations.sol/GenArt721CoreV3_Explorations.json +1902 -0
- package/artifacts/contracts/interfaces/0.5.x/IBonusContract.sol/IBonusContract.json +47 -0
- package/artifacts/contracts/interfaces/0.5.x/IGenArt721CoreContractV1.sol/IGenArt721CoreContractV1.json +413 -0
- package/artifacts/contracts/interfaces/0.5.x/IGenArt721CoreV2_PBAB.sol/IGenArt721CoreV2_PBAB.json +392 -0
- package/artifacts/contracts/interfaces/0.5.x/IRandomizer.sol/IRandomizer.json +26 -0
- package/artifacts/contracts/interfaces/0.8.x/IAdminACLV0.sol/IAdminACLV0.json +122 -0
- package/artifacts/contracts/interfaces/0.8.x/IArtblocksRoyaltyOverride.sol/IArtblocksRoyaltyOverride.json +59 -0
- package/artifacts/contracts/interfaces/0.8.x/IBonusContract.sol/IBonusContract.json +43 -0
- package/artifacts/contracts/interfaces/0.8.x/IDelegationRegistry.sol/IDelegationRegistry.json +510 -0
- package/artifacts/contracts/interfaces/0.8.x/IDependencyRegistryCompatibleV0.sol/IDependencyRegistryCompatibleV0.json +53 -0
- package/artifacts/contracts/interfaces/0.8.x/IDependencyRegistryV0.sol/IDependencyRegistryV0.json +350 -0
- package/artifacts/contracts/interfaces/0.8.x/IEngineRegistryV0.sol/IEngineRegistryV0.json +85 -0
- package/artifacts/contracts/interfaces/0.8.x/IFilteredMinterDAExpSettlementV0.sol/IFilteredMinterDAExpSettlementV0.json +730 -0
- package/artifacts/contracts/interfaces/0.8.x/IFilteredMinterDAExpV0.sol/IFilteredMinterDAExpV0.json +311 -0
- package/artifacts/contracts/interfaces/0.8.x/IFilteredMinterDAExpV1.sol/IFilteredMinterDAExpV1.json +617 -0
- package/artifacts/contracts/interfaces/0.8.x/IFilteredMinterDALinV0.sol/IFilteredMinterDALinV0.json +292 -0
- package/artifacts/contracts/interfaces/0.8.x/IFilteredMinterDALinV1.sol/IFilteredMinterDALinV1.json +598 -0
- package/artifacts/contracts/interfaces/0.8.x/IFilteredMinterHolderV0.sol/IFilteredMinterHolderV0.json +355 -0
- package/artifacts/contracts/interfaces/0.8.x/IFilteredMinterHolderV1.sol/IFilteredMinterHolderV1.json +368 -0
- package/artifacts/contracts/interfaces/0.8.x/IFilteredMinterHolderV2.sol/IFilteredMinterHolderV2.json +674 -0
- package/artifacts/contracts/interfaces/0.8.x/IFilteredMinterMerkleV0.sol/IFilteredMinterMerkleV0.json +551 -0
- package/artifacts/contracts/interfaces/0.8.x/IFilteredMinterMerkleV1.sol/IFilteredMinterMerkleV1.json +564 -0
- package/artifacts/contracts/interfaces/0.8.x/IFilteredMinterMerkleV2.sol/IFilteredMinterMerkleV2.json +601 -0
- package/artifacts/contracts/interfaces/0.8.x/IFilteredMinterV0.sol/IFilteredMinterV0.json +216 -0
- package/artifacts/contracts/interfaces/0.8.x/IFilteredMinterV1.sol/IFilteredMinterV1.json +485 -0
- package/artifacts/contracts/interfaces/0.8.x/IFilteredMinterV2.sol/IFilteredMinterV2.json +522 -0
- package/artifacts/contracts/interfaces/0.8.x/IGenArt721CoreContractV1.sol/IGenArt721CoreContractV1.json +299 -0
- package/artifacts/contracts/interfaces/0.8.x/IGenArt721CoreContractV3.sol/IGenArt721CoreContractV3.json +609 -0
- package/artifacts/contracts/interfaces/0.8.x/IGenArt721CoreContractV3_Base.sol/IGenArt721CoreContractV3_Base.json +448 -0
- package/artifacts/contracts/interfaces/0.8.x/IGenArt721CoreContractV3_Engine.sol/IGenArt721CoreContractV3_Engine.json +649 -0
- package/artifacts/contracts/interfaces/0.8.x/IGenArt721CoreV2_PBAB.sol/IGenArt721CoreV2_PBAB.json +362 -0
- package/artifacts/contracts/interfaces/0.8.x/IManifold.sol/IManifold.json +35 -0
- package/artifacts/contracts/interfaces/0.8.x/IMinterFilterV0.sol/IMinterFilterV0.json +192 -0
- package/artifacts/contracts/interfaces/0.8.x/IRandomizer.sol/IRandomizer.json +24 -0
- package/artifacts/contracts/interfaces/0.8.x/IRandomizerV2.sol/IRandomizerV2.json +37 -0
- package/artifacts/contracts/legacy/GenArt721CoreV1.sol/Address.json +10 -0
- package/artifacts/contracts/legacy/GenArt721CoreV1.sol/Counters.json +10 -0
- package/artifacts/contracts/legacy/GenArt721CoreV1.sol/CustomERC721Metadata.json +425 -0
- package/artifacts/contracts/legacy/GenArt721CoreV1.sol/ERC165.json +38 -0
- package/artifacts/contracts/legacy/GenArt721CoreV1.sol/ERC721.json +322 -0
- package/artifacts/contracts/legacy/GenArt721CoreV1.sol/ERC721Enumerable.json +384 -0
- package/artifacts/contracts/legacy/GenArt721CoreV1.sol/GenArt721CoreV1.json +1773 -0
- package/artifacts/contracts/legacy/GenArt721CoreV1.sol/IERC165.json +32 -0
- package/artifacts/contracts/legacy/GenArt721CoreV1.sol/IERC721.json +316 -0
- package/artifacts/contracts/legacy/GenArt721CoreV1.sol/IERC721Enumerable.json +378 -0
- package/artifacts/contracts/legacy/GenArt721CoreV1.sol/IERC721Receiver.json +47 -0
- package/artifacts/contracts/legacy/GenArt721CoreV1.sol/SafeMath.json +10 -0
- package/artifacts/contracts/legacy/GenArt721CoreV1.sol/Strings.json +10 -0
- package/artifacts/contracts/legacy/GenArt721LegacyMinter.sol/GenArt721LegacyMinter.json +338 -0
- package/artifacts/contracts/libs/0.5.x/CustomERC721Metadata.sol/CustomERC721Metadata.json +425 -0
- package/artifacts/contracts/libs/0.5.x/IERC20.sol/IERC20.json +206 -0
- package/artifacts/contracts/libs/0.5.x/SafeMath.sol/SafeMath.json +10 -0
- package/artifacts/contracts/libs/0.5.x/Strings.sol/Strings.json +10 -0
- package/artifacts/contracts/libs/0.8.x/BytecodeStorage.sol/BytecodeStorage.json +10 -0
- package/artifacts/contracts/libs/0.8.x/Bytes32Strings.sol/Bytes32Strings.json +10 -0
- package/artifacts/contracts/libs/0.8.x/ERC721_PackedHashSeed.sol/ERC721_PackedHashSeed.json +357 -0
- package/artifacts/contracts/libs/integration-refs/delegation-registry/DelegationRegistry.sol/DelegationRegistry.json +529 -0
- package/artifacts/contracts/libs/integration-refs/gnosis-safe/GnosisSafeMock.sol/GnosisSafeMock.json +1037 -0
- package/artifacts/contracts/libs/integration-refs/gnosis-safe/GnosisSafeProxyFactoryMock.sol/GnosisSafeProxyFactoryMock.json +172 -0
- package/artifacts/contracts/libs/integration-refs/gnosis-safe/MultiSendMock.sol/MultiSendMock.json +24 -0
- package/artifacts/contracts/minter-suite/MinterFilter/MinterFilterV0.sol/MinterFilterV0.json +342 -0
- package/artifacts/contracts/minter-suite/MinterFilter/MinterFilterV1.sol/MinterFilterV1.json +322 -0
- package/artifacts/contracts/minter-suite/Minters/MinterDAExp/MinterDAExpV2.sol/MinterDAExpV2.json +550 -0
- package/artifacts/contracts/minter-suite/Minters/MinterDAExp/MinterDAExpV3.sol/MinterDAExpV3.json +856 -0
- package/artifacts/contracts/minter-suite/Minters/MinterDAExpSettlement/MinterDAExpSettlementV0.sol/MinterDAExpSettlementV0.json +1053 -0
- package/artifacts/contracts/minter-suite/Minters/MinterDALin/MinterDALinV2.sol/MinterDALinV2.json +526 -0
- package/artifacts/contracts/minter-suite/Minters/MinterDALin/MinterDALinV3.sol/MinterDALinV3.json +832 -0
- package/artifacts/contracts/minter-suite/Minters/MinterHolder/MinterHolderV2.sol/MinterHolderV2.json +794 -0
- package/artifacts/contracts/minter-suite/Minters/MinterHolder/MinterHolderV3.sol/MinterHolderV3.json +1100 -0
- package/artifacts/contracts/minter-suite/Minters/MinterMerkle/MinterMerkleV3.sol/MinterMerkleV3.json +1002 -0
- package/artifacts/contracts/minter-suite/Minters/MinterMerkle/MinterMerkleV4.sol/MinterMerkleV4.json +1039 -0
- package/artifacts/contracts/minter-suite/Minters/MinterSetPrice/MinterSetPriceV2.sol/MinterSetPriceV2.json +365 -0
- package/artifacts/contracts/minter-suite/Minters/MinterSetPrice/MinterSetPriceV3.sol/MinterSetPriceV3.json +671 -0
- package/artifacts/contracts/minter-suite/Minters/MinterSetPrice/deprecated/MinterSetPriceV1.sol/MinterSetPriceV1.json +288 -0
- package/artifacts/contracts/minter-suite/Minters/MinterSetPriceERC20/MinterSetPriceERC20V2.sol/MinterSetPriceERC20V2.json +436 -0
- package/artifacts/contracts/minter-suite/Minters/MinterSetPriceERC20/MinterSetPriceERC20V3.sol/MinterSetPriceERC20V3.json +742 -0
- package/artifacts/contracts/minter-suite/Minters/MinterSetPriceERC20/deprecated/MinterSetPriceERC20V0.sol/MinterSetPriceERC20V0.json +461 -0
- package/artifacts/contracts/mock/BytecodeTextCR_DMock.sol/BytecodeTextCR_DMock.json +194 -0
- package/artifacts/contracts/mock/DeadReceiverMock.sol/DeadReceiverMock.json +15 -0
- package/artifacts/contracts/mock/ERC20Mock.sol/ERC20Mock.json +292 -0
- package/artifacts/contracts/mock/MockAdminACLV0.sol/MockAdminACLV0Events.json +165 -0
- package/artifacts/contracts/mock/RandomizerV2_NoAssignMock.sol/RandomizerV2_NoAssignMock.json +128 -0
- package/artifacts/contracts/mock/ReentrancyHolderMock.sol/ReentrancyHolderMock.json +118 -0
- package/artifacts/contracts/mock/ReentrancyMerkleMock.sol/ReentrancyMerkleMock.json +87 -0
- package/artifacts/contracts/mock/ReentrancyMock.sol/ReentrancyMock.json +82 -0
- package/artifacts/contracts/royalty-registry/GenArt721RoyaltyOverride.sol/GenArt721RoyaltyOverride.json +208 -0
- package/artifacts/contracts/royalty-registry/GenArt721RoyaltyOverride_PBAB.sol/GenArt721RoyaltyOverride_PBAB.json +301 -0
- package/contracts/AdminACLV0.sol +103 -0
- package/contracts/AdminACLV1.sol +193 -0
- package/contracts/BasicRandomizer.sol +23 -0
- package/contracts/BasicRandomizerV2.sol +36 -0
- package/contracts/DependencyRegistryV0.sol +893 -0
- package/contracts/GenArt721CoreV3.sol +2001 -0
- package/contracts/GenArt721CoreV3_Engine.sol +2061 -0
- package/contracts/engine/GenArt721CoreV2_ENGINE_FLEX.sol +887 -0
- package/contracts/engine/GenArt721CoreV2_PBAB.sol +695 -0
- package/contracts/engine/GenArt721CoreV2_PRTNR.sol +749 -0
- package/contracts/engine/GenArt721MinterBurner_PBAB.sol +467 -0
- package/contracts/engine/GenArt721MinterDAExp_PBAB.sol +614 -0
- package/contracts/engine/GenArt721Minter_PBAB.sol +420 -0
- package/contracts/engine-registry/EngineRegistryV0.sol +72 -0
- package/contracts/engine-registry/future/EngineRegistryV1.sol +86 -0
- package/contracts/explorations/GenArt721CoreV3_Explorations.sol +1989 -0
- package/contracts/interfaces/0.5.x/IBonusContract.sol +10 -0
- package/contracts/interfaces/0.5.x/IGenArt721CoreContractV1.sol +91 -0
- package/contracts/interfaces/0.5.x/IGenArt721CoreV2_PBAB.sol +92 -0
- package/contracts/interfaces/0.5.x/IRandomizer.sol +8 -0
- package/contracts/interfaces/0.8.x/IAdminACLV0.sol +51 -0
- package/contracts/interfaces/0.8.x/IArtblocksRoyaltyOverride.sol +34 -0
- package/contracts/interfaces/0.8.x/IBonusContract.sol +10 -0
- package/contracts/interfaces/0.8.x/IDelegationRegistry.sol +221 -0
- package/contracts/interfaces/0.8.x/IDependencyRegistryCompatibleV0.sol +31 -0
- package/contracts/interfaces/0.8.x/IDependencyRegistryV0.sol +95 -0
- package/contracts/interfaces/0.8.x/IEngineRegistryV0.sol +38 -0
- package/contracts/interfaces/0.8.x/IFilteredMinterDAExpSettlementV0.sol +70 -0
- package/contracts/interfaces/0.8.x/IFilteredMinterDAExpV0.sol +35 -0
- package/contracts/interfaces/0.8.x/IFilteredMinterDAExpV1.sol +16 -0
- package/contracts/interfaces/0.8.x/IFilteredMinterDALinV0.sol +32 -0
- package/contracts/interfaces/0.8.x/IFilteredMinterDALinV1.sol +16 -0
- package/contracts/interfaces/0.8.x/IFilteredMinterHolderV0.sol +68 -0
- package/contracts/interfaces/0.8.x/IFilteredMinterHolderV1.sol +19 -0
- package/contracts/interfaces/0.8.x/IFilteredMinterHolderV2.sol +19 -0
- package/contracts/interfaces/0.8.x/IFilteredMinterMerkleV0.sol +37 -0
- package/contracts/interfaces/0.8.x/IFilteredMinterMerkleV1.sol +19 -0
- package/contracts/interfaces/0.8.x/IFilteredMinterMerkleV2.sol +19 -0
- package/contracts/interfaces/0.8.x/IFilteredMinterV0.sol +74 -0
- package/contracts/interfaces/0.8.x/IFilteredMinterV1.sol +127 -0
- package/contracts/interfaces/0.8.x/IFilteredMinterV2.sol +30 -0
- package/contracts/interfaces/0.8.x/IGenArt721CoreContractV1.sol +73 -0
- package/contracts/interfaces/0.8.x/IGenArt721CoreContractV3.sol +79 -0
- package/contracts/interfaces/0.8.x/IGenArt721CoreContractV3_Base.sol +127 -0
- package/contracts/interfaces/0.8.x/IGenArt721CoreContractV3_Engine.sol +80 -0
- package/contracts/interfaces/0.8.x/IGenArt721CoreV2_PBAB.sol +91 -0
- package/contracts/interfaces/0.8.x/IManifold.sol +24 -0
- package/contracts/interfaces/0.8.x/IMinterFilterV0.sol +47 -0
- package/contracts/interfaces/0.8.x/IRandomizer.sol +8 -0
- package/contracts/interfaces/0.8.x/IRandomizerV2.sol +15 -0
- package/contracts/legacy/GenArt721CoreV1.sol +1593 -0
- package/contracts/legacy/GenArt721LegacyMinter.sol +275 -0
- package/contracts/libs/0.5.x/CustomERC721Metadata.sol +52 -0
- package/contracts/libs/0.5.x/IERC20.sol +96 -0
- package/contracts/libs/0.5.x/SafeMath.sol +98 -0
- package/contracts/libs/0.5.x/Strings.sol +92 -0
- package/contracts/libs/0.8.x/BytecodeStorage.sol +314 -0
- package/contracts/libs/0.8.x/Bytes32Strings.sol +66 -0
- package/contracts/libs/0.8.x/ERC721_PackedHashSeed.sol +514 -0
- package/contracts/libs/integration-refs/delegation-registry/DelegationRegistry.sol +663 -0
- package/contracts/libs/integration-refs/gnosis-safe/GnosisSafeMock.sol +6 -0
- package/contracts/libs/integration-refs/gnosis-safe/GnosisSafeProxyFactoryMock.sol +6 -0
- package/contracts/libs/integration-refs/gnosis-safe/MultiSendMock.sol +6 -0
- package/contracts/minter-suite/MinterFilter/MinterFilterV0.sol +291 -0
- package/contracts/minter-suite/MinterFilter/MinterFilterV1.sol +320 -0
- package/contracts/minter-suite/Minters/MinterDAExp/MinterDAExpV2.sol +571 -0
- package/contracts/minter-suite/Minters/MinterDAExp/MinterDAExpV3.sol +622 -0
- package/contracts/minter-suite/Minters/MinterDAExpSettlement/MinterDAExpSettlementV0.sol +1066 -0
- package/contracts/minter-suite/Minters/MinterDALin/MinterDALinV2.sol +527 -0
- package/contracts/minter-suite/Minters/MinterDALin/MinterDALinV3.sol +576 -0
- package/contracts/minter-suite/Minters/MinterHolder/MinterHolderV2.sol +749 -0
- package/contracts/minter-suite/Minters/MinterHolder/MinterHolderV3.sol +798 -0
- package/contracts/minter-suite/Minters/MinterMerkle/MinterMerkleV3.sol +682 -0
- package/contracts/minter-suite/Minters/MinterMerkle/MinterMerkleV4.sol +733 -0
- package/contracts/minter-suite/Minters/MinterSetPrice/MinterSetPriceV2.sol +350 -0
- package/contracts/minter-suite/Minters/MinterSetPrice/MinterSetPriceV3.sol +401 -0
- package/contracts/minter-suite/Minters/MinterSetPrice/deprecated/MinterSetPriceV1.sol +274 -0
- package/contracts/minter-suite/Minters/MinterSetPriceERC20/MinterSetPriceERC20V2.sol +491 -0
- package/contracts/minter-suite/Minters/MinterSetPriceERC20/MinterSetPriceERC20V3.sol +542 -0
- package/contracts/minter-suite/Minters/MinterSetPriceERC20/deprecated/MinterSetPriceERC20V0.sol +470 -0
- package/contracts/mock/BytecodeTextCR_DMock.sol +184 -0
- package/contracts/mock/DeadReceiverMock.sol +13 -0
- package/contracts/mock/ERC20Mock.sol +11 -0
- package/contracts/mock/MockAdminACLV0.sol +65 -0
- package/contracts/mock/RandomizerV2_NoAssignMock.sol +43 -0
- package/contracts/mock/ReentrancyHolderMock.sol +50 -0
- package/contracts/mock/ReentrancyMerkleMock.sol +64 -0
- package/contracts/mock/ReentrancyMock.sol +44 -0
- package/contracts/royalty-registry/GenArt721RoyaltyOverride.sol +168 -0
- package/contracts/royalty-registry/GenArt721RoyaltyOverride_PBAB.sol +221 -0
- package/package.json +83 -0
|
@@ -0,0 +1,514 @@
|
|
|
1
|
+
// SPDX-License-Identifier: MIT
|
|
2
|
+
// OpenZeppelin Contracts (last updated v4.7.0) (token/ERC721/ERC721.sol)
|
|
3
|
+
|
|
4
|
+
pragma solidity ^0.8.0;
|
|
5
|
+
|
|
6
|
+
import "@openzeppelin-4.7/contracts/token/ERC721/IERC721.sol";
|
|
7
|
+
import "@openzeppelin-4.7/contracts/token/ERC721/IERC721Receiver.sol";
|
|
8
|
+
import "@openzeppelin-4.7/contracts/token/ERC721/extensions/IERC721Metadata.sol";
|
|
9
|
+
import "@openzeppelin-4.7/contracts/utils/Address.sol";
|
|
10
|
+
import "@openzeppelin-4.7/contracts/utils/Context.sol";
|
|
11
|
+
import "@openzeppelin-4.7/contracts/utils/Strings.sol";
|
|
12
|
+
import "@openzeppelin-4.7/contracts/utils/introspection/ERC165.sol";
|
|
13
|
+
|
|
14
|
+
/**
|
|
15
|
+
* @dev Forked version of the OpenZeppelin v4.7.1 ERC721 contract. Utilizes a
|
|
16
|
+
* struct to pack owner and hash seed into a single storage slot.
|
|
17
|
+
* ---------------------
|
|
18
|
+
* @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including
|
|
19
|
+
* the Metadata extension, but not including the Enumerable extension, which is available separately as
|
|
20
|
+
* {ERC721Enumerable}.
|
|
21
|
+
*/
|
|
22
|
+
contract ERC721_PackedHashSeed is Context, ERC165, IERC721, IERC721Metadata {
|
|
23
|
+
using Address for address;
|
|
24
|
+
using Strings for uint256;
|
|
25
|
+
|
|
26
|
+
// Token name
|
|
27
|
+
string private _name;
|
|
28
|
+
|
|
29
|
+
// Token symbol
|
|
30
|
+
string private _symbol;
|
|
31
|
+
|
|
32
|
+
/// struct to pack a token owner and hash seed into same storage slot
|
|
33
|
+
struct OwnerAndHashSeed {
|
|
34
|
+
// 20 bytes for address of token's owner
|
|
35
|
+
address owner;
|
|
36
|
+
// remaining 12 bytes allocated to token hash seed
|
|
37
|
+
bytes12 hashSeed;
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
/// mapping of token ID to OwnerAndHashSeed
|
|
41
|
+
/// @dev visibility internal so inheriting contracts can access
|
|
42
|
+
mapping(uint256 => OwnerAndHashSeed) internal _ownersAndHashSeeds;
|
|
43
|
+
|
|
44
|
+
// Mapping owner address to token count
|
|
45
|
+
mapping(address => uint256) private _balances;
|
|
46
|
+
|
|
47
|
+
// Mapping from token ID to approved address
|
|
48
|
+
mapping(uint256 => address) private _tokenApprovals;
|
|
49
|
+
|
|
50
|
+
// Mapping from owner to operator approvals
|
|
51
|
+
mapping(address => mapping(address => bool)) private _operatorApprovals;
|
|
52
|
+
|
|
53
|
+
/**
|
|
54
|
+
* @dev Initializes the contract by setting a `name` and a `symbol` to the token collection.
|
|
55
|
+
*/
|
|
56
|
+
constructor(string memory name_, string memory symbol_) {
|
|
57
|
+
_name = name_;
|
|
58
|
+
_symbol = symbol_;
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
/**
|
|
62
|
+
* @dev See {IERC165-supportsInterface}.
|
|
63
|
+
*/
|
|
64
|
+
function supportsInterface(
|
|
65
|
+
bytes4 interfaceId
|
|
66
|
+
) public view virtual override(ERC165, IERC165) returns (bool) {
|
|
67
|
+
return
|
|
68
|
+
interfaceId == type(IERC721).interfaceId ||
|
|
69
|
+
interfaceId == type(IERC721Metadata).interfaceId ||
|
|
70
|
+
super.supportsInterface(interfaceId);
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
/**
|
|
74
|
+
* @dev See {IERC721-balanceOf}.
|
|
75
|
+
*/
|
|
76
|
+
function balanceOf(
|
|
77
|
+
address owner
|
|
78
|
+
) public view virtual override returns (uint256) {
|
|
79
|
+
require(
|
|
80
|
+
owner != address(0),
|
|
81
|
+
"ERC721: address zero is not a valid owner"
|
|
82
|
+
);
|
|
83
|
+
return _balances[owner];
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
/**
|
|
87
|
+
* @dev See {IERC721-ownerOf}.
|
|
88
|
+
*/
|
|
89
|
+
function ownerOf(
|
|
90
|
+
uint256 tokenId
|
|
91
|
+
) public view virtual override returns (address) {
|
|
92
|
+
address owner = _ownersAndHashSeeds[tokenId].owner;
|
|
93
|
+
require(owner != address(0), "ERC721: invalid token ID");
|
|
94
|
+
return owner;
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
/**
|
|
98
|
+
* @dev See {IERC721Metadata-name}.
|
|
99
|
+
*/
|
|
100
|
+
function name() public view virtual override returns (string memory) {
|
|
101
|
+
return _name;
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
/**
|
|
105
|
+
* @dev See {IERC721Metadata-symbol}.
|
|
106
|
+
*/
|
|
107
|
+
function symbol() public view virtual override returns (string memory) {
|
|
108
|
+
return _symbol;
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
/**
|
|
112
|
+
* @dev See {IERC721Metadata-tokenURI}.
|
|
113
|
+
*/
|
|
114
|
+
function tokenURI(
|
|
115
|
+
uint256 tokenId
|
|
116
|
+
) public view virtual override returns (string memory) {
|
|
117
|
+
_requireMinted(tokenId);
|
|
118
|
+
|
|
119
|
+
string memory baseURI = _baseURI();
|
|
120
|
+
return
|
|
121
|
+
bytes(baseURI).length > 0
|
|
122
|
+
? string(abi.encodePacked(baseURI, tokenId.toString()))
|
|
123
|
+
: "";
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
/**
|
|
127
|
+
* @dev Base URI for computing {tokenURI}. If set, the resulting URI for each
|
|
128
|
+
* token will be the concatenation of the `baseURI` and the `tokenId`. Empty
|
|
129
|
+
* by default, can be overridden in child contracts.
|
|
130
|
+
*/
|
|
131
|
+
function _baseURI() internal view virtual returns (string memory) {
|
|
132
|
+
return "";
|
|
133
|
+
}
|
|
134
|
+
|
|
135
|
+
/**
|
|
136
|
+
* @dev See {IERC721-approve}.
|
|
137
|
+
*/
|
|
138
|
+
function approve(address to, uint256 tokenId) public virtual override {
|
|
139
|
+
address owner = ERC721_PackedHashSeed.ownerOf(tokenId);
|
|
140
|
+
require(to != owner, "ERC721: approval to current owner");
|
|
141
|
+
|
|
142
|
+
require(
|
|
143
|
+
_msgSender() == owner || isApprovedForAll(owner, _msgSender()),
|
|
144
|
+
"ERC721: approve caller is not token owner nor approved for all"
|
|
145
|
+
);
|
|
146
|
+
|
|
147
|
+
_approve(to, tokenId);
|
|
148
|
+
}
|
|
149
|
+
|
|
150
|
+
/**
|
|
151
|
+
* @dev See {IERC721-getApproved}.
|
|
152
|
+
*/
|
|
153
|
+
function getApproved(
|
|
154
|
+
uint256 tokenId
|
|
155
|
+
) public view virtual override returns (address) {
|
|
156
|
+
_requireMinted(tokenId);
|
|
157
|
+
|
|
158
|
+
return _tokenApprovals[tokenId];
|
|
159
|
+
}
|
|
160
|
+
|
|
161
|
+
/**
|
|
162
|
+
* @dev See {IERC721-setApprovalForAll}.
|
|
163
|
+
*/
|
|
164
|
+
function setApprovalForAll(
|
|
165
|
+
address operator,
|
|
166
|
+
bool approved
|
|
167
|
+
) public virtual override {
|
|
168
|
+
_setApprovalForAll(_msgSender(), operator, approved);
|
|
169
|
+
}
|
|
170
|
+
|
|
171
|
+
/**
|
|
172
|
+
* @dev See {IERC721-isApprovedForAll}.
|
|
173
|
+
*/
|
|
174
|
+
function isApprovedForAll(
|
|
175
|
+
address owner,
|
|
176
|
+
address operator
|
|
177
|
+
) public view virtual override returns (bool) {
|
|
178
|
+
return _operatorApprovals[owner][operator];
|
|
179
|
+
}
|
|
180
|
+
|
|
181
|
+
/**
|
|
182
|
+
* @dev See {IERC721-transferFrom}.
|
|
183
|
+
*/
|
|
184
|
+
function transferFrom(
|
|
185
|
+
address from,
|
|
186
|
+
address to,
|
|
187
|
+
uint256 tokenId
|
|
188
|
+
) public virtual override {
|
|
189
|
+
//solhint-disable-next-line max-line-length
|
|
190
|
+
require(
|
|
191
|
+
_isApprovedOrOwner(_msgSender(), tokenId),
|
|
192
|
+
"ERC721: caller is not token owner nor approved"
|
|
193
|
+
);
|
|
194
|
+
|
|
195
|
+
_transfer(from, to, tokenId);
|
|
196
|
+
}
|
|
197
|
+
|
|
198
|
+
/**
|
|
199
|
+
* @dev See {IERC721-safeTransferFrom}.
|
|
200
|
+
*/
|
|
201
|
+
function safeTransferFrom(
|
|
202
|
+
address from,
|
|
203
|
+
address to,
|
|
204
|
+
uint256 tokenId
|
|
205
|
+
) public virtual override {
|
|
206
|
+
safeTransferFrom(from, to, tokenId, "");
|
|
207
|
+
}
|
|
208
|
+
|
|
209
|
+
/**
|
|
210
|
+
* @dev See {IERC721-safeTransferFrom}.
|
|
211
|
+
*/
|
|
212
|
+
function safeTransferFrom(
|
|
213
|
+
address from,
|
|
214
|
+
address to,
|
|
215
|
+
uint256 tokenId,
|
|
216
|
+
bytes memory data
|
|
217
|
+
) public virtual override {
|
|
218
|
+
require(
|
|
219
|
+
_isApprovedOrOwner(_msgSender(), tokenId),
|
|
220
|
+
"ERC721: caller is not token owner nor approved"
|
|
221
|
+
);
|
|
222
|
+
_safeTransfer(from, to, tokenId, data);
|
|
223
|
+
}
|
|
224
|
+
|
|
225
|
+
/**
|
|
226
|
+
* @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients
|
|
227
|
+
* are aware of the ERC721 protocol to prevent tokens from being forever locked.
|
|
228
|
+
*
|
|
229
|
+
* `data` is additional data, it has no specified format and it is sent in call to `to`.
|
|
230
|
+
*
|
|
231
|
+
* This internal function is equivalent to {safeTransferFrom}, and can be used to e.g.
|
|
232
|
+
* implement alternative mechanisms to perform token transfer, such as signature-based.
|
|
233
|
+
*
|
|
234
|
+
* Requirements:
|
|
235
|
+
*
|
|
236
|
+
* - `from` cannot be the zero address.
|
|
237
|
+
* - `to` cannot be the zero address.
|
|
238
|
+
* - `tokenId` token must exist and be owned by `from`.
|
|
239
|
+
* - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
|
|
240
|
+
*
|
|
241
|
+
* Emits a {Transfer} event.
|
|
242
|
+
*/
|
|
243
|
+
function _safeTransfer(
|
|
244
|
+
address from,
|
|
245
|
+
address to,
|
|
246
|
+
uint256 tokenId,
|
|
247
|
+
bytes memory data
|
|
248
|
+
) internal virtual {
|
|
249
|
+
_transfer(from, to, tokenId);
|
|
250
|
+
require(
|
|
251
|
+
_checkOnERC721Received(from, to, tokenId, data),
|
|
252
|
+
"ERC721: transfer to non ERC721Receiver implementer"
|
|
253
|
+
);
|
|
254
|
+
}
|
|
255
|
+
|
|
256
|
+
/**
|
|
257
|
+
* @dev Returns whether `tokenId` exists.
|
|
258
|
+
*
|
|
259
|
+
* Tokens can be managed by their owner or approved accounts via {approve} or {setApprovalForAll}.
|
|
260
|
+
*
|
|
261
|
+
* Tokens start existing when they are minted (`_mint`),
|
|
262
|
+
* and stop existing when they are burned (`_burn`).
|
|
263
|
+
*/
|
|
264
|
+
function _exists(uint256 tokenId) internal view virtual returns (bool) {
|
|
265
|
+
return _ownersAndHashSeeds[tokenId].owner != address(0);
|
|
266
|
+
}
|
|
267
|
+
|
|
268
|
+
/**
|
|
269
|
+
* @dev Returns whether `spender` is allowed to manage `tokenId`.
|
|
270
|
+
*
|
|
271
|
+
* Requirements:
|
|
272
|
+
*
|
|
273
|
+
* - `tokenId` must exist.
|
|
274
|
+
*/
|
|
275
|
+
function _isApprovedOrOwner(
|
|
276
|
+
address spender,
|
|
277
|
+
uint256 tokenId
|
|
278
|
+
) internal view virtual returns (bool) {
|
|
279
|
+
address owner = ERC721_PackedHashSeed.ownerOf(tokenId);
|
|
280
|
+
return (spender == owner ||
|
|
281
|
+
isApprovedForAll(owner, spender) ||
|
|
282
|
+
getApproved(tokenId) == spender);
|
|
283
|
+
}
|
|
284
|
+
|
|
285
|
+
/**
|
|
286
|
+
* @dev Safely mints `tokenId` and transfers it to `to`.
|
|
287
|
+
*
|
|
288
|
+
* Requirements:
|
|
289
|
+
*
|
|
290
|
+
* - `tokenId` must not exist.
|
|
291
|
+
* - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
|
|
292
|
+
*
|
|
293
|
+
* Emits a {Transfer} event.
|
|
294
|
+
*/
|
|
295
|
+
function _safeMint(address to, uint256 tokenId) internal virtual {
|
|
296
|
+
_safeMint(to, tokenId, "");
|
|
297
|
+
}
|
|
298
|
+
|
|
299
|
+
/**
|
|
300
|
+
* @dev Same as {xref-ERC721-_safeMint-address-uint256-}[`_safeMint`], with an additional `data` parameter which is
|
|
301
|
+
* forwarded in {IERC721Receiver-onERC721Received} to contract recipients.
|
|
302
|
+
*/
|
|
303
|
+
function _safeMint(
|
|
304
|
+
address to,
|
|
305
|
+
uint256 tokenId,
|
|
306
|
+
bytes memory data
|
|
307
|
+
) internal virtual {
|
|
308
|
+
_mint(to, tokenId);
|
|
309
|
+
require(
|
|
310
|
+
_checkOnERC721Received(address(0), to, tokenId, data),
|
|
311
|
+
"ERC721: transfer to non ERC721Receiver implementer"
|
|
312
|
+
);
|
|
313
|
+
}
|
|
314
|
+
|
|
315
|
+
/**
|
|
316
|
+
* @dev Mints `tokenId` and transfers it to `to`.
|
|
317
|
+
*
|
|
318
|
+
* WARNING: Usage of this method is discouraged, use {_safeMint} whenever possible
|
|
319
|
+
*
|
|
320
|
+
* Requirements:
|
|
321
|
+
*
|
|
322
|
+
* - `tokenId` must not exist.
|
|
323
|
+
* - `to` cannot be the zero address.
|
|
324
|
+
*
|
|
325
|
+
* Emits a {Transfer} event.
|
|
326
|
+
*/
|
|
327
|
+
function _mint(address to, uint256 tokenId) internal virtual {
|
|
328
|
+
require(to != address(0), "ERC721: mint to the zero address");
|
|
329
|
+
require(!_exists(tokenId), "ERC721: token already minted");
|
|
330
|
+
|
|
331
|
+
_beforeTokenTransfer(address(0), to, tokenId);
|
|
332
|
+
|
|
333
|
+
_balances[to] += 1;
|
|
334
|
+
_ownersAndHashSeeds[tokenId].owner = to;
|
|
335
|
+
|
|
336
|
+
emit Transfer(address(0), to, tokenId);
|
|
337
|
+
|
|
338
|
+
_afterTokenTransfer(address(0), to, tokenId);
|
|
339
|
+
}
|
|
340
|
+
|
|
341
|
+
/**
|
|
342
|
+
* @dev Destroys `tokenId`.
|
|
343
|
+
* The approval is cleared when the token is burned.
|
|
344
|
+
*
|
|
345
|
+
* Requirements:
|
|
346
|
+
*
|
|
347
|
+
* - `tokenId` must exist.
|
|
348
|
+
*
|
|
349
|
+
* Emits a {Transfer} event.
|
|
350
|
+
*/
|
|
351
|
+
function _burn(uint256 tokenId) internal virtual {
|
|
352
|
+
address owner = ERC721_PackedHashSeed.ownerOf(tokenId);
|
|
353
|
+
|
|
354
|
+
_beforeTokenTransfer(owner, address(0), tokenId);
|
|
355
|
+
|
|
356
|
+
// Clear approvals
|
|
357
|
+
_approve(address(0), tokenId);
|
|
358
|
+
|
|
359
|
+
_balances[owner] -= 1;
|
|
360
|
+
delete _ownersAndHashSeeds[tokenId].owner;
|
|
361
|
+
|
|
362
|
+
emit Transfer(owner, address(0), tokenId);
|
|
363
|
+
|
|
364
|
+
_afterTokenTransfer(owner, address(0), tokenId);
|
|
365
|
+
}
|
|
366
|
+
|
|
367
|
+
/**
|
|
368
|
+
* @dev Transfers `tokenId` from `from` to `to`.
|
|
369
|
+
* As opposed to {transferFrom}, this imposes no restrictions on msg.sender.
|
|
370
|
+
*
|
|
371
|
+
* Requirements:
|
|
372
|
+
*
|
|
373
|
+
* - `to` cannot be the zero address.
|
|
374
|
+
* - `tokenId` token must be owned by `from`.
|
|
375
|
+
*
|
|
376
|
+
* Emits a {Transfer} event.
|
|
377
|
+
*/
|
|
378
|
+
function _transfer(
|
|
379
|
+
address from,
|
|
380
|
+
address to,
|
|
381
|
+
uint256 tokenId
|
|
382
|
+
) internal virtual {
|
|
383
|
+
require(
|
|
384
|
+
ERC721_PackedHashSeed.ownerOf(tokenId) == from,
|
|
385
|
+
"ERC721: transfer from incorrect owner"
|
|
386
|
+
);
|
|
387
|
+
require(to != address(0), "ERC721: transfer to the zero address");
|
|
388
|
+
|
|
389
|
+
_beforeTokenTransfer(from, to, tokenId);
|
|
390
|
+
|
|
391
|
+
// Clear approvals from the previous owner
|
|
392
|
+
_approve(address(0), tokenId);
|
|
393
|
+
|
|
394
|
+
_balances[from] -= 1;
|
|
395
|
+
_balances[to] += 1;
|
|
396
|
+
_ownersAndHashSeeds[tokenId].owner = to;
|
|
397
|
+
|
|
398
|
+
emit Transfer(from, to, tokenId);
|
|
399
|
+
|
|
400
|
+
_afterTokenTransfer(from, to, tokenId);
|
|
401
|
+
}
|
|
402
|
+
|
|
403
|
+
/**
|
|
404
|
+
* @dev Approve `to` to operate on `tokenId`
|
|
405
|
+
*
|
|
406
|
+
* Emits an {Approval} event.
|
|
407
|
+
*/
|
|
408
|
+
function _approve(address to, uint256 tokenId) internal virtual {
|
|
409
|
+
_tokenApprovals[tokenId] = to;
|
|
410
|
+
emit Approval(ERC721_PackedHashSeed.ownerOf(tokenId), to, tokenId);
|
|
411
|
+
}
|
|
412
|
+
|
|
413
|
+
/**
|
|
414
|
+
* @dev Approve `operator` to operate on all of `owner` tokens
|
|
415
|
+
*
|
|
416
|
+
* Emits an {ApprovalForAll} event.
|
|
417
|
+
*/
|
|
418
|
+
function _setApprovalForAll(
|
|
419
|
+
address owner,
|
|
420
|
+
address operator,
|
|
421
|
+
bool approved
|
|
422
|
+
) internal virtual {
|
|
423
|
+
require(owner != operator, "ERC721: approve to caller");
|
|
424
|
+
_operatorApprovals[owner][operator] = approved;
|
|
425
|
+
emit ApprovalForAll(owner, operator, approved);
|
|
426
|
+
}
|
|
427
|
+
|
|
428
|
+
/**
|
|
429
|
+
* @dev Reverts if the `tokenId` has not been minted yet.
|
|
430
|
+
*/
|
|
431
|
+
function _requireMinted(uint256 tokenId) internal view virtual {
|
|
432
|
+
require(_exists(tokenId), "ERC721: invalid token ID");
|
|
433
|
+
}
|
|
434
|
+
|
|
435
|
+
/**
|
|
436
|
+
* @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target address.
|
|
437
|
+
* The call is not executed if the target address is not a contract.
|
|
438
|
+
*
|
|
439
|
+
* @param from address representing the previous owner of the given token ID
|
|
440
|
+
* @param to target address that will receive the tokens
|
|
441
|
+
* @param tokenId uint256 ID of the token to be transferred
|
|
442
|
+
* @param data bytes optional data to send along with the call
|
|
443
|
+
* @return bool whether the call correctly returned the expected magic value
|
|
444
|
+
*/
|
|
445
|
+
function _checkOnERC721Received(
|
|
446
|
+
address from,
|
|
447
|
+
address to,
|
|
448
|
+
uint256 tokenId,
|
|
449
|
+
bytes memory data
|
|
450
|
+
) private returns (bool) {
|
|
451
|
+
if (to.isContract()) {
|
|
452
|
+
try
|
|
453
|
+
IERC721Receiver(to).onERC721Received(
|
|
454
|
+
_msgSender(),
|
|
455
|
+
from,
|
|
456
|
+
tokenId,
|
|
457
|
+
data
|
|
458
|
+
)
|
|
459
|
+
returns (bytes4 retval) {
|
|
460
|
+
return retval == IERC721Receiver.onERC721Received.selector;
|
|
461
|
+
} catch (bytes memory reason) {
|
|
462
|
+
if (reason.length == 0) {
|
|
463
|
+
revert(
|
|
464
|
+
"ERC721: transfer to non ERC721Receiver implementer"
|
|
465
|
+
);
|
|
466
|
+
} else {
|
|
467
|
+
/// @solidity memory-safe-assembly
|
|
468
|
+
assembly {
|
|
469
|
+
revert(add(32, reason), mload(reason))
|
|
470
|
+
}
|
|
471
|
+
}
|
|
472
|
+
}
|
|
473
|
+
} else {
|
|
474
|
+
return true;
|
|
475
|
+
}
|
|
476
|
+
}
|
|
477
|
+
|
|
478
|
+
/**
|
|
479
|
+
* @dev Hook that is called before any token transfer. This includes minting
|
|
480
|
+
* and burning.
|
|
481
|
+
*
|
|
482
|
+
* Calling conditions:
|
|
483
|
+
*
|
|
484
|
+
* - When `from` and `to` are both non-zero, ``from``'s `tokenId` will be
|
|
485
|
+
* transferred to `to`.
|
|
486
|
+
* - When `from` is zero, `tokenId` will be minted for `to`.
|
|
487
|
+
* - When `to` is zero, ``from``'s `tokenId` will be burned.
|
|
488
|
+
* - `from` and `to` are never both zero.
|
|
489
|
+
*
|
|
490
|
+
* To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
|
|
491
|
+
*/
|
|
492
|
+
function _beforeTokenTransfer(
|
|
493
|
+
address from,
|
|
494
|
+
address to,
|
|
495
|
+
uint256 tokenId
|
|
496
|
+
) internal virtual {}
|
|
497
|
+
|
|
498
|
+
/**
|
|
499
|
+
* @dev Hook that is called after any transfer of tokens. This includes
|
|
500
|
+
* minting and burning.
|
|
501
|
+
*
|
|
502
|
+
* Calling conditions:
|
|
503
|
+
*
|
|
504
|
+
* - when `from` and `to` are both non-zero.
|
|
505
|
+
* - `from` and `to` are never both zero.
|
|
506
|
+
*
|
|
507
|
+
* To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
|
|
508
|
+
*/
|
|
509
|
+
function _afterTokenTransfer(
|
|
510
|
+
address from,
|
|
511
|
+
address to,
|
|
512
|
+
uint256 tokenId
|
|
513
|
+
) internal virtual {}
|
|
514
|
+
}
|