@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,275 @@
|
|
|
1
|
+
// SPDX-License-Identifier: LGPL-3.0-only
|
|
2
|
+
// Creatd By: Art Blocks Inc.
|
|
3
|
+
|
|
4
|
+
import "../libs/0.5.x/SafeMath.sol";
|
|
5
|
+
import "../libs/0.5.x/Strings.sol";
|
|
6
|
+
import "../libs/0.5.x/IERC20.sol";
|
|
7
|
+
|
|
8
|
+
import "../interfaces/0.5.x/IGenArt721CoreContractV1.sol";
|
|
9
|
+
import "../interfaces/0.5.x/IBonusContract.sol";
|
|
10
|
+
|
|
11
|
+
pragma solidity ^0.5.0;
|
|
12
|
+
|
|
13
|
+
contract GenArt721LegacyMinter {
|
|
14
|
+
using SafeMath for uint256;
|
|
15
|
+
|
|
16
|
+
IGenArt721CoreContractV1 public artblocksContract;
|
|
17
|
+
|
|
18
|
+
uint256 constant ONE_MILLION = 1_000_000;
|
|
19
|
+
|
|
20
|
+
mapping(uint256 => bool) public projectIdToBonus;
|
|
21
|
+
mapping(uint256 => address) public projectIdToBonusContractAddress;
|
|
22
|
+
mapping(uint256 => bool) public contractFilterProject;
|
|
23
|
+
mapping(address => mapping(uint256 => uint256)) public projectMintCounter;
|
|
24
|
+
mapping(uint256 => uint256) public projectMintLimit;
|
|
25
|
+
mapping(uint256 => bool) public projectMaxHasBeenInvoked;
|
|
26
|
+
mapping(uint256 => uint256) public projectMaxInvocations;
|
|
27
|
+
|
|
28
|
+
constructor(address _genArt721Address) public {
|
|
29
|
+
artblocksContract = IGenArt721CoreContractV1(_genArt721Address);
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
function getYourBalanceOfProjectERC20(
|
|
33
|
+
uint256 _projectId
|
|
34
|
+
) public view returns (uint256) {
|
|
35
|
+
uint256 balance = IERC20(
|
|
36
|
+
artblocksContract.projectIdToCurrencyAddress(_projectId)
|
|
37
|
+
).balanceOf(msg.sender);
|
|
38
|
+
return balance;
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
function checkYourAllowanceOfProjectERC20(
|
|
42
|
+
uint256 _projectId
|
|
43
|
+
) public view returns (uint256) {
|
|
44
|
+
uint256 remaining = IERC20(
|
|
45
|
+
artblocksContract.projectIdToCurrencyAddress(_projectId)
|
|
46
|
+
).allowance(msg.sender, address(this));
|
|
47
|
+
return remaining;
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
function setProjectMintLimit(uint256 _projectId, uint8 _limit) public {
|
|
51
|
+
require(
|
|
52
|
+
artblocksContract.isWhitelisted(msg.sender),
|
|
53
|
+
"can only be set by admin"
|
|
54
|
+
);
|
|
55
|
+
projectMintLimit[_projectId] = _limit;
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
function setProjectMaxInvocations(uint256 _projectId) public {
|
|
59
|
+
require(
|
|
60
|
+
artblocksContract.isWhitelisted(msg.sender),
|
|
61
|
+
"can only be set by admin"
|
|
62
|
+
);
|
|
63
|
+
uint256 maxInvocations;
|
|
64
|
+
uint256 invocations;
|
|
65
|
+
(, , invocations, maxInvocations, , , , , ) = artblocksContract
|
|
66
|
+
.projectTokenInfo(_projectId);
|
|
67
|
+
projectMaxInvocations[_projectId] = maxInvocations;
|
|
68
|
+
if (invocations < maxInvocations) {
|
|
69
|
+
projectMaxHasBeenInvoked[_projectId] = false;
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
function toggleContractFilter(uint256 _projectId) public {
|
|
74
|
+
require(
|
|
75
|
+
artblocksContract.isWhitelisted(msg.sender),
|
|
76
|
+
"can only be set by admin"
|
|
77
|
+
);
|
|
78
|
+
contractFilterProject[_projectId] = !contractFilterProject[_projectId];
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
function artistToggleBonus(uint256 _projectId) public {
|
|
82
|
+
require(
|
|
83
|
+
msg.sender ==
|
|
84
|
+
artblocksContract.projectIdToArtistAddress(_projectId),
|
|
85
|
+
"can only be set by artist"
|
|
86
|
+
);
|
|
87
|
+
projectIdToBonus[_projectId] = !projectIdToBonus[_projectId];
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
function artistSetBonusContractAddress(
|
|
91
|
+
uint256 _projectId,
|
|
92
|
+
address _bonusContractAddress
|
|
93
|
+
) public {
|
|
94
|
+
require(
|
|
95
|
+
msg.sender ==
|
|
96
|
+
artblocksContract.projectIdToArtistAddress(_projectId),
|
|
97
|
+
"can only be set by artist"
|
|
98
|
+
);
|
|
99
|
+
projectIdToBonusContractAddress[_projectId] = _bonusContractAddress;
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
function purchase(
|
|
103
|
+
uint256 _projectId
|
|
104
|
+
) public payable returns (uint256 _tokenId) {
|
|
105
|
+
return purchaseTo(msg.sender, _projectId);
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
//removed public and payable
|
|
109
|
+
function purchaseTo(
|
|
110
|
+
address _to,
|
|
111
|
+
uint256 _projectId
|
|
112
|
+
) private returns (uint256 _tokenId) {
|
|
113
|
+
require(
|
|
114
|
+
!projectMaxHasBeenInvoked[_projectId],
|
|
115
|
+
"Maximum number of invocations reached"
|
|
116
|
+
);
|
|
117
|
+
if (
|
|
118
|
+
keccak256(
|
|
119
|
+
abi.encodePacked(
|
|
120
|
+
artblocksContract.projectIdToCurrencySymbol(_projectId)
|
|
121
|
+
)
|
|
122
|
+
) != keccak256(abi.encodePacked("ETH"))
|
|
123
|
+
) {
|
|
124
|
+
require(
|
|
125
|
+
msg.value == 0,
|
|
126
|
+
"this project accepts a different currency and cannot accept ETH"
|
|
127
|
+
);
|
|
128
|
+
require(
|
|
129
|
+
IERC20(artblocksContract.projectIdToCurrencyAddress(_projectId))
|
|
130
|
+
.allowance(msg.sender, address(this)) >=
|
|
131
|
+
artblocksContract.projectIdToPricePerTokenInWei(_projectId),
|
|
132
|
+
"Insufficient Funds Approved for TX"
|
|
133
|
+
);
|
|
134
|
+
require(
|
|
135
|
+
IERC20(artblocksContract.projectIdToCurrencyAddress(_projectId))
|
|
136
|
+
.balanceOf(msg.sender) >=
|
|
137
|
+
artblocksContract.projectIdToPricePerTokenInWei(_projectId),
|
|
138
|
+
"Insufficient balance."
|
|
139
|
+
);
|
|
140
|
+
_splitFundsERC20(_projectId);
|
|
141
|
+
} else {
|
|
142
|
+
require(
|
|
143
|
+
msg.value >=
|
|
144
|
+
artblocksContract.projectIdToPricePerTokenInWei(_projectId),
|
|
145
|
+
"Must send minimum value to mint!"
|
|
146
|
+
);
|
|
147
|
+
_splitFundsETH(_projectId);
|
|
148
|
+
}
|
|
149
|
+
|
|
150
|
+
// if contract filter is active prevent calls from another contract
|
|
151
|
+
if (contractFilterProject[_projectId])
|
|
152
|
+
require(msg.sender == tx.origin, "No Contract Buys");
|
|
153
|
+
|
|
154
|
+
// limit mints per address by project
|
|
155
|
+
if (projectMintLimit[_projectId] > 0) {
|
|
156
|
+
require(
|
|
157
|
+
projectMintCounter[msg.sender][_projectId] <
|
|
158
|
+
projectMintLimit[_projectId],
|
|
159
|
+
"Reached minting limit"
|
|
160
|
+
);
|
|
161
|
+
projectMintCounter[msg.sender][_projectId]++;
|
|
162
|
+
}
|
|
163
|
+
|
|
164
|
+
uint256 tokenId = artblocksContract.mint(_to, _projectId, msg.sender);
|
|
165
|
+
// What if this overflows, since default value of uint256 is 0?
|
|
166
|
+
// that is intended, so that by default the minter allows infinite transactions,
|
|
167
|
+
// allowing the artblocks contract to stop minting
|
|
168
|
+
// uint256 tokenInvocation = tokenId % ONE_MILLION;
|
|
169
|
+
if (tokenId % ONE_MILLION == projectMaxInvocations[_projectId] - 1) {
|
|
170
|
+
projectMaxHasBeenInvoked[_projectId] = true;
|
|
171
|
+
}
|
|
172
|
+
|
|
173
|
+
if (projectIdToBonus[_projectId]) {
|
|
174
|
+
require(
|
|
175
|
+
IBonusContract(projectIdToBonusContractAddress[_projectId])
|
|
176
|
+
.bonusIsActive(),
|
|
177
|
+
"bonus must be active"
|
|
178
|
+
);
|
|
179
|
+
IBonusContract(projectIdToBonusContractAddress[_projectId])
|
|
180
|
+
.triggerBonus(msg.sender);
|
|
181
|
+
}
|
|
182
|
+
|
|
183
|
+
return tokenId;
|
|
184
|
+
}
|
|
185
|
+
|
|
186
|
+
function _splitFundsETH(uint256 _projectId) internal {
|
|
187
|
+
if (msg.value > 0) {
|
|
188
|
+
uint256 pricePerTokenInWei = artblocksContract
|
|
189
|
+
.projectIdToPricePerTokenInWei(_projectId);
|
|
190
|
+
uint256 refund = msg.value.sub(
|
|
191
|
+
artblocksContract.projectIdToPricePerTokenInWei(_projectId)
|
|
192
|
+
);
|
|
193
|
+
if (refund > 0) {
|
|
194
|
+
msg.sender.transfer(refund);
|
|
195
|
+
}
|
|
196
|
+
uint256 foundationAmount = pricePerTokenInWei.div(100).mul(
|
|
197
|
+
artblocksContract.artblocksPercentage()
|
|
198
|
+
);
|
|
199
|
+
if (foundationAmount > 0) {
|
|
200
|
+
artblocksContract.artblocksAddress().transfer(foundationAmount);
|
|
201
|
+
}
|
|
202
|
+
uint256 projectFunds = pricePerTokenInWei.sub(foundationAmount);
|
|
203
|
+
uint256 additionalPayeeAmount;
|
|
204
|
+
if (
|
|
205
|
+
artblocksContract.projectIdToAdditionalPayeePercentage(
|
|
206
|
+
_projectId
|
|
207
|
+
) > 0
|
|
208
|
+
) {
|
|
209
|
+
additionalPayeeAmount = projectFunds.div(100).mul(
|
|
210
|
+
artblocksContract.projectIdToAdditionalPayeePercentage(
|
|
211
|
+
_projectId
|
|
212
|
+
)
|
|
213
|
+
);
|
|
214
|
+
if (additionalPayeeAmount > 0) {
|
|
215
|
+
artblocksContract
|
|
216
|
+
.projectIdToAdditionalPayee(_projectId)
|
|
217
|
+
.transfer(additionalPayeeAmount);
|
|
218
|
+
}
|
|
219
|
+
}
|
|
220
|
+
uint256 creatorFunds = projectFunds.sub(additionalPayeeAmount);
|
|
221
|
+
if (creatorFunds > 0) {
|
|
222
|
+
artblocksContract.projectIdToArtistAddress(_projectId).transfer(
|
|
223
|
+
creatorFunds
|
|
224
|
+
);
|
|
225
|
+
}
|
|
226
|
+
}
|
|
227
|
+
}
|
|
228
|
+
|
|
229
|
+
function _splitFundsERC20(uint256 _projectId) internal {
|
|
230
|
+
uint256 pricePerTokenInWei = artblocksContract
|
|
231
|
+
.projectIdToPricePerTokenInWei(_projectId);
|
|
232
|
+
uint256 foundationAmount = pricePerTokenInWei.div(100).mul(
|
|
233
|
+
artblocksContract.artblocksPercentage()
|
|
234
|
+
);
|
|
235
|
+
if (foundationAmount > 0) {
|
|
236
|
+
IERC20(artblocksContract.projectIdToCurrencyAddress(_projectId))
|
|
237
|
+
.transferFrom(
|
|
238
|
+
msg.sender,
|
|
239
|
+
artblocksContract.artblocksAddress(),
|
|
240
|
+
foundationAmount
|
|
241
|
+
);
|
|
242
|
+
}
|
|
243
|
+
uint256 projectFunds = pricePerTokenInWei.sub(foundationAmount);
|
|
244
|
+
uint256 additionalPayeeAmount;
|
|
245
|
+
if (
|
|
246
|
+
artblocksContract.projectIdToAdditionalPayeePercentage(_projectId) >
|
|
247
|
+
0
|
|
248
|
+
) {
|
|
249
|
+
additionalPayeeAmount = projectFunds.div(100).mul(
|
|
250
|
+
artblocksContract.projectIdToAdditionalPayeePercentage(
|
|
251
|
+
_projectId
|
|
252
|
+
)
|
|
253
|
+
);
|
|
254
|
+
if (additionalPayeeAmount > 0) {
|
|
255
|
+
IERC20(artblocksContract.projectIdToCurrencyAddress(_projectId))
|
|
256
|
+
.transferFrom(
|
|
257
|
+
msg.sender,
|
|
258
|
+
artblocksContract.projectIdToAdditionalPayee(
|
|
259
|
+
_projectId
|
|
260
|
+
),
|
|
261
|
+
additionalPayeeAmount
|
|
262
|
+
);
|
|
263
|
+
}
|
|
264
|
+
}
|
|
265
|
+
uint256 creatorFunds = projectFunds.sub(additionalPayeeAmount);
|
|
266
|
+
if (creatorFunds > 0) {
|
|
267
|
+
IERC20(artblocksContract.projectIdToCurrencyAddress(_projectId))
|
|
268
|
+
.transferFrom(
|
|
269
|
+
msg.sender,
|
|
270
|
+
artblocksContract.projectIdToArtistAddress(_projectId),
|
|
271
|
+
creatorFunds
|
|
272
|
+
);
|
|
273
|
+
}
|
|
274
|
+
}
|
|
275
|
+
}
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
// SPDX-License-Identifier: LGPL-3.0-only
|
|
2
|
+
// Created By: Art Blocks Inc.
|
|
3
|
+
|
|
4
|
+
// **Please Note**: This library is not necessary for ^0.8.0 contracts and thus
|
|
5
|
+
// only exists for posterity reasons for compatibility with
|
|
6
|
+
// existing already-deployed ^0.5.0 PBAB contracts.
|
|
7
|
+
|
|
8
|
+
pragma solidity ^0.5.0;
|
|
9
|
+
|
|
10
|
+
import "@openzeppelin-0.5/contracts/introspection/ERC165.sol";
|
|
11
|
+
import "@openzeppelin-0.5/contracts/token/ERC721/ERC721.sol";
|
|
12
|
+
import "@openzeppelin-0.5/contracts/token/ERC721/ERC721Enumerable.sol";
|
|
13
|
+
|
|
14
|
+
/**
|
|
15
|
+
* ERC721 base contract without the concept of tokenUri as this is managed by the parent
|
|
16
|
+
*/
|
|
17
|
+
contract CustomERC721Metadata is ERC165, ERC721, ERC721Enumerable {
|
|
18
|
+
// Token name
|
|
19
|
+
string private _name;
|
|
20
|
+
|
|
21
|
+
// Token symbol
|
|
22
|
+
string private _symbol;
|
|
23
|
+
|
|
24
|
+
bytes4 private constant _INTERFACE_ID_ERC721_METADATA = 0x5b5e139f;
|
|
25
|
+
|
|
26
|
+
/**
|
|
27
|
+
* @dev Constructor function
|
|
28
|
+
*/
|
|
29
|
+
constructor(string memory name, string memory symbol) public {
|
|
30
|
+
_name = name;
|
|
31
|
+
_symbol = symbol;
|
|
32
|
+
|
|
33
|
+
// register the supported interfaces to conform to ERC721 via ERC165
|
|
34
|
+
_registerInterface(_INTERFACE_ID_ERC721_METADATA);
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
/**
|
|
38
|
+
* @dev Gets the token name
|
|
39
|
+
* @return string representing the token name
|
|
40
|
+
*/
|
|
41
|
+
function name() external view returns (string memory) {
|
|
42
|
+
return _name;
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
/**
|
|
46
|
+
* @dev Gets the token symbol
|
|
47
|
+
* @return string representing the token symbol
|
|
48
|
+
*/
|
|
49
|
+
function symbol() external view returns (string memory) {
|
|
50
|
+
return _symbol;
|
|
51
|
+
}
|
|
52
|
+
}
|
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
// SPDX-License-Identifier: MIT
|
|
2
|
+
// OpenZeppelin Contracts v4.4.0 (token/ERC20/IERC20.sol)
|
|
3
|
+
|
|
4
|
+
// **Please Note**: This library is not necessary for ^0.8.0 contracts and thus
|
|
5
|
+
// only exists for posterity reasons for compatibility with
|
|
6
|
+
// existing already-deployed ^0.5.0 PBAB contracts.
|
|
7
|
+
|
|
8
|
+
pragma solidity ^0.5.0;
|
|
9
|
+
|
|
10
|
+
/**
|
|
11
|
+
* @dev Interface of the ERC20 standard as defined in the EIP.
|
|
12
|
+
*/
|
|
13
|
+
interface IERC20 {
|
|
14
|
+
/**
|
|
15
|
+
* @dev Returns the amount of tokens in existence.
|
|
16
|
+
*/
|
|
17
|
+
function totalSupply() external view returns (uint256);
|
|
18
|
+
|
|
19
|
+
/**
|
|
20
|
+
* @dev Returns the amount of tokens owned by `account`.
|
|
21
|
+
*/
|
|
22
|
+
function balanceOf(address account) external view returns (uint256);
|
|
23
|
+
|
|
24
|
+
/**
|
|
25
|
+
* @dev Moves `amount` tokens from the caller's account to `recipient`.
|
|
26
|
+
*
|
|
27
|
+
* Returns a boolean value indicating whether the operation succeeded.
|
|
28
|
+
*
|
|
29
|
+
* Emits a {Transfer} event.
|
|
30
|
+
*/
|
|
31
|
+
function transfer(
|
|
32
|
+
address recipient,
|
|
33
|
+
uint256 amount
|
|
34
|
+
) external returns (bool);
|
|
35
|
+
|
|
36
|
+
/**
|
|
37
|
+
* @dev Returns the remaining number of tokens that `spender` will be
|
|
38
|
+
* allowed to spend on behalf of `owner` through {transferFrom}. This is
|
|
39
|
+
* zero by default.
|
|
40
|
+
*
|
|
41
|
+
* This value changes when {approve} or {transferFrom} are called.
|
|
42
|
+
*/
|
|
43
|
+
function allowance(
|
|
44
|
+
address owner,
|
|
45
|
+
address spender
|
|
46
|
+
) external view returns (uint256);
|
|
47
|
+
|
|
48
|
+
/**
|
|
49
|
+
* @dev Sets `amount` as the allowance of `spender` over the caller's tokens.
|
|
50
|
+
*
|
|
51
|
+
* Returns a boolean value indicating whether the operation succeeded.
|
|
52
|
+
*
|
|
53
|
+
* IMPORTANT: Beware that changing an allowance with this method brings the risk
|
|
54
|
+
* that someone may use both the old and the new allowance by unfortunate
|
|
55
|
+
* transaction ordering. One possible solution to mitigate this race
|
|
56
|
+
* condition is to first reduce the spender's allowance to 0 and set the
|
|
57
|
+
* desired value afterwards:
|
|
58
|
+
* https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729
|
|
59
|
+
*
|
|
60
|
+
* Emits an {Approval} event.
|
|
61
|
+
*/
|
|
62
|
+
function approve(address spender, uint256 amount) external returns (bool);
|
|
63
|
+
|
|
64
|
+
/**
|
|
65
|
+
* @dev Moves `amount` tokens from `sender` to `recipient` using the
|
|
66
|
+
* allowance mechanism. `amount` is then deducted from the caller's
|
|
67
|
+
* allowance.
|
|
68
|
+
*
|
|
69
|
+
* Returns a boolean value indicating whether the operation succeeded.
|
|
70
|
+
*
|
|
71
|
+
* Emits a {Transfer} event.
|
|
72
|
+
*/
|
|
73
|
+
function transferFrom(
|
|
74
|
+
address sender,
|
|
75
|
+
address recipient,
|
|
76
|
+
uint256 amount
|
|
77
|
+
) external returns (bool);
|
|
78
|
+
|
|
79
|
+
/**
|
|
80
|
+
* @dev Emitted when `value` tokens are moved from one account (`from`) to
|
|
81
|
+
* another (`to`).
|
|
82
|
+
*
|
|
83
|
+
* Note that `value` may be zero.
|
|
84
|
+
*/
|
|
85
|
+
event Transfer(address indexed from, address indexed to, uint256 value);
|
|
86
|
+
|
|
87
|
+
/**
|
|
88
|
+
* @dev Emitted when the allowance of a `spender` for an `owner` is set by
|
|
89
|
+
* a call to {approve}. `value` is the new allowance.
|
|
90
|
+
*/
|
|
91
|
+
event Approval(
|
|
92
|
+
address indexed owner,
|
|
93
|
+
address indexed spender,
|
|
94
|
+
uint256 value
|
|
95
|
+
);
|
|
96
|
+
}
|
|
@@ -0,0 +1,98 @@
|
|
|
1
|
+
// SPDX-License-Identifier: MIT
|
|
2
|
+
// File: openzeppelin-solidity/contracts/math/SafeMath.sol
|
|
3
|
+
|
|
4
|
+
// **Please Note**: This library is not necessary for ^0.8.0 contracts and thus
|
|
5
|
+
// only exists for posterity reasons for compatibility with
|
|
6
|
+
// existing already-deployed ^0.5.0 PBAB contracts.
|
|
7
|
+
|
|
8
|
+
pragma solidity ^0.5.0;
|
|
9
|
+
|
|
10
|
+
/**
|
|
11
|
+
* @dev Wrappers over Solidity's arithmetic operations with added overflow
|
|
12
|
+
* checks.
|
|
13
|
+
*
|
|
14
|
+
* Arithmetic operations in Solidity wrap on overflow. This can easily result
|
|
15
|
+
* in bugs, because programmers usually assume that an overflow raises an
|
|
16
|
+
* error, which is the standard behavior in high level programming languages.
|
|
17
|
+
* `SafeMath` restores this intuition by reverting the transaction when an
|
|
18
|
+
* operation overflows.
|
|
19
|
+
*
|
|
20
|
+
* Using this library instead of the unchecked operations eliminates an entire
|
|
21
|
+
* class of bugs, so it's recommended to use it always.
|
|
22
|
+
*/
|
|
23
|
+
library SafeMath {
|
|
24
|
+
/**
|
|
25
|
+
* @dev Returns the addition of two unsigned integers, reverting on
|
|
26
|
+
* overflow.
|
|
27
|
+
*
|
|
28
|
+
* Counterpart to Solidity's `+` operator.
|
|
29
|
+
*
|
|
30
|
+
* Requirements:
|
|
31
|
+
* - Addition cannot overflow.
|
|
32
|
+
*/
|
|
33
|
+
function add(uint256 a, uint256 b) internal pure returns (uint256) {
|
|
34
|
+
uint256 c = a + b;
|
|
35
|
+
require(c >= a, "SafeMath: addition overflow");
|
|
36
|
+
|
|
37
|
+
return c;
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
/**
|
|
41
|
+
* @dev Returns the subtraction of two unsigned integers, reverting on
|
|
42
|
+
* overflow (when the result is negative).
|
|
43
|
+
*
|
|
44
|
+
* Counterpart to Solidity's `-` operator.
|
|
45
|
+
*
|
|
46
|
+
* Requirements:
|
|
47
|
+
* - Subtraction cannot overflow.
|
|
48
|
+
*/
|
|
49
|
+
function sub(uint256 a, uint256 b) internal pure returns (uint256) {
|
|
50
|
+
require(b <= a, "SafeMath: subtraction overflow");
|
|
51
|
+
uint256 c = a - b;
|
|
52
|
+
|
|
53
|
+
return c;
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
/**
|
|
57
|
+
* @dev Returns the multiplication of two unsigned integers, reverting on
|
|
58
|
+
* overflow.
|
|
59
|
+
*
|
|
60
|
+
* Counterpart to Solidity's `*` operator.
|
|
61
|
+
*
|
|
62
|
+
* Requirements:
|
|
63
|
+
* - Multiplication cannot overflow.
|
|
64
|
+
*/
|
|
65
|
+
function mul(uint256 a, uint256 b) internal pure returns (uint256) {
|
|
66
|
+
// Gas optimization: this is cheaper than requiring 'a' not being zero, but the
|
|
67
|
+
// benefit is lost if 'b' is also tested.
|
|
68
|
+
// See: https://github.com/OpenZeppelin/openzeppelin-solidity/pull/522
|
|
69
|
+
if (a == 0) {
|
|
70
|
+
return 0;
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
uint256 c = a * b;
|
|
74
|
+
require(c / a == b, "SafeMath: multiplication overflow");
|
|
75
|
+
|
|
76
|
+
return c;
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
/**
|
|
80
|
+
* @dev Returns the integer division of two unsigned integers. Reverts on
|
|
81
|
+
* division by zero. The result is rounded towards zero.
|
|
82
|
+
*
|
|
83
|
+
* Counterpart to Solidity's `/` operator. Note: this function uses a
|
|
84
|
+
* `revert` opcode (which leaves remaining gas untouched) while Solidity
|
|
85
|
+
* uses an invalid opcode to revert (consuming all remaining gas).
|
|
86
|
+
*
|
|
87
|
+
* Requirements:
|
|
88
|
+
* - The divisor cannot be zero.
|
|
89
|
+
*/
|
|
90
|
+
function div(uint256 a, uint256 b) internal pure returns (uint256) {
|
|
91
|
+
// Solidity only automatically asserts when dividing by 0
|
|
92
|
+
require(b > 0, "SafeMath: division by zero");
|
|
93
|
+
uint256 c = a / b;
|
|
94
|
+
// assert(a == b * c + a % b); // There is no case in which this doesn't hold
|
|
95
|
+
|
|
96
|
+
return c;
|
|
97
|
+
}
|
|
98
|
+
}
|
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
// SPDX-License-Identifier: MIT
|
|
2
|
+
// File: contracts/Strings.sol
|
|
3
|
+
// Source: https://github.com/oraclize/ethereum-api/blob/master/oraclizeAPI_0.5.sol
|
|
4
|
+
|
|
5
|
+
// **Please Note**: This library is not necessary for ^0.8.0 contracts and thus
|
|
6
|
+
// only exists for posterity reasons for compatibility with
|
|
7
|
+
// existing already-deployed ^0.5.0 PBAB contracts.
|
|
8
|
+
|
|
9
|
+
pragma solidity ^0.5.0;
|
|
10
|
+
|
|
11
|
+
library Strings {
|
|
12
|
+
function strConcat(
|
|
13
|
+
string memory _a,
|
|
14
|
+
string memory _b
|
|
15
|
+
) internal pure returns (string memory _concatenatedString) {
|
|
16
|
+
return strConcat(_a, _b, "", "", "");
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
function strConcat(
|
|
20
|
+
string memory _a,
|
|
21
|
+
string memory _b,
|
|
22
|
+
string memory _c
|
|
23
|
+
) internal pure returns (string memory _concatenatedString) {
|
|
24
|
+
return strConcat(_a, _b, _c, "", "");
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
function strConcat(
|
|
28
|
+
string memory _a,
|
|
29
|
+
string memory _b,
|
|
30
|
+
string memory _c,
|
|
31
|
+
string memory _d
|
|
32
|
+
) internal pure returns (string memory _concatenatedString) {
|
|
33
|
+
return strConcat(_a, _b, _c, _d, "");
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
function strConcat(
|
|
37
|
+
string memory _a,
|
|
38
|
+
string memory _b,
|
|
39
|
+
string memory _c,
|
|
40
|
+
string memory _d,
|
|
41
|
+
string memory _e
|
|
42
|
+
) internal pure returns (string memory _concatenatedString) {
|
|
43
|
+
bytes memory _ba = bytes(_a);
|
|
44
|
+
bytes memory _bb = bytes(_b);
|
|
45
|
+
bytes memory _bc = bytes(_c);
|
|
46
|
+
bytes memory _bd = bytes(_d);
|
|
47
|
+
bytes memory _be = bytes(_e);
|
|
48
|
+
string memory abcde = new string(
|
|
49
|
+
_ba.length + _bb.length + _bc.length + _bd.length + _be.length
|
|
50
|
+
);
|
|
51
|
+
bytes memory babcde = bytes(abcde);
|
|
52
|
+
uint256 k = 0;
|
|
53
|
+
uint256 i = 0;
|
|
54
|
+
for (i = 0; i < _ba.length; i++) {
|
|
55
|
+
babcde[k++] = _ba[i];
|
|
56
|
+
}
|
|
57
|
+
for (i = 0; i < _bb.length; i++) {
|
|
58
|
+
babcde[k++] = _bb[i];
|
|
59
|
+
}
|
|
60
|
+
for (i = 0; i < _bc.length; i++) {
|
|
61
|
+
babcde[k++] = _bc[i];
|
|
62
|
+
}
|
|
63
|
+
for (i = 0; i < _bd.length; i++) {
|
|
64
|
+
babcde[k++] = _bd[i];
|
|
65
|
+
}
|
|
66
|
+
for (i = 0; i < _be.length; i++) {
|
|
67
|
+
babcde[k++] = _be[i];
|
|
68
|
+
}
|
|
69
|
+
return string(babcde);
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
function uint2str(
|
|
73
|
+
uint256 _i
|
|
74
|
+
) internal pure returns (string memory _uintAsString) {
|
|
75
|
+
if (_i == 0) {
|
|
76
|
+
return "0";
|
|
77
|
+
}
|
|
78
|
+
uint256 j = _i;
|
|
79
|
+
uint256 len;
|
|
80
|
+
while (j != 0) {
|
|
81
|
+
len++;
|
|
82
|
+
j /= 10;
|
|
83
|
+
}
|
|
84
|
+
bytes memory bstr = new bytes(len);
|
|
85
|
+
uint256 k = len - 1;
|
|
86
|
+
while (_i != 0) {
|
|
87
|
+
bstr[k--] = bytes1(uint8(48 + (_i % 10)));
|
|
88
|
+
_i /= 10;
|
|
89
|
+
}
|
|
90
|
+
return string(bstr);
|
|
91
|
+
}
|
|
92
|
+
}
|