ETH Price: $1,786.45 (+4.81%)

Contract

0xb8babFA40A036F94f77C6C5ACeD1e9D9998c7648
 

Overview

ETH Balance

0 ETH

ETH Value

$0.00

Multichain Info

No addresses found
Transaction Hash
Method
Block
From
To
Withdraw148186862025-02-01 21:59:4780 days ago1738447187IN
0xb8babFA4...9998c7648
0 ETH00.00014801
Claim All Yield148186782025-02-01 21:59:3180 days ago1738447171IN
0xb8babFA4...9998c7648
0 ETH0.000000010.00014873
Batch Free Hunt146463462025-01-28 22:15:0784 days ago1738102507IN
0xb8babFA4...9998c7648
0.0000125 ETH0.000000040.00144416
Batch Free Hunt142196302025-01-19 1:11:1594 days ago1737249075IN
0xb8babFA4...9998c7648
0.0000125 ETH0.000000030.00110038
Unlock Wolf140829902025-01-15 21:16:3597 days ago1736975795IN
0xb8babFA4...9998c7648
0 ETH00.00001003
Batch Free Hunt140331892025-01-14 17:36:3398 days ago1736876193IN
0xb8babFA4...9998c7648
0.0000125 ETH0.000000030.00123963
Batch Free Hunt140331102025-01-14 17:33:5598 days ago1736876035IN
0xb8babFA4...9998c7648
0.0000125 ETH0.000000030.00123566
Batch Free Hunt139876062025-01-13 16:17:0799 days ago1736785027IN
0xb8babFA4...9998c7648
0.000025 ETH0.000000030.0012141
Batch Free Hunt136803032025-01-06 13:33:41107 days ago1736170421IN
0xb8babFA4...9998c7648
0.0000125 ETH0.000000130.00437749
Batch Paid Hunt136798872025-01-06 13:19:49107 days ago1736169589IN
0xb8babFA4...9998c7648
0.00125 ETH0.000000130.00450198
Batch Yolo Hunt136797842025-01-06 13:16:23107 days ago1736169383IN
0xb8babFA4...9998c7648
0.00125 ETH0.000000130.00455923
Batch Free Hunt136797702025-01-06 13:15:55107 days ago1736169355IN
0xb8babFA4...9998c7648
0.0000125 ETH0.000000130.0045
Batch Free Hunt136797652025-01-06 13:15:45107 days ago1736169345IN
0xb8babFA4...9998c7648
0.0000125 ETH0.000000130.00445883
Batch Free Hunt136708212025-01-06 8:17:37107 days ago1736151457IN
0xb8babFA4...9998c7648
0.0000125 ETH0.000000130.0046
Batch Free Hunt136329892025-01-05 11:16:33108 days ago1736075793IN
0xb8babFA4...9998c7648
0.0000125 ETH0.000000090.003
Batch Free Hunt135490492025-01-03 12:38:33110 days ago1735907913IN
0xb8babFA4...9998c7648
0.0000375 ETH0.000000040.00156572
Batch Free Hunt134956682025-01-02 6:59:11111 days ago1735801151IN
0xb8babFA4...9998c7648
0.0000125 ETH0.000000070.00259128
Pig Hunt134197192024-12-31 12:47:33113 days ago1735649253IN
0xb8babFA4...9998c7648
0.0000125 ETH0.000000060.001367
Free Hunt134187792024-12-31 12:16:13113 days ago1735647373IN
0xb8babFA4...9998c7648
0.0000125 ETH0.000000070.00130131
Free Hunt134187672024-12-31 12:15:49113 days ago1735647349IN
0xb8babFA4...9998c7648
0.0000125 ETH0.000000070.00129383
Free Hunt134187582024-12-31 12:15:31113 days ago1735647331IN
0xb8babFA4...9998c7648
0.0000125 ETH0.000000070.00139268
Nuclear Hunt134185172024-12-31 12:07:29113 days ago1735646849IN
0xb8babFA4...9998c7648
0.0000125 ETH0.000000060.00127865
Nuclear Hunt134185102024-12-31 12:07:15113 days ago1735646835IN
0xb8babFA4...9998c7648
0.0000125 ETH0.000000060.00128214
Batch Free Hunt134156482024-12-31 10:31:51113 days ago1735641111IN
0xb8babFA4...9998c7648
0.00005 ETH0.000000040.00138066
Batch Free Hunt134156402024-12-31 10:31:35113 days ago1735641095IN
0xb8babFA4...9998c7648
0.00005 ETH0.000000040.00138357
View all transactions

Latest 21 internal transactions

Parent Transaction Hash Block From To
148186862025-02-01 21:59:4780 days ago1738447187
0xb8babFA4...9998c7648
0.5216375 ETH
133823572024-12-30 16:02:09113 days ago1735574529
0xb8babFA4...9998c7648
0.00125 ETH
133823512024-12-30 16:01:57113 days ago1735574517
0xb8babFA4...9998c7648
0.00125 ETH
133823452024-12-30 16:01:45113 days ago1735574505
0xb8babFA4...9998c7648
0.00125 ETH
133823382024-12-30 16:01:31113 days ago1735574491
0xb8babFA4...9998c7648
0.00125 ETH
133823322024-12-30 16:01:19113 days ago1735574479
0xb8babFA4...9998c7648
0.00125 ETH
133712392024-12-30 9:51:33114 days ago1735552293
0xb8babFA4...9998c7648
0.00125 ETH
133553482024-12-30 1:01:51114 days ago1735520511
0xb8babFA4...9998c7648
0.00125 ETH
133550152024-12-30 0:50:45114 days ago1735519845
0xb8babFA4...9998c7648
0.00125 ETH
133523102024-12-29 23:20:35114 days ago1735514435
0xb8babFA4...9998c7648
0.00125 ETH
133523012024-12-29 23:20:17114 days ago1735514417
0xb8babFA4...9998c7648
0.00125 ETH
133522922024-12-29 23:19:59114 days ago1735514399
0xb8babFA4...9998c7648
0.00125 ETH
133522832024-12-29 23:19:41114 days ago1735514381
0xb8babFA4...9998c7648
0.00125 ETH
133475712024-12-29 20:42:37114 days ago1735504957
0xb8babFA4...9998c7648
0.00125 ETH
133475482024-12-29 20:41:51114 days ago1735504911
0xb8babFA4...9998c7648
0.00125 ETH
133471402024-12-29 20:28:15114 days ago1735504095
0xb8babFA4...9998c7648
0.00125 ETH
133466012024-12-29 20:10:17114 days ago1735503017
0xb8babFA4...9998c7648
0.00125 ETH
133462682024-12-29 19:59:11114 days ago1735502351
0xb8babFA4...9998c7648
0.00125 ETH
133462642024-12-29 19:59:03114 days ago1735502343
0xb8babFA4...9998c7648
0.00125 ETH
133454502024-12-29 19:31:55114 days ago1735500715
0xb8babFA4...9998c7648
0.00125 ETH
133449882024-12-29 19:16:31114 days ago1735499791
0xb8babFA4...9998c7648
0.00125 ETH

Loading...
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
Hunt

Compiler Version
v0.8.26+commit.8a97fa7a

Optimization Enabled:
Yes with 1000 runs

Other Settings:
paris EvmVersion
File 1 of 8 : Hunt.sol
// SPDX-License-Identifier: UNLICENSED
pragma solidity ^0.8.26;

import "./vendor/GelatoVRFConsumerBase.sol";
import "@openzeppelin/contracts/access/Ownable.sol";
import "@openzeppelin/contracts/utils/ReentrancyGuard.sol";
import "./blast/IBlast.sol";
import "./blast/IBlastPoints.sol";

interface IWolves {
    function ownerOf(uint256 tokenId) external view returns (address);

    function balanceOf(address owner) external view returns (uint256);

    function totalSupply() external view returns (uint256);
}

interface IHuntPartners {
    function getTokensByOwner(
        address owner
    ) external view returns (uint256[] memory);

    function addNewTokens(address to, uint256 amount) external;

    function ownerOf(uint256 tokenId) external view returns (address);

    function totalSupply() external view returns (uint256);
}

struct Wolf {
    uint256 lastHuntedWindow;
    uint256 points;
    uint256 timesHunted;
}

enum LockStatus {
    UNLOCKED,
    LOCKED
}

enum RequestType {
    FreeHunt,
    PaidHunt,
    NuclearHunt,
    YoloHunt
}

enum HuntResult {
    NothingFound,
    Outcome1,
    Outcome2,
    Outcome3,
    Outcome4,
    Outcome5,
    Outcome6
}

struct LockedWolf {
    uint timestamp;
    LockStatus status;
    RequestType requestType;
}

enum HuntStatus {
    DISABLED,
    ENABLED
}

struct RandomRequest {
    address sender;
    uint256 id;
    uint256 timestamp;
    RequestType requestType;
}

struct HuntChances {
    uint nothingFound;
    uint outcome1;
    uint outcome2;
    uint outcome3;
    uint outcome4;
    uint outcome5;
    uint outcome6;
}

contract Hunt is GelatoVRFConsumerBase, Ownable, ReentrancyGuard {
    uint256 public totalTimesHunted = 0;
    uint256 public baseHuntPrice = 0.0000125 ether;
    uint256 public paidHuntPrice = 0.00125 ether;
    uint256 public yoloHuntPrice = 0.00125 ether;
    uint256 public ambushPrice = 0.001 ether;
    HuntStatus public huntStatus = HuntStatus.DISABLED;
    address private immutable _operatorAddr;

    uint256 public cooldown = 12 hours;
    uint256 public fullMoon = 1717286400;

    mapping(uint256 => Wolf) public wolves;
    mapping(uint256 => LockedWolf) public lockedWolves;
    mapping(RequestType => HuntChances) public huntingChances;
    mapping(uint256 => RandomRequest) public pendingRandomRequests;
    mapping(uint256 => bool) public isPigId;
    mapping(uint256 => uint256) public ambushedIds;

    uint256 public totalAmbushed;

    uint256[] public huntRewards = [1, 25, 50, 100, 150, 250, 500];

    IWolves public wolvesContract;
    IHuntPartners public huntPartnersContract;
    IBlastPoints public BlastPoints;
    IBlast public BLAST;

    function _operator() internal view override returns (address) {
        return _operatorAddr;
    }

    constructor(
        address _wolvesContract,
        address _huntPartnersContract,
        address operator,
        address _blastAddress,
        address _blastPointsAddress,
        address _pointsOperator
    ) Ownable(msg.sender) {
        wolvesContract = IWolves(_wolvesContract);
        huntPartnersContract = IHuntPartners(_huntPartnersContract);
        _operatorAddr = operator;
        BLAST = IBlast(_blastAddress);
        BLAST.configureClaimableYield();
        BLAST.configureClaimableGas();

        BlastPoints = IBlastPoints(_blastPointsAddress);
        BlastPoints.configurePointsOperator(_pointsOperator);

        huntingChances[RequestType.FreeHunt] = HuntChances(
            3000,
            2500,
            1700,
            1200,
            1000,
            500,
            100
        );
        huntingChances[RequestType.PaidHunt] = HuntChances(
            1000,
            1500,
            2400,
            2400,
            1500,
            1000,
            200
        );
        huntingChances[RequestType.NuclearHunt] = HuntChances(
            1000,
            1500,
            2400,
            2400,
            1500,
            1000,
            200
        );
        huntingChances[RequestType.YoloHunt] = HuntChances(
            7100,
            0,
            0,
            0,
            0,
            2500,
            400
        );

        uint16[194] memory pigIds = [
            532,
            582,
            620,
            670,
            679,
            717,
            731,
            735,
            750,
            754,
            755,
            756,
            776,
            823,
            857,
            879,
            907,
            949,
            993,
            1072,
            1093,
            1096,
            1104,
            1114,
            1132,
            1144,
            1149,
            1159,
            1175,
            1176,
            1185,
            1220,
            1240,
            1253,
            1261,
            1271,
            1296,
            1330,
            1333,
            1341,
            1371,
            1386,
            1399,
            1406,
            1455,
            1457,
            1499,
            1500,
            1509,
            1515,
            1523,
            1528,
            1529,
            1541,
            1562,
            1596,
            1606,
            1626,
            1643,
            1646,
            1691,
            1698,
            1759,
            1795,
            1818,
            1824,
            1893,
            1904,
            1976,
            1998,
            1999,
            2120,
            2147,
            2178,
            2185,
            2218,
            2254,
            2333,
            2345,
            2406,
            2411,
            2447,
            2450,
            2480,
            2490,
            2510,
            2594,
            2606,
            2614,
            2618,
            2629,
            2632,
            2678,
            2679,
            2680,
            2684,
            2685,
            2696,
            2799,
            2843,
            2888,
            2900,
            2944,
            2962,
            3029,
            3057,
            3064,
            3075,
            3078,
            3094,
            3105,
            3106,
            3113,
            3121,
            3142,
            3161,
            3192,
            3208,
            3318,
            3337,
            3357,
            3376,
            3410,
            3450,
            3475,
            3509,
            3531,
            3550,
            3583,
            3639,
            3682,
            3683,
            3703,
            3734,
            3740,
            3781,
            3798,
            3808,
            3843,
            3862,
            3903,
            3964,
            3970,
            3973,
            3978,
            4006,
            2010,
            4032,
            4051,
            4052,
            4093,
            4101,
            4114,
            4127,
            4139,
            4261,
            4295,
            4297,
            4312,
            4344,
            4345,
            4354,
            4379,
            4419,
            4454,
            4462,
            4488,
            4500,
            4515,
            4554,
            4624,
            4642,
            4678,
            4702,
            4723,
            4726,
            4737,
            4744,
            4751,
            4775,
            4853,
            4935,
            4943,
            4998,
            5000,
            5009,
            5074,
            5117,
            5132,
            5181,
            5205,
            2681,
            1650,
            2602
        ];

        for (uint i = 0; i < pigIds.length; i++) {
            isPigId[pigIds[i]] = true;
        }
    }

    event HuntRequested(
        address indexed sender,
        uint256 indexed id,
        uint256 sequenceNumber,
        RequestType indexed requestType,
        Wolf wolf
    );

    event Hunted(
        address indexed sender,
        uint256 indexed id,
        uint256 sequenceNumber,
        Wolf wolf,
        HuntResult result
    );

    event WolfAmbushed(uint256 indexed wolfId, uint256 timestamp);

    modifier ownsWolf(uint256 tokenId) {
        if (tokenId < wolvesContract.totalSupply()) {
            require(
                wolvesContract.ownerOf(tokenId) == msg.sender,
                "Sender does not own the wolf"
            );
        } else {
            require(
                huntPartnersContract.ownerOf(tokenId) == msg.sender,
                "Sender does not own the partner"
            );
        }
        _;
    }

    modifier cooldownPassed(uint256 id) {
        require(
            wolves[id].lastHuntedWindow != getCurrentWindow(),
            "This wolf is still in cooldown"
        );
        _;
    }

    function freeHunt(
        uint256 id
    ) external payable ownsWolf(id) cooldownPassed(id) nonReentrant {
        require(
            lockedWolves[id].status == LockStatus.UNLOCKED,
            "Wolf is currently locked"
        );
        require(huntStatus == HuntStatus.ENABLED, "Hunting disabled");
        require(msg.value >= baseHuntPrice, "Not enough fees");
        require(ambushedIds[id] == 0, "Wolf is ambushed");

        RequestType requestType = RequestType.FreeHunt;

        _lockWolf(id, requestType);

        RandomRequest memory randomRequest = RandomRequest({
            sender: msg.sender,
            id: id,
            timestamp: block.timestamp,
            requestType: requestType
        });

        bytes memory encodedRequest = abi.encode(randomRequest);

        uint256 sequenceNumber = _requestRandomness(encodedRequest);

        pendingRandomRequests[sequenceNumber] = RandomRequest({
            sender: msg.sender,
            id: id,
            timestamp: block.timestamp,
            requestType: requestType
        });

        emit HuntRequested(
            msg.sender,
            id,
            sequenceNumber,
            requestType,
            wolves[id]
        );
    }

    function batchFreeHunt(
        uint256[] calldata validWolfIds
    ) external payable nonReentrant {
        require(huntStatus == HuntStatus.ENABLED, "Hunting is disabled");
        require(validWolfIds.length > 0, "No valid wolf IDs provided");

        uint256 totalRequiredFee = baseHuntPrice * validWolfIds.length;
        require(
            msg.value >= totalRequiredFee,
            "Insufficient funds for all hunts"
        );

        for (uint256 i = 0; i < validWolfIds.length; i++) {
            uint256 id = validWolfIds[i];
            if (id < 5206) {
                require(
                    wolvesContract.ownerOf(id) == msg.sender && isWolfValid(id),
                    "Wolf not owned by sender or not valid for hunting"
                );
            } else {
                require(
                    huntPartnersContract.ownerOf(id) == msg.sender &&
                        isWolfValid(id),
                    "Wolf not owned by sender or not valid for hunting"
                );
            }

            require(ambushedIds[id] == 0, "Wolf is ambushed");

            RequestType requestType = RequestType.FreeHunt;

            _lockWolf(id, requestType);

            RandomRequest memory randomRequest = RandomRequest({
                sender: msg.sender,
                id: id,
                timestamp: block.timestamp,
                requestType: requestType
            });

            bytes memory encodedRequest = abi.encode(randomRequest);

            uint256 sequenceNumber = _requestRandomness(encodedRequest);
            pendingRandomRequests[sequenceNumber] = RandomRequest({
                sender: msg.sender,
                id: id,
                timestamp: block.timestamp,
                requestType: requestType
            });

            emit HuntRequested(
                msg.sender,
                id,
                sequenceNumber,
                requestType,
                wolves[id]
            );
        }
    }

    function paidHunt(
        uint256 id
    ) external payable ownsWolf(id) cooldownPassed(id) nonReentrant {
        require(
            lockedWolves[id].status == LockStatus.UNLOCKED,
            "Wolf is currently locked"
        );
        require(huntStatus == HuntStatus.ENABLED, "Hunting disabled");

        require(msg.value >= paidHuntPrice, "Not enough fees");
        require(ambushedIds[id] == 0, "Wolf is ambushed");

        RequestType requestType = RequestType.PaidHunt;

        _lockWolf(id, requestType);

        RandomRequest memory randomRequest = RandomRequest({
            sender: msg.sender,
            id: id,
            timestamp: block.timestamp,
            requestType: requestType
        });

        bytes memory encodedRequest = abi.encode(randomRequest);

        uint256 sequenceNumber = _requestRandomness(encodedRequest);
        pendingRandomRequests[sequenceNumber] = RandomRequest({
            sender: msg.sender,
            id: id,
            timestamp: block.timestamp,
            requestType: requestType
        });

        emit HuntRequested(
            msg.sender,
            id,
            sequenceNumber,
            requestType,
            wolves[id]
        );
    }

    function batchPaidHunt(
        uint256[] calldata validWolfIds
    ) external payable nonReentrant {
        require(huntStatus == HuntStatus.ENABLED, "Hunting is disabled");
        require(validWolfIds.length > 0, "No Valid Ids");
        uint256 totalRequiredFee = paidHuntPrice * validWolfIds.length;
        require(
            msg.value >= totalRequiredFee,
            "Insufficient funds for all hunts"
        );

        for (uint256 i = 0; i < validWolfIds.length; i++) {
            uint256 id = validWolfIds[i];
            if (id < 5206) {
                require(
                    wolvesContract.ownerOf(id) == msg.sender && isWolfValid(id),
                    "Wolf not owned by sender or not valid for hunting"
                );
            } else {
                require(
                    huntPartnersContract.ownerOf(id) == msg.sender &&
                        isWolfValid(id),
                    "Wolf not owned by sender or not valid for hunting"
                );
            }

            require(ambushedIds[id] == 0, "Wolf is ambushed");

            RequestType requestType = RequestType.PaidHunt;

            _lockWolf(id, requestType);

            RandomRequest memory randomRequest = RandomRequest({
                sender: msg.sender,
                id: id,
                timestamp: block.timestamp,
                requestType: requestType
            });

            bytes memory encodedRequest = abi.encode(randomRequest);

            uint256 sequenceNumber = _requestRandomness(encodedRequest);

            pendingRandomRequests[sequenceNumber] = RandomRequest({
                sender: msg.sender,
                id: id,
                timestamp: block.timestamp,
                requestType: requestType
            });

            emit HuntRequested(
                msg.sender,
                id,
                sequenceNumber,
                requestType,
                wolves[id]
            );
        }
    }

    function yoloHunt(
        uint256 id
    ) external payable ownsWolf(id) cooldownPassed(id) nonReentrant {
        require(
            lockedWolves[id].status == LockStatus.UNLOCKED,
            "Wolf is currently locked"
        );
        require(huntStatus == HuntStatus.ENABLED, "Hunting disabled");

        require(msg.value >= yoloHuntPrice, "Not enough fees");

        require(ambushedIds[id] == 0, "Wolf is ambushed");

        RequestType requestType = RequestType.YoloHunt;

        _lockWolf(id, requestType);

        RandomRequest memory randomRequest = RandomRequest({
            sender: msg.sender,
            id: id,
            timestamp: block.timestamp,
            requestType: requestType
        });

        bytes memory encodedRequest = abi.encode(randomRequest);

        uint256 sequenceNumber = _requestRandomness(encodedRequest);

        pendingRandomRequests[sequenceNumber] = RandomRequest({
            sender: msg.sender,
            id: id,
            timestamp: block.timestamp,
            requestType: requestType
        });

        emit HuntRequested(
            msg.sender,
            id,
            sequenceNumber,
            requestType,
            wolves[id]
        );
    }

    function batchYoloHunt(
        uint256[] calldata validWolfIds
    ) external payable nonReentrant {
        require(huntStatus == HuntStatus.ENABLED, "Hunting is disabled");
        require(validWolfIds.length > 0, "No Valid Ids");
        uint256 totalRequiredFee = yoloHuntPrice * validWolfIds.length;

        require(
            msg.value >= totalRequiredFee,
            "Insufficient funds for all hunts"
        );

        for (uint256 i = 0; i < validWolfIds.length; i++) {
            uint256 id = validWolfIds[i];
            if (id < 5206) {
                require(
                    wolvesContract.ownerOf(id) == msg.sender && isWolfValid(id),
                    "Wolf not owned by sender or not valid for hunting"
                );
            } else {
                require(
                    huntPartnersContract.ownerOf(id) == msg.sender &&
                        isWolfValid(id),
                    "Wolf not owned by sender or not valid for hunting"
                );
            }

            require(ambushedIds[id] == 0, "Wolf is ambushed");

            RequestType requestType = RequestType.YoloHunt;

            _lockWolf(id, requestType);

            RandomRequest memory randomRequest = RandomRequest({
                sender: msg.sender,
                id: id,
                timestamp: block.timestamp,
                requestType: requestType
            });

            bytes memory encodedRequest = abi.encode(randomRequest);

            uint256 sequenceNumber = _requestRandomness(encodedRequest);

            pendingRandomRequests[sequenceNumber] = RandomRequest({
                sender: msg.sender,
                id: id,
                timestamp: block.timestamp,
                requestType: requestType
            });

            emit HuntRequested(
                msg.sender,
                id,
                sequenceNumber,
                requestType,
                wolves[id]
            );
        }
    }

    function pigHunt(
        uint256 id
    ) external payable ownsWolf(id) cooldownPassed(id) nonReentrant {
        require(
            lockedWolves[id].status == LockStatus.UNLOCKED,
            "Wolf is currently locked"
        );
        require(huntStatus == HuntStatus.ENABLED, "Hunting disabled");
        require(isPigId[id], "This wolf is not a pig");
        require(msg.value >= baseHuntPrice, "Not enough fees");
        require(ambushedIds[id] == 0, "Wolf is ambushed");

        RequestType requestType = RequestType.YoloHunt;

        _lockWolf(id, requestType);

        RandomRequest memory randomRequest = RandomRequest({
            sender: msg.sender,
            id: id,
            timestamp: block.timestamp,
            requestType: requestType
        });

        bytes memory encodedRequest = abi.encode(randomRequest);

        uint256 sequenceNumber = _requestRandomness(encodedRequest);

        pendingRandomRequests[sequenceNumber] = RandomRequest({
            sender: msg.sender,
            id: id,
            timestamp: block.timestamp,
            requestType: requestType
        });

        emit HuntRequested(
            msg.sender,
            id,
            sequenceNumber,
            requestType,
            wolves[id]
        );
    }

    function batchPigHunt(
        uint256[] calldata validWolfIds
    ) external payable nonReentrant {
        require(huntStatus == HuntStatus.ENABLED, "Hunting is disabled");
        require(validWolfIds.length > 0, "No Valid Ids");
        uint256 totalRequiredFee = baseHuntPrice * validWolfIds.length;

        require(
            msg.value >= totalRequiredFee,
            "Insufficient funds for all hunts"
        );

        for (uint256 i = 0; i < validWolfIds.length; i++) {
            uint256 id = validWolfIds[i];
            require(isPigId[id], "This wolf is not a pig");
            require(
                wolvesContract.ownerOf(id) == msg.sender && isWolfValid(id),
                "Wolf not owned by sender or not valid for hunting"
            );

            require(ambushedIds[id] == 0, "Wolf is ambushed");

            RequestType requestType = RequestType.YoloHunt;

            _lockWolf(id, requestType);

            RandomRequest memory randomRequest = RandomRequest({
                sender: msg.sender,
                id: id,
                timestamp: block.timestamp,
                requestType: requestType
            });

            bytes memory encodedRequest = abi.encode(randomRequest);

            uint256 sequenceNumber = _requestRandomness(encodedRequest);

            pendingRandomRequests[sequenceNumber] = RandomRequest({
                sender: msg.sender,
                id: id,
                timestamp: block.timestamp,
                requestType: requestType
            });

            emit HuntRequested(
                msg.sender,
                id,
                sequenceNumber,
                requestType,
                wolves[id]
            );
        }
    }

    function nuclearHunt(
        uint256 id
    ) external payable ownsWolf(id) cooldownPassed(id) nonReentrant {
        require(
            lockedWolves[id].status == LockStatus.UNLOCKED,
            "Wolf is currently locked"
        );
        require(huntStatus == HuntStatus.ENABLED, "Hunting disabled");
        require(id >= 0 && id < 131, "Wolf is not nuclear");
        require(msg.value >= baseHuntPrice, "Not enough fees");
        require(ambushedIds[id] == 0, "Wolf is ambushed");

        RequestType requestType = RequestType.NuclearHunt;

        _lockWolf(id, requestType);

        RandomRequest memory randomRequest = RandomRequest({
            sender: msg.sender,
            id: id,
            timestamp: block.timestamp,
            requestType: requestType
        });

        bytes memory encodedRequest = abi.encode(randomRequest);

        uint256 sequenceNumber = _requestRandomness(encodedRequest);

        pendingRandomRequests[sequenceNumber] = RandomRequest({
            sender: msg.sender,
            id: id,
            timestamp: block.timestamp,
            requestType: requestType
        });

        emit HuntRequested(
            msg.sender,
            id,
            sequenceNumber,
            requestType,
            wolves[id]
        );
    }

    function batchNuclearHunt(
        uint256[] calldata validWolfIds
    ) external payable nonReentrant {
        require(huntStatus == HuntStatus.ENABLED, "Hunting is disabled");

        require(validWolfIds.length > 0, "No Valid Ids");

        uint256 totalRequiredFee = baseHuntPrice * validWolfIds.length;
        require(
            msg.value >= totalRequiredFee,
            "Insufficient funds for all hunts"
        );

        for (uint256 i = 0; i < validWolfIds.length; i++) {
            uint256 id = validWolfIds[i];
            require(id >= 0 && id < 131, "Wolf is not nuclear");
            require(
                wolvesContract.ownerOf(id) == msg.sender && isWolfValid(id),
                "Wolf not owned by sender or not valid for hunting"
            );

            require(ambushedIds[id] == 0, "Wolf is ambushed");

            RequestType requestType = RequestType.NuclearHunt;

            _lockWolf(id, requestType);

            RandomRequest memory randomRequest = RandomRequest({
                sender: msg.sender,
                id: id,
                timestamp: block.timestamp,
                requestType: requestType
            });

            bytes memory encodedRequest = abi.encode(randomRequest);

            uint256 sequenceNumber = _requestRandomness(encodedRequest);

            pendingRandomRequests[sequenceNumber] = RandomRequest({
                sender: msg.sender,
                id: id,
                timestamp: block.timestamp,
                requestType: requestType
            });

            emit HuntRequested(
                msg.sender,
                id,
                sequenceNumber,
                requestType,
                wolves[id]
            );
        }
    }

    function ambushWolf(
        uint256 wolfId
    ) external payable ownsWolf(wolfId) nonReentrant {
        require(huntStatus == HuntStatus.ENABLED, "Hunting disabled");
        require(msg.value >= ambushPrice, "Not enough fees");
        require(ambushedIds[wolfId] == 0, "Wolf is ambushed");
        ambushedIds[wolfId] = block.timestamp;
        totalAmbushed++;
        emit WolfAmbushed(wolfId, block.timestamp);
    }

    function _fulfillRandomness(
        uint256 randomness,
        uint256 requestId,
        bytes memory extraData
    ) internal override {
        RandomRequest memory request = pendingRandomRequests[requestId];
        require(request.sender != address(0), "Request not found");

        Wolf storage wolf = wolves[request.id];
        HuntChances memory chances = huntingChances[request.requestType];

        uint randomValue = uint(randomness) % 10000;

        uint cumulativeChance = 0;
        uint[7] memory outcomes = [
            chances.nothingFound,
            chances.outcome1,
            chances.outcome2,
            chances.outcome3,
            chances.outcome4,
            chances.outcome5,
            10000
        ];

        HuntResult result = HuntResult.Outcome6;
        for (uint i = 0; i < outcomes.length; i++) {
            cumulativeChance += outcomes[i];
            if (randomValue < cumulativeChance) {
                result = HuntResult(i);
                wolf.points += huntRewards[i];
                break;
            }
        }

        wolf.lastHuntedWindow = getCurrentWindow();

        wolf.timesHunted++;

        lockedWolves[request.id].status = LockStatus.UNLOCKED;

        delete pendingRandomRequests[requestId];

        totalTimesHunted++;

        emit Hunted(request.sender, request.id, requestId, wolf, result);
    }

    function _lockWolf(uint256 id, RequestType requestType) internal {
        lockedWolves[id].status = LockStatus.LOCKED;
        lockedWolves[id].requestType = requestType;
        lockedWolves[id].timestamp = block.timestamp;
    }

    function isWolfValid(uint256 id) public view returns (bool) {
        return (lockedWolves[id].status == LockStatus.UNLOCKED &&
            wolves[id].lastHuntedWindow != getCurrentWindow());
    }

    function getCurrentWindow() public view returns (uint256) {
        return (block.timestamp - fullMoon) / cooldown;
    }

    function getWolf(uint256 id) public view returns (Wolf memory) {
        return wolves[id];
    }

    function isAmbushed(uint256 id) public view returns (uint256) {
        return ambushedIds[id];
    }

    function setPaidHuntPrice(uint256 _price) external onlyOwner {
        paidHuntPrice = _price;
    }

    function setYoloHuntPrice(uint256 _price) external onlyOwner {
        yoloHuntPrice = _price;
    }

    function setBaseHuntPrice(uint256 _price) external onlyOwner {
        baseHuntPrice = _price;
    }

    function setHuntingChances(
        RequestType _type,
        HuntChances calldata _chances
    ) external onlyOwner {
        huntingChances[_type] = _chances;
    }

    function setCooldown(uint256 _cooldown) external onlyOwner {
        require(_cooldown > 0, "Cooldown must be positive.");
        cooldown = _cooldown;
    }

    function setFullMoon(uint256 _fullMoon) external onlyOwner {
        require(_fullMoon > 0, "Invalid timestamp for fullMoon.");
        fullMoon = _fullMoon;
    }

    function setHuntRewards(uint[] calldata _rewards) external onlyOwner {
        require(
            _rewards.length == huntRewards.length,
            "Invalid rewards length"
        );
        for (uint256 i = 0; i < _rewards.length; i++) {
            huntRewards[i] = _rewards[i];
        }
    }

    function setWolvesContract(address _wolvesContract) external onlyOwner {
        require(_wolvesContract != address(0), "Invalid address");
        wolvesContract = IWolves(_wolvesContract);
    }

    function setHuntPartnersContract(
        address _huntPartnersContract
    ) external onlyOwner {
        require(_huntPartnersContract != address(0), "Invalid address");
        huntPartnersContract = IHuntPartners(_huntPartnersContract);
    }

    function setHuntStatus(uint256 status) external onlyOwner {
        huntStatus = HuntStatus(status);
    }

    function claimYield(address recipient, uint256 amount) external onlyOwner {
        BLAST.claimYield(address(this), recipient, amount);
    }

    function claimAllYield(address recipient) external onlyOwner {
        BLAST.claimAllYield(address(this), recipient);
    }

    function claimMyContractsGas(address recipient) external onlyOwner {
        BLAST.claimAllGas(address(this), recipient);
    }

    function unlockWolf(uint256 id) public nonReentrant {
        require(
            lockedWolves[id].status == LockStatus.LOCKED,
            "Wolf not locked"
        );
        require(
            block.timestamp >= lockedWolves[id].timestamp + 10 minutes,
            "Lock period not expired"
        );
        if (lockedWolves[id].requestType == RequestType.PaidHunt) {
            require(msg.sender != address(0), "INVALID_ADDRESS");
            (bool success, ) = payable(msg.sender).call{value: paidHuntPrice}(
                ""
            );
            require(success, "WITHDRAWAL_FAILED");
        }
        if (lockedWolves[id].requestType == RequestType.YoloHunt) {
            require(msg.sender != address(0), "INVALID_ADDRESS");
            (bool success, ) = payable(msg.sender).call{value: yoloHuntPrice}(
                ""
            );
            require(success, "WITHDRAWAL_FAILED");
        }
        lockedWolves[id].status = LockStatus.UNLOCKED;
    }

    function ownerUnlockWolf(uint256 id) public onlyOwner {
        require(
            lockedWolves[id].status == LockStatus.LOCKED,
            "Wolf not locked"
        );
        require(
            block.timestamp >= lockedWolves[id].timestamp + 10 minutes,
            "Lock period not expired"
        );
        lockedWolves[id].status = LockStatus.UNLOCKED;
    }

    function withdraw(address to) public onlyOwner nonReentrant {
        require(to != address(0), "INVALID_ADDRESS");
        uint256 contractBalance = address(this).balance;
        (bool success, ) = payable(to).call{value: contractBalance}("");
        require(success, "WITHDRAWAL_FAILED");
    }
}

File 2 of 8 : Ownable.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v5.0.0) (access/Ownable.sol)

pragma solidity ^0.8.20;

import {Context} from "../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.
 *
 * The initial owner is set to the address provided by the deployer. 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;

    /**
     * @dev The caller account is not authorized to perform an operation.
     */
    error OwnableUnauthorizedAccount(address account);

    /**
     * @dev The owner is not a valid owner account. (eg. `address(0)`)
     */
    error OwnableInvalidOwner(address owner);

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

    /**
     * @dev Initializes the contract setting the address provided by the deployer as the initial owner.
     */
    constructor(address initialOwner) {
        if (initialOwner == address(0)) {
            revert OwnableInvalidOwner(address(0));
        }
        _transferOwnership(initialOwner);
    }

    /**
     * @dev Throws if called by any account other than the owner.
     */
    modifier onlyOwner() {
        _checkOwner();
        _;
    }

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

    /**
     * @dev Throws if the sender is not the owner.
     */
    function _checkOwner() internal view virtual {
        if (owner() != _msgSender()) {
            revert OwnableUnauthorizedAccount(_msgSender());
        }
    }

    /**
     * @dev Leaves the contract without owner. It will not be possible to call
     * `onlyOwner` functions. Can only be called by the current owner.
     *
     * NOTE: Renouncing ownership will leave the contract without an owner,
     * thereby disabling 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 {
        if (newOwner == address(0)) {
            revert OwnableInvalidOwner(address(0));
        }
        _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 3 of 8 : Context.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v5.0.1) (utils/Context.sol)

pragma solidity ^0.8.20;

/**
 * @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;
    }

    function _contextSuffixLength() internal view virtual returns (uint256) {
        return 0;
    }
}

File 4 of 8 : ReentrancyGuard.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v5.0.0) (utils/ReentrancyGuard.sol)

pragma solidity ^0.8.20;

/**
 * @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;

    /**
     * @dev Unauthorized reentrant call.
     */
    error ReentrancyGuardReentrantCall();

    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() {
        _nonReentrantBefore();
        _;
        _nonReentrantAfter();
    }

    function _nonReentrantBefore() private {
        // On the first call to nonReentrant, _status will be NOT_ENTERED
        if (_status == ENTERED) {
            revert ReentrancyGuardReentrantCall();
        }

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

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

    /**
     * @dev Returns true if the reentrancy guard is currently set to "entered", which indicates there is a
     * `nonReentrant` function in the call stack.
     */
    function _reentrancyGuardEntered() internal view returns (bool) {
        return _status == ENTERED;
    }
}

File 5 of 8 : IBlast.sol
// SPDX-License-Identifier: UNLICENSED
pragma solidity ^0.8.21;

enum YieldMode {
    AUTOMATIC,
    VOID,
    CLAIMABLE
}

enum GasMode {
    VOID,
    CLAIMABLE
}

interface IBlast {
    // configure
    function configureContract(
        address contractAddress,
        YieldMode _yield,
        GasMode gasMode,
        address governor
    ) external;
    function configure(
        YieldMode _yield,
        GasMode gasMode,
        address governor
    ) external;

    // base configuration options
    function configureClaimableYield() external;
    function configureClaimableYieldOnBehalf(address contractAddress) external;
    function configureAutomaticYield() external;
    function configureAutomaticYieldOnBehalf(address contractAddress) external;
    function configureVoidYield() external;
    function configureVoidYieldOnBehalf(address contractAddress) external;
    function configureClaimableGas() external;
    function configureClaimableGasOnBehalf(address contractAddress) external;
    function configureVoidGas() external;
    function configureVoidGasOnBehalf(address contractAddress) external;
    function configureGovernor(address _governor) external;
    function configureGovernorOnBehalf(
        address _newGovernor,
        address contractAddress
    ) external;

    // claim yield
    function claimYield(
        address contractAddress,
        address recipientOfYield,
        uint256 amount
    ) external returns (uint256);
    function claimAllYield(
        address contractAddress,
        address recipientOfYield
    ) external returns (uint256);

    // claim gas
    function claimAllGas(
        address contractAddress,
        address recipientOfGas
    ) external returns (uint256);
    function claimGasAtMinClaimRate(
        address contractAddress,
        address recipientOfGas,
        uint256 minClaimRateBips
    ) external returns (uint256);
    function claimMaxGas(
        address contractAddress,
        address recipientOfGas
    ) external returns (uint256);
    function claimGas(
        address contractAddress,
        address recipientOfGas,
        uint256 gasToClaim,
        uint256 gasSecondsToConsume
    ) external returns (uint256);

    // read functions
    function readClaimableYield(
        address contractAddress
    ) external view returns (uint256);
    function readYieldConfiguration(
        address contractAddress
    ) external view returns (uint8);
    function readGasParams(
        address contractAddress
    )
        external
        view
        returns (
            uint256 etherSeconds,
            uint256 etherBalance,
            uint256 lastUpdated,
            GasMode
        );
}

File 6 of 8 : IBlastPoints.sol
// SPDX-License-Identifier: UNLICENSED
pragma solidity ^0.8.21;

interface IBlastPoints {
    function configurePointsOperator(address operator) external;
    function configurePointsOperatorOnBehalf(
        address contractAddress,
        address operator
    ) external;
}

File 7 of 8 : GelatoVRFConsumerBase.sol
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.18;

import {IGelatoVRFConsumer} from "./IGelatoVRFConsumer.sol";

/// @title GelatoVRFConsumerBase
/// @dev This contract handles domain separation between consecutive randomness requests
/// The contract has to be implemented by contracts willing to use the gelato VRF system.
/// This base contract enhances the GelatoVRFConsumer by introducing request IDs and
/// ensuring unique random values.
/// for different request IDs by hashing them with the random number provided by drand.
/// For security considerations, refer to the Gelato documentation.
abstract contract GelatoVRFConsumerBase is IGelatoVRFConsumer {
    uint256 private constant _PERIOD = 3;
    uint256 private constant _GENESIS = 1692803367;
    bool[] public requestPending;
    mapping(uint256 => bytes32) public requestedHash;

    /// @notice Returns the address of the dedicated msg.sender.
    /// @dev The operator can be found on the Gelato dashboard after a VRF is deployed.
    /// @return Address of the operator.
    function _operator() internal view virtual returns (address);

    /// @notice User logic to handle the random value received.
    /// @param randomness The random number generated by Gelato VRF.
    /// @param requestId The ID for the randomness request.
    /// @param extraData Additional data from the randomness request.
    function _fulfillRandomness(
        uint256 randomness,
        uint256 requestId,
        bytes memory extraData
    ) internal virtual;

    /// @notice Requests randomness from the Gelato VRF.
    /// @dev The extraData parameter allows for additional data to be passed to
    /// the VRF, which is then forwarded to the callback. This is useful for
    /// request tracking purposes if requestId is not enough.
    /// @param extraData Additional data for the randomness request.
    /// @return requestId The ID for the randomness request.
    function _requestRandomness(
        bytes memory extraData
    ) internal returns (uint256 requestId) {
        requestId = uint256(requestPending.length);
        requestPending.push();
        requestPending[requestId] = true;

        bytes memory data = abi.encode(requestId, extraData);
        uint256 round = _round();

        bytes memory dataWithRound = abi.encode(round, data);
        bytes32 requestHash = keccak256(dataWithRound);

        requestedHash[requestId] = requestHash;

        emit RequestedRandomness(round, data);
    }

    /// @notice Callback function used by Gelato VRF to return the random number.
    /// The randomness is derived by hashing the provided randomness with the request ID.
    /// @param randomness The random number generated by Gelato VRF.
    /// @param dataWithRound Additional data provided by Gelato VRF containing request details.
    function fulfillRandomness(
        uint256 randomness,
        bytes calldata dataWithRound
    ) external {
        require(msg.sender == _operator(), "only operator");

        (, bytes memory data) = abi.decode(dataWithRound, (uint256, bytes));
        (uint256 requestId, bytes memory extraData) = abi.decode(
            data,
            (uint256, bytes)
        );

        bytes32 requestHash = keccak256(dataWithRound);
        bool isValidRequestHash = requestHash == requestedHash[requestId];

        require(requestPending[requestId], "request fulfilled or missing");

        if (isValidRequestHash) {
            randomness = uint256(
                keccak256(
                    abi.encode(
                        randomness,
                        address(this),
                        block.chainid,
                        requestId
                    )
                )
            );

            _fulfillRandomness(randomness, requestId, extraData);
            requestPending[requestId] = false;
        }
    }

    /// @notice Computes and returns the round number of drand to request randomness from.
    function _round() private view returns (uint256 round) {
        // solhint-disable-next-line not-rely-on-time
        uint256 elapsedFromGenesis = block.timestamp - _GENESIS;
        uint256 currentRound = (elapsedFromGenesis / _PERIOD) + 1;

        round = block.chainid == 1 ? currentRound + 4 : currentRound + 1;
    }
}

File 8 of 8 : IGelatoVRFConsumer.sol
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.18;

/// @title IGelatoVRFConsumer
/// @dev Interface for consuming random number provided by Drand.
/// @notice This interface allows contracts to receive a random number provided by Gelato VRF.
interface IGelatoVRFConsumer {
    /// @notice Event emitted when a randomness request is made.
    /// @param data The round of randomness to request.
    /// @param data Additional data associated with the request.
    event RequestedRandomness(uint256 round, bytes data);

    /// @notice Callback function used by Gelato to return the random number.
    /// @dev The random number is fetched from one among many drand endpoints
    /// and passed back to this function like in a Gelato Web3 Function.
    /// @param randomness The random number generated by drand.
    /// @param data Additional data provided by Gelato VRF or the user, typically unused.
    function fulfillRandomness(
        uint256 randomness,
        bytes calldata data
    ) external;
}

Settings
{
  "optimizer": {
    "enabled": true,
    "runs": 1000
  },
  "viaIR": true,
  "evmVersion": "paris",
  "outputSelection": {
    "*": {
      "*": [
        "evm.bytecode",
        "evm.deployedBytecode",
        "devdoc",
        "userdoc",
        "metadata",
        "abi"
      ]
    }
  }
}

Contract Security Audit

Contract ABI

API
[{"inputs":[{"internalType":"address","name":"_wolvesContract","type":"address"},{"internalType":"address","name":"_huntPartnersContract","type":"address"},{"internalType":"address","name":"operator","type":"address"},{"internalType":"address","name":"_blastAddress","type":"address"},{"internalType":"address","name":"_blastPointsAddress","type":"address"},{"internalType":"address","name":"_pointsOperator","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"OwnableInvalidOwner","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"OwnableUnauthorizedAccount","type":"error"},{"inputs":[],"name":"ReentrancyGuardReentrantCall","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"sender","type":"address"},{"indexed":true,"internalType":"uint256","name":"id","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"sequenceNumber","type":"uint256"},{"indexed":true,"internalType":"enum RequestType","name":"requestType","type":"uint8"},{"components":[{"internalType":"uint256","name":"lastHuntedWindow","type":"uint256"},{"internalType":"uint256","name":"points","type":"uint256"},{"internalType":"uint256","name":"timesHunted","type":"uint256"}],"indexed":false,"internalType":"struct Wolf","name":"wolf","type":"tuple"}],"name":"HuntRequested","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"sender","type":"address"},{"indexed":true,"internalType":"uint256","name":"id","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"sequenceNumber","type":"uint256"},{"components":[{"internalType":"uint256","name":"lastHuntedWindow","type":"uint256"},{"internalType":"uint256","name":"points","type":"uint256"},{"internalType":"uint256","name":"timesHunted","type":"uint256"}],"indexed":false,"internalType":"struct Wolf","name":"wolf","type":"tuple"},{"indexed":false,"internalType":"enum HuntResult","name":"result","type":"uint8"}],"name":"Hunted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"round","type":"uint256"},{"indexed":false,"internalType":"bytes","name":"data","type":"bytes"}],"name":"RequestedRandomness","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"wolfId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"timestamp","type":"uint256"}],"name":"WolfAmbushed","type":"event"},{"inputs":[],"name":"BLAST","outputs":[{"internalType":"contract IBlast","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"BlastPoints","outputs":[{"internalType":"contract IBlastPoints","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"ambushPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"wolfId","type":"uint256"}],"name":"ambushWolf","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"ambushedIds","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseHuntPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"validWolfIds","type":"uint256[]"}],"name":"batchFreeHunt","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"validWolfIds","type":"uint256[]"}],"name":"batchNuclearHunt","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"validWolfIds","type":"uint256[]"}],"name":"batchPaidHunt","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"validWolfIds","type":"uint256[]"}],"name":"batchPigHunt","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"validWolfIds","type":"uint256[]"}],"name":"batchYoloHunt","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"recipient","type":"address"}],"name":"claimAllYield","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"recipient","type":"address"}],"name":"claimMyContractsGas","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"claimYield","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"cooldown","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"id","type":"uint256"}],"name":"freeHunt","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"randomness","type":"uint256"},{"internalType":"bytes","name":"dataWithRound","type":"bytes"}],"name":"fulfillRandomness","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"fullMoon","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getCurrentWindow","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"id","type":"uint256"}],"name":"getWolf","outputs":[{"components":[{"internalType":"uint256","name":"lastHuntedWindow","type":"uint256"},{"internalType":"uint256","name":"points","type":"uint256"},{"internalType":"uint256","name":"timesHunted","type":"uint256"}],"internalType":"struct Wolf","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"huntPartnersContract","outputs":[{"internalType":"contract IHuntPartners","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"huntRewards","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"huntStatus","outputs":[{"internalType":"enum HuntStatus","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"enum RequestType","name":"","type":"uint8"}],"name":"huntingChances","outputs":[{"internalType":"uint256","name":"nothingFound","type":"uint256"},{"internalType":"uint256","name":"outcome1","type":"uint256"},{"internalType":"uint256","name":"outcome2","type":"uint256"},{"internalType":"uint256","name":"outcome3","type":"uint256"},{"internalType":"uint256","name":"outcome4","type":"uint256"},{"internalType":"uint256","name":"outcome5","type":"uint256"},{"internalType":"uint256","name":"outcome6","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"id","type":"uint256"}],"name":"isAmbushed","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"isPigId","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"id","type":"uint256"}],"name":"isWolfValid","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"lockedWolves","outputs":[{"internalType":"uint256","name":"timestamp","type":"uint256"},{"internalType":"enum LockStatus","name":"status","type":"uint8"},{"internalType":"enum RequestType","name":"requestType","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"id","type":"uint256"}],"name":"nuclearHunt","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"id","type":"uint256"}],"name":"ownerUnlockWolf","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"id","type":"uint256"}],"name":"paidHunt","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"paidHuntPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"pendingRandomRequests","outputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"uint256","name":"timestamp","type":"uint256"},{"internalType":"enum RequestType","name":"requestType","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"id","type":"uint256"}],"name":"pigHunt","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"requestPending","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"requestedHash","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_price","type":"uint256"}],"name":"setBaseHuntPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_cooldown","type":"uint256"}],"name":"setCooldown","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_fullMoon","type":"uint256"}],"name":"setFullMoon","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_huntPartnersContract","type":"address"}],"name":"setHuntPartnersContract","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"_rewards","type":"uint256[]"}],"name":"setHuntRewards","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"status","type":"uint256"}],"name":"setHuntStatus","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"enum RequestType","name":"_type","type":"uint8"},{"components":[{"internalType":"uint256","name":"nothingFound","type":"uint256"},{"internalType":"uint256","name":"outcome1","type":"uint256"},{"internalType":"uint256","name":"outcome2","type":"uint256"},{"internalType":"uint256","name":"outcome3","type":"uint256"},{"internalType":"uint256","name":"outcome4","type":"uint256"},{"internalType":"uint256","name":"outcome5","type":"uint256"},{"internalType":"uint256","name":"outcome6","type":"uint256"}],"internalType":"struct HuntChances","name":"_chances","type":"tuple"}],"name":"setHuntingChances","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_price","type":"uint256"}],"name":"setPaidHuntPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_wolvesContract","type":"address"}],"name":"setWolvesContract","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_price","type":"uint256"}],"name":"setYoloHuntPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"totalAmbushed","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalTimesHunted","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":[{"internalType":"uint256","name":"id","type":"uint256"}],"name":"unlockWolf","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"}],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"wolves","outputs":[{"internalType":"uint256","name":"lastHuntedWindow","type":"uint256"},{"internalType":"uint256","name":"points","type":"uint256"},{"internalType":"uint256","name":"timesHunted","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"wolvesContract","outputs":[{"internalType":"contract IWolves","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"id","type":"uint256"}],"name":"yoloHunt","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"yoloHuntPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"}]

60a08060405234610ca257600060c08261488a80380380916100218285610cd8565b833981010312610bd15761003482610cfb565b9161004160208201610cfb565b9061004e60408201610cfb565b61005a60608301610cfb565b9061007360a061006c60808601610cfb565b9401610cfb565b933315610c8e5760028054336001600160a01b03198216811790925560405191906001600160a01b03167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08980a3600160035586600455650b5e620f4800600555660470de4df82000600655660470de4df8200060075566038d7ea4c6800060085560ff196009541660095561a8c0600a5563665bb600600b5561011681610ca7565b600181526019602082015260326040820152606460608201526096608082015260fa60a08201526101f460c0820152601354600760135580600710610c40575b506013875260008051602061486a8339815191529790875b60078110610c28575050601480546001600160a01b039283166001600160a01b031991821617909155601580549383169382169390931790925560809290925260178054939092169216821790559293508392803b15610c0357839060046040518097819363784c3b3d60e11b83525af18015610c1d57610c08575b60175492935083926001600160a01b0316803b15610c0357838091600460405180948193634e606c4760e01b83525af1908115610bf8578491610be3575b5050601680546001600160a01b0319166001600160a01b0392909216918217905590813b15610bdf576040516336b91f2b60e01b81526001600160a01b0390911660048201529082908290602490829084905af18015610bd457610bbc575b505060405161029581610ca7565b610bb881526006602082016109c48152604083016106a48152606084016104b0815260808501906103e8825260a08601926101f4845260c087019460648652888052600e60205260408920975188555160018801555160028701555160038601555160048501555160058401555191015560405161031281610ca7565b6103e881526006602082016105dc815260408301610960815260608401610960815260808501906105dc825260a08601926103e8845260c087019460c8865260018952600e60205260408920975188555160018801555160028701555160038601555160048501555160058401555191015560405161039081610ca7565b6103e881526006602082016105dc815260408301610960815260608401610960815260808501906105dc825260a08601926103e8845260c087019460c8865260028952600e60205260408920975188555160018801555160028701555160038601555160048501555160058401555191015560405161040e81610ca7565b611bbc81526006602082018381526040830184815260608401858152608085019086825260a08601926109c4845260c0870194610190865260038952600e602052604089209751885551600188015551600287015551600386015551600485015551600584015551910155604051611840810181811060018060401b03821117610ba8576040526102148152610246602082015261026c604082015261029e60608201526102a760808201526102cd60a08201526102db60c08201526102df60e08201526102ee6101008201526102f26101208201526102f36101408201526102f46101608201526103086101808201526103376101a08201526103596101c082015261036f6101e082015261038b6102008201526103b56102208201526103e16102408201526104306102608201526104456102808201526104486102a08201526104506102c082015261045a6102e082015261046c61030082015261047861032082015261047d6103408201526104876103608201526104976103808201526104986103a08201526104a16103c08201526104c46103e08201526104d86104008201526104e56104208201526104ed6104408201526104f76104608201526105106104808201526105326104a08201526105356104c082015261053d6104e082015261055b61050082015261056a61052082015261057761054082015261057e6105608201526105af6105808201526105b16105a08201526105db6105c08201526105dc6105e08201526105e56106008201526105eb6106208201526105f36106408201526105f86106608201526105f96106808201526106056106a082015261061a6106c082015261063c6106e082015261064661070082015261065a61072082015261066b61074082015261066e61076082015261069b6107808201526106a26107a08201526106df6107c08201526107036107e082015261071a6108008201526107206108208201526107656108408201526107706108608201526107b86108808201526107ce6108a08201526107cf6108c08201526108486108e08201526108636109008201526108826109208201526108896109408201526108aa6109608201526108ce61098082015261091d6109a08201526109296109c08201526109666109e082015261096b610a0082015261098f610a20820152610992610a408201526109b0610a608201526109ba610a808201526109ce610aa0820152610a22610ac0820152610a2e610ae0820152610a36610b00820152610a3a610b20820152610a45610b40820152610a48610b60820152610a76610b80820152610a77610ba0820152610a78610bc0820152610a7c610be0820152610a7d610c00820152610a88610c20820152610aef610c40820152610b1b610c60820152610b48610c80820152610b54610ca0820152610b80610cc0820152610b92610ce0820152610bd5610d00820152610bf1610d20820152610bf8610d40820152610c03610d60820152610c06610d80820152610c16610da0820152610c21610dc0820152610c22610de0820152610c29610e00820152610c31610e20820152610c46610e40820152610c59610e60820152610c78610e80820152610c88610ea0820152610cf6610ec0820152610d09610ee0820152610d1d610f00820152610d30610f20820152610d52610f40820152610d7a610f60820152610d93610f80820152610db5610fa0820152610dcb610fc0820152610dde610fe0820152610dff611000820152610e37611020820152610e62611040820152610e63611060820152610e77611080820152610e966110a0820152610e9c6110c0820152610ec56110e0820152610ed6611100820152610ee0611120820152610f03611140820152610f16611160820152610f3f611180820152610f7c6111a0820152610f826111c0820152610f856111e0820152610f8a611200820152610fa66112208201526107da611240820152610fc0611260820152610fd3611280820152610fd46112a0820152610ffd6112c08201526110056112e082015261101261130082015261101f61132082015261102b6113408201526110a56113608201526110c76113808201526110c96113a08201526110d86113c08201526110f86113e08201526110f961140082015261110261142082015261111b61144082015261114361146082015261116661148082015261116e6114a08201526111886114c08201526111946114e08201526111a36115008201526111ca61152082015261121061154082015261122261156082015261124661158082015261125e6115a08201526112736115c08201526112766115e082015261128161160082015261128861162082015261128f6116408201526112a76116608201526112f56116808201526113476116a082015261134f6116c08201526113866116e08201526113886117008201526113916117208201526113d26117408201526113fd61176082015261140c61178082015261143d6117a08201526114556117c0820152610a796117e0820152610672611800820152610a2a611820820152815b60c2811015610b905760019061ffff8160051b8401511684526010602052604084208260ff1982541617905501610b5e565b604051613b5a9081610d1082396080518161115d0152f35b634e487b7160e01b83526041600452602483fd5b81610bc691610cd8565b610bd1578038610287565b80fd5b6040513d84823e3d90fd5b5050fd5b81610bed91610cd8565b610bdf578238610228565b6040513d86823e3d90fd5b505050fd5b91909281610c1591610cd8565b9082906101ea565b6040513d85823e3d90fd5b600190602061ffff845116930192818c01550161016e565b6013885260008051602061486a833981519152017f66de8ffda797e3de9c05e8fc57b3bf0ec28a930d40b0d285d93c06501cf6a0975b818110610c835750610156565b888155600101610c76565b631e4fbdf760e01b86526004869052602486fd5b600080fd5b60e081019081106001600160401b03821117610cc257604052565b634e487b7160e01b600052604160045260246000fd5b601f909101601f19168101906001600160401b03821190821017610cc257604052565b51906001600160a01b0382168203610ca25756fe608080604052600436101561001357600080fd5b60003560e01c90816301ac4e561461304a5750806308154ca514612fdf5780630f67e7d514612fb557806311c3ea9d14612f745780631869ebda14612ef25780631cd36edb14612ed457806323cdc28d14612eb657806324715cc214612e73578063296ce5cb14612bd45780632cd14e0e14612bb65780632e6d934314612b8e5780633333510614612b705780633ec1d63014612afe5780634e62c20e14612a9e5780634fc3f41a14612a33578063507f86aa146129fb57806351cff8d9146129a357806352c8a185146126f8578063579620f8146125cd5780635bd5571c146123895780636046985d14612368578063672711201461231d578063673d633b146122ff5780636dcf151e146120d357806370e6824c14612059578063715018a614611ffe5780637460b27214611fdd57806375ce7fff14611fa0578063787a08a614611f825780637af77eaa14611f645780637e55bb8214611c99578063837d76741461093c578063886f690614611c1e5780638a34c85314611c005780638d2baff914611bb55780638da5cb5b14611b8e5780638f66453a14611b1b5780639090109e14611af457806397d7577614611acd5780639b60c9bb1461193c578063a8881dfd1461169e578063aa894b26146115fb578063b3f6b99a14611102578063b783bdb7146110d1578063beae631814610dc9578063c2d94aec14610d15578063c4f8f27b14610ce9578063c8a3bc3d14610cc2578063cd64e18214610c98578063d6e18b0114610c41578063dfbc852d14610968578063ebd9af841461093c578063f2fde38b1461089a578063f710118214610879578063fa76338c146107dd578063fb6be44a146106035763fcde5ca11461029257600080fd5b60203660031901126105f6576004356001600160a01b03601454166040516318160ddd60e01b8152602081600481855afa90811561054f576000916105cc575b5082101561055b576020602491604051928380926331a9108f60e11b82528660048301525afa801561054f5761031b91600091610520575b506001600160a01b031633146132a8565b80600052600c60205261034c60406000205461034561033c600b5442613176565b600a5490613183565b14156132f3565b610354613979565b80600052600d60205261037b60ff600160406000200154166103758161316c565b1561333e565b610395600160ff6009541661038f8161316c565b14613389565b6103a36005543410156133d4565b8060005260116020526103bb6040600020541561341f565b6000818152600d602052604090206001818101805461ffff1916909117905542905561042a6104176104256040516103f2816131a3565b338152846020820152426040820152600060608201526040519283916020830161346a565b03601f19810183528261320d565b6139e7565b60405191610437836131a3565b338352600360208401938285526040810142815260608201956000875285600052600f6020526001600160a01b03806040600020945116166001600160a01b031984541617835551600183015551600282015501925191600483101561050a57600093849360ff80198354169116179055818352600c6020526104dc604084206040519283526020830190600260409180548452600181015460208501520154910152565b7f90265a6b54a9a33fe0271586d9d32316d70e467783528541adb25210a4c74bc760803392a4600160035580f35b634e487b7160e01b600052602160045260246000fd5b610542915060203d602011610548575b61053a818361320d565b81019061323e565b3861030a565b503d610530565b6040513d6000823e3d90fd5b50602460206001600160a01b0360155416604051928380926331a9108f60e11b82528660048301525afa801561054f576105a8916000916105ad575b506001600160a01b0316331461325d565b61031b565b6105c6915060203d6020116105485761053a818361320d565b38610597565b90506020813d6020116105fb575b816105e76020938361320d565b810103126105f65751386102d2565b600080fd5b3d91506105da565b60203660031901126105f6576004356001600160a01b03601454166040516318160ddd60e01b8152602081600481855afa90811561054f576000916107ab575b5082101561073b576020602491604051928380926331a9108f60e11b82528660048301525afa801561054f5761068b9160009161071c57506001600160a01b031633146132a8565b610693613979565b6106a7600160ff6009541661038f8161316c565b6106b56008543410156133d4565b8060005260116020526106cd6040600020541561341f565b806000526011602052426040600020556106e8601254613928565b6012557fd5408323c5a9a8db6d94135cd1218ada92c6e2e5afbb9b412a703a8398f021096020604051428152a26001600355005b610735915060203d6020116105485761053a818361320d565b8361030a565b50602460206001600160a01b0360155416604051928380926331a9108f60e11b82528660048301525afa801561054f576107879160009161078c57506001600160a01b0316331461325d565b61068b565b6107a5915060203d6020116105485761053a818361320d565b83610597565b90506020813d6020116107d5575b816107c66020938361320d565b810103126105f6575183610643565b3d91506107b9565b346105f65760203660031901126105f6576004356107f9613937565b80600052600d602052610821600160ff81604060002001541661081b8161316c565b14613620565b80600052600d60205260406000205461025881018091116108635761084890421015613678565b6000908152600d60205260409020600101805460ff19169055005b634e487b7160e01b600052601160045260246000fd5b346105f65760203660031901126105f657610892613937565b600435600755005b346105f65760203660031901126105f6576001600160a01b036108bb61306e565b6108c3613937565b16801561090d576001600160a01b03600254826001600160a01b0319821617600255167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0600080a3005b7f1e4fbdf700000000000000000000000000000000000000000000000000000000600052600060045260246000fd5b346105f65760203660031901126105f65760043560005260116020526020604060002054604051908152f35b610971366130db565b610979613979565b610993600160ff6009541661098d8161316c565b146136c3565b61099e81151561370e565b6109b56109ad82600654613759565b34101561376c565b60005b8181106109c6576001600355005b6109d18183856137b7565b3590611456821015610bb757602460206001600160a01b0360145416604051928380926331a9108f60e11b82528760048301525afa90811561054f57600091610b99575b506001600160a01b0316331480610b85575b610a30906137c7565b816000526011602052610a486040600020541561341f565b6000828152600d6020526040902060018101805461ffff1916610101179055429055610aa4610417610425604051610a7f816131a3565b338152856020820152426040820152600160608201526040519283916020830161346a565b9160405190610ab2826131a3565b338252600360208301928284526040810142815260608201946001865287600052600f6020526001600160a01b03806040600020945116166001600160a01b031984541617835551600183015551600282015501915193600485101561050a57610b596040600196879560009160ff80198354169116179055848152600c602052206040519283526020830190600260409180548452600181015460208501520154910152565b7f90265a6b54a9a33fe0271586d9d32316d70e467783528541adb25210a4c74bc760803392a4016109b8565b50610a30610b92836134a6565b9050610a27565b610bb1915060203d81116105485761053a818361320d565b85610a15565b602460206001600160a01b0360155416604051928380926331a9108f60e11b82528760048301525afa90811561054f57600091610c23575b506001600160a01b0316331480610c0f575b610c0a906137c7565b610a30565b50610c0a610c1c836134a6565b9050610c01565b610c3b915060203d81116105485761053a818361320d565b85610bef565b346105f65760203660031901126105f657600435600052600d60205260606040600020610c966001825492015460ff8116604051938452610c818161316c565b602084015260ff604084019160081c1661309d565bf35b346105f65760003660031901126105f657602060ff6009541660405190610cbe8161316c565b8152f35b346105f65760003660031901126105f65760206001600160a01b0360165416604051908152f35b346105f65760203660031901126105f65760043560005260016020526020604060002054604051908152f35b346105f65760203660031901126105f65760006020610d8f610d3561306e565b610d3d613937565b6017546040517f860043b60000000000000000000000000000000000000000000000000000000081523060048201526001600160a01b0392831660248201529485939190921691839182906044820190565b03925af1801561054f57610d9f57005b610dc09060203d602011610dc2575b610db8818361320d565b81019061322f565b005b503d610dae565b610dd2366130db565b610dda613979565b610dee600160ff6009541661098d8161316c565b801561108d57610e036109ad82600554613759565b60005b818110610e14576001600355005b610e1f8183856137b7565b359061145682101561100357602460206001600160a01b0360145416604051928380926331a9108f60e11b82528760048301525afa90811561054f57600091610fe5575b506001600160a01b0316331480610fd1575b610e7e906137c7565b816000526011602052610e966040600020541561341f565b6000828152600d602052604090206001818101805461ffff19169091179055429055610ef2610417610425604051610ecd816131a3565b338152856020820152426040820152600060608201526040519283916020830161346a565b60405192610eff846131a3565b338452600360208501948286526040810142815260608201966000885285600052600f6020526001600160a01b03806040600020945116166001600160a01b031984541617835551600183015551600282015501935191600483101561050a5760019460009360ff80198354169116179055818352600c602052610fa5604084206040519283526020830190600260409180548452600181015460208501520154910152565b7f90265a6b54a9a33fe0271586d9d32316d70e467783528541adb25210a4c74bc760803392a401610e06565b50610e7e610fde836134a6565b9050610e75565b610ffd915060203d81116105485761053a818361320d565b85610e63565b602460206001600160a01b0360155416604051928380926331a9108f60e11b82528760048301525afa90811561054f5760009161106f575b506001600160a01b031633148061105b575b611056906137c7565b610e7e565b50611056611068836134a6565b905061104d565b611087915060203d81116105485761053a818361320d565b8561103b565b606460405162461bcd60e51b815260206004820152601a60248201527f4e6f2076616c696420776f6c66204944732070726f76696465640000000000006044820152fd5b346105f65760203660031901126105f6576004356000526010602052602060ff604060002054166040519015158152f35b346105f65760403660031901126105f65760243567ffffffffffffffff81116105f657366023820112156105f657806004013567ffffffffffffffff81116105f65780820160248101903682116105f6576001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001633036115b757604090849003126105f657604483013567ffffffffffffffff81116105f657830190806043830112156105f65781604460246111c294013591016138ce565b918251830191604084602085019403126105f65760208401519360408101519067ffffffffffffffff82116105f657019280603f850112156105f657602084015161120c8161353e565b9161121a604051938461320d565b818352604086830101116105f657611246946040602061123c94019101613905565b60243692016138ce565b602081519101208160005260016020526040600020541460ff6112688361312f565b90549060031b1c16156115735761127b57005b60405160208101906004358252306040820152466060820152826080820152608081526112a960a08261320d565b5190209080600052600f6020526040600020604051906112c8826131a3565b6001600160a01b03815416825260ff60036001830154926020850193845260028101546040860152015416916060810192600481101561050a5783526001600160a01b038151161561152f578151600052600c60205260406000209251600481101561050a5761133790613084565b9460405190611345826131f1565b86548252600187015496602083019788526002810154916040840192835260038201546060850190815261271060048401549260808701938452600660058601549560a08901968752015460c0880152069360009a604051966113a7886131f1565b5187525160208701525160408601525160608501525160808401525160a083015261271060c083015260069660005b600781101561151d576113f26000928260051b8601519061366b565b9182841061140357506001016113d6565b92509750506001600160a01b039291505061141d866130aa565b90549060031b1c6114336001860191825461366b565b90555b61144561033c600b5442613176565b8455600284016114558154613928565b90558251600052600d602052600160406000200160ff19815416905584600052600f6020526000600360408220828155826001820155826002820155015561149e600454613928565b60045551169051916114cf604051918583526020830190600260409180548452600181015460208501520154910152565b600785101561050a5760a08161150b9660807f0abcf5161f130a8d1c7d3620dff461bca2d8b723b884877d378d75f335ef4872940152a361312f565b60ff82549160031b1b19169055600080f35b505050506001600160a01b0390611436565b606460405162461bcd60e51b815260206004820152601160248201527f52657175657374206e6f7420666f756e640000000000000000000000000000006044820152fd5b606460405162461bcd60e51b815260206004820152601c60248201527f726571756573742066756c66696c6c6564206f72206d697373696e67000000006044820152fd5b606460405162461bcd60e51b815260206004820152600d60248201527f6f6e6c79206f70657261746f72000000000000000000000000000000000000006044820152fd5b346105f657611609366130db565b611611613937565b601354810361165a5760005b81811061162657005b8061163460019284866137b7565b3561163e826130aa565b819291549060031b91821b91600019901b19161790550161161d565b606460405162461bcd60e51b815260206004820152601660248201527f496e76616c69642072657761726473206c656e677468000000000000000000006044820152fd5b60203660031901126105f6576004356001600160a01b03601454166040516318160ddd60e01b8152602081600481855afa90811561054f5760009161190a575b508210156118b9576020602491604051928380926331a9108f60e11b82528660048301525afa801561054f576117269160009161071c57506001600160a01b031633146132a8565b80600052600c60205261174760406000205461034561033c600b5442613176565b61174f613979565b80600052600d60205261177060ff600160406000200154166103758161316c565b611784600160ff6009541661038f8161316c565b6117926007543410156133d4565b8060005260116020526117aa6040600020541561341f565b6000818152600d6020526040902060018101805461ffff19166103011790554290556118066104176104256040516117e1816131a3565b338152846020820152426040820152600360608201526040519283916020830161346a565b9060405190611814826131a3565b3382526003602083019282845260408101428152606082019483865286600052600f6020526001600160a01b03806040600020945116166001600160a01b031984541617835551600183015551600282015501915192600484101561050a5760039260009460ff80198354169116179055818452600c6020526104dc604085206040519283526020830190600260409180548452600181015460208501520154910152565b50602460206001600160a01b0360155416604051928380926331a9108f60e11b82528660048301525afa801561054f576119059160009161078c57506001600160a01b0316331461325d565b611726565b90506020813d602011611934575b816119256020938361320d565b810103126105f65751836116de565b3d9150611918565b60203660031901126105f6576004356001600160a01b03601454166040516318160ddd60e01b8152602081600481855afa90811561054f57600091611a9b575b50821015611a4a576020602491604051928380926331a9108f60e11b82528660048301525afa801561054f576119c49160009161071c57506001600160a01b031633146132a8565b80600052600c6020526119e560406000205461034561033c600b5442613176565b6119ed613979565b80600052600d602052611a0e60ff600160406000200154166103758161316c565b611a22600160ff6009541661038f8161316c565b806000526010602052611a3c60ff60406000205416613883565b6117926005543410156133d4565b50602460206001600160a01b0360155416604051928380926331a9108f60e11b82528660048301525afa801561054f57611a969160009161078c57506001600160a01b0316331461325d565b6119c4565b90506020813d602011611ac5575b81611ab66020938361320d565b810103126105f657518361197c565b3d9150611aa9565b346105f65760003660031901126105f65760206001600160a01b0360175416604051908152f35b346105f65760003660031901126105f65760206001600160a01b0360155416604051908152f35b346105f6576101003660031901126105f65760043560048110156105f65760e03660231901126105f657611b5690611b51613937565b613084565b602435815560443560018201556064356002820155608435600382015560a435600482015560c435600582015560e435600690910155005b346105f65760003660031901126105f65760206001600160a01b0360025416604051908152f35b346105f65760203660031901126105f6576001600160a01b03611bd661306e565b611bde613937565b16611bea811515613838565b6001600160a01b03196014541617601455600080f35b346105f65760003660031901126105f6576020600754604051908152f35b346105f65760203660031901126105f657600060408051611c3e816131d5565b8281528260208201520152600435600052600c60205260606040600020604051611c67816131d5565b815491828252604060026001830154926020850193845201549201918252604051928352516020830152516040820152f35b611ca2366130db565b611caa613979565b611cbe600160ff6009541661098d8161316c565b611cc981151561370e565b611cd86109ad82600754613759565b60005b818110611ce9576001600355005b611cf48183856137b7565b3590611456821015611eda57602460206001600160a01b0360145416604051928380926331a9108f60e11b82528760048301525afa90811561054f57600091611ebc575b506001600160a01b0316331480611ea8575b611d53906137c7565b816000526011602052611d6b6040600020541561341f565b6000828152600d6020526040902060018101805461ffff1916610301179055429055611dc7610417610425604051611da2816131a3565b338152856020820152426040820152600360608201526040519283916020830161346a565b9160405190611dd5826131a3565b3382526003602083019282845260408101428152606082019483865287600052600f6020526001600160a01b03806040600020945116166001600160a01b031984541617835551600183015551600282015501915193600485101561050a57611e7c604060019660039560009160ff80198354169116179055848152600c602052206040519283526020830190600260409180548452600181015460208501520154910152565b7f90265a6b54a9a33fe0271586d9d32316d70e467783528541adb25210a4c74bc760803392a401611cdb565b50611d53611eb5836134a6565b9050611d4a565b611ed4915060203d81116105485761053a818361320d565b85611d38565b602460206001600160a01b0360155416604051928380926331a9108f60e11b82528760048301525afa90811561054f57600091611f46575b506001600160a01b0316331480611f32575b611f2d906137c7565b611d53565b50611f2d611f3f836134a6565b9050611f24565b611f5e915060203d81116105485761053a818361320d565b85611f12565b346105f65760003660031901126105f6576020601254604051908152f35b346105f65760003660031901126105f6576020600a54604051908152f35b346105f65760203660031901126105f6576004356000548110156105f65760ff611fcb60209261312f565b90549060031b1c166040519015158152f35b346105f65760203660031901126105f657611ff6613937565b600435600655005b346105f65760003660031901126105f657612017613937565b60006001600160a01b036002546001600160a01b03198116600255167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08280a3005b346105f65760203660031901126105f65760006020610d8f61207961306e565b612081613937565b6017546040517f954fa5ee0000000000000000000000000000000000000000000000000000000081523060048201526001600160a01b0392831660248201529485939190921691839182906044820190565b6120dc366130db565b6120e4613979565b6120f8600160ff6009541661098d8161316c565b61210381151561370e565b6121126109ad82600554613759565b60005b818110612123576001600355005b61212e8183856137b7565b359081600052601060205261214a60ff60406000205416613883565b602460206001600160a01b0360145416604051928380926331a9108f60e11b82528760048301525afa90811561054f576000916122e1575b506001600160a01b03163314806122cd575b61219d906137c7565b8160005260116020526121b56040600020541561341f565b6000828152600d6020526040902060018101805461ffff19166103011790554290556121ec610417610425604051611da2816131a3565b91604051906121fa826131a3565b3382526003602083019282845260408101428152606082019483865287600052600f6020526001600160a01b03806040600020945116166001600160a01b031984541617835551600183015551600282015501915193600485101561050a576122a1604060019660039560009160ff80198354169116179055848152600c602052206040519283526020830190600260409180548452600181015460208501520154910152565b7f90265a6b54a9a33fe0271586d9d32316d70e467783528541adb25210a4c74bc760803392a401612115565b5061219d6122da836134a6565b9050612194565b6122f9915060203d81116105485761053a818361320d565b85612182565b346105f65760003660031901126105f6576020600554604051908152f35b346105f65760203660031901126105f6576001600160a01b0361233e61306e565b612346613937565b16612352811515613838565b6001600160a01b03196015541617601555600080f35b346105f65760203660031901126105f657612381613937565b600435600555005b612392366130db565b61239a613979565b6123ae600160ff6009541661098d8161316c565b6123b981151561370e565b6123c86109ad82600554613759565b60005b8181106123d9576001600355005b6123e48183856137b7565b35906123f2608383106135d5565b602460206001600160a01b0360145416604051928380926331a9108f60e11b82528760048301525afa90811561054f576000916125af575b506001600160a01b031633148061259b575b612445906137c7565b81600052601160205261245d6040600020541561341f565b6000828152600d6020526040902060018101805461ffff19166102011790554290556124b9610417610425604051612494816131a3565b338152856020820152426040820152600260608201526040519283916020830161346a565b91604051906124c7826131a3565b338252600360208301928284526040810142815260608201946002865287600052600f6020526001600160a01b03806040600020945116166001600160a01b031984541617835551600183015551600282015501915193600485101561050a5761256f604060019660029560009160ff80198354169116179055848152600c602052206040519283526020830190600260409180548452600181015460208501520154910152565b7f90265a6b54a9a33fe0271586d9d32316d70e467783528541adb25210a4c74bc760803392a4016123cb565b506124456125a8836134a6565b905061243c565b6125c7915060203d81116105485761053a818361320d565b8561242a565b346105f65760203660031901126105f6576004356125e9613979565b80600052600d60205261260b600160ff81604060002001541661081b8161316c565b80600052600d60205260406000205461025881018091116108635761263290421015613678565b80600052600d60205260ff60016040600020015460081c16600481101561050a576001146126d2575b80600052600d60205260ff60016040600020015460081c16600481101561050a576003146126a6575b600052600d602052600160406000200160ff1981541690556001600355600080f35b6126b13315156134f3565b6126cd6000808080600754335af16126c761355a565b5061358a565b612684565b6126dd3315156134f3565b6126f36000808080600654335af16126c761355a565b61265b565b60203660031901126105f6576004356001600160a01b03601454166040516318160ddd60e01b8152602081600481855afa90811561054f57600091612971575b50821015612920576020602491604051928380926331a9108f60e11b82528660048301525afa801561054f576127809160009161071c57506001600160a01b031633146132a8565b80600052600c6020526127a160406000205461034561033c600b5442613176565b6127a9613979565b80600052600d6020526127ca60ff600160406000200154166103758161316c565b6127de600160ff6009541661038f8161316c565b6127ea608382106135d5565b6127f86005543410156133d4565b8060005260116020526128106040600020541561341f565b6000818152600d6020526040902060018101805461ffff191661020117905542905561286c610417610425604051612847816131a3565b338152846020820152426040820152600260608201526040519283916020830161346a565b906040519061287a826131a3565b338252600360208301928284526040810142815260608201946002865286600052600f6020526001600160a01b03806040600020945116166001600160a01b031984541617835551600183015551600282015501915192600484101561050a5760029260009460ff80198354169116179055818452600c6020526104dc604085206040519283526020830190600260409180548452600181015460208501520154910152565b50602460206001600160a01b0360155416604051928380926331a9108f60e11b82528660048301525afa801561054f5761296c9160009161078c57506001600160a01b0316331461325d565b612780565b90506020813d60201161299b575b8161298c6020938361320d565b810103126105f6575183612738565b3d915061297f565b346105f65760203660031901126105f6576129f460008080806001600160a01b036129cc61306e565b6129d4613937565b6129dc613979565b166129e88115156134f3565b47905af16126c761355a565b6001600355005b346105f65760203660031901126105f6576004356013548110156105f657612a246020916130aa565b90549060031b1c604051908152f35b346105f65760203660031901126105f657600435612a4f613937565b8015612a5a57600a55005b606460405162461bcd60e51b815260206004820152601a60248201527f436f6f6c646f776e206d75737420626520706f7369746976652e0000000000006044820152fd5b346105f65760203660031901126105f657600435600052600f60205260806040600020610c966001600160a01b038254169160018101549060ff60036002830154920154169160405194855260208501526040840152606083019061309d565b346105f65760203660031901126105f65760043560048110156105f657612b2660e091613084565b805490600181015490600281015460038201546004830154916006600585015494015494604051968752602087015260408601526060850152608084015260a083015260c0820152f35b346105f65760003660031901126105f6576020600854604051908152f35b346105f65760203660031901126105f6576020612bac6004356134a6565b6040519015158152f35b346105f65760003660031901126105f6576020600654604051908152f35b60203660031901126105f6576004356001600160a01b03601454166040516318160ddd60e01b8152602081600481855afa90811561054f57600091612e41575b50821015612df0576020602491604051928380926331a9108f60e11b82528660048301525afa801561054f57612c5c9160009161071c57506001600160a01b031633146132a8565b80600052600c602052612c7d60406000205461034561033c600b5442613176565b612c85613979565b80600052600d602052612ca660ff600160406000200154166103758161316c565b612cba600160ff6009541661038f8161316c565b612cc86006543410156133d4565b806000526011602052612ce06040600020541561341f565b6000818152600d6020526040902060018101805461ffff1916610101179055429055612d3c610417610425604051612d17816131a3565b338152846020820152426040820152600160608201526040519283916020830161346a565b9060405190612d4a826131a3565b338252600360208301928284526040810142815260608201946001865286600052600f6020526001600160a01b03806040600020945116166001600160a01b031984541617835551600183015551600282015501915192600484101561050a5760019260009460ff80198354169116179055818452600c6020526104dc604085206040519283526020830190600260409180548452600181015460208501520154910152565b50602460206001600160a01b0360155416604051928380926331a9108f60e11b82528660048301525afa801561054f57612e3c9160009161078c57506001600160a01b0316331461325d565b612c5c565b90506020813d602011612e6b575b81612e5c6020938361320d565b810103126105f6575183612c14565b3d9150612e4f565b346105f65760203660031901126105f657600435600052600c60205260606040600020805490600260018201549101549060405192835260208301526040820152f35b346105f65760003660031901126105f6576020600454604051908152f35b346105f65760003660031901126105f6576020600b54604051908152f35b346105f65760403660031901126105f657612f0b61306e565b612f13613937565b60206001600160a01b036064816017541693600060405195869485937ff971966200000000000000000000000000000000000000000000000000000000855230600486015216602484015260243560448401525af1801561054f57610d9f57005b346105f65760203660031901126105f657600435612f90613937565b612f998161316c565b612fa28161316c565b60ff801960095416911617600955600080f35b346105f65760003660031901126105f6576020612fd761033c600b5442613176565b604051908152f35b346105f65760203660031901126105f657600435612ffb613937565b801561300657600b55005b606460405162461bcd60e51b815260206004820152601f60248201527f496e76616c69642074696d657374616d7020666f722066756c6c4d6f6f6e2e006044820152fd5b346105f65760003660031901126105f6576020906001600160a01b03601454168152f35b600435906001600160a01b03821682036105f657565b600481101561050a57600052600e602052604060002090565b90600482101561050a5752565b6013548110156130c557601360005260206000200190600090565b634e487b7160e01b600052603260045260246000fd5b9060206003198301126105f65760043567ffffffffffffffff81116105f657826023820112156105f65780600401359267ffffffffffffffff84116105f65760248460051b830101116105f6576024019190565b906000548210156130c55760008052600582901c7f290decd9548b62a8d60345a988386fc84ba6bc95484008f6362f93160ef3e5630191601f1690565b6002111561050a57565b9190820391821161086357565b811561318d570490565b634e487b7160e01b600052601260045260246000fd5b6080810190811067ffffffffffffffff8211176131bf57604052565b634e487b7160e01b600052604160045260246000fd5b6060810190811067ffffffffffffffff8211176131bf57604052565b60e0810190811067ffffffffffffffff8211176131bf57604052565b90601f8019910116810190811067ffffffffffffffff8211176131bf57604052565b908160209103126105f6575190565b908160209103126105f657516001600160a01b03811681036105f65790565b1561326457565b606460405162461bcd60e51b815260206004820152601f60248201527f53656e64657220646f6573206e6f74206f776e2074686520706172746e6572006044820152fd5b156132af57565b606460405162461bcd60e51b815260206004820152601c60248201527f53656e64657220646f6573206e6f74206f776e2074686520776f6c66000000006044820152fd5b156132fa57565b606460405162461bcd60e51b815260206004820152601e60248201527f5468697320776f6c66206973207374696c6c20696e20636f6f6c646f776e00006044820152fd5b1561334557565b606460405162461bcd60e51b815260206004820152601860248201527f576f6c662069732063757272656e746c79206c6f636b656400000000000000006044820152fd5b1561339057565b606460405162461bcd60e51b815260206004820152601060248201527f48756e74696e672064697361626c6564000000000000000000000000000000006044820152fd5b156133db57565b606460405162461bcd60e51b815260206004820152600f60248201527f4e6f7420656e6f756768206665657300000000000000000000000000000000006044820152fd5b1561342657565b606460405162461bcd60e51b815260206004820152601060248201527f576f6c6620697320616d627573686564000000000000000000000000000000006044820152fd5b6134a49092919260608060808301956001600160a01b0381511684526020810151602085015260408101516040850152015191019061309d565b565b80600052600d60205260ff600160406000200154166134c48161316c565b1590816134cf575090565b9050600052600c6020526040600020546134ee61033c600b5442613176565b141590565b156134fa57565b606460405162461bcd60e51b815260206004820152600f60248201527f494e56414c49445f4144445245535300000000000000000000000000000000006044820152fd5b67ffffffffffffffff81116131bf57601f01601f191660200190565b3d15613585573d9061356b8261353e565b91613579604051938461320d565b82523d6000602084013e565b606090565b1561359157565b606460405162461bcd60e51b815260206004820152601160248201527f5749544844524157414c5f4641494c45440000000000000000000000000000006044820152fd5b156135dc57565b606460405162461bcd60e51b815260206004820152601360248201527f576f6c66206973206e6f74206e75636c656172000000000000000000000000006044820152fd5b1561362757565b606460405162461bcd60e51b815260206004820152600f60248201527f576f6c66206e6f74206c6f636b656400000000000000000000000000000000006044820152fd5b9190820180921161086357565b1561367f57565b606460405162461bcd60e51b815260206004820152601760248201527f4c6f636b20706572696f64206e6f7420657870697265640000000000000000006044820152fd5b156136ca57565b606460405162461bcd60e51b815260206004820152601360248201527f48756e74696e672069732064697361626c6564000000000000000000000000006044820152fd5b1561371557565b606460405162461bcd60e51b815260206004820152600c60248201527f4e6f2056616c69642049647300000000000000000000000000000000000000006044820152fd5b8181029291811591840414171561086357565b1561377357565b606460405162461bcd60e51b815260206004820152602060248201527f496e73756666696369656e742066756e647320666f7220616c6c2068756e74736044820152fd5b91908110156130c55760051b0190565b156137ce57565b608460405162461bcd60e51b815260206004820152603160248201527f576f6c66206e6f74206f776e65642062792073656e646572206f72206e6f742060448201527f76616c696420666f722068756e74696e670000000000000000000000000000006064820152fd5b1561383f57565b606460405162461bcd60e51b815260206004820152600f60248201527f496e76616c6964206164647265737300000000000000000000000000000000006044820152fd5b1561388a57565b606460405162461bcd60e51b815260206004820152601660248201527f5468697320776f6c66206973206e6f74206120706967000000000000000000006044820152fd5b9291926138da8261353e565b916138e8604051938461320d565b8294818452818301116105f6578281602093846000960137010152565b60005b8381106139185750506000910152565b8181015183820152602001613908565b60001981146108635760010190565b6001600160a01b0360025416330361394b57565b7f118cdaa7000000000000000000000000000000000000000000000000000000006000523360045260246000fd5b60026003541461398a576002600355565b7f3ee5aeb50000000000000000000000000000000000000000000000000000000060005260046000fd5b90916060928252604060208301526139db8151809281604086015260208686019101613905565b601f01601f1916010190565b9060005491680100000000000000008310156131bf57613a436104179160018501600055613a148561312f565b5050613a1f8561312f565b81549060031b9060ff6001831b921b191617905560405192839186602084016139b4565b6364e62126194201428111610863576003900490600182019182811161086357600046600103613ad85750600501809211610863577fd91fc3685b930310b008ec37d2334870cab88a023ed8cc628a2e2ccd4e55d202915b6040516020810190613ab2816104178686866139b4565b519020856000526001602052604060002055613ad3604051928392836139b4565b0390a1565b9060029093929301809211613b105750907fd91fc3685b930310b008ec37d2334870cab88a023ed8cc628a2e2ccd4e55d20291613a9b565b80634e487b7160e01b602492526011600452fdfea2646970667358221220e009267e4915a057620d43a314687d1d778b5906def3503be4717a622dd77d4364736f6c634300081a003366de8ffda797e3de9c05e8fc57b3bf0ec28a930d40b0d285d93c06501cf6a0900000000000000000000000009b2ced8219bcf64cccaf69ed4c56aaf90e958a0b00000000000000000000000026dd746561e82c655f365df796fd33eaeea39652000000000000000000000000f3354ca7fca04524ced537a3ec016e67f8f32dc200000000000000000000000043000000000000000000000000000000000000020000000000000000000000002536fe9ab3f511540f2f9e2ec2a805005c3dd800000000000000000000000000b7501d1ef03b17076a814accf03d47a5e4af1c98

Deployed Bytecode

0x608080604052600436101561001357600080fd5b60003560e01c90816301ac4e561461304a5750806308154ca514612fdf5780630f67e7d514612fb557806311c3ea9d14612f745780631869ebda14612ef25780631cd36edb14612ed457806323cdc28d14612eb657806324715cc214612e73578063296ce5cb14612bd45780632cd14e0e14612bb65780632e6d934314612b8e5780633333510614612b705780633ec1d63014612afe5780634e62c20e14612a9e5780634fc3f41a14612a33578063507f86aa146129fb57806351cff8d9146129a357806352c8a185146126f8578063579620f8146125cd5780635bd5571c146123895780636046985d14612368578063672711201461231d578063673d633b146122ff5780636dcf151e146120d357806370e6824c14612059578063715018a614611ffe5780637460b27214611fdd57806375ce7fff14611fa0578063787a08a614611f825780637af77eaa14611f645780637e55bb8214611c99578063837d76741461093c578063886f690614611c1e5780638a34c85314611c005780638d2baff914611bb55780638da5cb5b14611b8e5780638f66453a14611b1b5780639090109e14611af457806397d7577614611acd5780639b60c9bb1461193c578063a8881dfd1461169e578063aa894b26146115fb578063b3f6b99a14611102578063b783bdb7146110d1578063beae631814610dc9578063c2d94aec14610d15578063c4f8f27b14610ce9578063c8a3bc3d14610cc2578063cd64e18214610c98578063d6e18b0114610c41578063dfbc852d14610968578063ebd9af841461093c578063f2fde38b1461089a578063f710118214610879578063fa76338c146107dd578063fb6be44a146106035763fcde5ca11461029257600080fd5b60203660031901126105f6576004356001600160a01b03601454166040516318160ddd60e01b8152602081600481855afa90811561054f576000916105cc575b5082101561055b576020602491604051928380926331a9108f60e11b82528660048301525afa801561054f5761031b91600091610520575b506001600160a01b031633146132a8565b80600052600c60205261034c60406000205461034561033c600b5442613176565b600a5490613183565b14156132f3565b610354613979565b80600052600d60205261037b60ff600160406000200154166103758161316c565b1561333e565b610395600160ff6009541661038f8161316c565b14613389565b6103a36005543410156133d4565b8060005260116020526103bb6040600020541561341f565b6000818152600d602052604090206001818101805461ffff1916909117905542905561042a6104176104256040516103f2816131a3565b338152846020820152426040820152600060608201526040519283916020830161346a565b03601f19810183528261320d565b6139e7565b60405191610437836131a3565b338352600360208401938285526040810142815260608201956000875285600052600f6020526001600160a01b03806040600020945116166001600160a01b031984541617835551600183015551600282015501925191600483101561050a57600093849360ff80198354169116179055818352600c6020526104dc604084206040519283526020830190600260409180548452600181015460208501520154910152565b7f90265a6b54a9a33fe0271586d9d32316d70e467783528541adb25210a4c74bc760803392a4600160035580f35b634e487b7160e01b600052602160045260246000fd5b610542915060203d602011610548575b61053a818361320d565b81019061323e565b3861030a565b503d610530565b6040513d6000823e3d90fd5b50602460206001600160a01b0360155416604051928380926331a9108f60e11b82528660048301525afa801561054f576105a8916000916105ad575b506001600160a01b0316331461325d565b61031b565b6105c6915060203d6020116105485761053a818361320d565b38610597565b90506020813d6020116105fb575b816105e76020938361320d565b810103126105f65751386102d2565b600080fd5b3d91506105da565b60203660031901126105f6576004356001600160a01b03601454166040516318160ddd60e01b8152602081600481855afa90811561054f576000916107ab575b5082101561073b576020602491604051928380926331a9108f60e11b82528660048301525afa801561054f5761068b9160009161071c57506001600160a01b031633146132a8565b610693613979565b6106a7600160ff6009541661038f8161316c565b6106b56008543410156133d4565b8060005260116020526106cd6040600020541561341f565b806000526011602052426040600020556106e8601254613928565b6012557fd5408323c5a9a8db6d94135cd1218ada92c6e2e5afbb9b412a703a8398f021096020604051428152a26001600355005b610735915060203d6020116105485761053a818361320d565b8361030a565b50602460206001600160a01b0360155416604051928380926331a9108f60e11b82528660048301525afa801561054f576107879160009161078c57506001600160a01b0316331461325d565b61068b565b6107a5915060203d6020116105485761053a818361320d565b83610597565b90506020813d6020116107d5575b816107c66020938361320d565b810103126105f6575183610643565b3d91506107b9565b346105f65760203660031901126105f6576004356107f9613937565b80600052600d602052610821600160ff81604060002001541661081b8161316c565b14613620565b80600052600d60205260406000205461025881018091116108635761084890421015613678565b6000908152600d60205260409020600101805460ff19169055005b634e487b7160e01b600052601160045260246000fd5b346105f65760203660031901126105f657610892613937565b600435600755005b346105f65760203660031901126105f6576001600160a01b036108bb61306e565b6108c3613937565b16801561090d576001600160a01b03600254826001600160a01b0319821617600255167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0600080a3005b7f1e4fbdf700000000000000000000000000000000000000000000000000000000600052600060045260246000fd5b346105f65760203660031901126105f65760043560005260116020526020604060002054604051908152f35b610971366130db565b610979613979565b610993600160ff6009541661098d8161316c565b146136c3565b61099e81151561370e565b6109b56109ad82600654613759565b34101561376c565b60005b8181106109c6576001600355005b6109d18183856137b7565b3590611456821015610bb757602460206001600160a01b0360145416604051928380926331a9108f60e11b82528760048301525afa90811561054f57600091610b99575b506001600160a01b0316331480610b85575b610a30906137c7565b816000526011602052610a486040600020541561341f565b6000828152600d6020526040902060018101805461ffff1916610101179055429055610aa4610417610425604051610a7f816131a3565b338152856020820152426040820152600160608201526040519283916020830161346a565b9160405190610ab2826131a3565b338252600360208301928284526040810142815260608201946001865287600052600f6020526001600160a01b03806040600020945116166001600160a01b031984541617835551600183015551600282015501915193600485101561050a57610b596040600196879560009160ff80198354169116179055848152600c602052206040519283526020830190600260409180548452600181015460208501520154910152565b7f90265a6b54a9a33fe0271586d9d32316d70e467783528541adb25210a4c74bc760803392a4016109b8565b50610a30610b92836134a6565b9050610a27565b610bb1915060203d81116105485761053a818361320d565b85610a15565b602460206001600160a01b0360155416604051928380926331a9108f60e11b82528760048301525afa90811561054f57600091610c23575b506001600160a01b0316331480610c0f575b610c0a906137c7565b610a30565b50610c0a610c1c836134a6565b9050610c01565b610c3b915060203d81116105485761053a818361320d565b85610bef565b346105f65760203660031901126105f657600435600052600d60205260606040600020610c966001825492015460ff8116604051938452610c818161316c565b602084015260ff604084019160081c1661309d565bf35b346105f65760003660031901126105f657602060ff6009541660405190610cbe8161316c565b8152f35b346105f65760003660031901126105f65760206001600160a01b0360165416604051908152f35b346105f65760203660031901126105f65760043560005260016020526020604060002054604051908152f35b346105f65760203660031901126105f65760006020610d8f610d3561306e565b610d3d613937565b6017546040517f860043b60000000000000000000000000000000000000000000000000000000081523060048201526001600160a01b0392831660248201529485939190921691839182906044820190565b03925af1801561054f57610d9f57005b610dc09060203d602011610dc2575b610db8818361320d565b81019061322f565b005b503d610dae565b610dd2366130db565b610dda613979565b610dee600160ff6009541661098d8161316c565b801561108d57610e036109ad82600554613759565b60005b818110610e14576001600355005b610e1f8183856137b7565b359061145682101561100357602460206001600160a01b0360145416604051928380926331a9108f60e11b82528760048301525afa90811561054f57600091610fe5575b506001600160a01b0316331480610fd1575b610e7e906137c7565b816000526011602052610e966040600020541561341f565b6000828152600d602052604090206001818101805461ffff19169091179055429055610ef2610417610425604051610ecd816131a3565b338152856020820152426040820152600060608201526040519283916020830161346a565b60405192610eff846131a3565b338452600360208501948286526040810142815260608201966000885285600052600f6020526001600160a01b03806040600020945116166001600160a01b031984541617835551600183015551600282015501935191600483101561050a5760019460009360ff80198354169116179055818352600c602052610fa5604084206040519283526020830190600260409180548452600181015460208501520154910152565b7f90265a6b54a9a33fe0271586d9d32316d70e467783528541adb25210a4c74bc760803392a401610e06565b50610e7e610fde836134a6565b9050610e75565b610ffd915060203d81116105485761053a818361320d565b85610e63565b602460206001600160a01b0360155416604051928380926331a9108f60e11b82528760048301525afa90811561054f5760009161106f575b506001600160a01b031633148061105b575b611056906137c7565b610e7e565b50611056611068836134a6565b905061104d565b611087915060203d81116105485761053a818361320d565b8561103b565b606460405162461bcd60e51b815260206004820152601a60248201527f4e6f2076616c696420776f6c66204944732070726f76696465640000000000006044820152fd5b346105f65760203660031901126105f6576004356000526010602052602060ff604060002054166040519015158152f35b346105f65760403660031901126105f65760243567ffffffffffffffff81116105f657366023820112156105f657806004013567ffffffffffffffff81116105f65780820160248101903682116105f6576001600160a01b037f000000000000000000000000f3354ca7fca04524ced537a3ec016e67f8f32dc21633036115b757604090849003126105f657604483013567ffffffffffffffff81116105f657830190806043830112156105f65781604460246111c294013591016138ce565b918251830191604084602085019403126105f65760208401519360408101519067ffffffffffffffff82116105f657019280603f850112156105f657602084015161120c8161353e565b9161121a604051938461320d565b818352604086830101116105f657611246946040602061123c94019101613905565b60243692016138ce565b602081519101208160005260016020526040600020541460ff6112688361312f565b90549060031b1c16156115735761127b57005b60405160208101906004358252306040820152466060820152826080820152608081526112a960a08261320d565b5190209080600052600f6020526040600020604051906112c8826131a3565b6001600160a01b03815416825260ff60036001830154926020850193845260028101546040860152015416916060810192600481101561050a5783526001600160a01b038151161561152f578151600052600c60205260406000209251600481101561050a5761133790613084565b9460405190611345826131f1565b86548252600187015496602083019788526002810154916040840192835260038201546060850190815261271060048401549260808701938452600660058601549560a08901968752015460c0880152069360009a604051966113a7886131f1565b5187525160208701525160408601525160608501525160808401525160a083015261271060c083015260069660005b600781101561151d576113f26000928260051b8601519061366b565b9182841061140357506001016113d6565b92509750506001600160a01b039291505061141d866130aa565b90549060031b1c6114336001860191825461366b565b90555b61144561033c600b5442613176565b8455600284016114558154613928565b90558251600052600d602052600160406000200160ff19815416905584600052600f6020526000600360408220828155826001820155826002820155015561149e600454613928565b60045551169051916114cf604051918583526020830190600260409180548452600181015460208501520154910152565b600785101561050a5760a08161150b9660807f0abcf5161f130a8d1c7d3620dff461bca2d8b723b884877d378d75f335ef4872940152a361312f565b60ff82549160031b1b19169055600080f35b505050506001600160a01b0390611436565b606460405162461bcd60e51b815260206004820152601160248201527f52657175657374206e6f7420666f756e640000000000000000000000000000006044820152fd5b606460405162461bcd60e51b815260206004820152601c60248201527f726571756573742066756c66696c6c6564206f72206d697373696e67000000006044820152fd5b606460405162461bcd60e51b815260206004820152600d60248201527f6f6e6c79206f70657261746f72000000000000000000000000000000000000006044820152fd5b346105f657611609366130db565b611611613937565b601354810361165a5760005b81811061162657005b8061163460019284866137b7565b3561163e826130aa565b819291549060031b91821b91600019901b19161790550161161d565b606460405162461bcd60e51b815260206004820152601660248201527f496e76616c69642072657761726473206c656e677468000000000000000000006044820152fd5b60203660031901126105f6576004356001600160a01b03601454166040516318160ddd60e01b8152602081600481855afa90811561054f5760009161190a575b508210156118b9576020602491604051928380926331a9108f60e11b82528660048301525afa801561054f576117269160009161071c57506001600160a01b031633146132a8565b80600052600c60205261174760406000205461034561033c600b5442613176565b61174f613979565b80600052600d60205261177060ff600160406000200154166103758161316c565b611784600160ff6009541661038f8161316c565b6117926007543410156133d4565b8060005260116020526117aa6040600020541561341f565b6000818152600d6020526040902060018101805461ffff19166103011790554290556118066104176104256040516117e1816131a3565b338152846020820152426040820152600360608201526040519283916020830161346a565b9060405190611814826131a3565b3382526003602083019282845260408101428152606082019483865286600052600f6020526001600160a01b03806040600020945116166001600160a01b031984541617835551600183015551600282015501915192600484101561050a5760039260009460ff80198354169116179055818452600c6020526104dc604085206040519283526020830190600260409180548452600181015460208501520154910152565b50602460206001600160a01b0360155416604051928380926331a9108f60e11b82528660048301525afa801561054f576119059160009161078c57506001600160a01b0316331461325d565b611726565b90506020813d602011611934575b816119256020938361320d565b810103126105f65751836116de565b3d9150611918565b60203660031901126105f6576004356001600160a01b03601454166040516318160ddd60e01b8152602081600481855afa90811561054f57600091611a9b575b50821015611a4a576020602491604051928380926331a9108f60e11b82528660048301525afa801561054f576119c49160009161071c57506001600160a01b031633146132a8565b80600052600c6020526119e560406000205461034561033c600b5442613176565b6119ed613979565b80600052600d602052611a0e60ff600160406000200154166103758161316c565b611a22600160ff6009541661038f8161316c565b806000526010602052611a3c60ff60406000205416613883565b6117926005543410156133d4565b50602460206001600160a01b0360155416604051928380926331a9108f60e11b82528660048301525afa801561054f57611a969160009161078c57506001600160a01b0316331461325d565b6119c4565b90506020813d602011611ac5575b81611ab66020938361320d565b810103126105f657518361197c565b3d9150611aa9565b346105f65760003660031901126105f65760206001600160a01b0360175416604051908152f35b346105f65760003660031901126105f65760206001600160a01b0360155416604051908152f35b346105f6576101003660031901126105f65760043560048110156105f65760e03660231901126105f657611b5690611b51613937565b613084565b602435815560443560018201556064356002820155608435600382015560a435600482015560c435600582015560e435600690910155005b346105f65760003660031901126105f65760206001600160a01b0360025416604051908152f35b346105f65760203660031901126105f6576001600160a01b03611bd661306e565b611bde613937565b16611bea811515613838565b6001600160a01b03196014541617601455600080f35b346105f65760003660031901126105f6576020600754604051908152f35b346105f65760203660031901126105f657600060408051611c3e816131d5565b8281528260208201520152600435600052600c60205260606040600020604051611c67816131d5565b815491828252604060026001830154926020850193845201549201918252604051928352516020830152516040820152f35b611ca2366130db565b611caa613979565b611cbe600160ff6009541661098d8161316c565b611cc981151561370e565b611cd86109ad82600754613759565b60005b818110611ce9576001600355005b611cf48183856137b7565b3590611456821015611eda57602460206001600160a01b0360145416604051928380926331a9108f60e11b82528760048301525afa90811561054f57600091611ebc575b506001600160a01b0316331480611ea8575b611d53906137c7565b816000526011602052611d6b6040600020541561341f565b6000828152600d6020526040902060018101805461ffff1916610301179055429055611dc7610417610425604051611da2816131a3565b338152856020820152426040820152600360608201526040519283916020830161346a565b9160405190611dd5826131a3565b3382526003602083019282845260408101428152606082019483865287600052600f6020526001600160a01b03806040600020945116166001600160a01b031984541617835551600183015551600282015501915193600485101561050a57611e7c604060019660039560009160ff80198354169116179055848152600c602052206040519283526020830190600260409180548452600181015460208501520154910152565b7f90265a6b54a9a33fe0271586d9d32316d70e467783528541adb25210a4c74bc760803392a401611cdb565b50611d53611eb5836134a6565b9050611d4a565b611ed4915060203d81116105485761053a818361320d565b85611d38565b602460206001600160a01b0360155416604051928380926331a9108f60e11b82528760048301525afa90811561054f57600091611f46575b506001600160a01b0316331480611f32575b611f2d906137c7565b611d53565b50611f2d611f3f836134a6565b9050611f24565b611f5e915060203d81116105485761053a818361320d565b85611f12565b346105f65760003660031901126105f6576020601254604051908152f35b346105f65760003660031901126105f6576020600a54604051908152f35b346105f65760203660031901126105f6576004356000548110156105f65760ff611fcb60209261312f565b90549060031b1c166040519015158152f35b346105f65760203660031901126105f657611ff6613937565b600435600655005b346105f65760003660031901126105f657612017613937565b60006001600160a01b036002546001600160a01b03198116600255167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08280a3005b346105f65760203660031901126105f65760006020610d8f61207961306e565b612081613937565b6017546040517f954fa5ee0000000000000000000000000000000000000000000000000000000081523060048201526001600160a01b0392831660248201529485939190921691839182906044820190565b6120dc366130db565b6120e4613979565b6120f8600160ff6009541661098d8161316c565b61210381151561370e565b6121126109ad82600554613759565b60005b818110612123576001600355005b61212e8183856137b7565b359081600052601060205261214a60ff60406000205416613883565b602460206001600160a01b0360145416604051928380926331a9108f60e11b82528760048301525afa90811561054f576000916122e1575b506001600160a01b03163314806122cd575b61219d906137c7565b8160005260116020526121b56040600020541561341f565b6000828152600d6020526040902060018101805461ffff19166103011790554290556121ec610417610425604051611da2816131a3565b91604051906121fa826131a3565b3382526003602083019282845260408101428152606082019483865287600052600f6020526001600160a01b03806040600020945116166001600160a01b031984541617835551600183015551600282015501915193600485101561050a576122a1604060019660039560009160ff80198354169116179055848152600c602052206040519283526020830190600260409180548452600181015460208501520154910152565b7f90265a6b54a9a33fe0271586d9d32316d70e467783528541adb25210a4c74bc760803392a401612115565b5061219d6122da836134a6565b9050612194565b6122f9915060203d81116105485761053a818361320d565b85612182565b346105f65760003660031901126105f6576020600554604051908152f35b346105f65760203660031901126105f6576001600160a01b0361233e61306e565b612346613937565b16612352811515613838565b6001600160a01b03196015541617601555600080f35b346105f65760203660031901126105f657612381613937565b600435600555005b612392366130db565b61239a613979565b6123ae600160ff6009541661098d8161316c565b6123b981151561370e565b6123c86109ad82600554613759565b60005b8181106123d9576001600355005b6123e48183856137b7565b35906123f2608383106135d5565b602460206001600160a01b0360145416604051928380926331a9108f60e11b82528760048301525afa90811561054f576000916125af575b506001600160a01b031633148061259b575b612445906137c7565b81600052601160205261245d6040600020541561341f565b6000828152600d6020526040902060018101805461ffff19166102011790554290556124b9610417610425604051612494816131a3565b338152856020820152426040820152600260608201526040519283916020830161346a565b91604051906124c7826131a3565b338252600360208301928284526040810142815260608201946002865287600052600f6020526001600160a01b03806040600020945116166001600160a01b031984541617835551600183015551600282015501915193600485101561050a5761256f604060019660029560009160ff80198354169116179055848152600c602052206040519283526020830190600260409180548452600181015460208501520154910152565b7f90265a6b54a9a33fe0271586d9d32316d70e467783528541adb25210a4c74bc760803392a4016123cb565b506124456125a8836134a6565b905061243c565b6125c7915060203d81116105485761053a818361320d565b8561242a565b346105f65760203660031901126105f6576004356125e9613979565b80600052600d60205261260b600160ff81604060002001541661081b8161316c565b80600052600d60205260406000205461025881018091116108635761263290421015613678565b80600052600d60205260ff60016040600020015460081c16600481101561050a576001146126d2575b80600052600d60205260ff60016040600020015460081c16600481101561050a576003146126a6575b600052600d602052600160406000200160ff1981541690556001600355600080f35b6126b13315156134f3565b6126cd6000808080600754335af16126c761355a565b5061358a565b612684565b6126dd3315156134f3565b6126f36000808080600654335af16126c761355a565b61265b565b60203660031901126105f6576004356001600160a01b03601454166040516318160ddd60e01b8152602081600481855afa90811561054f57600091612971575b50821015612920576020602491604051928380926331a9108f60e11b82528660048301525afa801561054f576127809160009161071c57506001600160a01b031633146132a8565b80600052600c6020526127a160406000205461034561033c600b5442613176565b6127a9613979565b80600052600d6020526127ca60ff600160406000200154166103758161316c565b6127de600160ff6009541661038f8161316c565b6127ea608382106135d5565b6127f86005543410156133d4565b8060005260116020526128106040600020541561341f565b6000818152600d6020526040902060018101805461ffff191661020117905542905561286c610417610425604051612847816131a3565b338152846020820152426040820152600260608201526040519283916020830161346a565b906040519061287a826131a3565b338252600360208301928284526040810142815260608201946002865286600052600f6020526001600160a01b03806040600020945116166001600160a01b031984541617835551600183015551600282015501915192600484101561050a5760029260009460ff80198354169116179055818452600c6020526104dc604085206040519283526020830190600260409180548452600181015460208501520154910152565b50602460206001600160a01b0360155416604051928380926331a9108f60e11b82528660048301525afa801561054f5761296c9160009161078c57506001600160a01b0316331461325d565b612780565b90506020813d60201161299b575b8161298c6020938361320d565b810103126105f6575183612738565b3d915061297f565b346105f65760203660031901126105f6576129f460008080806001600160a01b036129cc61306e565b6129d4613937565b6129dc613979565b166129e88115156134f3565b47905af16126c761355a565b6001600355005b346105f65760203660031901126105f6576004356013548110156105f657612a246020916130aa565b90549060031b1c604051908152f35b346105f65760203660031901126105f657600435612a4f613937565b8015612a5a57600a55005b606460405162461bcd60e51b815260206004820152601a60248201527f436f6f6c646f776e206d75737420626520706f7369746976652e0000000000006044820152fd5b346105f65760203660031901126105f657600435600052600f60205260806040600020610c966001600160a01b038254169160018101549060ff60036002830154920154169160405194855260208501526040840152606083019061309d565b346105f65760203660031901126105f65760043560048110156105f657612b2660e091613084565b805490600181015490600281015460038201546004830154916006600585015494015494604051968752602087015260408601526060850152608084015260a083015260c0820152f35b346105f65760003660031901126105f6576020600854604051908152f35b346105f65760203660031901126105f6576020612bac6004356134a6565b6040519015158152f35b346105f65760003660031901126105f6576020600654604051908152f35b60203660031901126105f6576004356001600160a01b03601454166040516318160ddd60e01b8152602081600481855afa90811561054f57600091612e41575b50821015612df0576020602491604051928380926331a9108f60e11b82528660048301525afa801561054f57612c5c9160009161071c57506001600160a01b031633146132a8565b80600052600c602052612c7d60406000205461034561033c600b5442613176565b612c85613979565b80600052600d602052612ca660ff600160406000200154166103758161316c565b612cba600160ff6009541661038f8161316c565b612cc86006543410156133d4565b806000526011602052612ce06040600020541561341f565b6000818152600d6020526040902060018101805461ffff1916610101179055429055612d3c610417610425604051612d17816131a3565b338152846020820152426040820152600160608201526040519283916020830161346a565b9060405190612d4a826131a3565b338252600360208301928284526040810142815260608201946001865286600052600f6020526001600160a01b03806040600020945116166001600160a01b031984541617835551600183015551600282015501915192600484101561050a5760019260009460ff80198354169116179055818452600c6020526104dc604085206040519283526020830190600260409180548452600181015460208501520154910152565b50602460206001600160a01b0360155416604051928380926331a9108f60e11b82528660048301525afa801561054f57612e3c9160009161078c57506001600160a01b0316331461325d565b612c5c565b90506020813d602011612e6b575b81612e5c6020938361320d565b810103126105f6575183612c14565b3d9150612e4f565b346105f65760203660031901126105f657600435600052600c60205260606040600020805490600260018201549101549060405192835260208301526040820152f35b346105f65760003660031901126105f6576020600454604051908152f35b346105f65760003660031901126105f6576020600b54604051908152f35b346105f65760403660031901126105f657612f0b61306e565b612f13613937565b60206001600160a01b036064816017541693600060405195869485937ff971966200000000000000000000000000000000000000000000000000000000855230600486015216602484015260243560448401525af1801561054f57610d9f57005b346105f65760203660031901126105f657600435612f90613937565b612f998161316c565b612fa28161316c565b60ff801960095416911617600955600080f35b346105f65760003660031901126105f6576020612fd761033c600b5442613176565b604051908152f35b346105f65760203660031901126105f657600435612ffb613937565b801561300657600b55005b606460405162461bcd60e51b815260206004820152601f60248201527f496e76616c69642074696d657374616d7020666f722066756c6c4d6f6f6e2e006044820152fd5b346105f65760003660031901126105f6576020906001600160a01b03601454168152f35b600435906001600160a01b03821682036105f657565b600481101561050a57600052600e602052604060002090565b90600482101561050a5752565b6013548110156130c557601360005260206000200190600090565b634e487b7160e01b600052603260045260246000fd5b9060206003198301126105f65760043567ffffffffffffffff81116105f657826023820112156105f65780600401359267ffffffffffffffff84116105f65760248460051b830101116105f6576024019190565b906000548210156130c55760008052600582901c7f290decd9548b62a8d60345a988386fc84ba6bc95484008f6362f93160ef3e5630191601f1690565b6002111561050a57565b9190820391821161086357565b811561318d570490565b634e487b7160e01b600052601260045260246000fd5b6080810190811067ffffffffffffffff8211176131bf57604052565b634e487b7160e01b600052604160045260246000fd5b6060810190811067ffffffffffffffff8211176131bf57604052565b60e0810190811067ffffffffffffffff8211176131bf57604052565b90601f8019910116810190811067ffffffffffffffff8211176131bf57604052565b908160209103126105f6575190565b908160209103126105f657516001600160a01b03811681036105f65790565b1561326457565b606460405162461bcd60e51b815260206004820152601f60248201527f53656e64657220646f6573206e6f74206f776e2074686520706172746e6572006044820152fd5b156132af57565b606460405162461bcd60e51b815260206004820152601c60248201527f53656e64657220646f6573206e6f74206f776e2074686520776f6c66000000006044820152fd5b156132fa57565b606460405162461bcd60e51b815260206004820152601e60248201527f5468697320776f6c66206973207374696c6c20696e20636f6f6c646f776e00006044820152fd5b1561334557565b606460405162461bcd60e51b815260206004820152601860248201527f576f6c662069732063757272656e746c79206c6f636b656400000000000000006044820152fd5b1561339057565b606460405162461bcd60e51b815260206004820152601060248201527f48756e74696e672064697361626c6564000000000000000000000000000000006044820152fd5b156133db57565b606460405162461bcd60e51b815260206004820152600f60248201527f4e6f7420656e6f756768206665657300000000000000000000000000000000006044820152fd5b1561342657565b606460405162461bcd60e51b815260206004820152601060248201527f576f6c6620697320616d627573686564000000000000000000000000000000006044820152fd5b6134a49092919260608060808301956001600160a01b0381511684526020810151602085015260408101516040850152015191019061309d565b565b80600052600d60205260ff600160406000200154166134c48161316c565b1590816134cf575090565b9050600052600c6020526040600020546134ee61033c600b5442613176565b141590565b156134fa57565b606460405162461bcd60e51b815260206004820152600f60248201527f494e56414c49445f4144445245535300000000000000000000000000000000006044820152fd5b67ffffffffffffffff81116131bf57601f01601f191660200190565b3d15613585573d9061356b8261353e565b91613579604051938461320d565b82523d6000602084013e565b606090565b1561359157565b606460405162461bcd60e51b815260206004820152601160248201527f5749544844524157414c5f4641494c45440000000000000000000000000000006044820152fd5b156135dc57565b606460405162461bcd60e51b815260206004820152601360248201527f576f6c66206973206e6f74206e75636c656172000000000000000000000000006044820152fd5b1561362757565b606460405162461bcd60e51b815260206004820152600f60248201527f576f6c66206e6f74206c6f636b656400000000000000000000000000000000006044820152fd5b9190820180921161086357565b1561367f57565b606460405162461bcd60e51b815260206004820152601760248201527f4c6f636b20706572696f64206e6f7420657870697265640000000000000000006044820152fd5b156136ca57565b606460405162461bcd60e51b815260206004820152601360248201527f48756e74696e672069732064697361626c6564000000000000000000000000006044820152fd5b1561371557565b606460405162461bcd60e51b815260206004820152600c60248201527f4e6f2056616c69642049647300000000000000000000000000000000000000006044820152fd5b8181029291811591840414171561086357565b1561377357565b606460405162461bcd60e51b815260206004820152602060248201527f496e73756666696369656e742066756e647320666f7220616c6c2068756e74736044820152fd5b91908110156130c55760051b0190565b156137ce57565b608460405162461bcd60e51b815260206004820152603160248201527f576f6c66206e6f74206f776e65642062792073656e646572206f72206e6f742060448201527f76616c696420666f722068756e74696e670000000000000000000000000000006064820152fd5b1561383f57565b606460405162461bcd60e51b815260206004820152600f60248201527f496e76616c6964206164647265737300000000000000000000000000000000006044820152fd5b1561388a57565b606460405162461bcd60e51b815260206004820152601660248201527f5468697320776f6c66206973206e6f74206120706967000000000000000000006044820152fd5b9291926138da8261353e565b916138e8604051938461320d565b8294818452818301116105f6578281602093846000960137010152565b60005b8381106139185750506000910152565b8181015183820152602001613908565b60001981146108635760010190565b6001600160a01b0360025416330361394b57565b7f118cdaa7000000000000000000000000000000000000000000000000000000006000523360045260246000fd5b60026003541461398a576002600355565b7f3ee5aeb50000000000000000000000000000000000000000000000000000000060005260046000fd5b90916060928252604060208301526139db8151809281604086015260208686019101613905565b601f01601f1916010190565b9060005491680100000000000000008310156131bf57613a436104179160018501600055613a148561312f565b5050613a1f8561312f565b81549060031b9060ff6001831b921b191617905560405192839186602084016139b4565b6364e62126194201428111610863576003900490600182019182811161086357600046600103613ad85750600501809211610863577fd91fc3685b930310b008ec37d2334870cab88a023ed8cc628a2e2ccd4e55d202915b6040516020810190613ab2816104178686866139b4565b519020856000526001602052604060002055613ad3604051928392836139b4565b0390a1565b9060029093929301809211613b105750907fd91fc3685b930310b008ec37d2334870cab88a023ed8cc628a2e2ccd4e55d20291613a9b565b80634e487b7160e01b602492526011600452fdfea2646970667358221220e009267e4915a057620d43a314687d1d778b5906def3503be4717a622dd77d4364736f6c634300081a0033

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

0000000000000000000000009b2ced8219bcf64cccaf69ed4c56aaf90e958a0b00000000000000000000000026dd746561e82c655f365df796fd33eaeea39652000000000000000000000000f3354ca7fca04524ced537a3ec016e67f8f32dc200000000000000000000000043000000000000000000000000000000000000020000000000000000000000002536fe9ab3f511540f2f9e2ec2a805005c3dd800000000000000000000000000b7501d1ef03b17076a814accf03d47a5e4af1c98

-----Decoded View---------------
Arg [0] : _wolvesContract (address): 0x9b2cED8219BcF64CccAF69ed4C56AaF90e958a0B
Arg [1] : _huntPartnersContract (address): 0x26dD746561E82C655F365DF796FD33EAeEA39652
Arg [2] : operator (address): 0xf3354ca7FCa04524cED537a3ec016E67F8f32dC2
Arg [3] : _blastAddress (address): 0x4300000000000000000000000000000000000002
Arg [4] : _blastPointsAddress (address): 0x2536FE9ab3F511540F2f9e2eC2A805005C3Dd800
Arg [5] : _pointsOperator (address): 0xB7501d1eF03B17076A814AcCF03d47a5E4Af1c98

-----Encoded View---------------
6 Constructor Arguments found :
Arg [0] : 0000000000000000000000009b2ced8219bcf64cccaf69ed4c56aaf90e958a0b
Arg [1] : 00000000000000000000000026dd746561e82c655f365df796fd33eaeea39652
Arg [2] : 000000000000000000000000f3354ca7fca04524ced537a3ec016e67f8f32dc2
Arg [3] : 0000000000000000000000004300000000000000000000000000000000000002
Arg [4] : 0000000000000000000000002536fe9ab3f511540f2f9e2ec2a805005c3dd800
Arg [5] : 000000000000000000000000b7501d1ef03b17076a814accf03d47a5e4af1c98


Block Transaction Difficulty Gas Used Reward
View All Blocks Produced

Block Uncle Number Difficulty Gas Used Reward
View All Uncles
Loading...
Loading
Loading...
Loading

Validator Index Block Amount
View All Withdrawals

Transaction Hash Block Value Eth2 PubKey Valid
View All Deposits
Loading...
Loading
Loading...
Loading
[ Download: CSV Export  ]
[ Download: CSV Export  ]

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.