Contract 0x91f273b7A28F5169FD7B7995A54B767cA797BC63

 

TxHash Block Age From To Value [TxFee]
0x951a93fdd165917ba38569c4776b6a55d0e774b8dfdf61a901ddb197a5bb12e174176671 hr 6 mins ago0x7803ad3c3389431c61131391344f486ac7e3eba1 IN  0x91f273b7a28f5169fd7b7995a54b767ca797bc630 Ether0.000442477
0x53291eb5371b3a1af9cea413bc5987fed8bc4575e83407537be0c558755652cb74174781 hr 46 mins ago0x700970c428867df1f415f6186421075c009e8b7d IN  0x91f273b7a28f5169fd7b7995a54b767ca797bc630 Ether0.000380034
0xe6d2d41035f5bd68352f319ecb3540c6df71888f2841e9f6e5f95e97de5ef23f74172742 hrs 26 mins ago0x3ce98b0b187cb00d327709c8a8d33c448ee9846d IN  0x91f273b7a28f5169fd7b7995a54b767ca797bc630 Ether0.000299065
0x6aa5e8c873c6f9ec1dbf13842852988b4765788e9c2bc682f1dd122312857f1274167304 hrs 30 mins ago0x700970c428867df1f415f6186421075c009e8b7d IN  0x91f273b7a28f5169fd7b7995a54b767ca797bc630 Ether0.000312138
0x6941fe08625a83c0fde7309864fd61ebea80ff8a0985d293a9aa587f228b263074167274 hrs 30 mins ago0x756d147a77e67d6c6b1877632ce9c1af3217045d IN  0x91f273b7a28f5169fd7b7995a54b767ca797bc630 Ether0.000202476
0xc09bb3756a0aa6742160ed21bde0bd25faac4ec85f75f77be794befdb161176c74163715 hrs 49 mins ago0x51c6be23cceaf4a28bea461832ab90182ff51fad IN  0x91f273b7a28f5169fd7b7995a54b767ca797bc630 Ether0.000228696
0xe5e2684d1d77bc1de9f615c2bdbb34462c432fad515e8e8de27585fdbf89f54974159307 hrs 26 mins ago0x441c12c33db617e935d883e7b098256a29cbdf21 IN  0x91f273b7a28f5169fd7b7995a54b767ca797bc630 Ether0.000313691
0x7871d30255153c616a25768d169db0ff267fcfeff4505434b0af45fcc3df8ea774157558 hrs 6 mins ago0x7a945f5664e00b1f6f9db869313e780e69bb4504 IN  0x91f273b7a28f5169fd7b7995a54b767ca797bc630 Ether0.000373705
0x512a6dac793cc27b5d1fef680b88f1459a7f3825fe394049892a58a35bf0b4d174154059 hrs 26 mins ago0xffce487f04ac9de9515d54f6e7cb66baac420e80 IN  0x91f273b7a28f5169fd7b7995a54b767ca797bc630 Ether0.000239252
0x843e5bdc9c77899ee458431a3d946ad3dd681a15aa4ff3fc90e6b18c5dff8b6874153949 hrs 29 mins ago0x7686b3ca1ea3c8e106c2c51a9abbd8ca628764dc IN  0x91f273b7a28f5169fd7b7995a54b767ca797bc630 Ether0.000174816
0x78e05e02ccc739a6b173b8dddc2acd468aea0bba31172013f5527939100ed60274153219 hrs 47 mins ago0xf1d596307f41b7d8f33a165af9a8b64f1c17cda0 IN  0x91f273b7a28f5169fd7b7995a54b767ca797bc630 Ether0.00035644
0x314f8d13820c9ad63e4befa9a8b6ac8d4bf4411eadfb6586e3dd0986b035b297741510310 hrs 36 mins ago0x8acfd4746468b029f6c1140eb37d398fefd9c78f IN  0x91f273b7a28f5169fd7b7995a54b767ca797bc630 Ether0.00026733
0x190bc50fa55caf00c60e9302c94f8186581dc5797b3b3b5a9d456f027d05d083741505610 hrs 47 mins ago0x42080cb27e8eefebf303d81fcad1fd54a0c957e7 IN  0x91f273b7a28f5169fd7b7995a54b767ca797bc630 Ether0.000179439
0xb1fae73cada6d67de2070885c62b1b84363f0121511a9da43de5a975b5600c95741470512 hrs 5 mins ago0xc89cb7ef5cfcdfc4af5499271e3c7ce877631fde IN  0x91f273b7a28f5169fd7b7995a54b767ca797bc630 Ether0.000179439
0x3e1a115042441f08c43cc8f20b4329ca3c068ec8058a855cd0951a7d299f4a25741453212 hrs 46 mins ago0x6b939bcf4007a283749e751497c24fa514901e19 IN  0x91f273b7a28f5169fd7b7995a54b767ca797bc630 Ether0.000189825
0x0c28dbc9990d145cd317d383a50e8ab7cfe323cbe307327ce2c78c0ec1fe20ea741445513 hrs 4 mins ago0x42080cb27e8eefebf303d81fcad1fd54a0c957e7 IN  0x91f273b7a28f5169fd7b7995a54b767ca797bc630 Ether0.000267138
0xa647cf5eaa42ae106a9c225c9d4252891100a8a86effa9cc09c795a6a9bb2b3c741445213 hrs 5 mins ago0x3f6ab47186f3c7ae472336dfe8e84c33251d5694 IN  0x91f273b7a28f5169fd7b7995a54b767ca797bc630 Ether0.000198066
0x5082fbfc1fa08e32ab9a153927e44a62215e96654facb802a8a4cd0b009a06c1741437213 hrs 24 mins ago0x3b157e629f65b8fe279d6d38a81e88617356b6b6 IN  0x91f273b7a28f5169fd7b7995a54b767ca797bc630 Ether0.00013092
0x62c3078ba2adb63f3ee66528ecae5a43d08f8d51cebcb9de53f64813e8ecd70f741416914 hrs 6 mins ago0xed3a1af1df774c4d45293f2769dacb980adf5e49 IN  0x91f273b7a28f5169fd7b7995a54b767ca797bc630 Ether0.0002214625
0x228e6a66251e43c779e02464216b4497902e24bc53c4d283466562dec374d3d1741400614 hrs 41 mins ago0x73a2e87b56ce3081551fbf5f4d0f183086f99326 IN  0x91f273b7a28f5169fd7b7995a54b767ca797bc630 Ether0.000364385
0xceb8cc5dd2978e19e65fe3846bd5f54649b6ed55e5235163782004b9db7ff11c741400414 hrs 42 mins ago0x0884fefc75e45db94504535b4070840f61454b3e IN  0x91f273b7a28f5169fd7b7995a54b767ca797bc630 Ether0.000224777
0x606db5ff873003e111584a45362b4eb707dd6a9a76cf91df5d0f6d68172165f4741393914 hrs 57 mins ago0xae037c5b62f9483f23302dd70e569672ea75b4cc IN  0x91f273b7a28f5169fd7b7995a54b767ca797bc630 Ether0.000274207
0x62f031bab785844a0802a92910e9dd267533d7d7c2c3eb4f8bacadec4b7b0b75741393614 hrs 58 mins ago0xf0c168d335f06c4433f66cbebcecca241a3b1539 IN  0x91f273b7a28f5169fd7b7995a54b767ca797bc630 Ether0.0002373846
0x7f3188efa34f4387184af1d7acd51dbf9d6746e4b9fe81b5e255a24b9c8df49a741392115 hrs 1 min ago0xbc88e4b143965354768c806279aeedafa60b52de IN  0x91f273b7a28f5169fd7b7995a54b767ca797bc630 Ether0.0001573344
0xb2db00623800dbc65e4386d673ce025dd477b79804750d192ca62a4423c79083741390215 hrs 3 mins ago0xbc88e4b143965354768c806279aeedafa60b52de IN  0x91f273b7a28f5169fd7b7995a54b767ca797bc630 Ether0.0002172048
[ Download CSV Export 

Internal Transactions as a result of Contract Execution

Parent TxHash Block Age From To Value

Contract Source Code Verified (Exact Match)

Contract Name:
EdgelessCasino

Compiler Version
v0.4.21+commit.dfe3193c

Optimization Enabled:
Yes

Runs (Optimizer):
200

Contract Source Code

/**
 * The edgeless casino contract v2 holds the players's funds and provides state channel functionality.
 * The casino has at no time control over the players's funds.
 * State channels can be updated and closed from both parties: the player and the casino.
 * author: Julia Altenried
 **/

pragma solidity ^0.4.21;

contract SafeMath {

	function safeSub(uint a, uint b) pure internal returns(uint) {
		assert(b <= a);
		return a - b;
	}
	
	function safeSub(int a, int b) pure internal returns(int) {
		if(b < 0) assert(a - b > a);
		else assert(a - b <= a);
		return a - b;
	}

	function safeAdd(uint a, uint b) pure internal returns(uint) {
		uint c = a + b;
		assert(c >= a && c >= b);
		return c;
	}

	function safeMul(uint a, uint b) pure internal returns (uint) {
		uint c = a * b;
		assert(a == 0 || c / a == b);
		return c;
	}
}


contract Token {
	function transferFrom(address sender, address receiver, uint amount) public returns(bool success);

	function transfer(address receiver, uint amount) public returns(bool success);

	function balanceOf(address holder) public view returns(uint);
}

contract Owned {
  address public owner;
  modifier onlyOwner {
    require(msg.sender == owner);
    _;
  }

  function Owned() public{
    owner = msg.sender;
  }

}

/** owner should be able to close the contract is nobody has been using it for at least 30 days */
contract Mortal is Owned {
	/** contract can be closed by the owner anytime after this timestamp if non-zero */
	uint public closeAt;
	/** the edgeless token contract */
	Token edg;
	
	function Mortal(address tokenContract) internal{
		edg = Token(tokenContract);
	}
	/**
	* lets the owner close the contract if there are no player funds on it or if nobody has been using it for at least 30 days
	*/
  function closeContract(uint playerBalance) internal{
		if(closeAt == 0) closeAt = now + 30 days;
		if(closeAt < now || playerBalance == 0){
			edg.transfer(owner, edg.balanceOf(address(this)));
			selfdestruct(owner);
		} 
  }

	/**
	* in case close has been called accidentally.
	**/
	function open() onlyOwner public{
		closeAt = 0;
	}

	/**
	* make sure the contract is not in process of being closed.
	**/
	modifier isAlive {
		require(closeAt == 0);
		_;
	}

	/**
	* delays the time of closing.
	**/
	modifier keepAlive {
		if(closeAt > 0) closeAt = now + 30 days;
		_;
	}
}

contract RequiringAuthorization is Mortal {
	/** indicates if an address is authorized to act in the casino's name  */
	mapping(address => bool) public authorized;
	/** tells if an address is allowed to receive funds from the bankroll **/
	mapping(address => bool) public allowedReceiver;

	modifier onlyAuthorized {
		require(authorized[msg.sender]);
		_;
	}

	/**
	 * Constructor. Authorize the owner.
	 * */
	function RequiringAuthorization() internal {
		authorized[msg.sender] = true;
		allowedReceiver[msg.sender] = true;
	}

	/**
	 * authorize a address to call game functions and set configs.
	 * @param addr the address to be authorized
	 **/
	function authorize(address addr) public onlyOwner {
		authorized[addr] = true;
	}

	/**
	 * deauthorize a address to call game functions and set configs.
	 * @param addr the address to be deauthorized
	 **/
	function deauthorize(address addr) public onlyOwner {
		authorized[addr] = false;
	}

	/**
	 * allow authorized wallets to withdraw funds from the bonkroll to this address
	 * @param receiver the receiver's address
	 * */
	function allowReceiver(address receiver) public onlyOwner {
		allowedReceiver[receiver] = true;
	}

	/**
	 * disallow authorized wallets to withdraw funds from the bonkroll to this address
	 * @param receiver the receiver's address
	 * */
	function disallowReceiver(address receiver) public onlyOwner {
		allowedReceiver[receiver] = false;
	}

	/**
	 * changes the owner of the contract. revokes authorization of the old owner and authorizes the new one.
	 * @param newOwner the address of the new owner
	 * */
	function changeOwner(address newOwner) public onlyOwner {
		deauthorize(owner);
		authorize(newOwner);
		disallowReceiver(owner);
		allowReceiver(newOwner);
		owner = newOwner;
	}
}

contract ChargingGas is RequiringAuthorization, SafeMath {
	/** 1 EDG has 5 decimals **/
	uint public constant oneEDG = 100000;
	/** the price per kgas and GWei in tokens (with decimals) */
	uint public gasPrice;
	/** the amount of gas used per transaction in kGas */
	mapping(bytes4 => uint) public gasPerTx;
	/** the number of tokens (5 decimals) payed by the users to cover the gas cost */
	uint public gasPayback;
	
	function ChargingGas(uint kGasPrice) internal{
		//deposit, withdrawFor, updateChannel, updateBatch, transferToNewContract
	    bytes4[5] memory signatures = [bytes4(0x3edd1128),0x9607610a, 0xde48ff52, 0xc97b6d1f, 0x6bf06fde];
	    //amount of gas consumed by the above methods in GWei
	    uint[5] memory gasUsage = [uint(146), 100, 65, 50, 85];
	    setGasUsage(signatures, gasUsage);
	    setGasPrice(kGasPrice);
	}
	/**
	 * sets the amount of gas consumed by methods with the given sigantures.
	 * only called from the edgeless casino constructor.
	 * @param signatures an array of method-signatures
	 *        gasNeeded  the amount of gas consumed by these methods
	 * */
	function setGasUsage(bytes4[5] signatures, uint[5] gasNeeded) public onlyOwner {
		require(signatures.length == gasNeeded.length);
		for (uint8 i = 0; i < signatures.length; i++)
			gasPerTx[signatures[i]] = gasNeeded[i];
	}

	/**
	 * updates the price per 1000 gas in EDG.
	 * @param price the new gas price (with decimals, max 0.1 EDG)
	 **/
	function setGasPrice(uint price) public onlyAuthorized {
		require(price < oneEDG/10);
		gasPrice = price;
	}

	/**
	 * returns the gas cost of the called function.
	 * */
	function getGasCost() internal view returns(uint) {
		return safeMul(safeMul(gasPerTx[msg.sig], gasPrice), tx.gasprice) / 1000000000;
	}

}


contract CasinoBank is ChargingGas {
	/** the total balance of all players with virtual decimals **/
	uint public playerBalance;
	/** the balance per player in edgeless tokens with virtual decimals */
	mapping(address => uint) public balanceOf;
	/** in case the user wants/needs to call the withdraw function from his own wallet, he first needs to request a withdrawal */
	mapping(address => uint) public withdrawAfter;
	/** a number to count withdrawal signatures to ensure each signature is different even if withdrawing the same amount to the same address */
	mapping(address => uint) public withdrawCount;
	/** the maximum amount of tokens the user is allowed to deposit (with decimals) */
	uint public maxDeposit;
	/** the maximum withdrawal of tokens the user is allowed to withdraw on one day (only enforced when the tx is not sent from an authorized wallet) **/
	uint public maxWithdrawal;
	/** waiting time for withdrawal if not requested via the server **/
	uint public waitingTime;
	/** the address of the predecessor **/
	address public predecessor;

	/** informs listeners how many tokens were deposited for a player */
	event Deposit(address _player, uint _numTokens, uint _gasCost);
	/** informs listeners how many tokens were withdrawn from the player to the receiver address */
	event Withdrawal(address _player, address _receiver, uint _numTokens, uint _gasCost);
	
	
	/**
	 * Constructor.
	 * @param depositLimit    the maximum deposit allowed
	 *		  predecessorAddr the address of the predecessing contract
	 * */
	function CasinoBank(uint depositLimit, address predecessorAddr) internal {
		maxDeposit = depositLimit * oneEDG;
		maxWithdrawal = maxDeposit;
		waitingTime = 24 hours;
		predecessor = predecessorAddr;
	}

	/**
	 * accepts deposits for an arbitrary address.
	 * retrieves tokens from the message sender and adds them to the balance of the specified address.
	 * edgeless tokens do not have any decimals, but are represented on this contract with decimals.
	 * @param receiver  address of the receiver
	 *        numTokens number of tokens to deposit (0 decimals)
	 *				 chargeGas indicates if the gas cost is subtracted from the user's edgeless token balance
	 **/
	function deposit(address receiver, uint numTokens, bool chargeGas) public isAlive {
		require(numTokens > 0);
		uint value = safeMul(numTokens, oneEDG);
		uint gasCost;
		if (chargeGas) {
			gasCost = getGasCost();
			value = safeSub(value, gasCost);
			gasPayback = safeAdd(gasPayback, gasCost);
		}
		uint newBalance = safeAdd(balanceOf[receiver], value);
		require(newBalance <= maxDeposit);
		assert(edg.transferFrom(msg.sender, address(this), numTokens));
		balanceOf[receiver] = newBalance;
		playerBalance = safeAdd(playerBalance, value);
		emit Deposit(receiver, numTokens, gasCost);
	}

	/**
	 * If the user wants/needs to withdraw his funds himself, he needs to request the withdrawal first.
	 * This method sets the earliest possible withdrawal date to 'waitingTime from now (default 90m, but up to 24h).
	 * Reason: The user should not be able to withdraw his funds, while the the last game methods have not yet been mined.
	 **/
	function requestWithdrawal() public {
		withdrawAfter[msg.sender] = now + waitingTime;
	}

	/**
	 * In case the user requested a withdrawal and changes his mind.
	 * Necessary to be able to continue playing.
	 **/
	function cancelWithdrawalRequest() public {
		withdrawAfter[msg.sender] = 0;
	}

	/**
	 * withdraws an amount from the user balance if the waiting time passed since the request.
	 * @param amount the amount of tokens to withdraw
	 **/
	function withdraw(uint amount) public keepAlive {
		require(amount <= maxWithdrawal);
		require(withdrawAfter[msg.sender] > 0 && now > withdrawAfter[msg.sender]);
		withdrawAfter[msg.sender] = 0;
		uint value = safeMul(amount, oneEDG);
		balanceOf[msg.sender] = safeSub(balanceOf[msg.sender], value);
		playerBalance = safeSub(playerBalance, value);
		assert(edg.transfer(msg.sender, amount));
		emit Withdrawal(msg.sender, msg.sender, amount, 0);
	}

	/**
	 * lets the owner withdraw from the bankroll
	 * @param receiver the receiver's address
	 *				numTokens the number of tokens to withdraw (0 decimals)
	 **/
	function withdrawBankroll(address receiver, uint numTokens) public onlyAuthorized {
		require(numTokens <= bankroll());
		require(allowedReceiver[receiver]);
		assert(edg.transfer(receiver, numTokens));
	}

	/**
	 * withdraw the gas payback to the owner
	 **/
	function withdrawGasPayback() public onlyAuthorized {
		uint payback = gasPayback / oneEDG;
		assert(payback > 0);
		gasPayback = safeSub(gasPayback, payback * oneEDG);
		assert(edg.transfer(owner, payback));
	}

	/**
	 * returns the current bankroll in tokens with 0 decimals
	 **/
	function bankroll() view public returns(uint) {
		return safeSub(edg.balanceOf(address(this)), safeAdd(playerBalance, gasPayback) / oneEDG);
	}


	/**
	 * updates the maximum deposit.
	 * @param newMax the new maximum deposit (0 decimals)
	 **/
	function setMaxDeposit(uint newMax) public onlyAuthorized {
		maxDeposit = newMax * oneEDG;
	}
	
	/**
	 * updates the maximum withdrawal.
	 * @param newMax the new maximum withdrawal (0 decimals)
	 **/
	function setMaxWithdrawal(uint newMax) public onlyAuthorized {
		maxWithdrawal = newMax * oneEDG;
	}

	/**
	 * sets the time the player has to wait for his funds to be unlocked before withdrawal (if not withdrawing with help of the casino server).
	 * the time may not be longer than 24 hours.
	 * @param newWaitingTime the new waiting time in seconds
	 * */
	function setWaitingTime(uint newWaitingTime) public onlyAuthorized  {
		require(newWaitingTime <= 24 hours);
		waitingTime = newWaitingTime;
	}

	/**
	 * transfers an amount from the contract balance to the owner's wallet.
	 * @param receiver the receiver address
	 *				 amount   the amount of tokens to withdraw (0 decimals)
	 *				 v,r,s 		the signature of the player
	 **/
	function withdrawFor(address receiver, uint amount, uint8 v, bytes32 r, bytes32 s) public onlyAuthorized keepAlive {
		address player = ecrecover(keccak256(receiver, amount, withdrawCount[receiver]), v, r, s);
		withdrawCount[receiver]++;
		uint gasCost = getGasCost();
		uint value = safeAdd(safeMul(amount, oneEDG), gasCost);
		gasPayback = safeAdd(gasPayback, gasCost);
		balanceOf[player] = safeSub(balanceOf[player], value);
		playerBalance = safeSub(playerBalance, value);
		assert(edg.transfer(receiver, amount));
		emit Withdrawal(player, receiver, amount, gasCost);
	}
	
	/**
	 * transfers the player's tokens directly to the new casino contract after an update.
	 * @param newCasino the address of the new casino contract
	 *		  v, r, s   the signature of the player
	 *		  chargeGas indicates if the gas cost is payed by the player.
	 * */
	function transferToNewContract(address newCasino, uint8 v, bytes32 r, bytes32 s, bool chargeGas) public onlyAuthorized keepAlive {
		address player = ecrecover(keccak256(address(this), newCasino), v, r, s);
		uint gasCost = 0;
		if(chargeGas) gasCost = getGasCost();
		uint value = safeSub(balanceOf[player], gasCost);
		require(value > oneEDG);
		//fractions of one EDG cannot be withdrawn 
		value /= oneEDG;
		playerBalance = safeSub(playerBalance, balanceOf[player]);
		balanceOf[player] = 0;
		assert(edg.transfer(newCasino, value));
		emit Withdrawal(player, newCasino, value, gasCost);
		CasinoBank cb = CasinoBank(newCasino);
		assert(cb.credit(player, value));
	}
	
	/**
	 * receive a player balance from the predecessor contract.
	 * @param player the address of the player to credit the value for
	 *				value  the number of tokens to credit (0 decimals)
	 * */
	function credit(address player, uint value) public returns(bool) {
		require(msg.sender == predecessor);
		uint valueWithDecimals = safeMul(value, oneEDG);
		balanceOf[player] = safeAdd(balanceOf[player], valueWithDecimals);
		playerBalance = safeAdd(playerBalance, valueWithDecimals);
		emit Deposit(player, value, 0);
		return true;
	}

	/**
	 * lets the owner close the contract if there are no player funds on it or if nobody has been using it for at least 30 days
	 * */
	function close() public onlyOwner {
		closeContract(playerBalance);
	}
}


contract EdgelessCasino is CasinoBank{
	/** the most recent known state of a state channel */
	mapping(address => State) public lastState;
	/** fired when the state is updated */
	event StateUpdate(address player, uint128 count, int128 winBalance, int difference, uint gasCost);
  /** fired if one of the parties chooses to log the seeds and results */
  event GameData(address player, bytes32[] serverSeeds, bytes32[] clientSeeds, int[] results, uint gasCost);
  
	struct State{
		uint128 count;
		int128 winBalance;
	}


  /**
  * creates a new edgeless casino contract.
  * @param predecessorAddress the address of the predecessing contract
	*				 tokenContract      the address of the Edgeless token contract
	* 			 depositLimit       the maximum deposit allowed
	* 			 kGasPrice				  the price per kGas in WEI
  **/
  function EdgelessCasino(address predecessorAddress, address tokenContract, uint depositLimit, uint kGasPrice) CasinoBank(depositLimit, predecessorAddress) Mortal(tokenContract) ChargingGas(kGasPrice) public{

  }
  
  /**
   * updates several state channels at once. can be called by authorized wallets only.
   * 1. determines the player address from the signature.
   * 2. verifies if the signed game-count is higher than the last known game-count of this channel.
   * 3. updates the balances accordingly. This means: It checks the already performed updates for this channel and computes
   *    the new balance difference to add or subtract from the player‘s balance.
   * @param winBalances array of the current wins or losses
   *				gameCounts  array of the numbers of signed game moves
   *				v,r,s       array of the players's signatures
   *        chargeGas   indicates if the gas costs should be subtracted from the players's balances
   * */
  function updateBatch(int128[] winBalances,  uint128[] gameCounts, uint8[] v, bytes32[] r, bytes32[] s, bool chargeGas) public onlyAuthorized{
    require(winBalances.length == gameCounts.length);
    require(winBalances.length == v.length);
    require(winBalances.length == r.length);
    require(winBalances.length == s.length);
    require(winBalances.length <= 50);
    address player;
    uint gasCost = 0;
    if(chargeGas) 
      gasCost = getGasCost();
    gasPayback = safeAdd(gasPayback, safeMul(gasCost, winBalances.length));
    for(uint8 i = 0; i < winBalances.length; i++){
      player = ecrecover(keccak256(winBalances[i], gameCounts[i]), v[i], r[i], s[i]);
      _updateState(player, winBalances[i], gameCounts[i], gasCost);
    }
  }

  /**
   * updates a state channel. can be called by both parties.
   * 1. verifies the signature.
   * 2. verifies if the signed game-count is higher than the last known game-count of this channel.
   * 3. updates the balances accordingly. This means: It checks the already performed updates for this channel and computes
   *    the new balance difference to add or subtract from the player‘s balance.
   * @param winBalance the current win or loss
   *				gameCount  the number of signed game moves
   *				v,r,s      the signature of either the casino or the player
   *        chargeGas  indicates if the gas costs should be subtracted from the player's balance
   * */
  function updateState(int128 winBalance,  uint128 gameCount, uint8 v, bytes32 r, bytes32 s, bool chargeGas) public{
  	address player = determinePlayer(winBalance, gameCount, v, r, s);
  	uint gasCost = 0;
  	if(player == msg.sender)//if the player closes the state channel himself, make sure the signer is a casino wallet
  		require(authorized[ecrecover(keccak256(player, winBalance, gameCount), v, r, s)]);
  	else if (chargeGas){//subtract the gas costs from the player balance only if the casino wallet is the sender
  		gasCost = getGasCost();
  		gasPayback = safeAdd(gasPayback, gasCost);
  	}
  	_updateState(player, winBalance, gameCount, gasCost);
  }
  
  /**
   * internal method to perform the actual state update.
   * @param player the player address
   *        winBalance the player's win balance
   *        gameCount  the player's game count
   * */
  function _updateState(address player, int128 winBalance,  uint128 gameCount, uint gasCost) internal {
    State storage last = lastState[player];
  	require(gameCount > last.count);
  	int difference = updatePlayerBalance(player, winBalance, last.winBalance, gasCost);
  	lastState[player] = State(gameCount, winBalance);
  	emit StateUpdate(player, gameCount, winBalance, difference, gasCost);
  }

  /**
   * determines if the msg.sender or the signer of the passed signature is the player. returns the player's address
   * @param winBalance the current winBalance, used to calculate the msg hash
   *				gameCount  the current gameCount, used to calculate the msg.hash
   *				v, r, s    the signature of the non-sending party
   * */
  function determinePlayer(int128 winBalance, uint128 gameCount, uint8 v, bytes32 r, bytes32 s) view internal returns(address){
  	if (authorized[msg.sender])//casino is the sender -> player is the signer
  		return ecrecover(keccak256(winBalance, gameCount), v, r, s);
  	else
  		return msg.sender;
  }

	/**
	 * computes the difference of the win balance relative to the last known state and adds it to the player's balance.
	 * in case the casino is the sender, the gas cost in EDG gets subtracted from the player's balance.
	 * @param player the address of the player
	 *				winBalance the current win-balance
	 *				lastWinBalance the win-balance of the last known state
	 *				gasCost the gas cost of the tx
	 * */
  function updatePlayerBalance(address player, int128 winBalance, int128 lastWinBalance, uint gasCost) internal returns(int difference){
  	difference = safeSub(winBalance, lastWinBalance);
  	int outstanding = safeSub(difference, int(gasCost));
  	uint outs;
  	if(outstanding < 0){
  		outs = uint256(outstanding * (-1));
  		playerBalance = safeSub(playerBalance, outs);
  		balanceOf[player] = safeSub(balanceOf[player], outs);
  	}
  	else{
  		outs = uint256(outstanding);
  		assert(bankroll() * oneEDG > outs);
  	  playerBalance = safeAdd(playerBalance, outs);
  	  balanceOf[player] = safeAdd(balanceOf[player], outs);
  	}
  }
  
  /**
   * logs some seeds and game results for players wishing to have their game history logged by the contract
   * @param serverSeeds array containing the server seeds
   *        clientSeeds array containing the client seeds
   *        results     array containing the results
   *        v, r, s     the signature of the non-sending party (to make sure the correct results are logged)
   * */
  function logGameData(bytes32[] serverSeeds, bytes32[] clientSeeds, int[] results, uint8 v, bytes32 r, bytes32 s) public{
    address player = determinePlayer(serverSeeds, clientSeeds, results, v, r, s);
    uint gasCost;
    //charge gas in case the server is logging the results for the player
    if(player != msg.sender){
      gasCost = (57 + 768 * serverSeeds.length / 1000)*gasPrice;
      balanceOf[player] = safeSub(balanceOf[player], gasCost);
      playerBalance = safeSub(playerBalance, gasCost);
      gasPayback = safeAdd(gasPayback, gasCost);
    }
    emit GameData(player, serverSeeds, clientSeeds, results, gasCost);
  }
  
  /**
   * determines if the msg.sender or the signer of the passed signature is the player. returns the player's address
   * @param serverSeeds array containing the server seeds
   *        clientSeeds array containing the client seeds
   *        results     array containing the results
   *				v, r, s    the signature of the non-sending party
   * */
  function determinePlayer(bytes32[] serverSeeds, bytes32[] clientSeeds, int[] results, uint8 v, bytes32 r, bytes32 s) view internal returns(address){
  	address signer = ecrecover(keccak256(serverSeeds, clientSeeds, results), v, r, s);
  	if (authorized[msg.sender])//casino is the sender -> player is the signer
  		return signer;
  	else if (authorized[signer])
  		return msg.sender;
  	else 
  	  revert();
  }

}

Contract ABI

[{"constant":false,"inputs":[{"name":"serverSeeds","type":"bytes32[]"},{"name":"clientSeeds","type":"bytes32[]"},{"name":"results","type":"int256[]"},{"name":"v","type":"uint8"},{"name":"r","type":"bytes32"},{"name":"s","type":"bytes32"}],"name":"logGameData","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"bankroll","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"receiver","type":"address"}],"name":"disallowReceiver","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"signatures","type":"bytes4[5]"},{"name":"gasNeeded","type":"uint256[5]"}],"name":"setGasUsage","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"","type":"address"}],"name":"lastState","outputs":[{"name":"count","type":"uint128"},{"name":"winBalance","type":"int128"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"addr","type":"address"}],"name":"deauthorize","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"amount","type":"uint256"}],"name":"withdraw","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"newMax","type":"uint256"}],"name":"setMaxWithdrawal","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"receiver","type":"address"},{"name":"numTokens","type":"uint256"},{"name":"chargeGas","type":"bool"}],"name":"deposit","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[],"name":"close","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"","type":"address"}],"name":"withdrawAfter","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"","type":"address"}],"name":"withdrawCount","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"maxDeposit","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"playerBalance","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"newCasino","type":"address"},{"name":"v","type":"uint8"},{"name":"r","type":"bytes32"},{"name":"s","type":"bytes32"},{"name":"chargeGas","type":"bool"}],"name":"transferToNewContract","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"","type":"address"}],"name":"balanceOf","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"oneEDG","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"maxWithdrawal","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"owner","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"receiver","type":"address"},{"name":"amount","type":"uint256"},{"name":"v","type":"uint8"},{"name":"r","type":"bytes32"},{"name":"s","type":"bytes32"}],"name":"withdrawFor","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"newOwner","type":"address"}],"name":"changeOwner","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"closeAt","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"waitingTime","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"","type":"bytes4"}],"name":"gasPerTx","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"","type":"address"}],"name":"allowedReceiver","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"addr","type":"address"}],"name":"authorize","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"predecessor","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"","type":"address"}],"name":"authorized","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"newMax","type":"uint256"}],"name":"setMaxDeposit","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"receiver","type":"address"}],"name":"allowReceiver","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"price","type":"uint256"}],"name":"setGasPrice","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"winBalances","type":"int128[]"},{"name":"gameCounts","type":"uint128[]"},{"name":"v","type":"uint8[]"},{"name":"r","type":"bytes32[]"},{"name":"s","type":"bytes32[]"},{"name":"chargeGas","type":"bool"}],"name":"updateBatch","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[],"name":"requestWithdrawal","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"winBalance","type":"int128"},{"name":"gameCount","type":"uint128"},{"name":"v","type":"uint8"},{"name":"r","type":"bytes32"},{"name":"s","type":"bytes32"},{"name":"chargeGas","type":"bool"}],"name":"updateState","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"gasPayback","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"cancelWithdrawalRequest","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"receiver","type":"address"},{"name":"numTokens","type":"uint256"}],"name":"withdrawBankroll","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"newWaitingTime","type":"uint256"}],"name":"setWaitingTime","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"player","type":"address"},{"name":"value","type":"uint256"}],"name":"credit","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[],"name":"withdrawGasPayback","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[],"name":"open","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"gasPrice","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"inputs":[{"name":"predecessorAddress","type":"address"},{"name":"tokenContract","type":"address"},{"name":"depositLimit","type":"uint256"},{"name":"kGasPrice","type":"uint256"}],"payable":false,"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":false,"name":"player","type":"address"},{"indexed":false,"name":"count","type":"uint128"},{"indexed":false,"name":"winBalance","type":"int128"},{"indexed":false,"name":"difference","type":"int256"},{"indexed":false,"name":"gasCost","type":"uint256"}],"name":"StateUpdate","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"player","type":"address"},{"indexed":false,"name":"serverSeeds","type":"bytes32[]"},{"indexed":false,"name":"clientSeeds","type":"bytes32[]"},{"indexed":false,"name":"results","type":"int256[]"},{"indexed":false,"name":"gasCost","type":"uint256"}],"name":"GameData","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"_player","type":"address"},{"indexed":false,"name":"_numTokens","type":"uint256"},{"indexed":false,"name":"_gasCost","type":"uint256"}],"name":"Deposit","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"_player","type":"address"},{"indexed":false,"name":"_receiver","type":"address"},{"indexed":false,"name":"_numTokens","type":"uint256"},{"indexed":false,"name":"_gasCost","type":"uint256"}],"name":"Withdrawal","type":"event"}]

Contract Creation Code

606060405234156200001057600080fd5b6040516080806200281583398101604052808051919060200180519190602001805191906020018051915082905084826200004a620002fa565b6200005462000323565b60008054600160a060020a031990811633600160a060020a03908116918217845560028054909316908c16179091558152600360209081526040808320805460ff1990811660019081179092556004909352928190208054909216909217905560a0905190810160409081527f3edd11280000000000000000000000000000000000000000000000000000000082527f9607610a0000000000000000000000000000000000000000000000000000000060208301527fde48ff5200000000000000000000000000000000000000000000000000000000818301527fc97b6d1f0000000000000000000000000000000000000000000000000000000060608301527f6bf06fde00000000000000000000000000000000000000000000000000000000608083015290925060a090519081016040908152609282526064602083015260419082015260326060820152605560808201529050620001c4828264010000000062000bc66200022182021704565b620001dd8364010000000062001780620002be82021704565b505050620186a091909102600c819055600d5562015180600e55600f8054600160a060020a031916600160a060020a03909216919091179055506200034b92505050565b6000805433600160a060020a039081169116146200023e57600080fd5b5060005b60058160ff161015620002b9578160ff8216600581106200025f57fe5b6020020151600660008560ff8516600581106200027857fe5b60200201517fffffffff0000000000000000000000000000000000000000000000000000000016815260208101919091526040016000205560010162000242565b505050565b600160a060020a03331660009081526003602052604090205460ff161515620002e657600080fd5b6127108110620002f557600080fd5b600555565b60a06040519081016040526005815b600081526000199091019060200181620003095790505090565b60a06040519081016040526005815b6000815260200190600190039081620003325790505090565b6124ba806200035b6000396000f3006060604052600436106101ea5763ffffffff60e060020a6000350416630102305b81146101ef5780630c657eb0146102d05780631ae32b82146102f55780631e33a6d514610314578063203faa891461037557806327c97fa5146103bd5780632e1a7d4d146103dc5780633926384d146103f25780633edd11281461040857806343d726d61461042f5780634659f42a146104425780634f23618f146104615780636083e59a14610480578063651f066a146104935780636bf06fde146104a657806370a08231146104d65780637ab4e968146104f55780638c0ff5b7146105085780638da5cb5b1461051b5780639607610a1461054a578063a6f9dae114610578578063a985408714610597578063aa13e8c2146105aa578063ad8ce06b146105bd578063b2f5e6c2146105f2578063b6a5d7de14610625578063b719d03214610644578063b918161114610657578063bb371fdd14610676578063bb7502321461068c578063bf1fe420146106ab578063c97b6d1f146106c1578063dbaf214514610814578063de48ff5214610827578063e1538b321461085d578063e714a02814610870578063e9e3074614610883578063ebc73e65146108a5578063ef6506db146108bb578063f66e86bb146108dd578063fcfff16f146108f0578063fe173b9714610903575b600080fd5b34156101fa57600080fd5b6102ce600460248135818101908301358060208181020160405190810160405280939291908181526020018383602002808284378201915050505050509190803590602001908201803590602001908080602002602001604051908101604052809392919081815260200183836020028082843782019150505050505091908035906020019082018035906020019080806020026020016040519081016040528093929190818152602001838360200280828437509496505060ff8535169460208101359450604001359250610916915050565b005b34156102db57600080fd5b6102e3610af6565b60405190815260200160405180910390f35b341561030057600080fd5b6102ce600160a060020a0360043516610b8a565b341561031f57600080fd5b6102ce600460a481600560a06040519081016040529190828260a080828437820191505050505091908060a001906005806020026040519081016040529190828260a08082843750939550610bc6945050505050565b341561038057600080fd5b610394600160a060020a0360043516610c5b565b6040516001608060020a039092168252600f90810b900b60208201526040908101905180910390f35b34156103c857600080fd5b6102ce600160a060020a0360043516610c82565b34156103e757600080fd5b6102ce600435610cbe565b34156103fd57600080fd5b6102ce600435610e73565b341561041357600080fd5b6102ce600160a060020a03600435166024356044351515610ea4565b341561043a57600080fd5b6102ce611045565b341561044d57600080fd5b6102e3600160a060020a036004351661106d565b341561046c57600080fd5b6102e3600160a060020a036004351661107f565b341561048b57600080fd5b6102e3611091565b341561049e57600080fd5b6102e3611097565b34156104b157600080fd5b6102ce600160a060020a036004351660ff60243516604435606435608435151561109d565b34156104e157600080fd5b6102e3600160a060020a036004351661135a565b341561050057600080fd5b6102e361136c565b341561051357600080fd5b6102e3611373565b341561052657600080fd5b61052e611379565b604051600160a060020a03909116815260200160405180910390f35b341561055557600080fd5b6102ce600160a060020a036004351660243560ff60443516606435608435611388565b341561058357600080fd5b6102ce600160a060020a03600435166115f4565b34156105a257600080fd5b6102e361167a565b34156105b557600080fd5b6102e3611680565b34156105c857600080fd5b6102e37bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1960043516611686565b34156105fd57600080fd5b610611600160a060020a0360043516611698565b604051901515815260200160405180910390f35b341561063057600080fd5b6102ce600160a060020a03600435166116ad565b341561064f57600080fd5b61052e6116ec565b341561066257600080fd5b610611600160a060020a03600435166116fb565b341561068157600080fd5b6102ce600435611710565b341561069757600080fd5b6102ce600160a060020a0360043516611741565b34156106b657600080fd5b6102ce600435611780565b34156106cc57600080fd5b6102ce6004602481358181019083013580602081810201604051908101604052809392919081815260200183836020028082843782019150505050505091908035906020019082018035906020019080806020026020016040519081016040528093929190818152602001838360200280828437820191505050505050919080359060200190820180359060200190808060200260200160405190810160405280939291908181526020018383602002808284378201915050505050509190803590602001908201803590602001908080602002602001604051908101604052809392919081815260200183836020028082843782019150505050505091908035906020019082018035906020019080806020026020016040519081016040528093929190818152602001838360200280828437509496505050509135151591506117ba9050565b341561081f57600080fd5b6102ce6119bc565b341561083257600080fd5b6102ce600435600f0b6001608060020a036024351660ff6044351660643560843560a43515156119df565b341561086857600080fd5b6102e3611b29565b341561087b57600080fd5b6102ce611b2f565b341561088e57600080fd5b6102ce600160a060020a0360043516602435611b4a565b34156108b057600080fd5b6102ce600435611c25565b34156108c657600080fd5b610611600160a060020a0360043516602435611c61565b34156108e857600080fd5b6102ce611d41565b34156108fb57600080fd5b6102ce611e0f565b341561090e57600080fd5b6102e3611e31565b600080610927888888888888611e37565b915033600160a060020a031682600160a060020a03161415156109c9576005546103e889516103000281151561095957fe5b0460390102905061098f6009600084600160a060020a0316600160a060020a031681526020019081526020016000205482611f9a565b600160a060020a0383166000908152600960205260409020556008546109b59082611f9a565b6008556007546109c59082611fac565b6007555b7f1139e9be34b0b8aee07eb5c072c11de928d5e4c6d1b29bc68aea129464b62b0082898989856040518086600160a060020a0316600160a060020a03168152602001806020018060200180602001858152602001848103845288818151815260200191508051906020019060200280838360005b83811015610a55578082015183820152602001610a3d565b50505050905001848103835287818151815260200191508051906020019060200280838360005b83811015610a94578082015183820152602001610a7c565b50505050905001848103825286818151815260200191508051906020019060200280838360005b83811015610ad3578082015183820152602001610abb565b505050509050019850505050505050505060405180910390a15050505050505050565b600254600090610b8590600160a060020a03166370a082313060405160e060020a63ffffffff8416028152600160a060020a039091166004820152602401602060405180830381600087803b1515610b4d57600080fd5b5af11515610b5a57600080fd5b50505060405180519050620186a0610b76600854600754611fac565b811515610b7f57fe5b04611f9a565b905090565b60005433600160a060020a03908116911614610ba557600080fd5b600160a060020a03166000908152600460205260409020805460ff19169055565b6000805433600160a060020a03908116911614610be257600080fd5b5060005b60058160ff161015610c56578160ff821660058110610c0157fe5b6020020151600660008560ff851660058110610c1957fe5b60200201517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19168152602081019190915260400160002055600101610be6565b505050565b6010602052600090815260409020546001608060020a03811690608060020a9004600f0b82565b60005433600160a060020a03908116911614610c9d57600080fd5b600160a060020a03166000908152600360205260409020805460ff19169055565b6000806001541115610cd45762278d0042016001555b600d54821115610ce357600080fd5b600160a060020a0333166000908152600a6020526040812054118015610d205750600160a060020a0333166000908152600a602052604090205442115b1515610d2b57600080fd5b600160a060020a0333166000908152600a6020526040812055610d5182620186a0611fd0565b600160a060020a033316600090815260096020526040902054909150610d779082611f9a565b600160a060020a033316600090815260096020526040902055600854610d9d9082611f9a565b600855600254600160a060020a031663a9059cbb338460405160e060020a63ffffffff8516028152600160a060020a0390921660048301526024820152604401602060405180830381600087803b1515610df657600080fd5b5af11515610e0357600080fd5b505050604051805190501515610e1557fe5b7fc2b4a290c20fb28939d29f102514fbffd2b73c059ffba8b78250c94161d5fcc63333846000604051600160a060020a0394851681529290931660208301526040808301919091526060820192909252608001905180910390a15050565b600160a060020a03331660009081526003602052604090205460ff161515610e9a57600080fd5b620186a002600d55565b60008060006001546000141515610eba57600080fd5b60008511610ec757600080fd5b610ed485620186a0611fd0565b92508315610f0257610ee4611ff1565b9150610ef08383611f9a565b9250610efe60075483611fac565b6007555b600160a060020a038616600090815260096020526040902054610f259084611fac565b600c54909150811115610f3757600080fd5b600254600160a060020a03166323b872dd33308860405160e060020a63ffffffff8616028152600160a060020a0393841660048201529190921660248201526044810191909152606401602060405180830381600087803b1515610f9a57600080fd5b5af11515610fa757600080fd5b505050604051805190501515610fb957fe5b600160a060020a0386166000908152600960205260409020819055600854610fe19084611fac565b6008557f90890809c654f11d6e72a28fa60149770a0d11ec6c92319d6ceb2bb0a4ea1a158686846040518084600160a060020a0316600160a060020a03168152602001838152602001828152602001935050505060405180910390a1505050505050565b60005433600160a060020a0390811691161461106057600080fd5b61106b60085461204c565b565b600a6020526000908152604090205481565b600b6020526000908152604090205481565b600c5481565b60085481565b600160a060020a03331660009081526003602052604081205481908190819060ff1615156110ca57600080fd5b600060015411156110df5762278d0042016001555b6001308a6040516c01000000000000000000000000600160a060020a03938416810282529190921602601482015260280160405180910390208989896040516000815260200160405260405193845260ff9092166020808501919091526040808501929092526060840192909252608090920191516020810390808403906000865af1151561116d57600080fd5b505060206040510351935060009250841561118d5761118a611ff1565b92505b600160a060020a0384166000908152600960205260409020546111b09084611f9a565b9150620186a082116111c157600080fd5b600854600160a060020a038516600090815260096020526040902054620186a0909304926111ef9190611f9a565b600855600160a060020a03808516600090815260096020526040808220919091556002549091169063a9059cbb908b9085905160e060020a63ffffffff8516028152600160a060020a0390921660048301526024820152604401602060405180830381600087803b151561126257600080fd5b5af1151561126f57600080fd5b50505060405180519050151561128157fe5b7fc2b4a290c20fb28939d29f102514fbffd2b73c059ffba8b78250c94161d5fcc6848a8486604051600160a060020a0394851681529290931660208301526040808301919091526060820192909252608001905180910390a15087600160a060020a03811663ef6506db858460405160e060020a63ffffffff8516028152600160a060020a0390921660048301526024820152604401602060405180830381600087803b151561133057600080fd5b5af1151561133d57600080fd5b50505060405180519050151561134f57fe5b505050505050505050565b60096020526000908152604090205481565b620186a081565b600d5481565b600054600160a060020a031681565b600160a060020a0333166000908152600360205260408120548190819060ff1615156113b357600080fd5b600060015411156113c85762278d0042016001555b600160a060020a0388166000908152600b602052604090819020546001918a918a9151600160a060020a03939093166c010000000000000000000000000283526014830191909152603482015260540160405180910390208787876040516000815260200160405260405193845260ff9092166020808501919091526040808501929092526060840192909252608090920191516020810390808403906000865af1151561147557600080fd5b505060206040510351600160a060020a0389166000908152600b602052604090208054600101905592506114a7611ff1565b91506114bf6114b988620186a0611fd0565b83611fac565b90506114cd60075483611fac565b600755600160a060020a0383166000908152600960205260409020546114f39082611f9a565b600160a060020a0384166000908152600960205260409020556008546115199082611f9a565b600855600254600160a060020a031663a9059cbb898960405160e060020a63ffffffff8516028152600160a060020a0390921660048301526024820152604401602060405180830381600087803b151561157257600080fd5b5af1151561157f57600080fd5b50505060405180519050151561159157fe5b7fc2b4a290c20fb28939d29f102514fbffd2b73c059ffba8b78250c94161d5fcc683898985604051600160a060020a0394851681529290931660208301526040808301919091526060820192909252608001905180910390a15050505050505050565b60005433600160a060020a0390811691161461160f57600080fd5b60005461162490600160a060020a0316610c82565b61162d816116ad565b60005461164290600160a060020a0316610b8a565b61164b81611741565b6000805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a0392909216919091179055565b60015481565b600e5481565b60066020526000908152604090205481565b60046020526000908152604090205460ff1681565b60005433600160a060020a039081169116146116c857600080fd5b600160a060020a03166000908152600360205260409020805460ff19166001179055565b600f54600160a060020a031681565b60036020526000908152604090205460ff1681565b600160a060020a03331660009081526003602052604090205460ff16151561173757600080fd5b620186a002600c55565b60005433600160a060020a0390811691161461175c57600080fd5b600160a060020a03166000908152600460205260409020805460ff19166001179055565b600160a060020a03331660009081526003602052604090205460ff1615156117a757600080fd5b61271081106117b557600080fd5b600555565b600160a060020a0333166000908152600360205260408120548190819060ff1615156117e557600080fd5b87518951146117f357600080fd5b865189511461180157600080fd5b855189511461180f57600080fd5b845189511461181d57600080fd5b60328951111561182c57600080fd5b6000915083156118415761183e611ff1565b91505b611857600754611852848c51611fd0565b611fac565b6007555060005b88518160ff16101561134f576001898260ff168151811061187b57fe5b90602001906020020151898360ff168151811061189457fe5b90602001906020020151604051608060020a600f93840b90930b830281526001608060020a0390911690910260108201526020016040518091039020888360ff16815181106118df57fe5b90602001906020020151888460ff16815181106118f857fe5b90602001906020020151888560ff168151811061191157fe5b906020019060200201516040516000815260200160405260405193845260ff9092166020808501919091526040808501929092526060840192909252608090920191516020810390808403906000865af1151561196d57600080fd5b50506020604051035192506119b4838a8360ff168151811061198b57fe5b906020019060200201518a8460ff16815181106119a457fe5b906020019060200201518561214f565b60010161185e565b600e54600160a060020a0333166000908152600a60205260409020429091019055565b6000806119ef88888888886122ae565b91506000905033600160a060020a031682600160a060020a03161415611af357600360006001848b8b6040516c01000000000000000000000000600160a060020a03909416939093028352608060020a600f92830b90920b820260148401526001608060020a031602602482015260340160405180910390208989896040516000815260200160405260405193845260ff9092166020808501919091526040808501929092526060840192909252608090920191516020810390808403906000865af11515611abd57600080fd5b505060206040510351600160a060020a0316815260208101919091526040016000205460ff161515611aee57600080fd5b611b13565b8215611b1357611b01611ff1565b9050611b0f60075482611fac565b6007555b611b1f8289898461214f565b5050505050505050565b60075481565b600160a060020a0333166000908152600a6020526040812055565b600160a060020a03331660009081526003602052604090205460ff161515611b7157600080fd5b611b79610af6565b811115611b8557600080fd5b600160a060020a03821660009081526004602052604090205460ff161515611bac57600080fd5b600254600160a060020a031663a9059cbb838360405160e060020a63ffffffff8516028152600160a060020a0390921660048301526024820152604401602060405180830381600087803b1515611c0257600080fd5b5af11515611c0f57600080fd5b505050604051805190501515611c2157fe5b5050565b600160a060020a03331660009081526003602052604090205460ff161515611c4c57600080fd5b62015180811115611c5c57600080fd5b600e55565b600f54600090819033600160a060020a03908116911614611c8157600080fd5b611c8e83620186a0611fd0565b600160a060020a038516600090815260096020526040902054909150611cb49082611fac565b600160a060020a038516600090815260096020526040902055600854611cda9082611fac565b6008557f90890809c654f11d6e72a28fa60149770a0d11ec6c92319d6ceb2bb0a4ea1a15848460006040518084600160a060020a0316600160a060020a03168152602001838152602001828152602001935050505060405180910390a15060019392505050565b600160a060020a03331660009081526003602052604081205460ff161515611d6857600080fd5b50600754620186a0900460008111611d7c57fe5b611d8d600754620186a08302611f9a565b600755600254600054600160a060020a039182169163a9059cbb91168360405160e060020a63ffffffff8516028152600160a060020a0390921660048301526024820152604401602060405180830381600087803b1515611ded57600080fd5b5af11515611dfa57600080fd5b505050604051805190501515611e0c57fe5b50565b60005433600160a060020a03908116911614611e2a57600080fd5b6000600155565b60055481565b600080600188888860405180848051906020019060200280838360005b83811015611e6c578082015183820152602001611e54565b50505050905001838051906020019060200280838360005b83811015611e9c578082015183820152602001611e84565b50505050905001828051906020019060200280838360005b83811015611ecc578082015183820152602001611eb4565b50505050905001935050505060405180910390208686866040516000815260200160405260405193845260ff9092166020808501919091526040808501929092526060840192909252608090920191516020810390808403906000865af11515611f3557600080fd5b505060206040510351600160a060020a03331660009081526003602052604090205490915060ff1615611f6a57809150611f8f565b600160a060020a03811660009081526003602052604090205460ff16156101ea573391505b509695505050505050565b600082821115611fa657fe5b50900390565b6000828201838110801590611fc15750828110155b1515611fc957fe5b9392505050565b6000828202831580611fc15750828482811515611fe957fe5b0414611fc957fe5b600080357bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260066020526040812054600554633b9aca009161203d916120379190611fd0565b3a611fd0565b81151561204657fe5b04905090565b600154151561205f5762278d0042016001555b42600154108061206d575080155b15611e0c57600254600054600160a060020a039182169163a9059cbb9116826370a082313060405160e060020a63ffffffff8416028152600160a060020a039091166004820152602401602060405180830381600087803b15156120d057600080fd5b5af115156120dd57600080fd5b5050506040518051905060405160e060020a63ffffffff8516028152600160a060020a0390921660048301526024820152604401602060405180830381600087803b151561212a57600080fd5b5af1151561213757600080fd5b50505060405180515050600054600160a060020a0316ff5b600160a060020a038416600090815260106020526040812080549091906001608060020a039081169085161161218457600080fd5b815461219e9087908790608060020a9004600f0b86612376565b90506040805190810160409081526001608060020a0386168252600f87900b602080840191909152600160a060020a0389166000908152601090915220815181546fffffffffffffffffffffffffffffffff19166001608060020a039190911617815560208201518154600f9190910b6001608060020a03908116608060020a029116179055507fbbddc02bfa2e7cedacea185a3820c053215b120e102dd6de97b11d4ba8897ab886858784876040518086600160a060020a0316600160a060020a03168152602001856001608060020a03166001608060020a0316815260200184600f0b600f0b81526020018381526020018281526020019550505050505060405180910390a1505050505050565b600160a060020a03331660009081526003602052604081205460ff161561236a5760018686604051608060020a600f93840b90930b830281526001608060020a03909116909102601082015260200160405180910390208585856040516000815260200160405260405193845260ff9092166020808501919091526040808501929092526060840192909252608090920191516020810390808403906000865af1151561235a57600080fd5b505060206040510351905061236d565b50335b95945050505050565b600080600061238b86600f0b86600f0b612466565b92506123978385612466565b915060008212156123f957816000190290506123b560085482611f9a565b600855600160a060020a0387166000908152600960205260409020546123db9082611f9a565b600160a060020a03881660009081526009602052604090205561245c565b508080620186a0612408610af6565b021161241057fe5b61241c60085482611fac565b600855600160a060020a0387166000908152600960205260409020546124429082611fac565b600160a060020a0388166000908152600960205260409020555b5050949350505050565b6000808212156124815781830383901361247c57fe5b611fa6565b81830383901315611fa657fe00a165627a7a7230582010adc13c966227d3bfc7ddbbac28967494f2d5e138e036293b4275ca8402c751002900000000000000000000000015f08079310e2c9dacaa73c0e450368185724aea00000000000000000000000008711d3b02c8758f2fb3ab4e80228418a7f8e39c0000000000000000000000000000000000000000000000000000000008f0d1800000000000000000000000000000000000000000000000000000000000000073

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

00000000000000000000000015f08079310e2c9dacaa73c0e450368185724aea00000000000000000000000008711d3b02c8758f2fb3ab4e80228418a7f8e39c0000000000000000000000000000000000000000000000000000000008f0d1800000000000000000000000000000000000000000000000000000000000000073

-----Encoded View---------------
4 Constructor Arguments found :
Arg [0] : 00000000000000000000000015f08079310e2c9dacaa73c0e450368185724aea
Arg [1] : 00000000000000000000000008711d3b02c8758f2fb3ab4e80228418a7f8e39c
Arg [2] : 0000000000000000000000000000000000000000000000000000000008f0d180
Arg [3] : 0000000000000000000000000000000000000000000000000000000000000073

Swarm Source

bzzr://10adc13c966227d3bfc7ddbbac28967494f2d5e138e036293b4275ca8402c751
Block Age Transaction Difficulty GasUsed Reward
Block Age Uncle Number Difficulty GasUsed Reward
Loading
Make sure to use the "Vote Down" button for any spammy posts, and the "Vote Up" for interesting conversations.