ERC-20
Source Code
Overview
Max Total Supply
731 CC
Holders
0
Transfers
-
0 (0%)
Market
Onchain Market Cap
-
Circulating Supply Market Cap
-
Other Info
Token Contract (WITH 0 Decimals)
Loading...
Loading
Loading...
Loading
Loading...
Loading
| # | Exchange | Pair | Price | 24H Volume | % Volume |
|---|
Contract Name:
CoreLayer
Compiler Version
v0.4.18+commit.9cf6e910
Optimization Enabled:
Yes with 200 runs
Other Settings:
default evmVersion
Contract Source Code (Solidity)
/**
*Submitted for verification at Etherscan.io on 2018-05-22
*/
pragma solidity ^0.4.18;
contract DataSourceInterface {
function isDataSource() public pure returns (bool);
function getGroupResult(uint matchId) external;
function getRoundOfSixteenTeams(uint index) external;
function getRoundOfSixteenResult(uint matchId) external;
function getQuarterResult(uint matchId) external;
function getSemiResult(uint matchId) external;
function getFinalTeams() external;
function getYellowCards() external;
function getRedCards() external;
}
/**
* @title DataLayer.
* @author CryptoCup Team (https://cryptocup.io/about)
*/
contract DataLayer{
uint256 constant WCCTOKEN_CREATION_LIMIT = 5000000;
uint256 constant STARTING_PRICE = 45 finney;
/// Epoch times based on when the prices change.
uint256 constant FIRST_PHASE = 1527476400;
uint256 constant SECOND_PHASE = 1528081200;
uint256 constant THIRD_PHASE = 1528686000;
uint256 constant WORLD_CUP_START = 1528945200;
DataSourceInterface public dataSource;
address public dataSourceAddress;
address public adminAddress;
uint256 public deploymentTime = 0;
uint256 public gameFinishedTime = 0; //set this to now when oraclize was called.
uint32 public lastCalculatedToken = 0;
uint256 public pointsLimit = 0;
uint32 public lastCheckedToken = 0;
uint32 public winnerCounter = 0;
uint32 public lastAssigned = 0;
uint256 public auxWorstPoints = 500000000;
uint32 public payoutRange = 0;
uint32 public lastPrizeGiven = 0;
uint256 public prizePool = 0;
uint256 public adminPool = 0;
uint256 public finalizedTime = 0;
enum teamState { None, ROS, QUARTERS, SEMIS, FINAL }
enum pointsValidationState { Unstarted, LimitSet, LimitCalculated, OrderChecked, TopWinnersAssigned, WinnersAssigned, Finished }
/**
* groups1 scores of the first half of matches (8 bits each)
* groups2 scores of the second half of matches (8 bits each)
* brackets winner's team ids of each round (5 bits each)
* timeStamp creation timestamp
* extra number of yellow and red cards (16 bits each)
*/
struct Token {
uint192 groups1;
uint192 groups2;
uint160 brackets;
uint64 timeStamp;
uint32 extra;
}
struct GroupResult{
uint8 teamOneGoals;
uint8 teamTwoGoals;
}
struct BracketPhase{
uint8[16] roundOfSixteenTeamsIds;
mapping (uint8 => bool) teamExists;
mapping (uint8 => teamState) middlePhaseTeamsIds;
uint8[4] finalsTeamsIds;
}
struct Extras {
uint16 yellowCards;
uint16 redCards;
}
// List of all tokens
Token[] tokens;
GroupResult[48] groupsResults;
BracketPhase bracketsResults;
Extras extraResults;
// List of all tokens that won
uint256[] sortedWinners;
// List of the worst tokens (they also win)
uint256[] worstTokens;
pointsValidationState public pValidationState = pointsValidationState.Unstarted;
mapping (address => uint256[]) public tokensOfOwnerMap;
mapping (uint256 => address) public ownerOfTokenMap;
mapping (uint256 => address) public tokensApprovedMap;
mapping (uint256 => uint256) public tokenToPayoutMap;
mapping (uint256 => uint16) public tokenToPointsMap;
event LogTokenBuilt(address creatorAddress, uint256 tokenId, Token token);
event LogDataSourceCallbackList(uint8[] result);
event LogDataSourceCallbackInt(uint8 result);
event LogDataSourceCallbackTwoInt(uint8 result, uint8 result2);
}
///Author Dieter Shirley (https://github.com/dete)
contract ERC721 {
event LogTransfer(address from, address to, uint256 tokenId);
event LogApproval(address owner, address approved, uint256 tokenId);
function name() public view returns (string);
function symbol() public view returns (string);
function totalSupply() public view returns (uint256 total);
function balanceOf(address _owner) public view returns (uint256 balance);
function ownerOf(uint256 _tokenId) external view returns (address owner);
function approve(address _to, uint256 _tokenId) external;
function transfer(address _to, uint256 _tokenId) external;
function transferFrom(address _from, address _to, uint256 _tokenId) external;
function tokensOfOwner(address _owner) external view returns (uint256[] tokenIds);
}
/**
* @title AccessControlLayer
* @author CryptoCup Team (https://cryptocup.io/about)
* @dev Containes basic admin modifiers to restrict access to some functions. Allows
* for pauseing, and setting emergency stops.
*/
contract AccessControlLayer is DataLayer{
bool public paused = false;
bool public finalized = false;
bool public saleOpen = true;
/**
* @dev Main modifier to limit access to delicate functions.
*/
modifier onlyAdmin() {
require(msg.sender == adminAddress);
_;
}
/**
* @dev Modifier that checks that the contract is not paused
*/
modifier isNotPaused() {
require(!paused);
_;
}
/**
* @dev Modifier that checks that the contract is paused
*/
modifier isPaused() {
require(paused);
_;
}
/**
* @dev Modifier that checks that the contract has finished successfully
*/
modifier hasFinished() {
require((gameFinishedTime != 0) && now >= (gameFinishedTime + (15 days)));
_;
}
/**
* @dev Modifier that checks that the contract has finalized
*/
modifier hasFinalized() {
require(finalized);
_;
}
/**
* @dev Checks if pValidationState is in the provided stats
* @param state State required to run
*/
modifier checkState(pointsValidationState state){
require(pValidationState == state);
_;
}
/**
* @dev Transfer contract's ownership
* @param _newAdmin Address to be set
*/
function setAdmin(address _newAdmin) external onlyAdmin {
require(_newAdmin != address(0));
adminAddress = _newAdmin;
}
/**
* @dev Sets the contract pause state
* @param state True to pause
*/
function setPauseState(bool state) external onlyAdmin {
paused = state;
}
/**
* @dev Sets the contract to finalized
* @param state True to finalize
*/
function setFinalized(bool state) external onlyAdmin {
paused = state;
finalized = state;
if(finalized == true)
finalizedTime = now;
}
}
/**
* @title CryptoCupToken, main implemantations of the ERC721 standard
* @author CryptoCup Team (https://cryptocup.io/about)
*/
contract CryptocupToken is AccessControlLayer, ERC721 {
//FUNCTIONALTIY
/**
* @notice checks if a user owns a token
* @param userAddress - The address to check.
* @param tokenId - ID of the token that needs to be verified.
* @return true if the userAddress provided owns the token.
*/
function _userOwnsToken(address userAddress, uint256 tokenId) internal view returns (bool){
return ownerOfTokenMap[tokenId] == userAddress;
}
/**
* @notice checks if the address provided is approved for a given token
* @param userAddress
* @param tokenId
* @return true if it is aproved
*/
function _tokenIsApproved(address userAddress, uint256 tokenId) internal view returns (bool) {
return tokensApprovedMap[tokenId] == userAddress;
}
/**
* @notice transfers the token specified from sneder address to receiver address.
* @param fromAddress the sender address that initially holds the token.
* @param toAddress the receipient of the token.
* @param tokenId ID of the token that will be sent.
*/
function _transfer(address fromAddress, address toAddress, uint256 tokenId) internal {
require(tokensOfOwnerMap[toAddress].length < 100);
require(pValidationState == pointsValidationState.Unstarted);
tokensOfOwnerMap[toAddress].push(tokenId);
ownerOfTokenMap[tokenId] = toAddress;
uint256[] storage tokenArray = tokensOfOwnerMap[fromAddress];
for (uint256 i = 0; i < tokenArray.length; i++){
if(tokenArray[i] == tokenId){
tokenArray[i] = tokenArray[tokenArray.length-1];
}
}
delete tokenArray[tokenArray.length-1];
tokenArray.length--;
delete tokensApprovedMap[tokenId];
}
/**
* @notice Approve the address for a given token
* @param tokenId - ID of token to be approved
* @param userAddress - Address that will be approved
*/
function _approve(uint256 tokenId, address userAddress) internal {
tokensApprovedMap[tokenId] = userAddress;
}
/**
* @notice set token owner to an address
* @dev sets token owner on the contract data structures
* @param ownerAddress address to be set
* @param tokenId Id of token to be used
*/
function _setTokenOwner(address ownerAddress, uint256 tokenId) internal{
tokensOfOwnerMap[ownerAddress].push(tokenId);
ownerOfTokenMap[tokenId] = ownerAddress;
}
//ERC721 INTERFACE
function name() public view returns (string){
return "Cryptocup";
}
function symbol() public view returns (string){
return "CC";
}
function balanceOf(address userAddress) public view returns (uint256 count) {
return tokensOfOwnerMap[userAddress].length;
}
function transfer(address toAddress,uint256 tokenId) external isNotPaused {
require(toAddress != address(0));
require(toAddress != address(this));
require(_userOwnsToken(msg.sender, tokenId));
_transfer(msg.sender, toAddress, tokenId);
LogTransfer(msg.sender, toAddress, tokenId);
}
function transferFrom(address fromAddress, address toAddress, uint256 tokenId) external isNotPaused {
require(toAddress != address(0));
require(toAddress != address(this));
require(_tokenIsApproved(msg.sender, tokenId));
require(_userOwnsToken(fromAddress, tokenId));
_transfer(fromAddress, toAddress, tokenId);
LogTransfer(fromAddress, toAddress, tokenId);
}
function approve( address toAddress, uint256 tokenId) external isNotPaused {
require(toAddress != address(0));
require(_userOwnsToken(msg.sender, tokenId));
_approve(tokenId, toAddress);
LogApproval(msg.sender, toAddress, tokenId);
}
function totalSupply() public view returns (uint) {
return tokens.length;
}
function ownerOf(uint256 tokenId) external view returns (address ownerAddress) {
ownerAddress = ownerOfTokenMap[tokenId];
require(ownerAddress != address(0));
}
function tokensOfOwner(address ownerAddress) external view returns(uint256[] tokenIds) {
tokenIds = tokensOfOwnerMap[ownerAddress];
}
}
/**
* @title SafeMath
* @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) {
if (a == 0) {
return 0;
}
uint256 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 c;
}
/**
* @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) {
uint256 c = a + b;
assert(c >= a);
return c;
}
}
/**
* @title GameLogicLayer, contract in charge of everything related to calculating points, asigning
* winners, and distributing prizes.
* @author CryptoCup Team (https://cryptocup.io/about)
*/
contract GameLogicLayer is CryptocupToken{
using SafeMath for *;
uint8 TEAM_RESULT_MASK_GROUPS = 15;
uint160 RESULT_MASK_BRACKETS = 31;
uint16 EXTRA_MASK_BRACKETS = 65535;
uint16 private lastPosition;
uint16 private superiorQuota;
uint16[] private payDistributionAmount = [1,1,1,1,1,1,1,1,1,1,5,5,10,20,50,100,100,200,500,1500,2500];
uint32[] private payoutDistribution;
event LogGroupDataArrived(uint matchId, uint8 result, uint8 result2);
event LogRoundOfSixteenArrived(uint id, uint8 result);
event LogMiddlePhaseArrived(uint matchId, uint8 result);
event LogFinalsArrived(uint id, uint8[4] result);
event LogExtrasArrived(uint id, uint16 result);
//ORACLIZE
function dataSourceGetGroupResult(uint matchId) external onlyAdmin{
dataSource.getGroupResult(matchId);
}
function dataSourceGetRoundOfSixteen(uint index) external onlyAdmin{
dataSource.getRoundOfSixteenTeams(index);
}
function dataSourceGetRoundOfSixteenResult(uint matchId) external onlyAdmin{
dataSource.getRoundOfSixteenResult(matchId);
}
function dataSourceGetQuarterResult(uint matchId) external onlyAdmin{
dataSource.getQuarterResult(matchId);
}
function dataSourceGetSemiResult(uint matchId) external onlyAdmin{
dataSource.getSemiResult(matchId);
}
function dataSourceGetFinals() external onlyAdmin{
dataSource.getFinalTeams();
}
function dataSourceGetYellowCards() external onlyAdmin{
dataSource.getYellowCards();
}
function dataSourceGetRedCards() external onlyAdmin{
dataSource.getRedCards();
}
/**
* @notice sets a match result to the contract storage
* @param matchId id of match to check
* @param result number of goals the first team scored
* @param result2 number of goals the second team scored
*/
function dataSourceCallbackGroup(uint matchId, uint8 result, uint8 result2) public {
require (msg.sender == dataSourceAddress);
require (matchId >= 0 && matchId <= 47);
groupsResults[matchId].teamOneGoals = result;
groupsResults[matchId].teamTwoGoals = result2;
LogGroupDataArrived(matchId, result, result2);
}
/**
* @notice sets the sixteen teams that made it through groups to the contract storage
* @param id index of sixteen teams
* @param result results to be set
*/
function dataSourceCallbackRoundOfSixteen(uint id, uint8 result) public {
require (msg.sender == dataSourceAddress);
bracketsResults.roundOfSixteenTeamsIds[id] = result;
bracketsResults.teamExists[result] = true;
LogRoundOfSixteenArrived(id, result);
}
function dataSourceCallbackTeamId(uint matchId, uint8 result) public {
require (msg.sender == dataSourceAddress);
teamState state = bracketsResults.middlePhaseTeamsIds[result];
if (matchId >= 48 && matchId <= 55){
if (state < teamState.ROS)
bracketsResults.middlePhaseTeamsIds[result] = teamState.ROS;
} else if (matchId >= 56 && matchId <= 59){
if (state < teamState.QUARTERS)
bracketsResults.middlePhaseTeamsIds[result] = teamState.QUARTERS;
} else if (matchId == 60 || matchId == 61){
if (state < teamState.SEMIS)
bracketsResults.middlePhaseTeamsIds[result] = teamState.SEMIS;
}
LogMiddlePhaseArrived(matchId, result);
}
/**
* @notice sets the champion, second, third and fourth teams to the contract storage
* @param id
* @param result ids of the four teams
*/
function dataSourceCallbackFinals(uint id, uint8[4] result) public {
require (msg.sender == dataSourceAddress);
uint256 i;
for(i = 0; i < 4; i++){
bracketsResults.finalsTeamsIds[i] = result[i];
}
LogFinalsArrived(id, result);
}
/**
* @notice sets the number of cards to the contract storage
* @param id 101 for yellow cards, 102 for red cards
* @param result amount of cards
*/
function dataSourceCallbackExtras(uint id, uint16 result) public {
require (msg.sender == dataSourceAddress);
if (id == 101){
extraResults.yellowCards = result;
} else if (id == 102){
extraResults.redCards = result;
}
LogExtrasArrived(id, result);
}
/**
* @notice check if prediction for a match winner is correct
* @param realResultOne amount of goals team one scored
* @param realResultTwo amount of goals team two scored
* @param tokenResultOne amount of goals team one was predicted to score
* @param tokenResultTwo amount of goals team two was predicted to score
* @return
*/
function matchWinnerOk(uint8 realResultOne, uint8 realResultTwo, uint8 tokenResultOne, uint8 tokenResultTwo) internal pure returns(bool){
int8 realR = int8(realResultOne - realResultTwo);
int8 tokenR = int8(tokenResultOne - tokenResultTwo);
return (realR > 0 && tokenR > 0) || (realR < 0 && tokenR < 0) || (realR == 0 && tokenR == 0);
}
/**
* @notice get points from a single match
* @param matchIndex
* @param groupsPhase token predictions
* @return 10 if predicted score correctly, 3 if predicted only who would win
* and 0 if otherwise
*/
function getMatchPointsGroups (uint256 matchIndex, uint192 groupsPhase) internal view returns(uint16 matchPoints) {
uint8 tokenResultOne = uint8(groupsPhase & TEAM_RESULT_MASK_GROUPS);
uint8 tokenResultTwo = uint8((groupsPhase >> 4) & TEAM_RESULT_MASK_GROUPS);
uint8 teamOneGoals = groupsResults[matchIndex].teamOneGoals;
uint8 teamTwoGoals = groupsResults[matchIndex].teamTwoGoals;
if (teamOneGoals == tokenResultOne && teamTwoGoals == tokenResultTwo){
matchPoints += 10;
} else {
if (matchWinnerOk(teamOneGoals, teamTwoGoals, tokenResultOne, tokenResultTwo)){
matchPoints += 3;
}
}
}
/**
* @notice calculates points from the last two matches
* @param brackets token predictions
* @return amount of points gained from the last two matches
*/
function getFinalRoundPoints (uint160 brackets) internal view returns(uint16 finalRoundPoints) {
uint8[3] memory teamsIds;
for (uint i = 0; i <= 2; i++){
brackets = brackets >> 5; //discard 4th place
teamsIds[2-i] = uint8(brackets & RESULT_MASK_BRACKETS);
}
if (teamsIds[0] == bracketsResults.finalsTeamsIds[0]){
finalRoundPoints += 100;
}
if (teamsIds[2] == bracketsResults.finalsTeamsIds[2]){
finalRoundPoints += 25;
}
if (teamsIds[0] == bracketsResults.finalsTeamsIds[1]){
finalRoundPoints += 50;
}
if (teamsIds[1] == bracketsResults.finalsTeamsIds[0] || teamsIds[1] == bracketsResults.finalsTeamsIds[1]){
finalRoundPoints += 50;
}
}
/**
* @notice calculates points for round of sixteen, quarter-finals and semifinals
* @param size amount of matches in round
* @param round ros, qf, sf or f
* @param brackets predictions
* @return amount of points
*/
function getMiddleRoundPoints(uint8 size, teamState round, uint160 brackets) internal view returns(uint16 middleRoundResults){
uint8 teamId;
for (uint i = 0; i < size; i++){
teamId = uint8(brackets & RESULT_MASK_BRACKETS);
if (uint(bracketsResults.middlePhaseTeamsIds[teamId]) >= uint(round) ) {
middleRoundResults+=60;
}
brackets = brackets >> 5;
}
}
/**
* @notice calculates points for correct predictions of group winners
* @param brackets token predictions
* @return amount of points
*/
function getQualifiersPoints(uint160 brackets) internal view returns(uint16 qualifiersPoints){
uint8 teamId;
for (uint256 i = 0; i <= 15; i++){
teamId = uint8(brackets & RESULT_MASK_BRACKETS);
if (teamId == bracketsResults.roundOfSixteenTeamsIds[15-i]){
qualifiersPoints+=30;
} else if (bracketsResults.teamExists[teamId]){
qualifiersPoints+=25;
}
brackets = brackets >> 5;
}
}
/**
* @notice calculates points won by yellow and red cards predictions
* @param extras token predictions
* @return amount of points
*/
function getExtraPoints(uint32 extras) internal view returns(uint16 extraPoints){
uint16 redCards = uint16(extras & EXTRA_MASK_BRACKETS);
extras = extras >> 16;
uint16 yellowCards = uint16(extras);
if (redCards == extraResults.redCards){
extraPoints+=20;
}
if (yellowCards == extraResults.yellowCards){
extraPoints+=20;
}
}
/**
* @notice calculates total amount of points for a token
* @param t token to calculate points for
* @return total amount of points
*/
function calculateTokenPoints (Token memory t) internal view returns(uint16 points){
//Groups phase 1
uint192 g1 = t.groups1;
for (uint256 i = 0; i <= 23; i++){
points+=getMatchPointsGroups(23-i, g1);
g1 = g1 >> 8;
}
//Groups phase 2
uint192 g2 = t.groups2;
for (i = 0; i <= 23; i++){
points+=getMatchPointsGroups(47-i, g2);
g2 = g2 >> 8;
}
uint160 bracketsLocal = t.brackets;
//Brackets phase 1
points+=getFinalRoundPoints(bracketsLocal);
bracketsLocal = bracketsLocal >> 20;
//Brackets phase 2
points+=getMiddleRoundPoints(4, teamState.QUARTERS, bracketsLocal);
bracketsLocal = bracketsLocal >> 20;
//Brackets phase 3
points+=getMiddleRoundPoints(8, teamState.ROS, bracketsLocal);
bracketsLocal = bracketsLocal >> 40;
//Brackets phase 4
points+=getQualifiersPoints(bracketsLocal);
//Extras
points+=getExtraPoints(t.extra);
}
/**
* @notice Sets the points of all the tokens between the last chunk set and the amount given.
* @dev This function uses all the data collected earlier by oraclize to calculate points.
* @param amount The amount of tokens that should be analyzed.
*/
function calculatePointsBlock(uint32 amount) external{
require (gameFinishedTime == 0);
require(amount + lastCheckedToken <= tokens.length);
for (uint256 i = lastCalculatedToken; i < (lastCalculatedToken + amount); i++) {
uint16 points = calculateTokenPoints(tokens[i]);
tokenToPointsMap[i] = points;
if(worstTokens.length == 0 || points <= auxWorstPoints){
if(worstTokens.length != 0 && points < auxWorstPoints){
worstTokens.length = 0;
}
if(worstTokens.length < 100){
auxWorstPoints = points;
worstTokens.push(i);
}
}
}
lastCalculatedToken += amount;
}
/**
* @notice Sets the structures for payout distribution, last position and superior quota. Payout distribution is the
* percentage of the pot each position gets, last position is the percentage of the pot the last position gets,
* and superior quota is the total amount OF winners that are given a prize.
* @dev Each of this structures is dynamic and is assigned depending on the total amount of tokens in the game
*/
function setPayoutDistributionId () internal {
if(tokens.length < 101){
payoutDistribution = [289700, 189700, 120000, 92500, 75000, 62500, 52500, 42500, 40000, 35600, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0];
lastPosition = 0;
superiorQuota = 10;
}else if(tokens.length < 201){
payoutDistribution = [265500, 165500, 105500, 75500, 63000, 48000, 35500, 20500, 20000, 19500, 18500, 17800, 0, 0, 0, 0, 0, 0, 0, 0, 0];
lastPosition = 0;
superiorQuota = 20;
}else if(tokens.length < 301){
payoutDistribution = [260700, 155700, 100700, 70900, 60700, 45700, 35500, 20500, 17900, 12500, 11500, 11000, 10670, 0, 0, 0, 0, 0, 0, 0, 0];
lastPosition = 0;
superiorQuota = 30;
}else if(tokens.length < 501){
payoutDistribution = [238600, 138600, 88800, 63800, 53800, 43800, 33800, 18800, 17500, 12500, 9500, 7500, 7100, 6700, 0, 0, 0, 0, 0, 0, 0];
lastPosition = 0;
superiorQuota = 50;
}else if(tokens.length < 1001){
payoutDistribution = [218300, 122300, 72300, 52400, 43900, 33900, 23900, 16000, 13000, 10000, 9000, 7000, 5000, 4000, 3600, 0, 0, 0, 0, 0, 0];
lastPosition = 4000;
superiorQuota = 100;
}else if(tokens.length < 2001){
payoutDistribution = [204500, 114000, 64000, 44100, 35700, 26700, 22000, 15000, 11000, 9500, 8500, 6500, 4600, 2500, 2000, 1800, 0, 0, 0, 0, 0];
lastPosition = 2500;
superiorQuota = 200;
}else if(tokens.length < 3001){
payoutDistribution = [189200, 104800, 53900, 34900, 29300, 19300, 15300, 14000, 10500, 8300, 8000, 6000, 3800, 2500, 2000, 1500, 1100, 0, 0, 0, 0];
lastPosition = 2500;
superiorQuota = 300;
}else if(tokens.length < 5001){
payoutDistribution = [178000, 100500, 47400, 30400, 24700, 15500, 15000, 12000, 10200, 7800, 7400, 5500, 3300, 2000, 1500, 1200, 900, 670, 0, 0, 0];
lastPosition = 2000;
superiorQuota = 500;
}else if(tokens.length < 10001){
payoutDistribution = [157600, 86500, 39000, 23100, 18900, 15000, 14000, 11000, 9300, 6100, 6000, 5000, 3800, 1500, 1100, 900, 700, 500, 360, 0, 0];
lastPosition = 1500;
superiorQuota = 1000;
}else if(tokens.length < 25001){
payoutDistribution = [132500, 70200, 31300, 18500, 17500, 14000, 13500, 10500, 7500, 5500, 5000, 4000, 3000, 1000, 900, 700, 600, 400, 200, 152, 0];
lastPosition = 1000;
superiorQuota = 2500;
} else {
payoutDistribution = [120000, 63000, 27000, 18800, 17300, 13700, 13000, 10000, 6300, 5000, 4500, 3900, 2500, 900, 800, 600, 500, 350, 150, 100, 70];
lastPosition = 900;
superiorQuota = 5000;
}
}
/**
* @notice Sets the id of the last token that will be given a prize.
* @dev This is done to offload some of the calculations needed for sorting, and to cap the number of sorts
* needed to just the winners and not the whole array of tokens.
* @param tokenId last token id
*/
function setLimit(uint256 tokenId) external onlyAdmin{
require(tokenId < tokens.length);
require(pValidationState == pointsValidationState.Unstarted || pValidationState == pointsValidationState.LimitSet);
pointsLimit = tokenId;
pValidationState = pointsValidationState.LimitSet;
lastCheckedToken = 0;
lastCalculatedToken = 0;
winnerCounter = 0;
setPayoutDistributionId();
}
/**
* @notice Sets the 10th percentile of the sorted array of points
* @param amount tokens in a chunk
*/
function calculateWinners(uint32 amount) external onlyAdmin checkState(pointsValidationState.LimitSet){
require(amount + lastCheckedToken <= tokens.length);
uint256 points = tokenToPointsMap[pointsLimit];
for(uint256 i = lastCheckedToken; i < lastCheckedToken + amount; i++){
if(tokenToPointsMap[i] > points ||
(tokenToPointsMap[i] == points && i <= pointsLimit)){
winnerCounter++;
}
}
lastCheckedToken += amount;
if(lastCheckedToken == tokens.length){
require(superiorQuota == winnerCounter);
pValidationState = pointsValidationState.LimitCalculated;
}
}
/**
* @notice Checks if the order given offchain coincides with the order of the actual previously calculated points
* in the smart contract.
* @dev the token sorting is done offchain so as to save on the huge amount of gas and complications that
* could occur from doing all the sorting onchain.
* @param sortedChunk chunk sorted by points
*/
function checkOrder(uint32[] sortedChunk) external onlyAdmin checkState(pointsValidationState.LimitCalculated){
require(sortedChunk.length + sortedWinners.length <= winnerCounter);
for(uint256 i=0;i < sortedChunk.length-1;i++){
uint256 id = sortedChunk[i];
uint256 sigId = sortedChunk[i+1];
require(tokenToPointsMap[id] > tokenToPointsMap[sigId] ||
(tokenToPointsMap[id] == tokenToPointsMap[sigId] && id < sigId));
}
if(sortedWinners.length != 0){
uint256 id2 = sortedWinners[sortedWinners.length-1];
uint256 sigId2 = sortedChunk[0];
require(tokenToPointsMap[id2] > tokenToPointsMap[sigId2] ||
(tokenToPointsMap[id2] == tokenToPointsMap[sigId2] && id2 < sigId2));
}
for(uint256 j=0;j < sortedChunk.length;j++){
sortedWinners.push(sortedChunk[j]);
}
if(sortedWinners.length == winnerCounter){
require(sortedWinners[sortedWinners.length-1] == pointsLimit);
pValidationState = pointsValidationState.OrderChecked;
}
}
/**
* @notice If anything during the point calculation and sorting part should fail, this function can reset
* data structures to their initial position, so as to
*/
function resetWinners(uint256 newLength) external onlyAdmin checkState(pointsValidationState.LimitCalculated){
sortedWinners.length = newLength;
}
/**
* @notice Assigns prize percentage for the lucky top 30 winners. Each token will be assigned a uint256 inside
* tokenToPayoutMap structure that represents the size of the pot that belongs to that token. If any tokens
* tie inside of the first 30 tokens, the prize will be summed and divided equally.
*/
function setTopWinnerPrizes() external onlyAdmin checkState(pointsValidationState.OrderChecked){
uint256 percent = 0;
uint[] memory tokensEquals = new uint[](30);
uint16 tokenEqualsCounter = 0;
uint256 currentTokenId;
uint256 currentTokenPoints;
uint256 lastTokenPoints;
uint32 counter = 0;
uint256 maxRange = 13;
if(tokens.length < 201){
maxRange = 10;
}
while(payoutRange < maxRange){
uint256 inRangecounter = payDistributionAmount[payoutRange];
while(inRangecounter > 0){
currentTokenId = sortedWinners[counter];
currentTokenPoints = tokenToPointsMap[currentTokenId];
inRangecounter--;
//Special case for the last one
if(inRangecounter == 0 && payoutRange == maxRange - 1){
if(currentTokenPoints == lastTokenPoints){
percent += payoutDistribution[payoutRange];
tokensEquals[tokenEqualsCounter] = currentTokenId;
tokenEqualsCounter++;
}else{
tokenToPayoutMap[currentTokenId] = payoutDistribution[payoutRange];
}
}
if(counter != 0 && (currentTokenPoints != lastTokenPoints || (inRangecounter == 0 && payoutRange == maxRange - 1))){ //Fix second condition
for(uint256 i=0;i < tokenEqualsCounter;i++){
tokenToPayoutMap[tokensEquals[i]] = percent.div(tokenEqualsCounter);
}
percent = 0;
tokensEquals = new uint[](30);
tokenEqualsCounter = 0;
}
percent += payoutDistribution[payoutRange];
tokensEquals[tokenEqualsCounter] = currentTokenId;
tokenEqualsCounter++;
counter++;
lastTokenPoints = currentTokenPoints;
}
payoutRange++;
}
pValidationState = pointsValidationState.TopWinnersAssigned;
lastPrizeGiven = counter;
}
/**
* @notice Sets prize percentage to every address that wins from the position 30th onwards
* @dev If there are less than 300 tokens playing, then this function will set nothing.
* @param amount tokens in a chunk
*/
function setWinnerPrizes(uint32 amount) external onlyAdmin checkState(pointsValidationState.TopWinnersAssigned){
require(lastPrizeGiven + amount <= winnerCounter);
uint16 inRangeCounter = payDistributionAmount[payoutRange];
for(uint256 i = 0; i < amount; i++){
if (inRangeCounter == 0){
payoutRange++;
inRangeCounter = payDistributionAmount[payoutRange];
}
uint256 tokenId = sortedWinners[i + lastPrizeGiven];
tokenToPayoutMap[tokenId] = payoutDistribution[payoutRange];
inRangeCounter--;
}
//i + amount prize was not given yet, so amount -1
lastPrizeGiven += amount;
payDistributionAmount[payoutRange] = inRangeCounter;
if(lastPrizeGiven == winnerCounter){
pValidationState = pointsValidationState.WinnersAssigned;
return;
}
}
/**
* @notice Sets prizes for last tokens and sets prize pool amount
*/
function setLastPositions() external onlyAdmin checkState(pointsValidationState.WinnersAssigned){
for(uint256 j = 0;j < worstTokens.length;j++){
uint256 tokenId = worstTokens[j];
tokenToPayoutMap[tokenId] += lastPosition.div(worstTokens.length);
}
uint256 balance = address(this).balance;
adminPool = balance.mul(25).div(100);
prizePool = balance.mul(75).div(100);
pValidationState = pointsValidationState.Finished;
gameFinishedTime = now;
}
}
/**
* @title CoreLayer
* @author CryptoCup Team (https://cryptocup.io/about)
* @notice Main contract
*/
contract CoreLayer is GameLogicLayer {
function CoreLayer() public {
adminAddress = msg.sender;
deploymentTime = now;
}
/**
* @dev Only accept eth from the admin
*/
function() external payable {
require(msg.sender == adminAddress);
}
function isDataSourceCallback() public pure returns (bool){
return true;
}
/**
* @notice Builds ERC721 token with the predictions provided by the user.
* @param groups1 - First half of the group matches scores encoded in a uint192.
* @param groups2 - Second half of the groups matches scores encoded in a uint192.
* @param brackets - Bracket information encoded in a uint160.
* @param extra - Extra information (number of red cards and yellow cards) encoded in a uint32.
* @dev An automatic timestamp is added for internal use.
*/
function buildToken(uint192 groups1, uint192 groups2, uint160 brackets, uint32 extra) external payable isNotPaused {
Token memory token = Token({
groups1: groups1,
groups2: groups2,
brackets: brackets,
timeStamp: uint64(now),
extra: extra
});
require(msg.value >= _getTokenPrice());
require(msg.sender != address(0));
require(tokens.length < WCCTOKEN_CREATION_LIMIT);
require(tokensOfOwnerMap[msg.sender].length < 100);
require(now < WORLD_CUP_START); //World cup Start
uint256 tokenId = tokens.push(token) - 1;
require(tokenId == uint256(uint32(tokenId)));
_setTokenOwner(msg.sender, tokenId);
LogTokenBuilt(msg.sender, tokenId, token);
}
/**
* @param tokenId - ID of token to get.
* @return Returns all the valuable information about a specific token.
*/
function getToken(uint256 tokenId) external view returns (uint192 groups1, uint192 groups2, uint160 brackets, uint64 timeStamp, uint32 extra) {
Token storage token = tokens[tokenId];
groups1 = token.groups1;
groups2 = token.groups2;
brackets = token.brackets;
timeStamp = token.timeStamp;
extra = token.extra;
}
/**
* @notice Called by the development team once the World Cup has ended (adminPool is set)
* @dev Allows dev team to retrieve adminPool
*/
function adminWithdrawBalance() external onlyAdmin {
adminAddress.transfer(adminPool);
adminPool = 0;
}
/**
* @notice Allows any user to retrieve their asigned prize. This would be the sum of the price of all the tokens
* owned by the caller of this function.
* @dev If the caller has no prize, the function will revert costing no gas to the caller.
*/
function withdrawPrize() external checkState(pointsValidationState.Finished){
uint256 prize = 0;
uint256[] memory tokenList = tokensOfOwnerMap[msg.sender];
for(uint256 i = 0;i < tokenList.length; i++){
prize += tokenToPayoutMap[tokenList[i]];
tokenToPayoutMap[tokenList[i]] = 0;
}
require(prize > 0);
msg.sender.transfer((prizePool.mul(prize)).div(1000000));
}
/**
* @notice Gets current token price
*/
function _getTokenPrice() internal view returns(uint256 tokenPrice){
if ( now >= THIRD_PHASE){
tokenPrice = (150 finney);
} else if (now >= SECOND_PHASE) {
tokenPrice = (110 finney);
} else if (now >= FIRST_PHASE) {
tokenPrice = (75 finney);
} else {
tokenPrice = STARTING_PRICE;
}
require(tokenPrice >= STARTING_PRICE && tokenPrice <= (200 finney));
}
/**
* @dev Sets the data source contract address
* @param _address Address to be set
*/
function setDataSourceAddress(address _address) external onlyAdmin {
DataSourceInterface c = DataSourceInterface(_address);
require(c.isDataSource());
dataSource = c;
dataSourceAddress = _address;
}
/**
* @notice Testing function to corroborate group data from oraclize call
* @param x Id of the match to get
* @return uint8 Team 1 goals
* @return uint8 Team 2 goals
*/
function getGroupData(uint x) external view returns(uint8 a, uint8 b){
a = groupsResults[x].teamOneGoals;
b = groupsResults[x].teamTwoGoals;
}
/**
* @notice Testing function to corroborate round of sixteen data from oraclize call
* @return An array with the ids of the round of sixteen teams
*/
function getBracketData() external view returns(uint8[16] a){
a = bracketsResults.roundOfSixteenTeamsIds;
}
/**
* @notice Testing function to corroborate brackets data from oraclize call
* @param x Team id
* @return The place the team reached
*/
function getBracketDataMiddleTeamIds(uint8 x) external view returns(teamState a){
a = bracketsResults.middlePhaseTeamsIds[x];
}
/**
* @notice Testing function to corroborate finals data from oraclize call
* @return the 4 (four) final teams ids
*/
function getBracketDataFinals() external view returns(uint8[4] a){
a = bracketsResults.finalsTeamsIds;
}
/**
* @notice Testing function to corroborate extra data from oraclize call
* @return amount of yellow and red cards
*/
function getExtrasData() external view returns(uint16 a, uint16 b){
a = extraResults.yellowCards;
b = extraResults.redCards;
}
//EMERGENCY CALLS
//If something goes wrong or fails, these functions will allow retribution for token holders
/**
* @notice if there is an unresolvable problem, users can call to this function to get a refund.
*/
function emergencyWithdraw() external hasFinalized{
uint256 balance = STARTING_PRICE * tokensOfOwnerMap[msg.sender].length;
delete tokensOfOwnerMap[msg.sender];
msg.sender.transfer(balance);
}
/**
* @notice Let the admin cash-out the entire contract balance 10 days after game has finished.
*/
function finishedGameWithdraw() external onlyAdmin hasFinished{
uint256 balance = address(this).balance;
adminAddress.transfer(balance);
}
/**
* @notice Let the admin cash-out the entire contract balance 10 days after game has finished.
*/
function emergencyWithdrawAdmin() external hasFinalized onlyAdmin{
require(finalizedTime != 0 && now >= finalizedTime + 10 days );
msg.sender.transfer(address(this).balance);
}
}Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
Contract ABI
API[{"constant":false,"inputs":[],"name":"dataSourceGetFinals","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"name","outputs":[{"name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"toAddress","type":"address"},{"name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"totalSupply","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"dataSource","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"state","type":"bool"}],"name":"setFinalized","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"fromAddress","type":"address"},{"name":"toAddress","type":"address"},{"name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"matchId","type":"uint256"}],"name":"dataSourceGetRoundOfSixteenResult","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"tokenId","type":"uint256"}],"name":"setLimit","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"amount","type":"uint32"}],"name":"calculateWinners","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"","type":"uint256"}],"name":"tokenToPayoutMap","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"","type":"uint256"}],"name":"ownerOfTokenMap","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"pointsLimit","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_address","type":"address"}],"name":"setDataSourceAddress","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"id","type":"uint256"},{"name":"result","type":"uint8[4]"}],"name":"dataSourceCallbackFinals","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"x","type":"uint256"}],"name":"getGroupData","outputs":[{"name":"a","type":"uint8"},{"name":"b","type":"uint8"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"lastCheckedToken","outputs":[{"name":"","type":"uint32"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"","type":"uint256"}],"name":"tokenToPointsMap","outputs":[{"name":"","type":"uint16"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"index","type":"uint256"}],"name":"dataSourceGetRoundOfSixteen","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[],"name":"withdrawPrize","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"matchId","type":"uint256"}],"name":"dataSourceGetSemiResult","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"lastCalculatedToken","outputs":[{"name":"","type":"uint32"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"isDataSourceCallback","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"pure","type":"function"},{"constant":false,"inputs":[{"name":"groups1","type":"uint192"},{"name":"groups2","type":"uint192"},{"name":"brackets","type":"uint160"},{"name":"extra","type":"uint32"}],"name":"buildToken","outputs":[],"payable":true,"stateMutability":"payable","type":"function"},{"constant":false,"inputs":[],"name":"setTopWinnerPrizes","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"paused","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"newLength","type":"uint256"}],"name":"resetWinners","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"name":"ownerAddress","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"sortedChunk","type":"uint32[]"}],"name":"checkOrder","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[],"name":"setLastPositions","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"lastAssigned","outputs":[{"name":"","type":"uint32"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"getBracketData","outputs":[{"name":"a","type":"uint8[16]"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"matchId","type":"uint256"}],"name":"dataSourceGetQuarterResult","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_newAdmin","type":"address"}],"name":"setAdmin","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"userAddress","type":"address"}],"name":"balanceOf","outputs":[{"name":"count","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"prizePool","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"matchId","type":"uint256"},{"name":"result","type":"uint8"},{"name":"result2","type":"uint8"}],"name":"dataSourceCallbackGroup","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"payoutRange","outputs":[{"name":"","type":"uint32"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"pValidationState","outputs":[{"name":"","type":"uint8"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"ownerAddress","type":"address"}],"name":"tokensOfOwner","outputs":[{"name":"tokenIds","type":"uint256[]"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"auxWorstPoints","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"id","type":"uint256"},{"name":"result","type":"uint8"}],"name":"dataSourceCallbackRoundOfSixteen","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[],"name":"dataSourceGetRedCards","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"amount","type":"uint32"}],"name":"setWinnerPrizes","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[],"name":"emergencyWithdrawAdmin","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"symbol","outputs":[{"name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"matchId","type":"uint256"},{"name":"result","type":"uint8"}],"name":"dataSourceCallbackTeamId","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"saleOpen","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"winnerCounter","outputs":[{"name":"","type":"uint32"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"","type":"address"},{"name":"","type":"uint256"}],"name":"tokensOfOwnerMap","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"toAddress","type":"address"},{"name":"tokenId","type":"uint256"}],"name":"transfer","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"finalized","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"finishedGameWithdraw","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"amount","type":"uint32"}],"name":"calculatePointsBlock","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"getExtrasData","outputs":[{"name":"a","type":"uint16"},{"name":"b","type":"uint16"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"adminPool","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"dataSourceGetYellowCards","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"state","type":"bool"}],"name":"setPauseState","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"lastPrizeGiven","outputs":[{"name":"","type":"uint32"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"dataSourceAddress","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"emergencyWithdraw","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"tokenId","type":"uint256"}],"name":"getToken","outputs":[{"name":"groups1","type":"uint192"},{"name":"groups2","type":"uint192"},{"name":"brackets","type":"uint160"},{"name":"timeStamp","type":"uint64"},{"name":"extra","type":"uint32"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"id","type":"uint256"},{"name":"result","type":"uint16"}],"name":"dataSourceCallbackExtras","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"deploymentTime","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"","type":"uint256"}],"name":"tokensApprovedMap","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"matchId","type":"uint256"}],"name":"dataSourceGetGroupResult","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"x","type":"uint8"}],"name":"getBracketDataMiddleTeamIds","outputs":[{"name":"a","type":"uint8"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"getBracketDataFinals","outputs":[{"name":"a","type":"uint8[4]"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"adminAddress","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"adminWithdrawBalance","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"finalizedTime","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"gameFinishedTime","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"inputs":[],"payable":false,"stateMutability":"nonpayable","type":"constructor"},{"payable":true,"stateMutability":"payable","type":"fallback"},{"anonymous":false,"inputs":[{"indexed":false,"name":"matchId","type":"uint256"},{"indexed":false,"name":"result","type":"uint8"},{"indexed":false,"name":"result2","type":"uint8"}],"name":"LogGroupDataArrived","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"id","type":"uint256"},{"indexed":false,"name":"result","type":"uint8"}],"name":"LogRoundOfSixteenArrived","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"matchId","type":"uint256"},{"indexed":false,"name":"result","type":"uint8"}],"name":"LogMiddlePhaseArrived","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"id","type":"uint256"},{"indexed":false,"name":"result","type":"uint8[4]"}],"name":"LogFinalsArrived","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"id","type":"uint256"},{"indexed":false,"name":"result","type":"uint16"}],"name":"LogExtrasArrived","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"from","type":"address"},{"indexed":false,"name":"to","type":"address"},{"indexed":false,"name":"tokenId","type":"uint256"}],"name":"LogTransfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"owner","type":"address"},{"indexed":false,"name":"approved","type":"address"},{"indexed":false,"name":"tokenId","type":"uint256"}],"name":"LogApproval","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"creatorAddress","type":"address"},{"indexed":false,"name":"tokenId","type":"uint256"},{"components":[{"name":"groups1","type":"uint192"},{"name":"groups2","type":"uint192"},{"name":"brackets","type":"uint160"},{"name":"timeStamp","type":"uint64"},{"name":"extra","type":"uint32"}],"indexed":false,"name":"token","type":"tuple"}],"name":"LogTokenBuilt","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"result","type":"uint8[]"}],"name":"LogDataSourceCallbackList","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"result","type":"uint8"}],"name":"LogDataSourceCallbackInt","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"result","type":"uint8"},{"indexed":false,"name":"result2","type":"uint8"}],"name":"LogDataSourceCallbackTwoInt","type":"event"}]Contract Creation Code
60606040526000600381905560048190556005805463ffffffff191690556006819055600780546001606060020a0319169055631dcd65006008556009805467ffffffffffffffff19169055600a819055600b819055600c8190556045805460ff19166001830217905550604b805479ffff0000000000000000000000000000000000000000000000006201000062ffffff199092169190911763ff0000001916630f00000017602060020a60c060020a031916641f000000001760c060020a61ffff0219161790556102a06040519081016040908152600180835260208301819052908201819052606082018190526080820181905260a0820181905260c0820181905260e08201819052610100820181905261012082015260056101408201819052610160820152600a61018082015260146101a082015260326101c082015260646101e0820181905261020082015260c86102208201526101f46102408201526105dc6102608201526109c46102808201526200018490604c906015620001b6565b5034156200019157600080fd5b60028054600160a060020a03191633600160a060020a0316179055426003556200028b565b82805482825590600052602060002090600f01601090048101928215620002545791602002820160005b838211156200022257835183826101000a81548161ffff021916908361ffff1602179055509260200192600201602081600101049283019260010302620001e0565b8015620002525782816101000a81549061ffff021916905560020160208160010104928301926001030262000222565b505b506200026292915062000266565b5090565b6200028891905b808211156200026257805461ffff191681556001016200026d565b90565b614619806200029b6000396000f3006060604052600436106103345763ffffffff60e060020a60003504166304f68d49811461035157806306fdde0314610364578063095ea7b3146103ee57806318160ddd146104105780631b076edc1461043557806320b272911461046457806323b872dd1461047c57806325580656146104a457806327ea6f2b146104ba578063299e7abb146104d05780632cdc078d146104ec57806337440e9e1461050257806337a31079146105185780633a1fc7621461052b5780633c070b601461054a5780633e4852bd146105865780633fd68ca7146105ba57806345b95aa7146105e657806345dcb7881461061357806348d37a581461062957806349afcc0e1461063c5780634f2af86914610652578063582b6add1461066557806359b9a1921461068c5780635a2a3039146106bb5780635c975abb146106ce5780635dedd9cc146106e15780636352211e146106f757806363e561b61461070d578063653e2e0d1461072b5780636a22b09a1461073e5780636b6c5a7e146107515780636bbe24d41461079d578063704b6c02146107b357806370a08231146107d2578063719ce73e146107f157806378e8b8fc146108045780637ef1ab2c14610826578063810a217f146108395780638462151c1461087057806384682fbb146108e257806386b5e2b9146108f557806387ffe5a71461091157806388fdf3d4146109245780638f75362d1461094057806395d89b411461095357806397d74abd1461096657806399288dbb14610982578063a1e0c2c914610995578063a3816e90146109a8578063a9059cbb146109ca578063b3f05b97146109ec578063b3f50029146109ff578063b427c14814610a12578063b75d7e5014610a2e578063b86a1fb214610a60578063bafcea6f14610a73578063cdb88ad114610a86578063d49edbd814610a9e578063d5a3b73414610ab1578063db2e21bc14610ac4578063e4b50cb814610ad7578063e967a9b714610b43578063ecda10f514610b60578063ef8fd00414610b73578063f68f8e4214610b89578063f72758e714610b9f578063f7d4c7e314610bc8578063fc6f946814610bf5578063fdf061f014610c08578063fe67a18914610c1b578063fefaa62614610c2e575b60025433600160a060020a0390811691161461034f57600080fd5b005b341561035c57600080fd5b61034f610c41565b341561036f57600080fd5b610377610cb1565b60405160208082528190810183818151815260200191508051906020019080838360005b838110156103b357808201518382015260200161039b565b50505050905090810190601f1680156103e05780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34156103f957600080fd5b61034f600160a060020a0360043516602435610cf3565b341561041b57600080fd5b610423610d8b565b60405190815260200160405180910390f35b341561044057600080fd5b610448610d91565b604051600160a060020a03909116815260200160405180910390f35b341561046f57600080fd5b61034f6004351515610da0565b341561048757600080fd5b61034f600160a060020a0360043581169060243516604435610df0565b34156104af57600080fd5b61034f600435610ec0565b34156104c557600080fd5b61034f600435610f3a565b34156104db57600080fd5b61034f63ffffffff60043516610fd5565b34156104f757600080fd5b61042360043561114c565b341561050d57600080fd5b61044860043561115e565b341561052357600080fd5b610423611179565b341561053657600080fd5b61034f600160a060020a036004351661117f565b341561055557600080fd5b61034f600480359060a46024826080604051908101604052919082826080808284375093955061123c945050505050565b341561059157600080fd5b61059c600435611318565b60405160ff9283168152911660208201526040908101905180910390f35b34156105c557600080fd5b6105cd61134e565b60405163ffffffff909116815260200160405180910390f35b34156105f157600080fd5b6105fc60043561135a565b60405161ffff909116815260200160405180910390f35b341561061e57600080fd5b61034f600435611370565b341561063457600080fd5b61034f6113d3565b341561064757600080fd5b61034f600435611544565b341561065d57600080fd5b6105cd6115a7565b341561067057600080fd5b6106786115b3565b604051901515815260200160405180910390f35b61034f600160c060020a0360043581169060243516600160a060020a036044351663ffffffff606435166115b8565b34156106c657600080fd5b61034f611836565b34156106d957600080fd5b610678611be1565b34156106ec57600080fd5b61034f600435611bea565b341561070257600080fd5b610448600435611c2f565b341561071857600080fd5b61034f6004803560248101910135611c58565b341561073657600080fd5b61034f611ee7565b341561074957600080fd5b6105cd611ffc565b341561075c57600080fd5b610764612014565b604051808261020080838360005b8381101561078a578082015183820152602001610772565b5050505090500191505060405180910390f35b34156107a857600080fd5b61034f600435612070565b34156107be57600080fd5b61034f600160a060020a03600435166120d3565b34156107dd57600080fd5b610423600160a060020a0360043516612125565b34156107fc57600080fd5b610423612140565b341561080f57600080fd5b61034f60043560ff60243581169060443516612146565b341561083157600080fd5b6105cd612216565b341561084457600080fd5b61084c612222565b6040518082600681111561085c57fe5b60ff16815260200191505060405180910390f35b341561087b57600080fd5b61088f600160a060020a036004351661222b565b60405160208082528190810183818151815260200191508051906020019060200280838360005b838110156108ce5780820151838201526020016108b6565b505050509050019250505060405180910390f35b34156108ed57600080fd5b6104236122ae565b341561090057600080fd5b61034f60043560ff602435166122b4565b341561091c57600080fd5b61034f612362565b341561092f57600080fd5b61034f63ffffffff600435166123bc565b341561094b57600080fd5b61034f61262c565b341561095e57600080fd5b6103776126bf565b341561097157600080fd5b61034f60043560ff60243516612700565b341561098d57600080fd5b610678612860565b34156109a057600080fd5b6105cd61286f565b34156109b357600080fd5b610423600160a060020a0360043516602435612883565b34156109d557600080fd5b61034f600160a060020a03600435166024356128b1565b34156109f757600080fd5b61067861296b565b3415610a0a57600080fd5b61034f612979565b3415610a1d57600080fd5b61034f63ffffffff600435166129f3565b3415610a3957600080fd5b610a41612ba7565b60405161ffff9283168152911660208201526040908101905180910390f35b3415610a6b57600080fd5b610423612bbc565b3415610a7e57600080fd5b61034f612bc2565b3415610a9157600080fd5b61034f6004351515612c1c565b3415610aa957600080fd5b6105cd612c4a565b3415610abc57600080fd5b610448612c5e565b3415610acf57600080fd5b61034f612c6d565b3415610ae257600080fd5b610aed600435612ce6565b604051600160c060020a039586168152939094166020840152600160a060020a0390911660408084019190915267ffffffffffffffff909116606083015263ffffffff909216608082015260a001905180910390f35b3415610b4e57600080fd5b61034f60043561ffff60243516612d73565b3415610b6b57600080fd5b610423612e11565b3415610b7e57600080fd5b610448600435612e17565b3415610b9457600080fd5b61034f600435612e32565b3415610baa57600080fd5b610bb860ff60043516612e95565b6040518082600481111561085c57fe5b3415610bd357600080fd5b610bdb612ead565b604051808260808083836000815183820152602001610772565b3415610c0057600080fd5b610448612eeb565b3415610c1357600080fd5b61034f612efa565b3415610c2657600080fd5b610423612f55565b3415610c3957600080fd5b610423612f5b565b60025433600160a060020a03908116911614610c5c57600080fd5b600054600160a060020a031663bdf7220f6040518163ffffffff1660e060020a028152600401600060405180830381600087803b1515610c9b57600080fd5b6102c65a03f11515610cac57600080fd5b505050565b610cb96143b0565b60408051908101604052600981527f43727970746f6375700000000000000000000000000000000000000000000000602082015290505b90565b604b5460ff1615610d0357600080fd5b600160a060020a0382161515610d1857600080fd5b610d223382612f61565b1515610d2d57600080fd5b610d378183612f81565b7fc5c187f53b6bf5e61e032320e996f271e6dc6b212ee64ec28ba8e6b9e3f97a4e338383604051600160a060020a039384168152919092166020820152604080820192909252606001905180910390a15050565b600d5490565b600054600160a060020a031681565b60025433600160a060020a03908116911614610dbb57600080fd5b604b805460ff191682151590811761ff001916610100918202179182905560ff910416151560011415610ded5742600c555b50565b604b5460ff1615610e0057600080fd5b600160a060020a0382161515610e1557600080fd5b30600160a060020a031682600160a060020a031614151515610e3657600080fd5b610e403382612faf565b1515610e4b57600080fd5b610e558382612f61565b1515610e6057600080fd5b610e6b838383612fcf565b7f0a85107a334eae0d22d21cdf13af0f8e8125039ec60baaa843d2c4c5b0680174838383604051600160a060020a039384168152919092166020820152604080820192909252606001905180910390a1505050565b60025433600160a060020a03908116911614610edb57600080fd5b600054600160a060020a031663fd3acb5c8260405160e060020a63ffffffff84160281526004810191909152602401600060405180830381600087803b1515610f2357600080fd5b6102c65a03f11515610f3457600080fd5b50505050565b60025433600160a060020a03908116911614610f5557600080fd5b600d548110610f6357600080fd5b600060455460ff166006811115610f7657fe5b1480610f925750600160455460ff166006811115610f9057fe5b145b1515610f9d57600080fd5b60068190556045805460ff19166001179055600780546005805463ffffffff1916905567ffffffffffffffff19169055610ded613143565b600254600090819033600160a060020a03908116911614610ff557600080fd5b60018060455460ff16600681111561100957fe5b1461101357600080fd5b600d5460075463ffffffff908116860116111561102f57600080fd5b6006546000908152604a602052604090205460075461ffff909116935063ffffffff1691505b60075463ffffffff9081168501168210156110e6576000828152604a602052604090205461ffff16839011806110a957506000828152604a602052604090205461ffff16831480156110a957506006548211155b156110db5760078054600163ffffffff640100000000808404821692909201160267ffffffff00000000199091161790555b600190910190611055565b6007805463ffffffff19811663ffffffff918216870182161791829055600d5491161415610f3457600754604b5464010000000090910463ffffffff1660e060020a90910461ffff161461113957600080fd5b50506045805460ff191660021790555050565b60496020526000908152604090205481565b604760205260009081526040902054600160a060020a031681565b60065481565b60025460009033600160a060020a0390811691161461119d57600080fd5b5080600160a060020a03811663037a9d306000604051602001526040518163ffffffff1660e060020a028152600401602060405180830381600087803b15156111e557600080fd5b6102c65a03f115156111f657600080fd5b50505060405180519050151561120b57600080fd5b60008054600160a060020a03928316600160a060020a03199182161790915560018054939092169216919091179055565b60015460009033600160a060020a0390811691161461125a57600080fd5b5060005b60048110156112b25781816004811061127357fe5b60200201516041826004811061128557fe5b602091828204019190066101000a81548160ff021916908360ff160217905550808060010191505061125e565b7f784f6d77c7892aa6a66f7ca1a448ae76d5da2765239a268d26fce2666a899b4283836040518281526020810182608080838360005b838110156113005780820151838201526020016112e8565b505050509050019250505060405180910390a1505050565b600080600e836030811061132857fe5b015460ff169150600e836030811061133c57fe5b0154919361010090920460ff16925050565b60075463ffffffff1681565b604a6020526000908152604090205461ffff1681565b60025433600160a060020a0390811691161461138b57600080fd5b600054600160a060020a031663132427338260405160e060020a63ffffffff84160281526004810191909152602401600060405180830381600087803b1515610f2357600080fd5b60006113dd6143b0565b600060068060455460ff1660068111156113f357fe5b146113fd57600080fd5b600160a060020a03331660009081526046602090815260408083208054939750929182810201905190810160405280929190818152602001828054801561146357602002820191906000526020600020905b81548152602001906001019080831161144f575b50505050509250600091505b82518210156114dd576049600084848151811061148857fe5b90602001906020020151815260200190815260200160002054840193506000604960008585815181106114b757fe5b90602001906020020151815260208101919091526040016000205560019091019061146f565b600084116114ea57600080fd5b33600160a060020a03166108fc61151f620f424061151388600a54613dee90919063ffffffff16565b9063ffffffff613e2416565b9081150290604051600060405180830381858888f193505050501515610f3457600080fd5b60025433600160a060020a0390811691161461155f57600080fd5b600054600160a060020a0316632115d3288260405160e060020a63ffffffff84160281526004810191909152602401600060405180830381600087803b1515610f2357600080fd5b60055463ffffffff1681565b600190565b6115c06143c2565b604b5460009060ff16156115d357600080fd5b60a06040519081016040528087600160c060020a0316815260200186600160c060020a0316815260200185600160a060020a031681526020014267ffffffffffffffff1681526020018463ffffffff168152509150611630613e3b565b34101561163c57600080fd5b33600160a060020a0316151561165157600080fd5b600d54624c4b40901061166357600080fd5b600160a060020a0333166000908152604660205260409020546064901061168957600080fd5b635b21da30421061169957600080fd5b6001600d80548060010182816116af91906143f0565b600092835260209092208591600302018151815477ffffffffffffffffffffffffffffffffffffffffffffffff1916600160c060020a0391909116178155602082015160018201805477ffffffffffffffffffffffffffffffffffffffffffffffff1916600160c060020a03929092169190911790556040820151600282018054600160a060020a031916600160a060020a039290921691909117905560608201518160020160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550608082015160029190910180547bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1660e060020a63ffffffff9384160217905592909103925050811681146117cb57600080fd5b6117d53382613ebf565b7f123f43ae884aaab992d1eab18070123df1a4700c29c7ebe277252274795f10cd3382846040518084600160a060020a0316600160a060020a03168152602001838152602001828152602001935050505060405180910390a1505050505050565b60006118406143b0565b600254600090819081908190819081908190819033600160a060020a0390811691161461186c57600080fd5b60038060455460ff16600681111561188057fe5b1461188a57600080fd5b60009a50601e60405180591061189d5750595b9080825280602002602001820160405250600d8054919b5060009a508a9650945060c99010156118cc57600a93505b60095463ffffffff1684901015611ba057600954604c8054909163ffffffff169081106118f557fe5b90600052602060002090601091828204019190066002029054906101000a900461ffff1661ffff1692505b6000831115611b7f576043805463ffffffff871690811061193d57fe5b6000918252602080832090910154808352604a90915260409091205490985061ffff1696506000199092019182158015611982575060095463ffffffff166000198501145b15611a4b57858714156119fd57600954604d8054909163ffffffff169081106119a757fe5b90600052602060002090600891828204019190066004029054906101000a900463ffffffff1663ffffffff168b019a50878a8a61ffff16815181106119e857fe5b60209081029091010152600190980197611a4b565b600954604d8054909163ffffffff16908110611a1557fe5b600091825260208083206008808404909101548c855260499092526040909320929091066004026101000a900463ffffffff1690555b63ffffffff851615801590611a7e57508587141580611a7e575082158015611a7e575060095463ffffffff166000198501145b15611b0957600091505b8861ffff16821015611ade57611aa88b61ffff8b1663ffffffff613e2416565b604960008c8581518110611ab857fe5b906020019060200201518152602081019190915260400160002055600190910190611a88565b60009a50601e604051805910611af15750595b90808252806020026020018201604052509950600098505b600954604d8054909163ffffffff16908110611b2157fe5b90600052602060002090600891828204019190066004029054906101000a900463ffffffff1663ffffffff168b019a50878a8a61ffff1681518110611b6257fe5b602090810290910101526001988901988796509490940193611920565b6009805463ffffffff8082166001011663ffffffff199091161790556118cc565b50506045805460ff1916600417905550506009805467ffffffff00000000191664010000000063ffffffff9390931692909202919091179055505050505050565b604b5460ff1681565b60025433600160a060020a03908116911614611c0557600080fd5b60028060455460ff166006811115611c1957fe5b14611c2357600080fd5b81610cac60438261441c565b600081815260476020526040902054600160a060020a0316801515611c5357600080fd5b919050565b6002546000908190819081908190819033600160a060020a03908116911614611c8057600080fd5b60028060455460ff166006811115611c9457fe5b14611c9e57600080fd5b60075460435464010000000090910463ffffffff169089011115611cc157600080fd5b600096505b6000198801871015611d8157888888818110611cde57fe5b9050602002013563ffffffff1663ffffffff1695508888886001018181101515611d0457fe5b6020908102929092013563ffffffff166000818152604a9093526040808420548a855293205490975061ffff928316921691909111905080611d6b57506000858152604a60205260408082205488835291205461ffff9081169116148015611d6b57508486105b1515611d7657600080fd5b600190960195611cc6565b60435415611e2757604380546000198101908110611d9b57fe5b6000918252602082200154945089908990818110611db557fe5b6020908102929092013563ffffffff166000818152604a90935260408084205488855293205490955061ffff928316921691909111905080611e1c57506000838152604a60205260408082205486835291205461ffff9081169116148015611e1c57508284105b1515611e2757600080fd5b600091505b87821015611e88576043805460018101611e46838261441c565b916000526020600020900160008b8b868181101515611e6157fe5b9050602002013563ffffffff1663ffffffff16909190915055508180600101925050611e2c565b60075460435464010000000090910463ffffffff161415611edc57600654604380546000198101908110611eb857fe5b60009182526020909120015414611ece57600080fd5b6045805460ff191660031790555b505050505050505050565b6002546000908190819033600160a060020a03908116911614611f0957600080fd5b60058060455460ff166006811115611f1d57fe5b14611f2757600080fd5b600093505b604454841015611fa6576044805485908110611f4457fe5b600091825260209091200154604454604b54919450611f85917a010000000000000000000000000000000000000000000000000000900461ffff1690613e24565b60008481526049602052604090208054909101905560019390930192611f2c565b600160a060020a033016319150611fc9606461151384601963ffffffff613dee16565b600b55611fe2606461151384604b63ffffffff613dee16565b600a5550506045805460ff19166006179055505042600455565b60075468010000000000000000900463ffffffff1681565b61201c614440565b603e601061020060405190810160405291906102008301826000855b825461010083900a900460ff168152602060019283018181049485019490930390920291018084116120385790505050505050905090565b60025433600160a060020a0390811691161461208b57600080fd5b600054600160a060020a031663eef719b18260405160e060020a63ffffffff84160281526004810191909152602401600060405180830381600087803b1515610f2357600080fd5b60025433600160a060020a039081169116146120ee57600080fd5b600160a060020a038116151561210357600080fd5b60028054600160a060020a031916600160a060020a0392909216919091179055565b600160a060020a031660009081526046602052604090205490565b600a5481565b60015433600160a060020a0390811691161461216157600080fd5b600083101580156121735750602f8311155b151561217e57600080fd5b81600e846030811061218c57fe5b01805460ff191660ff9290921691909117905580600e84603081106121ad57fe5b01805460ff929092166101000261ff00199092169190911790557f100b781654c22dcc0ce6b4b9bbe8c5a027182ec638a460a8331ba9907ae34a7783838360405192835260ff9182166020840152166040808301919091526060909101905180910390a1505050565b60095463ffffffff1681565b60455460ff1681565b6122336143b0565b6046600083600160a060020a0316600160a060020a031681526020019081526020016000208054806020026020016040519081016040528092919081815260200182805480156122a257602002820191906000526020600020905b81548152602001906001019080831161228e575b50505050509050919050565b60085481565b60015433600160a060020a039081169116146122cf57600080fd5b80603e83601081106122dd57fe5b6020808204909201805460ff948516928490066101000a92830292850219169190911790559082166000908152603f909152604090819020805460ff191660011790557fdfd06cdf6d29b522912afa1362f9e10b447c20a3454086ba65b6b024061a26d390839083905191825260ff1660208201526040908101905180910390a15050565b60025433600160a060020a0390811691161461237d57600080fd5b600054600160a060020a03166317ab6cbb6040518163ffffffff1660e060020a028152600401600060405180830381600087803b1515610c9b57600080fd5b6002546000908190819033600160a060020a039081169116146123de57600080fd5b60048060455460ff1660068111156123f257fe5b146123fc57600080fd5b60075460095463ffffffff640100000000928390048116929091048116870116111561242757600080fd5b600954604c8054909163ffffffff1690811061243f57fe5b90600052602060002090601091828204019190066002029054906101000a900461ffff169350600092505b8463ffffffff1683101561256d5761ffff841615156124da576009805463ffffffff198116600163ffffffff9283160182161791829055604c805490929091169081106124b357fe5b90600052602060002090601091828204019190066002029054906101000a900461ffff1693505b600954604380549091640100000000900463ffffffff1685019081106124fc57fe5b600091825260209091200154600954604d80549294509163ffffffff90911690811061252457fe5b6000918252602080832060088084049091015486855260499092526040909320929091066004026101000a900463ffffffff16905560001993909301926001929092019161246a565b6009805463ffffffff6401000000008083048216890182160267ffffffff00000000199092169190911791829055604c805487939192919091169081106125b057fe5b90600052602060002090601091828204019190066002026101000a81548161ffff021916908361ffff160217905550600760049054906101000a900463ffffffff1663ffffffff16600960049054906101000a900463ffffffff1663ffffffff161415612625576045805460ff191660051790555b5050505050565b604b54610100900460ff16151561264257600080fd5b60025433600160a060020a0390811691161461265d57600080fd5b600c54158015906126755750600c54620d2f00014210155b151561268057600080fd5b33600160a060020a03166108fc30600160a060020a0316319081150290604051600060405180830381858888f1935050505015156126bd57600080fd5b565b6126c76143b0565b60408051908101604052600281527f43430000000000000000000000000000000000000000000000000000000000006020820152905090565b60015460009033600160a060020a0390811691161461271e57600080fd5b5060ff8082166000908152604060208190529020541660308310801590612746575060378311155b1561278957600181600481111561275957fe5b10156127845760ff8216600090815260406020819052902080546001919060ff191682805b02179055505b61281e565b6038831015801561279b5750603b8311155b156127d85760028160048111156127ae57fe5b10156127845760ff8216600090815260406020819052902080546002919060ff191660018361277e565b82603c14806127e7575082603d145b1561281e5760038160048111156127fa57fe5b101561281e5760ff82166000908152604060208190529020805460ff191660031790555b7f784f7f6ed2d355b96683be36c34e25597888d55416230331b013a99ae80051f7838360405191825260ff1660208201526040908101905180910390a1505050565b604b5462010000900460ff1681565b600754640100000000900463ffffffff1681565b60466020528160005260406000208181548110151561289e57fe5b6000918252602090912001549150829050565b604b5460ff16156128c157600080fd5b600160a060020a03821615156128d657600080fd5b30600160a060020a031682600160a060020a0316141515156128f757600080fd5b6129013382612f61565b151561290c57600080fd5b612917338383612fcf565b7f0a85107a334eae0d22d21cdf13af0f8e8125039ec60baaa843d2c4c5b0680174338383604051600160a060020a039384168152919092166020820152604080820192909252606001905180910390a15050565b604b54610100900460ff1681565b60025460009033600160a060020a0390811691161461299757600080fd5b600454158015906129af57506004546213c680014210155b15156129ba57600080fd5b50600254600160a060020a0330811631911681156108fc0282604051600060405180830381858888f193505050501515610ded57600080fd5b600454600090819015612a0557600080fd5b600d5460075463ffffffff9081168501161115612a2157600080fd5b60055463ffffffff1691505b60055463ffffffff908116840116821015612b8457612adf600d83815481101515612a5457fe5b906000526020600020906003020160a060405190810160409081528254600160c060020a0390811683526001840154166020830152600290920154600160a060020a0381169282019290925274010000000000000000000000000000000000000000820467ffffffffffffffff16606082015260e060020a90910463ffffffff166080820152613f25565b6000838152604a60205260409020805461ffff191661ffff83161790556044549091501580612b1457506008548161ffff1611155b15612b795760445415801590612b2f57506008548161ffff16105b15612b43576000612b4160448261441c565b505b6044546064901015612b795761ffff81166008556044805460018101612b69838261441c565b5060009182526020909120018290555b600190910190612a2d565b50506005805463ffffffff19811663ffffffff9182169390930116919091179055565b60425461ffff80821692620100009092041690565b600b5481565b60025433600160a060020a03908116911614612bdd57600080fd5b600054600160a060020a03166378dc70176040518163ffffffff1660e060020a028152600401600060405180830381600087803b1515610c9b57600080fd5b60025433600160a060020a03908116911614612c3757600080fd5b604b805460ff1916911515919091179055565b600954640100000000900463ffffffff1681565b600154600160a060020a031681565b604b54600090610100900460ff161515612c8657600080fd5b50600160a060020a03331660009081526046602052604081208054669fdf42f6e480000291612cb59190614469565b600160a060020a03331681156108fc0282604051600060405180830381858888f193505050501515610ded57600080fd5b600080600080600080600d87815481101515612cfe57fe5b6000918252602090912060039091020180546001820154600290920154600160c060020a039182169a929091169850600160a060020a038116975067ffffffffffffffff74010000000000000000000000000000000000000000820416965063ffffffff60e060020a90910416945092505050565b60015433600160a060020a03908116911614612d8e57600080fd5b8160651415612dad576042805461ffff191661ffff8316179055612dcf565b8160661415612dcf576042805463ffff000019166201000061ffff8416021790555b7fb585e111b4b80c29f5c70336537a97a40ad665f43005009ccc5f0c3d62604bed828260405191825261ffff1660208201526040908101905180910390a15050565b60035481565b604860205260009081526040902054600160a060020a031681565b60025433600160a060020a03908116911614612e4d57600080fd5b600054600160a060020a031663a6d4b5c28260405160e060020a63ffffffff84160281526004810191909152602401600060405180830381600087803b1515610f2357600080fd5b60ff9081166000908152604060208190529020541690565b612eb5614487565b604160046080604051908101604052825460ff168152919060808301826001602086018084116120385790505050505050905090565b600254600160a060020a031681565b60025433600160a060020a03908116911614612f1557600080fd5b600254600b54600160a060020a039091169080156108fc0290604051600060405180830381858888f193505050501515612f4e57600080fd5b6000600b55565b600c5481565b60045481565b600090815260476020526040902054600160a060020a0391821691161490565b6000918252604860205260409091208054600160a060020a031916600160a060020a03909216919091179055565b600090815260486020526040902054600160a060020a0391821691161490565b600160a060020a038216600090815260466020526040812054819060649010612ff757600080fd5b600060455460ff16600681111561300a57fe5b1461301457600080fd5b600160a060020a038416600090815260466020526040902080546001810161303c838261441c565b5060009182526020808320919091018590558482526047815260408083208054600160a060020a031916600160a060020a03898116919091179091558816835260469091528120925090505b81548110156130f3578282828154811015156130a057fe5b90600052602060002090015414156130eb578154829060001981019081106130c457fe5b90600052602060002090015482828154811015156130de57fe5b6000918252602090912001555b600101613088565b81548290600019810190811061310557fe5b6000918252602082200155815461312083600019830161441c565b50505060009081526048602052604090208054600160a060020a03191690555050565b600d54606590101561324e576102a0604051908101604090815262046ba482526202e50460208301526201d4c090820152620169546060820152620124f8608082015261f42460a082015261cd1460c082015261a60460e0820152619c40610100820152618b1061012082015260006101408201819052610160820181905261018082018190526101a082018190526101c082018190526101e08201819052610200820181905261022082018190526102408201819052610260820181905261028082015261321690604d9060156144a1565b50604b805460d060020a63ffffffff0219167c0a000000000000000000000000000000000000000000000000000000001790556126bd565b600d5460c990101561335a576102a0604051908101604090815262040d1c82526202867c602083015262019c1c90820152620126ec606082015261f618608082015261bb8060a0820152618aac60c082015261501460e0820152614e20610100820152614c2c610120820152614844610140820152614588610160820152600061018082018190526101a082018190526101c082018190526101e08201819052610200820181905261022082018190526102408201819052610260820181905261028082015261332290604d9060156144a1565b50604b805460d060020a63ffffffff0219167c14000000000000000000000000000000000000000000000000000000001790556126bd565b600d5461012d901015613468576102a060405190810160409081526203fa5c82526202603460208301526201895c90820152620114f4606082015261ed1c608082015261b28460a0820152618aac60c082015261501460e08201526145ec6101008201526130d4610120820152612cec610140820152612af86101608201526129ae61018082015260006101a082018190526101c082018190526101e08201819052610200820181905261022082018190526102408201819052610260820181905261028082015261343090604d9060156144a1565b50604b805460d060020a63ffffffff0219167c1e000000000000000000000000000000000000000000000000000000001790556126bd565b600d546101f5901015613576576102a060405190810160409081526203a408825262021d68602083015262015ae09082015261f938606082015261d228608082015261ab1860a082015261840860c082015261497060e082015261445c6101008201526130d461012082015261251c610140820152611d4c610160820152611bbc610180820152611a2c6101a082015260006101c082018190526101e08201819052610200820181905261022082018190526102408201819052610260820181905261028082015261353e90604d9060156144a1565b50604b805460d060020a63ffffffff0219167c32000000000000000000000000000000000000000000000000000000001790556126bd565b600d546103e99010156136ac576102a06040519081016040908152620354bc82526201ddbc602083015262011a6c9082015261ccb0606082015261ab7c608082015261846c60a0820152615d5c60c0820152613e8060e08201526132c8610100820152612710610120820152612328610140820152611b58610160820152611388610180820152610fa06101a0820152610e106101c082015260006101e08201819052610200820181905261022082018190526102408201819052610260820181905261028082015261364d90604d9060156144a1565b50604b805460d060020a61ffff0219167b0fa000000000000000000000000000000000000000000000000000001760e060020a61ffff0219167c64000000000000000000000000000000000000000000000000000000001790556126bd565b600d546107d19010156137e2576102a0604051908101604090815262031ed482526201bd50602083015261fa009082015261ac446060820152618b74608082015261684c60a08201526155f060c0820152613a9860e0820152612af861010082015261251c6101208201526121346101408201526119646101608201526111f86101808201526109c46101a08201526107d06101c08201526107086101e08201526000610200820181905261022082018190526102408201819052610260820181905261028082015261378390604d9060156144a1565b50604b805460d060020a61ffff0219167b09c400000000000000000000000000000000000000000000000000001760e060020a61ffff0219167cc8000000000000000000000000000000000000000000000000000000001790556126bd565b600d54610bb990101561391a576102a060405190810160409081526202e310825262019960602083015261d28c9082015261885460608201526172746080820152614b6460a0820152613bc460c08201526136b060e082015261290461010082015261206c610120820152611f40610140820152611770610160820152610ed86101808201526109c46101a08201526107d06101c08201526105dc6101e082015261044c61020082015260006102208201819052610240820181905261026082018190526102808201526138ba90604d9060156144a1565b50604b805460d060020a61ffff0219167b09c400000000000000000000000000000000000000000000000000001760e060020a61ffff0219167d012c000000000000000000000000000000000000000000000000000000001790556126bd565b600d54611389901015613a53576102a060405190810160409081526202b750825262018894602083015261b928908201526176c0606082015261607c6080820152613c8c60a0820152613a9860c0820152612ee060e08201526127d8610100820152611e78610120820152611ce861014082015261157c610160820152610ce46101808201526107d06101a08201526105dc6101c08201526104b06101e082015261038461020082015261029e6102208201526000610240820181905261026082018190526102808201526139f390604d9060156144a1565b50604b805460d060020a61ffff0219167b07d000000000000000000000000000000000000000000000000000001760e060020a61ffff0219167d01f4000000000000000000000000000000000000000000000000000000001790556126bd565b600d54612711901015613b8d576102a06040519081016040908152620267a08252620151e4602083015261985890820152615a3c60608201526149d46080820152613a9860a08201526136b060c0820152612af860e08201526124546101008201526117d4610120820152611770610140820152611388610160820152610ed86101808201526105dc6101a082015261044c6101c08201526103846101e08201526102bc6102008201526101f461022082015261016861024082015260006102608201819052610280820152613b2d90604d9060156144a1565b50604b805460d060020a61ffff0219167b05dc00000000000000000000000000000000000000000000000000001760e060020a61ffff0219167d03e8000000000000000000000000000000000000000000000000000000001790556126bd565b600d546161a9901015613cc6576102a06040519081016040908152620205948252620112386020830152617a4490820152614844606082015261445c60808201526136b060a08201526134bc60c082015261290460e0820152611d4c61010082015261157c610120820152611388610140820152610fa0610160820152610bb86101808201526103e86101a08201526103846101c08201526102bc6101e082015261025861020082015261019061022082015260c861024082015260986102608201526000610280820152613c6690604d9060156144a1565b50604b805460d060020a61ffff0219167b03e800000000000000000000000000000000000000000000000000001760e060020a61ffff0219167d09c4000000000000000000000000000000000000000000000000000000001790556126bd565b6102a060405190810160409081526201d4c0825261f6186020830152616978908201526149706060820152614394608082015261358460a08201526132c860c082015261271060e082015261189c610100820152611388610120820152611194610140820152610f3c6101608201526109c46101808201526103846101a08201526103206101c08201526102586101e08201526101f461020082015261015e610220820152609661024082015260646102608201526046610280820152613d9190604d9060156144a1565b50604b805460d060020a61ffff0219167b038400000000000000000000000000000000000000000000000000001760e060020a61ffff0219167d138800000000000000000000000000000000000000000000000000000000179055565b600080831515613e015760009150613e1d565b50828202828482811515613e1157fe5b0414613e1957fe5b8091505b5092915050565b6000808284811515613e3257fe5b04949350505050565b6000635b1de5b04210613e575750670214e8348c4f0000613e95565b635b14ab304210613e715750670186cc6acd4b0000613e95565b635b0b70b04210613e8b575067010a741a46278000613e95565b50669fdf42f6e480005b669fdf42f6e480008110158015613eb457506702c68af0bb1400008111155b1515610cf057600080fd5b600160a060020a0382166000908152604660205260409020805460018101613ee7838261441c565b5060009182526020808320919091018390559181526047909152604090208054600160a060020a031916600160a060020a0392909216919091179055565b60008080808085519350600092505b60178311613f6b57613f49836017038561403d565b90940193610100600160c060020a039094169390930492600190920191613f34565b85602001519150600092505b60178311613fae57613f8c83602f038361403d565b90940193600190920191610100600160c060020a039092169190910490613f77565b85604001519050613fbe816140dd565b9094019362100000600160a060020a0390911604613fdf60046002836141c8565b9094019362100000600160a060020a039091160461400060086001836141c8565b9094019365010000000000600160a060020a03909116046140208161424b565b8501945061403186608001516142e6565b90940195945050505050565b604b546000906301000000900482811660ff908116916010600160c060020a0386160416168280600e876030811061407157fe5b015460ff169150600e876030811061408557fe5b015460ff610100909104811691508281169085161480156140ab57508260ff168160ff16145b156140bb57600a850194506140d3565b6140c782828686614350565b156140d3576003850194505b5050505092915050565b60006140e761454f565b60005b6002811161413557604b546020600160a060020a0395861604946401000000009091048516168260028390036003811061412057fe5b60ff90921660209290920201526001016140ea565b60415460ff16825160ff16141561414d576064830192505b60415462010000900460ff16604083015160ff16141561416e576019830192505b604154610100900460ff16825160ff16141561418b576032830192505b60415460ff16602083015160ff1614806141b55750604154610100900460ff16602083015160ff16145b156141c1576032830192505b5050919050565b600080805b8560ff1681101561424257604b5464010000000090048416600160a060020a031691508460048111156141fc57fe5b60ff80841660009081526040602081905290205416600481111561421c57fe5b1061422857603c830192505b6020600160a060020a0390941693909304926001016141cd565b50509392505050565b600080805b600f81116141c157604b5464010000000090048416600160a060020a03169150603e600f8290036010811061428157fe5b60208082049092015460ff858116939092066101000a90041614156142ab57601e830192506142cc565b60ff8083166000908152603f602052604090205416156142cc576019830192505b6020600160a060020a039094169390930492600101614250565b604b546042546201000063ffffffff841681900493600093780100000000000000000000000000000000000000000000000090041661ffff908116928592900416821415614335576014830192505b60425461ffff828116911614156141c1575050601401919050565b600083850382840381830b839013801561436d575060008160000b135b80614389575060008260000b128015614389575060008160000b125b806143a557508160000b60001480156143a557508060000b6000145b979650505050505050565b60206040519081016040526000815290565b60a0604051908101604090815260008083526020830181905290820181905260608201819052608082015290565b815481835581811511610cac57600302816003028360005260206000209182019101610cac9190614569565b815481835581811511610cac57600083815260209020610cac9181019083016145b2565b6102006040519081016040526010815b6000815260001990910190602001816144505790505090565b5080546000825590600052602060002090810190610ded91906145b2565b608060405190810160405260008152600360208201614450565b8280548282559060005260206000209060070160089004810192821561453f5791602002820160005b8382111561450d57835183826101000a81548163ffffffff021916908362ffffff16021790555092602001926004016020816003010492830192600103026144ca565b801561453d5782816101000a81549063ffffffff021916905560040160208160030104928301926001030261450d565b505b5061454b9291506145cc565b5090565b606060405190810160405260008152600260208201614450565b610cf091905b8082111561454b57805477ffffffffffffffffffffffffffffffffffffffffffffffff19908116825560018201805490911690556000600282015560030161456f565b610cf091905b8082111561454b57600081556001016145b8565b610cf091905b8082111561454b57805463ffffffff191681556001016145d25600a165627a7a72305820955b297a0de8941e133b44c5e8dda2c24d97efb52c653db4c300752cbdddae150029
Deployed Bytecode
0x6060604052600436106103345763ffffffff60e060020a60003504166304f68d49811461035157806306fdde0314610364578063095ea7b3146103ee57806318160ddd146104105780631b076edc1461043557806320b272911461046457806323b872dd1461047c57806325580656146104a457806327ea6f2b146104ba578063299e7abb146104d05780632cdc078d146104ec57806337440e9e1461050257806337a31079146105185780633a1fc7621461052b5780633c070b601461054a5780633e4852bd146105865780633fd68ca7146105ba57806345b95aa7146105e657806345dcb7881461061357806348d37a581461062957806349afcc0e1461063c5780634f2af86914610652578063582b6add1461066557806359b9a1921461068c5780635a2a3039146106bb5780635c975abb146106ce5780635dedd9cc146106e15780636352211e146106f757806363e561b61461070d578063653e2e0d1461072b5780636a22b09a1461073e5780636b6c5a7e146107515780636bbe24d41461079d578063704b6c02146107b357806370a08231146107d2578063719ce73e146107f157806378e8b8fc146108045780637ef1ab2c14610826578063810a217f146108395780638462151c1461087057806384682fbb146108e257806386b5e2b9146108f557806387ffe5a71461091157806388fdf3d4146109245780638f75362d1461094057806395d89b411461095357806397d74abd1461096657806399288dbb14610982578063a1e0c2c914610995578063a3816e90146109a8578063a9059cbb146109ca578063b3f05b97146109ec578063b3f50029146109ff578063b427c14814610a12578063b75d7e5014610a2e578063b86a1fb214610a60578063bafcea6f14610a73578063cdb88ad114610a86578063d49edbd814610a9e578063d5a3b73414610ab1578063db2e21bc14610ac4578063e4b50cb814610ad7578063e967a9b714610b43578063ecda10f514610b60578063ef8fd00414610b73578063f68f8e4214610b89578063f72758e714610b9f578063f7d4c7e314610bc8578063fc6f946814610bf5578063fdf061f014610c08578063fe67a18914610c1b578063fefaa62614610c2e575b60025433600160a060020a0390811691161461034f57600080fd5b005b341561035c57600080fd5b61034f610c41565b341561036f57600080fd5b610377610cb1565b60405160208082528190810183818151815260200191508051906020019080838360005b838110156103b357808201518382015260200161039b565b50505050905090810190601f1680156103e05780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34156103f957600080fd5b61034f600160a060020a0360043516602435610cf3565b341561041b57600080fd5b610423610d8b565b60405190815260200160405180910390f35b341561044057600080fd5b610448610d91565b604051600160a060020a03909116815260200160405180910390f35b341561046f57600080fd5b61034f6004351515610da0565b341561048757600080fd5b61034f600160a060020a0360043581169060243516604435610df0565b34156104af57600080fd5b61034f600435610ec0565b34156104c557600080fd5b61034f600435610f3a565b34156104db57600080fd5b61034f63ffffffff60043516610fd5565b34156104f757600080fd5b61042360043561114c565b341561050d57600080fd5b61044860043561115e565b341561052357600080fd5b610423611179565b341561053657600080fd5b61034f600160a060020a036004351661117f565b341561055557600080fd5b61034f600480359060a46024826080604051908101604052919082826080808284375093955061123c945050505050565b341561059157600080fd5b61059c600435611318565b60405160ff9283168152911660208201526040908101905180910390f35b34156105c557600080fd5b6105cd61134e565b60405163ffffffff909116815260200160405180910390f35b34156105f157600080fd5b6105fc60043561135a565b60405161ffff909116815260200160405180910390f35b341561061e57600080fd5b61034f600435611370565b341561063457600080fd5b61034f6113d3565b341561064757600080fd5b61034f600435611544565b341561065d57600080fd5b6105cd6115a7565b341561067057600080fd5b6106786115b3565b604051901515815260200160405180910390f35b61034f600160c060020a0360043581169060243516600160a060020a036044351663ffffffff606435166115b8565b34156106c657600080fd5b61034f611836565b34156106d957600080fd5b610678611be1565b34156106ec57600080fd5b61034f600435611bea565b341561070257600080fd5b610448600435611c2f565b341561071857600080fd5b61034f6004803560248101910135611c58565b341561073657600080fd5b61034f611ee7565b341561074957600080fd5b6105cd611ffc565b341561075c57600080fd5b610764612014565b604051808261020080838360005b8381101561078a578082015183820152602001610772565b5050505090500191505060405180910390f35b34156107a857600080fd5b61034f600435612070565b34156107be57600080fd5b61034f600160a060020a03600435166120d3565b34156107dd57600080fd5b610423600160a060020a0360043516612125565b34156107fc57600080fd5b610423612140565b341561080f57600080fd5b61034f60043560ff60243581169060443516612146565b341561083157600080fd5b6105cd612216565b341561084457600080fd5b61084c612222565b6040518082600681111561085c57fe5b60ff16815260200191505060405180910390f35b341561087b57600080fd5b61088f600160a060020a036004351661222b565b60405160208082528190810183818151815260200191508051906020019060200280838360005b838110156108ce5780820151838201526020016108b6565b505050509050019250505060405180910390f35b34156108ed57600080fd5b6104236122ae565b341561090057600080fd5b61034f60043560ff602435166122b4565b341561091c57600080fd5b61034f612362565b341561092f57600080fd5b61034f63ffffffff600435166123bc565b341561094b57600080fd5b61034f61262c565b341561095e57600080fd5b6103776126bf565b341561097157600080fd5b61034f60043560ff60243516612700565b341561098d57600080fd5b610678612860565b34156109a057600080fd5b6105cd61286f565b34156109b357600080fd5b610423600160a060020a0360043516602435612883565b34156109d557600080fd5b61034f600160a060020a03600435166024356128b1565b34156109f757600080fd5b61067861296b565b3415610a0a57600080fd5b61034f612979565b3415610a1d57600080fd5b61034f63ffffffff600435166129f3565b3415610a3957600080fd5b610a41612ba7565b60405161ffff9283168152911660208201526040908101905180910390f35b3415610a6b57600080fd5b610423612bbc565b3415610a7e57600080fd5b61034f612bc2565b3415610a9157600080fd5b61034f6004351515612c1c565b3415610aa957600080fd5b6105cd612c4a565b3415610abc57600080fd5b610448612c5e565b3415610acf57600080fd5b61034f612c6d565b3415610ae257600080fd5b610aed600435612ce6565b604051600160c060020a039586168152939094166020840152600160a060020a0390911660408084019190915267ffffffffffffffff909116606083015263ffffffff909216608082015260a001905180910390f35b3415610b4e57600080fd5b61034f60043561ffff60243516612d73565b3415610b6b57600080fd5b610423612e11565b3415610b7e57600080fd5b610448600435612e17565b3415610b9457600080fd5b61034f600435612e32565b3415610baa57600080fd5b610bb860ff60043516612e95565b6040518082600481111561085c57fe5b3415610bd357600080fd5b610bdb612ead565b604051808260808083836000815183820152602001610772565b3415610c0057600080fd5b610448612eeb565b3415610c1357600080fd5b61034f612efa565b3415610c2657600080fd5b610423612f55565b3415610c3957600080fd5b610423612f5b565b60025433600160a060020a03908116911614610c5c57600080fd5b600054600160a060020a031663bdf7220f6040518163ffffffff1660e060020a028152600401600060405180830381600087803b1515610c9b57600080fd5b6102c65a03f11515610cac57600080fd5b505050565b610cb96143b0565b60408051908101604052600981527f43727970746f6375700000000000000000000000000000000000000000000000602082015290505b90565b604b5460ff1615610d0357600080fd5b600160a060020a0382161515610d1857600080fd5b610d223382612f61565b1515610d2d57600080fd5b610d378183612f81565b7fc5c187f53b6bf5e61e032320e996f271e6dc6b212ee64ec28ba8e6b9e3f97a4e338383604051600160a060020a039384168152919092166020820152604080820192909252606001905180910390a15050565b600d5490565b600054600160a060020a031681565b60025433600160a060020a03908116911614610dbb57600080fd5b604b805460ff191682151590811761ff001916610100918202179182905560ff910416151560011415610ded5742600c555b50565b604b5460ff1615610e0057600080fd5b600160a060020a0382161515610e1557600080fd5b30600160a060020a031682600160a060020a031614151515610e3657600080fd5b610e403382612faf565b1515610e4b57600080fd5b610e558382612f61565b1515610e6057600080fd5b610e6b838383612fcf565b7f0a85107a334eae0d22d21cdf13af0f8e8125039ec60baaa843d2c4c5b0680174838383604051600160a060020a039384168152919092166020820152604080820192909252606001905180910390a1505050565b60025433600160a060020a03908116911614610edb57600080fd5b600054600160a060020a031663fd3acb5c8260405160e060020a63ffffffff84160281526004810191909152602401600060405180830381600087803b1515610f2357600080fd5b6102c65a03f11515610f3457600080fd5b50505050565b60025433600160a060020a03908116911614610f5557600080fd5b600d548110610f6357600080fd5b600060455460ff166006811115610f7657fe5b1480610f925750600160455460ff166006811115610f9057fe5b145b1515610f9d57600080fd5b60068190556045805460ff19166001179055600780546005805463ffffffff1916905567ffffffffffffffff19169055610ded613143565b600254600090819033600160a060020a03908116911614610ff557600080fd5b60018060455460ff16600681111561100957fe5b1461101357600080fd5b600d5460075463ffffffff908116860116111561102f57600080fd5b6006546000908152604a602052604090205460075461ffff909116935063ffffffff1691505b60075463ffffffff9081168501168210156110e6576000828152604a602052604090205461ffff16839011806110a957506000828152604a602052604090205461ffff16831480156110a957506006548211155b156110db5760078054600163ffffffff640100000000808404821692909201160267ffffffff00000000199091161790555b600190910190611055565b6007805463ffffffff19811663ffffffff918216870182161791829055600d5491161415610f3457600754604b5464010000000090910463ffffffff1660e060020a90910461ffff161461113957600080fd5b50506045805460ff191660021790555050565b60496020526000908152604090205481565b604760205260009081526040902054600160a060020a031681565b60065481565b60025460009033600160a060020a0390811691161461119d57600080fd5b5080600160a060020a03811663037a9d306000604051602001526040518163ffffffff1660e060020a028152600401602060405180830381600087803b15156111e557600080fd5b6102c65a03f115156111f657600080fd5b50505060405180519050151561120b57600080fd5b60008054600160a060020a03928316600160a060020a03199182161790915560018054939092169216919091179055565b60015460009033600160a060020a0390811691161461125a57600080fd5b5060005b60048110156112b25781816004811061127357fe5b60200201516041826004811061128557fe5b602091828204019190066101000a81548160ff021916908360ff160217905550808060010191505061125e565b7f784f6d77c7892aa6a66f7ca1a448ae76d5da2765239a268d26fce2666a899b4283836040518281526020810182608080838360005b838110156113005780820151838201526020016112e8565b505050509050019250505060405180910390a1505050565b600080600e836030811061132857fe5b015460ff169150600e836030811061133c57fe5b0154919361010090920460ff16925050565b60075463ffffffff1681565b604a6020526000908152604090205461ffff1681565b60025433600160a060020a0390811691161461138b57600080fd5b600054600160a060020a031663132427338260405160e060020a63ffffffff84160281526004810191909152602401600060405180830381600087803b1515610f2357600080fd5b60006113dd6143b0565b600060068060455460ff1660068111156113f357fe5b146113fd57600080fd5b600160a060020a03331660009081526046602090815260408083208054939750929182810201905190810160405280929190818152602001828054801561146357602002820191906000526020600020905b81548152602001906001019080831161144f575b50505050509250600091505b82518210156114dd576049600084848151811061148857fe5b90602001906020020151815260200190815260200160002054840193506000604960008585815181106114b757fe5b90602001906020020151815260208101919091526040016000205560019091019061146f565b600084116114ea57600080fd5b33600160a060020a03166108fc61151f620f424061151388600a54613dee90919063ffffffff16565b9063ffffffff613e2416565b9081150290604051600060405180830381858888f193505050501515610f3457600080fd5b60025433600160a060020a0390811691161461155f57600080fd5b600054600160a060020a0316632115d3288260405160e060020a63ffffffff84160281526004810191909152602401600060405180830381600087803b1515610f2357600080fd5b60055463ffffffff1681565b600190565b6115c06143c2565b604b5460009060ff16156115d357600080fd5b60a06040519081016040528087600160c060020a0316815260200186600160c060020a0316815260200185600160a060020a031681526020014267ffffffffffffffff1681526020018463ffffffff168152509150611630613e3b565b34101561163c57600080fd5b33600160a060020a0316151561165157600080fd5b600d54624c4b40901061166357600080fd5b600160a060020a0333166000908152604660205260409020546064901061168957600080fd5b635b21da30421061169957600080fd5b6001600d80548060010182816116af91906143f0565b600092835260209092208591600302018151815477ffffffffffffffffffffffffffffffffffffffffffffffff1916600160c060020a0391909116178155602082015160018201805477ffffffffffffffffffffffffffffffffffffffffffffffff1916600160c060020a03929092169190911790556040820151600282018054600160a060020a031916600160a060020a039290921691909117905560608201518160020160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550608082015160029190910180547bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1660e060020a63ffffffff9384160217905592909103925050811681146117cb57600080fd5b6117d53382613ebf565b7f123f43ae884aaab992d1eab18070123df1a4700c29c7ebe277252274795f10cd3382846040518084600160a060020a0316600160a060020a03168152602001838152602001828152602001935050505060405180910390a1505050505050565b60006118406143b0565b600254600090819081908190819081908190819033600160a060020a0390811691161461186c57600080fd5b60038060455460ff16600681111561188057fe5b1461188a57600080fd5b60009a50601e60405180591061189d5750595b9080825280602002602001820160405250600d8054919b5060009a508a9650945060c99010156118cc57600a93505b60095463ffffffff1684901015611ba057600954604c8054909163ffffffff169081106118f557fe5b90600052602060002090601091828204019190066002029054906101000a900461ffff1661ffff1692505b6000831115611b7f576043805463ffffffff871690811061193d57fe5b6000918252602080832090910154808352604a90915260409091205490985061ffff1696506000199092019182158015611982575060095463ffffffff166000198501145b15611a4b57858714156119fd57600954604d8054909163ffffffff169081106119a757fe5b90600052602060002090600891828204019190066004029054906101000a900463ffffffff1663ffffffff168b019a50878a8a61ffff16815181106119e857fe5b60209081029091010152600190980197611a4b565b600954604d8054909163ffffffff16908110611a1557fe5b600091825260208083206008808404909101548c855260499092526040909320929091066004026101000a900463ffffffff1690555b63ffffffff851615801590611a7e57508587141580611a7e575082158015611a7e575060095463ffffffff166000198501145b15611b0957600091505b8861ffff16821015611ade57611aa88b61ffff8b1663ffffffff613e2416565b604960008c8581518110611ab857fe5b906020019060200201518152602081019190915260400160002055600190910190611a88565b60009a50601e604051805910611af15750595b90808252806020026020018201604052509950600098505b600954604d8054909163ffffffff16908110611b2157fe5b90600052602060002090600891828204019190066004029054906101000a900463ffffffff1663ffffffff168b019a50878a8a61ffff1681518110611b6257fe5b602090810290910101526001988901988796509490940193611920565b6009805463ffffffff8082166001011663ffffffff199091161790556118cc565b50506045805460ff1916600417905550506009805467ffffffff00000000191664010000000063ffffffff9390931692909202919091179055505050505050565b604b5460ff1681565b60025433600160a060020a03908116911614611c0557600080fd5b60028060455460ff166006811115611c1957fe5b14611c2357600080fd5b81610cac60438261441c565b600081815260476020526040902054600160a060020a0316801515611c5357600080fd5b919050565b6002546000908190819081908190819033600160a060020a03908116911614611c8057600080fd5b60028060455460ff166006811115611c9457fe5b14611c9e57600080fd5b60075460435464010000000090910463ffffffff169089011115611cc157600080fd5b600096505b6000198801871015611d8157888888818110611cde57fe5b9050602002013563ffffffff1663ffffffff1695508888886001018181101515611d0457fe5b6020908102929092013563ffffffff166000818152604a9093526040808420548a855293205490975061ffff928316921691909111905080611d6b57506000858152604a60205260408082205488835291205461ffff9081169116148015611d6b57508486105b1515611d7657600080fd5b600190960195611cc6565b60435415611e2757604380546000198101908110611d9b57fe5b6000918252602082200154945089908990818110611db557fe5b6020908102929092013563ffffffff166000818152604a90935260408084205488855293205490955061ffff928316921691909111905080611e1c57506000838152604a60205260408082205486835291205461ffff9081169116148015611e1c57508284105b1515611e2757600080fd5b600091505b87821015611e88576043805460018101611e46838261441c565b916000526020600020900160008b8b868181101515611e6157fe5b9050602002013563ffffffff1663ffffffff16909190915055508180600101925050611e2c565b60075460435464010000000090910463ffffffff161415611edc57600654604380546000198101908110611eb857fe5b60009182526020909120015414611ece57600080fd5b6045805460ff191660031790555b505050505050505050565b6002546000908190819033600160a060020a03908116911614611f0957600080fd5b60058060455460ff166006811115611f1d57fe5b14611f2757600080fd5b600093505b604454841015611fa6576044805485908110611f4457fe5b600091825260209091200154604454604b54919450611f85917a010000000000000000000000000000000000000000000000000000900461ffff1690613e24565b60008481526049602052604090208054909101905560019390930192611f2c565b600160a060020a033016319150611fc9606461151384601963ffffffff613dee16565b600b55611fe2606461151384604b63ffffffff613dee16565b600a5550506045805460ff19166006179055505042600455565b60075468010000000000000000900463ffffffff1681565b61201c614440565b603e601061020060405190810160405291906102008301826000855b825461010083900a900460ff168152602060019283018181049485019490930390920291018084116120385790505050505050905090565b60025433600160a060020a0390811691161461208b57600080fd5b600054600160a060020a031663eef719b18260405160e060020a63ffffffff84160281526004810191909152602401600060405180830381600087803b1515610f2357600080fd5b60025433600160a060020a039081169116146120ee57600080fd5b600160a060020a038116151561210357600080fd5b60028054600160a060020a031916600160a060020a0392909216919091179055565b600160a060020a031660009081526046602052604090205490565b600a5481565b60015433600160a060020a0390811691161461216157600080fd5b600083101580156121735750602f8311155b151561217e57600080fd5b81600e846030811061218c57fe5b01805460ff191660ff9290921691909117905580600e84603081106121ad57fe5b01805460ff929092166101000261ff00199092169190911790557f100b781654c22dcc0ce6b4b9bbe8c5a027182ec638a460a8331ba9907ae34a7783838360405192835260ff9182166020840152166040808301919091526060909101905180910390a1505050565b60095463ffffffff1681565b60455460ff1681565b6122336143b0565b6046600083600160a060020a0316600160a060020a031681526020019081526020016000208054806020026020016040519081016040528092919081815260200182805480156122a257602002820191906000526020600020905b81548152602001906001019080831161228e575b50505050509050919050565b60085481565b60015433600160a060020a039081169116146122cf57600080fd5b80603e83601081106122dd57fe5b6020808204909201805460ff948516928490066101000a92830292850219169190911790559082166000908152603f909152604090819020805460ff191660011790557fdfd06cdf6d29b522912afa1362f9e10b447c20a3454086ba65b6b024061a26d390839083905191825260ff1660208201526040908101905180910390a15050565b60025433600160a060020a0390811691161461237d57600080fd5b600054600160a060020a03166317ab6cbb6040518163ffffffff1660e060020a028152600401600060405180830381600087803b1515610c9b57600080fd5b6002546000908190819033600160a060020a039081169116146123de57600080fd5b60048060455460ff1660068111156123f257fe5b146123fc57600080fd5b60075460095463ffffffff640100000000928390048116929091048116870116111561242757600080fd5b600954604c8054909163ffffffff1690811061243f57fe5b90600052602060002090601091828204019190066002029054906101000a900461ffff169350600092505b8463ffffffff1683101561256d5761ffff841615156124da576009805463ffffffff198116600163ffffffff9283160182161791829055604c805490929091169081106124b357fe5b90600052602060002090601091828204019190066002029054906101000a900461ffff1693505b600954604380549091640100000000900463ffffffff1685019081106124fc57fe5b600091825260209091200154600954604d80549294509163ffffffff90911690811061252457fe5b6000918252602080832060088084049091015486855260499092526040909320929091066004026101000a900463ffffffff16905560001993909301926001929092019161246a565b6009805463ffffffff6401000000008083048216890182160267ffffffff00000000199092169190911791829055604c805487939192919091169081106125b057fe5b90600052602060002090601091828204019190066002026101000a81548161ffff021916908361ffff160217905550600760049054906101000a900463ffffffff1663ffffffff16600960049054906101000a900463ffffffff1663ffffffff161415612625576045805460ff191660051790555b5050505050565b604b54610100900460ff16151561264257600080fd5b60025433600160a060020a0390811691161461265d57600080fd5b600c54158015906126755750600c54620d2f00014210155b151561268057600080fd5b33600160a060020a03166108fc30600160a060020a0316319081150290604051600060405180830381858888f1935050505015156126bd57600080fd5b565b6126c76143b0565b60408051908101604052600281527f43430000000000000000000000000000000000000000000000000000000000006020820152905090565b60015460009033600160a060020a0390811691161461271e57600080fd5b5060ff8082166000908152604060208190529020541660308310801590612746575060378311155b1561278957600181600481111561275957fe5b10156127845760ff8216600090815260406020819052902080546001919060ff191682805b02179055505b61281e565b6038831015801561279b5750603b8311155b156127d85760028160048111156127ae57fe5b10156127845760ff8216600090815260406020819052902080546002919060ff191660018361277e565b82603c14806127e7575082603d145b1561281e5760038160048111156127fa57fe5b101561281e5760ff82166000908152604060208190529020805460ff191660031790555b7f784f7f6ed2d355b96683be36c34e25597888d55416230331b013a99ae80051f7838360405191825260ff1660208201526040908101905180910390a1505050565b604b5462010000900460ff1681565b600754640100000000900463ffffffff1681565b60466020528160005260406000208181548110151561289e57fe5b6000918252602090912001549150829050565b604b5460ff16156128c157600080fd5b600160a060020a03821615156128d657600080fd5b30600160a060020a031682600160a060020a0316141515156128f757600080fd5b6129013382612f61565b151561290c57600080fd5b612917338383612fcf565b7f0a85107a334eae0d22d21cdf13af0f8e8125039ec60baaa843d2c4c5b0680174338383604051600160a060020a039384168152919092166020820152604080820192909252606001905180910390a15050565b604b54610100900460ff1681565b60025460009033600160a060020a0390811691161461299757600080fd5b600454158015906129af57506004546213c680014210155b15156129ba57600080fd5b50600254600160a060020a0330811631911681156108fc0282604051600060405180830381858888f193505050501515610ded57600080fd5b600454600090819015612a0557600080fd5b600d5460075463ffffffff9081168501161115612a2157600080fd5b60055463ffffffff1691505b60055463ffffffff908116840116821015612b8457612adf600d83815481101515612a5457fe5b906000526020600020906003020160a060405190810160409081528254600160c060020a0390811683526001840154166020830152600290920154600160a060020a0381169282019290925274010000000000000000000000000000000000000000820467ffffffffffffffff16606082015260e060020a90910463ffffffff166080820152613f25565b6000838152604a60205260409020805461ffff191661ffff83161790556044549091501580612b1457506008548161ffff1611155b15612b795760445415801590612b2f57506008548161ffff16105b15612b43576000612b4160448261441c565b505b6044546064901015612b795761ffff81166008556044805460018101612b69838261441c565b5060009182526020909120018290555b600190910190612a2d565b50506005805463ffffffff19811663ffffffff9182169390930116919091179055565b60425461ffff80821692620100009092041690565b600b5481565b60025433600160a060020a03908116911614612bdd57600080fd5b600054600160a060020a03166378dc70176040518163ffffffff1660e060020a028152600401600060405180830381600087803b1515610c9b57600080fd5b60025433600160a060020a03908116911614612c3757600080fd5b604b805460ff1916911515919091179055565b600954640100000000900463ffffffff1681565b600154600160a060020a031681565b604b54600090610100900460ff161515612c8657600080fd5b50600160a060020a03331660009081526046602052604081208054669fdf42f6e480000291612cb59190614469565b600160a060020a03331681156108fc0282604051600060405180830381858888f193505050501515610ded57600080fd5b600080600080600080600d87815481101515612cfe57fe5b6000918252602090912060039091020180546001820154600290920154600160c060020a039182169a929091169850600160a060020a038116975067ffffffffffffffff74010000000000000000000000000000000000000000820416965063ffffffff60e060020a90910416945092505050565b60015433600160a060020a03908116911614612d8e57600080fd5b8160651415612dad576042805461ffff191661ffff8316179055612dcf565b8160661415612dcf576042805463ffff000019166201000061ffff8416021790555b7fb585e111b4b80c29f5c70336537a97a40ad665f43005009ccc5f0c3d62604bed828260405191825261ffff1660208201526040908101905180910390a15050565b60035481565b604860205260009081526040902054600160a060020a031681565b60025433600160a060020a03908116911614612e4d57600080fd5b600054600160a060020a031663a6d4b5c28260405160e060020a63ffffffff84160281526004810191909152602401600060405180830381600087803b1515610f2357600080fd5b60ff9081166000908152604060208190529020541690565b612eb5614487565b604160046080604051908101604052825460ff168152919060808301826001602086018084116120385790505050505050905090565b600254600160a060020a031681565b60025433600160a060020a03908116911614612f1557600080fd5b600254600b54600160a060020a039091169080156108fc0290604051600060405180830381858888f193505050501515612f4e57600080fd5b6000600b55565b600c5481565b60045481565b600090815260476020526040902054600160a060020a0391821691161490565b6000918252604860205260409091208054600160a060020a031916600160a060020a03909216919091179055565b600090815260486020526040902054600160a060020a0391821691161490565b600160a060020a038216600090815260466020526040812054819060649010612ff757600080fd5b600060455460ff16600681111561300a57fe5b1461301457600080fd5b600160a060020a038416600090815260466020526040902080546001810161303c838261441c565b5060009182526020808320919091018590558482526047815260408083208054600160a060020a031916600160a060020a03898116919091179091558816835260469091528120925090505b81548110156130f3578282828154811015156130a057fe5b90600052602060002090015414156130eb578154829060001981019081106130c457fe5b90600052602060002090015482828154811015156130de57fe5b6000918252602090912001555b600101613088565b81548290600019810190811061310557fe5b6000918252602082200155815461312083600019830161441c565b50505060009081526048602052604090208054600160a060020a03191690555050565b600d54606590101561324e576102a0604051908101604090815262046ba482526202e50460208301526201d4c090820152620169546060820152620124f8608082015261f42460a082015261cd1460c082015261a60460e0820152619c40610100820152618b1061012082015260006101408201819052610160820181905261018082018190526101a082018190526101c082018190526101e08201819052610200820181905261022082018190526102408201819052610260820181905261028082015261321690604d9060156144a1565b50604b805460d060020a63ffffffff0219167c0a000000000000000000000000000000000000000000000000000000001790556126bd565b600d5460c990101561335a576102a0604051908101604090815262040d1c82526202867c602083015262019c1c90820152620126ec606082015261f618608082015261bb8060a0820152618aac60c082015261501460e0820152614e20610100820152614c2c610120820152614844610140820152614588610160820152600061018082018190526101a082018190526101c082018190526101e08201819052610200820181905261022082018190526102408201819052610260820181905261028082015261332290604d9060156144a1565b50604b805460d060020a63ffffffff0219167c14000000000000000000000000000000000000000000000000000000001790556126bd565b600d5461012d901015613468576102a060405190810160409081526203fa5c82526202603460208301526201895c90820152620114f4606082015261ed1c608082015261b28460a0820152618aac60c082015261501460e08201526145ec6101008201526130d4610120820152612cec610140820152612af86101608201526129ae61018082015260006101a082018190526101c082018190526101e08201819052610200820181905261022082018190526102408201819052610260820181905261028082015261343090604d9060156144a1565b50604b805460d060020a63ffffffff0219167c1e000000000000000000000000000000000000000000000000000000001790556126bd565b600d546101f5901015613576576102a060405190810160409081526203a408825262021d68602083015262015ae09082015261f938606082015261d228608082015261ab1860a082015261840860c082015261497060e082015261445c6101008201526130d461012082015261251c610140820152611d4c610160820152611bbc610180820152611a2c6101a082015260006101c082018190526101e08201819052610200820181905261022082018190526102408201819052610260820181905261028082015261353e90604d9060156144a1565b50604b805460d060020a63ffffffff0219167c32000000000000000000000000000000000000000000000000000000001790556126bd565b600d546103e99010156136ac576102a06040519081016040908152620354bc82526201ddbc602083015262011a6c9082015261ccb0606082015261ab7c608082015261846c60a0820152615d5c60c0820152613e8060e08201526132c8610100820152612710610120820152612328610140820152611b58610160820152611388610180820152610fa06101a0820152610e106101c082015260006101e08201819052610200820181905261022082018190526102408201819052610260820181905261028082015261364d90604d9060156144a1565b50604b805460d060020a61ffff0219167b0fa000000000000000000000000000000000000000000000000000001760e060020a61ffff0219167c64000000000000000000000000000000000000000000000000000000001790556126bd565b600d546107d19010156137e2576102a0604051908101604090815262031ed482526201bd50602083015261fa009082015261ac446060820152618b74608082015261684c60a08201526155f060c0820152613a9860e0820152612af861010082015261251c6101208201526121346101408201526119646101608201526111f86101808201526109c46101a08201526107d06101c08201526107086101e08201526000610200820181905261022082018190526102408201819052610260820181905261028082015261378390604d9060156144a1565b50604b805460d060020a61ffff0219167b09c400000000000000000000000000000000000000000000000000001760e060020a61ffff0219167cc8000000000000000000000000000000000000000000000000000000001790556126bd565b600d54610bb990101561391a576102a060405190810160409081526202e310825262019960602083015261d28c9082015261885460608201526172746080820152614b6460a0820152613bc460c08201526136b060e082015261290461010082015261206c610120820152611f40610140820152611770610160820152610ed86101808201526109c46101a08201526107d06101c08201526105dc6101e082015261044c61020082015260006102208201819052610240820181905261026082018190526102808201526138ba90604d9060156144a1565b50604b805460d060020a61ffff0219167b09c400000000000000000000000000000000000000000000000000001760e060020a61ffff0219167d012c000000000000000000000000000000000000000000000000000000001790556126bd565b600d54611389901015613a53576102a060405190810160409081526202b750825262018894602083015261b928908201526176c0606082015261607c6080820152613c8c60a0820152613a9860c0820152612ee060e08201526127d8610100820152611e78610120820152611ce861014082015261157c610160820152610ce46101808201526107d06101a08201526105dc6101c08201526104b06101e082015261038461020082015261029e6102208201526000610240820181905261026082018190526102808201526139f390604d9060156144a1565b50604b805460d060020a61ffff0219167b07d000000000000000000000000000000000000000000000000000001760e060020a61ffff0219167d01f4000000000000000000000000000000000000000000000000000000001790556126bd565b600d54612711901015613b8d576102a06040519081016040908152620267a08252620151e4602083015261985890820152615a3c60608201526149d46080820152613a9860a08201526136b060c0820152612af860e08201526124546101008201526117d4610120820152611770610140820152611388610160820152610ed86101808201526105dc6101a082015261044c6101c08201526103846101e08201526102bc6102008201526101f461022082015261016861024082015260006102608201819052610280820152613b2d90604d9060156144a1565b50604b805460d060020a61ffff0219167b05dc00000000000000000000000000000000000000000000000000001760e060020a61ffff0219167d03e8000000000000000000000000000000000000000000000000000000001790556126bd565b600d546161a9901015613cc6576102a06040519081016040908152620205948252620112386020830152617a4490820152614844606082015261445c60808201526136b060a08201526134bc60c082015261290460e0820152611d4c61010082015261157c610120820152611388610140820152610fa0610160820152610bb86101808201526103e86101a08201526103846101c08201526102bc6101e082015261025861020082015261019061022082015260c861024082015260986102608201526000610280820152613c6690604d9060156144a1565b50604b805460d060020a61ffff0219167b03e800000000000000000000000000000000000000000000000000001760e060020a61ffff0219167d09c4000000000000000000000000000000000000000000000000000000001790556126bd565b6102a060405190810160409081526201d4c0825261f6186020830152616978908201526149706060820152614394608082015261358460a08201526132c860c082015261271060e082015261189c610100820152611388610120820152611194610140820152610f3c6101608201526109c46101808201526103846101a08201526103206101c08201526102586101e08201526101f461020082015261015e610220820152609661024082015260646102608201526046610280820152613d9190604d9060156144a1565b50604b805460d060020a61ffff0219167b038400000000000000000000000000000000000000000000000000001760e060020a61ffff0219167d138800000000000000000000000000000000000000000000000000000000179055565b600080831515613e015760009150613e1d565b50828202828482811515613e1157fe5b0414613e1957fe5b8091505b5092915050565b6000808284811515613e3257fe5b04949350505050565b6000635b1de5b04210613e575750670214e8348c4f0000613e95565b635b14ab304210613e715750670186cc6acd4b0000613e95565b635b0b70b04210613e8b575067010a741a46278000613e95565b50669fdf42f6e480005b669fdf42f6e480008110158015613eb457506702c68af0bb1400008111155b1515610cf057600080fd5b600160a060020a0382166000908152604660205260409020805460018101613ee7838261441c565b5060009182526020808320919091018390559181526047909152604090208054600160a060020a031916600160a060020a0392909216919091179055565b60008080808085519350600092505b60178311613f6b57613f49836017038561403d565b90940193610100600160c060020a039094169390930492600190920191613f34565b85602001519150600092505b60178311613fae57613f8c83602f038361403d565b90940193600190920191610100600160c060020a039092169190910490613f77565b85604001519050613fbe816140dd565b9094019362100000600160a060020a0390911604613fdf60046002836141c8565b9094019362100000600160a060020a039091160461400060086001836141c8565b9094019365010000000000600160a060020a03909116046140208161424b565b8501945061403186608001516142e6565b90940195945050505050565b604b546000906301000000900482811660ff908116916010600160c060020a0386160416168280600e876030811061407157fe5b015460ff169150600e876030811061408557fe5b015460ff610100909104811691508281169085161480156140ab57508260ff168160ff16145b156140bb57600a850194506140d3565b6140c782828686614350565b156140d3576003850194505b5050505092915050565b60006140e761454f565b60005b6002811161413557604b546020600160a060020a0395861604946401000000009091048516168260028390036003811061412057fe5b60ff90921660209290920201526001016140ea565b60415460ff16825160ff16141561414d576064830192505b60415462010000900460ff16604083015160ff16141561416e576019830192505b604154610100900460ff16825160ff16141561418b576032830192505b60415460ff16602083015160ff1614806141b55750604154610100900460ff16602083015160ff16145b156141c1576032830192505b5050919050565b600080805b8560ff1681101561424257604b5464010000000090048416600160a060020a031691508460048111156141fc57fe5b60ff80841660009081526040602081905290205416600481111561421c57fe5b1061422857603c830192505b6020600160a060020a0390941693909304926001016141cd565b50509392505050565b600080805b600f81116141c157604b5464010000000090048416600160a060020a03169150603e600f8290036010811061428157fe5b60208082049092015460ff858116939092066101000a90041614156142ab57601e830192506142cc565b60ff8083166000908152603f602052604090205416156142cc576019830192505b6020600160a060020a039094169390930492600101614250565b604b546042546201000063ffffffff841681900493600093780100000000000000000000000000000000000000000000000090041661ffff908116928592900416821415614335576014830192505b60425461ffff828116911614156141c1575050601401919050565b600083850382840381830b839013801561436d575060008160000b135b80614389575060008260000b128015614389575060008160000b125b806143a557508160000b60001480156143a557508060000b6000145b979650505050505050565b60206040519081016040526000815290565b60a0604051908101604090815260008083526020830181905290820181905260608201819052608082015290565b815481835581811511610cac57600302816003028360005260206000209182019101610cac9190614569565b815481835581811511610cac57600083815260209020610cac9181019083016145b2565b6102006040519081016040526010815b6000815260001990910190602001816144505790505090565b5080546000825590600052602060002090810190610ded91906145b2565b608060405190810160405260008152600360208201614450565b8280548282559060005260206000209060070160089004810192821561453f5791602002820160005b8382111561450d57835183826101000a81548163ffffffff021916908362ffffff16021790555092602001926004016020816003010492830192600103026144ca565b801561453d5782816101000a81549063ffffffff021916905560040160208160030104928301926001030261450d565b505b5061454b9291506145cc565b5090565b606060405190810160405260008152600260208201614450565b610cf091905b8082111561454b57805477ffffffffffffffffffffffffffffffffffffffffffffffff19908116825560018201805490911690556000600282015560030161456f565b610cf091905b8082111561454b57600081556001016145b8565b610cf091905b8082111561454b57805463ffffffff191681556001016145d25600a165627a7a72305820955b297a0de8941e133b44c5e8dda2c24d97efb52c653db4c300752cbdddae150029
Swarm Source
bzzr://955b297a0de8941e133b44c5e8dda2c24d97efb52c653db4c300752cbdddae15
Loading...
Loading
Loading...
Loading
[ Download: CSV Export ]
A token is a representation of an on-chain or off-chain asset. The token page shows information such as price, total supply, holders, transfers and social links. Learn more about this page in our Knowledge Base.
Add Token to MetaMask (Web3)