POL Price: $0.218716 (+0.18%)
 

Multichain Info

No addresses found
Transaction Hash
Method
Block
From
To
Join Race652757132024-12-09 15:12:36134 days ago1733757156IN
0xAE459907...efa2D1D48
0 POL0.0112730593.45306502
Upload Races651591522024-12-06 16:00:14137 days ago1733500814IN
0xAE459907...efa2D1D48
0 POL0.00392938137.1895992
Upload Races651591482024-12-06 16:00:04137 days ago1733500804IN
0xAE459907...efa2D1D48
0 POL0.00394183137.62428514
Join Race651560972024-12-06 14:11:20137 days ago1733494280IN
0xAE459907...efa2D1D48
0 POL0.009733669.25272345
Join Race651560502024-12-06 14:09:40137 days ago1733494180IN
0xAE459907...efa2D1D48
0 POL0.0099293870.64564505
Join Race650566002024-12-04 2:51:42140 days ago1733280702IN
0xAE459907...efa2D1D48
0 POL0.0042178230.00898978
Join Race615359242024-09-07 13:54:38227 days ago1725717278IN
0xAE459907...efa2D1D48
0 POL0.004216230.00000002
Join Race586288082024-06-26 12:17:04300 days ago1719404224IN
0xAE459907...efa2D1D48
0 POL0.0036188430.00000006
Upload Races566929852024-05-07 18:34:59350 days ago1715106899IN
0xAE459907...efa2D1D48
0 POL0.0273718100.00000003
Upload Races566929842024-05-07 18:34:57350 days ago1715106897IN
0xAE459907...efa2D1D48
0 POL0.0247144100.00000003
Claim Locked Win...566819172024-05-07 11:39:55350 days ago1715081995IN
0xAE459907...efa2D1D48
0 POL0.035000730.00000004
Claim Locked Win...566816322024-05-07 11:29:49350 days ago1715081389IN
0xAE459907...efa2D1D48
0 POL0.0135556432.00000004
Upload Races566815342024-05-07 11:25:15350 days ago1715081115IN
0xAE459907...efa2D1D48
0 POL0.0273718100.00000003
Add Race566813902024-05-07 11:20:06350 days ago1715080806IN
0xAE459907...efa2D1D48
0 POL0.0049728100.00000005
Add Race566813902024-05-07 11:20:06350 days ago1715080806IN
0xAE459907...efa2D1D48
0 POL0.0049728100.00000005
Add Race566813902024-05-07 11:20:06350 days ago1715080806IN
0xAE459907...efa2D1D48
0 POL0.0049728100.00000005
Add Race566813902024-05-07 11:20:06350 days ago1715080806IN
0xAE459907...efa2D1D48
0 POL0.0049728100.00000005
Add Race566813892024-05-07 11:20:04350 days ago1715080804IN
0xAE459907...efa2D1D48
0 POL0.0049728100.00000005
Claim Locked Win...566812782024-05-07 11:15:34350 days ago1715080534IN
0xAE459907...efa2D1D48
0 POL0.0534858531.00000004
Claim Locked Win...566810082024-05-07 11:04:28350 days ago1715079868IN
0xAE459907...efa2D1D48
0 POL0.0500834730.00000003
Upload Races566808752024-05-07 10:59:44350 days ago1715079584IN
0xAE459907...efa2D1D48
0 POL0.0273706100.00000003
Claim Locked Win...566801942024-05-07 10:32:16350 days ago1715077936IN
0xAE459907...efa2D1D48
0 POL0.0272743632.00000007
Claim Locked Win...566801432024-05-07 10:30:24350 days ago1715077824IN
0xAE459907...efa2D1D48
0 POL0.0606954635.00000004
Claim Locked Win...566798912024-05-07 10:20:26350 days ago1715077226IN
0xAE459907...efa2D1D48
0 POL0.0566900738.00000009
Claim Locked Win...566768492024-05-07 8:28:56350 days ago1715070536IN
0xAE459907...efa2D1D48
0 POL0.0039417630.00000049
View all transactions

Parent Transaction Hash Block From To
View All Internal Transactions
Loading...
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
WofRacingContract

Compiler Version
v0.8.9+commit.e5eed63a

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion
File 1 of 5 : racingContract.sol
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.9;
import "@openzeppelin/contracts/utils/math/SafeMath.sol";

// Chainlink Keepers
import "@chainlink/contracts/src/v0.8/KeeperCompatible.sol";

interface IWofToken {
    function transferFrom(
        address from,
        address to,
        uint256 amount
    ) external;

    function transfer(address to, uint256 amount) external;

    function allowance(address owner, address spender)
        external
        returns (uint256);
}

interface ILeasingContract {

    function useInRace(uint256 _tokenID) external;

    function isTokenLeased(uint256 _tokenID)
        external
        view
        returns ( bool, bool, uint256, address  );

    function getLeaseData(uint256 _tokenID, uint256 _leaseID)
        external
        view
        returns (address, address, uint256, uint256, uint256, uint256);
}  


contract WofRacingContract is KeeperCompatibleInterface {
   

    uint256 public s_requestId;


    //CHAINLINK KEEPERS
    uint256 public interval;
    uint256 public lastTimeStamp;

    //CONTRACT VARIABLES
    address public owner;
    address public garageContract;
    uint256 public MAX_PARTICIPANTS = 12;

    //INTERFACES
    IWofToken public wofToken;
    ILeasingContract public leasingContract;

    //EVENTS
    event JoinRace(
        uint256 raceID,
        address racer,
        uint256 token_id,
        uint256 punkID
    );
    event LeaveRace(
        uint256 raceID,
        address racer,
        uint256 token_id,
        uint256 punkID
    );

    event SeedsGenerated(uint256 raceID);

    event PayOut(address racer, uint256 amount);

    constructor(
        uint256 updateInterval,
        address _wofTokenAddress,
        address _garageContract,
        address _leasingContract
    ) {
        owner = msg.sender;
        interval = updateInterval;
        lastTimeStamp = block.timestamp;
        wofToken = IWofToken(_wofTokenAddress);
        garageContract = _garageContract;
        leasingContract = ILeasingContract(_leasingContract);
    }

    //DATA STRUCTURES

    /* ----- RACE STRUCT ----- */
    mapping(uint256 => Race) public races;
    struct Race {
        uint256 prizePool;
        uint256 entranceFee;
        mapping(uint256 => Participant) participants;
        bool finished;
        uint256 participant_count;
    }
    struct Participant {
        address user;
        uint256 punkID;
        uint256 entranceFee;
        uint256 place;
    }

    /* ----- RACE CLAIMS ----- */

    struct Earnings {
        address user;
        uint256 totalEarned;
        uint256 totalClaimed;
        uint256 unclaimable;
    }

    struct LockedRaceWinnings {
        address user;
        uint timestamp;
        uint256 amount;
        bool claimed;
    }

    address[] public unclaimedAddresses;
    mapping(address => uint256) public totalRewardsEarned;
    mapping(address => uint256) public totalRewardsClaimed;
    mapping(address => LockedRaceWinnings[]) public unclaimableRewards;

    /* ----- TOKEN STATS ----- */
    struct TokenStats {
        uint256 racesJoined;
        uint256 firstPlaces;
        uint256 secondPlaces;
        uint256 thirdPlaces;
        uint256 tokensWon;
    }
    mapping(uint256 => TokenStats) public tokenStats;
    mapping(uint256 => bool) public tokenInrace;

    /* ----- FREIGHT PUNK STATS STATS ----- */
    mapping(uint256 => TokenStats) public freightPunkStats;
    mapping(uint256 => bool) public punkInRace;

    /* ----- CONTESTANT STRUCT ----- */
    struct Contestants {
        address racer;
        uint256 tokenID;
        uint256 punkID;
        uint256 place;
    }


    /* ----- KEEPERS AND VRF FNC ----- */
    function checkUpkeep(bytes calldata)
        external
        view
        override
        returns (bool upkeepNeeded, bytes memory)
    {
        upkeepNeeded = (block.timestamp - lastTimeStamp) > interval;
    }

    //PAY OUT THE REWARDS
    function performUpkeep(bytes calldata) external override {
        if ((block.timestamp - lastTimeStamp) > interval) {
            lastTimeStamp = block.timestamp;
            payOut();
        }
    }

    /* ----- RACE FNC ----- */
    function addRace(
        uint256 _raceID,
        uint256 _entranceFee,
        uint256 _prizePool
    ) public {
        races[_raceID].entranceFee = _entranceFee;
        races[_raceID].finished = false;
        if (_entranceFee == 0) {
            races[_raceID].prizePool = _prizePool;
        }
        emit SeedsGenerated(_raceID);

    }

    function unJoinRace(
        uint256 _raceID,
        address _user,
        uint256 _tokenID,
        uint256 _punkID
    ) public {
        require(
            races[_raceID].participants[_tokenID].user == msg.sender,
            "Can not unjoin other people"
        );

        tokenInrace[_tokenID] == false;

        //DECREMENT THE RACE
        delete races[_raceID].participants[_tokenID];
        //TRANSFER TOKENS BACK TO USER
        uint256 entranceFee = races[_raceID].entranceFee;
        wofToken.transfer(_user, entranceFee);
        //DECREMENT RACERS COUNT
        races[_raceID].participant_count = races[_raceID].participant_count - 1;
        //DECREMENT PRIZE POOL
        races[_raceID].prizePool = races[_raceID].prizePool - entranceFee;
        emit LeaveRace(_raceID, _user, _tokenID, _punkID);
    }

    function joinRace(
        uint256 _raceID,
        address _user,
        uint256 _tokenID,
        uint256 _entranceFee,
        uint256 _punkID
    ) public {
        uint256 raceParticipants = races[_raceID].participant_count;
        require(_user == msg.sender, "Can only join with your address");
        require(tokenInrace[_tokenID] != true, "Token already racing");
        require(
            wofToken.allowance(_user, address(this)) > _entranceFee,
            "Entrance Fee exceeds allowance"
        ); 
        require(
            _entranceFee >= races[_raceID].entranceFee,
            "Entrance fee higher than sent"
        );

        require(
            raceParticipants <= MAX_PARTICIPANTS,
            "Max number of racers already registered"
        );
  
        //APPEND TOKEN STATS
        tokenInrace[_tokenID] == true;

        //JOIN THE RACE
        races[_raceID].participants[_tokenID] = Participant({
            user: _user,
            punkID: _punkID,
            entranceFee: _entranceFee,
            place: 0
        });
        //TRANSFER TOKENS TO CONTRACT
        wofToken.transferFrom(_user, address(this), _entranceFee);

        //APPEND RACERS COUNT
        races[_raceID].participant_count = raceParticipants + 1;
        //APPEND PRIZE POOL
        races[_raceID].prizePool = races[_raceID].prizePool + _entranceFee;
        emit JoinRace(_raceID, _user, _tokenID, _punkID);
    }

    function uploadRaces(uint256 _raceID, Contestants[] memory _results)
        public
    {
        require(
            owner == msg.sender, "Not Authorized"
        );
        uint256 prizePool = races[_raceID].prizePool;
        uint256 entranceFee = races[_raceID].entranceFee;

        for (uint256 i = 0; i < _results.length; i++) {
            uint256 reward = 0;
            if (
                entranceFee == 0 ||
                isTokenInRace(_raceID, _results[i].tokenID) == true
            ) {
                //UNJOIN TOKEN FROM THE RACE
                tokenInrace[_results[i].tokenID] = false;
                if (_results[i].punkID > 0) {
                    punkInRace[_results[i].punkID] = false;
                }

                tokenStats[_results[i].tokenID].racesJoined =
                    tokenStats[_results[i].tokenID].racesJoined +
                    1;

                //APPEND PUNK STATS
                if (_results[i].punkID > 0) {
                    punkInRace[_results[i].punkID] == true;
                    freightPunkStats[_results[i].punkID].racesJoined =
                        freightPunkStats[_results[i].punkID].racesJoined +
                        1;
                }


                //ASSIGN PLACES
                if (_results[i].place == 1) {
                    //APPEND STATS
                    tokenStats[_results[i].tokenID].firstPlaces =
                        tokenStats[_results[i].tokenID].firstPlaces +
                        1;

                    if (_results[i].punkID != 0) {
                        freightPunkStats[_results[i].punkID].firstPlaces =
                            freightPunkStats[_results[i].punkID].firstPlaces +
                            1;
                    }

                    reward = getRewardAmount(prizePool, _results[i].place);
                }
                if (_results[i].place == 2) {
                    //APPEND STATS

                    tokenStats[_results[i].tokenID].secondPlaces =
                        tokenStats[_results[i].tokenID].secondPlaces +
                        1;

                    if (_results[i].punkID != 0) {
                        freightPunkStats[_results[i].punkID].secondPlaces =
                            freightPunkStats[_results[i].punkID].secondPlaces +
                            1;
                    }

                    reward = getRewardAmount(prizePool, _results[i].place);
                }
                if (_results[i].place == 3) {
                    //APPEND STATS

                    tokenStats[_results[i].tokenID].thirdPlaces =
                        tokenStats[_results[i].tokenID].thirdPlaces +
                        1;

                    if (_results[i].punkID != 0) {
                        freightPunkStats[_results[i].punkID].thirdPlaces =
                            freightPunkStats[_results[i].punkID].thirdPlaces +
                            1;
                    }
                    reward = getRewardAmount(prizePool, _results[i].place);
                }

                //APPEND LEASE STATS
                bool isLeased;
                (,isLeased,,) = leasingContract.isTokenLeased(_results[i].tokenID);
                if (isLeased) {
                    leasingContract.useInRace(_results[i].tokenID);
                    reward = (reward * 95) / 100;
                }
            }
            if (reward > 0) {

                bool isLeased;
                uint256 leaseID;
                address leaser;
                (,isLeased,leaseID,leaser) = leasingContract.isTokenLeased(_results[i].tokenID);
                // PAY OUT RACES WHERE ENTRANCE FEE IS NOT 0
                if (races[_raceID].entranceFee != 0) {
                    if (isLeased) {
                        address tokenOwner;
                        uint256 leaseType;
                        uint256 paymentType;
                        uint256 winShare;
                        (tokenOwner, leaser, leaseType, paymentType,, winShare)= leasingContract.getLeaseData(_results[i].tokenID, leaseID);
                        if (paymentType == 1 || paymentType == 3) {
                            
                            uint256 ownersCut = (reward * winShare) / 100;
                            wofToken.transfer(tokenOwner, ownersCut);
                            reward = reward - ownersCut;
                            wofToken.transfer(_results[i].racer, reward);
                        } else {
                            wofToken.transfer(_results[i].racer, reward);
                        }
                    } else {
                        wofToken.transfer(_results[i].racer, reward);
                    }
                } else {
                    if (totalRewardsEarned[_results[i].racer] == 0) {
                        unclaimedAddresses.push(_results[i].racer);
                    }
                    if (isLeased) {
                        address tokenOwner;
                        uint256 leaseType;
                        uint256 paymentType;
                        uint256 winShare;
                        (tokenOwner, leaser, leaseType, paymentType,, winShare) = leasingContract.getLeaseData(_results[i].tokenID, leaseID);  

                        if (paymentType == 1 || paymentType == 3) {
                            uint256 ownersCut = (reward * winShare) / 100;
                            totalRewardsEarned[tokenOwner] = totalRewardsEarned[tokenOwner] + ownersCut;
                            reward = reward - ownersCut;

                            unclaimableRewards[_results[i].racer].push(LockedRaceWinnings(_results[i].racer, block.timestamp, reward, false));
                            totalRewardsEarned[_results[i].racer] = totalRewardsEarned[_results[i].racer] + reward;
                        } else {
                            unclaimableRewards[_results[i].racer].push(LockedRaceWinnings(_results[i].racer, block.timestamp, reward, false));
                            totalRewardsEarned[_results[i].racer] = totalRewardsEarned[_results[i].racer] + reward;
                        }                      
                    } else {
                        totalRewardsEarned[_results[i].racer] = totalRewardsEarned[_results[i].racer] + reward;
                    }
                }
            }
        }
    }

    /* ----- HELPER FNC ----- */


    function getLeaseStatus(uint256 _tokenID) public view returns( 
        bool isLeased
    ) {
        (, isLeased, ,) = leasingContract.isTokenLeased(_tokenID);

    }

    function isTokenInRace(uint256 raceID, uint256 tokenID)
        public
        view
        returns (bool)
    {
        address racerAddress = races[raceID].participants[tokenID].user;
        if (racerAddress == address(0)) {
            return false;
        }
        return true;
    }

    function getParticipant(uint256 _raceID, uint256 tokenID)
        public
        view
        returns (Participant memory)
    {
        return races[_raceID].participants[tokenID];
    }

    function getRewardAmount(uint256 prizePool, uint256 place)
        internal
        pure
        returns (uint256)
    {
        if (place == 1) {
            return (prizePool * 60) / 100;
        }
        if (place == 2) {
            return (prizePool * 25) / 100;
        }
        if (place == 3) {
            return (prizePool * 15) / 100;
        }
        return 0;
    }

    function getLockedRewards(address _address)
        public
        view
        returns (uint256)
    {
        uint256 lockedRewards;
        for (uint256 i = 0; i < unclaimableRewards[_address].length; i++) {
            if (unclaimableRewards[_address][i].amount > 0 && unclaimableRewards[_address][i].claimed == false) {
                lockedRewards = lockedRewards + unclaimableRewards[_address][i].amount;
            }
        }
        return lockedRewards;
    }

    function getUnlockedRewards(address _address)
        public
        view
        returns (uint256)
    {
        uint256 unlockedRewards;
        uint256 lockedRewards = getLockedRewards(_address);
        unlockedRewards = totalRewardsEarned[_address] - totalRewardsClaimed[_address] - lockedRewards;
        return unlockedRewards;
    }

    function unlockRewards(address _address) internal {
        uint twoweeksago = block.timestamp - 1209600;
        for (uint256 j = 0; j < unclaimableRewards[_address].length; j++) {
            if (unclaimableRewards[_address][j].amount > 0 && unclaimableRewards[_address][j].claimed == false && unclaimableRewards[_address][j].timestamp < twoweeksago) {
                totalRewardsEarned[_address] = totalRewardsEarned[_address] + unclaimableRewards[_address][j].amount;
                delete unclaimableRewards[_address][j];
            }
        }   
    }

    function claimWinnings() public {
        unlockRewards(msg.sender);
        uint256 lockedRewards = getLockedRewards(msg.sender);
        uint256 payout = totalRewardsEarned[msg.sender] - totalRewardsClaimed[msg.sender] - lockedRewards;
        totalRewardsClaimed[msg.sender] = totalRewardsClaimed[msg.sender] + payout;
        wofToken.transferFrom(garageContract, msg.sender, payout);
    }

    function claimLockedWinnings() public {
        unlockRewards(msg.sender);
        uint lockedWinnings = 0;
        for (uint256 j = 0; j < unclaimableRewards[msg.sender].length; j++) {
            if (unclaimableRewards[msg.sender][j].amount > 0 && unclaimableRewards[msg.sender][j].claimed == false) {
                lockedWinnings = lockedWinnings + unclaimableRewards[msg.sender][j].amount;
                delete unclaimableRewards[msg.sender][j];
            }
        }
        uint256 payout = totalRewardsEarned[msg.sender] - totalRewardsClaimed[msg.sender] - (lockedWinnings * 65 / 100);
        if (payout > 0) {
            totalRewardsClaimed[msg.sender] = totalRewardsClaimed[msg.sender] + payout;
            wofToken.transferFrom(garageContract, msg.sender, payout);
        }
    }

    function payOut() internal {
        if (unclaimedAddresses.length > 0) {
            for (uint256 i = 0; i < unclaimedAddresses.length; i++) {
                address userAddress = unclaimedAddresses[i];
                uint twoweeksago = block.timestamp - 1209600;
                uint lockedBalance = 0;
                for (uint j = 0; j < unclaimableRewards[userAddress].length; j++) {
                    if (unclaimableRewards[userAddress][j].amount > 0 && unclaimableRewards[userAddress][j].claimed == false && unclaimableRewards[userAddress][j].timestamp > twoweeksago) {
                        lockedBalance = lockedBalance + unclaimableRewards[userAddress][j].amount;
                    }
                }
                uint256 payout = totalRewardsEarned[userAddress] - totalRewardsClaimed[userAddress] - lockedBalance;
                if (payout > 0) {
                    totalRewardsClaimed[userAddress] = totalRewardsClaimed[userAddress] + payout;
                    wofToken.transferFrom(garageContract, userAddress, payout);
                    emit PayOut(userAddress, payout);

                }
            }
            delete unclaimedAddresses;
        }
    }

    function payOutWithLocked(address _address) public {
        uint lockedWinnings = 0;
        for (uint256 j = 0; j < unclaimableRewards[_address].length; j++) {
            if (unclaimableRewards[_address][j].amount > 0 && unclaimableRewards[_address][j].claimed == false) {
                lockedWinnings = lockedWinnings + unclaimableRewards[_address][j].amount;
                delete unclaimableRewards[_address][j];
            }
        }
        uint256 payout = totalRewardsEarned[_address] - totalRewardsClaimed[_address] - (lockedWinnings * 65 / 100);
        if (payout > 0) {
            totalRewardsClaimed[_address] = totalRewardsClaimed[_address] + payout;
            wofToken.transferFrom(garageContract, _address, payout);
            emit PayOut(_address, payout);
            delete unclaimedAddresses;
        }   
    }

    /* ----- MANAGEMENT FNC ----- */
    function setOwner(address _address) public {
        require(msg.sender == owner, "Not the owner");
        owner = _address;
    }

    function setTokenContract(address _address) public {
        require(msg.sender == owner, "Not the owner");
        wofToken = IWofToken(_address);
    }

    function setLeaseContract(address _address) public {
        require(msg.sender == owner, "Not the owner");
        leasingContract = ILeasingContract(_address);
    }

    function setGarageContract(address _address) public {
        require(msg.sender == owner, "Not the owner");
        garageContract = _address;
    }

    //WIDTHRAW WOF TOKENS
    function withdraw(address _to, uint256 _amount) public {
        require(msg.sender == owner, "Not the owner");
        wofToken.transfer(_to, _amount);
    } 

    //SET MAX PARTICIPANTS
    function setMaxParticipants(uint256 _amount) public {
        require(msg.sender == owner, "Not the owner");
        MAX_PARTICIPANTS = _amount;
    }

    //CHANGE KEEPERS INTERVAL
    function setInterval(uint256 updateInterval) public {
        require(msg.sender == owner, "Not the owner");
        interval = updateInterval;
    }

    // ADD INITIAL DATA
    struct TkStats {
        uint256 id;
        uint256 firstPlaces;
        uint256 secondPlaces;
        uint256 thirdPlaces;
        uint256 racesJoined;
    }

    bool public canUplaod = true;

    function disableUploadStats() public {
        require(msg.sender == owner, "Not the owner");
        canUplaod = false;
    }

    function uploadInitialStats(TkStats[] memory _arr) public {
        require(msg.sender == owner, "Not the owner");
        require(canUplaod, "Uploading is disabled");
        for (uint256 i = 0; i < _arr.length; i++) {
            tokenStats[_arr[i].id].racesJoined = _arr[i].racesJoined;
            tokenStats[_arr[i].id].firstPlaces = _arr[i].firstPlaces;
            tokenStats[_arr[i].id].secondPlaces = _arr[i].secondPlaces;
            tokenStats[_arr[i].id].thirdPlaces = _arr[i].thirdPlaces;
        }
    }

    function uploadPunkStats(TkStats[] memory _arr) public {
        require(msg.sender == owner, "Not the owner");
        require(canUplaod, "Uploading is disabled");
        for (uint256 i = 0; i < _arr.length; i++) {
            freightPunkStats[_arr[i].id].racesJoined = _arr[i].racesJoined;
            freightPunkStats[_arr[i].id].firstPlaces = _arr[i].firstPlaces;
            freightPunkStats[_arr[i].id].secondPlaces = _arr[i].secondPlaces;
            freightPunkStats[_arr[i].id].thirdPlaces = _arr[i].thirdPlaces;
        }
    }
}

File 2 of 5 : SafeMath.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.6.0) (utils/math/SafeMath.sol)

pragma solidity ^0.8.0;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

File 3 of 5 : KeeperCompatible.sol
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;

import "./KeeperBase.sol";
import "./interfaces/KeeperCompatibleInterface.sol";

abstract contract KeeperCompatible is KeeperBase, KeeperCompatibleInterface {}

File 4 of 5 : KeeperBase.sol
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;

contract KeeperBase {
  error OnlySimulatedBackend();

  /**
   * @notice method that allows it to be simulated via eth_call by checking that
   * the sender is the zero address.
   */
  function preventExecution() internal view {
    if (tx.origin != address(0)) {
      revert OnlySimulatedBackend();
    }
  }

  /**
   * @notice modifier that allows it to be simulated via eth_call by checking
   * that the sender is the zero address.
   */
  modifier cannotExecute() {
    preventExecution();
    _;
  }
}

File 5 of 5 : KeeperCompatibleInterface.sol
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;

interface KeeperCompatibleInterface {
  /**
   * @notice method that is simulated by the keepers to see if any work actually
   * needs to be performed. This method does does not actually need to be
   * executable, and since it is only ever simulated it can consume lots of gas.
   * @dev To ensure that it is never called, you may want to add the
   * cannotExecute modifier from KeeperBase to your implementation of this
   * method.
   * @param checkData specified in the upkeep registration so it is always the
   * same for a registered upkeep. This can easily be broken down into specific
   * arguments using `abi.decode`, so multiple upkeeps can be registered on the
   * same contract and easily differentiated by the contract.
   * @return upkeepNeeded boolean to indicate whether the keeper should call
   * performUpkeep or not.
   * @return performData bytes that the keeper should call performUpkeep with, if
   * upkeep is needed. If you would like to encode data to decode later, try
   * `abi.encode`.
   */
  function checkUpkeep(bytes calldata checkData) external returns (bool upkeepNeeded, bytes memory performData);

  /**
   * @notice method that is actually executed by the keepers, via the registry.
   * The data returned by the checkUpkeep simulation will be passed into
   * this method to actually be executed.
   * @dev The input to this method should not be trusted, and the caller of the
   * method should not even be restricted to any single registry. Anyone should
   * be able call it, and the input should be validated, there is no guarantee
   * that the data passed in is the performData returned from checkUpkeep. This
   * could happen due to malicious keepers, racing keepers, or simply a state
   * change while the performUpkeep transaction is waiting for confirmation.
   * Always validate the data passed in.
   * @param performData is the data which was passed back from the checkData
   * simulation. If it is encoded, it can easily be decoded into other types by
   * calling `abi.decode`. This data should not be trusted, and should be
   * validated against the contract's current state.
   */
  function performUpkeep(bytes calldata performData) external;
}

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

Contract Security Audit

Contract ABI

API
[{"inputs":[{"internalType":"uint256","name":"updateInterval","type":"uint256"},{"internalType":"address","name":"_wofTokenAddress","type":"address"},{"internalType":"address","name":"_garageContract","type":"address"},{"internalType":"address","name":"_leasingContract","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"raceID","type":"uint256"},{"indexed":false,"internalType":"address","name":"racer","type":"address"},{"indexed":false,"internalType":"uint256","name":"token_id","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"punkID","type":"uint256"}],"name":"JoinRace","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"raceID","type":"uint256"},{"indexed":false,"internalType":"address","name":"racer","type":"address"},{"indexed":false,"internalType":"uint256","name":"token_id","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"punkID","type":"uint256"}],"name":"LeaveRace","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"racer","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"PayOut","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"raceID","type":"uint256"}],"name":"SeedsGenerated","type":"event"},{"inputs":[],"name":"MAX_PARTICIPANTS","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_raceID","type":"uint256"},{"internalType":"uint256","name":"_entranceFee","type":"uint256"},{"internalType":"uint256","name":"_prizePool","type":"uint256"}],"name":"addRace","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"canUplaod","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes","name":"","type":"bytes"}],"name":"checkUpkeep","outputs":[{"internalType":"bool","name":"upkeepNeeded","type":"bool"},{"internalType":"bytes","name":"","type":"bytes"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"claimLockedWinnings","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"claimWinnings","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"disableUploadStats","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"freightPunkStats","outputs":[{"internalType":"uint256","name":"racesJoined","type":"uint256"},{"internalType":"uint256","name":"firstPlaces","type":"uint256"},{"internalType":"uint256","name":"secondPlaces","type":"uint256"},{"internalType":"uint256","name":"thirdPlaces","type":"uint256"},{"internalType":"uint256","name":"tokensWon","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"garageContract","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenID","type":"uint256"}],"name":"getLeaseStatus","outputs":[{"internalType":"bool","name":"isLeased","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_address","type":"address"}],"name":"getLockedRewards","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_raceID","type":"uint256"},{"internalType":"uint256","name":"tokenID","type":"uint256"}],"name":"getParticipant","outputs":[{"components":[{"internalType":"address","name":"user","type":"address"},{"internalType":"uint256","name":"punkID","type":"uint256"},{"internalType":"uint256","name":"entranceFee","type":"uint256"},{"internalType":"uint256","name":"place","type":"uint256"}],"internalType":"struct WofRacingContract.Participant","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_address","type":"address"}],"name":"getUnlockedRewards","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"interval","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"raceID","type":"uint256"},{"internalType":"uint256","name":"tokenID","type":"uint256"}],"name":"isTokenInRace","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_raceID","type":"uint256"},{"internalType":"address","name":"_user","type":"address"},{"internalType":"uint256","name":"_tokenID","type":"uint256"},{"internalType":"uint256","name":"_entranceFee","type":"uint256"},{"internalType":"uint256","name":"_punkID","type":"uint256"}],"name":"joinRace","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"lastTimeStamp","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"leasingContract","outputs":[{"internalType":"contract ILeasingContract","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_address","type":"address"}],"name":"payOutWithLocked","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes","name":"","type":"bytes"}],"name":"performUpkeep","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"punkInRace","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"races","outputs":[{"internalType":"uint256","name":"prizePool","type":"uint256"},{"internalType":"uint256","name":"entranceFee","type":"uint256"},{"internalType":"bool","name":"finished","type":"bool"},{"internalType":"uint256","name":"participant_count","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"s_requestId","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_address","type":"address"}],"name":"setGarageContract","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"updateInterval","type":"uint256"}],"name":"setInterval","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_address","type":"address"}],"name":"setLeaseContract","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"setMaxParticipants","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_address","type":"address"}],"name":"setOwner","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_address","type":"address"}],"name":"setTokenContract","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"tokenInrace","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"tokenStats","outputs":[{"internalType":"uint256","name":"racesJoined","type":"uint256"},{"internalType":"uint256","name":"firstPlaces","type":"uint256"},{"internalType":"uint256","name":"secondPlaces","type":"uint256"},{"internalType":"uint256","name":"thirdPlaces","type":"uint256"},{"internalType":"uint256","name":"tokensWon","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"totalRewardsClaimed","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"totalRewardsEarned","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_raceID","type":"uint256"},{"internalType":"address","name":"_user","type":"address"},{"internalType":"uint256","name":"_tokenID","type":"uint256"},{"internalType":"uint256","name":"_punkID","type":"uint256"}],"name":"unJoinRace","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"unclaimableRewards","outputs":[{"internalType":"address","name":"user","type":"address"},{"internalType":"uint256","name":"timestamp","type":"uint256"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"bool","name":"claimed","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"unclaimedAddresses","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"components":[{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"uint256","name":"firstPlaces","type":"uint256"},{"internalType":"uint256","name":"secondPlaces","type":"uint256"},{"internalType":"uint256","name":"thirdPlaces","type":"uint256"},{"internalType":"uint256","name":"racesJoined","type":"uint256"}],"internalType":"struct WofRacingContract.TkStats[]","name":"_arr","type":"tuple[]"}],"name":"uploadInitialStats","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"components":[{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"uint256","name":"firstPlaces","type":"uint256"},{"internalType":"uint256","name":"secondPlaces","type":"uint256"},{"internalType":"uint256","name":"thirdPlaces","type":"uint256"},{"internalType":"uint256","name":"racesJoined","type":"uint256"}],"internalType":"struct WofRacingContract.TkStats[]","name":"_arr","type":"tuple[]"}],"name":"uploadPunkStats","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_raceID","type":"uint256"},{"components":[{"internalType":"address","name":"racer","type":"address"},{"internalType":"uint256","name":"tokenID","type":"uint256"},{"internalType":"uint256","name":"punkID","type":"uint256"},{"internalType":"uint256","name":"place","type":"uint256"}],"internalType":"struct WofRacingContract.Contestants[]","name":"_results","type":"tuple[]"}],"name":"uploadRaces","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"wofToken","outputs":[{"internalType":"contract IWofToken","name":"","type":"address"}],"stateMutability":"view","type":"function"}]

6080604052600c6005556011805460ff191660011790553480156200002357600080fd5b5060405162003ac938038062003ac98339810160408190526200004691620000b8565b60038054336001600160a01b031991821617909155600194909455426002556006805485166001600160a01b03948516179055600480548516928416929092179091556007805490931691161790556200010c565b80516001600160a01b0381168114620000b357600080fd5b919050565b60008060008060808587031215620000cf57600080fd5b84519350620000e1602086016200009b565b9250620000f1604086016200009b565b915062000101606086016200009b565b905092959194509250565b6139ad806200011c6000396000f3fe608060405234801561001057600080fd5b506004361061025d5760003560e01c80637673399a11610146578063c5260042116100c3578063e89e106a11610087578063e89e106a14610653578063e926ca951461065c578063e953ba7314610699578063f3baf070146106ac578063f3fef3a3146106b5578063f6ce9004146106c857600080fd5b8063c5260042146105ed578063cb441dea14610600578063e4341cea14610613578063e438005d14610620578063e4f24cb01461063357600080fd5b8063947a36fb1161010a578063947a36fb146105a3578063987f70ff146105ac578063b401faf1146105bf578063b859f825146105c7578063bbcd5bbe146105da57600080fd5b80637673399a146105015780637bbc469e1461051457806382689a0114610575578063833a71d7146105885780638da5cb5b1461059057600080fd5b80632ac426aa116101df57806352e320a0116101a357806352e320a01461047c57806360bd65631461049f57806362581a27146104b25780636e04ff0d146104ba5780636ea3d9be146104db5780637592b77f146104ee57600080fd5b80632ac426aa146104195780632bf7299b1461042c5780633b68705b1461043f5780633f3b3b27146104525780634585e33b1461046957600080fd5b806313af40351161022657806313af4035146103005780631aed59f014610313578063212b33f01461036257806322a90082146103c757806329250cb8146103da57600080fd5b8062f88a6614610262578063081e8924146102775780630c243484146102a75780630c2e6f18146102ba578063129927d3146102cd575b600080fd5b6102756102703660046133d7565b6106e8565b005b61028a6102853660046134bb565b6118ae565b6040516001600160a01b0390911681526020015b60405180910390f35b6102756102b53660046134d4565b6118d8565b6102756102c83660046134f8565b611924565b6102f06102db3660046134bb565b60106020526000908152604090205460ff1681565b604051901515815260200161029e565b61027561030e3660046134d4565b611af7565b610326610321366004613535565b611b43565b60405161029e919081516001600160a01b0316815260208083015190820152604080830151908201526060918201519181019190915260800190565b61039f6103703660046134bb565b600f60205260009081526040902080546001820154600283015460038401546004909401549293919290919085565b604080519586526020860194909452928401919091526060830152608082015260a00161029e565b6102756103d53660046134bb565b611bd2565b6103ed6103e8366004613557565b611c01565b604080516001600160a01b0390951685526020850193909352918301521515606082015260800161029e565b610275610427366004613583565b611c54565b61027561043a3660046134bb565b61201a565b60075461028a906001600160a01b031681565b61045b60025481565b60405190815260200161029e565b6102756104773660046135cb565b612049565b6102f061048a3660046134bb565b600e6020526000908152604090205460ff1681565b61045b6104ad3660046134d4565b61206f565b6102756120c3565b6104cd6104c83660046135cb565b6122fd565b60405161029e92919061363d565b6102756104e936600461369c565b61231c565b6102756104fc3660046136c8565b61238b565b61027561050f3660046136c8565b612572565b61054f6105223660046134bb565b60086020526000908152604090208054600182015460038301546004909301549192909160ff9091169084565b60408051948552602085019390935290151591830191909152606082015260800161029e565b6102f0610583366004613535565b612759565b610275612798565b60035461028a906001600160a01b031681565b61045b60015481565b60065461028a906001600160a01b031681565b6102756127ce565b60045461028a906001600160a01b031681565b6102756105e83660046134d4565b612835565b6102756105fb3660046134d4565b612881565b61045b61060e3660046134d4565b612b42565b6011546102f09060ff1681565b61027561062e3660046134d4565b612c57565b61045b6106413660046134d4565b600a6020526000908152604090205481565b61045b60005481565b61039f61066a3660046134bb565b600d60205260009081526040902080546001820154600283015460038401546004909401549293919290919085565b6102f06106a73660046134bb565b612ca3565b61045b60055481565b6102756106c3366004613557565b612d2a565b61045b6106d63660046134d4565b600b6020526000908152604090205481565b6003546001600160a01b031633146107385760405162461bcd60e51b815260206004820152600e60248201526d139bdd08105d5d1a1bdc9a5e995960921b60448201526064015b60405180910390fd5b6000828152600860205260408120805460019091015490915b83518110156118a7576000821580610791575061078b8686848151811061077a5761077a61379a565b602002602001015160200151612759565b15156001145b15610ef0576000600e60008785815181106107ae576107ae61379a565b602002602001015160200151815260200190815260200160002060006101000a81548160ff02191690831515021790555060008583815181106107f3576107f361379a565b602002602001015160400151111561084f5760006010600087858151811061081d5761081d61379a565b602002602001015160400151815260200190815260200160002060006101000a81548160ff0219169083151502179055505b600d60008684815181106108655761086561379a565b602002602001015160200151815260200190815260200160002060000154600161088f91906137c6565b600d60008785815181106108a5576108a561379a565b60200260200101516020015181526020019081526020016000206000018190555060008583815181106108da576108da61379a565b602002602001015160400151111561099257601060008684815181106109025761090261379a565b60209081029190910181015160400151825201528451600f906000908790859081106109305761093061379a565b602002602001015160400151815260200190815260200160002060000154600161095a91906137c6565b600f60008785815181106109705761097061379a565b6020026020010151604001518152602001908152602001600020600001819055505b8482815181106109a4576109a461379a565b60200260200101516060015160011415610af657600d60008684815181106109ce576109ce61379a565b60200260200101516020015181526020019081526020016000206001015460016109f891906137c6565b600d6000878581518110610a0e57610a0e61379a565b602002602001015160200151815260200190815260200160002060010181905550848281518110610a4157610a4161379a565b602002602001015160400151600014610acc57600f6000868481518110610a6a57610a6a61379a565b6020026020010151604001518152602001908152602001600020600101546001610a9491906137c6565b600f6000878581518110610aaa57610aaa61379a565b6020026020010151604001518152602001908152602001600020600101819055505b610af384868481518110610ae257610ae261379a565b602002602001015160600151612d8d565b90505b848281518110610b0857610b0861379a565b60200260200101516060015160021415610c4957600d6000868481518110610b3257610b3261379a565b6020026020010151602001518152602001908152602001600020600201546001610b5c91906137c6565b600d6000878581518110610b7257610b7261379a565b602002602001015160200151815260200190815260200160002060020181905550848281518110610ba557610ba561379a565b602002602001015160400151600014610c3057600f6000868481518110610bce57610bce61379a565b6020026020010151604001518152602001908152602001600020600201546001610bf891906137c6565b600f6000878581518110610c0e57610c0e61379a565b6020026020010151604001518152602001908152602001600020600201819055505b610c4684868481518110610ae257610ae261379a565b90505b848281518110610c5b57610c5b61379a565b60200260200101516060015160031415610d9c57600d6000868481518110610c8557610c8561379a565b6020026020010151602001518152602001908152602001600020600301546001610caf91906137c6565b600d6000878581518110610cc557610cc561379a565b602002602001015160200151815260200190815260200160002060030181905550848281518110610cf857610cf861379a565b602002602001015160400151600014610d8357600f6000868481518110610d2157610d2161379a565b6020026020010151604001518152602001908152602001600020600301546001610d4b91906137c6565b600f6000878581518110610d6157610d6161379a565b6020026020010151604001518152602001908152602001600020600301819055505b610d9984868481518110610ae257610ae261379a565b90505b60075485516000916001600160a01b03169063a7147de690889086908110610dc657610dc661379a565b6020026020010151602001516040518263ffffffff1660e01b8152600401610df091815260200190565b60806040518083038186803b158015610e0857600080fd5b505afa158015610e1c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e4091906137f3565b509092505081159050610eee5760075486516001600160a01b03909116906331c6c7e190889086908110610e7657610e7661379a565b6020026020010151602001516040518263ffffffff1660e01b8152600401610ea091815260200190565b600060405180830381600087803b158015610eba57600080fd5b505af1158015610ece573d6000803e3d6000fd5b50505050606482605f610ee19190613842565b610eeb9190613861565b91505b505b8015611894576007548551600091829182916001600160a01b03169063a7147de6908a9088908110610f2457610f2461379a565b6020026020010151602001516040518263ffffffff1660e01b8152600401610f4e91815260200190565b60806040518083038186803b158015610f6657600080fd5b505afa158015610f7a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f9e91906137f3565b60008d81526008602052604090206001015492965090945092501590506112fe57821561126d57600080600080600760009054906101000a90046001600160a01b03166001600160a01b03166335af1a4e8d8b815181106110015761100161379a565b602002602001015160200151886040518363ffffffff1660e01b8152600401611034929190918252602082015260400190565b60c06040518083038186803b15801561104c57600080fd5b505afa158015611060573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110849190613883565b939950939750909550935091505060018214806110a15750816003145b156111ce57600060646110b4838b613842565b6110be9190613861565b60065460405163a9059cbb60e01b81526001600160a01b0388811660048301526024820184905292935091169063a9059cbb90604401600060405180830381600087803b15801561110e57600080fd5b505af1158015611122573d6000803e3d6000fd5b50505050808961113291906138e1565b6006548e51919a506001600160a01b03169063a9059cbb908f908d90811061115c5761115c61379a565b6020908102919091010151516040516001600160e01b031960e084901b1681526001600160a01b039091166004820152602481018c9052604401600060405180830381600087803b1580156111b057600080fd5b505af11580156111c4573d6000803e3d6000fd5b5050505050611264565b6006548c516001600160a01b039091169063a9059cbb908e908c9081106111f7576111f761379a565b6020908102919091010151516040516001600160e01b031960e084901b1681526001600160a01b039091166004820152602481018b9052604401600060405180830381600087803b15801561124b57600080fd5b505af115801561125f573d6000803e3d6000fd5b505050505b50505050611890565b60065488516001600160a01b039091169063a9059cbb908a90889081106112965761129661379a565b6020908102919091010151516040516001600160e01b031960e084901b1681526001600160a01b03909116600482015260248101879052604401600060405180830381600087803b1580156112ea57600080fd5b505af1158015611264573d6000803e3d6000fd5b600a60008987815181106113145761131461379a565b6020026020010151600001516001600160a01b03166001600160a01b03168152602001908152602001600020546000141561139a57600988868151811061135d5761135d61379a565b6020908102919091018101515182546001810184556000938452919092200180546001600160a01b0319166001600160a01b039092169190911790555b821561180657600080600080600760009054906101000a90046001600160a01b03166001600160a01b03166335af1a4e8d8b815181106113dc576113dc61379a565b602002602001015160200151886040518363ffffffff1660e01b815260040161140f929190918252602082015260400190565b60c06040518083038186803b15801561142757600080fd5b505afa15801561143b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061145f9190613883565b9399509397509095509350915050600182148061147c5750816003145b1561168c576000606461148f838b613842565b6114999190613861565b6001600160a01b0386166000908152600a60205260409020549091506114c09082906137c6565b6001600160a01b0386166000908152600a60205260409020556114e3818a6138e1565b9850600c60008e8c815181106114fb576114fb61379a565b6020026020010151600001516001600160a01b03166001600160a01b0316815260200190815260200160002060405180608001604052808f8d815181106115445761154461379a565b6020026020010151600001516001600160a01b031681526020014281526020018b815260200160001515815250908060018154018082558091505060019003906000526020600020906004020160009091909190915060008201518160000160006101000a8154816001600160a01b0302191690836001600160a01b03160217905550602082015181600101556040820151816002015560608201518160030160006101000a81548160ff021916908315150217905550505088600a60008f8d815181106116145761161461379a565b6020026020010151600001516001600160a01b03166001600160a01b031681526020019081526020016000205461164b91906137c6565b600a60008f8d815181106116615761166161379a565b602090810291909101810151516001600160a01b031682528101919091526040016000205550611264565b600c60008d8b815181106116a2576116a261379a565b6020026020010151600001516001600160a01b03166001600160a01b0316815260200190815260200160002060405180608001604052808e8c815181106116eb576116eb61379a565b602090810291909101810151516001600160a01b039081168352428383015260408084018e905260006060948501819052865460018082018955978252848220875160049092020180546001600160a01b0319169190941617835592850151958201959095559383015160028501559101516003909201805460ff1916921515929092179091558c518991600a918f908d90811061178b5761178b61379a565b6020026020010151600001516001600160a01b03166001600160a01b03168152602001908152602001600020546117c291906137c6565b600a60008e8c815181106117d8576117d861379a565b602090810291909101810151516001600160a01b031682528101919091526040016000205550505050611890565b83600a60008a888151811061181d5761181d61379a565b6020026020010151600001516001600160a01b03166001600160a01b031681526020019081526020016000205461185491906137c6565b600a60008a888151811061186a5761186a61379a565b602090810291909101810151516001600160a01b03168252810191909152604001600020555b5050505b508061189f816138f8565b915050610751565b5050505050565b600981815481106118be57600080fd5b6000918252602090912001546001600160a01b0316905081565b6003546001600160a01b031633146119025760405162461bcd60e51b815260040161072f90613913565b600480546001600160a01b0319166001600160a01b0392909216919091179055565b60008481526008602090815260408083208584526002019091529020546001600160a01b031633146119985760405162461bcd60e51b815260206004820152601b60248201527f43616e206e6f7420756e6a6f696e206f746865722070656f706c650000000000604482015260640161072f565b60008481526008602081815260408084208685526002808201845282862080546001600160a01b031916815560018082018890559181018790556003018690559489905292909152910154600654915163a9059cbb60e01b81526001600160a01b038681166004830152602482018390529192919091169063a9059cbb90604401600060405180830381600087803b158015611a3357600080fd5b505af1158015611a47573d6000803e3d6000fd5b505050600086815260086020526040902060040154611a6991506001906138e1565b6000868152600860205260409020600481019190915554611a8b9082906138e1565b6000868152600860209081526040918290209290925580518781526001600160a01b038716928101929092528101849052606081018390527f486610e7950cc18b99f2e96078158edbdb0a971f7520894f5428b07ca8f6d1a69060800160405180910390a15050505050565b6003546001600160a01b03163314611b215760405162461bcd60e51b815260040161072f90613913565b600380546001600160a01b0319166001600160a01b0392909216919091179055565b611b77604051806080016040528060006001600160a01b031681526020016000815260200160008152602001600081525090565b5060008281526008602090815260408083208484526002908101835292819020815160808101835281546001600160a01b03168152600182015493810193909352928301549082015260039091015460608201525b92915050565b6003546001600160a01b03163314611bfc5760405162461bcd60e51b815260040161072f90613913565b600155565b600c6020528160005260406000208181548110611c1d57600080fd5b600091825260209091206004909102018054600182015460028301546003909301546001600160a01b039092169450925060ff1684565b6000858152600860205260409020600401546001600160a01b0385163314611cbe5760405162461bcd60e51b815260206004820152601f60248201527f43616e206f6e6c79206a6f696e207769746820796f7572206164647265737300604482015260640161072f565b6000848152600e602052604090205460ff16151560011415611d195760405162461bcd60e51b8152602060048201526014602482015273546f6b656e20616c726561647920726163696e6760601b604482015260640161072f565b600654604051636eb1769f60e11b81526001600160a01b0387811660048301523060248301528592169063dd62ed3e90604401602060405180830381600087803b158015611d6657600080fd5b505af1158015611d7a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611d9e919061393a565b11611deb5760405162461bcd60e51b815260206004820152601e60248201527f456e7472616e636520466565206578636565647320616c6c6f77616e63650000604482015260640161072f565b600086815260086020526040902060010154831015611e4c5760405162461bcd60e51b815260206004820152601d60248201527f456e7472616e63652066656520686967686572207468616e2073656e74000000604482015260640161072f565b600554811115611eae5760405162461bcd60e51b815260206004820152602760248201527f4d6178206e756d626572206f662072616365727320616c7265616479207265676044820152661a5cdd195c995960ca1b606482015260840161072f565b604080516080810182526001600160a01b03878116825260208083018681528385018881526000606086018181528d8252600885528782208c8352600290810190955290879020955186546001600160a01b0319169086161786559151600186015551918401919091555160039092019190915560065491516323b872dd60e01b81529116906323b872dd90611f4c90889030908890600401613953565b600060405180830381600087803b158015611f6657600080fd5b505af1158015611f7a573d6000803e3d6000fd5b50505050806001611f8b91906137c6565b6000878152600860205260409020600481019190915554611fad9084906137c6565b6000878152600860209081526040918290209290925580518881526001600160a01b038816928101929092528101859052606081018390527fc746505e2fda0290ec371b3b777afb0ff319bfa21d64b2bb398d9beca68083079060800160405180910390a1505050505050565b6003546001600160a01b031633146120445760405162461bcd60e51b815260040161072f90613913565b600555565b60015460025461205990426138e1565b111561206b574260025561206b612deb565b5050565b600080600061207d84612b42565b6001600160a01b0385166000908152600b6020908152604080832054600a9092529091205491925082916120b191906138e1565b6120bb91906138e1565b949350505050565b6120cc336130dd565b6000805b336000908152600c602052604090205481101561220e57336000908152600c602052604081208054839081106121085761210861379a565b90600052602060002090600402016002015411801561215c5750336000908152600c602052604090208054829081106121435761214361379a565b600091825260209091206003600490920201015460ff16155b156121fc57336000908152600c602052604090208054829081106121825761218261379a565b9060005260206000209060040201600201548261219f91906137c6565b336000908152600c60205260409020805491935090829081106121c4576121c461379a565b60009182526020822060049091020180546001600160a01b0319168155600181018290556002810191909155600301805460ff191690555b80612206816138f8565b9150506120d0565b506000606461221e836041613842565b6122289190613861565b336000908152600b6020908152604080832054600a9092529091205461224e91906138e1565b61225891906138e1565b9050801561206b57336000908152600b602052604090205461227b9082906137c6565b336000818152600b602052604090819020929092556006546004805493516323b872dd60e01b81526001600160a01b03928316946323b872dd946122c794909116929091879101613953565b600060405180830381600087803b1580156122e157600080fd5b505af11580156122f5573d6000803e3d6000fd5b505050505050565b600060606001546002544261231291906138e1565b1191509250929050565b600083815260086020526040902060018101839055600301805460ff19169055816123535760008381526008602052604090208190555b6040518381527f46d937130e22cbf287447003c079f8f4bd89aa30903898fe55e61bcf7a92526f9060200160405180910390a1505050565b6003546001600160a01b031633146123b55760405162461bcd60e51b815260040161072f90613913565b60115460ff166123ff5760405162461bcd60e51b8152602060048201526015602482015274155c1b1bd8591a5b99c81a5cc8191a5cd8589b1959605a1b604482015260640161072f565b60005b815181101561206b5781818151811061241d5761241d61379a565b602002602001015160800151600d600084848151811061243f5761243f61379a565b6020026020010151600001518152602001908152602001600020600001819055508181815181106124725761247261379a565b602002602001015160200151600d60008484815181106124945761249461379a565b6020026020010151600001518152602001908152602001600020600101819055508181815181106124c7576124c761379a565b602002602001015160400151600d60008484815181106124e9576124e961379a565b60200260200101516000015181526020019081526020016000206002018190555081818151811061251c5761251c61379a565b602002602001015160600151600d600084848151811061253e5761253e61379a565b602002602001015160000151815260200190815260200160002060030181905550808061256a906138f8565b915050612402565b6003546001600160a01b0316331461259c5760405162461bcd60e51b815260040161072f90613913565b60115460ff166125e65760405162461bcd60e51b8152602060048201526015602482015274155c1b1bd8591a5b99c81a5cc8191a5cd8589b1959605a1b604482015260640161072f565b60005b815181101561206b578181815181106126045761260461379a565b602002602001015160800151600f60008484815181106126265761262661379a565b6020026020010151600001518152602001908152602001600020600001819055508181815181106126595761265961379a565b602002602001015160200151600f600084848151811061267b5761267b61379a565b6020026020010151600001518152602001908152602001600020600101819055508181815181106126ae576126ae61379a565b602002602001015160400151600f60008484815181106126d0576126d061379a565b6020026020010151600001518152602001908152602001600020600201819055508181815181106127035761270361379a565b602002602001015160600151600f60008484815181106127255761272561379a565b6020026020010151600001518152602001908152602001600020600301819055508080612751906138f8565b9150506125e9565b60008281526008602090815260408083208484526002019091528120546001600160a01b03168061278e576000915050611bcc565b5060019392505050565b6003546001600160a01b031633146127c25760405162461bcd60e51b815260040161072f90613913565b6011805460ff19169055565b6127d7336130dd565b60006127e233612b42565b336000908152600b6020908152604080832054600a9092528220549293509091839161280d916138e1565b61281791906138e1565b336000908152600b602052604090205490915061227b9082906137c6565b6003546001600160a01b0316331461285f5760405162461bcd60e51b815260040161072f90613913565b600680546001600160a01b0319166001600160a01b0392909216919091179055565b6000805b6001600160a01b0383166000908152600c60205260409020548110156129f0576001600160a01b0383166000908152600c602052604081208054839081106128cf576128cf61379a565b90600052602060002090600402016002015411801561292c57506001600160a01b0383166000908152600c602052604090208054829081106129135761291361379a565b600091825260209091206003600490920201015460ff16155b156129de576001600160a01b0383166000908152600c6020526040902080548290811061295b5761295b61379a565b9060005260206000209060040201600201548261297891906137c6565b6001600160a01b0384166000908152600c60205260409020805491935090829081106129a6576129a661379a565b60009182526020822060049091020180546001600160a01b0319168155600181018290556002810191909155600301805460ff191690555b806129e8816138f8565b915050612885565b5060006064612a00836041613842565b612a0a9190613861565b6001600160a01b0384166000908152600b6020908152604080832054600a90925290912054612a3991906138e1565b612a4391906138e1565b90508015612b3d576001600160a01b0383166000908152600b6020526040902054612a6f9082906137c6565b6001600160a01b038085166000908152600b602052604090819020929092556006546004805493516323b872dd60e01b8152918316936323b872dd93612abc939116918891879101613953565b600060405180830381600087803b158015612ad657600080fd5b505af1158015612aea573d6000803e3d6000fd5b5050604080516001600160a01b0387168152602081018590527f9735b0cb909f3d21d5c16bbcccd272d85fa11446f6d679f6ecb170d2dabfecfc935001905060405180910390a1612b3d600960006132d1565b505050565b60008060005b6001600160a01b0384166000908152600c6020526040902054811015612c50576001600160a01b0384166000908152600c60205260408120805483908110612b9257612b9261379a565b906000526020600020906004020160020154118015612bef57506001600160a01b0384166000908152600c60205260409020805482908110612bd657612bd661379a565b600091825260209091206003600490920201015460ff16155b15612c3e576001600160a01b0384166000908152600c60205260409020805482908110612c1e57612c1e61379a565b90600052602060002090600402016002015482612c3b91906137c6565b91505b80612c48816138f8565b915050612b48565b5092915050565b6003546001600160a01b03163314612c815760405162461bcd60e51b815260040161072f90613913565b600780546001600160a01b0319166001600160a01b0392909216919091179055565b60075460405163538a3ef360e11b8152600481018390526000916001600160a01b03169063a7147de69060240160806040518083038186803b158015612ce857600080fd5b505afa158015612cfc573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612d2091906137f3565b5090949350505050565b6003546001600160a01b03163314612d545760405162461bcd60e51b815260040161072f90613913565b60065460405163a9059cbb60e01b81526001600160a01b038481166004830152602482018490529091169063a9059cbb906044016122c7565b60008160011415612db6576064612da584603c613842565b612daf9190613861565b9050611bcc565b8160021415612dcc576064612da5846019613842565b8160031415612de2576064612da584600f613842565b50600092915050565b600954156130db5760005b6009548110156130ce57600060098281548110612e1557612e1561379a565b60009182526020822001546001600160a01b03169150612e3862127500426138e1565b90506000805b6001600160a01b0384166000908152600c6020526040902054811015612f8e576001600160a01b0384166000908152600c60205260408120805483908110612e8857612e8861379a565b906000526020600020906004020160020154118015612ee557506001600160a01b0384166000908152600c60205260409020805482908110612ecc57612ecc61379a565b600091825260209091206003600490920201015460ff16155b8015612f2d57506001600160a01b0384166000908152600c60205260409020805484919083908110612f1957612f1961379a565b906000526020600020906004020160010154115b15612f7c576001600160a01b0384166000908152600c60205260409020805482908110612f5c57612f5c61379a565b90600052602060002090600402016002015482612f7991906137c6565b91505b80612f86816138f8565b915050612e3e565b506001600160a01b0383166000908152600b6020908152604080832054600a9092528220548391612fbe916138e1565b612fc891906138e1565b905080156130b7576001600160a01b0384166000908152600b6020526040902054612ff49082906137c6565b6001600160a01b038086166000908152600b602052604090819020929092556006546004805493516323b872dd60e01b8152918316936323b872dd93613041939116918991879101613953565b600060405180830381600087803b15801561305b57600080fd5b505af115801561306f573d6000803e3d6000fd5b5050604080516001600160a01b0388168152602081018590527f9735b0cb909f3d21d5c16bbcccd272d85fa11446f6d679f6ecb170d2dabfecfc935001905060405180910390a15b5050505080806130c6906138f8565b915050612df6565b506130db600960006132d1565b565b60006130ec62127500426138e1565b905060005b6001600160a01b0383166000908152600c6020526040902054811015612b3d576001600160a01b0383166000908152600c6020526040812080548390811061313b5761313b61379a565b90600052602060002090600402016002015411801561319857506001600160a01b0383166000908152600c6020526040902080548290811061317f5761317f61379a565b600091825260209091206003600490920201015460ff16155b80156131e057506001600160a01b0383166000908152600c602052604090208054839190839081106131cc576131cc61379a565b906000526020600020906004020160010154105b156132bf576001600160a01b0383166000908152600c6020526040902080548290811061320f5761320f61379a565b906000526020600020906004020160020154600a6000856001600160a01b03166001600160a01b031681526020019081526020016000205461325191906137c6565b6001600160a01b0384166000908152600a6020908152604080832093909355600c9052208054829081106132875761328761379a565b60009182526020822060049091020180546001600160a01b0319168155600181018290556002810191909155600301805460ff191690555b806132c9816138f8565b9150506130f1565b50805460008255906000526020600020908101906132ef91906132f2565b50565b5b8082111561330757600081556001016132f3565b5090565b634e487b7160e01b600052604160045260246000fd5b6040516080810167ffffffffffffffff811182821017156133445761334461330b565b60405290565b60405160a0810167ffffffffffffffff811182821017156133445761334461330b565b604051601f8201601f1916810167ffffffffffffffff811182821017156133965761339661330b565b604052919050565b600067ffffffffffffffff8211156133b8576133b861330b565b5060051b60200190565b6001600160a01b03811681146132ef57600080fd5b60008060408084860312156133eb57600080fd5b8335925060208085013567ffffffffffffffff81111561340a57600080fd5b8501601f8101871361341b57600080fd5b803561342e6134298261339e565b61336d565b81815260079190911b8201830190838101908983111561344d57600080fd5b928401925b828410156134ab576080848b03121561346b5760008081fd5b613473613321565b843561347e816133c2565b81528486013586820152868501358782015260608086013590820152825260809093019290840190613452565b8096505050505050509250929050565b6000602082840312156134cd57600080fd5b5035919050565b6000602082840312156134e657600080fd5b81356134f1816133c2565b9392505050565b6000806000806080858703121561350e57600080fd5b843593506020850135613520816133c2565b93969395505050506040820135916060013590565b6000806040838503121561354857600080fd5b50508035926020909101359150565b6000806040838503121561356a57600080fd5b8235613575816133c2565b946020939093013593505050565b600080600080600060a0868803121561359b57600080fd5b8535945060208601356135ad816133c2565b94979496505050506040830135926060810135926080909101359150565b600080602083850312156135de57600080fd5b823567ffffffffffffffff808211156135f657600080fd5b818501915085601f83011261360a57600080fd5b81358181111561361957600080fd5b86602082850101111561362b57600080fd5b60209290920196919550909350505050565b821515815260006020604081840152835180604085015260005b8181101561367357858101830151858201606001528201613657565b81811115613685576000606083870101525b50601f01601f191692909201606001949350505050565b6000806000606084860312156136b157600080fd5b505081359360208301359350604090920135919050565b600060208083850312156136db57600080fd5b823567ffffffffffffffff8111156136f257600080fd5b8301601f8101851361370357600080fd5b80356137116134298261339e565b81815260a0918202830184019184820191908884111561373057600080fd5b938501935b8385101561378e5780858a03121561374d5760008081fd5b61375561334a565b85358152868601358782015260408087013590820152606080870135908201526080808701359082015283529384019391850191613735565b50979650505050505050565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b600082198211156137d9576137d96137b0565b500190565b805180151581146137ee57600080fd5b919050565b6000806000806080858703121561380957600080fd5b613812856137de565b9350613820602086016137de565b9250604085015191506060850151613837816133c2565b939692955090935050565b600081600019048311821515161561385c5761385c6137b0565b500290565b60008261387e57634e487b7160e01b600052601260045260246000fd5b500490565b60008060008060008060c0878903121561389c57600080fd5b86516138a7816133c2565b60208801519096506138b8816133c2565b6040880151606089015160808a015160a0909a0151989b929a5090989097909650945092505050565b6000828210156138f3576138f36137b0565b500390565b600060001982141561390c5761390c6137b0565b5060010190565b6020808252600d908201526c2737ba103a34329037bbb732b960991b604082015260600190565b60006020828403121561394c57600080fd5b5051919050565b6001600160a01b03938416815291909216602082015260408101919091526060019056fea2646970667358221220a9dc701847eb833221f31fb5c366d2c0e55cc4584045a389b6a6336f84b964ef64736f6c63430008090033000000000000000000000000000000000000000000000000000000000000a6680000000000000000000000007f8a13a102aaaa5fc3ab87e5162b1b50e022d1d200000000000000000000000030264a8866a4c83d58d396854fca311fb5d37de0000000000000000000000000d2def97f0e67b8cbc5b7e530da58e5daae88c322

Deployed Bytecode

0x608060405234801561001057600080fd5b506004361061025d5760003560e01c80637673399a11610146578063c5260042116100c3578063e89e106a11610087578063e89e106a14610653578063e926ca951461065c578063e953ba7314610699578063f3baf070146106ac578063f3fef3a3146106b5578063f6ce9004146106c857600080fd5b8063c5260042146105ed578063cb441dea14610600578063e4341cea14610613578063e438005d14610620578063e4f24cb01461063357600080fd5b8063947a36fb1161010a578063947a36fb146105a3578063987f70ff146105ac578063b401faf1146105bf578063b859f825146105c7578063bbcd5bbe146105da57600080fd5b80637673399a146105015780637bbc469e1461051457806382689a0114610575578063833a71d7146105885780638da5cb5b1461059057600080fd5b80632ac426aa116101df57806352e320a0116101a357806352e320a01461047c57806360bd65631461049f57806362581a27146104b25780636e04ff0d146104ba5780636ea3d9be146104db5780637592b77f146104ee57600080fd5b80632ac426aa146104195780632bf7299b1461042c5780633b68705b1461043f5780633f3b3b27146104525780634585e33b1461046957600080fd5b806313af40351161022657806313af4035146103005780631aed59f014610313578063212b33f01461036257806322a90082146103c757806329250cb8146103da57600080fd5b8062f88a6614610262578063081e8924146102775780630c243484146102a75780630c2e6f18146102ba578063129927d3146102cd575b600080fd5b6102756102703660046133d7565b6106e8565b005b61028a6102853660046134bb565b6118ae565b6040516001600160a01b0390911681526020015b60405180910390f35b6102756102b53660046134d4565b6118d8565b6102756102c83660046134f8565b611924565b6102f06102db3660046134bb565b60106020526000908152604090205460ff1681565b604051901515815260200161029e565b61027561030e3660046134d4565b611af7565b610326610321366004613535565b611b43565b60405161029e919081516001600160a01b0316815260208083015190820152604080830151908201526060918201519181019190915260800190565b61039f6103703660046134bb565b600f60205260009081526040902080546001820154600283015460038401546004909401549293919290919085565b604080519586526020860194909452928401919091526060830152608082015260a00161029e565b6102756103d53660046134bb565b611bd2565b6103ed6103e8366004613557565b611c01565b604080516001600160a01b0390951685526020850193909352918301521515606082015260800161029e565b610275610427366004613583565b611c54565b61027561043a3660046134bb565b61201a565b60075461028a906001600160a01b031681565b61045b60025481565b60405190815260200161029e565b6102756104773660046135cb565b612049565b6102f061048a3660046134bb565b600e6020526000908152604090205460ff1681565b61045b6104ad3660046134d4565b61206f565b6102756120c3565b6104cd6104c83660046135cb565b6122fd565b60405161029e92919061363d565b6102756104e936600461369c565b61231c565b6102756104fc3660046136c8565b61238b565b61027561050f3660046136c8565b612572565b61054f6105223660046134bb565b60086020526000908152604090208054600182015460038301546004909301549192909160ff9091169084565b60408051948552602085019390935290151591830191909152606082015260800161029e565b6102f0610583366004613535565b612759565b610275612798565b60035461028a906001600160a01b031681565b61045b60015481565b60065461028a906001600160a01b031681565b6102756127ce565b60045461028a906001600160a01b031681565b6102756105e83660046134d4565b612835565b6102756105fb3660046134d4565b612881565b61045b61060e3660046134d4565b612b42565b6011546102f09060ff1681565b61027561062e3660046134d4565b612c57565b61045b6106413660046134d4565b600a6020526000908152604090205481565b61045b60005481565b61039f61066a3660046134bb565b600d60205260009081526040902080546001820154600283015460038401546004909401549293919290919085565b6102f06106a73660046134bb565b612ca3565b61045b60055481565b6102756106c3366004613557565b612d2a565b61045b6106d63660046134d4565b600b6020526000908152604090205481565b6003546001600160a01b031633146107385760405162461bcd60e51b815260206004820152600e60248201526d139bdd08105d5d1a1bdc9a5e995960921b60448201526064015b60405180910390fd5b6000828152600860205260408120805460019091015490915b83518110156118a7576000821580610791575061078b8686848151811061077a5761077a61379a565b602002602001015160200151612759565b15156001145b15610ef0576000600e60008785815181106107ae576107ae61379a565b602002602001015160200151815260200190815260200160002060006101000a81548160ff02191690831515021790555060008583815181106107f3576107f361379a565b602002602001015160400151111561084f5760006010600087858151811061081d5761081d61379a565b602002602001015160400151815260200190815260200160002060006101000a81548160ff0219169083151502179055505b600d60008684815181106108655761086561379a565b602002602001015160200151815260200190815260200160002060000154600161088f91906137c6565b600d60008785815181106108a5576108a561379a565b60200260200101516020015181526020019081526020016000206000018190555060008583815181106108da576108da61379a565b602002602001015160400151111561099257601060008684815181106109025761090261379a565b60209081029190910181015160400151825201528451600f906000908790859081106109305761093061379a565b602002602001015160400151815260200190815260200160002060000154600161095a91906137c6565b600f60008785815181106109705761097061379a565b6020026020010151604001518152602001908152602001600020600001819055505b8482815181106109a4576109a461379a565b60200260200101516060015160011415610af657600d60008684815181106109ce576109ce61379a565b60200260200101516020015181526020019081526020016000206001015460016109f891906137c6565b600d6000878581518110610a0e57610a0e61379a565b602002602001015160200151815260200190815260200160002060010181905550848281518110610a4157610a4161379a565b602002602001015160400151600014610acc57600f6000868481518110610a6a57610a6a61379a565b6020026020010151604001518152602001908152602001600020600101546001610a9491906137c6565b600f6000878581518110610aaa57610aaa61379a565b6020026020010151604001518152602001908152602001600020600101819055505b610af384868481518110610ae257610ae261379a565b602002602001015160600151612d8d565b90505b848281518110610b0857610b0861379a565b60200260200101516060015160021415610c4957600d6000868481518110610b3257610b3261379a565b6020026020010151602001518152602001908152602001600020600201546001610b5c91906137c6565b600d6000878581518110610b7257610b7261379a565b602002602001015160200151815260200190815260200160002060020181905550848281518110610ba557610ba561379a565b602002602001015160400151600014610c3057600f6000868481518110610bce57610bce61379a565b6020026020010151604001518152602001908152602001600020600201546001610bf891906137c6565b600f6000878581518110610c0e57610c0e61379a565b6020026020010151604001518152602001908152602001600020600201819055505b610c4684868481518110610ae257610ae261379a565b90505b848281518110610c5b57610c5b61379a565b60200260200101516060015160031415610d9c57600d6000868481518110610c8557610c8561379a565b6020026020010151602001518152602001908152602001600020600301546001610caf91906137c6565b600d6000878581518110610cc557610cc561379a565b602002602001015160200151815260200190815260200160002060030181905550848281518110610cf857610cf861379a565b602002602001015160400151600014610d8357600f6000868481518110610d2157610d2161379a565b6020026020010151604001518152602001908152602001600020600301546001610d4b91906137c6565b600f6000878581518110610d6157610d6161379a565b6020026020010151604001518152602001908152602001600020600301819055505b610d9984868481518110610ae257610ae261379a565b90505b60075485516000916001600160a01b03169063a7147de690889086908110610dc657610dc661379a565b6020026020010151602001516040518263ffffffff1660e01b8152600401610df091815260200190565b60806040518083038186803b158015610e0857600080fd5b505afa158015610e1c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e4091906137f3565b509092505081159050610eee5760075486516001600160a01b03909116906331c6c7e190889086908110610e7657610e7661379a565b6020026020010151602001516040518263ffffffff1660e01b8152600401610ea091815260200190565b600060405180830381600087803b158015610eba57600080fd5b505af1158015610ece573d6000803e3d6000fd5b50505050606482605f610ee19190613842565b610eeb9190613861565b91505b505b8015611894576007548551600091829182916001600160a01b03169063a7147de6908a9088908110610f2457610f2461379a565b6020026020010151602001516040518263ffffffff1660e01b8152600401610f4e91815260200190565b60806040518083038186803b158015610f6657600080fd5b505afa158015610f7a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f9e91906137f3565b60008d81526008602052604090206001015492965090945092501590506112fe57821561126d57600080600080600760009054906101000a90046001600160a01b03166001600160a01b03166335af1a4e8d8b815181106110015761100161379a565b602002602001015160200151886040518363ffffffff1660e01b8152600401611034929190918252602082015260400190565b60c06040518083038186803b15801561104c57600080fd5b505afa158015611060573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110849190613883565b939950939750909550935091505060018214806110a15750816003145b156111ce57600060646110b4838b613842565b6110be9190613861565b60065460405163a9059cbb60e01b81526001600160a01b0388811660048301526024820184905292935091169063a9059cbb90604401600060405180830381600087803b15801561110e57600080fd5b505af1158015611122573d6000803e3d6000fd5b50505050808961113291906138e1565b6006548e51919a506001600160a01b03169063a9059cbb908f908d90811061115c5761115c61379a565b6020908102919091010151516040516001600160e01b031960e084901b1681526001600160a01b039091166004820152602481018c9052604401600060405180830381600087803b1580156111b057600080fd5b505af11580156111c4573d6000803e3d6000fd5b5050505050611264565b6006548c516001600160a01b039091169063a9059cbb908e908c9081106111f7576111f761379a565b6020908102919091010151516040516001600160e01b031960e084901b1681526001600160a01b039091166004820152602481018b9052604401600060405180830381600087803b15801561124b57600080fd5b505af115801561125f573d6000803e3d6000fd5b505050505b50505050611890565b60065488516001600160a01b039091169063a9059cbb908a90889081106112965761129661379a565b6020908102919091010151516040516001600160e01b031960e084901b1681526001600160a01b03909116600482015260248101879052604401600060405180830381600087803b1580156112ea57600080fd5b505af1158015611264573d6000803e3d6000fd5b600a60008987815181106113145761131461379a565b6020026020010151600001516001600160a01b03166001600160a01b03168152602001908152602001600020546000141561139a57600988868151811061135d5761135d61379a565b6020908102919091018101515182546001810184556000938452919092200180546001600160a01b0319166001600160a01b039092169190911790555b821561180657600080600080600760009054906101000a90046001600160a01b03166001600160a01b03166335af1a4e8d8b815181106113dc576113dc61379a565b602002602001015160200151886040518363ffffffff1660e01b815260040161140f929190918252602082015260400190565b60c06040518083038186803b15801561142757600080fd5b505afa15801561143b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061145f9190613883565b9399509397509095509350915050600182148061147c5750816003145b1561168c576000606461148f838b613842565b6114999190613861565b6001600160a01b0386166000908152600a60205260409020549091506114c09082906137c6565b6001600160a01b0386166000908152600a60205260409020556114e3818a6138e1565b9850600c60008e8c815181106114fb576114fb61379a565b6020026020010151600001516001600160a01b03166001600160a01b0316815260200190815260200160002060405180608001604052808f8d815181106115445761154461379a565b6020026020010151600001516001600160a01b031681526020014281526020018b815260200160001515815250908060018154018082558091505060019003906000526020600020906004020160009091909190915060008201518160000160006101000a8154816001600160a01b0302191690836001600160a01b03160217905550602082015181600101556040820151816002015560608201518160030160006101000a81548160ff021916908315150217905550505088600a60008f8d815181106116145761161461379a565b6020026020010151600001516001600160a01b03166001600160a01b031681526020019081526020016000205461164b91906137c6565b600a60008f8d815181106116615761166161379a565b602090810291909101810151516001600160a01b031682528101919091526040016000205550611264565b600c60008d8b815181106116a2576116a261379a565b6020026020010151600001516001600160a01b03166001600160a01b0316815260200190815260200160002060405180608001604052808e8c815181106116eb576116eb61379a565b602090810291909101810151516001600160a01b039081168352428383015260408084018e905260006060948501819052865460018082018955978252848220875160049092020180546001600160a01b0319169190941617835592850151958201959095559383015160028501559101516003909201805460ff1916921515929092179091558c518991600a918f908d90811061178b5761178b61379a565b6020026020010151600001516001600160a01b03166001600160a01b03168152602001908152602001600020546117c291906137c6565b600a60008e8c815181106117d8576117d861379a565b602090810291909101810151516001600160a01b031682528101919091526040016000205550505050611890565b83600a60008a888151811061181d5761181d61379a565b6020026020010151600001516001600160a01b03166001600160a01b031681526020019081526020016000205461185491906137c6565b600a60008a888151811061186a5761186a61379a565b602090810291909101810151516001600160a01b03168252810191909152604001600020555b5050505b508061189f816138f8565b915050610751565b5050505050565b600981815481106118be57600080fd5b6000918252602090912001546001600160a01b0316905081565b6003546001600160a01b031633146119025760405162461bcd60e51b815260040161072f90613913565b600480546001600160a01b0319166001600160a01b0392909216919091179055565b60008481526008602090815260408083208584526002019091529020546001600160a01b031633146119985760405162461bcd60e51b815260206004820152601b60248201527f43616e206e6f7420756e6a6f696e206f746865722070656f706c650000000000604482015260640161072f565b60008481526008602081815260408084208685526002808201845282862080546001600160a01b031916815560018082018890559181018790556003018690559489905292909152910154600654915163a9059cbb60e01b81526001600160a01b038681166004830152602482018390529192919091169063a9059cbb90604401600060405180830381600087803b158015611a3357600080fd5b505af1158015611a47573d6000803e3d6000fd5b505050600086815260086020526040902060040154611a6991506001906138e1565b6000868152600860205260409020600481019190915554611a8b9082906138e1565b6000868152600860209081526040918290209290925580518781526001600160a01b038716928101929092528101849052606081018390527f486610e7950cc18b99f2e96078158edbdb0a971f7520894f5428b07ca8f6d1a69060800160405180910390a15050505050565b6003546001600160a01b03163314611b215760405162461bcd60e51b815260040161072f90613913565b600380546001600160a01b0319166001600160a01b0392909216919091179055565b611b77604051806080016040528060006001600160a01b031681526020016000815260200160008152602001600081525090565b5060008281526008602090815260408083208484526002908101835292819020815160808101835281546001600160a01b03168152600182015493810193909352928301549082015260039091015460608201525b92915050565b6003546001600160a01b03163314611bfc5760405162461bcd60e51b815260040161072f90613913565b600155565b600c6020528160005260406000208181548110611c1d57600080fd5b600091825260209091206004909102018054600182015460028301546003909301546001600160a01b039092169450925060ff1684565b6000858152600860205260409020600401546001600160a01b0385163314611cbe5760405162461bcd60e51b815260206004820152601f60248201527f43616e206f6e6c79206a6f696e207769746820796f7572206164647265737300604482015260640161072f565b6000848152600e602052604090205460ff16151560011415611d195760405162461bcd60e51b8152602060048201526014602482015273546f6b656e20616c726561647920726163696e6760601b604482015260640161072f565b600654604051636eb1769f60e11b81526001600160a01b0387811660048301523060248301528592169063dd62ed3e90604401602060405180830381600087803b158015611d6657600080fd5b505af1158015611d7a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611d9e919061393a565b11611deb5760405162461bcd60e51b815260206004820152601e60248201527f456e7472616e636520466565206578636565647320616c6c6f77616e63650000604482015260640161072f565b600086815260086020526040902060010154831015611e4c5760405162461bcd60e51b815260206004820152601d60248201527f456e7472616e63652066656520686967686572207468616e2073656e74000000604482015260640161072f565b600554811115611eae5760405162461bcd60e51b815260206004820152602760248201527f4d6178206e756d626572206f662072616365727320616c7265616479207265676044820152661a5cdd195c995960ca1b606482015260840161072f565b604080516080810182526001600160a01b03878116825260208083018681528385018881526000606086018181528d8252600885528782208c8352600290810190955290879020955186546001600160a01b0319169086161786559151600186015551918401919091555160039092019190915560065491516323b872dd60e01b81529116906323b872dd90611f4c90889030908890600401613953565b600060405180830381600087803b158015611f6657600080fd5b505af1158015611f7a573d6000803e3d6000fd5b50505050806001611f8b91906137c6565b6000878152600860205260409020600481019190915554611fad9084906137c6565b6000878152600860209081526040918290209290925580518881526001600160a01b038816928101929092528101859052606081018390527fc746505e2fda0290ec371b3b777afb0ff319bfa21d64b2bb398d9beca68083079060800160405180910390a1505050505050565b6003546001600160a01b031633146120445760405162461bcd60e51b815260040161072f90613913565b600555565b60015460025461205990426138e1565b111561206b574260025561206b612deb565b5050565b600080600061207d84612b42565b6001600160a01b0385166000908152600b6020908152604080832054600a9092529091205491925082916120b191906138e1565b6120bb91906138e1565b949350505050565b6120cc336130dd565b6000805b336000908152600c602052604090205481101561220e57336000908152600c602052604081208054839081106121085761210861379a565b90600052602060002090600402016002015411801561215c5750336000908152600c602052604090208054829081106121435761214361379a565b600091825260209091206003600490920201015460ff16155b156121fc57336000908152600c602052604090208054829081106121825761218261379a565b9060005260206000209060040201600201548261219f91906137c6565b336000908152600c60205260409020805491935090829081106121c4576121c461379a565b60009182526020822060049091020180546001600160a01b0319168155600181018290556002810191909155600301805460ff191690555b80612206816138f8565b9150506120d0565b506000606461221e836041613842565b6122289190613861565b336000908152600b6020908152604080832054600a9092529091205461224e91906138e1565b61225891906138e1565b9050801561206b57336000908152600b602052604090205461227b9082906137c6565b336000818152600b602052604090819020929092556006546004805493516323b872dd60e01b81526001600160a01b03928316946323b872dd946122c794909116929091879101613953565b600060405180830381600087803b1580156122e157600080fd5b505af11580156122f5573d6000803e3d6000fd5b505050505050565b600060606001546002544261231291906138e1565b1191509250929050565b600083815260086020526040902060018101839055600301805460ff19169055816123535760008381526008602052604090208190555b6040518381527f46d937130e22cbf287447003c079f8f4bd89aa30903898fe55e61bcf7a92526f9060200160405180910390a1505050565b6003546001600160a01b031633146123b55760405162461bcd60e51b815260040161072f90613913565b60115460ff166123ff5760405162461bcd60e51b8152602060048201526015602482015274155c1b1bd8591a5b99c81a5cc8191a5cd8589b1959605a1b604482015260640161072f565b60005b815181101561206b5781818151811061241d5761241d61379a565b602002602001015160800151600d600084848151811061243f5761243f61379a565b6020026020010151600001518152602001908152602001600020600001819055508181815181106124725761247261379a565b602002602001015160200151600d60008484815181106124945761249461379a565b6020026020010151600001518152602001908152602001600020600101819055508181815181106124c7576124c761379a565b602002602001015160400151600d60008484815181106124e9576124e961379a565b60200260200101516000015181526020019081526020016000206002018190555081818151811061251c5761251c61379a565b602002602001015160600151600d600084848151811061253e5761253e61379a565b602002602001015160000151815260200190815260200160002060030181905550808061256a906138f8565b915050612402565b6003546001600160a01b0316331461259c5760405162461bcd60e51b815260040161072f90613913565b60115460ff166125e65760405162461bcd60e51b8152602060048201526015602482015274155c1b1bd8591a5b99c81a5cc8191a5cd8589b1959605a1b604482015260640161072f565b60005b815181101561206b578181815181106126045761260461379a565b602002602001015160800151600f60008484815181106126265761262661379a565b6020026020010151600001518152602001908152602001600020600001819055508181815181106126595761265961379a565b602002602001015160200151600f600084848151811061267b5761267b61379a565b6020026020010151600001518152602001908152602001600020600101819055508181815181106126ae576126ae61379a565b602002602001015160400151600f60008484815181106126d0576126d061379a565b6020026020010151600001518152602001908152602001600020600201819055508181815181106127035761270361379a565b602002602001015160600151600f60008484815181106127255761272561379a565b6020026020010151600001518152602001908152602001600020600301819055508080612751906138f8565b9150506125e9565b60008281526008602090815260408083208484526002019091528120546001600160a01b03168061278e576000915050611bcc565b5060019392505050565b6003546001600160a01b031633146127c25760405162461bcd60e51b815260040161072f90613913565b6011805460ff19169055565b6127d7336130dd565b60006127e233612b42565b336000908152600b6020908152604080832054600a9092528220549293509091839161280d916138e1565b61281791906138e1565b336000908152600b602052604090205490915061227b9082906137c6565b6003546001600160a01b0316331461285f5760405162461bcd60e51b815260040161072f90613913565b600680546001600160a01b0319166001600160a01b0392909216919091179055565b6000805b6001600160a01b0383166000908152600c60205260409020548110156129f0576001600160a01b0383166000908152600c602052604081208054839081106128cf576128cf61379a565b90600052602060002090600402016002015411801561292c57506001600160a01b0383166000908152600c602052604090208054829081106129135761291361379a565b600091825260209091206003600490920201015460ff16155b156129de576001600160a01b0383166000908152600c6020526040902080548290811061295b5761295b61379a565b9060005260206000209060040201600201548261297891906137c6565b6001600160a01b0384166000908152600c60205260409020805491935090829081106129a6576129a661379a565b60009182526020822060049091020180546001600160a01b0319168155600181018290556002810191909155600301805460ff191690555b806129e8816138f8565b915050612885565b5060006064612a00836041613842565b612a0a9190613861565b6001600160a01b0384166000908152600b6020908152604080832054600a90925290912054612a3991906138e1565b612a4391906138e1565b90508015612b3d576001600160a01b0383166000908152600b6020526040902054612a6f9082906137c6565b6001600160a01b038085166000908152600b602052604090819020929092556006546004805493516323b872dd60e01b8152918316936323b872dd93612abc939116918891879101613953565b600060405180830381600087803b158015612ad657600080fd5b505af1158015612aea573d6000803e3d6000fd5b5050604080516001600160a01b0387168152602081018590527f9735b0cb909f3d21d5c16bbcccd272d85fa11446f6d679f6ecb170d2dabfecfc935001905060405180910390a1612b3d600960006132d1565b505050565b60008060005b6001600160a01b0384166000908152600c6020526040902054811015612c50576001600160a01b0384166000908152600c60205260408120805483908110612b9257612b9261379a565b906000526020600020906004020160020154118015612bef57506001600160a01b0384166000908152600c60205260409020805482908110612bd657612bd661379a565b600091825260209091206003600490920201015460ff16155b15612c3e576001600160a01b0384166000908152600c60205260409020805482908110612c1e57612c1e61379a565b90600052602060002090600402016002015482612c3b91906137c6565b91505b80612c48816138f8565b915050612b48565b5092915050565b6003546001600160a01b03163314612c815760405162461bcd60e51b815260040161072f90613913565b600780546001600160a01b0319166001600160a01b0392909216919091179055565b60075460405163538a3ef360e11b8152600481018390526000916001600160a01b03169063a7147de69060240160806040518083038186803b158015612ce857600080fd5b505afa158015612cfc573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612d2091906137f3565b5090949350505050565b6003546001600160a01b03163314612d545760405162461bcd60e51b815260040161072f90613913565b60065460405163a9059cbb60e01b81526001600160a01b038481166004830152602482018490529091169063a9059cbb906044016122c7565b60008160011415612db6576064612da584603c613842565b612daf9190613861565b9050611bcc565b8160021415612dcc576064612da5846019613842565b8160031415612de2576064612da584600f613842565b50600092915050565b600954156130db5760005b6009548110156130ce57600060098281548110612e1557612e1561379a565b60009182526020822001546001600160a01b03169150612e3862127500426138e1565b90506000805b6001600160a01b0384166000908152600c6020526040902054811015612f8e576001600160a01b0384166000908152600c60205260408120805483908110612e8857612e8861379a565b906000526020600020906004020160020154118015612ee557506001600160a01b0384166000908152600c60205260409020805482908110612ecc57612ecc61379a565b600091825260209091206003600490920201015460ff16155b8015612f2d57506001600160a01b0384166000908152600c60205260409020805484919083908110612f1957612f1961379a565b906000526020600020906004020160010154115b15612f7c576001600160a01b0384166000908152600c60205260409020805482908110612f5c57612f5c61379a565b90600052602060002090600402016002015482612f7991906137c6565b91505b80612f86816138f8565b915050612e3e565b506001600160a01b0383166000908152600b6020908152604080832054600a9092528220548391612fbe916138e1565b612fc891906138e1565b905080156130b7576001600160a01b0384166000908152600b6020526040902054612ff49082906137c6565b6001600160a01b038086166000908152600b602052604090819020929092556006546004805493516323b872dd60e01b8152918316936323b872dd93613041939116918991879101613953565b600060405180830381600087803b15801561305b57600080fd5b505af115801561306f573d6000803e3d6000fd5b5050604080516001600160a01b0388168152602081018590527f9735b0cb909f3d21d5c16bbcccd272d85fa11446f6d679f6ecb170d2dabfecfc935001905060405180910390a15b5050505080806130c6906138f8565b915050612df6565b506130db600960006132d1565b565b60006130ec62127500426138e1565b905060005b6001600160a01b0383166000908152600c6020526040902054811015612b3d576001600160a01b0383166000908152600c6020526040812080548390811061313b5761313b61379a565b90600052602060002090600402016002015411801561319857506001600160a01b0383166000908152600c6020526040902080548290811061317f5761317f61379a565b600091825260209091206003600490920201015460ff16155b80156131e057506001600160a01b0383166000908152600c602052604090208054839190839081106131cc576131cc61379a565b906000526020600020906004020160010154105b156132bf576001600160a01b0383166000908152600c6020526040902080548290811061320f5761320f61379a565b906000526020600020906004020160020154600a6000856001600160a01b03166001600160a01b031681526020019081526020016000205461325191906137c6565b6001600160a01b0384166000908152600a6020908152604080832093909355600c9052208054829081106132875761328761379a565b60009182526020822060049091020180546001600160a01b0319168155600181018290556002810191909155600301805460ff191690555b806132c9816138f8565b9150506130f1565b50805460008255906000526020600020908101906132ef91906132f2565b50565b5b8082111561330757600081556001016132f3565b5090565b634e487b7160e01b600052604160045260246000fd5b6040516080810167ffffffffffffffff811182821017156133445761334461330b565b60405290565b60405160a0810167ffffffffffffffff811182821017156133445761334461330b565b604051601f8201601f1916810167ffffffffffffffff811182821017156133965761339661330b565b604052919050565b600067ffffffffffffffff8211156133b8576133b861330b565b5060051b60200190565b6001600160a01b03811681146132ef57600080fd5b60008060408084860312156133eb57600080fd5b8335925060208085013567ffffffffffffffff81111561340a57600080fd5b8501601f8101871361341b57600080fd5b803561342e6134298261339e565b61336d565b81815260079190911b8201830190838101908983111561344d57600080fd5b928401925b828410156134ab576080848b03121561346b5760008081fd5b613473613321565b843561347e816133c2565b81528486013586820152868501358782015260608086013590820152825260809093019290840190613452565b8096505050505050509250929050565b6000602082840312156134cd57600080fd5b5035919050565b6000602082840312156134e657600080fd5b81356134f1816133c2565b9392505050565b6000806000806080858703121561350e57600080fd5b843593506020850135613520816133c2565b93969395505050506040820135916060013590565b6000806040838503121561354857600080fd5b50508035926020909101359150565b6000806040838503121561356a57600080fd5b8235613575816133c2565b946020939093013593505050565b600080600080600060a0868803121561359b57600080fd5b8535945060208601356135ad816133c2565b94979496505050506040830135926060810135926080909101359150565b600080602083850312156135de57600080fd5b823567ffffffffffffffff808211156135f657600080fd5b818501915085601f83011261360a57600080fd5b81358181111561361957600080fd5b86602082850101111561362b57600080fd5b60209290920196919550909350505050565b821515815260006020604081840152835180604085015260005b8181101561367357858101830151858201606001528201613657565b81811115613685576000606083870101525b50601f01601f191692909201606001949350505050565b6000806000606084860312156136b157600080fd5b505081359360208301359350604090920135919050565b600060208083850312156136db57600080fd5b823567ffffffffffffffff8111156136f257600080fd5b8301601f8101851361370357600080fd5b80356137116134298261339e565b81815260a0918202830184019184820191908884111561373057600080fd5b938501935b8385101561378e5780858a03121561374d5760008081fd5b61375561334a565b85358152868601358782015260408087013590820152606080870135908201526080808701359082015283529384019391850191613735565b50979650505050505050565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b600082198211156137d9576137d96137b0565b500190565b805180151581146137ee57600080fd5b919050565b6000806000806080858703121561380957600080fd5b613812856137de565b9350613820602086016137de565b9250604085015191506060850151613837816133c2565b939692955090935050565b600081600019048311821515161561385c5761385c6137b0565b500290565b60008261387e57634e487b7160e01b600052601260045260246000fd5b500490565b60008060008060008060c0878903121561389c57600080fd5b86516138a7816133c2565b60208801519096506138b8816133c2565b6040880151606089015160808a015160a0909a0151989b929a5090989097909650945092505050565b6000828210156138f3576138f36137b0565b500390565b600060001982141561390c5761390c6137b0565b5060010190565b6020808252600d908201526c2737ba103a34329037bbb732b960991b604082015260600190565b60006020828403121561394c57600080fd5b5051919050565b6001600160a01b03938416815291909216602082015260408101919091526060019056fea2646970667358221220a9dc701847eb833221f31fb5c366d2c0e55cc4584045a389b6a6336f84b964ef64736f6c63430008090033

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

000000000000000000000000000000000000000000000000000000000000a6680000000000000000000000007f8a13a102aaaa5fc3ab87e5162b1b50e022d1d200000000000000000000000030264a8866a4c83d58d396854fca311fb5d37de0000000000000000000000000d2def97f0e67b8cbc5b7e530da58e5daae88c322

-----Decoded View---------------
Arg [0] : updateInterval (uint256): 42600
Arg [1] : _wofTokenAddress (address): 0x7F8a13a102AaAA5Fc3Ab87E5162B1b50e022D1d2
Arg [2] : _garageContract (address): 0x30264a8866A4c83d58d396854fca311FB5D37dE0
Arg [3] : _leasingContract (address): 0xd2def97f0E67b8cBC5b7e530Da58e5DaaE88C322

-----Encoded View---------------
4 Constructor Arguments found :
Arg [0] : 000000000000000000000000000000000000000000000000000000000000a668
Arg [1] : 0000000000000000000000007f8a13a102aaaa5fc3ab87e5162b1b50e022d1d2
Arg [2] : 00000000000000000000000030264a8866a4c83d58d396854fca311fb5d37de0
Arg [3] : 000000000000000000000000d2def97f0e67b8cbc5b7e530da58e5daae88c322


Block Transaction 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
[ 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.