More Info
Private Name Tags
ContractCreator
TokenTracker
Latest 25 from a total of 90 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Withdraw Earning... | 17655413 | 494 days ago | IN | 0 ETH | 0.00173568 | ||||
Withdraw Earning... | 11584519 | 1410 days ago | IN | 0 ETH | 0.04107294 | ||||
Withdraw Earning... | 11584503 | 1410 days ago | IN | 0 ETH | 0.04285872 | ||||
Withdraw Earning... | 11584494 | 1410 days ago | IN | 0 ETH | 0.023 | ||||
Withdraw Earning... | 11584448 | 1410 days ago | IN | 0 ETH | 0.03107257 | ||||
Withdraw Earning... | 11584443 | 1410 days ago | IN | 0 ETH | 0.024 | ||||
Withdraw Earning... | 7332802 | 2077 days ago | IN | 0 ETH | 0.00011691 | ||||
Withdraw Earning... | 7332800 | 2077 days ago | IN | 0 ETH | 0.00011691 | ||||
Withdraw Earning... | 7332800 | 2077 days ago | IN | 0 ETH | 0.00011691 | ||||
Withdraw Earning... | 7332799 | 2077 days ago | IN | 0 ETH | 0.00011691 | ||||
Withdraw Earning... | 7332798 | 2077 days ago | IN | 0 ETH | 0.00011691 | ||||
Withdraw Earning... | 7332792 | 2077 days ago | IN | 0 ETH | 0.00011691 | ||||
Withdraw Earning... | 7332790 | 2077 days ago | IN | 0 ETH | 0.00014321 | ||||
Withdraw Earning... | 7332788 | 2077 days ago | IN | 0 ETH | 0.00032208 | ||||
Reinvest In Carr... | 7330851 | 2077 days ago | IN | 0 ETH | 0.00050137 | ||||
Reinvest In Carr... | 7330846 | 2077 days ago | IN | 0 ETH | 0.00050137 | ||||
Reinvest In Carr... | 7330841 | 2077 days ago | IN | 0 ETH | 0.00103134 | ||||
Register Name | 7324368 | 2078 days ago | IN | 0.02 ETH | 0.00015819 | ||||
Name Horse | 7324353 | 2078 days ago | IN | 0.01025865 ETH | 0.00128219 | ||||
Buy Carrots | 6292582 | 2259 days ago | IN | 0.0001 ETH | 0.00059834 | ||||
Buy Carrots | 6292582 | 2259 days ago | IN | 0.0001 ETH | 0.00141281 | ||||
Withdraw Earning... | 6282718 | 2261 days ago | IN | 0 ETH | 0.00064167 | ||||
Buy Carrots | 6279200 | 2261 days ago | IN | 0.06009495 ETH | 0.00199322 | ||||
Withdraw Earning... | 6272691 | 2262 days ago | IN | 0 ETH | 0.00035869 | ||||
Buy Carrots | 6272681 | 2262 days ago | IN | 0.00514005 ETH | 0.00020502 |
Latest 14 internal transactions
Advanced mode:
Parent Transaction Hash | Block | From | To | |||
---|---|---|---|---|---|---|
11584519 | 1410 days ago | 0.10194406 ETH | ||||
11584503 | 1410 days ago | 0.06452586 ETH | ||||
11584448 | 1410 days ago | 0.08894471 ETH | ||||
7332788 | 2077 days ago | 0.01025865 ETH | ||||
6282718 | 2261 days ago | 0.00320832 ETH | ||||
6272691 | 2262 days ago | 0.00000059 ETH | ||||
6272681 | 2262 days ago | 0.00514005 ETH | ||||
6266573 | 2263 days ago | 0.04456598 ETH | ||||
6264269 | 2264 days ago | 0.0010822 ETH | ||||
6264268 | 2264 days ago | 0.12288561 ETH | ||||
6263789 | 2264 days ago | 0.01856098 ETH | ||||
6262807 | 2264 days ago | 0.6204573 ETH | ||||
6262803 | 2264 days ago | 0.52444259 ETH | ||||
6261824 | 2264 days ago | 0.54993338 ETH |
Loading...
Loading
Contract Name:
EtherDerby
Compiler Version
v0.4.24+commit.e67f0147
Optimization Enabled:
Yes with 200 runs
Other Settings:
default evmVersion
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2018-09-02 */ pragma solidity 0.4.24; // _____________________________________________________________ // .'' // ._.-.___.' (`\ // //( ( `' // '/ )\ ).__. ) // ' <' `\ ._/'\ // ________`___\_____\__________________________________________ // .'' // ___ _____ _ __ ___ ___ ._.-.___.' (`\ // / _//_ _//// // _/ / o | //( ( `' // / _/ / / / ` // _/ / ,' '/ )\ ).__. ) // /___/ /_/ /_n_//___//_/`_\ ' <' `\ ._/'\ // __________________________________`___\_____\________________ // .'' // __ ___ ___ ___ _ __ ._.-.___.' (`\ // / \ / _/ / o | / o.)| |/,' //( ( `' // / o |/ _/ / ,' / o \ | ,' '/ )\ ).__. ) // /__,'/___//_/`_\/___,'/_/ ' <' `\ ._/'\ // __________________________________________`___\_____\________ // .'' // ._.-.___.' (`\ // //( ( `' // '/ )\ ).__. ) // ' <' `\ ._/'\ // __________________`___\_____\________________________________ // // This product is protected under license. Any unauthorized copy, modification, or use without // express written consent from the creators is prohibited. // contract EtherDerby { using SafeMath for *; using CalcCarrots for uint256; // settings string constant public name = "EtherDerby"; uint256 constant private ROUNDMAX = 4 hours; uint256 constant private MULTIPLIER = 2**64; uint256 constant private DECIMALS = 18; uint256 constant public REGISTERFEE = 20 finney; address constant private DEVADDR = 0xC17A40cB38598520bd7C0D5BFF97D441A810a008; // horse Identifiers uint8 constant private H1 = 1; uint8 constant private H2 = 2; uint8 constant private H3 = 3; uint8 constant private H4 = 4; // ___ _ _ ___ __ _ ___ _ // |_ _|| U || __| | \ / \|_ _|/ \ // | | | || _| | o ) o || || o | // |_| |_n_||___| |__/|_n_||_||_n_| // struct Round { uint8 winner; // horse in the lead mapping (uint8 => uint256) eth; // total eth per horse mapping (uint8 => uint256) carrots; // total eth per horse } struct Player { address addr; // player address bytes32 name; // player name uint256 totalWinnings; // player winnings uint256 totalReferrals; // player referral bonuses int256 dividendPayouts; // running count of payouts player has received (important that it can be negative) mapping (uint256 => mapping (uint8 => uint256)) eth; // round -> horse -> eTH invested mapping (uint256 => mapping (uint8 => uint256)) carrots; // round -> horse -> carrots purchased mapping (uint256 => mapping (uint8 => uint256)) referrals; // round -> horse -> referrals (eth) mapping (uint8 => uint256) totalEth; // total carrots invested in each horse by the player mapping (uint8 => uint256) totalCarrots; // total carrots invested in each horse by the player uint256 totalWithdrawn; // running total of ETH withdrawn by the player uint256 totalReinvested; // running total of ETH reinvested by the player uint256 roundLastManaged; // round players winnings were last recorded uint256 roundLastReferred; // round player was last referred and therefore had its referrals managed address lastRef; // address of player who last referred this player } struct Horse { bytes32 name; uint256 totalEth; uint256 totalCarrots; uint256 mostCarrotsOwned; address owner; } uint256 rID_ = 0; // current round number mapping (uint256 => Round) public rounds_; // data for each round uint256 roundEnds_; // time current round is over mapping (address => Player) public players_; // data for each player mapping (uint8 => Horse) horses_; // data for each horse uint256 private earningsPerCarrot_; // used to keep track of dividends rewarded to carrot holders mapping (bytes32 => address) registeredNames_; // ___ _ _ ___ _ _ ___ __ // | __|| | || __|| \| ||_ _/ _| // | _| | V || _| | \\ | | |\_ \ // |___| \_/ |___||_|\_| |_||__/ // /** * @dev fired for every set of carrots purchased or reinvested in * @param playerAddress player making the purchase * @param playerName players name if they have registered * @param roundId round for which carrots were purchased * @param horse array of two horses (stack limit hit so we use array) * 0 - horse which horse carrots were purchased for * 1 - horse now in the lead * @param horseName horse name at the time of purchase * @param roundEnds round end time * @param timestamp block timestamp when purchase occurred * @param data contains the following (stack limit hit so we use array) * 0 - amount of eth * 1 - amount of carrots * 2 - horses total eth for the round * 3 - horses total carrots for the round * 4 - players total eth for the round * 5 - players total carrots for the round */ event OnCarrotsPurchased ( address indexed playerAddress, bytes32 playerName, uint256 roundId, uint8[2] horse, bytes32 indexed horseName, uint256[6] data, uint256 roundEnds, uint256 timestamp ); /** * @dev fired each time a player withdraws ETH * @param playerAddress players address * @param eth amount withdrawn */ event OnEthWithdrawn ( address indexed playerAddress, uint256 eth ); /** * @dev fired whenever a horse is given a new name * @param playerAddress which player named the horse * @param horse number of horse being named * @param horseName new name of horse * @param mostCarrotsOwned number of carrots by owned to name the horse * @param timestamp block timestamp when horse is named */ event OnHorseNamed ( address playerAddress, bytes32 playerName, uint8 horse, bytes32 horseName, uint256 mostCarrotsOwned, uint256 timestamp ); /** * @dev fired whenever a player registers a name * @param playerAddress which player registered a name * @param playerName name being registered * @param ethDonated amount of eth donated with registration * @param timestamp block timestamp when name registered */ event OnNameRegistered ( address playerAddress, bytes32 playerName, uint256 ethDonated, uint256 timestamp ); /** * @dev fired when a transaction is rejected * mainly used to make it easier to write front end code * @param playerAddress player making the purchase * @param reason why the transaction failed */ event OnTransactionFail ( address indexed playerAddress, bytes32 reason ); constructor() public { // start with Round 0 ending before now so that first purchase begins Round 1 // subtract an hour to make sure the first purchase doesn't go to round 0 (ex. same block) roundEnds_ = block.timestamp - 1 hours; // default horse names horses_[H1].name = "horse1"; horses_[H2].name = "horse2"; horses_[H3].name = "horse3"; horses_[H4].name = "horse4"; } // _ _ _ __ _ ___ _ ___ ___ __ // | \_/ |/ \| \| || __|| || __|| o \/ _| // | \_/ ( o ) o ) || _| | || _| | /\_ \ // |_| |_|\_/|__/|_||_| |_||___||_|\\|__/ // /** * @dev verifies that a valid horse is provided */ modifier isValidHorse(uint8 _horse) { require(_horse == H1 || _horse == H2 || _horse == H3 || _horse == H4, "unknown horse selected"); _; } /** * @dev prevents smart contracts from interacting with EtherDerby */ modifier isHuman() { address addr = msg.sender; uint256 codeLength; assembly {codeLength := extcodesize(addr)} require(codeLength == 0, "Humans only ;)"); require(msg.sender == tx.origin, "Humans only ;)"); _; } /** * @dev verifies that all purchases sent include a reasonable amount of ETH */ modifier isWithinLimits(uint256 _eth) { require(_eth >= 1000000000, "Not enough eth!"); require(_eth <= 100000000000000000000000, "Go away whale!"); _; } // ___ _ _ ___ _ _ __ ___ _ _ _ _ __ ___ _ _ _ _ __ // | o \ | || o ) | | |/ _| | __|| | || \| |/ _||_ _|| |/ \| \| |/ _| // | _/ U || o \ |_ | ( (_ | _| | U || \\ ( (_ | | | ( o ) \\ |\_ \ // |_| |___||___/___||_|\__| |_| |___||_|\_|\__| |_| |_|\_/|_|\_||__/ // /** * @dev register a name with Ether Derby to generate a referral link * @param _nameStr the name being registered (see NameValidator library below * for name requirements) */ function registerName(string _nameStr) public payable isHuman() { require(msg.value >= REGISTERFEE, "You must pay the partner fee of 20 finney"); bytes32 nameToRegister = NameValidator.validate(_nameStr); require(registeredNames_[nameToRegister] == 0, "Name already in use"); registeredNames_[nameToRegister] = msg.sender; players_[msg.sender].name = nameToRegister; // partner fee goes to devs players_[DEVADDR].totalReferrals = msg.value.add(players_[DEVADDR].totalReferrals); emit OnNameRegistered(msg.sender, nameToRegister, msg.value, block.timestamp); } /** * @dev buy carrots with ETH * @param _horse the horse carrots are being purchased for * @param _round the round these carrots should be purchased for (send 0 to * buy for whatever the current round is) * @param _referrerName the player for which to reward referral bonuses to */ function buyCarrots(uint8 _horse, uint256 _round, bytes32 _referrerName) public payable isHuman() isWithinLimits(msg.value) isValidHorse(_horse) { if (isInvalidRound(_round)) { emit OnTransactionFail(msg.sender, "Invalid round"); msg.sender.transfer(msg.value); return; } buyCarrotsInternal(_horse, msg.value, _referrerName); } /** * @dev buy carrots with current earnings left in smart contract * @param _horse the horse carrots are being purchased for * @param _round the round these carrots should be purchased for (send 0 to * buy for whatever the current round is) * @param _referrerName the player for which to reward referral bonuses to */ function reinvestInCarrots(uint8 _horse, uint256 _round, uint256 _value, bytes32 _referrerName) public isHuman() isWithinLimits(_value) isValidHorse(_horse) { if (isInvalidRound(_round)) { emit OnTransactionFail(msg.sender, "Invalid round"); return; } if (calcPlayerEarnings() < _value) { // Not enough earnings in player vault emit OnTransactionFail(msg.sender, "Insufficient funds"); return; } players_[msg.sender].totalReinvested = _value.add(players_[msg.sender].totalReinvested); buyCarrotsInternal(_horse, _value, _referrerName); } /** * @dev name horse by purchasing enough carrots to become majority holder * @param _horse the horse being named * @param _nameStr the desired horse name (See NameValidator for requirements) * @param _referrerName the player for which to reward referral bonuses to */ function nameHorse(uint8 _horse, string _nameStr, bytes32 _referrerName) public payable isHuman() isValidHorse(_horse) { if ((rounds_[getCurrentRound()].eth[_horse]) .carrotsReceived(msg.value) .add(players_[msg.sender].totalCarrots[_horse]) < horses_[_horse].mostCarrotsOwned) { emit OnTransactionFail(msg.sender, "Insufficient funds"); if (msg.value > 0) { msg.sender.transfer(msg.value); } return; } if (msg.value > 0) { buyCarrotsInternal(_horse, msg.value, _referrerName); } horses_[_horse].name = NameValidator.validate(_nameStr); if (horses_[_horse].owner != msg.sender) { horses_[_horse].owner = msg.sender; } emit OnHorseNamed( msg.sender, players_[msg.sender].name, _horse, horses_[_horse].name, horses_[_horse].mostCarrotsOwned, block.timestamp ); } /** * @dev withdraw all earnings made so far. includes winnings, dividends, and referrals */ function withdrawEarnings() public isHuman() { managePlayer(); manageReferrer(msg.sender); uint256 earnings = calcPlayerEarnings(); if (earnings > 0) { players_[msg.sender].totalWithdrawn = earnings.add(players_[msg.sender].totalWithdrawn); msg.sender.transfer(earnings); } emit OnEthWithdrawn(msg.sender, earnings); } /** * @dev fallback function puts incoming eth into devs referrals */ function() public payable { players_[DEVADDR].totalReferrals = msg.value.add(players_[DEVADDR].totalReferrals); } // ___ ___ _ _ _ _ ___ ___ _ _ ___ _ ___ ___ ___ __ // | o \ o \ || | | / \|_ _|| __| | U || __|| | | o \ __|| o \/ _| // | _/ / || V || o || | | _| | || _| | |_ | _/ _| | /\_ \ // |_| |_|\\_| \_/ |_n_||_| |___| |_n_||___||___||_| |___||_|\\|__/ // /** * @dev core helper method for purchasing carrots * @param _horse the horse carrots are being purchased for * @param _value amount of eth to spend on carrots * @param _referrerName the player for which to reward referral bonuses to */ function buyCarrotsInternal(uint8 _horse, uint256 _value, bytes32 _referrerName) private { // check if new round needs started and update horses pending data if necessary manageRound(); // update players winnings and reset pending data if necessary managePlayer(); address referrer = getReferrer(_referrerName); // update referrers total referrals and reset pending referrals if necessary manageReferrer(referrer); if (referrer != DEVADDR) { // also manage dev account unless referrer is dev manageReferrer(DEVADDR); } uint256 carrots = (rounds_[rID_].eth[_horse]).carrotsReceived(_value); /*******************/ /* Update Player */ /*******************/ players_[msg.sender].eth[rID_][_horse] = _value.add(players_[msg.sender].eth[rID_][_horse]); players_[msg.sender].carrots[rID_][_horse] = carrots.add(players_[msg.sender].carrots[rID_][_horse]); players_[msg.sender].totalEth[_horse] = _value.add(players_[msg.sender].totalEth[_horse]); players_[msg.sender].totalCarrots[_horse] = carrots.add(players_[msg.sender].totalCarrots[_horse]); // players don't recieve dividends before buying the carrots players_[msg.sender].dividendPayouts += SafeConversions.SafeSigned(earningsPerCarrot_.mul(carrots)); /*******************/ /* Update Referrer */ /*******************/ players_[referrer].referrals[rID_][_horse] = ninePercent(_value).add(players_[referrer].referrals[rID_][_horse]); // one percent to devs // reuse referrals since functionality is the same players_[DEVADDR].referrals[rID_][_horse] = _value.div(100).add(players_[DEVADDR].referrals[rID_][_horse]); // check if players new amount of total carrots for this horse is greater than mostCarrotsOwned and update if (players_[msg.sender].totalCarrots[_horse] > horses_[_horse].mostCarrotsOwned) { horses_[_horse].mostCarrotsOwned = players_[msg.sender].totalCarrots[_horse]; } /*******************/ /* Update Round */ /*******************/ rounds_[rID_].eth[_horse] = _value.add(rounds_[rID_].eth[_horse]); rounds_[rID_].carrots[_horse] = carrots.add(rounds_[rID_].carrots[_horse]); // if this horses carrots now exceeds current winner, update current winner if (rounds_[rID_].winner != _horse && rounds_[rID_].carrots[_horse] > rounds_[rID_].carrots[rounds_[rID_].winner]) { rounds_[rID_].winner = _horse; } /*******************/ /* Update Horse */ /*******************/ horses_[_horse].totalCarrots = carrots.add(horses_[_horse].totalCarrots); horses_[_horse].totalEth = _value.add(horses_[_horse].totalEth); emit OnCarrotsPurchased( msg.sender, players_[msg.sender].name, rID_, [ _horse, rounds_[rID_].winner ], horses_[_horse].name, [ _value, carrots, rounds_[rID_].eth[_horse], rounds_[rID_].carrots[_horse], players_[msg.sender].eth[rID_][_horse], players_[msg.sender].carrots[rID_][_horse] ], roundEnds_, block.timestamp ); } /** * @dev check if now is past current rounds ends time. if so, compute round * details and update all storage to start the next round */ function manageRound() private { if (!isRoundOver()) { return; } // round over, update dividends and start next round uint256 earningsPerCarrotThisRound = fromEthToDivies(calcRoundLosingHorsesEth(rID_)); if (earningsPerCarrotThisRound > 0) { earningsPerCarrot_ = earningsPerCarrot_.add(earningsPerCarrotThisRound); } rID_++; roundEnds_ = block.timestamp + ROUNDMAX; } /** * @dev check if a player has winnings from a previous round that have yet to * be recorded. this needs to be called before any player interacts with Ether * Derby to make sure there data is kept up to date */ function managePlayer() private { uint256 unrecordedWinnings = calcUnrecordedWinnings(); if (unrecordedWinnings > 0) { players_[msg.sender].totalWinnings = unrecordedWinnings.add(players_[msg.sender].totalWinnings); } // if managePlayer is being called while round is over, calcUnrecordedWinnings will include // winnings from the current round. it's important that we store rID_+1 here to make sure // users can't double withdraw winnings from current round if (players_[msg.sender].roundLastManaged == rID_ && isRoundOver()) { players_[msg.sender].roundLastManaged = rID_.add(1); } else if (players_[msg.sender].roundLastManaged < rID_) { players_[msg.sender].roundLastManaged = rID_; } } /** * @dev check if a player has referral bonuses from a previous round that have yet * to be recorded */ function manageReferrer(address _referrer) private { uint256 unrecordedRefferals = calcUnrecordedRefferals(_referrer); if (unrecordedRefferals > 0) { players_[_referrer].totalReferrals = unrecordedRefferals.add(players_[_referrer].totalReferrals); } if (players_[_referrer].roundLastReferred == rID_ && isRoundOver()) { players_[_referrer].roundLastReferred = rID_.add(1); } else if (players_[_referrer].roundLastReferred < rID_) { players_[_referrer].roundLastReferred = rID_; } } /** * @dev calculate total amount of carrots that have been purchased */ function calcTotalCarrots() private view returns (uint256) { return horses_[H1].totalCarrots .add(horses_[H2].totalCarrots) .add(horses_[H3].totalCarrots) .add(horses_[H4].totalCarrots); } /** * @dev calculate players total amount of carrots including the unrecorded */ function calcPlayerTotalCarrots() private view returns (uint256) { return players_[msg.sender].totalCarrots[H1] .add(players_[msg.sender].totalCarrots[H2]) .add(players_[msg.sender].totalCarrots[H3]) .add(players_[msg.sender].totalCarrots[H4]); } /** * @dev calculate players total amount of eth spent including unrecorded */ function calcPlayerTotalEth() private view returns (uint256) { return players_[msg.sender].totalEth[H1] .add(players_[msg.sender].totalEth[H2]) .add(players_[msg.sender].totalEth[H3]) .add(players_[msg.sender].totalEth[H4]); } /** * @dev calculate players total earnings (able to be withdrawn) */ function calcPlayerEarnings() private view returns (uint256) { return calcPlayerWinnings() .add(calcPlayerDividends()) .add(calcPlayerReferrals()) .sub(players_[msg.sender].totalWithdrawn) .sub(players_[msg.sender].totalReinvested); } /** * @dev calculate players total winning including the unrecorded */ function calcPlayerWinnings() private view returns (uint256) { return players_[msg.sender].totalWinnings.add(calcUnrecordedWinnings()); } /** * @dev calculate players total dividends including the unrecorded */ function calcPlayerDividends() private view returns (uint256) { uint256 unrecordedDividends = calcUnrecordedDividends(); uint256 carrotBalance = calcPlayerTotalCarrots(); int256 totalDividends = SafeConversions.SafeSigned(carrotBalance.mul(earningsPerCarrot_).add(unrecordedDividends)); return SafeConversions.SafeUnsigned(totalDividends - players_[msg.sender].dividendPayouts).div(MULTIPLIER); } /** * @dev calculate players total referral bonus including the unrecorded */ function calcPlayerReferrals() private view returns (uint256) { return players_[msg.sender].totalReferrals.add(calcUnrecordedRefferals(msg.sender)); } /** * @dev calculate players unrecorded winnings (those not yet in Player.totalWinnings) */ function calcUnrecordedWinnings() private view returns (uint256) { uint256 round = players_[msg.sender].roundLastManaged; if ((round == 0) || (round > rID_) || (round == rID_ && !isRoundOver())) { // all winnings have been recorded return 0; } // round is <= rID_, not 0, and if equal then round is over // (players eth spent on the winning horse during their last round) + // ((players carrots for winning horse during their last round) * // (80% of losing horses eth)) / total carrots purchased for winning horse return players_[msg.sender].eth[round][rounds_[round].winner] .add((players_[msg.sender].carrots[round][rounds_[round].winner] .mul(eightyPercent(calcRoundLosingHorsesEth(round)))) .div(rounds_[round].carrots[rounds_[round].winner])); } /** * @dev calculate players unrecorded dividends (those not yet reflected in earningsPerCarrot_) */ function calcUnrecordedDividends() private view returns (uint256) { if (!isRoundOver()) { // round is not over return 0; } // round has ended but next round has not yet been started, so // dividends from the current round are reflected in earningsPerCarrot_ return fromEthToDivies(calcRoundLosingHorsesEth(rID_)).mul(calcPlayerTotalCarrots()); } /** * @dev calculate players unrecorded referral bonus (those not yet in Player.referrals) */ function calcUnrecordedRefferals(address _player) private view returns (uint256 ret) { uint256 round = players_[_player].roundLastReferred; if (!((round == 0) || (round > rID_) || (round == rID_ && !isRoundOver()))) { for (uint8 i = H1; i <= H4; i++) { if (rounds_[round].winner != i) { ret = ret.add(players_[_player].referrals[round][i]); } } } } /** * @dev calculate total eth from all horses except the winner */ function calcRoundLosingHorsesEth(uint256 _round) private view returns (uint256 ret) { for (uint8 i = H1; i <= H4; i++) { if (rounds_[_round].winner != i) { ret = ret.add(rounds_[_round].eth[i]); } } } /** * @dev calculate the change in earningsPerCarrot_ based on new eth coming in * @param _value amount of ETH being sent out as dividends to all carrot holders */ function fromEthToDivies(uint256 _value) private view returns (uint256) { // edge case where dividing by 0 would happen uint256 totalCarrots = calcTotalCarrots(); if (totalCarrots == 0) { return 0; } // multiply by MULTIPLIER to prevent integer division from returning 0 // when totalCarrots > losingHorsesEth // divide by 10 because only 10% of losing horses ETH goes to dividends return _value.mul(MULTIPLIER).div(10).div(totalCarrots); } /** * @dev convert registered name to an address * @param _referrerName name of player that referred current player * @return address of referrer if valid, or last person to refer the current player, * or the devs as a backup referrer */ function getReferrer(bytes32 _referrerName) private returns (address) { address referrer; // referrer is not empty, unregistered, or same as buyer if (_referrerName != "" && registeredNames_[_referrerName] != 0 && _referrerName != players_[msg.sender].name) { referrer = registeredNames_[_referrerName]; } else if (players_[msg.sender].lastRef != 0) { referrer = players_[msg.sender].lastRef; } else { // fallback to Devs if no referrer provided referrer = DEVADDR; } if (players_[msg.sender].lastRef != referrer) { // store last referred to allow partner to continue receiving // future purchases from this player players_[msg.sender].lastRef = referrer; } return referrer; } /** * @dev calculate price of buying carrots * @param _horse which horse to calculate price for * @param _carrots how many carrots desired * @return ETH required to purchase X many carrots (in large format) */ function calculateCurrentPrice(uint8 _horse, uint256 _carrots) private view returns(uint256) { uint256 currTotal = 0; if (!isRoundOver()) { // Round is ongoing currTotal = rounds_[rID_].carrots[_horse]; } return currTotal.add(_carrots).ethReceived(_carrots); } /** * @dev check if a round number is valid to make a purchase for * @param _round round to check * @return true if _round is current (or next if current is over) */ function isInvalidRound(uint256 _round) private view returns(bool) { // passing _round as 0 means buy for current round return _round != 0 && _round != getCurrentRound(); } /** * @dev get current round */ function getCurrentRound() private view returns(uint256) { if (isRoundOver()) { return (rID_ + 1); } return rID_; } /** * @dev check if current round has ended based on current block timestamp * @return true if round is over, false otherwise */ function isRoundOver() private view returns (bool) { return block.timestamp >= roundEnds_; } /** * @dev compute eighty percent as whats left after subtracting 10%, 1% and 9% * @param num_ number to compute 80% of */ function eightyPercent(uint256 num_) private pure returns (uint256) { // 100% - 9% - 1% - 10% = 80% return num_.sub(ninePercent(num_)).sub(num_.div(100)).sub(num_.div(10)); } /** * @dev compute eighty percent as whats left after subtracting 10% twice * @param num_ number to compute 80% of */ function ninePercent(uint256 num_) private pure returns (uint256) { return num_.mul(9).div(100); } // _____ _____ ___ ___ _ _ _ _ _ _ _ _ _ ___ ___ _ _ _ __ __ // | __\ V /_ _|| __|| o \ \| | / \ | | | | || | | \_/ || __||_ _|| U |/ \| \/ _| // | _| ) ( | | | _| | / \\ || o || |_ | U || | | \_/ || _| | | | ( o ) o )_ \ // |___/_n_\|_| |___||_|\\_|\_||_n_||___| |___||_| |_| |_||___| |_| |_n_|\_/|__/|__/ // /** * @dev get stats from current round (or the last round if new has not yet started) * @return round id * @return round end time * @return horse in the lead * @return eth for each horse * @return carrots for each horse * @return eth invested for each horse * @return carrots invested for each horse * @return horse names */ function getRoundStats() public view returns(uint256, uint256, uint8, uint256[4], uint256[4], uint256[4], uint256[4], bytes32[4]) { return ( rID_, roundEnds_, rounds_[rID_].winner, [ rounds_[rID_].eth[H1], rounds_[rID_].eth[H2], rounds_[rID_].eth[H3], rounds_[rID_].eth[H4] ], [ rounds_[rID_].carrots[H1], rounds_[rID_].carrots[H2], rounds_[rID_].carrots[H3], rounds_[rID_].carrots[H4] ], [ players_[msg.sender].eth[rID_][H1], players_[msg.sender].eth[rID_][H2], players_[msg.sender].eth[rID_][H3], players_[msg.sender].eth[rID_][H4] ], [ players_[msg.sender].carrots[rID_][H1], players_[msg.sender].carrots[rID_][H2], players_[msg.sender].carrots[rID_][H3], players_[msg.sender].carrots[rID_][H4] ], [ horses_[H1].name, horses_[H2].name, horses_[H3].name, horses_[H4].name ] ); } /** * @dev get minimal details about a specific round (returns all 0s if round not over) * @param _round which round to query * @return horse that won * @return eth for each horse * @return carrots for each horse * @return eth invested for each horse * @return carrots invested for each horse */ function getPastRoundStats(uint256 _round) public view returns(uint8, uint256[4], uint256[4], uint256[4], uint256[4]) { if ((_round == 0) || (_round > rID_) || (_round == rID_ && !isRoundOver())) { return; } return ( rounds_[rID_].winner, [ rounds_[_round].eth[H1], rounds_[_round].eth[H2], rounds_[_round].eth[H3], rounds_[_round].eth[H4] ], [ rounds_[_round].carrots[H1], rounds_[_round].carrots[H2], rounds_[_round].carrots[H3], rounds_[_round].carrots[H4] ], [ players_[msg.sender].eth[_round][H1], players_[msg.sender].eth[_round][H2], players_[msg.sender].eth[_round][H3], players_[msg.sender].eth[_round][H4] ], [ players_[msg.sender].carrots[_round][H1], players_[msg.sender].carrots[_round][H2], players_[msg.sender].carrots[_round][H3], players_[msg.sender].carrots[_round][H4] ] ); } /** * @dev get stats for player * @return total winnings * @return total dividends * @return total referral bonus * @return total reinvested * @return total withdrawn */ function getPlayerStats() public view returns(uint256, uint256, uint256, uint256, uint256) { return ( calcPlayerWinnings(), calcPlayerDividends(), calcPlayerReferrals(), players_[msg.sender].totalReinvested, players_[msg.sender].totalWithdrawn ); } /** * @dev get name of player * @return players registered name if there is one */ function getPlayerName() public view returns(bytes32) { return players_[msg.sender].name; } /** * @dev check if name is available * @param _name name to check * @return bool whether or not it is available */ function isNameAvailable(bytes32 _name) public view returns(bool) { return registeredNames_[_name] == 0; } /** * @dev get overall stats for EtherDerby * @return total eth for each horse * @return total carrots for each horse * @return player total eth for each horse * @return player total carrots for each horse * @return horse names */ function getStats() public view returns(uint256[4], uint256[4], uint256[4], uint256[4], bytes32[4]) { return ( [ horses_[H1].totalEth, horses_[H2].totalEth, horses_[H3].totalEth, horses_[H4].totalEth ], [ horses_[H1].totalCarrots, horses_[H2].totalCarrots, horses_[H3].totalCarrots, horses_[H4].totalCarrots ], [ players_[msg.sender].totalEth[H1], players_[msg.sender].totalEth[H2], players_[msg.sender].totalEth[H3], players_[msg.sender].totalEth[H4] ], [ players_[msg.sender].totalCarrots[H1], players_[msg.sender].totalCarrots[H2], players_[msg.sender].totalCarrots[H3], players_[msg.sender].totalCarrots[H4] ], [ horses_[H1].name, horses_[H2].name, horses_[H3].name, horses_[H4].name ] ); } /** * @dev returns data for past 50 rounds * @param roundStart which round to start returning data at (0 means current) * @return round number this index in the arrays corresponds to * @return winning horses for past 50 finished rounds * @return horse1 carrot amounts for past 50 rounds * @return horse2 carrot amounts for past 50 rounds * @return horse3 carrot amounts for past 50 rounds * @return horse4 carrot amounts for past 50 rounds * @return horse1 players carrots for past 50 rounds * @return horse2 players carrots for past 50 rounds * @return horse3 players carrots for past 50 rounds * @return horse4 players carrots for past 50 rounds * @return horseEth total eth amounts for past 50 rounds * @return playerEth total player eth amounts for past 50 rounds */ function getPastRounds(uint256 roundStart) public view returns( uint256[50] roundNums, uint8[50] winners, uint256[50] horse1Carrots, uint256[50] horse2Carrots, uint256[50] horse3Carrots, uint256[50] horse4Carrots, uint256[50] horse1PlayerCarrots, uint256[50] horse2PlayerCarrots, uint256[50] horse3PlayerCarrots, uint256[50] horse4PlayerCarrots, uint256[50] horseEth, uint256[50] playerEth ) { uint256 index = 0; uint256 round = rID_; if (roundStart != 0 && roundStart <= rID_) { round = roundStart; } while (index < 50 && round > 0) { if (round == rID_ && !isRoundOver()) { round--; continue; } roundNums[index] = round; winners[index] = rounds_[round].winner; horse1Carrots[index] = rounds_[round].carrots[H1]; horse2Carrots[index] = rounds_[round].carrots[H2]; horse3Carrots[index] = rounds_[round].carrots[H3]; horse4Carrots[index] = rounds_[round].carrots[H4]; horse1PlayerCarrots[index] = players_[msg.sender].carrots[round][H1]; horse2PlayerCarrots[index] = players_[msg.sender].carrots[round][H2]; horse3PlayerCarrots[index] = players_[msg.sender].carrots[round][H3]; horse4PlayerCarrots[index] = players_[msg.sender].carrots[round][H4]; horseEth[index] = rounds_[round].eth[H1] .add(rounds_[round].eth[H2]) .add(rounds_[round].eth[H3]) .add(rounds_[round].eth[H4]); playerEth[index] = players_[msg.sender].eth[round][H1] .add(players_[msg.sender].eth[round][H2]) .add(players_[msg.sender].eth[round][H3]) .add(players_[msg.sender].eth[round][H4]); index++; round--; } } /** * @dev calculate price of buying carrots for a specific horse * @param _horse which horse to calculate price for * @param _carrots how many carrots desired * @return ETH required to purchase X many carrots */ function getPriceOfXCarrots(uint8 _horse, uint256 _carrots) public view isValidHorse(_horse) returns(uint256) { return calculateCurrentPrice(_horse, _carrots.mul(1000000000000000000)); } /** * @dev calculate price to become majority carrot holder for a specific horse * @param _horse which horse to calculate price for * @return carrotsRequired * @return ethRequired * @return currentMax * @return owner * @return ownerName */ function getPriceToName(uint8 _horse) public view isValidHorse(_horse) returns( uint256 carrotsRequired, uint256 ethRequired, uint256 currentMax, address owner, bytes32 ownerName ) { if (players_[msg.sender].totalCarrots[_horse] < horses_[_horse].mostCarrotsOwned) { // player is not already majority holder // Have user buy one carrot more than current max carrotsRequired = horses_[_horse].mostCarrotsOwned.sub(players_[msg.sender].totalCarrots[_horse]).add(10**DECIMALS); ethRequired = calculateCurrentPrice(_horse, carrotsRequired); } currentMax = horses_[_horse].mostCarrotsOwned; owner = horses_[_horse].owner; ownerName = players_[horses_[_horse].owner].name; } } // __ _ ___ ___ _ ___ __ _ _ __ _ _ _ _ ___ _ ___ // / _| / \ | o \ o \/ \_ _| / _| / \ | | / _|| | || | / \|_ _/ \| o \ // ( (_ | o || / ( o ) | ( (_ | o || |( (_ | U || |_ | o || ( o ) / // \__||_n_||_|\\_|\\\_/|_| \__||_n_||___\__||___||___||_n_||_|\_/|_|\\ // library CalcCarrots { using SafeMath for *; /** * @dev calculates number of carrots recieved given X eth */ function carrotsReceived(uint256 _currEth, uint256 _newEth) internal pure returns (uint256) { return carrots((_currEth).add(_newEth)).sub(carrots(_currEth)); } /** * @dev calculates amount of eth received if you sold X carrots */ function ethReceived(uint256 _currCarrots, uint256 _sellCarrots) internal pure returns (uint256) { return eth(_currCarrots).sub(eth(_currCarrots.sub(_sellCarrots))); } /** * @dev calculates how many carrots for a single horse given an amount * of eth spent on that horse */ function carrots(uint256 _eth) internal pure returns (uint256) { return ((((_eth).mul(62831853072000000000000000000000000000000000000) .add(9996858654086510028837239824000000000000000000000000000000000000)).sqrt()) .sub(99984292036732000000000000000000)) / (31415926536); } /** * @dev calculates how much eth would be in the contract for a single * horse given an amount of carrots bought for that horse */ function eth(uint256 _carrots) internal pure returns (uint256) { return ((15707963268).mul(_carrots.mul(_carrots)).add(((199968584073464) .mul(_carrots.mul(1000000000000000000))) / (2))) / (1000000000000000000000000000000000000); } } // __ _ ___ ___ _ _ _ ___ _ _ // / _|/ \ | __|| __| | \_/ | / \|_ _|| U | // \_ \ o || _| | _| | \_/ || o || | | | // |__/_n_||_| |___| |_| |_||_n_||_| |_n_| // /** * @title SafeMath library from OpenZeppelin * @dev Math operations with safety checks that throw on error */ library SafeMath { /** * @dev Multiplies two numbers, throws on overflow. */ function mul(uint256 a, uint256 b) internal pure returns (uint256 c) { // Gas optimization: this is cheaper than asserting 'a' not being zero, but the // benefit is lost if 'b' is also tested. // See: https://github.com/OpenZeppelin/openzeppelin-solidity/pull/522 if (a == 0) { return 0; } c = a * b; assert(c / a == b); return c; } /** * @dev Integer division of two numbers, truncating the quotient. */ function div(uint256 a, uint256 b) internal pure returns (uint256) { // assert(b > 0); // Solidity automatically throws when dividing by 0 // uint256 c = a / b; // assert(a == b * c + a % b); // There is no case in which this doesn't hold return a / b; } /** * @dev Subtracts two numbers, throws on overflow (i.e. if subtrahend is greater than minuend). */ function sub(uint256 a, uint256 b) internal pure returns (uint256) { assert(b <= a); return a - b; } /** * @dev Adds two numbers, throws on overflow. */ function add(uint256 a, uint256 b) internal pure returns (uint256 c) { c = a + b; assert(c >= a); return c; } /** * @dev Gives square root of given x. */ function sqrt(uint256 x) internal pure returns (uint256 y) { uint256 z = ((add(x,1)) / 2); y = x; while (z < y) { y = z; z = ((add((x / z),z)) / 2); } } } library SafeConversions { function SafeSigned(uint256 a) internal pure returns (int256) { int256 b = int256(a); // If a is too large, the signed version will be negative. assert(b >= 0); return b; } function SafeUnsigned(int256 a) internal pure returns (uint256) { // Only negative numbers are unsafe to make unsigned. assert(a >= 0); return uint256(a); } } library NameValidator { /** * @dev throws on invalid name * -converts uppercase to lower case * -cannot contain space * -cannot be only numbers * -cannot be an address (start with 0x) * -restricts characters to A-Z, a-z, 0-9 * @return validated string in bytes32 format */ function validate(string _input) internal pure returns(bytes32) { bytes memory temp = bytes(_input); uint256 length = temp.length; // limited to 15 characters require (length <= 15 && length > 0, "name must be between 1 and 15 characters"); // cannot be an address if (temp[0] == 0x30) { require(temp[1] != 0x78, "name cannot start with 0x"); require(temp[1] != 0x58, "name cannot start with 0X"); } bool _hasNonNumber; for (uint256 i = 0; i < length; i++) { // if its uppercase A-Z if (temp[i] > 0x40 && temp[i] < 0x5b) { // convert to lower case temp[i] = byte(uint(temp[i]) + 32); // character is non number if (_hasNonNumber == false) { _hasNonNumber = true; } } else { // character should be only lowercase a-z or 0-9 require ((temp[i] > 0x60 && temp[i] < 0x7b) || (temp[i] > 0x2f && temp[i] < 0x3a), "name contains invalid characters"); // check if character is non number if (_hasNonNumber == false && (temp[i] < 0x30 || temp[i] > 0x39)) { _hasNonNumber = true; } } } require(_hasNonNumber == true, "name cannot be only numbers"); bytes32 _ret; assembly { _ret := mload(add(temp, 32)) } return (_ret); } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"constant":true,"inputs":[{"name":"","type":"address"}],"name":"players_","outputs":[{"name":"addr","type":"address"},{"name":"name","type":"bytes32"},{"name":"totalWinnings","type":"uint256"},{"name":"totalReferrals","type":"uint256"},{"name":"dividendPayouts","type":"int256"},{"name":"totalWithdrawn","type":"uint256"},{"name":"totalReinvested","type":"uint256"},{"name":"roundLastManaged","type":"uint256"},{"name":"roundLastReferred","type":"uint256"},{"name":"lastRef","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"name","outputs":[{"name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_nameStr","type":"string"}],"name":"registerName","outputs":[],"payable":true,"stateMutability":"payable","type":"function"},{"constant":true,"inputs":[{"name":"_round","type":"uint256"}],"name":"getPastRoundStats","outputs":[{"name":"","type":"uint8"},{"name":"","type":"uint256[4]"},{"name":"","type":"uint256[4]"},{"name":"","type":"uint256[4]"},{"name":"","type":"uint256[4]"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_horse","type":"uint8"}],"name":"getPriceToName","outputs":[{"name":"carrotsRequired","type":"uint256"},{"name":"ethRequired","type":"uint256"},{"name":"currentMax","type":"uint256"},{"name":"owner","type":"address"},{"name":"ownerName","type":"bytes32"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_horse","type":"uint8"},{"name":"_carrots","type":"uint256"}],"name":"getPriceOfXCarrots","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_horse","type":"uint8"},{"name":"_round","type":"uint256"},{"name":"_referrerName","type":"bytes32"}],"name":"buyCarrots","outputs":[],"payable":true,"stateMutability":"payable","type":"function"},{"constant":true,"inputs":[{"name":"_name","type":"bytes32"}],"name":"isNameAvailable","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"getPlayerStats","outputs":[{"name":"","type":"uint256"},{"name":"","type":"uint256"},{"name":"","type":"uint256"},{"name":"","type":"uint256"},{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"","type":"uint256"}],"name":"rounds_","outputs":[{"name":"winner","type":"uint8"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"REGISTERFEE","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"getPlayerName","outputs":[{"name":"","type":"bytes32"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"withdrawEarnings","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_horse","type":"uint8"},{"name":"_round","type":"uint256"},{"name":"_value","type":"uint256"},{"name":"_referrerName","type":"bytes32"}],"name":"reinvestInCarrots","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"roundStart","type":"uint256"}],"name":"getPastRounds","outputs":[{"name":"roundNums","type":"uint256[50]"},{"name":"winners","type":"uint8[50]"},{"name":"horse1Carrots","type":"uint256[50]"},{"name":"horse2Carrots","type":"uint256[50]"},{"name":"horse3Carrots","type":"uint256[50]"},{"name":"horse4Carrots","type":"uint256[50]"},{"name":"horse1PlayerCarrots","type":"uint256[50]"},{"name":"horse2PlayerCarrots","type":"uint256[50]"},{"name":"horse3PlayerCarrots","type":"uint256[50]"},{"name":"horse4PlayerCarrots","type":"uint256[50]"},{"name":"horseEth","type":"uint256[50]"},{"name":"playerEth","type":"uint256[50]"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"getStats","outputs":[{"name":"","type":"uint256[4]"},{"name":"","type":"uint256[4]"},{"name":"","type":"uint256[4]"},{"name":"","type":"uint256[4]"},{"name":"","type":"bytes32[4]"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"getRoundStats","outputs":[{"name":"","type":"uint256"},{"name":"","type":"uint256"},{"name":"","type":"uint8"},{"name":"","type":"uint256[4]"},{"name":"","type":"uint256[4]"},{"name":"","type":"uint256[4]"},{"name":"","type":"uint256[4]"},{"name":"","type":"bytes32[4]"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_horse","type":"uint8"},{"name":"_nameStr","type":"string"},{"name":"_referrerName","type":"bytes32"}],"name":"nameHorse","outputs":[],"payable":true,"stateMutability":"payable","type":"function"},{"inputs":[],"payable":false,"stateMutability":"nonpayable","type":"constructor"},{"payable":true,"stateMutability":"payable","type":"fallback"},{"anonymous":false,"inputs":[{"indexed":true,"name":"playerAddress","type":"address"},{"indexed":false,"name":"playerName","type":"bytes32"},{"indexed":false,"name":"roundId","type":"uint256"},{"indexed":false,"name":"horse","type":"uint8[2]"},{"indexed":true,"name":"horseName","type":"bytes32"},{"indexed":false,"name":"data","type":"uint256[6]"},{"indexed":false,"name":"roundEnds","type":"uint256"},{"indexed":false,"name":"timestamp","type":"uint256"}],"name":"OnCarrotsPurchased","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"playerAddress","type":"address"},{"indexed":false,"name":"eth","type":"uint256"}],"name":"OnEthWithdrawn","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"playerAddress","type":"address"},{"indexed":false,"name":"playerName","type":"bytes32"},{"indexed":false,"name":"horse","type":"uint8"},{"indexed":false,"name":"horseName","type":"bytes32"},{"indexed":false,"name":"mostCarrotsOwned","type":"uint256"},{"indexed":false,"name":"timestamp","type":"uint256"}],"name":"OnHorseNamed","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"playerAddress","type":"address"},{"indexed":false,"name":"playerName","type":"bytes32"},{"indexed":false,"name":"ethDonated","type":"uint256"},{"indexed":false,"name":"timestamp","type":"uint256"}],"name":"OnNameRegistered","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"playerAddress","type":"address"},{"indexed":false,"name":"reason","type":"bytes32"}],"name":"OnTransactionFail","type":"event"}]
Contract Creation Code
60806040526000805534801561001457600080fd5b50610e0f194201600255600460208190527f686f7273653100000000000000000000000000000000000000000000000000007fabd6e7cb50984ff9c2f3e18a2660c3353dadf4e3291deeb275dae2cd1e44fe05557f686f7273653200000000000000000000000000000000000000000000000000007f91da3fd0782e51c6b3986e9e672fd566868e71f3dbc2d6c2cd6fbb3e361af2a7557f686f7273653300000000000000000000000000000000000000000000000000007f2e174c10e159ea99b867ce3205125c24a42d128804e4070ed6fcc8cc98166aa0556000527f686f7273653400000000000000000000000000000000000000000000000000007f1a1e6821cde7d0159c0d293177871e09677b4e42307c7db3ba94f8648a5a050f556142a9806101436000396000f3006080604052600436106100fb5763ffffffff7c010000000000000000000000000000000000000000000000000000000060003504166302be5421811461016857806306fdde03146101e75780630830602b146102715780630a48bdbb146102bf57806315e5691b1461039d57806321b42566146103ec5780633a7761081461041c57806341f5947b14610430578063847a5e991461045c57806396f5c1521461049c5780639956587e146104ca578063a69c6597146104df578063b73c6ce9146104f4578063b9f2e1f214610509578063bfda8e8a1461052d578063c59d484714610762578063d015d86f146107b9578063dc996199146108d4575b73c17a40cb38598520bd7c0d5bff97d441a810a008600052600360205260008051602061421e8339815191525461013990349063ffffffff61092a16565b73c17a40cb38598520bd7c0d5bff97d441a810a008600052600360205260008051602061421e83398151915255005b34801561017457600080fd5b50610189600160a060020a036004351661093d565b60408051600160a060020a039b8c168152602081019a909a52898101989098526060890196909652608088019490945260a087019290925260c086015260e08501526101008401529092166101208201529051908190036101400190f35b3480156101f357600080fd5b506101fc61099c565b6040805160208082528351818301528351919283929083019185019080838360005b8381101561023657818101518382015260200161021e565b50505050905090810190601f1680156102635780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b6040805160206004803580820135601f81018490048402850184019095528484526102bd9436949293602493928401919081908401838280828437509497506109d39650505050505050565b005b3480156102cb57600080fd5b506102d7600435610c52565b60405160ff861681526020810185608080838360005b838110156103055781810151838201526020016102ed565b5050505090500184600460200280838360005b83811015610330578181015183820152602001610318565b5050505090500183600460200280838360005b8381101561035b578181015183820152602001610343565b5050505090500182600460200280838360005b8381101561038657818101518382015260200161036e565b505050509050019550505050505060405180910390f35b3480156103a957600080fd5b506103b860ff60043516611161565b60408051958652602086019490945284840192909252600160a060020a031660608401526080830152519081900360a00190f35b3480156103f857600080fd5b5061040a60ff600435166024356112bd565b60408051918252519081900360200190f35b6102bd60ff6004351660243560443561135e565b34801561043c57600080fd5b506104486004356115b7565b604080519115158252519081900360200190f35b34801561046857600080fd5b506104716115d3565b6040805195865260208601949094528484019290925260608401526080830152519081900360a00190f35b3480156104a857600080fd5b506104b460043561161e565b6040805160ff9092168252519081900360200190f35b3480156104d657600080fd5b5061040a611633565b3480156104eb57600080fd5b5061040a61163e565b34801561050057600080fd5b506102bd611655565b34801561051557600080fd5b506102bd60ff600435166024356044356064356117a9565b34801561053957600080fd5b50610545600435611a65565b604051808d61064080838360005b8381101561056b578181015183820152602001610553565b505050509050018c603260200280838360005b8381101561059657818101518382015260200161057e565b505050509050018b603260200280838360005b838110156105c15781810151838201526020016105a9565b505050509050018a603260200280838360005b838110156105ec5781810151838201526020016105d4565b5050505090500189603260200280838360005b838110156106175781810151838201526020016105ff565b5050505090500188603260200280838360005b8381101561064257818101518382015260200161062a565b5050505090500187603260200280838360005b8381101561066d578181015183820152602001610655565b5050505090500186603260200280838360005b83811015610698578181015183820152602001610680565b5050505090500185603260200280838360005b838110156106c35781810151838201526020016106ab565b5050505090500184603260200280838360005b838110156106ee5781810151838201526020016106d6565b5050505090500183603260200280838360005b83811015610719578181015183820152602001610701565b5050505090500182603260200280838360005b8381101561074457818101518382015260200161072c565b505050509050019c5050505050505050505050505060405180910390f35b34801561076e57600080fd5b50610777611dfe565b6040518086608080838360005b8381101561079c578181015183820152602001610784565b5050895192909401918252509150869050608080838360206102ed565b3480156107c557600080fd5b506107ce6120bd565b604051808981526020018881526020018760ff1660ff16815260200186600460200280838360005b8381101561080e5781810151838201526020016107f6565b5050505090500185600460200280838360005b83811015610839578181015183820152602001610821565b5050505090500184600460200280838360005b8381101561086457818101518382015260200161084c565b5050505090500183600460200280838360005b8381101561088f578181015183820152602001610877565b5050505090500182600460200280838360005b838110156108ba5781810151838201526020016108a2565b505050509050019850505050505050505060405180910390f35b60408051602060046024803582810135601f81018590048502860185019096528585526102bd95833560ff1695369560449491939091019190819084018382808284375094975050933594506126759350505050565b8181018281101561093757fe5b92915050565b6003602081905260009182526040909120805460018201546002830154938301546004840154600a850154600b860154600c870154600d880154600e90980154600160a060020a0397881699969896979596949593949293919291168a565b60408051808201909152600a81527f4574686572446572627900000000000000000000000000000000000000000000602082015281565b600033803b8015610a1c576040805160e560020a62461bcd02815260206004820152600e602482015260008051602061423e833981519152604482015290519081900360640190fd5b333214610a61576040805160e560020a62461bcd02815260206004820152600e602482015260008051602061423e833981519152604482015290519081900360640190fd5b66470de4df820000341015610ae6576040805160e560020a62461bcd02815260206004820152602960248201527f596f75206d757374207061792074686520706172746e657220666565206f662060448201527f32302066696e6e65790000000000000000000000000000000000000000000000606482015290519081900360840190fd5b610aef8461296f565b600081815260066020526040902054909350600160a060020a031615610b5f576040805160e560020a62461bcd02815260206004820152601360248201527f4e616d6520616c726561647920696e2075736500000000000000000000000000604482015290519081900360640190fd5b6000838152600660209081526040808320805473ffffffffffffffffffffffffffffffffffffffff19163390811790915583526003909152812060010184905573c17a40cb38598520bd7c0d5bff97d441a810a008905260008051602061421e83398151915254610bd790349063ffffffff61092a16565b73c17a40cb38598520bd7c0d5bff97d441a810a0086000526003602090815260008051602061421e83398151915291909155604080513381529182018590523482820152426060830152517f9d66d53cbc2eeb6bea75583aa14c2062287bfaa0d9051e72df8499985c8156919181900360800190a150505050565b6000610c5c6141be565b610c646141be565b610c6c6141be565b610c746141be565b851580610c82575060005486115b80610c9e575060005486148015610c9e5750610c9c612f43565b155b15610ca857611158565b600160008054815260200190815260200160002060000160009054906101000a900460ff16608060405190810160405280600160008a81526020019081526020016000206001016000600160ff1660ff168152602001908152602001600020548152602001600160008a81526020019081526020016000206001016000600260ff1660ff168152602001908152602001600020548152602001600160008a81526020019081526020016000206001016000600360ff1660ff168152602001908152602001600020548152602001600160008a81526020019081526020016000206001016000600460ff1660ff16815260200190815260200160002054815250608060405190810160405280600160008b81526020019081526020016000206002016000600160ff1660ff168152602001908152602001600020548152602001600160008b81526020019081526020016000206002016000600260ff1660ff168152602001908152602001600020548152602001600160008b81526020019081526020016000206002016000600360ff1660ff168152602001908152602001600020548152602001600160008b81526020019081526020016000206002016000600460ff1660ff168152602001908152602001600020548152506080604051908101604052806003600033600160a060020a0316600160a060020a0316815260200190815260200160002060050160008c81526020019081526020016000206000600160ff1660ff1681526020019081526020016000205481526020016003600033600160a060020a0316600160a060020a0316815260200190815260200160002060050160008c81526020019081526020016000206000600260ff1660ff1681526020019081526020016000205481526020016003600033600160a060020a0316600160a060020a0316815260200190815260200160002060050160008c81526020019081526020016000206000600360ff1660ff1681526020019081526020016000205481526020016003600033600160a060020a0316600160a060020a0316815260200190815260200160002060050160008c81526020019081526020016000206000600460ff1660ff168152602001908152602001600020548152506080604051908101604052806003600033600160a060020a0316600160a060020a0316815260200190815260200160002060060160008d81526020019081526020016000206000600160ff1660ff1681526020019081526020016000205481526020016003600033600160a060020a0316600160a060020a0316815260200190815260200160002060060160008d81526020019081526020016000206000600260ff1660ff1681526020019081526020016000205481526020016003600033600160a060020a0316600160a060020a0316815260200190815260200160002060060160008d81526020019081526020016000206000600360ff1660ff1681526020019081526020016000205481526020016003600033600160a060020a0316600160a060020a0316815260200190815260200160002060060160008d81526020019081526020016000206000600460ff1660ff16815260200190815260200160002054815250945094509450945094505b91939590929450565b6000808080808560ff81166001148061117d575060ff81166002145b8061118b575060ff81166003145b80611199575060ff81166004145b15156111dd576040805160e560020a62461bcd028152602060048201526016602482015260008051602061425e833981519152604482015290519081900360640190fd5b60ff87166000818152600460209081526040808320600390810154338552908352818420948452600990940190915290205410156112785733600090815260036020818152604080842060ff8c1685526009018252808420546004909252909220015461126991670de0b6b3a76400009161125d9163ffffffff612f4c16565b9063ffffffff61092a16565b95506112758787612f5e565b94505b5050505060ff9290921660009081526004602081815260408084206003808201549190940154600160a060020a03168086529390925290922060010154929491929091565b60008260ff8116600114806112d5575060ff81166002145b806112e3575060ff81166003145b806112f1575060ff81166004145b1515611335576040805160e560020a62461bcd028152602060048201526016602482015260008051602061425e833981519152604482015290519081900360640190fd5b6113568461135185670de0b6b3a764000063ffffffff612fb216565b612f5e565b949350505050565b33803b80156113a5576040805160e560020a62461bcd02815260206004820152600e602482015260008051602061423e833981519152604482015290519081900360640190fd5b3332146113ea576040805160e560020a62461bcd02815260206004820152600e602482015260008051602061423e833981519152604482015290519081900360640190fd5b34633b9aca00811015611447576040805160e560020a62461bcd02815260206004820152600f60248201527f4e6f7420656e6f75676820657468210000000000000000000000000000000000604482015290519081900360640190fd5b69152d02c7e14af68000008111156114a9576040805160e560020a62461bcd02815260206004820152600e60248201527f476f2061776179207768616c6521000000000000000000000000000000000000604482015290519081900360640190fd5b8560ff8116600114806114bf575060ff81166002145b806114cd575060ff81166003145b806114db575060ff81166004145b151561151f576040805160e560020a62461bcd028152602060048201526016602482015260008051602061425e833981519152604482015290519081900360640190fd5b61152886612fdb565b156115a357604080517f496e76616c696420726f756e64000000000000000000000000000000000000008152905133916000805160206141fe833981519152919081900360200190a260405133903480156108fc02916000818181858888f1935050505015801561159d573d6000803e3d6000fd5b506115ae565b6115ae873487612ff8565b50505050505050565b600090815260066020526040902054600160a060020a03161590565b60008060008060006115e3613747565b6115eb613778565b6115f36137f2565b336000908152600360205260409020600b810154600a90910154939992985090965094509092509050565b60016020526000908152604090205460ff1681565b66470de4df82000081565b336000908152600360205260409020600101545b90565b600033803b801561169e576040805160e560020a62461bcd02815260206004820152600e602482015260008051602061423e833981519152604482015290519081900360640190fd5b3332146116e3576040805160e560020a62461bcd02815260206004820152600e602482015260008051602061423e833981519152604482015290519081900360640190fd5b6116eb613820565b6116f4336138f7565b6116fc613a08565b9250600083111561176e57336000908152600360205260409020600a015461172b90849063ffffffff61092a16565b33600081815260036020526040808220600a01939093559151909185156108fc02918691818181858888f1935050505015801561176c573d6000803e3d6000fd5b505b60408051848152905133917f4a9a7ce5c41059acd2b3d280e9a9a50325c15c2cdda790f1c5a2d9a89eda9755919081900360200190a2505050565b33803b80156117f0576040805160e560020a62461bcd02815260206004820152600e602482015260008051602061423e833981519152604482015290519081900360640190fd5b333214611835576040805160e560020a62461bcd02815260206004820152600e602482015260008051602061423e833981519152604482015290519081900360640190fd5b83633b9aca00811015611892576040805160e560020a62461bcd02815260206004820152600f60248201527f4e6f7420656e6f75676820657468210000000000000000000000000000000000604482015290519081900360640190fd5b69152d02c7e14af68000008111156118f4576040805160e560020a62461bcd02815260206004820152600e60248201527f476f2061776179207768616c6521000000000000000000000000000000000000604482015290519081900360640190fd5b8660ff81166001148061190a575060ff81166002145b80611918575060ff81166003145b80611926575060ff81166004145b151561196a576040805160e560020a62461bcd028152602060048201526016602482015260008051602061425e833981519152604482015290519081900360640190fd5b61197387612fdb565b156119c157604080517f496e76616c696420726f756e64000000000000000000000000000000000000008152905133916000805160206141fe833981519152919081900360200190a2611a5b565b856119ca613a08565b1015611a1957604080517f496e73756666696369656e742066756e647300000000000000000000000000008152905133916000805160206141fe833981519152919081900360200190a2611a5b565b336000908152600360205260409020600b0154611a3d90879063ffffffff61092a16565b336000908152600360205260409020600b0155611a5b888787612ff8565b5050505050505050565b611a6d6141dd565b611a756141dd565b611a7d6141dd565b611a856141dd565b611a8d6141dd565b611a956141dd565b611a9d6141dd565b611aa56141dd565b611aad6141dd565b611ab56141dd565b611abd6141dd565b611ac56141dd565b600080548e15801590611ada57506000548f11155b15611ae257508d5b603282108015611af25750600081115b15611ded5760005481148015611b0d5750611b0b612f43565b155b15611b1b5760001901611ae2565b808e8360328110611b2857fe5b6020908102919091019190915260008281526001909152604090205460ff168d8360328110611b5357fe5b60ff90921660209283029190910152600082815260018083526040808320918352600290910190925220548c8360328110611b8a57fe5b60209081029190910191909152600082815260018252604080822060028084520190925220548b8360328110611bbc57fe5b6020908102919091019190915260008281526001825260408082206003835260020190925220548a8360328110611bef57fe5b602090810291909101919091526000828152600182526040808220600483526002019092522054898360328110611c2257fe5b602090810291909101919091523360009081526003825260408082208483526006018352808220600183529092522054888360328110611c5e57fe5b602090810291909101919091523360009081526003825260408082208483526006018352808220600283529092522054878360328110611c9a57fe5b6020908102919091019190915233600090815260038083526040808320858452600601845280832091835292522054868360328110611cd557fe5b602090810291909101919091523360009081526003825260408082208483526006018352808220600483529092522054858360328110611d1157fe5b6020908102919091019190915260008281526001808352604080832060048452820190935282822054600383528383205460028452848420549284529390922054611d639361125d929091839161092a565b848360328110611d6f57fe5b602090810291909101919091523360009081526003808352604080832085845260050184528083206004845290935282822054908252828220546002835283832054600184529390922054611dcd93919261125d929091839161092a565b838360328110611dd957fe5b602002015260019091019060001901611ae2565b505091939597999b5091939597999b565b611e066141be565b611e0e6141be565b611e166141be565b611e1e6141be565b611e266141be565b505060408051608080820183527fabd6e7cb50984ff9c2f3e18a2660c3353dadf4e3291deeb275dae2cd1e44fe065482527f91da3fd0782e51c6b3986e9e672fd566868e71f3dbc2d6c2cd6fbb3e361af2a8546020808401919091527f2e174c10e159ea99b867ce3205125c24a42d128804e4070ed6fcc8cc98166aa154838501527f1a1e6821cde7d0159c0d293177871e09677b4e42307c7db3ba94f8648a5a051054606080850191909152845180840186527fabd6e7cb50984ff9c2f3e18a2660c3353dadf4e3291deeb275dae2cd1e44fe075481527f91da3fd0782e51c6b3986e9e672fd566868e71f3dbc2d6c2cd6fbb3e361af2a954818401527f2e174c10e159ea99b867ce3205125c24a42d128804e4070ed6fcc8cc98166aa254818701527f1a1e6821cde7d0159c0d293177871e09677b4e42307c7db3ba94f8648a5a051154818301528551808501875233600090815260038086528882206001808452600882018089528b85205486526002808652818a528c862054878b0152848652818a528c862054878e01526004808752918a528c862054878a01528c51808c018e529286526009909301808a528c86205483529285528289528b852054828a01529284528188528a842054818c0152828452908752898320548187015289519788018a527fabd6e7cb50984ff9c2f3e18a2660c3353dadf4e3291deeb275dae2cd1e44fe055488527f91da3fd0782e51c6b3986e9e672fd566868e71f3dbc2d6c2cd6fbb3e361af2a754888801527f2e174c10e159ea99b867ce3205125c24a42d128804e4070ed6fcc8cc98166aa05499880199909952908190529093527f1a1e6821cde7d0159c0d293177871e09677b4e42307c7db3ba94f8648a5a050f549184019190915292979296509450919250565b60008060006120ca6141be565b6120d26141be565b6120da6141be565b6120e26141be565b6120ea6141be565b600054600254600160008054815260200190815260200160002060000160009054906101000a900460ff1660806040519081016040528060016000805481526020019081526020016000206001016000600160ff1660ff16815260200190815260200160002054815260200160016000805481526020019081526020016000206001016000600260ff1660ff16815260200190815260200160002054815260200160016000805481526020019081526020016000206001016000600360ff1660ff16815260200190815260200160002054815260200160016000805481526020019081526020016000206001016000600460ff1660ff1681526020019081526020016000205481525060806040519081016040528060016000805481526020019081526020016000206002016000600160ff1660ff16815260200190815260200160002054815260200160016000805481526020019081526020016000206002016000600260ff1660ff16815260200190815260200160002054815260200160016000805481526020019081526020016000206002016000600360ff1660ff16815260200190815260200160002054815260200160016000805481526020019081526020016000206002016000600460ff1660ff168152602001908152602001600020548152506080604051908101604052806003600033600160a060020a0316600160a060020a031681526020019081526020016000206005016000805481526020019081526020016000206000600160ff1660ff1681526020019081526020016000205481526020016003600033600160a060020a0316600160a060020a031681526020019081526020016000206005016000805481526020019081526020016000206000600260ff1660ff1681526020019081526020016000205481526020016003600033600160a060020a0316600160a060020a031681526020019081526020016000206005016000805481526020019081526020016000206000600360ff1660ff1681526020019081526020016000205481526020016003600033600160a060020a0316600160a060020a031681526020019081526020016000206005016000805481526020019081526020016000206000600460ff1660ff168152602001908152602001600020548152506080604051908101604052806003600033600160a060020a0316600160a060020a031681526020019081526020016000206006016000805481526020019081526020016000206000600160ff1660ff1681526020019081526020016000205481526020016003600033600160a060020a0316600160a060020a031681526020019081526020016000206006016000805481526020019081526020016000206000600260ff1660ff1681526020019081526020016000205481526020016003600033600160a060020a0316600160a060020a031681526020019081526020016000206006016000805481526020019081526020016000206000600360ff1660ff1681526020019081526020016000205481526020016003600033600160a060020a0316600160a060020a031681526020019081526020016000206006016000805481526020019081526020016000206000600460ff1660ff1681526020019081526020016000205481525060806040519081016040528060046000600160ff1660ff168152602001908152602001600020600001546000191660001916815260200160046000600260ff1660ff168152602001908152602001600020600001546000191660001916815260200160046000600360ff1660ff168152602001908152602001600020600001546000191660001916815260200160046000600460ff1660ff168152602001908152602001600020600001546000191660001916815250975097509750975097509750975097509091929394959697565b33803b80156126bc576040805160e560020a62461bcd02815260206004820152600e602482015260008051602061423e833981519152604482015290519081900360640190fd5b333214612701576040805160e560020a62461bcd02815260206004820152600e602482015260008051602061423e833981519152604482015290519081900360640190fd5b8460ff811660011480612717575060ff81166002145b80612725575060ff81166003145b80612733575060ff81166004145b1515612777576040805160e560020a62461bcd028152602060048201526016602482015260008051602061425e833981519152604482015290519081900360640190fd5b60ff8616600081815260046020908152604080832060039081015433855290835281842094845260099094019091528120546127ee9161125d9034906001906127be613a53565b81526020808201929092526040908101600090812060ff8f1682526001019092529020549063ffffffff613a7516565b101561287457604080517f496e73756666696369656e742066756e647300000000000000000000000000008152905133916000805160206141fe833981519152919081900360200190a2600034111561286f5760405133903480156108fc02916000818181858888f1935050505015801561286d573d6000803e3d6000fd5b505b612967565b600034111561288857612888863486612ff8565b6128918561296f565b60ff871660009081526004602081905260409091209182550154600160a060020a031633146128ee5760ff8616600090815260046020819052604090912001805473ffffffffffffffffffffffffffffffffffffffff1916331790555b3360008181526003602081815260408084206001015460ff8c168086526004845294829020805494015482519687529286015284810193909352606084019190915260808301524260a0830152517f9e17b52779622ff1f917bf346e699156a067e77d4fb32d5bc004c9afbf6708219181900360c00190a15b505050505050565b80516000908290828080600f841180159061298a5750600084115b1515612a06576040805160e560020a62461bcd02815260206004820152602860248201527f6e616d65206d757374206265206265747765656e203120616e6420313520636860448201527f6172616374657273000000000000000000000000000000000000000000000000606482015290519081900360840190fd5b846000815181101515612a1557fe5b90602001015160f860020a900460f860020a02600160f860020a031916603060f860020a021415612b5857846001815181101515612a4f57fe5b90602001015160f860020a900460f860020a02600160f860020a031916607860f860020a0214151515612acc576040805160e560020a62461bcd02815260206004820152601960248201527f6e616d652063616e6e6f74207374617274207769746820307800000000000000604482015290519081900360640190fd5b846001815181101515612adb57fe5b90602001015160f860020a900460f860020a02600160f860020a031916605860f860020a0214151515612b58576040805160e560020a62461bcd02815260206004820152601960248201527f6e616d652063616e6e6f74207374617274207769746820305800000000000000604482015290519081900360640190fd5b600091505b83821015612edb5784517f400000000000000000000000000000000000000000000000000000000000000090869084908110612b9557fe5b90602001015160f860020a900460f860020a02600160f860020a031916118015612c09575084517f5b0000000000000000000000000000000000000000000000000000000000000090869084908110612bea57fe5b90602001015160f860020a900460f860020a02600160f860020a031916105b15612c76578482815181101515612c1c57fe5b90602001015160f860020a900460f860020a0260f860020a900460200160f860020a028583815181101515612c4d57fe5b906020010190600160f860020a031916908160001a905350821515612c7157600192505b612ed0565b84517f600000000000000000000000000000000000000000000000000000000000000090869084908110612ca657fe5b90602001015160f860020a900460f860020a02600160f860020a031916118015612d1a575084517f7b0000000000000000000000000000000000000000000000000000000000000090869084908110612cfb57fe5b90602001015160f860020a900460f860020a02600160f860020a031916105b80612dc4575084517f2f0000000000000000000000000000000000000000000000000000000000000090869084908110612d5057fe5b90602001015160f860020a900460f860020a02600160f860020a031916118015612dc4575084517f3a0000000000000000000000000000000000000000000000000000000000000090869084908110612da557fe5b90602001015160f860020a900460f860020a02600160f860020a031916105b1515612e1a576040805160e560020a62461bcd02815260206004820181905260248201527f6e616d6520636f6e7461696e7320696e76616c69642063686172616374657273604482015290519081900360640190fd5b82158015612ec6575084517f300000000000000000000000000000000000000000000000000000000000000090869084908110612e5357fe5b90602001015160f860020a900460f860020a02600160f860020a0319161080612ec6575084517f390000000000000000000000000000000000000000000000000000000000000090869084908110612ea757fe5b90602001015160f860020a900460f860020a02600160f860020a031916115b15612ed057600192505b600190910190612b5d565b600183151514612f35576040805160e560020a62461bcd02815260206004820152601b60248201527f6e616d652063616e6e6f74206265206f6e6c79206e756d626572730000000000604482015290519081900360640190fd5b505050506020015192915050565b60025442101590565b600082821115612f5857fe5b50900390565b600080612f69612f43565b1515612f92575060008054815260016020908152604080832060ff871684526002019091529020545b61135683612fa6838263ffffffff61092a16565b9063ffffffff613aa216565b6000821515612fc357506000610937565b50818102818382811515612fd357fe5b041461093757fe5b600081158015906109375750612fef613a53565b82141592915050565b600080613003613ac8565b61300b613820565b61301483613b26565b915061301f826138f7565b600160a060020a03821673c17a40cb38598520bd7c0d5bff97d441a810a008146130605761306073c17a40cb38598520bd7c0d5bff97d441a810a0086138f7565b60008054815260016020818152604080842060ff8a1685529092019052902054613090908563ffffffff613a7516565b33600090815260036020908152604080832083548452600501825280832060ff8a1684529091529020549091506130ce90859063ffffffff61092a16565b3360009081526003602090815260408083208354845260058101835281842060ff8b1680865290845282852095909555835484526006018252808320938352929052205461312390829063ffffffff61092a16565b3360009081526003602090815260408083208354845260068101835281842060ff8b16855283528184209490945560089093019052205461316590859061092a565b33600090815260036020908152604080832060ff8a1684526008810183528184209490945560099093019052205461319e90829061092a565b33600090815260036020908152604080832060ff8a1684526009019091529020556005546131db906131d6908363ffffffff612fb216565b613c51565b3360009081526003602090815260408083206004018054909401909355600160a060020a038516825282822082548352600701815282822060ff891683529052205461322a9061125d86613c5e565b600160a060020a038316600090815260036020908152604080832083548452600701825280832060ff8a1680855290835281842094909455825483527f0519235f8bb76824fedb09ceb8463c91ba75d601351fa046c29214ea50b71893825280832093835292905220546132a99061125d86606463ffffffff613c7616565b6000805481527f0519235f8bb76824fedb09ceb8463c91ba75d601351fa046c29214ea50b718936020908152604080832060ff8a168085529083528184209490945560048252808320600390810154338552908352818420948452600990940190915290205411156133415733600090815260036020818152604080842060ff8a168552600901825280842054600490925290922001555b60008054815260016020818152604080842060ff8a168552909201905290205461337290859063ffffffff61092a16565b60008054815260016020818152604080842060ff8b1680865290840183528185209590955583548452918152818320938352600290930190925220546133bf90829063ffffffff61092a16565b60008054815260016020818152604080842060ff808c168087526002909201845282862096909655845485529290915290912054909116148015906134315750600080548152600160209081526040808320805460ff9081168552600290910190925280832054918816835290912054115b1561345357600080548152600160205260409020805460ff191660ff87161790555b60ff851660009081526004602052604090206002015461347a90829063ffffffff61092a16565b60ff861660009081526004602052604090206002810191909155600101546134a990859063ffffffff61092a16565b600460008760ff1660ff16815260200190815260200160002060010181905550600460008660ff1660ff168152602001908152602001600020600001546000191633600160a060020a03167f37e922ba04599bac08dd204063b35033a2404af8421bbbfc19e37ae1428d27816003600033600160a060020a0316600160a060020a031681526020019081526020016000206001015460005460408051908101604052808b60ff1660ff168152602001600160008054815260200190815260200160002060000160009054906101000a900460ff1660ff1660ff1681525060c0604051908101604052808b8152602001888152602001600160008054815260200190815260200160002060010160008e60ff1660ff168152602001908152602001600020548152602001600160008054815260200190815260200160002060020160008e60ff1660ff1681526020019081526020016000205481526020016003600033600160a060020a0316600160a060020a0316815260200190815260200160002060050160008054815260200190815260200160002060008e60ff1660ff1681526020019081526020016000205481526020016003600033600160a060020a0316600160a060020a0316815260200190815260200160002060060160008054815260200190815260200160002060008e60ff1660ff168152602001908152602001600020548152506002544260405180876000191660001916815260200186815260200185600260200280838360005b838110156136f25781810151838201526020016136da565b5050505090500184600660200280838360005b8381101561371d578181015183820152602001613705565b50505050905001838152602001828152602001965050505050505060405180910390a35050505050565b6000613773613754613c8b565b336000908152600360205260409020600201549063ffffffff61092a16565b905090565b600080600080613786613d92565b9250613790613dcf565b91506137ae6131d68461125d60055486612fb290919063ffffffff16565b336000908152600360205260409020600401549091506137ea9068010000000000000000906137de908403613e17565b9063ffffffff613c7616565b935050505090565b600061377361380033613e23565b33600090815260036020819052604090912001549063ffffffff61092a16565b600061382a613c8b565b9050600081111561386d573360009081526003602052604090206002015461385990829063ffffffff61092a16565b336000908152600360205260409020600201555b6000805433825260036020526040909120600c01541480156138925750613892612f43565b156138c3576000546138ab90600163ffffffff61092a16565b336000908152600360205260409020600c01556138f4565b6000805433825260036020526040909120600c015410156138f4576000805433825260036020526040909120600c01555b50565b600061390282613e23565b9050600081111561395957600160a060020a0382166000908152600360208190526040909120015461393b90829063ffffffff61092a16565b600160a060020a038316600090815260036020819052604090912001555b60008054600160a060020a038416825260036020526040909120600d01541480156139875750613987612f43565b156139c1576000546139a090600163ffffffff61092a16565b600160a060020a0383166000908152600360205260409020600d0155613a04565b60008054600160a060020a038416825260036020526040909120600d01541015613a045760008054600160a060020a038416825260036020526040909120600d01555b5050565b336000908152600360205260408120600b810154600a909101546137739190613a479081613a346137f2565b61125d613a3f613778565b61125d613747565b9063ffffffff612f4c16565b6000613a5d612f43565b15613a6e5750600054600101611652565b5060005490565b6000613a9b613a8384613eef565b613a47613a96868663ffffffff61092a16565b613eef565b9392505050565b6000613a9b613abf613aba858563ffffffff612f4c16565b613f64565b613a4785613f64565b6000613ad2612f43565b1515613add576138f4565b613af0613aeb600054613fd8565b61403e565b90506000811115613b1257600554613b0e908263ffffffff61092a16565b6005555b600080546001019055426138400160025550565b6000808215801590613b4e5750600083815260066020526040902054600160a060020a031615155b8015613b6c5750336000908152600360205260409020600101548314155b15613b8f5750600082815260066020526040902054600160a060020a0316613be9565b336000908152600360205260409020600e0154600160a060020a031615613bd25750336000908152600360205260409020600e0154600160a060020a0316613be9565b5073c17a40cb38598520bd7c0d5bff97d441a810a0085b336000908152600360205260409020600e0154600160a060020a03828116911614613c4757336000908152600360205260409020600e01805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a0383161790555b8091505b50919050565b60008181811215613c4757fe5b600061093760646137de84600963ffffffff612fb216565b60008183811515613c8357fe5b049392505050565b336000908152600360205260408120600c0154801580613cac575060005481115b80613cc8575060005481148015613cc85750613cc6612f43565b155b15613cd65760009150613d8e565b6000818152600160209081526040808320805460ff168452600201909152902054613d8b90613d4f906137de613d13613d0e86613fd8565b61407b565b3360009081526003602090815260408083208984526006018252808320600183528184205460ff1684529091529020549063ffffffff612fb216565b3360009081526003602090815260408083208684526005018252808320600183528184205460ff1684529091529020549063ffffffff61092a16565b91505b5090565b6000613d9c612f43565b1515613daa57506000611652565b613773613db5613dcf565b613dc3613aeb600054613fd8565b9063ffffffff612fb216565b33600090815260036020818152604080842060048552600901909152808320549183528083205460028452818420546001855291842054613773939261125d9291839161092a565b600080821215613d8e57fe5b600160a060020a0381166000908152600360205260408120600d015481811580613e4e575060005482115b80613e6a575060005482148015613e6a5750613e68612f43565b155b1515613ee8575060015b600460ff821611613ee85760008281526001602052604090205460ff828116911614613ee057600160a060020a0384166000908152600360209081526040808320858452600701825280832060ff85168452909152902054613edd90849063ffffffff61092a16565b92505b600101613e74565b5050919050565b600064075088ff08613f546d04edfaabeec07f6d844414700000613a47613f4f7a184d0f77425630299fa70407e0e1d45a96ce8e5d21b1000000000061125d88730b017a4cd83664b71dee232edc9bd1000000000063ffffffff612fb216565b6140be565b811515613f5d57fe5b0492915050565b60006ec097ce7bc90715b34b9f1000000000613f546002613fa9613f9686670de0b6b3a764000063ffffffff612fb216565b65b5ded06b80f89063ffffffff612fb216565b811515613fb257fe5b0461125d613fc6868063ffffffff612fb216565b6403a8447f849063ffffffff612fb216565b600060015b600460ff821611613c4b5760008381526001602052604090205460ff82811691161461403657600083815260016020818152604080842060ff86168552909201905290205461403390839063ffffffff61092a16565b91505b600101613fdd565b600080614049614111565b905080151561405b5760009150613c4b565b613a9b816137de600a81876801000000000000000063ffffffff612fb216565b600061093761409183600a63ffffffff613c7616565b613a476140a585606463ffffffff613c7616565b613a476140b187613c5e565b879063ffffffff612f4c16565b60008060026140ce84600161092a565b8115156140d757fe5b0490508291505b81811015613c4b57809150600261410082858115156140f957fe5b048361092a565b81151561410957fe5b0490506140de565b60046020527f1a1e6821cde7d0159c0d293177871e09677b4e42307c7db3ba94f8648a5a0511547f2e174c10e159ea99b867ce3205125c24a42d128804e4070ed6fcc8cc98166aa2547f91da3fd0782e51c6b3986e9e672fd566868e71f3dbc2d6c2cd6fbb3e361af2a954600160009081527fabd6e7cb50984ff9c2f3e18a2660c3353dadf4e3291deeb275dae2cd1e44fe0754909361377393909261125d92839163ffffffff61092a16565b6080604051908101604052806004906020820280388339509192915050565b61064060405190810160405280603290602082028038833950919291505056007c9cea421c85b153482cc16cc5d3f3c486d5efc921236b82e56302d82cfba5230519235f8bb76824fedb09ceb8463c91ba75d601351fa046c29214ea50b7188f48756d616e73206f6e6c79203b29000000000000000000000000000000000000756e6b6e6f776e20686f7273652073656c656374656400000000000000000000a165627a7a7230582059143cca1f4a30ae88a4d6456817108ad7cec9c70f0eb0d7ec65c55df0f029830029
Deployed Bytecode
0x6080604052600436106100fb5763ffffffff7c010000000000000000000000000000000000000000000000000000000060003504166302be5421811461016857806306fdde03146101e75780630830602b146102715780630a48bdbb146102bf57806315e5691b1461039d57806321b42566146103ec5780633a7761081461041c57806341f5947b14610430578063847a5e991461045c57806396f5c1521461049c5780639956587e146104ca578063a69c6597146104df578063b73c6ce9146104f4578063b9f2e1f214610509578063bfda8e8a1461052d578063c59d484714610762578063d015d86f146107b9578063dc996199146108d4575b73c17a40cb38598520bd7c0d5bff97d441a810a008600052600360205260008051602061421e8339815191525461013990349063ffffffff61092a16565b73c17a40cb38598520bd7c0d5bff97d441a810a008600052600360205260008051602061421e83398151915255005b34801561017457600080fd5b50610189600160a060020a036004351661093d565b60408051600160a060020a039b8c168152602081019a909a52898101989098526060890196909652608088019490945260a087019290925260c086015260e08501526101008401529092166101208201529051908190036101400190f35b3480156101f357600080fd5b506101fc61099c565b6040805160208082528351818301528351919283929083019185019080838360005b8381101561023657818101518382015260200161021e565b50505050905090810190601f1680156102635780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b6040805160206004803580820135601f81018490048402850184019095528484526102bd9436949293602493928401919081908401838280828437509497506109d39650505050505050565b005b3480156102cb57600080fd5b506102d7600435610c52565b60405160ff861681526020810185608080838360005b838110156103055781810151838201526020016102ed565b5050505090500184600460200280838360005b83811015610330578181015183820152602001610318565b5050505090500183600460200280838360005b8381101561035b578181015183820152602001610343565b5050505090500182600460200280838360005b8381101561038657818101518382015260200161036e565b505050509050019550505050505060405180910390f35b3480156103a957600080fd5b506103b860ff60043516611161565b60408051958652602086019490945284840192909252600160a060020a031660608401526080830152519081900360a00190f35b3480156103f857600080fd5b5061040a60ff600435166024356112bd565b60408051918252519081900360200190f35b6102bd60ff6004351660243560443561135e565b34801561043c57600080fd5b506104486004356115b7565b604080519115158252519081900360200190f35b34801561046857600080fd5b506104716115d3565b6040805195865260208601949094528484019290925260608401526080830152519081900360a00190f35b3480156104a857600080fd5b506104b460043561161e565b6040805160ff9092168252519081900360200190f35b3480156104d657600080fd5b5061040a611633565b3480156104eb57600080fd5b5061040a61163e565b34801561050057600080fd5b506102bd611655565b34801561051557600080fd5b506102bd60ff600435166024356044356064356117a9565b34801561053957600080fd5b50610545600435611a65565b604051808d61064080838360005b8381101561056b578181015183820152602001610553565b505050509050018c603260200280838360005b8381101561059657818101518382015260200161057e565b505050509050018b603260200280838360005b838110156105c15781810151838201526020016105a9565b505050509050018a603260200280838360005b838110156105ec5781810151838201526020016105d4565b5050505090500189603260200280838360005b838110156106175781810151838201526020016105ff565b5050505090500188603260200280838360005b8381101561064257818101518382015260200161062a565b5050505090500187603260200280838360005b8381101561066d578181015183820152602001610655565b5050505090500186603260200280838360005b83811015610698578181015183820152602001610680565b5050505090500185603260200280838360005b838110156106c35781810151838201526020016106ab565b5050505090500184603260200280838360005b838110156106ee5781810151838201526020016106d6565b5050505090500183603260200280838360005b83811015610719578181015183820152602001610701565b5050505090500182603260200280838360005b8381101561074457818101518382015260200161072c565b505050509050019c5050505050505050505050505060405180910390f35b34801561076e57600080fd5b50610777611dfe565b6040518086608080838360005b8381101561079c578181015183820152602001610784565b5050895192909401918252509150869050608080838360206102ed565b3480156107c557600080fd5b506107ce6120bd565b604051808981526020018881526020018760ff1660ff16815260200186600460200280838360005b8381101561080e5781810151838201526020016107f6565b5050505090500185600460200280838360005b83811015610839578181015183820152602001610821565b5050505090500184600460200280838360005b8381101561086457818101518382015260200161084c565b5050505090500183600460200280838360005b8381101561088f578181015183820152602001610877565b5050505090500182600460200280838360005b838110156108ba5781810151838201526020016108a2565b505050509050019850505050505050505060405180910390f35b60408051602060046024803582810135601f81018590048502860185019096528585526102bd95833560ff1695369560449491939091019190819084018382808284375094975050933594506126759350505050565b8181018281101561093757fe5b92915050565b6003602081905260009182526040909120805460018201546002830154938301546004840154600a850154600b860154600c870154600d880154600e90980154600160a060020a0397881699969896979596949593949293919291168a565b60408051808201909152600a81527f4574686572446572627900000000000000000000000000000000000000000000602082015281565b600033803b8015610a1c576040805160e560020a62461bcd02815260206004820152600e602482015260008051602061423e833981519152604482015290519081900360640190fd5b333214610a61576040805160e560020a62461bcd02815260206004820152600e602482015260008051602061423e833981519152604482015290519081900360640190fd5b66470de4df820000341015610ae6576040805160e560020a62461bcd02815260206004820152602960248201527f596f75206d757374207061792074686520706172746e657220666565206f662060448201527f32302066696e6e65790000000000000000000000000000000000000000000000606482015290519081900360840190fd5b610aef8461296f565b600081815260066020526040902054909350600160a060020a031615610b5f576040805160e560020a62461bcd02815260206004820152601360248201527f4e616d6520616c726561647920696e2075736500000000000000000000000000604482015290519081900360640190fd5b6000838152600660209081526040808320805473ffffffffffffffffffffffffffffffffffffffff19163390811790915583526003909152812060010184905573c17a40cb38598520bd7c0d5bff97d441a810a008905260008051602061421e83398151915254610bd790349063ffffffff61092a16565b73c17a40cb38598520bd7c0d5bff97d441a810a0086000526003602090815260008051602061421e83398151915291909155604080513381529182018590523482820152426060830152517f9d66d53cbc2eeb6bea75583aa14c2062287bfaa0d9051e72df8499985c8156919181900360800190a150505050565b6000610c5c6141be565b610c646141be565b610c6c6141be565b610c746141be565b851580610c82575060005486115b80610c9e575060005486148015610c9e5750610c9c612f43565b155b15610ca857611158565b600160008054815260200190815260200160002060000160009054906101000a900460ff16608060405190810160405280600160008a81526020019081526020016000206001016000600160ff1660ff168152602001908152602001600020548152602001600160008a81526020019081526020016000206001016000600260ff1660ff168152602001908152602001600020548152602001600160008a81526020019081526020016000206001016000600360ff1660ff168152602001908152602001600020548152602001600160008a81526020019081526020016000206001016000600460ff1660ff16815260200190815260200160002054815250608060405190810160405280600160008b81526020019081526020016000206002016000600160ff1660ff168152602001908152602001600020548152602001600160008b81526020019081526020016000206002016000600260ff1660ff168152602001908152602001600020548152602001600160008b81526020019081526020016000206002016000600360ff1660ff168152602001908152602001600020548152602001600160008b81526020019081526020016000206002016000600460ff1660ff168152602001908152602001600020548152506080604051908101604052806003600033600160a060020a0316600160a060020a0316815260200190815260200160002060050160008c81526020019081526020016000206000600160ff1660ff1681526020019081526020016000205481526020016003600033600160a060020a0316600160a060020a0316815260200190815260200160002060050160008c81526020019081526020016000206000600260ff1660ff1681526020019081526020016000205481526020016003600033600160a060020a0316600160a060020a0316815260200190815260200160002060050160008c81526020019081526020016000206000600360ff1660ff1681526020019081526020016000205481526020016003600033600160a060020a0316600160a060020a0316815260200190815260200160002060050160008c81526020019081526020016000206000600460ff1660ff168152602001908152602001600020548152506080604051908101604052806003600033600160a060020a0316600160a060020a0316815260200190815260200160002060060160008d81526020019081526020016000206000600160ff1660ff1681526020019081526020016000205481526020016003600033600160a060020a0316600160a060020a0316815260200190815260200160002060060160008d81526020019081526020016000206000600260ff1660ff1681526020019081526020016000205481526020016003600033600160a060020a0316600160a060020a0316815260200190815260200160002060060160008d81526020019081526020016000206000600360ff1660ff1681526020019081526020016000205481526020016003600033600160a060020a0316600160a060020a0316815260200190815260200160002060060160008d81526020019081526020016000206000600460ff1660ff16815260200190815260200160002054815250945094509450945094505b91939590929450565b6000808080808560ff81166001148061117d575060ff81166002145b8061118b575060ff81166003145b80611199575060ff81166004145b15156111dd576040805160e560020a62461bcd028152602060048201526016602482015260008051602061425e833981519152604482015290519081900360640190fd5b60ff87166000818152600460209081526040808320600390810154338552908352818420948452600990940190915290205410156112785733600090815260036020818152604080842060ff8c1685526009018252808420546004909252909220015461126991670de0b6b3a76400009161125d9163ffffffff612f4c16565b9063ffffffff61092a16565b95506112758787612f5e565b94505b5050505060ff9290921660009081526004602081815260408084206003808201549190940154600160a060020a03168086529390925290922060010154929491929091565b60008260ff8116600114806112d5575060ff81166002145b806112e3575060ff81166003145b806112f1575060ff81166004145b1515611335576040805160e560020a62461bcd028152602060048201526016602482015260008051602061425e833981519152604482015290519081900360640190fd5b6113568461135185670de0b6b3a764000063ffffffff612fb216565b612f5e565b949350505050565b33803b80156113a5576040805160e560020a62461bcd02815260206004820152600e602482015260008051602061423e833981519152604482015290519081900360640190fd5b3332146113ea576040805160e560020a62461bcd02815260206004820152600e602482015260008051602061423e833981519152604482015290519081900360640190fd5b34633b9aca00811015611447576040805160e560020a62461bcd02815260206004820152600f60248201527f4e6f7420656e6f75676820657468210000000000000000000000000000000000604482015290519081900360640190fd5b69152d02c7e14af68000008111156114a9576040805160e560020a62461bcd02815260206004820152600e60248201527f476f2061776179207768616c6521000000000000000000000000000000000000604482015290519081900360640190fd5b8560ff8116600114806114bf575060ff81166002145b806114cd575060ff81166003145b806114db575060ff81166004145b151561151f576040805160e560020a62461bcd028152602060048201526016602482015260008051602061425e833981519152604482015290519081900360640190fd5b61152886612fdb565b156115a357604080517f496e76616c696420726f756e64000000000000000000000000000000000000008152905133916000805160206141fe833981519152919081900360200190a260405133903480156108fc02916000818181858888f1935050505015801561159d573d6000803e3d6000fd5b506115ae565b6115ae873487612ff8565b50505050505050565b600090815260066020526040902054600160a060020a03161590565b60008060008060006115e3613747565b6115eb613778565b6115f36137f2565b336000908152600360205260409020600b810154600a90910154939992985090965094509092509050565b60016020526000908152604090205460ff1681565b66470de4df82000081565b336000908152600360205260409020600101545b90565b600033803b801561169e576040805160e560020a62461bcd02815260206004820152600e602482015260008051602061423e833981519152604482015290519081900360640190fd5b3332146116e3576040805160e560020a62461bcd02815260206004820152600e602482015260008051602061423e833981519152604482015290519081900360640190fd5b6116eb613820565b6116f4336138f7565b6116fc613a08565b9250600083111561176e57336000908152600360205260409020600a015461172b90849063ffffffff61092a16565b33600081815260036020526040808220600a01939093559151909185156108fc02918691818181858888f1935050505015801561176c573d6000803e3d6000fd5b505b60408051848152905133917f4a9a7ce5c41059acd2b3d280e9a9a50325c15c2cdda790f1c5a2d9a89eda9755919081900360200190a2505050565b33803b80156117f0576040805160e560020a62461bcd02815260206004820152600e602482015260008051602061423e833981519152604482015290519081900360640190fd5b333214611835576040805160e560020a62461bcd02815260206004820152600e602482015260008051602061423e833981519152604482015290519081900360640190fd5b83633b9aca00811015611892576040805160e560020a62461bcd02815260206004820152600f60248201527f4e6f7420656e6f75676820657468210000000000000000000000000000000000604482015290519081900360640190fd5b69152d02c7e14af68000008111156118f4576040805160e560020a62461bcd02815260206004820152600e60248201527f476f2061776179207768616c6521000000000000000000000000000000000000604482015290519081900360640190fd5b8660ff81166001148061190a575060ff81166002145b80611918575060ff81166003145b80611926575060ff81166004145b151561196a576040805160e560020a62461bcd028152602060048201526016602482015260008051602061425e833981519152604482015290519081900360640190fd5b61197387612fdb565b156119c157604080517f496e76616c696420726f756e64000000000000000000000000000000000000008152905133916000805160206141fe833981519152919081900360200190a2611a5b565b856119ca613a08565b1015611a1957604080517f496e73756666696369656e742066756e647300000000000000000000000000008152905133916000805160206141fe833981519152919081900360200190a2611a5b565b336000908152600360205260409020600b0154611a3d90879063ffffffff61092a16565b336000908152600360205260409020600b0155611a5b888787612ff8565b5050505050505050565b611a6d6141dd565b611a756141dd565b611a7d6141dd565b611a856141dd565b611a8d6141dd565b611a956141dd565b611a9d6141dd565b611aa56141dd565b611aad6141dd565b611ab56141dd565b611abd6141dd565b611ac56141dd565b600080548e15801590611ada57506000548f11155b15611ae257508d5b603282108015611af25750600081115b15611ded5760005481148015611b0d5750611b0b612f43565b155b15611b1b5760001901611ae2565b808e8360328110611b2857fe5b6020908102919091019190915260008281526001909152604090205460ff168d8360328110611b5357fe5b60ff90921660209283029190910152600082815260018083526040808320918352600290910190925220548c8360328110611b8a57fe5b60209081029190910191909152600082815260018252604080822060028084520190925220548b8360328110611bbc57fe5b6020908102919091019190915260008281526001825260408082206003835260020190925220548a8360328110611bef57fe5b602090810291909101919091526000828152600182526040808220600483526002019092522054898360328110611c2257fe5b602090810291909101919091523360009081526003825260408082208483526006018352808220600183529092522054888360328110611c5e57fe5b602090810291909101919091523360009081526003825260408082208483526006018352808220600283529092522054878360328110611c9a57fe5b6020908102919091019190915233600090815260038083526040808320858452600601845280832091835292522054868360328110611cd557fe5b602090810291909101919091523360009081526003825260408082208483526006018352808220600483529092522054858360328110611d1157fe5b6020908102919091019190915260008281526001808352604080832060048452820190935282822054600383528383205460028452848420549284529390922054611d639361125d929091839161092a565b848360328110611d6f57fe5b602090810291909101919091523360009081526003808352604080832085845260050184528083206004845290935282822054908252828220546002835283832054600184529390922054611dcd93919261125d929091839161092a565b838360328110611dd957fe5b602002015260019091019060001901611ae2565b505091939597999b5091939597999b565b611e066141be565b611e0e6141be565b611e166141be565b611e1e6141be565b611e266141be565b505060408051608080820183527fabd6e7cb50984ff9c2f3e18a2660c3353dadf4e3291deeb275dae2cd1e44fe065482527f91da3fd0782e51c6b3986e9e672fd566868e71f3dbc2d6c2cd6fbb3e361af2a8546020808401919091527f2e174c10e159ea99b867ce3205125c24a42d128804e4070ed6fcc8cc98166aa154838501527f1a1e6821cde7d0159c0d293177871e09677b4e42307c7db3ba94f8648a5a051054606080850191909152845180840186527fabd6e7cb50984ff9c2f3e18a2660c3353dadf4e3291deeb275dae2cd1e44fe075481527f91da3fd0782e51c6b3986e9e672fd566868e71f3dbc2d6c2cd6fbb3e361af2a954818401527f2e174c10e159ea99b867ce3205125c24a42d128804e4070ed6fcc8cc98166aa254818701527f1a1e6821cde7d0159c0d293177871e09677b4e42307c7db3ba94f8648a5a051154818301528551808501875233600090815260038086528882206001808452600882018089528b85205486526002808652818a528c862054878b0152848652818a528c862054878e01526004808752918a528c862054878a01528c51808c018e529286526009909301808a528c86205483529285528289528b852054828a01529284528188528a842054818c0152828452908752898320548187015289519788018a527fabd6e7cb50984ff9c2f3e18a2660c3353dadf4e3291deeb275dae2cd1e44fe055488527f91da3fd0782e51c6b3986e9e672fd566868e71f3dbc2d6c2cd6fbb3e361af2a754888801527f2e174c10e159ea99b867ce3205125c24a42d128804e4070ed6fcc8cc98166aa05499880199909952908190529093527f1a1e6821cde7d0159c0d293177871e09677b4e42307c7db3ba94f8648a5a050f549184019190915292979296509450919250565b60008060006120ca6141be565b6120d26141be565b6120da6141be565b6120e26141be565b6120ea6141be565b600054600254600160008054815260200190815260200160002060000160009054906101000a900460ff1660806040519081016040528060016000805481526020019081526020016000206001016000600160ff1660ff16815260200190815260200160002054815260200160016000805481526020019081526020016000206001016000600260ff1660ff16815260200190815260200160002054815260200160016000805481526020019081526020016000206001016000600360ff1660ff16815260200190815260200160002054815260200160016000805481526020019081526020016000206001016000600460ff1660ff1681526020019081526020016000205481525060806040519081016040528060016000805481526020019081526020016000206002016000600160ff1660ff16815260200190815260200160002054815260200160016000805481526020019081526020016000206002016000600260ff1660ff16815260200190815260200160002054815260200160016000805481526020019081526020016000206002016000600360ff1660ff16815260200190815260200160002054815260200160016000805481526020019081526020016000206002016000600460ff1660ff168152602001908152602001600020548152506080604051908101604052806003600033600160a060020a0316600160a060020a031681526020019081526020016000206005016000805481526020019081526020016000206000600160ff1660ff1681526020019081526020016000205481526020016003600033600160a060020a0316600160a060020a031681526020019081526020016000206005016000805481526020019081526020016000206000600260ff1660ff1681526020019081526020016000205481526020016003600033600160a060020a0316600160a060020a031681526020019081526020016000206005016000805481526020019081526020016000206000600360ff1660ff1681526020019081526020016000205481526020016003600033600160a060020a0316600160a060020a031681526020019081526020016000206005016000805481526020019081526020016000206000600460ff1660ff168152602001908152602001600020548152506080604051908101604052806003600033600160a060020a0316600160a060020a031681526020019081526020016000206006016000805481526020019081526020016000206000600160ff1660ff1681526020019081526020016000205481526020016003600033600160a060020a0316600160a060020a031681526020019081526020016000206006016000805481526020019081526020016000206000600260ff1660ff1681526020019081526020016000205481526020016003600033600160a060020a0316600160a060020a031681526020019081526020016000206006016000805481526020019081526020016000206000600360ff1660ff1681526020019081526020016000205481526020016003600033600160a060020a0316600160a060020a031681526020019081526020016000206006016000805481526020019081526020016000206000600460ff1660ff1681526020019081526020016000205481525060806040519081016040528060046000600160ff1660ff168152602001908152602001600020600001546000191660001916815260200160046000600260ff1660ff168152602001908152602001600020600001546000191660001916815260200160046000600360ff1660ff168152602001908152602001600020600001546000191660001916815260200160046000600460ff1660ff168152602001908152602001600020600001546000191660001916815250975097509750975097509750975097509091929394959697565b33803b80156126bc576040805160e560020a62461bcd02815260206004820152600e602482015260008051602061423e833981519152604482015290519081900360640190fd5b333214612701576040805160e560020a62461bcd02815260206004820152600e602482015260008051602061423e833981519152604482015290519081900360640190fd5b8460ff811660011480612717575060ff81166002145b80612725575060ff81166003145b80612733575060ff81166004145b1515612777576040805160e560020a62461bcd028152602060048201526016602482015260008051602061425e833981519152604482015290519081900360640190fd5b60ff8616600081815260046020908152604080832060039081015433855290835281842094845260099094019091528120546127ee9161125d9034906001906127be613a53565b81526020808201929092526040908101600090812060ff8f1682526001019092529020549063ffffffff613a7516565b101561287457604080517f496e73756666696369656e742066756e647300000000000000000000000000008152905133916000805160206141fe833981519152919081900360200190a2600034111561286f5760405133903480156108fc02916000818181858888f1935050505015801561286d573d6000803e3d6000fd5b505b612967565b600034111561288857612888863486612ff8565b6128918561296f565b60ff871660009081526004602081905260409091209182550154600160a060020a031633146128ee5760ff8616600090815260046020819052604090912001805473ffffffffffffffffffffffffffffffffffffffff1916331790555b3360008181526003602081815260408084206001015460ff8c168086526004845294829020805494015482519687529286015284810193909352606084019190915260808301524260a0830152517f9e17b52779622ff1f917bf346e699156a067e77d4fb32d5bc004c9afbf6708219181900360c00190a15b505050505050565b80516000908290828080600f841180159061298a5750600084115b1515612a06576040805160e560020a62461bcd02815260206004820152602860248201527f6e616d65206d757374206265206265747765656e203120616e6420313520636860448201527f6172616374657273000000000000000000000000000000000000000000000000606482015290519081900360840190fd5b846000815181101515612a1557fe5b90602001015160f860020a900460f860020a02600160f860020a031916603060f860020a021415612b5857846001815181101515612a4f57fe5b90602001015160f860020a900460f860020a02600160f860020a031916607860f860020a0214151515612acc576040805160e560020a62461bcd02815260206004820152601960248201527f6e616d652063616e6e6f74207374617274207769746820307800000000000000604482015290519081900360640190fd5b846001815181101515612adb57fe5b90602001015160f860020a900460f860020a02600160f860020a031916605860f860020a0214151515612b58576040805160e560020a62461bcd02815260206004820152601960248201527f6e616d652063616e6e6f74207374617274207769746820305800000000000000604482015290519081900360640190fd5b600091505b83821015612edb5784517f400000000000000000000000000000000000000000000000000000000000000090869084908110612b9557fe5b90602001015160f860020a900460f860020a02600160f860020a031916118015612c09575084517f5b0000000000000000000000000000000000000000000000000000000000000090869084908110612bea57fe5b90602001015160f860020a900460f860020a02600160f860020a031916105b15612c76578482815181101515612c1c57fe5b90602001015160f860020a900460f860020a0260f860020a900460200160f860020a028583815181101515612c4d57fe5b906020010190600160f860020a031916908160001a905350821515612c7157600192505b612ed0565b84517f600000000000000000000000000000000000000000000000000000000000000090869084908110612ca657fe5b90602001015160f860020a900460f860020a02600160f860020a031916118015612d1a575084517f7b0000000000000000000000000000000000000000000000000000000000000090869084908110612cfb57fe5b90602001015160f860020a900460f860020a02600160f860020a031916105b80612dc4575084517f2f0000000000000000000000000000000000000000000000000000000000000090869084908110612d5057fe5b90602001015160f860020a900460f860020a02600160f860020a031916118015612dc4575084517f3a0000000000000000000000000000000000000000000000000000000000000090869084908110612da557fe5b90602001015160f860020a900460f860020a02600160f860020a031916105b1515612e1a576040805160e560020a62461bcd02815260206004820181905260248201527f6e616d6520636f6e7461696e7320696e76616c69642063686172616374657273604482015290519081900360640190fd5b82158015612ec6575084517f300000000000000000000000000000000000000000000000000000000000000090869084908110612e5357fe5b90602001015160f860020a900460f860020a02600160f860020a0319161080612ec6575084517f390000000000000000000000000000000000000000000000000000000000000090869084908110612ea757fe5b90602001015160f860020a900460f860020a02600160f860020a031916115b15612ed057600192505b600190910190612b5d565b600183151514612f35576040805160e560020a62461bcd02815260206004820152601b60248201527f6e616d652063616e6e6f74206265206f6e6c79206e756d626572730000000000604482015290519081900360640190fd5b505050506020015192915050565b60025442101590565b600082821115612f5857fe5b50900390565b600080612f69612f43565b1515612f92575060008054815260016020908152604080832060ff871684526002019091529020545b61135683612fa6838263ffffffff61092a16565b9063ffffffff613aa216565b6000821515612fc357506000610937565b50818102818382811515612fd357fe5b041461093757fe5b600081158015906109375750612fef613a53565b82141592915050565b600080613003613ac8565b61300b613820565b61301483613b26565b915061301f826138f7565b600160a060020a03821673c17a40cb38598520bd7c0d5bff97d441a810a008146130605761306073c17a40cb38598520bd7c0d5bff97d441a810a0086138f7565b60008054815260016020818152604080842060ff8a1685529092019052902054613090908563ffffffff613a7516565b33600090815260036020908152604080832083548452600501825280832060ff8a1684529091529020549091506130ce90859063ffffffff61092a16565b3360009081526003602090815260408083208354845260058101835281842060ff8b1680865290845282852095909555835484526006018252808320938352929052205461312390829063ffffffff61092a16565b3360009081526003602090815260408083208354845260068101835281842060ff8b16855283528184209490945560089093019052205461316590859061092a565b33600090815260036020908152604080832060ff8a1684526008810183528184209490945560099093019052205461319e90829061092a565b33600090815260036020908152604080832060ff8a1684526009019091529020556005546131db906131d6908363ffffffff612fb216565b613c51565b3360009081526003602090815260408083206004018054909401909355600160a060020a038516825282822082548352600701815282822060ff891683529052205461322a9061125d86613c5e565b600160a060020a038316600090815260036020908152604080832083548452600701825280832060ff8a1680855290835281842094909455825483527f0519235f8bb76824fedb09ceb8463c91ba75d601351fa046c29214ea50b71893825280832093835292905220546132a99061125d86606463ffffffff613c7616565b6000805481527f0519235f8bb76824fedb09ceb8463c91ba75d601351fa046c29214ea50b718936020908152604080832060ff8a168085529083528184209490945560048252808320600390810154338552908352818420948452600990940190915290205411156133415733600090815260036020818152604080842060ff8a168552600901825280842054600490925290922001555b60008054815260016020818152604080842060ff8a168552909201905290205461337290859063ffffffff61092a16565b60008054815260016020818152604080842060ff8b1680865290840183528185209590955583548452918152818320938352600290930190925220546133bf90829063ffffffff61092a16565b60008054815260016020818152604080842060ff808c168087526002909201845282862096909655845485529290915290912054909116148015906134315750600080548152600160209081526040808320805460ff9081168552600290910190925280832054918816835290912054115b1561345357600080548152600160205260409020805460ff191660ff87161790555b60ff851660009081526004602052604090206002015461347a90829063ffffffff61092a16565b60ff861660009081526004602052604090206002810191909155600101546134a990859063ffffffff61092a16565b600460008760ff1660ff16815260200190815260200160002060010181905550600460008660ff1660ff168152602001908152602001600020600001546000191633600160a060020a03167f37e922ba04599bac08dd204063b35033a2404af8421bbbfc19e37ae1428d27816003600033600160a060020a0316600160a060020a031681526020019081526020016000206001015460005460408051908101604052808b60ff1660ff168152602001600160008054815260200190815260200160002060000160009054906101000a900460ff1660ff1660ff1681525060c0604051908101604052808b8152602001888152602001600160008054815260200190815260200160002060010160008e60ff1660ff168152602001908152602001600020548152602001600160008054815260200190815260200160002060020160008e60ff1660ff1681526020019081526020016000205481526020016003600033600160a060020a0316600160a060020a0316815260200190815260200160002060050160008054815260200190815260200160002060008e60ff1660ff1681526020019081526020016000205481526020016003600033600160a060020a0316600160a060020a0316815260200190815260200160002060060160008054815260200190815260200160002060008e60ff1660ff168152602001908152602001600020548152506002544260405180876000191660001916815260200186815260200185600260200280838360005b838110156136f25781810151838201526020016136da565b5050505090500184600660200280838360005b8381101561371d578181015183820152602001613705565b50505050905001838152602001828152602001965050505050505060405180910390a35050505050565b6000613773613754613c8b565b336000908152600360205260409020600201549063ffffffff61092a16565b905090565b600080600080613786613d92565b9250613790613dcf565b91506137ae6131d68461125d60055486612fb290919063ffffffff16565b336000908152600360205260409020600401549091506137ea9068010000000000000000906137de908403613e17565b9063ffffffff613c7616565b935050505090565b600061377361380033613e23565b33600090815260036020819052604090912001549063ffffffff61092a16565b600061382a613c8b565b9050600081111561386d573360009081526003602052604090206002015461385990829063ffffffff61092a16565b336000908152600360205260409020600201555b6000805433825260036020526040909120600c01541480156138925750613892612f43565b156138c3576000546138ab90600163ffffffff61092a16565b336000908152600360205260409020600c01556138f4565b6000805433825260036020526040909120600c015410156138f4576000805433825260036020526040909120600c01555b50565b600061390282613e23565b9050600081111561395957600160a060020a0382166000908152600360208190526040909120015461393b90829063ffffffff61092a16565b600160a060020a038316600090815260036020819052604090912001555b60008054600160a060020a038416825260036020526040909120600d01541480156139875750613987612f43565b156139c1576000546139a090600163ffffffff61092a16565b600160a060020a0383166000908152600360205260409020600d0155613a04565b60008054600160a060020a038416825260036020526040909120600d01541015613a045760008054600160a060020a038416825260036020526040909120600d01555b5050565b336000908152600360205260408120600b810154600a909101546137739190613a479081613a346137f2565b61125d613a3f613778565b61125d613747565b9063ffffffff612f4c16565b6000613a5d612f43565b15613a6e5750600054600101611652565b5060005490565b6000613a9b613a8384613eef565b613a47613a96868663ffffffff61092a16565b613eef565b9392505050565b6000613a9b613abf613aba858563ffffffff612f4c16565b613f64565b613a4785613f64565b6000613ad2612f43565b1515613add576138f4565b613af0613aeb600054613fd8565b61403e565b90506000811115613b1257600554613b0e908263ffffffff61092a16565b6005555b600080546001019055426138400160025550565b6000808215801590613b4e5750600083815260066020526040902054600160a060020a031615155b8015613b6c5750336000908152600360205260409020600101548314155b15613b8f5750600082815260066020526040902054600160a060020a0316613be9565b336000908152600360205260409020600e0154600160a060020a031615613bd25750336000908152600360205260409020600e0154600160a060020a0316613be9565b5073c17a40cb38598520bd7c0d5bff97d441a810a0085b336000908152600360205260409020600e0154600160a060020a03828116911614613c4757336000908152600360205260409020600e01805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a0383161790555b8091505b50919050565b60008181811215613c4757fe5b600061093760646137de84600963ffffffff612fb216565b60008183811515613c8357fe5b049392505050565b336000908152600360205260408120600c0154801580613cac575060005481115b80613cc8575060005481148015613cc85750613cc6612f43565b155b15613cd65760009150613d8e565b6000818152600160209081526040808320805460ff168452600201909152902054613d8b90613d4f906137de613d13613d0e86613fd8565b61407b565b3360009081526003602090815260408083208984526006018252808320600183528184205460ff1684529091529020549063ffffffff612fb216565b3360009081526003602090815260408083208684526005018252808320600183528184205460ff1684529091529020549063ffffffff61092a16565b91505b5090565b6000613d9c612f43565b1515613daa57506000611652565b613773613db5613dcf565b613dc3613aeb600054613fd8565b9063ffffffff612fb216565b33600090815260036020818152604080842060048552600901909152808320549183528083205460028452818420546001855291842054613773939261125d9291839161092a565b600080821215613d8e57fe5b600160a060020a0381166000908152600360205260408120600d015481811580613e4e575060005482115b80613e6a575060005482148015613e6a5750613e68612f43565b155b1515613ee8575060015b600460ff821611613ee85760008281526001602052604090205460ff828116911614613ee057600160a060020a0384166000908152600360209081526040808320858452600701825280832060ff85168452909152902054613edd90849063ffffffff61092a16565b92505b600101613e74565b5050919050565b600064075088ff08613f546d04edfaabeec07f6d844414700000613a47613f4f7a184d0f77425630299fa70407e0e1d45a96ce8e5d21b1000000000061125d88730b017a4cd83664b71dee232edc9bd1000000000063ffffffff612fb216565b6140be565b811515613f5d57fe5b0492915050565b60006ec097ce7bc90715b34b9f1000000000613f546002613fa9613f9686670de0b6b3a764000063ffffffff612fb216565b65b5ded06b80f89063ffffffff612fb216565b811515613fb257fe5b0461125d613fc6868063ffffffff612fb216565b6403a8447f849063ffffffff612fb216565b600060015b600460ff821611613c4b5760008381526001602052604090205460ff82811691161461403657600083815260016020818152604080842060ff86168552909201905290205461403390839063ffffffff61092a16565b91505b600101613fdd565b600080614049614111565b905080151561405b5760009150613c4b565b613a9b816137de600a81876801000000000000000063ffffffff612fb216565b600061093761409183600a63ffffffff613c7616565b613a476140a585606463ffffffff613c7616565b613a476140b187613c5e565b879063ffffffff612f4c16565b60008060026140ce84600161092a565b8115156140d757fe5b0490508291505b81811015613c4b57809150600261410082858115156140f957fe5b048361092a565b81151561410957fe5b0490506140de565b60046020527f1a1e6821cde7d0159c0d293177871e09677b4e42307c7db3ba94f8648a5a0511547f2e174c10e159ea99b867ce3205125c24a42d128804e4070ed6fcc8cc98166aa2547f91da3fd0782e51c6b3986e9e672fd566868e71f3dbc2d6c2cd6fbb3e361af2a954600160009081527fabd6e7cb50984ff9c2f3e18a2660c3353dadf4e3291deeb275dae2cd1e44fe0754909361377393909261125d92839163ffffffff61092a16565b6080604051908101604052806004906020820280388339509192915050565b61064060405190810160405280603290602082028038833950919291505056007c9cea421c85b153482cc16cc5d3f3c486d5efc921236b82e56302d82cfba5230519235f8bb76824fedb09ceb8463c91ba75d601351fa046c29214ea50b7188f48756d616e73206f6e6c79203b29000000000000000000000000000000000000756e6b6e6f776e20686f7273652073656c656374656400000000000000000000a165627a7a7230582059143cca1f4a30ae88a4d6456817108ad7cec9c70f0eb0d7ec65c55df0f029830029
Swarm Source
bzzr://59143cca1f4a30ae88a4d6456817108ad7cec9c70f0eb0d7ec65c55df0f02983
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 30 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|---|---|---|---|---|
ETH | Ether (ETH) | 100.00% | $3,153.64 | 0.7393 | $2,331.62 |
Loading...
Loading
[ Download: CSV Export ]
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.