Contract 0x267F73c996B501aF83d7989EA7f4dF859D9656b2 6

 

Contract Overview

Balance:
0 Ether

EtherValue:
$0.00

Token:
 
Txn Hash
Method
Block
From
To
Value
0xfccc86089867211449f949f9679669e9ed28f4271e9f802d28a6d52d3c5b8ddaBuy Incubator156280102022-09-27 23:38:353 days 21 hrs ago0xd7d58eb413cf79c75e3ce3259dbba83fc1fe94c7 IN  0x267f73c996b501af83d7989ea7f4df859d9656b20 Ether0.00126967 9.42961997
0xfb235c35b32894a97bebdd6c907e2076a600b7b0a64f561d07a9d9ccddda3900Claim Meth156279112022-09-27 23:18:473 days 22 hrs ago0x58c419ca3b2f574b3507445d01abf37004b3fb9f IN  0x267f73c996b501af83d7989ea7f4df859d9656b20 Ether0.01148094 11.95915237
0x075fde1d5e8f59269dbe993e707b07400c7bdf5c88227843d9d6f57fd9b9ccbaClaim Meth156277872022-09-27 22:53:593 days 22 hrs agoENS Name fullyvoxxed.eth IN  0x267f73c996b501af83d7989ea7f4df859d9656b20 Ether0.00613578 9.75333512
0xbae2a45296f66ccf07d13f3094cc1d01228d6a0eb1ca2b128f6ede1df89ce232Generate Teen Bu...156276822022-09-27 22:32:473 days 22 hrs agoENS Name godwhale.eth IN  0x267f73c996b501af83d7989ea7f4df859d9656b20 Ether0.00051653 10.633751
0x66ea003f0e57f3966b5c973784067bcad80521c6adf5c72bbfca8d9cac0bd959Generate Teen Bu...156276822022-09-27 22:32:473 days 22 hrs agoENS Name godwhale.eth IN  0x267f73c996b501af83d7989ea7f4df859d9656b20 Ether0.00051653 10.633751
0x993a9ca0ac7f3d0aa920c726b2f98d89a292ddb6ee35fe2c5564deadbcf98348Generate Teen Bu...156276812022-09-27 22:32:353 days 22 hrs agoENS Name godwhale.eth IN  0x267f73c996b501af83d7989ea7f4df859d9656b20 Ether0.00051724 10.64847537
0xcebfa16eedfb152ea20115b0442b9c6c5277f11e30bcdfa33b30a2847fd5cab0Generate Teen Bu...156276802022-09-27 22:32:233 days 22 hrs agoENS Name godwhale.eth IN  0x267f73c996b501af83d7989ea7f4df859d9656b20 Ether0.0005176 10.65576791
0x56252ffb4e2f7e96c53b9405af3b6eb45e83b946015c86d36d5e6fbd68b8b872Generate Teen Bu...156276802022-09-27 22:32:233 days 22 hrs agoENS Name godwhale.eth IN  0x267f73c996b501af83d7989ea7f4df859d9656b20 Ether0.0005176 10.65576791
0x9b04d24415c018fdc2828a0296552d16dbb5c30eab7c79398ad9d2c91f70abd0Generate Teen Bu...156276792022-09-27 22:32:113 days 22 hrs agoENS Name godwhale.eth IN  0x267f73c996b501af83d7989ea7f4df859d9656b20 Ether0.0005558 11.44215071
0x5dcfbae624856b509598bf7c29d1b895d2b17239f74774b0e7b91f3564fb931fGenerate Teen Bu...156276782022-09-27 22:31:593 days 22 hrs agoENS Name godwhale.eth IN  0x267f73c996b501af83d7989ea7f4df859d9656b20 Ether0.00055659 11.45854013
0xe2e4b4cc00619f6b1686ced1b640482d9eb589ec65525989f6fb0a0eaeddbe01Generate Teen Bu...156276772022-09-27 22:31:473 days 22 hrs agoENS Name godwhale.eth IN  0x267f73c996b501af83d7989ea7f4df859d9656b20 Ether0.00050826 10.46351505
0x4c23810e63c054e57747d956fd7992b6fd0ab491a4b8eee7077f84dacbd33b25Generate Teen Bu...156276772022-09-27 22:31:473 days 22 hrs agoENS Name godwhale.eth IN  0x267f73c996b501af83d7989ea7f4df859d9656b20 Ether0.00140066 10.46351505
0x9274881134975e2fea23f959a68a86cc34d89bb1fdec3538b1c635730b44d83eGenerate Teen Bu...156276752022-09-27 22:31:233 days 22 hrs agoENS Name godwhale.eth IN  0x267f73c996b501af83d7989ea7f4df859d9656b20 Ether0.001539 11.49692407
0xcc175e994b0352b63991ca5555ecd14811df2b1595ff783752f99c4bf976ae4eGenerate Teen Bu...156276752022-09-27 22:31:233 days 22 hrs agoENS Name godwhale.eth IN  0x267f73c996b501af83d7989ea7f4df859d9656b20 Ether0.001539 11.49692407
0x3b7385e0599fc4837d8381d865917dbac21270fffdfe0816de2d2bf1c39bb261Generate Teen Bu...156276742022-09-27 22:31:113 days 22 hrs agoENS Name godwhale.eth IN  0x267f73c996b501af83d7989ea7f4df859d9656b20 Ether0.00145425 10.86380391
0xa80ad2bc678ffee6a489f996fb7fb325bb961ac9714e0beaf47ba8e96a7af4dcGenerate Teen Bu...156276742022-09-27 22:31:113 days 22 hrs agoENS Name godwhale.eth IN  0x267f73c996b501af83d7989ea7f4df859d9656b20 Ether0.00145425 10.86380391
0xf174f9880f6f542d92baca6b2d7ab68f44a982e3f59d262a6ec57c1a43fa65b4Generate Teen Bu...156276732022-09-27 22:30:593 days 22 hrs agoENS Name godwhale.eth IN  0x267f73c996b501af83d7989ea7f4df859d9656b20 Ether0.00148526 11.09548636
0xf5c3c7203c25ed081ce108955627fc0695bfbb9015fd969c3414e130a399a358Generate Teen Bu...156276732022-09-27 22:30:593 days 22 hrs agoENS Name godwhale.eth IN  0x267f73c996b501af83d7989ea7f4df859d9656b20 Ether0.00148526 11.09548636
0xcd2342f988f92d198c3d759fb6ffc5336f8fe5be19697bfb2068ca2d312c95b6Generate Teen Bu...156276712022-09-27 22:30:353 days 22 hrs agoENS Name godwhale.eth IN  0x267f73c996b501af83d7989ea7f4df859d9656b20 Ether0.00162323 12.12618546
0xef72178b10f7b43fa7b503f6a38eca85e14539abdf7fc76d0de6f2aaca4ca5fdGenerate Teen Bu...156276702022-09-27 22:30:233 days 22 hrs agoENS Name godwhale.eth IN  0x267f73c996b501af83d7989ea7f4df859d9656b20 Ether0.00150262 11.22514563
0x7d3cf250fc41575d46708d68e1ec9d49be001d8beb18903961a374cff934a7feGenerate Teen Bu...156276682022-09-27 22:29:593 days 22 hrs agoENS Name mrdamianj.eth IN  0x267f73c996b501af83d7989ea7f4df859d9656b20 Ether0.00149448 11.57958522
0x512c4bb3ecb270d044f74dcb3f641141b5944a050ed32cf0e974f7db7b9577adBuy Incubator156276632022-09-27 22:28:593 days 22 hrs agoENS Name mrdamianj.eth IN  0x267f73c996b501af83d7989ea7f4df859d9656b20 Ether0.00159311 11.22617322
0x464b60648de6550ca6d584e4e7282cca8ab8a5f27c432d437885ca5b1848eb08Claim Meth156276552022-09-27 22:27:233 days 22 hrs agoENS Name mrdamianj.eth IN  0x267f73c996b501af83d7989ea7f4df859d9656b20 Ether0.00253094 10.75151503
0xcd64aa263cdc5745f0494b5a1b53cbe3425ed0ce80d286f36e9d0d217c51016cGenerate Teen Bu...156276432022-09-27 22:24:593 days 22 hrs agoENS Name godwhale.eth IN  0x267f73c996b501af83d7989ea7f4df859d9656b20 Ether0.00165136 12.33635176
0x2cec37523d6977d029c70db12ece7eacb2fba4d6f4c905917d2f8c3942a30fa5Generate Teen Bu...156276432022-09-27 22:24:593 days 22 hrs agoENS Name godwhale.eth IN  0x267f73c996b501af83d7989ea7f4df859d9656b20 Ether0.00165136 12.33635176
[ Download CSV Export 
View more zero value Internal Transactions in Advanced View mode
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
BAPOrchestrator

Compiler Version
v0.8.12+commit.f00d7308

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion
File 1 of 10 : NewBAPOrchestrator.sol
// SPDX-License-Identifier: GPL-3.0
// solhint-disable-next-line
pragma solidity 0.8.12;
import "@openzeppelin/contracts/access/Ownable.sol";
import "@openzeppelin/contracts/security/ReentrancyGuard.sol";
import "@openzeppelin/contracts/utils/math/SafeMath.sol";
import "./Interfaces/BAPGenesisInterface.sol";
import "./Interfaces/BAPMethaneInterface.sol";
import "./Interfaces/BAPUtilitiesInterface.sol";
import "./Interfaces/BAPTeenBullsInterface.sol";
import "./Interfaces/BAPOrchestratorInterfaceV2.sol";

/**
 * A number of codes are defined as error messages.
 * Codes are resembling HTTP statuses. This is the structure
 * CODE:SHORT
 * Where CODE is a number and SHORT is a short word or prase
 * describing the condition
 * CODES:
 * 100  contract status: open/closed, depleted. In general for any flag
 *     causing the mint to not to happen.
 * 200  parameters validation errors, like zero address or wrong values
 * 300  User payment amount errors like not enough funds.
 * 400  Contract amount/availability errors like not enough tokens or empty vault.
 * 500  permission errors, like not whitelisted, wrong address, not the owner.
 */
contract BAPOrchestrator is ReentrancyGuard, Ownable {
    using SafeMath for uint256;
    string public project;
    address public bapGenesisAddr;
    address public bapMethAddr;
    address public bapUtilitiesAddr;
    address public bapTeenBullsAddr;
    address public originalOrchestratorAddr;
    address public treasuryWallet;
    BAPGenesisInterface bapGenesis;
    BAPMethaneInterface bapMeth;
    BAPUtilitiesInterface bapUtilities;
    BAPTeenBullsInterface bapTeenBulls;
    BAPOrchestratorInterfaceV2 originalOrchestrator;
    address public secret;
    uint256 public timeCounter = 1 days;
    uint256 public grazingPeriodTime = 31 days;
    mapping(uint256 => uint256) public claimedMeth;
    mapping(uint256 => bool) public mintingRefunded;
    mapping(uint256 => uint256) public godsMintingDate;
    mapping(uint256 => bool) public godBulls;
    bool private refundFlag = false;
    bool private claimFlag = false;
    uint256 godBullIndex = 10010;

    struct SignatureTeenBullStruct {
        address sender;
    }

    struct SignatureGodBullStruct {
        address sender;
        uint256 teen1;
        uint256 teen2;
        uint256 teen3;
        uint256 teen4;
    }

    constructor(
        address _bapGenesis,
        address _bapMethane,
        address _originalOrchestrator
    ) {
        require(_bapGenesis != address(0), "200:ZERO_ADDRESS");
        require(_bapMethane != address(0), "200:ZERO_ADDRESS");
        require(_originalOrchestrator != address(0), "200:ZERO_ADDRESS");

        project = "Bulls & Apes Project";
        bapGenesisAddr = _bapGenesis;
        bapMethAddr = _bapMethane;
        originalOrchestratorAddr = _originalOrchestrator;

        bapGenesis = BAPGenesisInterface(bapGenesisAddr);
        bapMeth = BAPMethaneInterface(bapMethAddr);
        originalOrchestrator = BAPOrchestratorInterfaceV2(
            _originalOrchestrator
        );
    }

    function setGenesisContract(address _newAddress) external onlyOwner {
        require(_newAddress != address(0), "200:ZERO_ADDRESS");
        bapGenesisAddr = _newAddress;
        bapGenesis = BAPGenesisInterface(bapGenesisAddr);
    }

    function setMethaneContract(address _newAddress) external onlyOwner {
        require(_newAddress != address(0), "200:ZERO_ADDRESS");
        bapMethAddr = _newAddress;
        bapMeth = BAPMethaneInterface(bapMethAddr);
    }

    function setUtilitiesContract(address _newAddress) external onlyOwner {
        require(_newAddress != address(0), "200:ZERO_ADDRESS");
        bapUtilitiesAddr = _newAddress;
        bapUtilities = BAPUtilitiesInterface(bapUtilitiesAddr);
    }

    function setTeenBullsContract(address _newAddress) external onlyOwner {
        require(_newAddress != address(0), "200:ZERO_ADDRESS");
        bapTeenBullsAddr = _newAddress;
        bapTeenBulls = BAPTeenBullsInterface(bapTeenBullsAddr);
    }

    function initializeGodBulls(uint256[] memory gods, bool godBullFlag)
        external
        onlyOwner
    {
        uint256 bullsCount = gods.length;
        for (uint256 index = 0; index < bullsCount; index++) {
            godBulls[gods[index]] = godBullFlag;
        }
    }

    function claimMeth(
        bytes memory signature,
        uint256[] memory bulls,
        uint256[] memory gods
    ) external nonReentrant {
        uint256 bullsCount = bulls.length;
        uint256 godsCount = gods.length;

        require(
            _verifyClaimMeth(signature, bullsCount, godsCount),
            "Invalid Signature"
        );
        uint256 amount = 0;
        for (uint256 index = 0; index < godsCount; index++) {
            require(
                godBulls[gods[index]] == true || gods[index] > godBullIndex,
                "Not a God Bull"
            );
        }
        for (uint256 index = 0; index < bullsCount; index++) {
            require(godBulls[bulls[index]] == false, "Not a OG Bull");
        }
        for (uint256 index = 0; index < bullsCount; index++) {
            amount += _claimRewardsFromToken(bulls[index], false);
        }
        for (uint256 index = 0; index < godsCount; index++) {
            amount += _claimRewardsFromToken(gods[index], true);
        }
        bapMeth.claim(_msgSender(), amount);
    }

    function setTreasuryWallet(address _newTreasuryWallet) external onlyOwner {
        require(_newTreasuryWallet != address(0), "200:ZERO_ADDRESS");
        treasuryWallet = _newTreasuryWallet;
    }

    function setWhitelistedAddress(address _secret) external onlyOwner {
        require(_secret != address(0), "200:ZERO_ADDRESS");
        secret = _secret;
    }

    function setGrazingPeriodTime(uint256 _grazingPeriod) external onlyOwner {
        grazingPeriodTime = _grazingPeriod;
    }

    function setTimeCounter(uint256 _timeCounter) external onlyOwner {
        timeCounter = _timeCounter;
    }

    function getClaimableMeth(uint256 tokenId, bool isGodBull)
        external
        view
        returns (uint256)
    {
        require(bapGenesis.tokenExist(tokenId), "Token does exist");
        if (tokenId > godBullIndex) {
            if (godsMintingDate[tokenId] == 0) {
                return 0;
            }
            uint256 timeFromCreation = (block.timestamp -
                godsMintingDate[tokenId]).div(timeCounter);
            return
                _dailyRewards(isGodBull) *
                timeFromCreation -
                (claimedMeth[tokenId] +
                    originalOrchestrator.claimedMeth(tokenId));
        } else {
            uint256 timeFromCreation = (block.timestamp -
                bapGenesis.mintingDatetime(tokenId)).div(timeCounter);
            return
                _dailyRewards(isGodBull) *
                timeFromCreation -
                (claimedMeth[tokenId] +
                    originalOrchestrator.claimedMeth(tokenId));
        }
    }

    function initializeGodMintingDate(
        uint256[] memory gods,
        uint256[] memory mintingDates
    ) external onlyOwner {
        uint256 bullsCount = gods.length;
        uint256 mintingDatesCount = mintingDates.length;
        require(bullsCount == mintingDatesCount, "Arrays are incorrect");
        for (uint256 index = 0; index < bullsCount; index++) {
            godsMintingDate[gods[index]] = mintingDates[index];
        }
    }

    function generateTeenBull(bytes memory signature) external nonReentrant {
        require(_verifyGenerateTeenBull(signature), "Signature is invalid");
        bapMeth.pay(600, 300);
        bapTeenBulls.generateTeenBull();
        bapUtilities.burn(1, 1);
    }

    function generateGodBull(
        bytes memory signature,
        uint256 bull1,
        uint256 bull2,
        uint256 bull3,
        uint256 bull4
    ) external nonReentrant {
        require(
            _verifyGenerateGodBull(signature, bull1, bull2, bull3, bull4),
            "Invalid Signature"
        );
        require(
            bapUtilities.balanceOf(msg.sender, 2) > 0,
            "Not enough Merger Orbs"
        );
        bapMeth.pay(4800, 2400);
        bapGenesis.generateGodBull();
        bapTeenBulls.burnTeenBull(bull1);
        bapTeenBulls.burnTeenBull(bull2);
        bapTeenBulls.burnTeenBull(bull3);
        bapTeenBulls.burnTeenBull(bull4);
        bapUtilities.burn(2, 1);
        godsMintingDate[bapGenesis.minted()] = block.timestamp;
    }

    function buyIncubator(
        bytes memory signature,
        uint256 bull1,
        uint256 bull2
    ) external nonReentrant {
        require(
            _verifyBuyIncubator(signature, bull1, bull2),
            "Invalid Signature"
        );
        bapGenesis.breedBulls(bull1, bull2);
        bapMeth.pay(600, 300);
        bapUtilities.purchaseIncubator();
    }

    function buyMergeOrb(bytes memory signature, uint256 teen)
        external
        nonReentrant
    {
        require(
            _verifyBuyMergeOrb(signature, teen),
            "Buy Merge Orb Signature is not valid"
        );
        bapMeth.pay(2400, 1200);
        bapTeenBulls.burnTeenBull(teen);
        bapUtilities.purchaseMergerOrb();
    }

    function setRefundFlag(bool _refundFlag) external onlyOwner {
        refundFlag = _refundFlag;
    }

    function setClaimFlag(bool _claimFlag) external onlyOwner {
        claimFlag = _claimFlag;
    }

    function refund(uint256 tokenId) external nonReentrant {
        require(treasuryWallet != address(0), "200:ZERO_ADDRESS");
        require(
            _refundPeriodAllowed() || refundFlag,
            "The Refund is not allowed"
        );
        require(
            mintingRefunded[tokenId] == false &&
                originalOrchestrator.mintingRefunded(tokenId) == false,
            "The token was already refunded"
        );
        require(
            bapGenesis.breedings(tokenId) == bapGenesis.maxBreedings(),
            "The bull breed"
        );

        require(
            claimedMeth[tokenId] == 0 &&
                originalOrchestrator.claimedMeth(tokenId) == 0,
            "Tokens claimed for this Bull"
        );

        require(
            bapGenesis.notAvailableForRefund(tokenId) == false,
            "The token was transfered at an invalid time"
        );

        bapGenesis.refund(msg.sender, tokenId);
        bapGenesis.safeTransferFrom(msg.sender, treasuryWallet, tokenId);
        mintingRefunded[tokenId] = true;
    }

    function _verifyBuyIncubator(
        bytes memory signature,
        uint256 token1,
        uint256 token2
    ) internal view returns (bool) {
        // Pack the payload
        bytes32 freshHash = keccak256(abi.encode(msg.sender, token1, token2));
        // Get the packed payload hash
        bytes32 candidateHash = keccak256(
            abi.encodePacked("\x19Ethereum Signed Message:\n32", freshHash)
        );

        // Verify if the fresh hash is signed with the provided signature
        return _verifyHashSignature(candidateHash, signature);
    }

    function _verifyBuyMergeOrb(bytes memory signature, uint256 teen)
        internal
        view
        returns (bool)
    {
        // Pack the payload
        bytes32 freshHash = keccak256(abi.encode(msg.sender, teen));
        // Get the packed payload hash
        bytes32 candidateHash = keccak256(
            abi.encodePacked("\x19Ethereum Signed Message:\n32", freshHash)
        );
        // Verify if the fresh hash is signed with the provided signature
        return _verifyHashSignature(candidateHash, signature);
    }

    function _verifyClaimMeth(
        bytes memory signature,
        uint256 bullsCount,
        uint256 godsCount
    ) internal view returns (bool) {
        // Pack the payload
        bytes32 freshHash = keccak256(
            abi.encode(msg.sender, bullsCount, godsCount)
        );
        // Get the packed payload hash
        bytes32 candidateHash = keccak256(
            abi.encodePacked("\x19Ethereum Signed Message:\n32", freshHash)
        );
        // Verify if the fresh hash is signed with the provided signature
        return _verifyHashSignature(candidateHash, signature);
    }

    function _verifyGenerateGodBull(
        bytes memory signature,
        uint256 bull1,
        uint256 bull2,
        uint256 bull3,
        uint256 bull4
    ) internal view returns (bool) {
        // Pack the payload
        bytes32 freshHash = keccak256(
            abi.encode(msg.sender, bull1, bull2, bull3, bull4)
        );
        // Get the packed payload hash
        bytes32 candidateHash = keccak256(
            abi.encodePacked("\x19Ethereum Signed Message:\n32", freshHash)
        );
        // Verify if the fresh hash is signed with the provided signature
        return _verifyHashSignature(candidateHash, signature);
    }

    function _verifyGenerateTeenBull(bytes memory signature)
        internal
        view
        returns (bool)
    {
        // Pack the payload
        bytes32 freshHash = keccak256(abi.encode(msg.sender));
        // Get the packed payload hash
        bytes32 candidateHash = keccak256(
            abi.encodePacked("\x19Ethereum Signed Message:\n32", freshHash)
        );
        // Verify if the fresh hash is signed with the provided signature
        return _verifyHashSignature(candidateHash, signature);
    }

    function _verifyHashSignature(bytes32 hash, bytes memory signature)
        internal
        view
        returns (bool)
    {
        bytes32 r;
        bytes32 s;
        uint8 v;

        if (signature.length != 65) {
            return false;
        }
        assembly {
            r := mload(add(signature, 32))
            s := mload(add(signature, 64))
            v := byte(0, mload(add(signature, 96)))
        }

        if (v < 27) {
            v += 27;
        }

        address signer = address(0);
        if (v == 27 || v == 28) {
            // solium-disable-next-line arg-overflow
            signer = ecrecover(hash, v, r, s);
        }
        return secret == signer;
    }

    function _dailyRewards(bool godBull) internal pure returns (uint256) {
        if (godBull) return 20;
        return 10;
    }

    function _refundPeriodAllowed() internal view returns (bool) {
        return
            block.timestamp >= bapGenesis.genesisTimestamp() + 31 days &&
            block.timestamp <= bapGenesis.genesisTimestamp() + 180 days;
    }

    function _claimRewardsFromToken(uint256 tokenId, bool isGodBull)
        internal
        returns (uint256)
    {
        require(
            bapGenesis.genesisTimestamp() + grazingPeriodTime <=
                block.timestamp ||
                claimFlag,
            "Grazing Period is not Finished"
        );
        require(bapGenesis.tokenExist(tokenId), "Token does exist");
        require(
            bapGenesis.ownerOf(tokenId) == _msgSender(),
            "Sender is not the owner"
        );
        uint256 timeFromCreation = (block.timestamp -
            bapGenesis.mintingDatetime(tokenId)).div(timeCounter);
        if (godBulls[tokenId] == true || tokenId > godBullIndex) {
            if (godsMintingDate[tokenId] == 0) {
                return 0;
            }
            timeFromCreation = (block.timestamp - godsMintingDate[tokenId]).div(
                    timeCounter
                );
        }

        uint256 methAmount = _dailyRewards(isGodBull) *
            timeFromCreation -
            (claimedMeth[tokenId] + originalOrchestrator.claimedMeth(tokenId));
        claimedMeth[tokenId] += methAmount;
        return methAmount;
    }
}

File 2 of 10 : BAPOrchestratorInterfaceV2.sol
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.12;
interface BAPOrchestratorInterfaceV2 {
  function mintingRefunded(uint256) external returns (bool); 
  function claimedMeth(uint256) external view returns (uint256); 
}

File 3 of 10 : BAPTeenBullsInterface.sol
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.12;

interface BAPTeenBullsInterface {
  function generateTeenBull() external;
  function generateMergerOrb() external;
  
  function burnTeenBull(uint) external;
}

File 4 of 10 : BAPUtilitiesInterface.sol
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.12;

interface BAPUtilitiesInterface {
    function purchaseIncubator() external;
    function purchaseMergerOrb() external;
    function balanceOf(address, uint256) external returns(uint256);
    function burn(uint256, uint256) external;
}

File 5 of 10 : BAPMethaneInterface.sol
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.12;

interface BAPMethaneInterface {
  function name() external view returns (string memory);
  function maxSupply() external view returns (uint256);
  function claims(address) external view returns (uint256);
  function claim(address, uint256) external;
  function pay(uint256,uint256) external;
  function treasuryWallet() external view returns (address);
}

File 6 of 10 : BAPGenesisInterface.sol
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.12;
interface BAPGenesisInterface {
  function mintingDatetime(uint256) external view returns (uint256);
  function tokenExist(uint256) external view returns (bool);
  function ownerOf(uint256) external view returns (address);
  function dailyRewards(bool) external view returns (uint256);
  function initialMintingTimestamp() external view returns (uint256);
  function originalMintingPrice(uint256) external view returns (uint256);
  function breedings(uint256) external view returns (uint256);
  function maxBreedings() external view returns (uint256);
  function breedBulls(uint256,uint256) external;
  function _orchestrator() external view returns (address);
  function approve(address, uint256) external;
  function refund(address, uint256) external payable;
  function safeTransferFrom(address,address,uint256) external;
  function refundPeriodAllowed(uint256) external view returns(bool);
  function notAvailableForRefund(uint256) external returns(bool);
  function generateGodBull() external;
  function genesisTimestamp() external view returns(uint256);
  function setGrazingPeriodTime(uint256) external;
  function setTimeCounter(uint256) external; 
  function secret() external view returns(address);
  function minted() external view returns(uint256);
}

File 7 of 10 : SafeMath.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (utils/math/SafeMath.sol)

pragma solidity ^0.8.0;

// CAUTION
// This version of SafeMath should only be used with Solidity 0.8 or later,
// because it relies on the compiler's built in overflow checks.

/**
 * @dev Wrappers over Solidity's arithmetic operations.
 *
 * NOTE: `SafeMath` is generally not needed starting with Solidity 0.8, since the compiler
 * now has built in overflow checking.
 */
library SafeMath {
    /**
     * @dev Returns the addition of two unsigned integers, with an overflow flag.
     *
     * _Available since v3.4._
     */
    function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            uint256 c = a + b;
            if (c < a) return (false, 0);
            return (true, c);
        }
    }

    /**
     * @dev Returns the substraction of two unsigned integers, with an overflow flag.
     *
     * _Available since v3.4._
     */
    function trySub(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            if (b > a) return (false, 0);
            return (true, a - b);
        }
    }

    /**
     * @dev Returns the multiplication of two unsigned integers, with an overflow flag.
     *
     * _Available since v3.4._
     */
    function tryMul(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            // Gas optimization: this is cheaper than requiring 'a' not being zero, but the
            // benefit is lost if 'b' is also tested.
            // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522
            if (a == 0) return (true, 0);
            uint256 c = a * b;
            if (c / a != b) return (false, 0);
            return (true, c);
        }
    }

    /**
     * @dev Returns the division of two unsigned integers, with a division by zero flag.
     *
     * _Available since v3.4._
     */
    function tryDiv(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            if (b == 0) return (false, 0);
            return (true, a / b);
        }
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers, with a division by zero flag.
     *
     * _Available since v3.4._
     */
    function tryMod(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            if (b == 0) return (false, 0);
            return (true, a % b);
        }
    }

    /**
     * @dev Returns the addition of two unsigned integers, reverting on
     * overflow.
     *
     * Counterpart to Solidity's `+` operator.
     *
     * Requirements:
     *
     * - Addition cannot overflow.
     */
    function add(uint256 a, uint256 b) internal pure returns (uint256) {
        return a + b;
    }

    /**
     * @dev Returns the subtraction of two unsigned integers, reverting on
     * overflow (when the result is negative).
     *
     * Counterpart to Solidity's `-` operator.
     *
     * Requirements:
     *
     * - Subtraction cannot overflow.
     */
    function sub(uint256 a, uint256 b) internal pure returns (uint256) {
        return a - b;
    }

    /**
     * @dev Returns the multiplication of two unsigned integers, reverting on
     * overflow.
     *
     * Counterpart to Solidity's `*` operator.
     *
     * Requirements:
     *
     * - Multiplication cannot overflow.
     */
    function mul(uint256 a, uint256 b) internal pure returns (uint256) {
        return a * b;
    }

    /**
     * @dev Returns the integer division of two unsigned integers, reverting on
     * division by zero. The result is rounded towards zero.
     *
     * Counterpart to Solidity's `/` operator.
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function div(uint256 a, uint256 b) internal pure returns (uint256) {
        return a / b;
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
     * reverting when dividing by zero.
     *
     * Counterpart to Solidity's `%` operator. This function uses a `revert`
     * opcode (which leaves remaining gas untouched) while Solidity uses an
     * invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function mod(uint256 a, uint256 b) internal pure returns (uint256) {
        return a % b;
    }

    /**
     * @dev Returns the subtraction of two unsigned integers, reverting with custom message on
     * overflow (when the result is negative).
     *
     * CAUTION: This function is deprecated because it requires allocating memory for the error
     * message unnecessarily. For custom revert reasons use {trySub}.
     *
     * Counterpart to Solidity's `-` operator.
     *
     * Requirements:
     *
     * - Subtraction cannot overflow.
     */
    function sub(
        uint256 a,
        uint256 b,
        string memory errorMessage
    ) internal pure returns (uint256) {
        unchecked {
            require(b <= a, errorMessage);
            return a - b;
        }
    }

    /**
     * @dev Returns the integer division of two unsigned integers, reverting with custom message on
     * division by zero. The result is rounded towards zero.
     *
     * Counterpart to Solidity's `/` operator. Note: this function uses a
     * `revert` opcode (which leaves remaining gas untouched) while Solidity
     * uses an invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function div(
        uint256 a,
        uint256 b,
        string memory errorMessage
    ) internal pure returns (uint256) {
        unchecked {
            require(b > 0, errorMessage);
            return a / b;
        }
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
     * reverting with custom message when dividing by zero.
     *
     * CAUTION: This function is deprecated because it requires allocating memory for the error
     * message unnecessarily. For custom revert reasons use {tryMod}.
     *
     * Counterpart to Solidity's `%` operator. This function uses a `revert`
     * opcode (which leaves remaining gas untouched) while Solidity uses an
     * invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function mod(
        uint256 a,
        uint256 b,
        string memory errorMessage
    ) internal pure returns (uint256) {
        unchecked {
            require(b > 0, errorMessage);
            return a % b;
        }
    }
}

File 8 of 10 : 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 9 of 10 : 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);
    }
}

File 10 of 10 : 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;
    }
}

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

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"address","name":"_bapGenesis","type":"address"},{"internalType":"address","name":"_bapMethane","type":"address"},{"internalType":"address","name":"_originalOrchestrator","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"inputs":[],"name":"bapGenesisAddr","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"bapMethAddr","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"bapTeenBullsAddr","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"bapUtilitiesAddr","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes","name":"signature","type":"bytes"},{"internalType":"uint256","name":"bull1","type":"uint256"},{"internalType":"uint256","name":"bull2","type":"uint256"}],"name":"buyIncubator","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes","name":"signature","type":"bytes"},{"internalType":"uint256","name":"teen","type":"uint256"}],"name":"buyMergeOrb","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes","name":"signature","type":"bytes"},{"internalType":"uint256[]","name":"bulls","type":"uint256[]"},{"internalType":"uint256[]","name":"gods","type":"uint256[]"}],"name":"claimMeth","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"claimedMeth","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes","name":"signature","type":"bytes"},{"internalType":"uint256","name":"bull1","type":"uint256"},{"internalType":"uint256","name":"bull2","type":"uint256"},{"internalType":"uint256","name":"bull3","type":"uint256"},{"internalType":"uint256","name":"bull4","type":"uint256"}],"name":"generateGodBull","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes","name":"signature","type":"bytes"}],"name":"generateTeenBull","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bool","name":"isGodBull","type":"bool"}],"name":"getClaimableMeth","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"godBulls","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"godsMintingDate","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"grazingPeriodTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"gods","type":"uint256[]"},{"internalType":"bool","name":"godBullFlag","type":"bool"}],"name":"initializeGodBulls","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"gods","type":"uint256[]"},{"internalType":"uint256[]","name":"mintingDates","type":"uint256[]"}],"name":"initializeGodMintingDate","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"mintingRefunded","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"originalOrchestratorAddr","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"project","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"refund","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"secret","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bool","name":"_claimFlag","type":"bool"}],"name":"setClaimFlag","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_newAddress","type":"address"}],"name":"setGenesisContract","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_grazingPeriod","type":"uint256"}],"name":"setGrazingPeriodTime","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_newAddress","type":"address"}],"name":"setMethaneContract","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_refundFlag","type":"bool"}],"name":"setRefundFlag","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_newAddress","type":"address"}],"name":"setTeenBullsContract","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_timeCounter","type":"uint256"}],"name":"setTimeCounter","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_newTreasuryWallet","type":"address"}],"name":"setTreasuryWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_newAddress","type":"address"}],"name":"setUtilitiesContract","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_secret","type":"address"}],"name":"setWhitelistedAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"timeCounter","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"treasuryWallet","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"}]

608060405262015180600f556228de806010556000601560006101000a81548160ff0219169083151502179055506000601560016101000a81548160ff02191690831515021790555061271a6016553480156200005b57600080fd5b5060405162005d5b38038062005d5b83398181016040528101906200008191906200060b565b6001600081905550620000a96200009d6200042360201b60201c565b6200042b60201b60201c565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156200011c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200011390620006c8565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156200018f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200018690620006c8565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141562000202576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620001f990620006c8565b60405180910390fd5b6040518060400160405280601481526020017f42756c6c73202620417065732050726f6a656374000000000000000000000000815250600290805190602001906200024f929190620004f1565b5082600360006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555081600460006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555080600760006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600960006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555080600d60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505050506200074f565b600033905090565b6000600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b828054620004ff9062000719565b90600052602060002090601f0160209004810192826200052357600085556200056f565b82601f106200053e57805160ff19168380011785556200056f565b828001600101855582156200056f579182015b828111156200056e57825182559160200191906001019062000551565b5b5090506200057e919062000582565b5090565b5b808211156200059d57600081600090555060010162000583565b5090565b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000620005d382620005a6565b9050919050565b620005e581620005c6565b8114620005f157600080fd5b50565b6000815190506200060581620005da565b92915050565b600080600060608486031215620006275762000626620005a1565b5b60006200063786828701620005f4565b93505060206200064a86828701620005f4565b92505060406200065d86828701620005f4565b9150509250925092565b600082825260208201905092915050565b7f3230303a5a45524f5f4144445245535300000000000000000000000000000000600082015250565b6000620006b060108362000667565b9150620006bd8262000678565b602082019050919050565b60006020820190508181036000830152620006e381620006a1565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806200073257607f821691505b60208210811415620007495762000748620006ea565b5b50919050565b6155fc806200075f6000396000f3fe608060405234801561001057600080fd5b506004361061021c5760003560e01c80638a1e7e0e11610125578063cc302e78116100ad578063ed4043b01161007c578063ed4043b0146105d7578063f096b0ff14610607578063f2fde38b14610623578063f3713c291461063f578063f60ca60d1461065b5761021c565b8063cc302e7814610563578063cde461391461057f578063d1efd30d1461059d578063da080a33146105bb5761021c565b8063995f7eb9116100f4578063995f7eb9146104c3578063a8602fea146104df578063ac75bf65146104fb578063b06bd0ab14610517578063c37ab646146105335761021c565b80638a1e7e0e1461044f5780638da5cb5b1461046b578063943d41f31461048957806397f3956e146104a75761021c565b8063592e9d79116101a85780636f246c66116101775780636f246c66146103d3578063715018a6146103f157806371faf935146103fb5780637c0e24b41461041757806388909b87146104335761021c565b8063592e9d791461034b5780635a94f3fa1461036757806361ebc06e146103975780636bba294d146103b55761021c565b806332560c77116101ef57806332560c771461029357806339cf94c1146102c35780634626402b146102f357806348e7099d146103115780634e933cac1461032f5761021c565b806304e50b3b146102215780631c8c3f601461023d578063278ecde11461025957806328a259a414610275575b600080fd5b61023b60048036038101906102369190613f94565b610679565b005b61025760048036038101906102529190614099565b6109cc565b005b610273600480360381019061026e91906140c6565b610b5f565b005b61027d611278565b60405161028a9190614102565b60405180910390f35b6102ad60048036038101906102a891906140c6565b61127e565b6040516102ba9190614102565b60405180910390f35b6102dd60048036038101906102d89190614155565b611296565b6040516102ea9190614102565b60405180910390f35b6102fb61165a565b60405161030891906141a4565b60405180910390f35b610319611680565b60405161032691906141a4565b60405180910390f35b610349600480360381019061034491906141bf565b6116a6565b005b610365600480360381019061036091906140c6565b6118ef565b005b610381600480360381019061037c91906140c6565b611975565b60405161038e919061423d565b60405180910390f35b61039f611995565b6040516103ac91906141a4565b60405180910390f35b6103bd6119bb565b6040516103ca9190614102565b60405180910390f35b6103db6119c1565b6040516103e891906141a4565b60405180910390f35b6103f96119e7565b005b61041560048036038101906104109190614099565b611a6f565b005b610431600480360381019061042c9190614258565b611c02565b005b61044d60048036038101906104489190614099565b611e47565b005b61046960048036038101906104649190614099565b611fda565b005b61047361216d565b60405161048091906141a4565b60405180910390f35b610491612197565b60405161049e91906141a4565b60405180910390f35b6104c160048036038101906104bc91906142b4565b6121bd565b005b6104dd60048036038101906104d891906142fd565b612403565b005b6104f960048036038101906104f49190614099565b61249c565b005b610515600480360381019061051091906140c6565b6125cc565b005b610531600480360381019061052c919061432a565b612652565b005b61054d600480360381019061054891906140c6565b61273d565b60405161055a919061423d565b60405180910390f35b61057d60048036038101906105789190614386565b61275d565b005b610587612898565b60405161059491906141a4565b60405180910390f35b6105a56128be565b6040516105b291906141a4565b60405180910390f35b6105d560048036038101906105d091906143fe565b6128e4565b005b6105f160048036038101906105ec91906140c6565b612ef1565b6040516105fe9190614102565b60405180910390f35b610621600480360381019061061c9190614099565b612f09565b005b61063d60048036038101906106389190614099565b613039565b005b610659600480360381019061065491906142fd565b613131565b005b6106636131ca565b604051610670919061451d565b60405180910390f35b600260005414156106bf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016106b69061458b565b60405180910390fd5b60026000819055506000825190506000825190506106de858383613258565b61071d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610714906145f7565b60405180910390fd5b6000805b828110156107e357600115156014600087848151811061074457610743614617565b5b6020026020010151815260200190815260200160002060009054906101000a900460ff1615151480610791575060165485828151811061078757610786614617565b5b6020026020010151115b6107d0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107c790614692565b60405180910390fd5b80806107db906146e1565b915050610721565b5060005b8381101561088357600015156014600088848151811061080a57610809614617565b5b6020026020010151815260200190815260200160002060009054906101000a900460ff16151514610870576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161086790614776565b60405180910390fd5b808061087b906146e1565b9150506107e7565b5060005b838110156108d4576108b48682815181106108a5576108a4614617565b5b602002602001015160006132c8565b826108bf9190614796565b915080806108cc906146e1565b915050610887565b5060005b82811015610925576109058582815181106108f6576108f5614617565b5b602002602001015160016132c8565b826109109190614796565b9150808061091d906146e1565b9150506108d8565b50600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663aad3ec9661096c613812565b836040518363ffffffff1660e01b815260040161098a9291906147ec565b600060405180830381600087803b1580156109a457600080fd5b505af11580156109b8573d6000803e3d6000fd5b505050505050506001600081905550505050565b6109d4613812565b73ffffffffffffffffffffffffffffffffffffffff166109f261216d565b73ffffffffffffffffffffffffffffffffffffffff1614610a48576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a3f90614861565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415610ab8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610aaf906148cd565b60405180910390fd5b80600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600c60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b60026000541415610ba5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b9c9061458b565b60405180910390fd5b6002600081905550600073ffffffffffffffffffffffffffffffffffffffff16600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415610c3f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c36906148cd565b60405180910390fd5b610c4761381a565b80610c5e5750601560009054906101000a900460ff165b610c9d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c9490614939565b60405180910390fd5b600015156012600083815260200190815260200160002060009054906101000a900460ff161515148015610d72575060001515600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16635a94f3fa836040518263ffffffff1660e01b8152600401610d2b9190614102565b6020604051808303816000875af1158015610d4a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d6e919061496e565b1515145b610db1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610da8906149e7565b60405180910390fd5b600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a8fb7bb16040518163ffffffff1660e01b8152600401602060405180830381865afa158015610e1e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e429190614a1c565b600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16631cf777ec836040518263ffffffff1660e01b8152600401610e9d9190614102565b602060405180830381865afa158015610eba573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ede9190614a1c565b14610f1e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f1590614a95565b60405180910390fd5b60006011600083815260200190815260200160002054148015610fdc57506000600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663ed4043b0836040518263ffffffff1660e01b8152600401610f999190614102565b602060405180830381865afa158015610fb6573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610fda9190614a1c565b145b61101b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161101290614b01565b60405180910390fd5b60001515600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663b5f222ee836040518263ffffffff1660e01b815260040161107a9190614102565b6020604051808303816000875af1158015611099573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110bd919061496e565b1515146110ff576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110f690614b93565b60405180910390fd5b600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663410085df33836040518363ffffffff1660e01b815260040161115c9291906147ec565b600060405180830381600087803b15801561117657600080fd5b505af115801561118a573d6000803e3d6000fd5b50505050600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166342842e0e33600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16846040518463ffffffff1660e01b815260040161120f93929190614bb3565b600060405180830381600087803b15801561122957600080fd5b505af115801561123d573d6000803e3d6000fd5b5050505060016012600083815260200190815260200160002060006101000a81548160ff021916908315150217905550600160008190555050565b60105481565b60136020528060005260406000206000915090505481565b6000600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663cc0c5236846040518263ffffffff1660e01b81526004016112f39190614102565b602060405180830381865afa158015611310573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611334919061496e565b611373576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161136a90614c36565b60405180910390fd5b6016548311156114b9576000601360008581526020019081526020016000205414156113a25760009050611654565b60006113d7600f546013600087815260200190815260200160002054426113c99190614c56565b61396d90919063ffffffff16565b9050600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663ed4043b0856040518263ffffffff1660e01b81526004016114349190614102565b602060405180830381865afa158015611451573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114759190614a1c565b60116000868152602001908152602001600020546114939190614796565b8161149d85613983565b6114a79190614c8a565b6114b19190614c56565b915050611654565b6000611576600f54600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663757f08dc876040518263ffffffff1660e01b815260040161151c9190614102565b602060405180830381865afa158015611539573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061155d9190614a1c565b426115689190614c56565b61396d90919063ffffffff16565b9050600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663ed4043b0856040518263ffffffff1660e01b81526004016115d39190614102565b602060405180830381865afa1580156115f0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116149190614a1c565b60116000868152602001908152602001600020546116329190614796565b8161163c85613983565b6116469190614c8a565b6116509190614c56565b9150505b92915050565b600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600260005414156116ec576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116e39061458b565b60405180910390fd5b60026000819055506116ff83838361399e565b61173e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611735906145f7565b60405180910390fd5b600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a5c6834d83836040518363ffffffff1660e01b815260040161179b929190614ce4565b600060405180830381600087803b1580156117b557600080fd5b505af11580156117c9573d6000803e3d6000fd5b50505050600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663ef48eee661025861012c6040518363ffffffff1660e01b815260040161182e929190614d8d565b600060405180830381600087803b15801561184857600080fd5b505af115801561185c573d6000803e3d6000fd5b50505050600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663677f398d6040518163ffffffff1660e01b8152600401600060405180830381600087803b1580156118ca57600080fd5b505af11580156118de573d6000803e3d6000fd5b505050506001600081905550505050565b6118f7613812565b73ffffffffffffffffffffffffffffffffffffffff1661191561216d565b73ffffffffffffffffffffffffffffffffffffffff161461196b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161196290614861565b60405180910390fd5b80600f8190555050565b60126020528060005260406000206000915054906101000a900460ff1681565b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600f5481565b600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6119ef613812565b73ffffffffffffffffffffffffffffffffffffffff16611a0d61216d565b73ffffffffffffffffffffffffffffffffffffffff1614611a63576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a5a90614861565b60405180910390fd5b611a6d6000613a0e565b565b611a77613812565b73ffffffffffffffffffffffffffffffffffffffff16611a9561216d565b73ffffffffffffffffffffffffffffffffffffffff1614611aeb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ae290614861565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611b5b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b52906148cd565b60405180910390fd5b80600360006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600960006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b60026000541415611c48576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c3f9061458b565b60405180910390fd5b6002600081905550611c5a8282613ad4565b611c99576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c9090614e28565b60405180910390fd5b600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663ef48eee66109606104b06040518363ffffffff1660e01b8152600401611cfa929190614ebe565b600060405180830381600087803b158015611d1457600080fd5b505af1158015611d28573d6000803e3d6000fd5b50505050600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663299f5373826040518263ffffffff1660e01b8152600401611d879190614102565b600060405180830381600087803b158015611da157600080fd5b505af1158015611db5573d6000803e3d6000fd5b50505050600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16638c93b2996040518163ffffffff1660e01b8152600401600060405180830381600087803b158015611e2357600080fd5b505af1158015611e37573d6000803e3d6000fd5b5050505060016000819055505050565b611e4f613812565b73ffffffffffffffffffffffffffffffffffffffff16611e6d61216d565b73ffffffffffffffffffffffffffffffffffffffff1614611ec3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611eba90614861565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611f33576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f2a906148cd565b60405180910390fd5b80600460006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b611fe2613812565b73ffffffffffffffffffffffffffffffffffffffff1661200061216d565b73ffffffffffffffffffffffffffffffffffffffff1614612056576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161204d90614861565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156120c6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120bd906148cd565b60405180910390fd5b80600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600b60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6000600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60026000541415612203576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121fa9061458b565b60405180910390fd5b600260008190555061221481613b41565b612253576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161224a90614f33565b60405180910390fd5b600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663ef48eee661025861012c6040518363ffffffff1660e01b81526004016122b4929190614d8d565b600060405180830381600087803b1580156122ce57600080fd5b505af11580156122e2573d6000803e3d6000fd5b50505050600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663c5577ff76040518163ffffffff1660e01b8152600401600060405180830381600087803b15801561235057600080fd5b505af1158015612364573d6000803e3d6000fd5b50505050600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663b390c0ab6001806040518363ffffffff1660e01b81526004016123c6929190614f8e565b600060405180830381600087803b1580156123e057600080fd5b505af11580156123f4573d6000803e3d6000fd5b50505050600160008190555050565b61240b613812565b73ffffffffffffffffffffffffffffffffffffffff1661242961216d565b73ffffffffffffffffffffffffffffffffffffffff161461247f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161247690614861565b60405180910390fd5b80601560016101000a81548160ff02191690831515021790555050565b6124a4613812565b73ffffffffffffffffffffffffffffffffffffffff166124c261216d565b73ffffffffffffffffffffffffffffffffffffffff1614612518576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161250f90614861565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415612588576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161257f906148cd565b60405180910390fd5b80600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6125d4613812565b73ffffffffffffffffffffffffffffffffffffffff166125f261216d565b73ffffffffffffffffffffffffffffffffffffffff1614612648576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161263f90614861565b60405180910390fd5b8060108190555050565b61265a613812565b73ffffffffffffffffffffffffffffffffffffffff1661267861216d565b73ffffffffffffffffffffffffffffffffffffffff16146126ce576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126c590614861565b60405180910390fd5b60008251905060005b818110156127375782601460008684815181106126f7576126f6614617565b5b6020026020010151815260200190815260200160002060006101000a81548160ff021916908315150217905550808061272f906146e1565b9150506126d7565b50505050565b60146020528060005260406000206000915054906101000a900460ff1681565b612765613812565b73ffffffffffffffffffffffffffffffffffffffff1661278361216d565b73ffffffffffffffffffffffffffffffffffffffff16146127d9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127d090614861565b60405180910390fd5b600082519050600082519050808214612827576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161281e90615003565b60405180910390fd5b60005b828110156128915783818151811061284557612844614617565b5b60200260200101516013600087848151811061286457612863614617565b5b60200260200101518152602001908152602001600020819055508080612889906146e1565b91505061282a565b5050505050565b600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6002600054141561292a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016129219061458b565b60405180910390fd5b600260008190555061293f8585858585613bab565b61297e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612975906145f7565b60405180910390fd5b6000600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1662fdd58e3360026040518363ffffffff1660e01b81526004016129dd92919061505e565b6020604051808303816000875af11580156129fc573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612a209190614a1c565b11612a60576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a57906150d3565b60405180910390fd5b600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663ef48eee66112c06109606040518363ffffffff1660e01b8152600401612ac192919061512e565b600060405180830381600087803b158015612adb57600080fd5b505af1158015612aef573d6000803e3d6000fd5b50505050600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663fcf088536040518163ffffffff1660e01b8152600401600060405180830381600087803b158015612b5d57600080fd5b505af1158015612b71573d6000803e3d6000fd5b50505050600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663299f5373856040518263ffffffff1660e01b8152600401612bd09190614102565b600060405180830381600087803b158015612bea57600080fd5b505af1158015612bfe573d6000803e3d6000fd5b50505050600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663299f5373846040518263ffffffff1660e01b8152600401612c5d9190614102565b600060405180830381600087803b158015612c7757600080fd5b505af1158015612c8b573d6000803e3d6000fd5b50505050600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663299f5373836040518263ffffffff1660e01b8152600401612cea9190614102565b600060405180830381600087803b158015612d0457600080fd5b505af1158015612d18573d6000803e3d6000fd5b50505050600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663299f5373826040518263ffffffff1660e01b8152600401612d779190614102565b600060405180830381600087803b158015612d9157600080fd5b505af1158015612da5573d6000803e3d6000fd5b50505050600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663b390c0ab600260016040518363ffffffff1660e01b8152600401612e08929190615157565b600060405180830381600087803b158015612e2257600080fd5b505af1158015612e36573d6000803e3d6000fd5b505050504260136000600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16634f02c4206040518163ffffffff1660e01b8152600401602060405180830381865afa158015612eac573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612ed09190614a1c565b81526020019081526020016000208190555060016000819055505050505050565b60116020528060005260406000206000915090505481565b612f11613812565b73ffffffffffffffffffffffffffffffffffffffff16612f2f61216d565b73ffffffffffffffffffffffffffffffffffffffff1614612f85576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612f7c90614861565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415612ff5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612fec906148cd565b60405180910390fd5b80600e60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b613041613812565b73ffffffffffffffffffffffffffffffffffffffff1661305f61216d565b73ffffffffffffffffffffffffffffffffffffffff16146130b5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016130ac90614861565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415613125576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161311c906151f2565b60405180910390fd5b61312e81613a0e565b50565b613139613812565b73ffffffffffffffffffffffffffffffffffffffff1661315761216d565b73ffffffffffffffffffffffffffffffffffffffff16146131ad576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016131a490614861565b60405180910390fd5b80601560006101000a81548160ff02191690831515021790555050565b600280546131d790615241565b80601f016020809104026020016040519081016040528092919081815260200182805461320390615241565b80156132505780601f1061322557610100808354040283529160200191613250565b820191906000526020600020905b81548152906001019060200180831161323357829003601f168201915b505050505081565b60008033848460405160200161327093929190615273565b60405160208183030381529060405280519060200120905060008160405160200161329b919061532c565b6040516020818303038152906040528051906020012090506132bd8187613c21565b925050509392505050565b600042601054600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663cacf66ab6040518163ffffffff1660e01b8152600401602060405180830381865afa15801561333b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061335f9190614a1c565b6133699190614796565b1115806133825750601560019054906101000a900460ff165b6133c1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016133b89061539e565b60405180910390fd5b600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663cc0c5236846040518263ffffffff1660e01b815260040161341c9190614102565b602060405180830381865afa158015613439573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061345d919061496e565b61349c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161349390614c36565b60405180910390fd5b6134a4613812565b73ffffffffffffffffffffffffffffffffffffffff16600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16636352211e856040518263ffffffff1660e01b81526004016135159190614102565b602060405180830381865afa158015613532573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061355691906153d3565b73ffffffffffffffffffffffffffffffffffffffff16146135ac576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016135a39061544c565b60405180910390fd5b6000613669600f54600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663757f08dc876040518263ffffffff1660e01b815260040161360f9190614102565b602060405180830381865afa15801561362c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906136509190614a1c565b4261365b9190614c56565b61396d90919063ffffffff16565b9050600115156014600086815260200190815260200160002060009054906101000a900460ff161515148061369f575060165484115b15613700576000601360008681526020019081526020016000205414156136ca57600091505061380c565b6136fd600f546013600087815260200190815260200160002054426136ef9190614c56565b61396d90919063ffffffff16565b90505b6000600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663ed4043b0866040518263ffffffff1660e01b815260040161375d9190614102565b602060405180830381865afa15801561377a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061379e9190614a1c565b60116000878152602001908152602001600020546137bc9190614796565b826137c686613983565b6137d09190614c8a565b6137da9190614c56565b9050806011600087815260200190815260200160002060008282546137ff9190614796565b9250508190555080925050505b92915050565b600033905090565b60006228de80600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663cacf66ab6040518163ffffffff1660e01b8152600401602060405180830381865afa15801561388d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906138b19190614a1c565b6138bb9190614796565b4210158015613968575062ed4e00600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663cacf66ab6040518163ffffffff1660e01b8152600401602060405180830381865afa158015613936573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061395a9190614a1c565b6139649190614796565b4211155b905090565b6000818361397b919061549b565b905092915050565b600081156139945760149050613999565b600a90505b919050565b6000803384846040516020016139b693929190615273565b6040516020818303038152906040528051906020012090506000816040516020016139e1919061532c565b604051602081830303815290604052805190602001209050613a038187613c21565b925050509392505050565b6000600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6000803383604051602001613aea9291906147ec565b604051602081830303815290604052805190602001209050600081604051602001613b15919061532c565b604051602081830303815290604052805190602001209050613b378186613c21565b9250505092915050565b60008033604051602001613b5591906141a4565b604051602081830303815290604052805190602001209050600081604051602001613b80919061532c565b604051602081830303815290604052805190602001209050613ba28185613c21565b92505050919050565b6000803386868686604051602001613bc79594939291906154cc565b604051602081830303815290604052805190602001209050600081604051602001613bf2919061532c565b604051602081830303815290604052805190602001209050613c148189613c21565b9250505095945050505050565b6000806000806041855114613c3c5760009350505050613d36565b6020850151925060408501519150606085015160001a9050601b8160ff161015613c7057601b81613c6d919061552c565b90505b6000601b8260ff161480613c875750601c8260ff16145b15613cde5760018783868660405160008152602001604052604051613caf9493929190615581565b6020604051602081039080840390855afa158015613cd1573d6000803e3d6000fd5b5050506020604051035190505b8073ffffffffffffffffffffffffffffffffffffffff16600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16149450505050505b92915050565b6000604051905090565b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b613da382613d5a565b810181811067ffffffffffffffff82111715613dc257613dc1613d6b565b5b80604052505050565b6000613dd5613d3c565b9050613de18282613d9a565b919050565b600067ffffffffffffffff821115613e0157613e00613d6b565b5b613e0a82613d5a565b9050602081019050919050565b82818337600083830152505050565b6000613e39613e3484613de6565b613dcb565b905082815260208101848484011115613e5557613e54613d55565b5b613e60848285613e17565b509392505050565b600082601f830112613e7d57613e7c613d50565b5b8135613e8d848260208601613e26565b91505092915050565b600067ffffffffffffffff821115613eb157613eb0613d6b565b5b602082029050602081019050919050565b600080fd5b6000819050919050565b613eda81613ec7565b8114613ee557600080fd5b50565b600081359050613ef781613ed1565b92915050565b6000613f10613f0b84613e96565b613dcb565b90508083825260208201905060208402830185811115613f3357613f32613ec2565b5b835b81811015613f5c5780613f488882613ee8565b845260208401935050602081019050613f35565b5050509392505050565b600082601f830112613f7b57613f7a613d50565b5b8135613f8b848260208601613efd565b91505092915050565b600080600060608486031215613fad57613fac613d46565b5b600084013567ffffffffffffffff811115613fcb57613fca613d4b565b5b613fd786828701613e68565b935050602084013567ffffffffffffffff811115613ff857613ff7613d4b565b5b61400486828701613f66565b925050604084013567ffffffffffffffff81111561402557614024613d4b565b5b61403186828701613f66565b9150509250925092565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006140668261403b565b9050919050565b6140768161405b565b811461408157600080fd5b50565b6000813590506140938161406d565b92915050565b6000602082840312156140af576140ae613d46565b5b60006140bd84828501614084565b91505092915050565b6000602082840312156140dc576140db613d46565b5b60006140ea84828501613ee8565b91505092915050565b6140fc81613ec7565b82525050565b600060208201905061411760008301846140f3565b92915050565b60008115159050919050565b6141328161411d565b811461413d57600080fd5b50565b60008135905061414f81614129565b92915050565b6000806040838503121561416c5761416b613d46565b5b600061417a85828601613ee8565b925050602061418b85828601614140565b9150509250929050565b61419e8161405b565b82525050565b60006020820190506141b96000830184614195565b92915050565b6000806000606084860312156141d8576141d7613d46565b5b600084013567ffffffffffffffff8111156141f6576141f5613d4b565b5b61420286828701613e68565b935050602061421386828701613ee8565b925050604061422486828701613ee8565b9150509250925092565b6142378161411d565b82525050565b6000602082019050614252600083018461422e565b92915050565b6000806040838503121561426f5761426e613d46565b5b600083013567ffffffffffffffff81111561428d5761428c613d4b565b5b61429985828601613e68565b92505060206142aa85828601613ee8565b9150509250929050565b6000602082840312156142ca576142c9613d46565b5b600082013567ffffffffffffffff8111156142e8576142e7613d4b565b5b6142f484828501613e68565b91505092915050565b60006020828403121561431357614312613d46565b5b600061432184828501614140565b91505092915050565b6000806040838503121561434157614340613d46565b5b600083013567ffffffffffffffff81111561435f5761435e613d4b565b5b61436b85828601613f66565b925050602061437c85828601614140565b9150509250929050565b6000806040838503121561439d5761439c613d46565b5b600083013567ffffffffffffffff8111156143bb576143ba613d4b565b5b6143c785828601613f66565b925050602083013567ffffffffffffffff8111156143e8576143e7613d4b565b5b6143f485828601613f66565b9150509250929050565b600080600080600060a0868803121561441a57614419613d46565b5b600086013567ffffffffffffffff81111561443857614437613d4b565b5b61444488828901613e68565b955050602061445588828901613ee8565b945050604061446688828901613ee8565b935050606061447788828901613ee8565b925050608061448888828901613ee8565b9150509295509295909350565b600081519050919050565b600082825260208201905092915050565b60005b838110156144cf5780820151818401526020810190506144b4565b838111156144de576000848401525b50505050565b60006144ef82614495565b6144f981856144a0565b93506145098185602086016144b1565b61451281613d5a565b840191505092915050565b6000602082019050818103600083015261453781846144e4565b905092915050565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b6000614575601f836144a0565b91506145808261453f565b602082019050919050565b600060208201905081810360008301526145a481614568565b9050919050565b7f496e76616c6964205369676e6174757265000000000000000000000000000000600082015250565b60006145e16011836144a0565b91506145ec826145ab565b602082019050919050565b60006020820190508181036000830152614610816145d4565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e6f74206120476f642042756c6c000000000000000000000000000000000000600082015250565b600061467c600e836144a0565b915061468782614646565b602082019050919050565b600060208201905081810360008301526146ab8161466f565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006146ec82613ec7565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82141561471f5761471e6146b2565b5b600182019050919050565b7f4e6f742061204f472042756c6c00000000000000000000000000000000000000600082015250565b6000614760600d836144a0565b915061476b8261472a565b602082019050919050565b6000602082019050818103600083015261478f81614753565b9050919050565b60006147a182613ec7565b91506147ac83613ec7565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156147e1576147e06146b2565b5b828201905092915050565b60006040820190506148016000830185614195565b61480e60208301846140f3565b9392505050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b600061484b6020836144a0565b915061485682614815565b602082019050919050565b6000602082019050818103600083015261487a8161483e565b9050919050565b7f3230303a5a45524f5f4144445245535300000000000000000000000000000000600082015250565b60006148b76010836144a0565b91506148c282614881565b602082019050919050565b600060208201905081810360008301526148e6816148aa565b9050919050565b7f54686520526566756e64206973206e6f7420616c6c6f77656400000000000000600082015250565b60006149236019836144a0565b915061492e826148ed565b602082019050919050565b6000602082019050818103600083015261495281614916565b9050919050565b60008151905061496881614129565b92915050565b60006020828403121561498457614983613d46565b5b600061499284828501614959565b91505092915050565b7f54686520746f6b656e2077617320616c726561647920726566756e6465640000600082015250565b60006149d1601e836144a0565b91506149dc8261499b565b602082019050919050565b60006020820190508181036000830152614a00816149c4565b9050919050565b600081519050614a1681613ed1565b92915050565b600060208284031215614a3257614a31613d46565b5b6000614a4084828501614a07565b91505092915050565b7f5468652062756c6c206272656564000000000000000000000000000000000000600082015250565b6000614a7f600e836144a0565b9150614a8a82614a49565b602082019050919050565b60006020820190508181036000830152614aae81614a72565b9050919050565b7f546f6b656e7320636c61696d656420666f7220746869732042756c6c00000000600082015250565b6000614aeb601c836144a0565b9150614af682614ab5565b602082019050919050565b60006020820190508181036000830152614b1a81614ade565b9050919050565b7f54686520746f6b656e20776173207472616e73666572656420617420616e206960008201527f6e76616c69642074696d65000000000000000000000000000000000000000000602082015250565b6000614b7d602b836144a0565b9150614b8882614b21565b604082019050919050565b60006020820190508181036000830152614bac81614b70565b9050919050565b6000606082019050614bc86000830186614195565b614bd56020830185614195565b614be260408301846140f3565b949350505050565b7f546f6b656e20646f657320657869737400000000000000000000000000000000600082015250565b6000614c206010836144a0565b9150614c2b82614bea565b602082019050919050565b60006020820190508181036000830152614c4f81614c13565b9050919050565b6000614c6182613ec7565b9150614c6c83613ec7565b925082821015614c7f57614c7e6146b2565b5b828203905092915050565b6000614c9582613ec7565b9150614ca083613ec7565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615614cd957614cd86146b2565b5b828202905092915050565b6000604082019050614cf960008301856140f3565b614d0660208301846140f3565b9392505050565b6000819050919050565b6000819050919050565b6000614d3c614d37614d3284614d0d565b614d17565b613ec7565b9050919050565b614d4c81614d21565b82525050565b6000819050919050565b6000614d77614d72614d6d84614d52565b614d17565b613ec7565b9050919050565b614d8781614d5c565b82525050565b6000604082019050614da26000830185614d43565b614daf6020830184614d7e565b9392505050565b7f427579204d65726765204f7262205369676e6174757265206973206e6f74207660008201527f616c696400000000000000000000000000000000000000000000000000000000602082015250565b6000614e126024836144a0565b9150614e1d82614db6565b604082019050919050565b60006020820190508181036000830152614e4181614e05565b9050919050565b6000819050919050565b6000614e6d614e68614e6384614e48565b614d17565b613ec7565b9050919050565b614e7d81614e52565b82525050565b6000819050919050565b6000614ea8614ea3614e9e84614e83565b614d17565b613ec7565b9050919050565b614eb881614e8d565b82525050565b6000604082019050614ed36000830185614e74565b614ee06020830184614eaf565b9392505050565b7f5369676e617475726520697320696e76616c6964000000000000000000000000600082015250565b6000614f1d6014836144a0565b9150614f2882614ee7565b602082019050919050565b60006020820190508181036000830152614f4c81614f10565b9050919050565b6000819050919050565b6000614f78614f73614f6e84614f53565b614d17565b613ec7565b9050919050565b614f8881614f5d565b82525050565b6000604082019050614fa36000830185614f7f565b614fb06020830184614f7f565b9392505050565b7f4172726179732061726520696e636f7272656374000000000000000000000000600082015250565b6000614fed6014836144a0565b9150614ff882614fb7565b602082019050919050565b6000602082019050818103600083015261501c81614fe0565b9050919050565b6000819050919050565b600061504861504361503e84615023565b614d17565b613ec7565b9050919050565b6150588161502d565b82525050565b60006040820190506150736000830185614195565b615080602083018461504f565b9392505050565b7f4e6f7420656e6f756768204d6572676572204f72627300000000000000000000600082015250565b60006150bd6016836144a0565b91506150c882615087565b602082019050919050565b600060208201905081810360008301526150ec816150b0565b9050919050565b6000819050919050565b600061511861511361510e846150f3565b614d17565b613ec7565b9050919050565b615128816150fd565b82525050565b6000604082019050615143600083018561511f565b6151506020830184614e74565b9392505050565b600060408201905061516c600083018561504f565b6151796020830184614f7f565b9392505050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b60006151dc6026836144a0565b91506151e782615180565b604082019050919050565b6000602082019050818103600083015261520b816151cf565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061525957607f821691505b6020821081141561526d5761526c615212565b5b50919050565b60006060820190506152886000830186614195565b61529560208301856140f3565b6152a260408301846140f3565b949350505050565b600081905092915050565b7f19457468657265756d205369676e6564204d6573736167653a0a333200000000600082015250565b60006152eb601c836152aa565b91506152f6826152b5565b601c82019050919050565b6000819050919050565b6000819050919050565b61532661532182615301565b61530b565b82525050565b6000615337826152de565b91506153438284615315565b60208201915081905092915050565b7f4772617a696e6720506572696f64206973206e6f742046696e69736865640000600082015250565b6000615388601e836144a0565b915061539382615352565b602082019050919050565b600060208201905081810360008301526153b78161537b565b9050919050565b6000815190506153cd8161406d565b92915050565b6000602082840312156153e9576153e8613d46565b5b60006153f7848285016153be565b91505092915050565b7f53656e646572206973206e6f7420746865206f776e6572000000000000000000600082015250565b60006154366017836144a0565b915061544182615400565b602082019050919050565b6000602082019050818103600083015261546581615429565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b60006154a682613ec7565b91506154b183613ec7565b9250826154c1576154c061546c565b5b828204905092915050565b600060a0820190506154e16000830188614195565b6154ee60208301876140f3565b6154fb60408301866140f3565b61550860608301856140f3565b61551560808301846140f3565b9695505050505050565b600060ff82169050919050565b60006155378261551f565b91506155428361551f565b92508260ff03821115615558576155576146b2565b5b828201905092915050565b61556c81615301565b82525050565b61557b8161551f565b82525050565b60006080820190506155966000830187615563565b6155a36020830186615572565b6155b06040830185615563565b6155bd6060830184615563565b9594505050505056fea264697066735822122083e78017ca1be862838386ec8d9039380fe829aa3a64fd624096a16fe9eaad5a64736f6c634300080c00330000000000000000000000002cf6be9aac1c7630d5a23af88c28275c70eb8819000000000000000000000000ed5464bd5c477b7f71739ce1d741b43e932b97b000000000000000000000000031e8d14a96f43cf4444533c7b0ee3beecc889400

Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)

0000000000000000000000002cf6be9aac1c7630d5a23af88c28275c70eb8819000000000000000000000000ed5464bd5c477b7f71739ce1d741b43e932b97b000000000000000000000000031e8d14a96f43cf4444533c7b0ee3beecc889400

-----Decoded View---------------
Arg [0] : _bapGenesis (address): 0x2Cf6BE9AaC1c7630d5A23af88c28275C70eb8819
Arg [1] : _bapMethane (address): 0xED5464bd5c477b7F71739Ce1d741b43E932b97b0
Arg [2] : _originalOrchestrator (address): 0x31E8D14A96F43cF4444533C7B0EE3beeCC889400

-----Encoded View---------------
3 Constructor Arguments found :
Arg [0] : 0000000000000000000000002cf6be9aac1c7630d5a23af88c28275c70eb8819
Arg [1] : 000000000000000000000000ed5464bd5c477b7f71739ce1d741b43e932b97b0
Arg [2] : 00000000000000000000000031e8d14a96f43cf4444533c7b0ee3beecc889400


Block Transaction Difficulty Gas Used Reward
Block Uncle Number Difficulty Gas Used Reward
Loading
Loading
Make sure to use the "Vote Down" button for any spammy posts, and the "Vote Up" for interesting conversations.

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.