ERC-20
Overview
Max Total Supply
1,000,000 JACK
Holders
151
Market
Onchain Market Cap
$0.00
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:
Token
Compiler Version
v0.4.19+commit.c4cbbb05
Optimization Enabled:
Yes with 200 runs
Other Settings:
default evmVersion
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2018-01-17 */ // Copyright (c) 2017, 2018 EtherJack.io. All rights reserved. // This code is disclosed only to be used for inspection and audit purposes. // Code modification and use for any purpose other than security audit // is prohibited. Creation of derived works or unauthorized deployment // of the code or any its portion to a blockchain is prohibited. pragma solidity ^0.4.19; contract HouseOwned { address house; modifier onlyHouse { require(msg.sender == house); _; } /// @dev Contract constructor function HouseOwned() public { house = msg.sender; } } // SafeMath is a part of Zeppelin Solidity library // licensed under MIT License // https://github.com/OpenZeppelin/zeppelin-solidity/blob/master/LICENSE /** * @title SafeMath * @dev Math operations with safety checks that throw on error */ library SafeMath { 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; } 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; } function sub(uint256 a, uint256 b) internal pure returns (uint256) { assert(b <= a); return a - b; } function add(uint256 a, uint256 b) internal pure returns (uint256) { uint256 c = a + b; assert(c >= a); return c; } } // ---------------------------------------------------------------------------- // ERC Token Standard #20 Interface // https://github.com/ethereum/EIPs/blob/master/EIPS/eip-20-token-standard.md // ---------------------------------------------------------------------------- contract ERC20Interface { function totalSupply() public constant returns (uint); function balanceOf(address _owner) public constant returns (uint balance); function allowance(address _owner, address _spender) public constant returns (uint remaining); function transfer(address _to, uint _value) public returns (bool success); function approve(address _spender, uint _value) public returns (bool success); function transferFrom(address _from, address _to, uint _value) public returns (bool success); event Transfer(address indexed from, address indexed to, uint value); event Approval(address indexed tokenOwner, address indexed spender, uint value); } contract Token is HouseOwned, ERC20Interface { using SafeMath for uint; // Public variables of the token string public name; string public symbol; uint8 public constant decimals = 0; uint256 public supply; // Trusted addresses Jackpot public jackpot; address public croupier; // All users' balances mapping (address => uint256) internal balances; // Users' deposits with Croupier mapping (address => uint256) public depositOf; // Total amount of deposits uint256 public totalDeposit; // Total amount of "Frozen Deposit Pool" -- the tokens for sale at Croupier uint256 public frozenPool; // Allowance mapping mapping (address => mapping (address => uint256)) internal allowed; ////// /// @title Modifiers // /// @dev Only Croupier modifier onlyCroupier { require(msg.sender == croupier); _; } /// @dev Only Jackpot modifier onlyJackpot { require(msg.sender == address(jackpot)); _; } /// @dev Protection from short address attack modifier onlyPayloadSize(uint size) { assert(msg.data.length == size + 4); _; } ////// /// @title Events // /// @dev Fired when a token is burned (bet made) event Burn(address indexed from, uint256 value); /// @dev Fired when a deposit is made or withdrawn /// direction == 0: deposit /// direction == 1: withdrawal event Deposit(address indexed from, uint256 value, uint8 direction, uint256 newDeposit); /// @dev Fired when a deposit with Croupier is frozen (set for sale) event DepositFrozen(address indexed from, uint256 value); /// @dev Fired when a deposit with Croupier is unfrozen (removed from sale) // Value is the resulting deposit, NOT the unfrozen amount event DepositUnfrozen(address indexed from, uint256 value); ////// /// @title Constructor and Initialization // /// @dev Initializes contract with initial supply tokens to the creator of the contract function Token() HouseOwned() public { name = "JACK Token"; symbol = "JACK"; supply = 1000000; } /// @dev Function to set address of Jackpot contract once after creation /// @param _jackpot Address of the Jackpot contract function setJackpot(address _jackpot) onlyHouse public { require(address(jackpot) == 0x0); require(_jackpot != address(this)); // Protection from admin's mistake jackpot = Jackpot(_jackpot); uint256 bountyPortion = supply / 40; // 2.5% is the bounty portion for marketing expenses balances[house] = bountyPortion; // House receives the bounty tokens balances[jackpot] = supply - bountyPortion; // Jackpot gets the rest croupier = jackpot.croupier(); } ////// /// @title Public Methods // /// @dev Croupier invokes this method to return deposits to players /// @param _to The address of the recipient /// @param _extra Additional off-chain credit (AirDrop support), so that croupier can return more than the user has actually deposited function returnDeposit(address _to, uint256 _extra) onlyCroupier public { require(depositOf[_to] > 0 || _extra > 0); uint256 amount = depositOf[_to]; depositOf[_to] = 0; totalDeposit = totalDeposit.sub(amount); _transfer(croupier, _to, amount.add(_extra)); Deposit(_to, amount, 1, 0); } /// @dev Gets the balance of the specified address. /// @param _owner The address function balanceOf(address _owner) public view returns (uint256 balance) { return balances[_owner]; } function totalSupply() public view returns (uint256) { return supply; } /// @dev Send `_value` tokens to `_to` /// @param _to The address of the recipient /// @param _value the amount to send function transfer(address _to, uint256 _value) onlyPayloadSize(2 * 32) public returns (bool) { require(address(jackpot) != 0x0); require(croupier != 0x0); if (_to == address(jackpot)) { // It is a token bet. Ignoring _value, only using 1 token _burnFromAccount(msg.sender, 1); jackpot.betToken(msg.sender); return true; } if (_to == croupier && msg.sender != house) { // It's a deposit to Croupier. In addition to transferring the token, // mark it in the deposits table // House can't make deposits. If House is transferring something to // Croupier, it's just a transfer, nothing more depositOf[msg.sender] += _value; totalDeposit = totalDeposit.add(_value); Deposit(msg.sender, _value, 0, depositOf[msg.sender]); } // In all cases but Jackpot transfer (which is terminated by a return), actually // do perform the transfer return _transfer(msg.sender, _to, _value); } /// @dev Transfer tokens from one address to another /// @param _from address The address which you want to send tokens from /// @param _to address The address which you want to transfer to /// @param _value uint256 the amount of tokens to be transferred function transferFrom(address _from, address _to, uint256 _value) public returns (bool) { require(_to != address(0)); require(_value <= balances[_from]); require(_value <= allowed[_from][msg.sender]); balances[_from] = balances[_from].sub(_value); balances[_to] = balances[_to].add(_value); allowed[_from][msg.sender] = allowed[_from][msg.sender].sub(_value); Transfer(_from, _to, _value); return true; } /// @dev Approve the passed address to spend the specified amount of tokens on behalf of msg.sender. /// @param _spender The address which will spend the funds. /// @param _value The amount of tokens to be spent. function approve(address _spender, uint256 _value) public returns (bool) { allowed[msg.sender][_spender] = _value; Approval(msg.sender, _spender, _value); return true; } /// @dev Function to check the amount of tokens that an owner allowed to a spender. /// @param _owner address The address which owns the funds. /// @param _spender address The address which will spend the funds. /// @return A uint256 specifying the amount of tokens still available for the spender. function allowance(address _owner, address _spender) public view returns (uint256) { return allowed[_owner][_spender]; } /// @dev Increase the amount of tokens that an owner allowed to a spender. /// @param _spender The address which will spend the funds. /// @param _addedValue The amount of tokens to increase the allowance by. function increaseApproval(address _spender, uint _addedValue) public returns (bool) { allowed[msg.sender][_spender] = allowed[msg.sender][_spender].add(_addedValue); Approval(msg.sender, _spender, allowed[msg.sender][_spender]); return true; } /// @dev Decrease the amount of tokens that an owner allowed to a spender. /// @param _spender The address which will spend the funds. /// @param _subtractedValue The amount of tokens to decrease the allowance by. function decreaseApproval(address _spender, uint _subtractedValue) public returns (bool) { uint oldValue = allowed[msg.sender][_spender]; if (_subtractedValue > oldValue) { allowed[msg.sender][_spender] = 0; } else { allowed[msg.sender][_spender] = oldValue.sub(_subtractedValue); } Approval(msg.sender, _spender, allowed[msg.sender][_spender]); return true; } /// @dev Croupier uses this method to set deposited credits of a player for sale /// @param _user The address of the user /// @param _extra Additional off-chain credit (AirDrop support), so that croupier could have frozen more than the user had invested function freezeDeposit(address _user, uint256 _extra) onlyCroupier public { require(depositOf[_user] > 0 || _extra > 0); uint256 deposit = depositOf[_user]; depositOf[_user] = depositOf[_user].sub(deposit); totalDeposit = totalDeposit.sub(deposit); uint256 depositWithExtra = deposit.add(_extra); frozenPool = frozenPool.add(depositWithExtra); DepositFrozen(_user, depositWithExtra); } /// @dev Croupier uses this method stop selling user's tokens and return them to normal deposit /// @param _user The user whose deposit is being unfrozen /// @param _value The value to unfreeze according to Croupier's records (off-chain sale data) function unfreezeDeposit(address _user, uint256 _value) onlyCroupier public { require(_value > 0); require(frozenPool >= _value); depositOf[_user] = depositOf[_user].add(_value); totalDeposit = totalDeposit.add(_value); frozenPool = frozenPool.sub(_value); DepositUnfrozen(_user, depositOf[_user]); } /// @dev The Jackpot contract invokes this method when selling tokens from Croupier /// @param _to The recipient of the tokens /// @param _value The amount function transferFromCroupier(address _to, uint256 _value) onlyJackpot public { require(_value > 0); require(frozenPool >= _value); frozenPool = frozenPool.sub(_value); _transfer(croupier, _to, _value); } ////// /// @title Internal Methods // /// @dev Internal transfer function /// @param _from From address /// @param _to To address /// @param _value The value to transfer /// @return success function _transfer(address _from, address _to, uint256 _value) internal returns (bool) { require(_to != address(0)); // Prevent transfer to 0x0 address require(balances[_from] >= _value); // Check if the sender has enough balances[_from] = balances[_from].sub(_value); // Subtract from the sender balances[_to] = balances[_to].add(_value); // Add the same to the recipient Transfer(_from, _to, _value); return true; } /// @dev Internal function for burning tokens /// @param _sender The token sender (whose tokens are being burned) /// @param _value The amount of tokens to burn function _burnFromAccount(address _sender, uint256 _value) internal { require(balances[_sender] >= _value); // Check if the sender has enough balances[_sender] = balances[_sender].sub(_value); // Subtract from the sender supply = supply.sub(_value); // Updates totalSupply Burn(_sender, _value); } } contract Jackpot is HouseOwned { using SafeMath for uint; enum Stages { InitialOffer, // ICO stage: forming the jackpot fund GameOn, // The game is running GameOver, // The jackpot is won, paying out the jackpot Aborted // ICO aborted, refunding investments } uint256 constant initialIcoTokenPrice = 4 finney; uint256 constant initialBetAmount = 10 finney; uint constant gameStartJackpotThreshold = 333 ether; uint constant icoTerminationTimeout = 48 hours; // These variables hold the values needed for minor prize checking: // - when they were last won (once the number reaches the corresponding amount, the // minor prize is won, and it should be reset) // - how much ether was bet since it was last won // `etherSince*` variables start with value of 1 and always have +1 in their value // so that the variables never go 0, for gas consumption consistency uint32 public totalBets = 0; uint256 public etherSince20 = 1; uint256 public etherSince50 = 1; uint256 public etherSince100 = 1; uint256 public pendingEtherForCroupier = 0; // ICO status uint32 public icoSoldTokens; uint256 public icoEndTime; // Jackpot status address public lastBetUser; uint256 public terminationTime; address public winner; uint256 public pendingJackpotForHouse; uint256 public pendingJackpotForWinner; // General configuration and stage address public croupier; Token public token; Stages public stage = Stages.InitialOffer; // Price state uint256 public currentIcoTokenPrice = initialIcoTokenPrice; uint256 public currentBetAmount = initialBetAmount; // Investment tracking for emergency ICO termination mapping (address => uint256) public investmentOf; uint256 public abortTime; ////// /// @title Modifiers // /// @dev Only Token modifier onlyToken { require(msg.sender == address(token)); _; } /// @dev Only Croupier modifier onlyCroupier { require(msg.sender == address(croupier)); _; } ////// /// @title Events // /// @dev Fired when tokens are sold for Ether in ICO event EtherIco(address indexed from, uint256 value, uint256 tokens); /// @dev Fired when a bid with Ether is made event EtherBet(address indexed from, uint256 value, uint256 dividends); /// @dev Fired when a bid with a Token is made event TokenBet(address indexed from); /// @dev Fired when a bidder wins a minor prize /// Type: 1: 20, 2: 50, 3: 100 event MinorPrizePayout(address indexed from, uint256 value, uint8 prizeType); /// @dev Fired when as a result of ether bid, tokens are sold from the Croupier's pool /// The parameters are who bought them, how many tokens, and for how much Ether they were sold event SoldTokensFromCroupier(address indexed from, uint256 value, uint256 tokens); /// @dev Fired when the jackpot is won event JackpotWon(address indexed from, uint256 value); ////// /// @title Constructor and Initialization // /// @dev The contract constructor /// @param _croupier The address of the trusted Croupier bot's account function Jackpot(address _croupier) HouseOwned() public { require(_croupier != 0x0); croupier = _croupier; // There are no bets (it even starts in ICO stage), so initialize // lastBetUser, just so that value is not zero and is meaningful // The game can't end until at least one bid is made, and once // a bid is made, this value is permanently overwritten. lastBetUser = _croupier; } /// @dev Function to set address of Token contract once after creation /// @param _token Address of the Token contract (JACK Token) function setToken(address _token) onlyHouse public { require(address(token) == 0x0); require(_token != address(this)); // Protection from admin's mistake token = Token(_token); } ////// /// @title Default Function // /// @dev The fallback function for receiving ether (bets) /// Action depends on stages: /// - ICO: just sell the tokens /// - Game: accept bets, award tokens, award minor (20, 50, 100) prizes /// - Game Over: pay out jackpot /// - Aborted: fail function() payable public { require(croupier != 0x0); require(address(token) != 0x0); require(stage != Stages.Aborted); uint256 tokens; if (stage == Stages.InitialOffer) { // First, check if the ICO is over. If it is, trigger the events and // refund sent ether bool started = checkGameStart(); if (started) { // Refund ether without failing the transaction // (because side-effect is needed) msg.sender.transfer(msg.value); return; } require(msg.value >= currentIcoTokenPrice); // THE PLAN // 1. [CHECK + EFFECT] Calculate how much times price, the investment amount is, // calculate how many tokens the investor is going to get // 2. [EFFECT] Log and count // 3. [EFFECT] Check game start conditions and maybe start the game // 4. [INT] Award the tokens // 5. [INT] Transfer 20% to house // 1. [CHECK + EFFECT] Checking the amount tokens = _icoTokensForEther(msg.value); // 2. [EFFECT] Log // Log the ICO event and count investment EtherIco(msg.sender, msg.value, tokens); investmentOf[msg.sender] = investmentOf[msg.sender].add( msg.value.sub(msg.value / 5) ); // 3. [EFFECT] Game start // Check if we have accumulated the jackpot amount required for game start if (icoEndTime == 0 && this.balance >= gameStartJackpotThreshold) { icoEndTime = now + icoTerminationTimeout; } // 4. [INT] Awarding tokens // Award the deserved tokens (if any) if (tokens > 0) { token.transfer(msg.sender, tokens); } // 5. [INT] House // House gets 20% of ICO according to the rules house.transfer(msg.value / 5); } else if (stage == Stages.GameOn) { // First, check if the game is over. If it is, trigger the events and // refund sent ether bool terminated = checkTermination(); if (terminated) { // Refund ether without failing the transaction // (because side-effect is needed) msg.sender.transfer(msg.value); return; } // Now processing an Ether bid require(msg.value >= currentBetAmount); // THE PLAN // 1. [CHECK] Calculate how much times min-bet, the bet amount is, // calculate how many tokens the player is going to get // 2. [CHECK] Check how much is sold from the Croupier's pool, and how much from Jackpot // 3. [EFFECT] Deposit 25% to the Croupier (for dividends and house's benefit) // 4. [EFFECT] Log and mark bid // 6. [INT] Check and reward (if won) minor (20, 100, 1000) prizes // 7. [EFFECT] Update bet amount // 8. [INT] Award the tokens // 1. [CHECK + EFFECT] Checking the bet amount and token reward tokens = _betTokensForEther(msg.value); // 2. [CHECK] Check how much is sold from the Croupier's pool, and how much from Jackpot // The priority is (1) Croupier, (2) Jackpot uint256 sellingFromJackpot = 0; uint256 sellingFromCroupier = 0; if (tokens > 0) { uint256 croupierPool = token.frozenPool(); uint256 jackpotPool = token.balanceOf(this); if (croupierPool == 0) { // Simple case: only Jackpot is selling sellingFromJackpot = tokens; if (sellingFromJackpot > jackpotPool) { sellingFromJackpot = jackpotPool; } } else if (jackpotPool == 0 || tokens <= croupierPool) { // Simple case: only Croupier is selling // either because Jackpot has 0, or because Croupier takes over // by priority and has enough tokens in its pool sellingFromCroupier = tokens; if (sellingFromCroupier > croupierPool) { sellingFromCroupier = croupierPool; } } else { // Complex case: both are selling now sellingFromCroupier = croupierPool; // (tokens > croupierPool) is guaranteed at this point sellingFromJackpot = tokens.sub(sellingFromCroupier); if (sellingFromJackpot > jackpotPool) { sellingFromJackpot = jackpotPool; } } } // 3. [EFFECT] Croupier deposit // Transfer a portion to the Croupier for dividend payout and house benefit // Dividends are a sum of: // + 25% of bet // + 50% of price of tokens sold from Jackpot (or just anything other than the bet and Croupier payment) // + 0% of price of tokens sold from Croupier // (that goes in SoldTokensFromCroupier instead) uint256 tokenValue = msg.value.sub(currentBetAmount); uint256 croupierSaleRevenue = 0; if (sellingFromCroupier > 0) { croupierSaleRevenue = tokenValue.div( sellingFromJackpot.add(sellingFromCroupier) ).mul(sellingFromCroupier); } uint256 jackpotSaleRevenue = tokenValue.sub(croupierSaleRevenue); uint256 dividends = (currentBetAmount.div(4)).add(jackpotSaleRevenue.div(2)); // 100% of money for selling from Croupier still goes to Croupier // so that it's later paid out to the selling user pendingEtherForCroupier = pendingEtherForCroupier.add(dividends.add(croupierSaleRevenue)); // 4. [EFFECT] Log and mark bid // Log the bet with actual amount charged (value less change) EtherBet(msg.sender, msg.value, dividends); lastBetUser = msg.sender; terminationTime = now + _terminationDuration(); // If anything was sold from Croupier, log it appropriately if (croupierSaleRevenue > 0) { SoldTokensFromCroupier(msg.sender, croupierSaleRevenue, sellingFromCroupier); } // 5. [INT] Minor prizes // Check for winning minor prizes _checkMinorPrizes(msg.sender, currentBetAmount); // 6. [EFFECT] Update bet amount _updateBetAmount(); // 7. [INT] Awarding tokens if (sellingFromJackpot > 0) { token.transfer(msg.sender, sellingFromJackpot); } if (sellingFromCroupier > 0) { token.transferFromCroupier(msg.sender, sellingFromCroupier); } } else if (stage == Stages.GameOver) { require(msg.sender == winner || msg.sender == house); if (msg.sender == winner) { require(pendingJackpotForWinner > 0); uint256 winnersPay = pendingJackpotForWinner; pendingJackpotForWinner = 0; msg.sender.transfer(winnersPay); } else if (msg.sender == house) { require(pendingJackpotForHouse > 0); uint256 housePay = pendingJackpotForHouse; pendingJackpotForHouse = 0; msg.sender.transfer(housePay); } } } // Croupier will call this function when the jackpot is won // If Croupier fails to call the function for any reason, house and winner // still can claim their jackpot portion by sending ether to Jackpot function payOutJackpot() onlyCroupier public { require(winner != 0x0); if (pendingJackpotForHouse > 0) { uint256 housePay = pendingJackpotForHouse; pendingJackpotForHouse = 0; house.transfer(housePay); } if (pendingJackpotForWinner > 0) { uint256 winnersPay = pendingJackpotForWinner; pendingJackpotForWinner = 0; winner.transfer(winnersPay); } } ////// /// @title Public Functions // /// @dev View function to check whether the game should be terminated /// Used as internal function by checkTermination, as well as by the /// Croupier bot, to check whether it should call checkTermination /// @return Whether the game should be terminated by timeout function shouldBeTerminated() public view returns (bool should) { return stage == Stages.GameOn && terminationTime != 0 && now > terminationTime; } /// @dev Check whether the game should be terminated, and if it should, terminate it /// @return Whether the game was terminated as the result function checkTermination() public returns (bool terminated) { if (shouldBeTerminated()) { stage = Stages.GameOver; winner = lastBetUser; // Flush amount due for Croupier immediately _flushEtherToCroupier(); // The rest should be claimed by the winner (except what house gets) JackpotWon(winner, this.balance); uint256 jackpot = this.balance; pendingJackpotForHouse = jackpot.div(5); pendingJackpotForWinner = jackpot.sub(pendingJackpotForHouse); return true; } return false; } /// @dev View function to check whether the game should be started /// Used as internal function by `checkGameStart`, as well as by the /// Croupier bot, to check whether it should call `checkGameStart` /// @return Whether the game should be started function shouldBeStarted() public view returns (bool should) { return stage == Stages.InitialOffer && icoEndTime != 0 && now > icoEndTime; } /// @dev Check whether the game should be started, and if it should, start it /// @return Whether the game was started as the result function checkGameStart() public returns (bool started) { if (shouldBeStarted()) { stage = Stages.GameOn; return true; } return false; } /// @dev Bet 1 token in the game /// The token has already been burned having passed all checks, so /// just process the bet of 1 token function betToken(address _user) onlyToken public { // Token bets can only be accepted in the game stage require(stage == Stages.GameOn); bool terminated = checkTermination(); if (terminated) { return; } TokenBet(_user); lastBetUser = _user; terminationTime = now + _terminationDuration(); // Check for winning minor prizes _checkMinorPrizes(_user, 0); } /// @dev Allows House to terminate ICO as an emergency measure function abort() onlyHouse public { require(stage == Stages.InitialOffer); stage = Stages.Aborted; abortTime = now; } /// @dev In case the ICO is emergency-terminated by House, allows investors /// to pull back the investments function claimRefund() public { require(stage == Stages.Aborted); require(investmentOf[msg.sender] > 0); uint256 payment = investmentOf[msg.sender]; investmentOf[msg.sender] = 0; msg.sender.transfer(payment); } /// @dev In case the ICO was terminated, allows House to kill the contract in 2 months /// after the termination date function killAborted() onlyHouse public { require(stage == Stages.Aborted); require(now > abortTime + 60 days); selfdestruct(house); } ////// /// @title Internal Functions // /// @dev Get current bid timer duration /// @return duration The duration function _terminationDuration() internal view returns (uint256 duration) { return (5 + 19200 / (100 + totalBets)) * 1 minutes; } /// @dev Updates the current ICO price according to the rules function _updateIcoPrice() internal { uint256 newIcoTokenPrice = currentIcoTokenPrice; if (icoSoldTokens < 10000) { newIcoTokenPrice = 4 finney; } else if (icoSoldTokens < 20000) { newIcoTokenPrice = 5 finney; } else if (icoSoldTokens < 30000) { newIcoTokenPrice = 5.3 finney; } else if (icoSoldTokens < 40000) { newIcoTokenPrice = 5.7 finney; } else { newIcoTokenPrice = 6 finney; } if (newIcoTokenPrice != currentIcoTokenPrice) { currentIcoTokenPrice = newIcoTokenPrice; } } /// @dev Updates the current bid price according to the rules function _updateBetAmount() internal { uint256 newBetAmount = 10 finney + (totalBets / 100) * 6 finney; if (newBetAmount != currentBetAmount) { currentBetAmount = newBetAmount; } } /// @dev Calculates how many tokens a user should get with a given Ether bid /// @param value The bid amount /// @return tokens The number of tokens function _betTokensForEther(uint256 value) internal view returns (uint256 tokens) { // One bet amount is for the bet itself, for the rest we will sell // tokens tokens = (value / currentBetAmount) - 1; if (tokens >= 1000) { tokens = tokens + tokens / 4; // +25% } else if (tokens >= 300) { tokens = tokens + tokens / 5; // +20% } else if (tokens >= 100) { tokens = tokens + tokens / 7; // ~ +14.3% } else if (tokens >= 50) { tokens = tokens + tokens / 10; // +10% } else if (tokens >= 20) { tokens = tokens + tokens / 20; // +5% } } /// @dev Calculates how many tokens a user should get with a given ICO transfer /// @param value The transfer amount /// @return tokens The number of tokens function _icoTokensForEther(uint256 value) internal returns (uint256 tokens) { // How many times the input is greater than current token price tokens = value / currentIcoTokenPrice; if (tokens >= 10000) { tokens = tokens + tokens / 4; // +25% } else if (tokens >= 5000) { tokens = tokens + tokens / 5; // +20% } else if (tokens >= 1000) { tokens = tokens + tokens / 7; // ~ +14.3% } else if (tokens >= 500) { tokens = tokens + tokens / 10; // +10% } else if (tokens >= 200) { tokens = tokens + tokens / 20; // +5% } // Checking if Jackpot has the tokens in reserve if (tokens > token.balanceOf(this)) { tokens = token.balanceOf(this); } icoSoldTokens += (uint32)(tokens); _updateIcoPrice(); } /// @dev Flush the currently pending Ether to Croupier function _flushEtherToCroupier() internal { if (pendingEtherForCroupier > 0) { uint256 willTransfer = pendingEtherForCroupier; pendingEtherForCroupier = 0; croupier.transfer(willTransfer); } } /// @dev Count the bid towards minor prize fund, check if the user /// wins a minor prize, and if they did, transfer the prize to them /// @param user The user in question /// @param value The bid value function _checkMinorPrizes(address user, uint256 value) internal { // First and foremost, increment the counters and ether counters totalBets ++; if (value > 0) { etherSince20 = etherSince20.add(value); etherSince50 = etherSince50.add(value); etherSince100 = etherSince100.add(value); } // Now actually check if the bets won uint256 etherPayout; if ((totalBets + 30) % 100 == 0) { // Won 100th etherPayout = (etherSince100 - 1) / 10; etherSince100 = 1; MinorPrizePayout(user, etherPayout, 3); user.transfer(etherPayout); return; } if ((totalBets + 5) % 50 == 0) { // Won 100th etherPayout = (etherSince50 - 1) / 10; etherSince50 = 1; MinorPrizePayout(user, etherPayout, 2); user.transfer(etherPayout); return; } if (totalBets % 20 == 0) { // Won 20th etherPayout = (etherSince20 - 1) / 10; etherSince20 = 1; _flushEtherToCroupier(); MinorPrizePayout(user, etherPayout, 1); user.transfer(etherPayout); return; } return; } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"constant":true,"inputs":[],"name":"supply","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"name","outputs":[{"name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_user","type":"address"},{"name":"_value","type":"uint256"}],"name":"unfreezeDeposit","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_spender","type":"address"},{"name":"_value","type":"uint256"}],"name":"approve","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_to","type":"address"},{"name":"_value","type":"uint256"}],"name":"transferFromCroupier","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"totalSupply","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_from","type":"address"},{"name":"_to","type":"address"},{"name":"_value","type":"uint256"}],"name":"transferFrom","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"","type":"address"}],"name":"depositOf","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"decimals","outputs":[{"name":"","type":"uint8"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_spender","type":"address"},{"name":"_subtractedValue","type":"uint256"}],"name":"decreaseApproval","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"jackpot","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"croupier","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_owner","type":"address"}],"name":"balanceOf","outputs":[{"name":"balance","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_jackpot","type":"address"}],"name":"setJackpot","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":"_to","type":"address"},{"name":"_value","type":"uint256"}],"name":"transfer","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_user","type":"address"},{"name":"_extra","type":"uint256"}],"name":"freezeDeposit","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_to","type":"address"},{"name":"_extra","type":"uint256"}],"name":"returnDeposit","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_spender","type":"address"},{"name":"_addedValue","type":"uint256"}],"name":"increaseApproval","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"_owner","type":"address"},{"name":"_spender","type":"address"}],"name":"allowance","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"frozenPool","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"totalDeposit","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"inputs":[],"payable":false,"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"name":"from","type":"address"},{"indexed":false,"name":"value","type":"uint256"}],"name":"Burn","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"from","type":"address"},{"indexed":false,"name":"value","type":"uint256"},{"indexed":false,"name":"direction","type":"uint8"},{"indexed":false,"name":"newDeposit","type":"uint256"}],"name":"Deposit","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"from","type":"address"},{"indexed":false,"name":"value","type":"uint256"}],"name":"DepositFrozen","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"from","type":"address"},{"indexed":false,"name":"value","type":"uint256"}],"name":"DepositUnfrozen","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"from","type":"address"},{"indexed":true,"name":"to","type":"address"},{"indexed":false,"name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"tokenOwner","type":"address"},{"indexed":true,"name":"spender","type":"address"},{"indexed":false,"name":"value","type":"uint256"}],"name":"Approval","type":"event"}]
Contract Creation Code
606060405234156200001057600080fd5b60008054600160a060020a03191633600160a060020a031617905560408051908101604052600a81527f4a41434b20546f6b656e000000000000000000000000000000000000000000006020820152600190805162000074929160200190620000cc565b5060408051908101604052600481527f4a41434b0000000000000000000000000000000000000000000000000000000060208201526002908051620000be929160200190620000cc565b50620f424060035562000171565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f106200010f57805160ff19168380011785556200013f565b828001600101855582156200013f579182015b828111156200013f57825182559160200191906001019062000122565b506200014d92915062000151565b5090565b6200016e91905b808211156200014d576000815560010162000158565b90565b6111ea80620001816000396000f30060606040526004361061010e5763ffffffff60e060020a600035041663047fc9aa811461011357806306fdde031461013857806308968426146101c2578063095ea7b3146101e65780631159f39b1461021c57806318160ddd1461023e57806323b872dd1461025157806323e3fbd514610279578063313ce5671461029857806366188463146102c15780636b31ee01146102e35780636b5c5f391461031257806370a08231146103255780637e95385c1461034457806395d89b4114610363578063a9059cbb14610376578063d009b2d614610398578063d29709fb146103ba578063d73dd623146103dc578063dd62ed3e146103fe578063eb44bb0414610423578063f6153ccd14610436575b600080fd5b341561011e57600080fd5b610126610449565b60405190815260200160405180910390f35b341561014357600080fd5b61014b61044f565b60405160208082528190810183818151815260200191508051906020019080838360005b8381101561018757808201518382015260200161016f565b50505050905090810190601f1680156101b45780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34156101cd57600080fd5b6101e4600160a060020a03600435166024356104ed565b005b34156101f157600080fd5b610208600160a060020a03600435166024356105e3565b604051901515815260200160405180910390f35b341561022757600080fd5b6101e4600160a060020a036004351660243561064f565b341561024957600080fd5b6101266106b9565b341561025c57600080fd5b610208600160a060020a03600435811690602435166044356106bf565b341561028457600080fd5b610126600160a060020a0360043516610841565b34156102a357600080fd5b6102ab610853565b60405160ff909116815260200160405180910390f35b34156102cc57600080fd5b610208600160a060020a0360043516602435610858565b34156102ee57600080fd5b6102f6610954565b604051600160a060020a03909116815260200160405180910390f35b341561031d57600080fd5b6102f6610963565b341561033057600080fd5b610126600160a060020a0360043516610972565b341561034f57600080fd5b6101e4600160a060020a036004351661098d565b341561036e57600080fd5b61014b610ad3565b341561038157600080fd5b610208600160a060020a0360043516602435610b3e565b34156103a357600080fd5b6101e4600160a060020a0360043516602435610ce6565b34156103c557600080fd5b6101e4600160a060020a0360043516602435610dfc565b34156103e757600080fd5b610208600160a060020a0360043516602435610f00565b341561040957600080fd5b610126600160a060020a0360043581169060243516610fa4565b341561042e57600080fd5b610126610fcf565b341561044157600080fd5b610126610fd5565b60035481565b60018054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156104e55780601f106104ba576101008083540402835291602001916104e5565b820191906000526020600020905b8154815290600101906020018083116104c857829003601f168201915b505050505081565b60055433600160a060020a0390811691161461050857600080fd5b6000811161051557600080fd5b6009548190101561052557600080fd5b600160a060020a03821660009081526007602052604090205461054e908263ffffffff610fdb16565b600160a060020a03831660009081526007602052604090205560085461057a908263ffffffff610fdb16565b600855600954610590908263ffffffff610ff116565b600955600160a060020a03821660008181526007602052604090819020547fb9c99e5e0faf66c0f2161937abf9bc55b8deea697165d288154d84169aac8afc915190815260200160405180910390a25050565b600160a060020a033381166000818152600a6020908152604080832094871680845294909152808220859055909291907f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9259085905190815260200160405180910390a350600192915050565b60045433600160a060020a0390811691161461066a57600080fd5b6000811161067757600080fd5b6009548190101561068757600080fd5b60095461069a908263ffffffff610ff116565b6009556005546106b490600160a060020a03168383611003565b505050565b60035490565b6000600160a060020a03831615156106d657600080fd5b600160a060020a0384166000908152600660205260409020548211156106fb57600080fd5b600160a060020a038085166000908152600a60209081526040808320339094168352929052205482111561072e57600080fd5b600160a060020a038416600090815260066020526040902054610757908363ffffffff610ff116565b600160a060020a03808616600090815260066020526040808220939093559085168152205461078c908363ffffffff610fdb16565b600160a060020a038085166000908152600660209081526040808320949094558783168252600a81528382203390931682529190915220546107d4908363ffffffff610ff116565b600160a060020a038086166000818152600a6020908152604080832033861684529091529081902093909355908516917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9085905190815260200160405180910390a35060019392505050565b60076020526000908152604090205481565b600081565b600160a060020a033381166000908152600a60209081526040808320938616835292905290812054808311156108b557600160a060020a033381166000908152600a602090815260408083209388168352929052908120556108ec565b6108c5818463ffffffff610ff116565b600160a060020a033381166000908152600a60209081526040808320938916835292905220555b600160a060020a033381166000818152600a602090815260408083209489168084529490915290819020547f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925915190815260200160405180910390a3600191505b5092915050565b600454600160a060020a031681565b600554600160a060020a031681565b600160a060020a031660009081526006602052604090205490565b6000805433600160a060020a039081169116146109a957600080fd5b600454600160a060020a0316156109bf57600080fd5b30600160a060020a031682600160a060020a0316141515156109e057600080fd5b6004805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a03841617905560035460289060008054600160a060020a039081168252600660205260408083209490930493849055600354600480548316845284842091869003909155549394509290921691636b5c5f399151602001526040518163ffffffff1660e060020a028152600401602060405180830381600087803b1515610a8857600080fd5b6102c65a03f11515610a9957600080fd5b50505060405180516005805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a0392909216919091179055505050565b60028054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156104e55780601f106104ba576101008083540402835291602001916104e5565b6000604036604414610b4c57fe5b600454600160a060020a03161515610b6357600080fd5b600554600160a060020a03161515610b7a57600080fd5b600454600160a060020a0385811691161415610c0857610b9b3360016110ff565b600454600160a060020a031663f9c780973360405160e060020a63ffffffff8416028152600160a060020a039091166004820152602401600060405180830381600087803b1515610beb57600080fd5b6102c65a03f11515610bfc57600080fd5b5050506001915061094d565b600554600160a060020a038581169116148015610c34575060005433600160a060020a03908116911614155b15610cd357600160a060020a0333166000908152600760205260409020805484019055600854610c6a908463ffffffff610fdb16565b600855600160a060020a033316600081815260076020526040808220547f999cbaf5148925f92ba8d941276e0a13cadad3823058b47817fb1a108753105792879290919051808481526020018360ff168152602001828152602001935050505060405180910390a25b610cde338585611003565b949350505050565b600554600090819033600160a060020a03908116911614610d0657600080fd5b600160a060020a0384166000908152600760205260408120541180610d2b5750600083115b1515610d3657600080fd5b600160a060020a0384166000908152600760205260409020549150610d61828063ffffffff610ff116565b600160a060020a038516600090815260076020526040902055600854610d8d908363ffffffff610ff116565b600855610da0828463ffffffff610fdb16565b600954909150610db6908263ffffffff610fdb16565b600955600160a060020a0384167f05b4fe5f187981f35f0f00f0cb29bb42a726ce71132609155ed6d42fb8eebb888260405190815260200160405180910390a250505050565b60055460009033600160a060020a03908116911614610e1a57600080fd5b600160a060020a0383166000908152600760205260408120541180610e3f5750600082115b1515610e4a57600080fd5b50600160a060020a03821660009081526007602052604081208054919055600854610e7b908263ffffffff610ff116565b600855600554610ea490600160a060020a031684610e9f848663ffffffff610fdb16565b611003565b5082600160a060020a03167f999cbaf5148925f92ba8d941276e0a13cadad3823058b47817fb1a10875310578260016000604051808481526020018360ff168152602001828152602001935050505060405180910390a2505050565b600160a060020a033381166000908152600a60209081526040808320938616835292905290812054610f38908363ffffffff610fdb16565b600160a060020a033381166000818152600a602090815260408083209489168084529490915290819020849055919290917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591905190815260200160405180910390a350600192915050565b600160a060020a039182166000908152600a6020908152604080832093909416825291909152205490565b60095481565b60085481565b600082820183811015610fea57fe5b9392505050565b600082821115610ffd57fe5b50900390565b6000600160a060020a038316151561101a57600080fd5b600160a060020a0384166000908152600660205260409020548290101561104057600080fd5b600160a060020a038416600090815260066020526040902054611069908363ffffffff610ff116565b600160a060020a03808616600090815260066020526040808220939093559085168152205461109e908363ffffffff610fdb16565b600160a060020a03808516600081815260066020526040908190209390935591908616907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9085905190815260200160405180910390a35060019392505050565b600160a060020a0382166000908152600660205260409020548190101561112557600080fd5b600160a060020a03821660009081526006602052604090205461114e908263ffffffff610ff116565b600160a060020a03831660009081526006602052604090205560035461117a908263ffffffff610ff116565b600355600160a060020a0382167fcc16f5dbb4873280815c1ee09dbd06736cffcc184412cf7a71a0fdb75d397ca58260405190815260200160405180910390a250505600a165627a7a723058205e20faa37cf25032f2deb856869f27de24ff0d19b98fe1a21026b2aa09e7a6480029
Deployed Bytecode
0x60606040526004361061010e5763ffffffff60e060020a600035041663047fc9aa811461011357806306fdde031461013857806308968426146101c2578063095ea7b3146101e65780631159f39b1461021c57806318160ddd1461023e57806323b872dd1461025157806323e3fbd514610279578063313ce5671461029857806366188463146102c15780636b31ee01146102e35780636b5c5f391461031257806370a08231146103255780637e95385c1461034457806395d89b4114610363578063a9059cbb14610376578063d009b2d614610398578063d29709fb146103ba578063d73dd623146103dc578063dd62ed3e146103fe578063eb44bb0414610423578063f6153ccd14610436575b600080fd5b341561011e57600080fd5b610126610449565b60405190815260200160405180910390f35b341561014357600080fd5b61014b61044f565b60405160208082528190810183818151815260200191508051906020019080838360005b8381101561018757808201518382015260200161016f565b50505050905090810190601f1680156101b45780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34156101cd57600080fd5b6101e4600160a060020a03600435166024356104ed565b005b34156101f157600080fd5b610208600160a060020a03600435166024356105e3565b604051901515815260200160405180910390f35b341561022757600080fd5b6101e4600160a060020a036004351660243561064f565b341561024957600080fd5b6101266106b9565b341561025c57600080fd5b610208600160a060020a03600435811690602435166044356106bf565b341561028457600080fd5b610126600160a060020a0360043516610841565b34156102a357600080fd5b6102ab610853565b60405160ff909116815260200160405180910390f35b34156102cc57600080fd5b610208600160a060020a0360043516602435610858565b34156102ee57600080fd5b6102f6610954565b604051600160a060020a03909116815260200160405180910390f35b341561031d57600080fd5b6102f6610963565b341561033057600080fd5b610126600160a060020a0360043516610972565b341561034f57600080fd5b6101e4600160a060020a036004351661098d565b341561036e57600080fd5b61014b610ad3565b341561038157600080fd5b610208600160a060020a0360043516602435610b3e565b34156103a357600080fd5b6101e4600160a060020a0360043516602435610ce6565b34156103c557600080fd5b6101e4600160a060020a0360043516602435610dfc565b34156103e757600080fd5b610208600160a060020a0360043516602435610f00565b341561040957600080fd5b610126600160a060020a0360043581169060243516610fa4565b341561042e57600080fd5b610126610fcf565b341561044157600080fd5b610126610fd5565b60035481565b60018054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156104e55780601f106104ba576101008083540402835291602001916104e5565b820191906000526020600020905b8154815290600101906020018083116104c857829003601f168201915b505050505081565b60055433600160a060020a0390811691161461050857600080fd5b6000811161051557600080fd5b6009548190101561052557600080fd5b600160a060020a03821660009081526007602052604090205461054e908263ffffffff610fdb16565b600160a060020a03831660009081526007602052604090205560085461057a908263ffffffff610fdb16565b600855600954610590908263ffffffff610ff116565b600955600160a060020a03821660008181526007602052604090819020547fb9c99e5e0faf66c0f2161937abf9bc55b8deea697165d288154d84169aac8afc915190815260200160405180910390a25050565b600160a060020a033381166000818152600a6020908152604080832094871680845294909152808220859055909291907f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9259085905190815260200160405180910390a350600192915050565b60045433600160a060020a0390811691161461066a57600080fd5b6000811161067757600080fd5b6009548190101561068757600080fd5b60095461069a908263ffffffff610ff116565b6009556005546106b490600160a060020a03168383611003565b505050565b60035490565b6000600160a060020a03831615156106d657600080fd5b600160a060020a0384166000908152600660205260409020548211156106fb57600080fd5b600160a060020a038085166000908152600a60209081526040808320339094168352929052205482111561072e57600080fd5b600160a060020a038416600090815260066020526040902054610757908363ffffffff610ff116565b600160a060020a03808616600090815260066020526040808220939093559085168152205461078c908363ffffffff610fdb16565b600160a060020a038085166000908152600660209081526040808320949094558783168252600a81528382203390931682529190915220546107d4908363ffffffff610ff116565b600160a060020a038086166000818152600a6020908152604080832033861684529091529081902093909355908516917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9085905190815260200160405180910390a35060019392505050565b60076020526000908152604090205481565b600081565b600160a060020a033381166000908152600a60209081526040808320938616835292905290812054808311156108b557600160a060020a033381166000908152600a602090815260408083209388168352929052908120556108ec565b6108c5818463ffffffff610ff116565b600160a060020a033381166000908152600a60209081526040808320938916835292905220555b600160a060020a033381166000818152600a602090815260408083209489168084529490915290819020547f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925915190815260200160405180910390a3600191505b5092915050565b600454600160a060020a031681565b600554600160a060020a031681565b600160a060020a031660009081526006602052604090205490565b6000805433600160a060020a039081169116146109a957600080fd5b600454600160a060020a0316156109bf57600080fd5b30600160a060020a031682600160a060020a0316141515156109e057600080fd5b6004805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a03841617905560035460289060008054600160a060020a039081168252600660205260408083209490930493849055600354600480548316845284842091869003909155549394509290921691636b5c5f399151602001526040518163ffffffff1660e060020a028152600401602060405180830381600087803b1515610a8857600080fd5b6102c65a03f11515610a9957600080fd5b50505060405180516005805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a0392909216919091179055505050565b60028054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156104e55780601f106104ba576101008083540402835291602001916104e5565b6000604036604414610b4c57fe5b600454600160a060020a03161515610b6357600080fd5b600554600160a060020a03161515610b7a57600080fd5b600454600160a060020a0385811691161415610c0857610b9b3360016110ff565b600454600160a060020a031663f9c780973360405160e060020a63ffffffff8416028152600160a060020a039091166004820152602401600060405180830381600087803b1515610beb57600080fd5b6102c65a03f11515610bfc57600080fd5b5050506001915061094d565b600554600160a060020a038581169116148015610c34575060005433600160a060020a03908116911614155b15610cd357600160a060020a0333166000908152600760205260409020805484019055600854610c6a908463ffffffff610fdb16565b600855600160a060020a033316600081815260076020526040808220547f999cbaf5148925f92ba8d941276e0a13cadad3823058b47817fb1a108753105792879290919051808481526020018360ff168152602001828152602001935050505060405180910390a25b610cde338585611003565b949350505050565b600554600090819033600160a060020a03908116911614610d0657600080fd5b600160a060020a0384166000908152600760205260408120541180610d2b5750600083115b1515610d3657600080fd5b600160a060020a0384166000908152600760205260409020549150610d61828063ffffffff610ff116565b600160a060020a038516600090815260076020526040902055600854610d8d908363ffffffff610ff116565b600855610da0828463ffffffff610fdb16565b600954909150610db6908263ffffffff610fdb16565b600955600160a060020a0384167f05b4fe5f187981f35f0f00f0cb29bb42a726ce71132609155ed6d42fb8eebb888260405190815260200160405180910390a250505050565b60055460009033600160a060020a03908116911614610e1a57600080fd5b600160a060020a0383166000908152600760205260408120541180610e3f5750600082115b1515610e4a57600080fd5b50600160a060020a03821660009081526007602052604081208054919055600854610e7b908263ffffffff610ff116565b600855600554610ea490600160a060020a031684610e9f848663ffffffff610fdb16565b611003565b5082600160a060020a03167f999cbaf5148925f92ba8d941276e0a13cadad3823058b47817fb1a10875310578260016000604051808481526020018360ff168152602001828152602001935050505060405180910390a2505050565b600160a060020a033381166000908152600a60209081526040808320938616835292905290812054610f38908363ffffffff610fdb16565b600160a060020a033381166000818152600a602090815260408083209489168084529490915290819020849055919290917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591905190815260200160405180910390a350600192915050565b600160a060020a039182166000908152600a6020908152604080832093909416825291909152205490565b60095481565b60085481565b600082820183811015610fea57fe5b9392505050565b600082821115610ffd57fe5b50900390565b6000600160a060020a038316151561101a57600080fd5b600160a060020a0384166000908152600660205260409020548290101561104057600080fd5b600160a060020a038416600090815260066020526040902054611069908363ffffffff610ff116565b600160a060020a03808616600090815260066020526040808220939093559085168152205461109e908363ffffffff610fdb16565b600160a060020a03808516600081815260066020526040908190209390935591908616907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9085905190815260200160405180910390a35060019392505050565b600160a060020a0382166000908152600660205260409020548190101561112557600080fd5b600160a060020a03821660009081526006602052604090205461114e908263ffffffff610ff116565b600160a060020a03831660009081526006602052604090205560035461117a908263ffffffff610ff116565b600355600160a060020a0382167fcc16f5dbb4873280815c1ee09dbd06736cffcc184412cf7a71a0fdb75d397ca58260405190815260200160405180910390a250505600a165627a7a723058205e20faa37cf25032f2deb856869f27de24ff0d19b98fe1a21026b2aa09e7a6480029
Swarm Source
bzzr://5e20faa37cf25032f2deb856869f27de24ff0d19b98fe1a21026b2aa09e7a648
Loading...
Loading
Loading...
Loading
[ Download: CSV Export ]
[ 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.