Contract 0xd73b53cBe6A5FE32Ae4aE475d4EA9307bD7aAAfA

Contract Overview

Balance:
0 Ether
Txn Hash
Method
Block
From
To
Value
0x55e419604bbf3f6a809d0f1aa92fd103eaa3ad0a65c43c2e58998701ceba8b77Mint112290222022-08-19 9:22:13100 days 10 hrs ago0x217b3afaf29c7c7ceb30f494bda97807b2c54958 IN  0xd73b53cbe6a5fe32ae4ae475d4ea9307bd7aaafa0.01 Ether0.00023786 1.58476914
0x7c811953718f5eb564e31d36bc5611bb6f19e2bb9e3ec29d30968b19a600b849Mint112288172022-08-19 8:30:42100 days 10 hrs ago0x217b3afaf29c7c7ceb30f494bda97807b2c54958 IN  0xd73b53cbe6a5fe32ae4ae475d4ea9307bd7aaafa0.01 Ether0.00022514 1.50000985
0x6a95a9fcee526c294739b91a6dedb3abb51dd35eb20e476b20e51bd66772eef9Mint112288162022-08-19 8:30:27100 days 10 hrs ago0x217b3afaf29c7c7ceb30f494bda97807b2c54958 IN  0xd73b53cbe6a5fe32ae4ae475d4ea9307bd7aaafa0.01 Ether0.00022514 1.5000092
0x6fc593f57abcfae84309c4778c798ba1a279c58a3307d11d362ba1b615dffa76Mint112287042022-08-19 8:02:25100 days 11 hrs ago0x217b3afaf29c7c7ceb30f494bda97807b2c54958 IN  0xd73b53cbe6a5fe32ae4ae475d4ea9307bd7aaafa0.01 Ether0.00022514 1.50000007
0x9131f5c712c5a31c4e49af4f8d006c90a9a095930f38d376fb8b2f1bfac6d911Mint112286192022-08-19 7:41:10100 days 11 hrs ago0x217b3afaf29c7c7ceb30f494bda97807b2c54958 IN  0xd73b53cbe6a5fe32ae4ae475d4ea9307bd7aaafa0.01 Ether0.00022514 1.50000002
0x05775377f7505c29eb42db4bb6f8107fd807b83f239cc5c74f29c5f1e6acab68Mint112286122022-08-19 7:39:25100 days 11 hrs ago0x217b3afaf29c7c7ceb30f494bda97807b2c54958 IN  0xd73b53cbe6a5fe32ae4ae475d4ea9307bd7aaafa0.01 Ether0.00032774 1.50000001
0xf5834945ff74f302d28972a9ff443d6ea61803c7074e34b87b5578949d4d1404Add Campaign112285822022-08-19 7:31:55100 days 11 hrs ago0x217b3afaf29c7c7ceb30f494bda97807b2c54958 IN  0xd73b53cbe6a5fe32ae4ae475d4ea9307bd7aaafa0 Ether0.00028999 1.00000001
0x61c747fc7c839a8889ee8300122e27bbb74d8bb6668bcebb10efaffb89c572ceMint111595152022-08-07 7:12:08112 days 12 hrs ago0x217b3afaf29c7c7ceb30f494bda97807b2c54958 IN  0xd73b53cbe6a5fe32ae4ae475d4ea9307bd7aaafa0.01 Ether0.00021414 1.50000001
0xf8525c839c500fa623af057b5f5f0c99c43206860dfc5657c1b75aa9ad42bd93Mint111594972022-08-07 7:07:37112 days 12 hrs ago0x217b3afaf29c7c7ceb30f494bda97807b2c54958 IN  0xd73b53cbe6a5fe32ae4ae475d4ea9307bd7aaafa0.01 Ether0.00031666 1.50000001
0xaa8181af63a183e0291decf93e278dea3a00e1c49216ba49603b089a5ece8bcfAdd Campaign111594702022-08-07 7:00:52112 days 12 hrs ago0x217b3afaf29c7c7ceb30f494bda97807b2c54958 IN  0xd73b53cbe6a5fe32ae4ae475d4ea9307bd7aaafa0 Ether0.00029522 1
0x185315fbc6933be98ef0e05c4f356511bb82b46e93667d55ee2f82f0a923b658Mint111588862022-08-07 4:34:31112 days 14 hrs ago0x217b3afaf29c7c7ceb30f494bda97807b2c54958 IN  0xd73b53cbe6a5fe32ae4ae475d4ea9307bd7aaafa0.01 Ether0.00026541 1.5
0xc8e8aedb3e25bf871ec31b02fe0526927ebcf24adbf64797234bf0960d057a05Add Campaign111588772022-08-07 4:32:16112 days 14 hrs ago0x217b3afaf29c7c7ceb30f494bda97807b2c54958 IN  0xd73b53cbe6a5fe32ae4ae475d4ea9307bd7aaafa0 Ether0.00029522 1
0xfe9de55f30c3f868b553d8d2d28dbb9f0e3b10f5f87c0b788d81e2396658a50bAdd Campaign111586742022-08-07 3:41:25112 days 15 hrs ago0x217b3afaf29c7c7ceb30f494bda97807b2c54958 IN  0xd73b53cbe6a5fe32ae4ae475d4ea9307bd7aaafa0 Ether0.00028789 1
0x731b8b11e6c1afb83fc1d4275609f240b7733676a8a4e395c6b6aacfc1f00ffaMint111393122022-08-03 18:45:01116 days 39 mins ago0x217b3afaf29c7c7ceb30f494bda97807b2c54958 IN  0xd73b53cbe6a5fe32ae4ae475d4ea9307bd7aaafa0.01 Ether0.00046364 2.42500001
0xed4aeeddd51282de2e20e7280431cdc3a1c6fcdc60120d98db18587d9125e1b9Mint111393042022-08-03 18:43:01116 days 41 mins ago0x217b3afaf29c7c7ceb30f494bda97807b2c54958 IN  0xd73b53cbe6a5fe32ae4ae475d4ea9307bd7aaafa0.01 Ether0.00058805 2.42500001
0x3cbbabca9fb0c206cab341ebd47eb1eb4b49ed0ec71f0812d36f125848d5b35bAdd Campaign111392972022-08-03 18:41:15116 days 43 mins ago0x217b3afaf29c7c7ceb30f494bda97807b2c54958 IN  0xd73b53cbe6a5fe32ae4ae475d4ea9307bd7aaafa0 Ether0.00028992 1
0x25ec30e2c000a5f61214210d4e8a6ee4a3a0b4072e6c92e96197d7ea6b698a8aMint111376582022-08-03 11:50:43116 days 7 hrs ago0x217b3afaf29c7c7ceb30f494bda97807b2c54958 IN  0xd73b53cbe6a5fe32ae4ae475d4ea9307bd7aaafa0.01 Ether0.00041504 1.50000001
0x6d9edb9c2bb40644e0854d3c4b346f2b667c645a1c484b17856b18fb8874041bAdd Campaign111376142022-08-03 11:39:42116 days 7 hrs ago0x217b3afaf29c7c7ceb30f494bda97807b2c54958 IN  0xd73b53cbe6a5fe32ae4ae475d4ea9307bd7aaafa0 Ether0.00028992 1.00000001
0xabfdfd3ea6e783fe29576ca6da9deb63854c649bac26c13097cd4e0e97292cb8Mint Whitelisted108613542022-06-16 9:23:36164 days 10 hrs ago0x217b3afaf29c7c7ceb30f494bda97807b2c54958 IN  0xd73b53cbe6a5fe32ae4ae475d4ea9307bd7aaafa0.01 Ether0.0004599 1.94210246
0xd18358506378f58236becca6669ef144c3a2cef552cab3741efd12f525163d86Mint Whitelisted108613132022-06-16 9:13:19164 days 10 hrs ago0x217b3afaf29c7c7ceb30f494bda97807b2c54958 IN  0xd73b53cbe6a5fe32ae4ae475d4ea9307bd7aaafa0.01 Ether0.00045942 1.94008717
0xa8749926b5ef0c6644a12659351c1662f58d5e8c822ace46b4e2ab681dfe2bcdMint108609302022-06-16 7:37:16164 days 11 hrs ago0x217b3afaf29c7c7ceb30f494bda97807b2c54958 IN  0xd73b53cbe6a5fe32ae4ae475d4ea9307bd7aaafa0.01 Ether0.00033957 1.50000007
0x7a49772577c064091b7e782c3e9b4f3d88fff0bb48fc275b890dc3d09138cce9Mint108609002022-06-16 7:29:45164 days 11 hrs ago0x217b3afaf29c7c7ceb30f494bda97807b2c54958 IN  0xd73b53cbe6a5fe32ae4ae475d4ea9307bd7aaafa0.01 Ether0.00033957 1.50000005
0x273f10848bda5ccf0b140a1018a17fd9d4d249dcfdf6b56410ef5292f9bf848cMint108608932022-06-16 7:28:00164 days 11 hrs ago0x217b3afaf29c7c7ceb30f494bda97807b2c54958 IN  0xd73b53cbe6a5fe32ae4ae475d4ea9307bd7aaafa0.01 Ether0.00033957 1.50000004
0xa954b3dcb78d526d68e0544e891b092f063d5689ca864fc77d4acc490416211bMint108608812022-06-16 7:24:59164 days 12 hrs ago0x217b3afaf29c7c7ceb30f494bda97807b2c54958 IN  0xd73b53cbe6a5fe32ae4ae475d4ea9307bd7aaafa0.01 Ether0.00035702 1.5770852
0x99051aafa818ffa3915485c4fe45244c8e31a24fba449a52c1c936578cec9acfMint108608802022-06-16 7:24:44164 days 12 hrs ago0x217b3afaf29c7c7ceb30f494bda97807b2c54958 IN  0xd73b53cbe6a5fe32ae4ae475d4ea9307bd7aaafa0.01 Ether0.00042909 1.5770852
[ Download CSV Export 
Latest 25 internal transaction
Parent Txn Hash Block From To Value
0x55e419604bbf3f6a809d0f1aa92fd103eaa3ad0a65c43c2e58998701ceba8b77112290222022-08-19 9:22:13100 days 10 hrs ago 0xd73b53cbe6a5fe32ae4ae475d4ea9307bd7aaafa 0x2a1e987d0709345a5871ffd78453b57cbc02109c0 Ether
0x55e419604bbf3f6a809d0f1aa92fd103eaa3ad0a65c43c2e58998701ceba8b77112290222022-08-19 9:22:13100 days 10 hrs ago 0xd73b53cbe6a5fe32ae4ae475d4ea9307bd7aaafa0x841eb3f41c7f2f048cddadcd4e98d94828f880880.001 Ether
0x55e419604bbf3f6a809d0f1aa92fd103eaa3ad0a65c43c2e58998701ceba8b77112290222022-08-19 9:22:13100 days 10 hrs ago 0xd73b53cbe6a5fe32ae4ae475d4ea9307bd7aaafa0x2f347fab24682685cd52d5572a816da84fea07a80.009 Ether
0x55e419604bbf3f6a809d0f1aa92fd103eaa3ad0a65c43c2e58998701ceba8b77112290222022-08-19 9:22:13100 days 10 hrs ago 0xd73b53cbe6a5fe32ae4ae475d4ea9307bd7aaafa 0x2a1e987d0709345a5871ffd78453b57cbc02109c0 Ether
0x55e419604bbf3f6a809d0f1aa92fd103eaa3ad0a65c43c2e58998701ceba8b77112290222022-08-19 9:22:13100 days 10 hrs ago 0xd73b53cbe6a5fe32ae4ae475d4ea9307bd7aaafa 0x2a1e987d0709345a5871ffd78453b57cbc02109c0 Ether
0x7c811953718f5eb564e31d36bc5611bb6f19e2bb9e3ec29d30968b19a600b849112288172022-08-19 8:30:42100 days 10 hrs ago 0xd73b53cbe6a5fe32ae4ae475d4ea9307bd7aaafa 0x2a1e987d0709345a5871ffd78453b57cbc02109c0 Ether
0x7c811953718f5eb564e31d36bc5611bb6f19e2bb9e3ec29d30968b19a600b849112288172022-08-19 8:30:42100 days 10 hrs ago 0xd73b53cbe6a5fe32ae4ae475d4ea9307bd7aaafa0x841eb3f41c7f2f048cddadcd4e98d94828f880880.001 Ether
0x7c811953718f5eb564e31d36bc5611bb6f19e2bb9e3ec29d30968b19a600b849112288172022-08-19 8:30:42100 days 10 hrs ago 0xd73b53cbe6a5fe32ae4ae475d4ea9307bd7aaafa0x2f347fab24682685cd52d5572a816da84fea07a80.009 Ether
0x7c811953718f5eb564e31d36bc5611bb6f19e2bb9e3ec29d30968b19a600b849112288172022-08-19 8:30:42100 days 10 hrs ago 0xd73b53cbe6a5fe32ae4ae475d4ea9307bd7aaafa 0x2a1e987d0709345a5871ffd78453b57cbc02109c0 Ether
0x7c811953718f5eb564e31d36bc5611bb6f19e2bb9e3ec29d30968b19a600b849112288172022-08-19 8:30:42100 days 10 hrs ago 0xd73b53cbe6a5fe32ae4ae475d4ea9307bd7aaafa 0x2a1e987d0709345a5871ffd78453b57cbc02109c0 Ether
0x6a95a9fcee526c294739b91a6dedb3abb51dd35eb20e476b20e51bd66772eef9112288162022-08-19 8:30:27100 days 10 hrs ago 0xd73b53cbe6a5fe32ae4ae475d4ea9307bd7aaafa 0x2a1e987d0709345a5871ffd78453b57cbc02109c0 Ether
0x6a95a9fcee526c294739b91a6dedb3abb51dd35eb20e476b20e51bd66772eef9112288162022-08-19 8:30:27100 days 10 hrs ago 0xd73b53cbe6a5fe32ae4ae475d4ea9307bd7aaafa0x841eb3f41c7f2f048cddadcd4e98d94828f880880.001 Ether
0x6a95a9fcee526c294739b91a6dedb3abb51dd35eb20e476b20e51bd66772eef9112288162022-08-19 8:30:27100 days 10 hrs ago 0xd73b53cbe6a5fe32ae4ae475d4ea9307bd7aaafa0x2f347fab24682685cd52d5572a816da84fea07a80.009 Ether
0x6a95a9fcee526c294739b91a6dedb3abb51dd35eb20e476b20e51bd66772eef9112288162022-08-19 8:30:27100 days 10 hrs ago 0xd73b53cbe6a5fe32ae4ae475d4ea9307bd7aaafa 0x2a1e987d0709345a5871ffd78453b57cbc02109c0 Ether
0x6a95a9fcee526c294739b91a6dedb3abb51dd35eb20e476b20e51bd66772eef9112288162022-08-19 8:30:27100 days 10 hrs ago 0xd73b53cbe6a5fe32ae4ae475d4ea9307bd7aaafa 0x2a1e987d0709345a5871ffd78453b57cbc02109c0 Ether
0x6fc593f57abcfae84309c4778c798ba1a279c58a3307d11d362ba1b615dffa76112287042022-08-19 8:02:25100 days 11 hrs ago 0xd73b53cbe6a5fe32ae4ae475d4ea9307bd7aaafa 0x2a1e987d0709345a5871ffd78453b57cbc02109c0 Ether
0x6fc593f57abcfae84309c4778c798ba1a279c58a3307d11d362ba1b615dffa76112287042022-08-19 8:02:25100 days 11 hrs ago 0xd73b53cbe6a5fe32ae4ae475d4ea9307bd7aaafa0x841eb3f41c7f2f048cddadcd4e98d94828f880880.001 Ether
0x6fc593f57abcfae84309c4778c798ba1a279c58a3307d11d362ba1b615dffa76112287042022-08-19 8:02:25100 days 11 hrs ago 0xd73b53cbe6a5fe32ae4ae475d4ea9307bd7aaafa0x2f347fab24682685cd52d5572a816da84fea07a80.009 Ether
0x6fc593f57abcfae84309c4778c798ba1a279c58a3307d11d362ba1b615dffa76112287042022-08-19 8:02:25100 days 11 hrs ago 0xd73b53cbe6a5fe32ae4ae475d4ea9307bd7aaafa 0x2a1e987d0709345a5871ffd78453b57cbc02109c0 Ether
0x6fc593f57abcfae84309c4778c798ba1a279c58a3307d11d362ba1b615dffa76112287042022-08-19 8:02:25100 days 11 hrs ago 0xd73b53cbe6a5fe32ae4ae475d4ea9307bd7aaafa 0x2a1e987d0709345a5871ffd78453b57cbc02109c0 Ether
0x9131f5c712c5a31c4e49af4f8d006c90a9a095930f38d376fb8b2f1bfac6d911112286192022-08-19 7:41:10100 days 11 hrs ago 0xd73b53cbe6a5fe32ae4ae475d4ea9307bd7aaafa 0x2a1e987d0709345a5871ffd78453b57cbc02109c0 Ether
0x9131f5c712c5a31c4e49af4f8d006c90a9a095930f38d376fb8b2f1bfac6d911112286192022-08-19 7:41:10100 days 11 hrs ago 0xd73b53cbe6a5fe32ae4ae475d4ea9307bd7aaafa0x841eb3f41c7f2f048cddadcd4e98d94828f880880.001 Ether
0x9131f5c712c5a31c4e49af4f8d006c90a9a095930f38d376fb8b2f1bfac6d911112286192022-08-19 7:41:10100 days 11 hrs ago 0xd73b53cbe6a5fe32ae4ae475d4ea9307bd7aaafa0x2f347fab24682685cd52d5572a816da84fea07a80.009 Ether
0x9131f5c712c5a31c4e49af4f8d006c90a9a095930f38d376fb8b2f1bfac6d911112286192022-08-19 7:41:10100 days 11 hrs ago 0xd73b53cbe6a5fe32ae4ae475d4ea9307bd7aaafa 0x2a1e987d0709345a5871ffd78453b57cbc02109c0 Ether
0x9131f5c712c5a31c4e49af4f8d006c90a9a095930f38d376fb8b2f1bfac6d911112286192022-08-19 7:41:10100 days 11 hrs ago 0xd73b53cbe6a5fe32ae4ae475d4ea9307bd7aaafa 0x2a1e987d0709345a5871ffd78453b57cbc02109c0 Ether
[ Download CSV Export 
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
LaunchpadV2

Compiler Version
v0.8.1+commit.df193b15

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion
File 1 of 7 : LaunchpadV2.sol
//SPDX-License-Identifier: Unlicense
pragma solidity ^0.8.0;

import "@openzeppelin/contracts/security/ReentrancyGuard.sol";
import "@openzeppelin/contracts/utils/cryptography/ECDSA.sol";
import "@openzeppelin/contracts/access/Ownable.sol";
import "./ILaunchpadNFT.sol";

contract LaunchpadV2 is Ownable, ReentrancyGuard {
    event AddCampaign(address contractAddress, CampaignMode mode, address payeeAddress, address platformFeeAddress, uint256 platformFeeRate, uint256 price, uint256 maxSupply, uint256 listingTime, uint256 expirationTime, uint256 maxBatch, uint256 maxPerAddress, address validator);
    event UpdateCampaign(address contractAddress, CampaignMode mode, address payeeAddress, address platformFeeAddress, uint256 platformFeeRate, uint256 price, uint256 maxSupply, uint256 listingTime, uint256 expirationTime, uint256 maxBatch, uint256 maxPerAddress, address validator);
    event Mint(address indexed contractAddress, CampaignMode mode, address userAddress, address payeeAddress, address platformFeeAddress, uint256 size, uint256 fee, uint256 platformFee);

    enum CampaignMode {
        normal,
        whitelisted
    }
    struct Campaign {
        address contractAddress;
        address payeeAddress;
        address platformFeeAddress;
        uint256 platformFeeRate; // 0 %0 - 10000 100%
        uint256 price; // wei
        uint256 maxSupply;
        uint256 listingTime;
        uint256 expirationTime;
        uint256 maxBatch;
        uint256 maxPerAddress;
        address validator; // only for whitelisted
        uint256 minted;
    }

    mapping(address => Campaign) private _campaignsNormal;
    mapping(address => Campaign) private _campaignsWhitelisted;

    mapping(address => mapping(address => uint256)) private _mintPerAddressNormal;
    mapping(address => mapping(address => uint256)) private _mintPerAddressWhitelisted;

    /* Inverse basis point. */
    uint256 public constant INVERSE_BASIS_POINT = 10000;

    function mintWhitelisted(
        address contractAddress,
        uint256 batchSize,
        bytes memory signature
    ) external payable nonReentrant {

        //  Check whitelist validator signature
        Campaign memory campaign = getCampaign(contractAddress, CampaignMode.whitelisted);
        require(campaign.contractAddress != address(0), "contract not register");

        bytes32 messageHash = keccak256(abi.encodePacked(block.chainid, address(this), contractAddress, msg.sender));
        bytes32 proof = ECDSA.toEthSignedMessageHash(messageHash);
        require(ECDSA.recover(proof, signature) == campaign.validator, "whitelist verification failed");

        // activity check
        mint_(contractAddress, batchSize, CampaignMode.whitelisted);

    }

    function mint(address contractAddress, uint256 batchSize) external payable nonReentrant {
        mint_(contractAddress, batchSize, CampaignMode.normal);
    }

    function mint_(address contractAddress, uint256 batchSize, CampaignMode mode) internal {
        require(contractAddress != address(0), "contract address can't be empty");
        require(batchSize > 0, "batchSize must greater than 0");

        Campaign memory campaign = getCampaign(contractAddress, mode);

        require(campaign.contractAddress != address(0), "contract not register");

        require(batchSize <= campaign.maxBatch, "reach max batch size");
        require(block.timestamp >= campaign.listingTime, "activity not start");
        require(block.timestamp < campaign.expirationTime, "activity ended");
        // normal and white-list mint have individual maxSupply and share MaxLaunchpadSupply
        require(campaign.minted + batchSize <= campaign.maxSupply, "reach campaign max supply");
        require(ILaunchpadNFT(campaign.contractAddress).getLaunchpadSupply() + batchSize <= ILaunchpadNFT(campaign.contractAddress).getMaxLaunchpadSupply(), "reach campaign total max supply");

        if (mode == CampaignMode.normal) {
            require(_mintPerAddressNormal[campaign.contractAddress][msg.sender] + batchSize <= campaign.maxPerAddress, "reach max per address limit");
            _mintPerAddressNormal[contractAddress][msg.sender] = _mintPerAddressNormal[contractAddress][msg.sender] + batchSize;
            _campaignsNormal[contractAddress].minted += batchSize;

        } else {
            require(_mintPerAddressWhitelisted[campaign.contractAddress][msg.sender] + batchSize <= campaign.maxPerAddress, "reach max per address limit");
            _mintPerAddressWhitelisted[contractAddress][msg.sender] = _mintPerAddressWhitelisted[contractAddress][msg.sender] + batchSize;
            _campaignsWhitelisted[contractAddress].minted += batchSize;
        }

        uint256 totalPrice = campaign.price * batchSize;
        require(msg.value >= totalPrice, "value not enough");

        // transfer token and mint
        uint256 platformFee = totalPrice * campaign.platformFeeRate / INVERSE_BASIS_POINT;
        uint256 fee = totalPrice - platformFee;
        payable(campaign.payeeAddress).transfer(fee);
        if (platformFee > 0) {
            payable(campaign.platformFeeAddress).transfer(platformFee);
        }

        ILaunchpadNFT(contractAddress).mintTo(msg.sender, batchSize);

        emit Mint(campaign.contractAddress, mode, msg.sender, campaign.payeeAddress, campaign.platformFeeAddress, batchSize, fee, platformFee);
        // return
        uint256 valueLeft = msg.value - totalPrice;
        if (valueLeft > 0) {
            payable(_msgSender()).transfer(valueLeft);
        }

    }

    function getMintPerAddress(
        address contractAddress,
        CampaignMode mode,
        address userAddress
    ) external view returns (uint256 mintPerAddress) {
        require(userAddress != address(0), "user address invalid");
        if (mode == CampaignMode.normal) {
            mintPerAddress = _mintPerAddressNormal[contractAddress][userAddress];
        } else {
            mintPerAddress = _mintPerAddressWhitelisted[contractAddress][userAddress];
        }
    }

    function getLaunchpadMaxSupply(address contractAddress, CampaignMode mode) external view returns (uint256) {
        if (mode == CampaignMode.normal) {
            return _campaignsNormal[contractAddress].maxSupply;
        } else {
            return _campaignsWhitelisted[contractAddress].maxSupply;
        }
    }

    function getLaunchpadSupply(address contractAddress, CampaignMode mode) external view returns (uint256) {
        if (mode == CampaignMode.normal) {
            return _campaignsNormal[contractAddress].minted;
        } else {
            return _campaignsWhitelisted[contractAddress].minted;
        }
    }

    function getLaunchpadSupplyTotal(address contractAddress) external view returns (uint256) {
        return ILaunchpadNFT(contractAddress).getLaunchpadSupply();
    }

    function addCampaign(
        address[] memory addresses,
        CampaignMode mode,
        uint256[] memory values
    ) external onlyOwner {
        require(addresses.length == 4, "addresses size wrong");
        require(values.length == 7, "values size wrong");
        Campaign memory campaign = Campaign(
            addresses[0], // contractAddress_,
            addresses[1], // payeeAddress_,
            addresses[2], // platformFeeAddress_,
            values[0], // platformFeeRate_,
            values[1], // price_,
            values[2], // maxSupply_,
            values[3], // listingTime_,
            values[4], // expirationTime_,
            values[5], // maxBatch_,
            values[6], // maxPerAddress_,
            addresses[3], // validator_,
            0
        );
        addCampaign_(campaign, mode);
    }

    function addCampaign_(
        Campaign memory campaign,
        CampaignMode mode
    ) internal {

        campaignCheck(campaign, mode);

        if (mode == CampaignMode.normal) {
            require(_campaignsNormal[campaign.contractAddress].contractAddress == address(0), "contract address already exist");
        } else {
            require(_campaignsWhitelisted[campaign.contractAddress].contractAddress == address(0), "contract address already exist");
        }

        emit AddCampaign(
            campaign.contractAddress,
            mode,
            campaign.payeeAddress,
            campaign.platformFeeAddress,
            campaign.platformFeeRate,
            campaign.price,
            campaign.maxSupply,
            campaign.listingTime,
            campaign.expirationTime,
            campaign.maxBatch,
            campaign.maxPerAddress,
            campaign.validator
        );

        if (mode == CampaignMode.normal) {
            _campaignsNormal[campaign.contractAddress] = campaign;
        } else {
            _campaignsWhitelisted[campaign.contractAddress] = campaign;
        }
    }

    function updateCampaign(
        address[] memory addresses,
        CampaignMode mode,
        uint256[] memory values
    ) external onlyOwner {
        require(addresses.length == 4, "addresses size wrong");
        require(values.length == 7, "values size wrong");

        address contractAddress = addresses[0];
        uint256 minted;
        if (mode == CampaignMode.normal) {
            require(_campaignsNormal[contractAddress].contractAddress != address(0), "normal contract address not exist");
            minted = _campaignsNormal[contractAddress].minted;
        } else {
            require(_campaignsWhitelisted[contractAddress].contractAddress != address(0), "white-list contract address not exist");
            minted = _campaignsWhitelisted[contractAddress].minted;
        }

        Campaign memory campaign = Campaign(
            addresses[0], // contractAddress_,
            addresses[1], //payeeAddress_,
            addresses[2], //platformFeeAddress_,
            values[0], //platformFeeRate_,
            values[1], //price_,
            values[2], //maxSupply_,
            values[3], //listingTime_,
            values[4], //expirationTime_,
            values[5], // maxBatch_,
            values[6], //maxPerAddress_,
            addresses[3], //validator_,
            minted
        );
        updateCampaign_(campaign, mode);
    }

    function updateCampaign_(Campaign memory campaign, CampaignMode mode) internal {

        campaignCheck(campaign, mode);

        emit UpdateCampaign(campaign.contractAddress, mode, campaign.payeeAddress, campaign.platformFeeAddress, campaign.platformFeeRate, campaign.price, campaign.maxSupply, campaign.listingTime, campaign.expirationTime, campaign.maxBatch, campaign.maxPerAddress, campaign.validator);

        if (mode == CampaignMode.normal) {
            _campaignsNormal[campaign.contractAddress] = campaign;
        } else {
            _campaignsWhitelisted[campaign.contractAddress] = campaign;
        }
    }

    function campaignCheck(Campaign memory campaign, CampaignMode mode) private view {
        require(campaign.contractAddress != address(0), "contract address can't be empty");
        require(campaign.expirationTime > campaign.listingTime, "expiration time must above listing time");
        require(campaign.maxSupply > 0 && campaign.maxSupply <= ILaunchpadNFT(campaign.contractAddress).getMaxLaunchpadSupply(), "campaign max supply invalid");

        if (mode == CampaignMode.whitelisted) {
            require(campaign.validator != address(0), "validator can't be empty");
        }

        require(campaign.payeeAddress != address(0), "payee address can't be empty");
        require(campaign.platformFeeAddress != address(0), "platform fee address can't be empty");
        require(campaign.platformFeeRate >= 0 && campaign.platformFeeRate <= INVERSE_BASIS_POINT, "platform fee rate invalid");
        require(campaign.maxBatch > 0 && campaign.maxBatch <= 10, "max batch invalid");
        require(campaign.maxPerAddress > 0 && campaign.maxPerAddress <= campaign.maxSupply, "max per address invalid");
    }

    function getCampaign(address contractAddress, CampaignMode mode) public view returns (Campaign memory) {
        if (mode == CampaignMode.normal) {
            return _campaignsNormal[contractAddress];
        } else {
            return _campaignsWhitelisted[contractAddress];
        }
    }
}

File 2 of 7 : ILaunchpadNFT.sol
//SPDX-License-Identifier: Unlicense
pragma solidity ^0.8.0;

interface ILaunchpadNFT {
    // return max supply config for launchpad, if no reserved will be collection's max supply
    function getMaxLaunchpadSupply() external view returns (uint256);
    // return current launchpad supply
    function getLaunchpadSupply() external view returns (uint256);
    // this function need to restrict mint permission to launchpad contract
    function mintTo(address to, uint256 size) external;
}

File 3 of 7 : ECDSA.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (utils/cryptography/ECDSA.sol)

pragma solidity ^0.8.0;

import "../Strings.sol";

/**
 * @dev Elliptic Curve Digital Signature Algorithm (ECDSA) operations.
 *
 * These functions can be used to verify that a message was signed by the holder
 * of the private keys of a given address.
 */
library ECDSA {
    enum RecoverError {
        NoError,
        InvalidSignature,
        InvalidSignatureLength,
        InvalidSignatureS,
        InvalidSignatureV
    }

    function _throwError(RecoverError error) private pure {
        if (error == RecoverError.NoError) {
            return; // no error: do nothing
        } else if (error == RecoverError.InvalidSignature) {
            revert("ECDSA: invalid signature");
        } else if (error == RecoverError.InvalidSignatureLength) {
            revert("ECDSA: invalid signature length");
        } else if (error == RecoverError.InvalidSignatureS) {
            revert("ECDSA: invalid signature 's' value");
        } else if (error == RecoverError.InvalidSignatureV) {
            revert("ECDSA: invalid signature 'v' value");
        }
    }

    /**
     * @dev Returns the address that signed a hashed message (`hash`) with
     * `signature` or error string. This address can then be used for verification purposes.
     *
     * The `ecrecover` EVM opcode allows for malleable (non-unique) signatures:
     * this function rejects them by requiring the `s` value to be in the lower
     * half order, and the `v` value to be either 27 or 28.
     *
     * IMPORTANT: `hash` _must_ be the result of a hash operation for the
     * verification to be secure: it is possible to craft signatures that
     * recover to arbitrary addresses for non-hashed data. A safe way to ensure
     * this is by receiving a hash of the original message (which may otherwise
     * be too long), and then calling {toEthSignedMessageHash} on it.
     *
     * Documentation for signature generation:
     * - with https://web3js.readthedocs.io/en/v1.3.4/web3-eth-accounts.html#sign[Web3.js]
     * - with https://docs.ethers.io/v5/api/signer/#Signer-signMessage[ethers]
     *
     * _Available since v4.3._
     */
    function tryRecover(bytes32 hash, bytes memory signature) internal pure returns (address, RecoverError) {
        // Check the signature length
        // - case 65: r,s,v signature (standard)
        // - case 64: r,vs signature (cf https://eips.ethereum.org/EIPS/eip-2098) _Available since v4.1._
        if (signature.length == 65) {
            bytes32 r;
            bytes32 s;
            uint8 v;
            // ecrecover takes the signature parameters, and the only way to get them
            // currently is to use assembly.
            assembly {
                r := mload(add(signature, 0x20))
                s := mload(add(signature, 0x40))
                v := byte(0, mload(add(signature, 0x60)))
            }
            return tryRecover(hash, v, r, s);
        } else if (signature.length == 64) {
            bytes32 r;
            bytes32 vs;
            // ecrecover takes the signature parameters, and the only way to get them
            // currently is to use assembly.
            assembly {
                r := mload(add(signature, 0x20))
                vs := mload(add(signature, 0x40))
            }
            return tryRecover(hash, r, vs);
        } else {
            return (address(0), RecoverError.InvalidSignatureLength);
        }
    }

    /**
     * @dev Returns the address that signed a hashed message (`hash`) with
     * `signature`. This address can then be used for verification purposes.
     *
     * The `ecrecover` EVM opcode allows for malleable (non-unique) signatures:
     * this function rejects them by requiring the `s` value to be in the lower
     * half order, and the `v` value to be either 27 or 28.
     *
     * IMPORTANT: `hash` _must_ be the result of a hash operation for the
     * verification to be secure: it is possible to craft signatures that
     * recover to arbitrary addresses for non-hashed data. A safe way to ensure
     * this is by receiving a hash of the original message (which may otherwise
     * be too long), and then calling {toEthSignedMessageHash} on it.
     */
    function recover(bytes32 hash, bytes memory signature) internal pure returns (address) {
        (address recovered, RecoverError error) = tryRecover(hash, signature);
        _throwError(error);
        return recovered;
    }

    /**
     * @dev Overload of {ECDSA-tryRecover} that receives the `r` and `vs` short-signature fields separately.
     *
     * See https://eips.ethereum.org/EIPS/eip-2098[EIP-2098 short signatures]
     *
     * _Available since v4.3._
     */
    function tryRecover(
        bytes32 hash,
        bytes32 r,
        bytes32 vs
    ) internal pure returns (address, RecoverError) {
        bytes32 s;
        uint8 v;
        assembly {
            s := and(vs, 0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff)
            v := add(shr(255, vs), 27)
        }
        return tryRecover(hash, v, r, s);
    }

    /**
     * @dev Overload of {ECDSA-recover} that receives the `r and `vs` short-signature fields separately.
     *
     * _Available since v4.2._
     */
    function recover(
        bytes32 hash,
        bytes32 r,
        bytes32 vs
    ) internal pure returns (address) {
        (address recovered, RecoverError error) = tryRecover(hash, r, vs);
        _throwError(error);
        return recovered;
    }

    /**
     * @dev Overload of {ECDSA-tryRecover} that receives the `v`,
     * `r` and `s` signature fields separately.
     *
     * _Available since v4.3._
     */
    function tryRecover(
        bytes32 hash,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) internal pure returns (address, RecoverError) {
        // EIP-2 still allows signature malleability for ecrecover(). Remove this possibility and make the signature
        // unique. Appendix F in the Ethereum Yellow paper (https://ethereum.github.io/yellowpaper/paper.pdf), defines
        // the valid range for s in (301): 0 < s < secp256k1n ÷ 2 + 1, and for v in (302): v ∈ {27, 28}. Most
        // signatures from current libraries generate a unique signature with an s-value in the lower half order.
        //
        // If your library generates malleable signatures, such as s-values in the upper range, calculate a new s-value
        // with 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEBAAEDCE6AF48A03BBFD25E8CD0364141 - s1 and flip v from 27 to 28 or
        // vice versa. If your library also generates signatures with 0/1 for v instead 27/28, add 27 to v to accept
        // these malleable signatures as well.
        if (uint256(s) > 0x7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5D576E7357A4501DDFE92F46681B20A0) {
            return (address(0), RecoverError.InvalidSignatureS);
        }
        if (v != 27 && v != 28) {
            return (address(0), RecoverError.InvalidSignatureV);
        }

        // If the signature is valid (and not malleable), return the signer address
        address signer = ecrecover(hash, v, r, s);
        if (signer == address(0)) {
            return (address(0), RecoverError.InvalidSignature);
        }

        return (signer, RecoverError.NoError);
    }

    /**
     * @dev Overload of {ECDSA-recover} that receives the `v`,
     * `r` and `s` signature fields separately.
     */
    function recover(
        bytes32 hash,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) internal pure returns (address) {
        (address recovered, RecoverError error) = tryRecover(hash, v, r, s);
        _throwError(error);
        return recovered;
    }

    /**
     * @dev Returns an Ethereum Signed Message, created from a `hash`. This
     * produces hash corresponding to the one signed with the
     * https://eth.wiki/json-rpc/API#eth_sign[`eth_sign`]
     * JSON-RPC method as part of EIP-191.
     *
     * See {recover}.
     */
    function toEthSignedMessageHash(bytes32 hash) internal pure returns (bytes32) {
        // 32 is the length in bytes of hash,
        // enforced by the type signature above
        return keccak256(abi.encodePacked("\x19Ethereum Signed Message:\n32", hash));
    }

    /**
     * @dev Returns an Ethereum Signed Message, created from `s`. This
     * produces hash corresponding to the one signed with the
     * https://eth.wiki/json-rpc/API#eth_sign[`eth_sign`]
     * JSON-RPC method as part of EIP-191.
     *
     * See {recover}.
     */
    function toEthSignedMessageHash(bytes memory s) internal pure returns (bytes32) {
        return keccak256(abi.encodePacked("\x19Ethereum Signed Message:\n", Strings.toString(s.length), s));
    }

    /**
     * @dev Returns an Ethereum Signed Typed Data, created from a
     * `domainSeparator` and a `structHash`. This produces hash corresponding
     * to the one signed with the
     * https://eips.ethereum.org/EIPS/eip-712[`eth_signTypedData`]
     * JSON-RPC method as part of EIP-712.
     *
     * See {recover}.
     */
    function toTypedDataHash(bytes32 domainSeparator, bytes32 structHash) internal pure returns (bytes32) {
        return keccak256(abi.encodePacked("\x19\x01", domainSeparator, structHash));
    }
}

File 4 of 7 : Strings.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (utils/Strings.sol)

pragma solidity ^0.8.0;

/**
 * @dev String operations.
 */
library Strings {
    bytes16 private constant _HEX_SYMBOLS = "0123456789abcdef";

    /**
     * @dev Converts a `uint256` to its ASCII `string` decimal representation.
     */
    function toString(uint256 value) internal pure returns (string memory) {
        // Inspired by OraclizeAPI's implementation - MIT licence
        // https://github.com/oraclize/ethereum-api/blob/b42146b063c7d6ee1358846c198246239e9360e8/oraclizeAPI_0.4.25.sol

        if (value == 0) {
            return "0";
        }
        uint256 temp = value;
        uint256 digits;
        while (temp != 0) {
            digits++;
            temp /= 10;
        }
        bytes memory buffer = new bytes(digits);
        while (value != 0) {
            digits -= 1;
            buffer[digits] = bytes1(uint8(48 + uint256(value % 10)));
            value /= 10;
        }
        return string(buffer);
    }

    /**
     * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation.
     */
    function toHexString(uint256 value) internal pure returns (string memory) {
        if (value == 0) {
            return "0x00";
        }
        uint256 temp = value;
        uint256 length = 0;
        while (temp != 0) {
            length++;
            temp >>= 8;
        }
        return toHexString(value, length);
    }

    /**
     * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length.
     */
    function toHexString(uint256 value, uint256 length) internal pure returns (string memory) {
        bytes memory buffer = new bytes(2 * length + 2);
        buffer[0] = "0";
        buffer[1] = "x";
        for (uint256 i = 2 * length + 1; i > 1; --i) {
            buffer[i] = _HEX_SYMBOLS[value & 0xf];
            value >>= 4;
        }
        require(value == 0, "Strings: hex length insufficient");
        return string(buffer);
    }
}

File 5 of 7 : Context.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (utils/Context.sol)

pragma solidity ^0.8.0;

/**
 * @dev Provides information about the current execution context, including the
 * sender of the transaction and its data. While these are generally available
 * via msg.sender and msg.data, they should not be accessed in such a direct
 * manner, since when dealing with meta-transactions the account sending and
 * paying for execution may not be the actual sender (as far as an application
 * is concerned).
 *
 * This contract is only required for intermediate, library-like contracts.
 */
abstract contract Context {
    function _msgSender() internal view virtual returns (address) {
        return msg.sender;
    }

    function _msgData() internal view virtual returns (bytes calldata) {
        return msg.data;
    }
}

File 6 of 7 : ReentrancyGuard.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (security/ReentrancyGuard.sol)

pragma solidity ^0.8.0;

/**
 * @dev Contract module that helps prevent reentrant calls to a function.
 *
 * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier
 * available, which can be applied to functions to make sure there are no nested
 * (reentrant) calls to them.
 *
 * Note that because there is a single `nonReentrant` guard, functions marked as
 * `nonReentrant` may not call one another. This can be worked around by making
 * those functions `private`, and then adding `external` `nonReentrant` entry
 * points to them.
 *
 * TIP: If you would like to learn more about reentrancy and alternative ways
 * to protect against it, check out our blog post
 * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul].
 */
abstract contract ReentrancyGuard {
    // Booleans are more expensive than uint256 or any type that takes up a full
    // word because each write operation emits an extra SLOAD to first read the
    // slot's contents, replace the bits taken up by the boolean, and then write
    // back. This is the compiler's defense against contract upgrades and
    // pointer aliasing, and it cannot be disabled.

    // The values being non-zero value makes deployment a bit more expensive,
    // but in exchange the refund on every call to nonReentrant will be lower in
    // amount. Since refunds are capped to a percentage of the total
    // transaction's gas, it is best to keep them low in cases like this one, to
    // increase the likelihood of the full refund coming into effect.
    uint256 private constant _NOT_ENTERED = 1;
    uint256 private constant _ENTERED = 2;

    uint256 private _status;

    constructor() {
        _status = _NOT_ENTERED;
    }

    /**
     * @dev Prevents a contract from calling itself, directly or indirectly.
     * Calling a `nonReentrant` function from another `nonReentrant`
     * function is not supported. It is possible to prevent this from happening
     * by making the `nonReentrant` function external, and making it call a
     * `private` function that does the actual work.
     */
    modifier nonReentrant() {
        // On the first call to nonReentrant, _notEntered will be true
        require(_status != _ENTERED, "ReentrancyGuard: reentrant call");

        // Any calls to nonReentrant after this point will fail
        _status = _ENTERED;

        _;

        // By storing the original value once again, a refund is triggered (see
        // https://eips.ethereum.org/EIPS/eip-2200)
        _status = _NOT_ENTERED;
    }
}

File 7 of 7 : Ownable.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (access/Ownable.sol)

pragma solidity ^0.8.0;

import "../utils/Context.sol";

/**
 * @dev Contract module which provides a basic access control mechanism, where
 * there is an account (an owner) that can be granted exclusive access to
 * specific functions.
 *
 * By default, the owner account will be the one that deploys the contract. This
 * can later be changed with {transferOwnership}.
 *
 * This module is used through inheritance. It will make available the modifier
 * `onlyOwner`, which can be applied to your functions to restrict their use to
 * the owner.
 */
abstract contract Ownable is Context {
    address private _owner;

    event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);

    /**
     * @dev Initializes the contract setting the deployer as the initial owner.
     */
    constructor() {
        _transferOwnership(_msgSender());
    }

    /**
     * @dev Returns the address of the current owner.
     */
    function owner() public view virtual returns (address) {
        return _owner;
    }

    /**
     * @dev Throws if called by any account other than the owner.
     */
    modifier onlyOwner() {
        require(owner() == _msgSender(), "Ownable: caller is not the owner");
        _;
    }

    /**
     * @dev Leaves the contract without owner. It will not be possible to call
     * `onlyOwner` functions anymore. Can only be called by the current owner.
     *
     * NOTE: Renouncing ownership will leave the contract without an owner,
     * thereby removing any functionality that is only available to the owner.
     */
    function renounceOwnership() public virtual onlyOwner {
        _transferOwnership(address(0));
    }

    /**
     * @dev Transfers ownership of the contract to a new account (`newOwner`).
     * Can only be called by the current owner.
     */
    function transferOwnership(address newOwner) public virtual onlyOwner {
        require(newOwner != address(0), "Ownable: new owner is the zero address");
        _transferOwnership(newOwner);
    }

    /**
     * @dev Transfers ownership of the contract to a new account (`newOwner`).
     * Internal function without access restriction.
     */
    function _transferOwnership(address newOwner) internal virtual {
        address oldOwner = _owner;
        _owner = newOwner;
        emit OwnershipTransferred(oldOwner, newOwner);
    }
}

Settings
{
  "remappings": [],
  "optimizer": {
    "enabled": false,
    "runs": 200
  },
  "evmVersion": "istanbul",
  "libraries": {},
  "outputSelection": {
    "*": {
      "*": [
        "evm.bytecode",
        "evm.deployedBytecode",
        "devdoc",
        "userdoc",
        "metadata",
        "abi"
      ]
    }
  }
}

Contract ABI

[{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"contractAddress","type":"address"},{"indexed":false,"internalType":"enum LaunchpadV2.CampaignMode","name":"mode","type":"uint8"},{"indexed":false,"internalType":"address","name":"payeeAddress","type":"address"},{"indexed":false,"internalType":"address","name":"platformFeeAddress","type":"address"},{"indexed":false,"internalType":"uint256","name":"platformFeeRate","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"price","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"maxSupply","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"listingTime","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"expirationTime","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"maxBatch","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"maxPerAddress","type":"uint256"},{"indexed":false,"internalType":"address","name":"validator","type":"address"}],"name":"AddCampaign","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"contractAddress","type":"address"},{"indexed":false,"internalType":"enum LaunchpadV2.CampaignMode","name":"mode","type":"uint8"},{"indexed":false,"internalType":"address","name":"userAddress","type":"address"},{"indexed":false,"internalType":"address","name":"payeeAddress","type":"address"},{"indexed":false,"internalType":"address","name":"platformFeeAddress","type":"address"},{"indexed":false,"internalType":"uint256","name":"size","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"fee","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"platformFee","type":"uint256"}],"name":"Mint","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"contractAddress","type":"address"},{"indexed":false,"internalType":"enum LaunchpadV2.CampaignMode","name":"mode","type":"uint8"},{"indexed":false,"internalType":"address","name":"payeeAddress","type":"address"},{"indexed":false,"internalType":"address","name":"platformFeeAddress","type":"address"},{"indexed":false,"internalType":"uint256","name":"platformFeeRate","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"price","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"maxSupply","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"listingTime","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"expirationTime","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"maxBatch","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"maxPerAddress","type":"uint256"},{"indexed":false,"internalType":"address","name":"validator","type":"address"}],"name":"UpdateCampaign","type":"event"},{"inputs":[],"name":"INVERSE_BASIS_POINT","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"addresses","type":"address[]"},{"internalType":"enum LaunchpadV2.CampaignMode","name":"mode","type":"uint8"},{"internalType":"uint256[]","name":"values","type":"uint256[]"}],"name":"addCampaign","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"contractAddress","type":"address"},{"internalType":"enum LaunchpadV2.CampaignMode","name":"mode","type":"uint8"}],"name":"getCampaign","outputs":[{"components":[{"internalType":"address","name":"contractAddress","type":"address"},{"internalType":"address","name":"payeeAddress","type":"address"},{"internalType":"address","name":"platformFeeAddress","type":"address"},{"internalType":"uint256","name":"platformFeeRate","type":"uint256"},{"internalType":"uint256","name":"price","type":"uint256"},{"internalType":"uint256","name":"maxSupply","type":"uint256"},{"internalType":"uint256","name":"listingTime","type":"uint256"},{"internalType":"uint256","name":"expirationTime","type":"uint256"},{"internalType":"uint256","name":"maxBatch","type":"uint256"},{"internalType":"uint256","name":"maxPerAddress","type":"uint256"},{"internalType":"address","name":"validator","type":"address"},{"internalType":"uint256","name":"minted","type":"uint256"}],"internalType":"struct LaunchpadV2.Campaign","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"contractAddress","type":"address"},{"internalType":"enum LaunchpadV2.CampaignMode","name":"mode","type":"uint8"}],"name":"getLaunchpadMaxSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"contractAddress","type":"address"},{"internalType":"enum LaunchpadV2.CampaignMode","name":"mode","type":"uint8"}],"name":"getLaunchpadSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"contractAddress","type":"address"}],"name":"getLaunchpadSupplyTotal","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"contractAddress","type":"address"},{"internalType":"enum LaunchpadV2.CampaignMode","name":"mode","type":"uint8"},{"internalType":"address","name":"userAddress","type":"address"}],"name":"getMintPerAddress","outputs":[{"internalType":"uint256","name":"mintPerAddress","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"contractAddress","type":"address"},{"internalType":"uint256","name":"batchSize","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"contractAddress","type":"address"},{"internalType":"uint256","name":"batchSize","type":"uint256"},{"internalType":"bytes","name":"signature","type":"bytes"}],"name":"mintWhitelisted","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"addresses","type":"address[]"},{"internalType":"enum LaunchpadV2.CampaignMode","name":"mode","type":"uint8"},{"internalType":"uint256[]","name":"values","type":"uint256[]"}],"name":"updateCampaign","outputs":[],"stateMutability":"nonpayable","type":"function"}]

60806040523480156200001157600080fd5b5062000032620000266200003f60201b60201c565b6200004760201b60201c565b600180819055506200010b565b600033905090565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b61588d806200011b6000396000f3fe6080604052600436106100c25760003560e01c80638f7d5a421161007f578063cae6047f11610059578063cae6047f1461025e578063d5f30aed14610289578063dbb4d55c146102b2578063f2fde38b146102ef576100c2565b80638f7d5a42146101dc5780639b5202d414610205578063ab24fd5d14610221576100c2565b806302811610146100c75780632a9fe5851461010457806340c10f19146101415780634a389efa1461015d578063715018a61461019a5780638da5cb5b146101b1575b600080fd5b3480156100d357600080fd5b506100ee60048036038101906100e99190613faf565b610318565b6040516100fb9190614dee565b60405180910390f35b34801561011057600080fd5b5061012b60048036038101906101269190613f86565b610428565b6040516101389190614dee565b60405180910390f35b61015b6004803603810190610156919061403a565b6104af565b005b34801561016957600080fd5b50610184600480360381019061017f9190613feb565b610514565b6040516101919190614dee565b60405180910390f35b3480156101a657600080fd5b506101af610709565b005b3480156101bd57600080fd5b506101c6610791565b6040516101d39190614820565b60405180910390f35b3480156101e857600080fd5b5061020360048036038101906101fe91906140dd565b6107ba565b005b61021f600480360381019061021a9190614076565b610c48565b005b34801561022d57600080fd5b5061024860048036038101906102439190613faf565b610dee565b6040516102559190614dd2565b60405180910390f35b34801561026a57600080fd5b50610273611265565b6040516102809190614dee565b60405180910390f35b34801561029557600080fd5b506102b060048036038101906102ab91906140dd565b61126b565b005b3480156102be57600080fd5b506102d960048036038101906102d49190613faf565b6119ee565b6040516102e69190614dee565b60405180910390f35b3480156102fb57600080fd5b5061031660048036038101906103119190613f86565b611afe565b005b6000806001811115610353577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b82600181111561038c577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b14156103dc57600260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600501549050610422565b600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206005015490505b92915050565b60008173ffffffffffffffffffffffffffffffffffffffff1663eebb28b26040518163ffffffff1660e01b815260040160206040518083038186803b15801561047057600080fd5b505afa158015610484573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906104a8919061415c565b9050919050565b600260015414156104f5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016104ec90614d72565b60405180910390fd5b600260018190555061050982826000611bf6565b600180819055505050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610585576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161057c90614b32565b60405180910390fd5b600060018111156105bf577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b8360018111156105f8577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b141561068257600460008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050610702565b600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205490505b9392505050565b6107116126fb565b73ffffffffffffffffffffffffffffffffffffffff1661072f610791565b73ffffffffffffffffffffffffffffffffffffffff1614610785576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161077c90614c32565b60405180910390fd5b61078f6000612703565b565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6107c26126fb565b73ffffffffffffffffffffffffffffffffffffffff166107e0610791565b73ffffffffffffffffffffffffffffffffffffffff1614610836576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161082d90614c32565b60405180910390fd5b600483511461087a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161087190614cb2565b60405180910390fd5b60078151146108be576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108b590614a12565b60405180910390fd5b600060405180610180016040528085600081518110610906577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002602001015173ffffffffffffffffffffffffffffffffffffffff16815260200185600181518110610963577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002602001015173ffffffffffffffffffffffffffffffffffffffff168152602001856002815181106109c0577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002602001015173ffffffffffffffffffffffffffffffffffffffff16815260200183600081518110610a1d577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020026020010151815260200183600181518110610a64577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020026020010151815260200183600281518110610aab577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020026020010151815260200183600381518110610af2577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020026020010151815260200183600481518110610b39577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020026020010151815260200183600581518110610b80577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020026020010151815260200183600681518110610bc7577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020026020010151815260200185600381518110610c0e577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002602001015173ffffffffffffffffffffffffffffffffffffffff16815260200160008152509050610c4281846127c7565b50505050565b60026001541415610c8e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c8590614d72565b60405180910390fd5b60026001819055506000610ca3846001610dee565b9050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff161415610d19576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d1090614a72565b60405180910390fd5b600046308633604051602001610d3294939291906147d2565b6040516020818303038152906040528051906020012090506000610d5582612e67565b905082610140015173ffffffffffffffffffffffffffffffffffffffff16610d7d8286612e97565b73ffffffffffffffffffffffffffffffffffffffff1614610dd3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dca90614a92565b60405180910390fd5b610ddf86866001611bf6565b50505060018081905550505050565b610df6613ce5565b60006001811115610e30577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b826001811115610e69577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b141561106957600260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020604051806101800160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016001820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016002820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200160038201548152602001600482015481526020016005820154815260200160068201548152602001600782015481526020016008820154815260200160098201548152602001600a820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001600b82015481525050905061125f565b600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020604051806101800160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016001820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016002820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200160038201548152602001600482015481526020016005820154815260200160068201548152602001600782015481526020016008820154815260200160098201548152602001600a820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001600b8201548152505090505b92915050565b61271081565b6112736126fb565b73ffffffffffffffffffffffffffffffffffffffff16611291610791565b73ffffffffffffffffffffffffffffffffffffffff16146112e7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112de90614c32565b60405180910390fd5b600483511461132b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161132290614cb2565b60405180910390fd5b600781511461136f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161136690614a12565b60405180910390fd5b6000836000815181106113ab577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020026020010151905060008060018111156113f0577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b846001811115611429577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b141561154b57600073ffffffffffffffffffffffffffffffffffffffff16600260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415611501576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114f890614db2565b60405180910390fd5b600260008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600b01549050611663565b600073ffffffffffffffffffffffffffffffffffffffff16600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16141561161d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161161490614bf2565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600b015490505b6000604051806101800160405280876000815181106116ab577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002602001015173ffffffffffffffffffffffffffffffffffffffff16815260200187600181518110611708577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002602001015173ffffffffffffffffffffffffffffffffffffffff16815260200187600281518110611765577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002602001015173ffffffffffffffffffffffffffffffffffffffff168152602001856000815181106117c2577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020026020010151815260200185600181518110611809577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020026020010151815260200185600281518110611850577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020026020010151815260200185600381518110611897577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200260200101518152602001856004815181106118de577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020026020010151815260200185600581518110611925577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002602001015181526020018560068151811061196c577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200260200101518152602001876003815181106119b3577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1681526020018381525090506119e68186612ebe565b505050505050565b6000806001811115611a29577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b826001811115611a62577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b1415611ab257600260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600b01549050611af8565b600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600b015490505b92915050565b611b066126fb565b73ffffffffffffffffffffffffffffffffffffffff16611b24610791565b73ffffffffffffffffffffffffffffffffffffffff1614611b7a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b7190614c32565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611bea576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611be190614ab2565b60405180910390fd5b611bf381612703565b50565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415611c66576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c5d90614d32565b60405180910390fd5b60008211611ca9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ca090614bb2565b60405180910390fd5b6000611cb58483610dee565b9050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff161415611d2b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d2290614a72565b60405180910390fd5b806101000151831115611d73576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d6a90614cd2565b60405180910390fd5b8060c00151421015611dba576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611db190614bd2565b60405180910390fd5b8060e001514210611e00576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611df790614d52565b60405180910390fd5b8060a0015183826101600151611e169190614ed3565b1115611e57576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e4e90614d12565b60405180910390fd5b806000015173ffffffffffffffffffffffffffffffffffffffff16635b43bba16040518163ffffffff1660e01b815260040160206040518083038186803b158015611ea157600080fd5b505afa158015611eb5573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611ed9919061415c565b83826000015173ffffffffffffffffffffffffffffffffffffffff1663eebb28b26040518163ffffffff1660e01b815260040160206040518083038186803b158015611f2457600080fd5b505afa158015611f38573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611f5c919061415c565b611f669190614ed3565b1115611fa7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f9e90614c52565b60405180910390fd5b60006001811115611fe1577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b82600181111561201a577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b1415612259578061012001518360046000846000015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546120b29190614ed3565b11156120f3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120ea90614c92565b60405180910390fd5b82600460008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461217b9190614ed3565b600460008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555082600260008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600b01600082825461224d9190614ed3565b9250508190555061248e565b8061012001518360056000846000015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546122eb9190614ed3565b111561232c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161232390614c92565b60405180910390fd5b82600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546123b49190614ed3565b600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555082600360008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600b0160008282546124869190614ed3565b925050819055505b60008382608001516124a09190614f5a565b9050803410156124e5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124dc90614af2565b60405180910390fd5b60006127108360600151836124fa9190614f5a565b6125049190614f29565b9050600081836125149190614fb4565b9050836020015173ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f19350505050158015612560573d6000803e3d6000fd5b5060008211156125b657836040015173ffffffffffffffffffffffffffffffffffffffff166108fc839081150290604051600060405180830381858888f193505050501580156125b4573d6000803e3d6000fd5b505b8673ffffffffffffffffffffffffffffffffffffffff1663449a52f833886040518363ffffffff1660e01b81526004016125f19291906148f5565b600060405180830381600087803b15801561260b57600080fd5b505af115801561261f573d6000803e3d6000fd5b50505050836000015173ffffffffffffffffffffffffffffffffffffffff167f30339c16ed38995efada9623367c9f143bdc9d3c1ce1ba111330df83f2af2f0b8633876020015188604001518b87896040516126819796959493929190614963565b60405180910390a2600083346126979190614fb4565b905060008111156126f1576126aa6126fb565b73ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f193505050501580156126ef573d6000803e3d6000fd5b505b5050505050505050565b600033905090565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6127d18282613335565b6000600181111561280b577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b816001811115612844577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b141561292457600073ffffffffffffffffffffffffffffffffffffffff1660026000846000015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161461291f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161291690614b92565b60405180910390fd5b6129fa565b600073ffffffffffffffffffffffffffffffffffffffff1660036000846000015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146129f9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016129f090614b92565b60405180910390fd5b5b7f1ed431950696bca4f28b988f7e99165cf0c539880edf03e6daa6746ecc351a8682600001518284602001518560400151866060015187608001518860a001518960c001518a60e001518b61010001518c61012001518d6101400151604051612a6e9c9b9a9998979695949392919061483b565b60405180910390a160006001811115612ab0577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b816001811115612ae9577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b1415612cab578160026000846000015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160010160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060408201518160020160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550606082015181600301556080820151816004015560a0820151816005015560c0820151816006015560e082015181600701556101008201518160080155610120820151816009015561014082015181600a0160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555061016082015181600b0155905050612e63565b8160036000846000015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160010160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060408201518160020160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550606082015181600301556080820151816004015560a0820151816005015560c0820151816006015560e082015181600701556101008201518160080155610120820151816009015561014082015181600a0160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555061016082015181600b01559050505b5050565b600081604051602001612e7a91906147ac565b604051602081830303815290604052805190602001209050919050565b6000806000612ea685856137b6565b91509150612eb381613839565b819250505092915050565b612ec88282613335565b7f28e14b5b98a4bc4f2f42eac668e0aaf0b3eec2e620a31c791e4c98e1e9c11ec782600001518284602001518560400151866060015187608001518860a001518960c001518a60e001518b61010001518c61012001518d6101400151604051612f3c9c9b9a9998979695949392919061483b565b60405180910390a160006001811115612f7e577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b816001811115612fb7577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b1415613179578160026000846000015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160010160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060408201518160020160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550606082015181600301556080820151816004015560a0820151816005015560c0820151816006015560e082015181600701556101008201518160080155610120820151816009015561014082015181600a0160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555061016082015181600b0155905050613331565b8160036000846000015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160010160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060408201518160020160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550606082015181600301556080820151816004015560a0820151816005015560c0820151816006015560e082015181600701556101008201518160080155610120820151816009015561014082015181600a0160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555061016082015181600b01559050505b5050565b600073ffffffffffffffffffffffffffffffffffffffff16826000015173ffffffffffffffffffffffffffffffffffffffff1614156133a9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016133a090614d32565b60405180910390fd5b8160c001518260e00151116133f3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016133ea90614c72565b60405180910390fd5b60008260a0015111801561348c5750816000015173ffffffffffffffffffffffffffffffffffffffff16635b43bba16040518163ffffffff1660e01b815260040160206040518083038186803b15801561344c57600080fd5b505afa158015613460573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613484919061415c565b8260a0015111155b6134cb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016134c290614a32565b60405180910390fd5b600180811115613504577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b81600181111561353d577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b14156135b957600073ffffffffffffffffffffffffffffffffffffffff1682610140015173ffffffffffffffffffffffffffffffffffffffff1614156135b8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016135af906149f2565b60405180910390fd5b5b600073ffffffffffffffffffffffffffffffffffffffff16826020015173ffffffffffffffffffffffffffffffffffffffff16141561362d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161362490614b52565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff16826040015173ffffffffffffffffffffffffffffffffffffffff1614156136a1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161369890614ad2565b60405180910390fd5b60008260600151101580156136bc5750612710826060015111155b6136fb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016136f290614b12565b60405180910390fd5b60008261010001511180156137165750600a82610100015111155b613755576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161374c90614cf2565b60405180910390fd5b600082610120015111801561377357508160a0015182610120015111155b6137b2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016137a990614d92565b60405180910390fd5b5050565b6000806041835114156137f85760008060006020860151925060408601519150606086015160001a90506137ec87828585613b8a565b94509450505050613832565b60408351141561382957600080602085015191506040850151905061381e868383613c97565b935093505050613832565b60006002915091505b9250929050565b60006004811115613873577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b8160048111156138ac577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b14156138b757613b87565b600160048111156138f1577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b81600481111561392a577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b141561396b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613962906149d2565b60405180910390fd5b600260048111156139a5577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b8160048111156139de577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b1415613a1f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613a1690614a52565b60405180910390fd5b60036004811115613a59577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b816004811115613a92577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b1415613ad3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613aca90614b72565b60405180910390fd5b600480811115613b0c577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b816004811115613b45577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b1415613b86576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613b7d90614c12565b60405180910390fd5b5b50565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08360001c1115613bc5576000600391509150613c8e565b601b8560ff1614158015613bdd5750601c8560ff1614155b15613bef576000600491509150613c8e565b600060018787878760405160008152602001604052604051613c14949392919061491e565b6020604051602081039080840390855afa158015613c36573d6000803e3d6000fd5b505050602060405103519050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415613c8557600060019250925050613c8e565b80600092509250505b94509492505050565b6000806000807f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff85169150601b8560ff1c019050613cd787828885613b8a565b935093505050935093915050565b604051806101800160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600073ffffffffffffffffffffffffffffffffffffffff168152602001600073ffffffffffffffffffffffffffffffffffffffff16815260200160008152602001600081526020016000815260200160008152602001600081526020016000815260200160008152602001600073ffffffffffffffffffffffffffffffffffffffff168152602001600081525090565b6000613db1613dac84614e2e565b614e09565b90508083825260208201905082856020860282011115613dd057600080fd5b60005b85811015613e005781613de68882613eb4565b845260208401935060208301925050600181019050613dd3565b5050509392505050565b6000613e1d613e1884614e5a565b614e09565b90508083825260208201905082856020860282011115613e3c57600080fd5b60005b85811015613e6c5781613e528882613f5c565b845260208401935060208301925050600181019050613e3f565b5050509392505050565b6000613e89613e8484614e86565b614e09565b905082815260208101848484011115613ea157600080fd5b613eac848285615060565b509392505050565b600081359050613ec381615819565b92915050565b600082601f830112613eda57600080fd5b8135613eea848260208601613d9e565b91505092915050565b600082601f830112613f0457600080fd5b8135613f14848260208601613e0a565b91505092915050565b600082601f830112613f2e57600080fd5b8135613f3e848260208601613e76565b91505092915050565b600081359050613f5681615830565b92915050565b600081359050613f6b81615840565b92915050565b600081519050613f8081615840565b92915050565b600060208284031215613f9857600080fd5b6000613fa684828501613eb4565b91505092915050565b60008060408385031215613fc257600080fd5b6000613fd085828601613eb4565b9250506020613fe185828601613f47565b9150509250929050565b60008060006060848603121561400057600080fd5b600061400e86828701613eb4565b935050602061401f86828701613f47565b925050604061403086828701613eb4565b9150509250925092565b6000806040838503121561404d57600080fd5b600061405b85828601613eb4565b925050602061406c85828601613f5c565b9150509250929050565b60008060006060848603121561408b57600080fd5b600061409986828701613eb4565b93505060206140aa86828701613f5c565b925050604084013567ffffffffffffffff8111156140c757600080fd5b6140d386828701613f1d565b9150509250925092565b6000806000606084860312156140f257600080fd5b600084013567ffffffffffffffff81111561410c57600080fd5b61411886828701613ec9565b935050602061412986828701613f47565b925050604084013567ffffffffffffffff81111561414657600080fd5b61415286828701613ef3565b9150509250925092565b60006020828403121561416e57600080fd5b600061417c84828501613f71565b91505092915050565b61418e81614fe8565b82525050565b61419d81614fe8565b82525050565b6141b46141af82614fe8565b6150a0565b82525050565b6141c381614ffa565b82525050565b6141da6141d582614ffa565b6150b2565b82525050565b6141e98161504e565b82525050565b60006141fc601883614eb7565b9150614207826151b2565b602082019050919050565b600061421f601883614eb7565b915061422a826151db565b602082019050919050565b6000614242601183614eb7565b915061424d82615204565b602082019050919050565b6000614265601b83614eb7565b91506142708261522d565b602082019050919050565b6000614288601f83614eb7565b915061429382615256565b602082019050919050565b60006142ab601c83614ec8565b91506142b68261527f565b601c82019050919050565b60006142ce601583614eb7565b91506142d9826152a8565b602082019050919050565b60006142f1601d83614eb7565b91506142fc826152d1565b602082019050919050565b6000614314602683614eb7565b915061431f826152fa565b604082019050919050565b6000614337602383614eb7565b915061434282615349565b604082019050919050565b600061435a601083614eb7565b915061436582615398565b602082019050919050565b600061437d601983614eb7565b9150614388826153c1565b602082019050919050565b60006143a0601483614eb7565b91506143ab826153ea565b602082019050919050565b60006143c3601c83614eb7565b91506143ce82615413565b602082019050919050565b60006143e6602283614eb7565b91506143f18261543c565b604082019050919050565b6000614409601e83614eb7565b91506144148261548b565b602082019050919050565b600061442c601d83614eb7565b9150614437826154b4565b602082019050919050565b600061444f601283614eb7565b915061445a826154dd565b602082019050919050565b6000614472602583614eb7565b915061447d82615506565b604082019050919050565b6000614495602283614eb7565b91506144a082615555565b604082019050919050565b60006144b8602083614eb7565b91506144c3826155a4565b602082019050919050565b60006144db601f83614eb7565b91506144e6826155cd565b602082019050919050565b60006144fe602783614eb7565b9150614509826155f6565b604082019050919050565b6000614521601b83614eb7565b915061452c82615645565b602082019050919050565b6000614544601483614eb7565b915061454f8261566e565b602082019050919050565b6000614567601483614eb7565b915061457282615697565b602082019050919050565b600061458a601183614eb7565b9150614595826156c0565b602082019050919050565b60006145ad601983614eb7565b91506145b8826156e9565b602082019050919050565b60006145d0601f83614eb7565b91506145db82615712565b602082019050919050565b60006145f3600e83614eb7565b91506145fe8261573b565b602082019050919050565b6000614616601f83614eb7565b915061462182615764565b602082019050919050565b6000614639601783614eb7565b91506146448261578d565b602082019050919050565b600061465c602183614eb7565b9150614667826157b6565b604082019050919050565b610180820160008201516146896000850182614185565b50602082015161469c6020850182614185565b5060408201516146af6040850182614185565b5060608201516146c26060850182614768565b5060808201516146d56080850182614768565b5060a08201516146e860a0850182614768565b5060c08201516146fb60c0850182614768565b5060e082015161470e60e0850182614768565b50610100820151614723610100850182614768565b50610120820151614738610120850182614768565b5061014082015161474d610140850182614185565b50610160820151614762610160850182614768565b50505050565b61477181615037565b82525050565b61478081615037565b82525050565b61479761479282615037565b6150ce565b82525050565b6147a681615041565b82525050565b60006147b78261429e565b91506147c382846141c9565b60208201915081905092915050565b60006147de8287614786565b6020820191506147ee82866141a3565b6014820191506147fe82856141a3565b60148201915061480e82846141a3565b60148201915081905095945050505050565b60006020820190506148356000830184614194565b92915050565b600061018082019050614851600083018f614194565b61485e602083018e6141e0565b61486b604083018d614194565b614878606083018c614194565b614885608083018b614777565b61489260a083018a614777565b61489f60c0830189614777565b6148ac60e0830188614777565b6148ba610100830187614777565b6148c8610120830186614777565b6148d6610140830185614777565b6148e4610160830184614194565b9d9c50505050505050505050505050565b600060408201905061490a6000830185614194565b6149176020830184614777565b9392505050565b600060808201905061493360008301876141ba565b614940602083018661479d565b61494d60408301856141ba565b61495a60608301846141ba565b95945050505050565b600060e082019050614978600083018a6141e0565b6149856020830189614194565b6149926040830188614194565b61499f6060830187614194565b6149ac6080830186614777565b6149b960a0830185614777565b6149c660c0830184614777565b98975050505050505050565b600060208201905081810360008301526149eb816141ef565b9050919050565b60006020820190508181036000830152614a0b81614212565b9050919050565b60006020820190508181036000830152614a2b81614235565b9050919050565b60006020820190508181036000830152614a4b81614258565b9050919050565b60006020820190508181036000830152614a6b8161427b565b9050919050565b60006020820190508181036000830152614a8b816142c1565b9050919050565b60006020820190508181036000830152614aab816142e4565b9050919050565b60006020820190508181036000830152614acb81614307565b9050919050565b60006020820190508181036000830152614aeb8161432a565b9050919050565b60006020820190508181036000830152614b0b8161434d565b9050919050565b60006020820190508181036000830152614b2b81614370565b9050919050565b60006020820190508181036000830152614b4b81614393565b9050919050565b60006020820190508181036000830152614b6b816143b6565b9050919050565b60006020820190508181036000830152614b8b816143d9565b9050919050565b60006020820190508181036000830152614bab816143fc565b9050919050565b60006020820190508181036000830152614bcb8161441f565b9050919050565b60006020820190508181036000830152614beb81614442565b9050919050565b60006020820190508181036000830152614c0b81614465565b9050919050565b60006020820190508181036000830152614c2b81614488565b9050919050565b60006020820190508181036000830152614c4b816144ab565b9050919050565b60006020820190508181036000830152614c6b816144ce565b9050919050565b60006020820190508181036000830152614c8b816144f1565b9050919050565b60006020820190508181036000830152614cab81614514565b9050919050565b60006020820190508181036000830152614ccb81614537565b9050919050565b60006020820190508181036000830152614ceb8161455a565b9050919050565b60006020820190508181036000830152614d0b8161457d565b9050919050565b60006020820190508181036000830152614d2b816145a0565b9050919050565b60006020820190508181036000830152614d4b816145c3565b9050919050565b60006020820190508181036000830152614d6b816145e6565b9050919050565b60006020820190508181036000830152614d8b81614609565b9050919050565b60006020820190508181036000830152614dab8161462c565b9050919050565b60006020820190508181036000830152614dcb8161464f565b9050919050565b600061018082019050614de86000830184614672565b92915050565b6000602082019050614e036000830184614777565b92915050565b6000614e13614e24565b9050614e1f828261506f565b919050565b6000604051905090565b600067ffffffffffffffff821115614e4957614e48615165565b5b602082029050602081019050919050565b600067ffffffffffffffff821115614e7557614e74615165565b5b602082029050602081019050919050565b600067ffffffffffffffff821115614ea157614ea0615165565b5b614eaa82615194565b9050602081019050919050565b600082825260208201905092915050565b600081905092915050565b6000614ede82615037565b9150614ee983615037565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115614f1e57614f1d6150d8565b5b828201905092915050565b6000614f3482615037565b9150614f3f83615037565b925082614f4f57614f4e615107565b5b828204905092915050565b6000614f6582615037565b9150614f7083615037565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615614fa957614fa86150d8565b5b828202905092915050565b6000614fbf82615037565b9150614fca83615037565b925082821015614fdd57614fdc6150d8565b5b828203905092915050565b6000614ff382615017565b9050919050565b6000819050919050565b600081905061501282615805565b919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600060ff82169050919050565b600061505982615004565b9050919050565b82818337600083830152505050565b61507882615194565b810181811067ffffffffffffffff8211171561509757615096615165565b5b80604052505050565b60006150ab826150bc565b9050919050565b6000819050919050565b60006150c7826151a5565b9050919050565b6000819050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b60008160601b9050919050565b7f45434453413a20696e76616c6964207369676e61747572650000000000000000600082015250565b7f76616c696461746f722063616e277420626520656d7074790000000000000000600082015250565b7f76616c7565732073697a652077726f6e67000000000000000000000000000000600082015250565b7f63616d706169676e206d617820737570706c7920696e76616c69640000000000600082015250565b7f45434453413a20696e76616c6964207369676e6174757265206c656e67746800600082015250565b7f19457468657265756d205369676e6564204d6573736167653a0a333200000000600082015250565b7f636f6e7472616374206e6f742072656769737465720000000000000000000000600082015250565b7f77686974656c69737420766572696669636174696f6e206661696c6564000000600082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f706c6174666f726d2066656520616464726573732063616e277420626520656d60008201527f7074790000000000000000000000000000000000000000000000000000000000602082015250565b7f76616c7565206e6f7420656e6f75676800000000000000000000000000000000600082015250565b7f706c6174666f726d20666565207261746520696e76616c696400000000000000600082015250565b7f75736572206164647265737320696e76616c6964000000000000000000000000600082015250565b7f706179656520616464726573732063616e277420626520656d70747900000000600082015250565b7f45434453413a20696e76616c6964207369676e6174757265202773272076616c60008201527f7565000000000000000000000000000000000000000000000000000000000000602082015250565b7f636f6e7472616374206164647265737320616c72656164792065786973740000600082015250565b7f626174636853697a65206d7573742067726561746572207468616e2030000000600082015250565b7f6163746976697479206e6f742073746172740000000000000000000000000000600082015250565b7f77686974652d6c69737420636f6e74726163742061646472657373206e6f742060008201527f6578697374000000000000000000000000000000000000000000000000000000602082015250565b7f45434453413a20696e76616c6964207369676e6174757265202776272076616c60008201527f7565000000000000000000000000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f72656163682063616d706169676e20746f74616c206d617820737570706c7900600082015250565b7f65787069726174696f6e2074696d65206d7573742061626f7665206c6973746960008201527f6e672074696d6500000000000000000000000000000000000000000000000000602082015250565b7f7265616368206d6178207065722061646472657373206c696d69740000000000600082015250565b7f6164647265737365732073697a652077726f6e67000000000000000000000000600082015250565b7f7265616368206d61782062617463682073697a65000000000000000000000000600082015250565b7f6d617820626174636820696e76616c6964000000000000000000000000000000600082015250565b7f72656163682063616d706169676e206d617820737570706c7900000000000000600082015250565b7f636f6e747261637420616464726573732063616e277420626520656d70747900600082015250565b7f616374697669747920656e646564000000000000000000000000000000000000600082015250565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b7f6d617820706572206164647265737320696e76616c6964000000000000000000600082015250565b7f6e6f726d616c20636f6e74726163742061646472657373206e6f74206578697360008201527f7400000000000000000000000000000000000000000000000000000000000000602082015250565b6002811061581657615815615136565b5b50565b61582281614fe8565b811461582d57600080fd5b50565b6002811061583d57600080fd5b50565b61584981615037565b811461585457600080fd5b5056fea26469706673582212205f7405f0ba26d7d0efbdf9f8e2cf3c405ef2d8222c408552c2d57a04475e167b64736f6c63430008010033

Block Transaction Difficulty Gas Used Reward
Block Uncle Number Difficulty Gas Used Reward
Loading

A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.