ETH Price: $3,356.14 (-3.39%)

Contract

0xDeb80F943AE5fE7EE65Ec2e651CB70a7a9F14276
 

Overview

ETH Balance

0 ETH

Eth Value

$0.00

Token Holdings

Multichain Info

No addresses found
Transaction Hash
Method
Block
From
To
Withdraw87327132019-10-13 10:53:021901 days ago1570963982IN
0xDeb80F94...7a9F14276
0 ETH0.000048931
Fund87327082019-10-13 10:52:071901 days ago1570963927IN
0xDeb80F94...7a9F14276
0.01 ETH0.000093331
Withdraw87326952019-10-13 10:48:451901 days ago1570963725IN
0xDeb80F94...7a9F14276
0 ETH0.000049051
Withdraw87326712019-10-13 10:43:551901 days ago1570963435IN
0xDeb80F94...7a9F14276
0 ETH0.0006393110
Withdraw87326672019-10-13 10:42:501901 days ago1570963370IN
0xDeb80F94...7a9F14276
0 ETH0.0006399510
Withdraw87326652019-10-13 10:42:411901 days ago1570963361IN
0xDeb80F94...7a9F14276
0 ETH0.0007899510
Pull Resolves87326632019-10-13 10:42:181901 days ago1570963338IN
0xDeb80F94...7a9F14276
0 ETH0.000057611
Pull Resolves87326602019-10-13 10:41:361901 days ago1570963296IN
0xDeb80F94...7a9F14276
0 ETH0.000576110
Fund87326492019-10-13 10:37:031901 days ago1570963023IN
0xDeb80F94...7a9F14276
0.1 ETH0.0006700710
Sell Bonds87326472019-10-13 10:36:221901 days ago1570962982IN
0xDeb80F94...7a9F14276
0 ETH0.0011791810
Sell Bonds87326412019-10-13 10:34:031901 days ago1570962843IN
0xDeb80F94...7a9F14276
0 ETH0.0010298210
Sell Bonds87326302019-10-13 10:31:031901 days ago1570962663IN
0xDeb80F94...7a9F14276
0 ETH0.000123571.2
Sell Bonds87325682019-10-13 10:16:181901 days ago1570961778IN
0xDeb80F94...7a9F14276
0 ETH0.0011791810
Fund87325502019-10-13 10:13:041901 days ago1570961584IN
0xDeb80F94...7a9F14276
0.6 ETH0.0006700710
Transfer87325432019-10-13 10:12:231901 days ago1570961543IN
0xDeb80F94...7a9F14276
0.41 ETH0.000332685
Fund87325322019-10-13 10:10:091901 days ago1570961409IN
0xDeb80F94...7a9F14276
0.001 ETH0.0008200710
Fund87324992019-10-13 10:03:431901 days ago1570961023IN
0xDeb80F94...7a9F14276
3 ETH0.0029024328.08
Sell Bonds87324972019-10-13 10:03:081901 days ago1570960988IN
0xDeb80F94...7a9F14276
0 ETH0.0010914210
Fund87324962019-10-13 10:02:501901 days ago1570960970IN
0xDeb80F94...7a9F14276
3.37 ETH0.000620556
Fund87324802019-10-13 9:59:271901 days ago1570960767IN
0xDeb80F94...7a9F14276
0.1 ETH0.000484938.3
Sell Bonds87324772019-10-13 9:58:451901 days ago1570960725IN
0xDeb80F94...7a9F14276
0 ETH0.000676564
Fund87324722019-10-13 9:56:551901 days ago1570960615IN
0xDeb80F94...7a9F14276
0.5 ETH0.0015513915
Fund87324162019-10-13 9:45:051901 days ago1570959905IN
0xDeb80F94...7a9F14276
1 ETH0.0015513915
Fund87324152019-10-13 9:44:351901 days ago1570959875IN
0xDeb80F94...7a9F14276
0.34 ETH0.00023374
Fund87324112019-10-13 9:43:121901 days ago1570959792IN
0xDeb80F94...7a9F14276
1 ETH0.00082748
View all transactions

Latest 12 internal transactions

Advanced mode:
Parent Transaction Hash Block
From
To
87327132019-10-13 10:53:021901 days ago1570963982
0xDeb80F94...7a9F14276
0.01 ETH
87326952019-10-13 10:48:451901 days ago1570963725
0xDeb80F94...7a9F14276
0.00764108 ETH
87326712019-10-13 10:43:551901 days ago1570963435
0xDeb80F94...7a9F14276
0.04 ETH
87326672019-10-13 10:42:501901 days ago1570963370
0xDeb80F94...7a9F14276
3.7 ETH
87326652019-10-13 10:42:411901 days ago1570963361
0xDeb80F94...7a9F14276
10 ETH
87326472019-10-13 10:36:221901 days ago1570962982
0xDeb80F94...7a9F14276
0.09164529 ETH
87326412019-10-13 10:34:031901 days ago1570962843
0xDeb80F94...7a9F14276
1.42244295 ETH
87326302019-10-13 10:31:031901 days ago1570962663
0xDeb80F94...7a9F14276
1.77525827 ETH
87325682019-10-13 10:16:181901 days ago1570961778
0xDeb80F94...7a9F14276
0.03980296 ETH
87324972019-10-13 10:03:081901 days ago1570960988
0xDeb80F94...7a9F14276
0.00000557 ETH
87324772019-10-13 9:58:451901 days ago1570960725
0xDeb80F94...7a9F14276
0.00000476 ETH
87279202019-10-12 16:58:101902 days ago1570899490
0xDeb80F94...7a9F14276
 Contract Creation0 ETH
Loading...
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
PoWHr

Compiler Version
v0.5.11+commit.c082d0b4

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, GNU GPLv3 license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2019-10-13
*/

pragma solidity ^ 0.5.1;
contract PoWHr{
	// scaleFactor is used to convert Ether into bonds and vice-versa: they're of different
	// orders of magnitude, hence the need to bridge between the two.
	uint256 constant scaleFactor = 0x10000000000000000;

	int constant crr_n = 1;
	int constant crr_d = 2;

	int constant public price_coeff = -0x1337FA66607BADA55;

	// Typical values that we have to declare.
	string constant public name = "Bond";
	string constant public symbol = "BOND";
	uint8 constant public decimals = 12;

	// Array between each address and their number of bonds.
	mapping(address => uint256) public hodlBonds;
	// For calculating resolves minted
	mapping(address => uint256) public avgFactor_ethSpent;
	// For calculating hodl multiplier that factors into resolves minted
	mapping(address => uint256) public avgFactor_buyInTimeSum;
	// Array between each address and their number of resolves being staked.
	mapping(address => uint256) public resolveWeight;

	// Array between each address and how much Ether has been paid out to it.
	// Note that this is scaled by the scaleFactor variable.
	mapping(address => int256) public payouts;

	// Variable tracking how many bonds are in existence overall.
	uint256 public _totalSupply;

	// The total number of resolves being staked in this contract
	uint256 public dissolvingResolves;
	// The total number of resolves burned for a return of ETH(withdraw) or Bonds(reinvest)
	uint256 public dissolved;

	// For Current contract balance
	uint public contractBalance;

	// Easing in the fee. Make the fee reasonable as the contract is scaling to the size of the ecosystem
	uint256 public buySum;
	uint256 public sellSum;

	// For calculating the hodl multiplier. Weighted average release time
	uint public avgFactor_releaseWeight;
	uint public avgFactor_releaseTimeSum;
	// base time on when the contract was created
	uint public genesis;

	// Aggregate sum of all payouts.
	// Note that this is scaled by the scaleFactor variable.
	int256 totalPayouts;

	// Variable tracking how much Ether each token is currently worth.
	// Note that this is scaled by the scaleFactor variable.
	uint256 earningsPerResolve;

	//The resolve token contract
	ResolveToken public resolveToken;

	constructor() public{
		genesis = now;
		resolveToken = new ResolveToken( address(this) );
	}

    function totalSupply() public view returns (uint256) {
        return _totalSupply;
    }
	function getResolveContract() public view returns(address){ return address(resolveToken); }
	// Returns the number of bonds currently held by _owner.
	function balanceOf(address _owner) public view returns (uint256 balance) {
		return hodlBonds[_owner];
	}

	function fluxFee(uint paidAmount) public view returns (uint fee) {
		if (dissolvingResolves == 0)
			return 0;
		
		uint totalResolveSupply = resolveToken.totalSupply() - dissolved;
		return paidAmount * dissolvingResolves / totalResolveSupply * sellSum / buySum;
	}

	// Converts the Ether accrued as resolveEarnings back into bonds without having to
	// withdraw it first. Saves on gas and potential price spike loss.
	event Reinvest( address indexed addr, uint256 reinvested, uint256 dissolved, uint256 bonds, uint256 resolveTax);
	function reinvestEarnings(uint amountFromEarnings) public returns(uint,uint){
		// Retrieve the resolveEarnings associated with the address the request came from.		
		uint totalEarnings = resolveEarnings(msg.sender);
		require(amountFromEarnings <= totalEarnings, "the amount exceeds total earnings");
		uint oldWeight = resolveWeight[msg.sender];
		resolveWeight[msg.sender] = oldWeight *  (totalEarnings - amountFromEarnings) / totalEarnings;
		uint weightDiff = oldWeight - resolveWeight[msg.sender];
		dissolved += weightDiff;
		dissolvingResolves -= weightDiff;

		// For maintaing payout invariance
		int resolvePayoutDiff  = (int256) (earningsPerResolve * weightDiff);

		payouts[msg.sender] += (int256) (amountFromEarnings * scaleFactor) - resolvePayoutDiff;

		totalPayouts += (int256) (amountFromEarnings * scaleFactor) - resolvePayoutDiff;

		// Assign balance to a new variable.
		uint value_ = (uint) (amountFromEarnings);

		// If your resolveEarnings are worth less than 1 szabo, abort.
		if (value_ < 0.000001 ether)
			revert();

		// msg.sender is the address of the caller.
		address sender = msg.sender;

		// Calculate the fee
		uint fee = fluxFee(value_);

		// The amount of Ether used to purchase new bonds for the caller
		uint numEther = value_ - fee;
		buySum += numEther;

		//resolve reward tracking stuff
		uint currentTime = NOW();
		avgFactor_ethSpent[msg.sender] += numEther;
		avgFactor_buyInTimeSum[msg.sender] += currentTime * scaleFactor * numEther;

		// The number of bonds which can be purchased for numEther.
		uint createdBonds = calculateBondsFromReinvest(numEther, amountFromEarnings);

		// the variable storing the amount to be paid to stakers
		uint resolveFee;

		// Check if we have bonds in existence
		if (_totalSupply > 0 && fee > 0) {
			resolveFee = fee * scaleFactor;

			// Fee is distributed to all existing resolve stakers before the new bonds are purchased.
			// rewardPerResolve is the amount(ETH) gained per resolve token from this purchase.
			uint rewardPerResolve = resolveFee / dissolvingResolves;

			// The Ether value per token is increased proportionally.
			earningsPerResolve += rewardPerResolve;
		}

		// Add the createdBonds to the total supply.
		_totalSupply += createdBonds;

		// Assign the bonds to the balance of the buyer.
		hodlBonds[sender] += createdBonds;

		emit Reinvest(msg.sender, value_, weightDiff, createdBonds, resolveFee);
		return (createdBonds, weightDiff);
	}

	// Sells your bonds for Ether
	function sellAllBonds() public {
		sell( balanceOf(msg.sender) );
	}
	function sellBonds(uint amount) public returns(uint,uint){
		uint balance = balanceOf(msg.sender);
		require(balance >= amount, "Amount is more than balance");
		uint returned_eth;
		uint returned_resolves;
		(returned_eth, returned_resolves) = sell(amount);
		return (returned_eth, returned_resolves);
	}

	// Big red exit button to pull all of a holder's Ethereum value from the contract
	function getMeOutOfHere() public {
		sellAllBonds();
		withdraw( resolveEarnings(msg.sender) );
	}

	// Gatekeeper function to check if the amount of Ether being sent isn't too small
	function fund() payable public returns(uint){
		uint bought;
		if (msg.value > 0.000001 ether) {
		  	contractBalance += msg.value;
			bought = buy();
		} else {
			revert();
		}
		return bought;
  	}

    // Function that returns the (dynamic) pricing for buys, sells and fee
	function pricing(uint scale) public view returns (uint buyPrice, uint sellPrice, uint fee) {
		uint buy_eth = scaleFactor * getPriceForBonds( scale, true) / ( scaleFactor - fluxFee(scaleFactor) ) ;
        uint sell_eth = getPriceForBonds(scale, false);
        sell_eth -= fluxFee(sell_eth);
        return ( buy_eth, sell_eth, fluxFee(scale) );
    }

    // For calculating the price 
	function getPriceForBonds(uint256 bonds, bool upDown) public view returns (uint256 price) {
		uint reserveAmount = reserve();

		if(upDown){
			uint x = fixedExp((fixedLog(_totalSupply + bonds) - price_coeff) * crr_d/crr_n);
			return x - reserveAmount;
		}else{
			uint x = fixedExp((fixedLog(_totalSupply - bonds) - price_coeff) * crr_d/crr_n);
			return reserveAmount - x;
		}
	}

	// Calculate the current resolveEarnings associated with the caller address. This is the net result
	// of multiplying the number of resolves held by their current value in Ether and subtracting the
	// Ether that has already been paid out.
	function resolveEarnings(address _owner) public view returns (uint256 amount) {
		return (uint256) ((int256)(earningsPerResolve * resolveWeight[_owner]) - payouts[_owner]) / scaleFactor;
	}

	// Internal balance function, used to calculate the dynamic reserve value.
	function balance() internal view returns (uint256 amount) {
		// msg.value is the amount of Ether sent by the transaction.
		return contractBalance - msg.value;
	}
	event Buy( address indexed addr, uint256 spent, uint256 bonds, uint256 resolveTax);
	function buy() internal returns(uint){
		// Any transaction of less than 1 szabo is likely to be worth less than the gas used to send it.
		if ( msg.value < 0.000001 ether )
			revert();

		// Calculate the fee
		uint fee = fluxFee(msg.value);

		// The amount of Ether used to purchase new bonds for the caller.
		uint numEther = msg.value - fee;
		buySum += numEther;

		//resolve reward tracking stuff
		uint currentTime = NOW();
		avgFactor_ethSpent[msg.sender] += numEther;
		avgFactor_buyInTimeSum[msg.sender] += currentTime * scaleFactor * numEther;

		// The number of bonds which can be purchased for numEther.
		uint createdBonds = getBondsForEther(numEther);

		// Add the createdBonds to the total supply.
		_totalSupply += createdBonds;

		// Assign the bonds to the balance of the buyer.
		hodlBonds[msg.sender] += createdBonds;

		// Check if we have bonds in existence
		uint resolveFee;
		if (_totalSupply > 0 && fee > 0) {
			resolveFee = fee * scaleFactor;

			// Fee is distributed to all existing resolve holders before the new bonds are purchased.
			// rewardPerResolve is the amount gained per resolve token from this purchase.
			uint rewardPerResolve = resolveFee / dissolvingResolves;

			// The Ether value per resolve is increased proportionally.
			earningsPerResolve += rewardPerResolve;
		}
		emit Buy( msg.sender, msg.value, createdBonds, resolveFee);
		return createdBonds;
	}
	function NOW() public view returns(uint time){
		return now - genesis;
	}
	function avgHodl() public view returns(uint hodlTime){
		return avgFactor_releaseTimeSum / avgFactor_releaseWeight / scaleFactor;
	}
	function getReturnsForBonds(address addr, uint bondsReleased) public view returns(uint etherValue, uint mintedResolves, uint new_releaseTimeSum, uint new_releaseWeight, uint initialInput_ETH){
		uint output_ETH = getEtherForBonds(bondsReleased);
		uint input_ETH = avgFactor_ethSpent[addr] * bondsReleased / hodlBonds[addr];
		// hodl multiplier. because if you don't hodl at all, you shouldn't be rewarded resolves.
		// and the multiplier you get for hodling needs to be relative to the average hodl
		uint buyInTime = avgFactor_buyInTimeSum[addr] / avgFactor_ethSpent[addr];
		uint cashoutTime = NOW()*scaleFactor - buyInTime;
		uint releaseTimeSum = avgFactor_releaseTimeSum + cashoutTime*input_ETH/scaleFactor*buyInTime;
		uint releaseWeight = avgFactor_releaseWeight + input_ETH*buyInTime/scaleFactor;
		uint avgCashoutTime = releaseTimeSum/releaseWeight;
		return (output_ETH, input_ETH * cashoutTime / avgCashoutTime * input_ETH / output_ETH, releaseTimeSum, releaseWeight, input_ETH);
	}
	event Sell( address indexed addr, uint256 bondsSold, uint256 cashout, uint256 resolves, uint256 resolveTax, uint256 initialCash);
	function sell(uint256 amount) internal returns(uint eth, uint resolves){
	  	// Calculate the amount of Ether & Resolves that the holder's bonds sell for at the current sell price.
		uint numEthersBeforeFee;
		uint mintedResolves;
		uint releaseTimeSum;
		uint releaseWeight;
		uint initialInput_ETH;
		(numEthersBeforeFee,mintedResolves,releaseTimeSum,releaseWeight,initialInput_ETH) = getReturnsForBonds(msg.sender, amount);

		// magic distribution
		resolveToken.mint(msg.sender, mintedResolves);

		// update weighted average cashout time
		avgFactor_releaseTimeSum = releaseTimeSum;
		avgFactor_releaseWeight = releaseWeight;

		// reduce the amount of "eth spent" based on the percentage of bonds being sold back into the contract
		avgFactor_ethSpent[msg.sender] -= initialInput_ETH;
		// reduce the "buyInTime" sum that's used for average buy in time
		avgFactor_buyInTimeSum[msg.sender] = avgFactor_buyInTimeSum[msg.sender] * (hodlBonds[msg.sender] - amount) / hodlBonds[msg.sender];
		
		// calculate the fee
	    uint fee = fluxFee(numEthersBeforeFee);

		// Net Ether for the seller after the fee has been subtracted.
	    uint numEthers = numEthersBeforeFee - fee;

	    //updating the numerator of the fee-easing factor
	    sellSum += initialInput_ETH;

		// Burn the bonds which were just sold from the total supply.
		_totalSupply -= amount;

	    // Remove the bonds from the balance of the buyer.
	    hodlBonds[msg.sender] -= amount;


		// Check if we have bonds in existence
		uint resolveFee;
		if (_totalSupply > 0 && dissolvingResolves > 0){
			// Scale the Ether taken as the selling fee by the scaleFactor variable.
			resolveFee = fee * scaleFactor;

			// Fee is distributed to all remaining resolve holders.
			// rewardPerResolve is the amount gained per resolve thanks to this sell.
			uint rewardPerResolve = resolveFee / dissolvingResolves;

			// The Ether value per resolve is increased proportionally.
			earningsPerResolve += rewardPerResolve;
		}
		
		// Send the ethereum to the address that requested the sell.
		contractBalance -= numEthers;
		msg.sender.transfer(numEthers);
		emit Sell( msg.sender, amount, numEthers, mintedResolves, resolveFee, initialInput_ETH);
		return (numEthers, mintedResolves);
	}

	// Dynamic value of Ether in reserve, according to the CRR requirement.
	function reserve() public view returns (uint256 amount) {
		return balance() -
			 ((uint256) ((int256) (earningsPerResolve * dissolvingResolves) - totalPayouts) / scaleFactor);
	}

	// Calculates the number of bonds that can be bought for a given amount of Ether, according to the
	// dynamic reserve and _totalSupply values (derived from the buy and sell prices).
	function getBondsForEther(uint256 ethervalue) public view returns (uint256 bonds) {
		uint new_totalSupply = fixedExp( fixedLog(reserve() + ethervalue ) * crr_n/crr_d + price_coeff);
		if (new_totalSupply < _totalSupply)
			return 0;
		else
			return new_totalSupply - _totalSupply;
	}

	// Semantically similar to getBondsForEther, but subtracts the callers balance from the amount of Ether returned for conversion.
	function calculateBondsFromReinvest(uint256 ethervalue, uint256 subvalue) public view returns (uint256 bondTokens) {
		return fixedExp(fixedLog(reserve() - subvalue + ethervalue)*crr_n/crr_d + price_coeff)- _totalSupply;
	}

	// Converts a number bonds into an Ether value.
	function getEtherForBonds(uint256 bondTokens) public view returns (uint256 ethervalue) {
		// How much reserve Ether do we have left in the contract?
		uint reserveAmount = reserve();

		// If you're the Highlander (or bagholder), you get The Prize. Everything left in the vault.
		if (bondTokens == _totalSupply)
			return reserveAmount;

		// If there would be excess Ether left after the transaction this is called within, return the Ether
		// corresponding to the equation in Dr Jochen Hoenicke's original Ponzi paper, which can be found
		// at https://test.jochen-hoenicke.de/eth/ponzitoken/ in the third equation, with the CRR numerator
		// and denominator altered to 1 and 2 respectively.
		uint x = fixedExp((fixedLog(_totalSupply - bondTokens) - price_coeff) * crr_d/crr_n);
		if (x > reserveAmount)
			return 0;

		return reserveAmount - x;
	}

	// You don't care about these, but if you really do they're hex values for
	// co-efficients used to simulate approximations of the log and exp functions.
		int256  constant one        = 0x10000000000000000;
		uint256 constant sqrt2      = 0x16a09e667f3bcc908;
		uint256 constant sqrtdot5   = 0x0b504f333f9de6484;
		int256  constant ln2        = 0x0b17217f7d1cf79ac;
		int256  constant ln2_64dot5 = 0x2cb53f09f05cc627c8;
		int256  constant c1         = 0x1ffffffffff9dac9b;
		int256  constant c3         = 0x0aaaaaaac16877908;
		int256  constant c5         = 0x0666664e5e9fa0c99;
		int256  constant c7         = 0x049254026a7630acf;
		int256  constant c9         = 0x038bd75ed37753d68;
		int256  constant c11        = 0x03284a0c14610924f;

	// The polynomial R = c1*x + c3*x^3 + ... + c11 * x^11
	// approximates the function log(1+x)-log(1-x)
	// Hence R(s) = log((1+s)/(1-s)) = log(a)
	function fixedLog(uint256 a) internal pure returns (int256 log) {
		int32 scale = 0;
		while (a > sqrt2) {
			a /= 2;
			scale++;
		}
		while (a <= sqrtdot5) {
			a *= 2;
			scale--;
		}
		int256 s = (((int256)(a) - one) * one) / ((int256)(a) + one);
		int z = (s*s) / one;
		return scale * ln2 +
			(s*(c1 + (z*(c3 + (z*(c5 + (z*(c7 + (z*(c9 + (z*c11/one))
				/one))/one))/one))/one))/one);
	}

	int256 constant c2 =  0x02aaaaaaaaa015db0;
	int256 constant c4 = -0x000b60b60808399d1;
	int256 constant c6 =  0x0000455956bccdd06;
	int256 constant c8 = -0x000001b893ad04b3a;

	// The polynomial R = 2 + c2*x^2 + c4*x^4 + ...
	// approximates the function x*(exp(x)+1)/(exp(x)-1)
	// Hence exp(x) = (R(x)+x)/(R(x)-x)
	function fixedExp(int256 a) internal pure returns (uint256 exp) {
		int256 scale = (a + (ln2_64dot5)) / ln2 - 64;
		a -= scale*ln2;
		int256 z = (a*a) / one;
		int256 R = ((int256)(2) * one) +
			(z*(c2 + (z*(c4 + (z*(c6 + (z*c8/one))/one))/one))/one);
		exp = (uint256) (((R + a) * one) / (R - a));
		if (scale >= 0)
			exp <<= scale;
		else
			exp >>= -scale;
		return exp;
	}

	// This allows you to buy bonds by sending Ether directly to the smart contract
	// without including any transaction data (useful for, say, mobile wallet apps).
	function () payable external {
		// msg.value is the amount of Ether sent by the transaction.
		if (msg.value > 0) {
			fund();
		} else {
			withdraw( resolveEarnings(msg.sender) );
		}
	}

	// Allow contract to accept resolve tokens
	event StakeResolves( address indexed addr, uint256 amountStaked, bytes _data );
	function tokenFallback(address from, uint value, bytes calldata _data) external{
		if(msg.sender == address(resolveToken) ){
			resolveWeight[from] += value;
			dissolvingResolves += value;

			// Update the payout array so that the "resolve shareholder" cannot claim resolveEarnings on previous staked resolves.
			int payoutDiff  = (int256) (earningsPerResolve * value);

			// Then we update the payouts array for the "resolve shareholder" with this amount
			payouts[from] += payoutDiff;

			// And then we finally add it to the variable tracking the total amount spent to maintain invariance.
			totalPayouts += payoutDiff;
			emit StakeResolves(from, value, _data);
		}else{
			revert("no want");
		}
	}


	// Withdraws resolveEarnings held by the caller sending the transaction, updates
	// the requisite global variables, and transfers Ether back to the caller.
	event Withdraw( address indexed addr, uint256 earnings, uint256 dissolve );
	function withdraw(uint amount) public returns(uint){
		// Retrieve the resolveEarnings associated with the address the request came from.
		uint totalEarnings = resolveEarnings(msg.sender);
		require(amount <= totalEarnings, "the amount exceeds total earnings");
		uint oldWeight = resolveWeight[msg.sender];
		resolveWeight[msg.sender] = oldWeight * (totalEarnings - amount) / totalEarnings;
		uint weightDiff = oldWeight - resolveWeight[msg.sender];
		dissolved += weightDiff;
		dissolvingResolves -= weightDiff;

		//something about invariance
		int resolvePayoutDiff  = (int256) (earningsPerResolve * weightDiff);

		payouts[msg.sender] += (int256) (amount * scaleFactor) - resolvePayoutDiff;

		// Increase the total amount that's been paid out to maintain invariance.
		totalPayouts += (int256) (amount * scaleFactor) - resolvePayoutDiff;

		// Send the resolveEarnings to the address that requested the withdraw.
		contractBalance -= amount;
		msg.sender.transfer(amount);
		emit Withdraw( msg.sender, amount, weightDiff);
		return weightDiff;
	}
	event PullResolves( address indexed addr, uint256 pulledResolves, uint256 forfeiture);
	function pullResolves(uint amount) public{
		require(amount <= resolveWeight[msg.sender], "that amount is too large");
		//something about invariance

		uint forfeitedEarnings  =  resolveEarnings(msg.sender)  * amount / resolveWeight[msg.sender] * scaleFactor;
		resolveWeight[msg.sender] -= amount;
		dissolvingResolves -= amount;
		// The Ether value per token is increased proportionally.
		earningsPerResolve += forfeitedEarnings / dissolvingResolves;
		resolveToken.transfer(msg.sender, amount);
		emit PullResolves( msg.sender, amount, forfeitedEarnings / scaleFactor);
	}

	event BondTransfer(address from, address to, uint amount);
	function bondTransfer( address to, uint amount ) public{
		//attack someone's resolve potential by sending them some love
		address sender = msg.sender;
		uint totalBonds = hodlBonds[sender];
		require(amount <= totalBonds, "amount exceeds hodlBonds");
		uint ethSpent = avgFactor_ethSpent[sender] * amount / totalBonds;
		uint buyInTimeSum = avgFactor_buyInTimeSum[sender] * amount / totalBonds;
		avgFactor_ethSpent[sender] -= ethSpent;
		avgFactor_buyInTimeSum[sender] -= buyInTimeSum;
		hodlBonds[sender] -= amount;
		avgFactor_ethSpent[to] += ethSpent;
		avgFactor_buyInTimeSum[to] += buyInTimeSum;
		hodlBonds[to] += amount;
		emit BondTransfer(sender, to, amount);
	}
}

contract ERC223ReceivingContract{
    function tokenFallback(address _from, uint _value, bytes calldata _data) external;
}

contract ResolveToken{
	address pyramid;

	constructor(address _pyramid) public{
		pyramid = _pyramid;
	}

	modifier pyramidOnly{
	  require(msg.sender == pyramid);
	  _;
    }

	event Transfer(
		address indexed from,
		address indexed to,
		uint256 amount,
		bytes data
	);

	event Mint(
		address indexed addr,
		uint256 amount
	);

	mapping(address => uint) balances;
	mapping(address => mapping(address => uint)) approvals;

	string public name = "Resolve";
    string public symbol = "PoWHr";
    uint8 constant public decimals = 18;
	uint256 private _totalSupply;

    function totalSupply() public view returns (uint256) {
        return _totalSupply;
    }
	function mint(address _address, uint _value) public pyramidOnly(){
		balances[_address] += _value;
		_totalSupply += _value;
		emit Mint(_address, _value);
	}

	// Function that is called when a user or another contract wants to transfer funds .
	function transfer(address _to, uint _value, bytes memory _data) public returns (bool success) {
		if (balanceOf(msg.sender) < _value) revert();
		if(isContract(_to)) {
			return transferToContract(_to, _value, _data);
		}else{
			return transferToAddress(_to, _value, _data);
		}
	}

	// Standard function transfer similar to ERC20 transfer with no _data .
	// Added due to backwards compatibility reasons .
	function transfer(address _to, uint _value) public returns (bool success) {
		if (balanceOf(msg.sender) < _value) revert();
		//standard function transfer similar to ERC20 transfer with no _data
		//added due to backwards compatibility reasons
		bytes memory empty;
		if(isContract(_to)){
			return transferToContract(_to, _value, empty);
		}else{
			return transferToAddress(_to, _value, empty);
		}
	}

	//assemble the given address bytecode. If bytecode exists then the _addr is a contract.
	function isContract(address _addr) public view returns (bool is_contract) {
		uint length;
		assembly {
			//retrieve the size of the code on target address, this needs assembly
			length := extcodesize(_addr)
		}
		if(length>0) {
			return true;
		}else {
			return false;
		}
	}

	//function that is called when transaction target is an address
	function transferToAddress(address _to, uint _value, bytes memory _data) private returns (bool success) {
		moveTokens(msg.sender,_to,_value);
		emit Transfer(msg.sender, _to, _value, _data);
		return true;
	}

	//function that is called when transaction target is a contract
	function transferToContract(address _to, uint _value, bytes memory _data) private returns (bool success) {
		moveTokens(msg.sender, _to, _value);
		ERC223ReceivingContract reciever = ERC223ReceivingContract(_to);
		reciever.tokenFallback(msg.sender, _value, _data);
		emit Transfer(msg.sender, _to, _value, _data);
		return true;
	}

	function moveTokens(address _from, address _to, uint _amount) private{
		balances[_from] -= _amount;
		balances[_to] += _amount;
	}

    function balanceOf(address _owner) public view returns (uint balance) {
        return balances[_owner];
    }

    function allowance(address src, address guy) public view returns (uint) {
        return approvals[src][guy];
    }

    function transferFrom(address src, address dst, uint wad) public returns (bool){
        require(approvals[src][msg.sender] >=  wad, "That amount is not approved");
        require(balances[src] >=  wad, "That amount is not available from this wallet");
        if (src != msg.sender) {
            approvals[src][msg.sender] -=  wad;
        }
		moveTokens(src,dst,wad);

        bytes memory empty;
        emit Transfer(src, dst, wad, empty);

        return true;
    }

    function approve(address guy, uint wad) public returns (bool) {
        approvals[msg.sender][guy] = wad;

        emit Approval(msg.sender, guy, wad);

        return true;
    }

    event Approval(address indexed src, address indexed guy, uint wad);
}

Contract Security Audit

Contract ABI

[{"constant":true,"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"uint256","name":"bondTokens","type":"uint256"}],"name":"getEtherForBonds","outputs":[{"internalType":"uint256","name":"ethervalue","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"uint256","name":"paidAmount","type":"uint256"}],"name":"fluxFee","outputs":[{"internalType":"uint256","name":"fee","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"avgFactor_ethSpent","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"pullResolves","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"dissolvingResolves","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"withdraw","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"uint256","name":"ethervalue","type":"uint256"},{"internalType":"uint256","name":"subvalue","type":"uint256"}],"name":"calculateBondsFromReinvest","outputs":[{"internalType":"uint256","name":"bondTokens","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"sellSum","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"_totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"_owner","type":"address"}],"name":"resolveEarnings","outputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"avgFactor_buyInTimeSum","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"payouts","outputs":[{"internalType":"int256","name":"","type":"int256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"uint256","name":"scale","type":"uint256"}],"name":"pricing","outputs":[{"internalType":"uint256","name":"buyPrice","type":"uint256"},{"internalType":"uint256","name":"sellPrice","type":"uint256"},{"internalType":"uint256","name":"fee","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"addr","type":"address"},{"internalType":"uint256","name":"bondsReleased","type":"uint256"}],"name":"getReturnsForBonds","outputs":[{"internalType":"uint256","name":"etherValue","type":"uint256"},{"internalType":"uint256","name":"mintedResolves","type":"uint256"},{"internalType":"uint256","name":"new_releaseTimeSum","type":"uint256"},{"internalType":"uint256","name":"new_releaseWeight","type":"uint256"},{"internalType":"uint256","name":"initialInput_ETH","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"_owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"balance","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"buySum","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"getResolveContract","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"NOW","outputs":[{"internalType":"uint256","name":"time","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"contractBalance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"hodlBonds","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"uint256","name":"ethervalue","type":"uint256"}],"name":"getBondsForEther","outputs":[{"internalType":"uint256","name":"bonds","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"resolveToken","outputs":[{"internalType":"contract ResolveToken","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"genesis","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"sellAllBonds","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"price_coeff","outputs":[{"internalType":"int256","name":"","type":"int256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"getMeOutOfHere","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[],"name":"fund","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":true,"stateMutability":"payable","type":"function"},{"constant":true,"inputs":[{"internalType":"uint256","name":"bonds","type":"uint256"},{"internalType":"bool","name":"upDown","type":"bool"}],"name":"getPriceForBonds","outputs":[{"internalType":"uint256","name":"price","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"tokenFallback","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"reserve","outputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"avgFactor_releaseWeight","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"amountFromEarnings","type":"uint256"}],"name":"reinvestEarnings","outputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"avgHodl","outputs":[{"internalType":"uint256","name":"hodlTime","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"dissolved","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"resolveWeight","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"avgFactor_releaseTimeSum","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"sellBonds","outputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"bondTransfer","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"inputs":[],"payable":false,"stateMutability":"nonpayable","type":"constructor"},{"payable":true,"stateMutability":"payable","type":"fallback"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"addr","type":"address"},{"indexed":false,"internalType":"uint256","name":"reinvested","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"dissolved","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"bonds","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"resolveTax","type":"uint256"}],"name":"Reinvest","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"addr","type":"address"},{"indexed":false,"internalType":"uint256","name":"spent","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"bonds","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"resolveTax","type":"uint256"}],"name":"Buy","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"addr","type":"address"},{"indexed":false,"internalType":"uint256","name":"bondsSold","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"cashout","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"resolves","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"resolveTax","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"initialCash","type":"uint256"}],"name":"Sell","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"addr","type":"address"},{"indexed":false,"internalType":"uint256","name":"amountStaked","type":"uint256"},{"indexed":false,"internalType":"bytes","name":"_data","type":"bytes"}],"name":"StakeResolves","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"addr","type":"address"},{"indexed":false,"internalType":"uint256","name":"earnings","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"dissolve","type":"uint256"}],"name":"Withdraw","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"addr","type":"address"},{"indexed":false,"internalType":"uint256","name":"pulledResolves","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"forfeiture","type":"uint256"}],"name":"PullResolves","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"from","type":"address"},{"indexed":false,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"BondTransfer","type":"event"}]

608060405234801561001057600080fd5b5042600d55604051309061002390610076565b6001600160a01b03909116815260405190819003602001906000f080158015610050573d6000803e3d6000fd5b50601080546001600160a01b0319166001600160a01b0392909216919091179055610083565b610c4e80611c8183390190565b611bef806100926000396000f3fe6080604052600436106102515760003560e01c80638b7afe2e11610139578063b77fed2d116100b6578063e0cfe6ba1161007a578063e0cfe6ba1461089c578063e10591f3146108b1578063e3c4d97d146108c6578063e6eaadd7146108f9578063ee4350ed1461090e578063f054fdcb1461093857610251565b8063b77fed2d1461076b578063c0ee0b8a1461079d578063cd3293de1461082f578063da9b464014610844578063dce050101461085957610251565b8063a7f0b3de116100fd578063a7f0b3de1461070f578063aa57424414610724578063af5f835f14610739578063b1e352421461074e578063b60d42881461076357610251565b80638b7afe2e146106735780638bd259c51461068857806395d89b41146106bb57806398de3989146106d0578063a3e5301c146106fa57610251565b8063382fbdd7116101d25780636945d800116101965780636945d800146105395780636a540df01461058157806370a08231146105e557806372b566f81461061857806378d748d01461062d5780637f1673711461065e57610251565b8063382fbdd7146104765780633eaaf86b1461048b5780634851f91a146104a05780635d10b425146104d357806365bcfbe71461050657610251565b80631fc5cfc4116102195780631fc5cfc4146103b257806328823774146103dc5780632e1a7d4d146103f1578063313ce5671461041b5780633733e6b31461044657610251565b806306fdde031461027a5780630fc0a430146103045780631554784a1461034057806318160ddd1461036a5780631a81ea2a1461037f575b34156102655761025f610971565b50610278565b610276610271336109a2565b6109db565b505b005b34801561028657600080fd5b5061028f610b14565b6040805160208082528351818301528351919283929083019185019080838360005b838110156102c95781810151838201526020016102b1565b50505050905090810190601f1680156102f65780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34801561031057600080fd5b5061032e6004803603602081101561032757600080fd5b5035610b34565b60408051918252519081900360200190f35b34801561034c57600080fd5b5061032e6004803603602081101561036357600080fd5b5035610b9f565b34801561037657600080fd5b5061032e610c55565b34801561038b57600080fd5b5061032e600480360360208110156103a257600080fd5b50356001600160a01b0316610c5b565b3480156103be57600080fd5b50610278600480360360208110156103d557600080fd5b5035610c6d565b3480156103e857600080fd5b5061032e610dff565b3480156103fd57600080fd5b5061032e6004803603602081101561041457600080fd5b50356109db565b34801561042757600080fd5b50610430610e05565b6040805160ff9092168252519081900360200190f35b34801561045257600080fd5b5061032e6004803603604081101561046957600080fd5b5080359060200135610e0a565b34801561048257600080fd5b5061032e610e4e565b34801561049757600080fd5b5061032e610e54565b3480156104ac57600080fd5b5061032e600480360360208110156104c357600080fd5b50356001600160a01b03166109a2565b3480156104df57600080fd5b5061032e600480360360208110156104f657600080fd5b50356001600160a01b0316610e5a565b34801561051257600080fd5b5061032e6004803603602081101561052957600080fd5b50356001600160a01b0316610e6c565b34801561054557600080fd5b506105636004803603602081101561055c57600080fd5b5035610e7e565b60408051938452602084019290925282820152519081900360600190f35b34801561058d57600080fd5b506105ba600480360360408110156105a457600080fd5b506001600160a01b038135169060200135610ee6565b6040805195865260208601949094528484019290925260608401526080830152519081900360a00190f35b3480156105f157600080fd5b5061032e6004803603602081101561060857600080fd5b50356001600160a01b0316610fde565b34801561062457600080fd5b5061032e610ff9565b34801561063957600080fd5b50610642610fff565b604080516001600160a01b039092168252519081900360200190f35b34801561066a57600080fd5b5061032e61100e565b34801561067f57600080fd5b5061032e611016565b34801561069457600080fd5b5061032e600480360360208110156106ab57600080fd5b50356001600160a01b031661101c565b3480156106c757600080fd5b5061028f61102e565b3480156106dc57600080fd5b5061032e600480360360208110156106f357600080fd5b503561104e565b34801561070657600080fd5b50610642611097565b34801561071b57600080fd5b5061032e6110a6565b34801561073057600080fd5b506102786110ac565b34801561074557600080fd5b5061032e6110c1565b34801561075a57600080fd5b506102786110cf565b61032e610971565b34801561077757600080fd5b5061032e6004803603604081101561078e57600080fd5b508035906020013515156110e6565b3480156107a957600080fd5b50610278600480360360608110156107c057600080fd5b6001600160a01b03823516916020810135918101906060810160408201356401000000008111156107f057600080fd5b82018360208201111561080257600080fd5b8035906020019184600183028401116401000000008311171561082457600080fd5b509092509050611154565b34801561083b57600080fd5b5061032e611258565b34801561085057600080fd5b5061032e611280565b34801561086557600080fd5b506108836004803603602081101561087c57600080fd5b5035611286565b6040805192835260208301919091528051918290030190f35b3480156108a857600080fd5b5061032e61147f565b3480156108bd57600080fd5b5061032e6114a1565b3480156108d257600080fd5b5061032e600480360360208110156108e957600080fd5b50356001600160a01b03166114a7565b34801561090557600080fd5b5061032e6114b9565b34801561091a57600080fd5b506108836004803603602081101561093157600080fd5b50356114bf565b34801561094457600080fd5b506102786004803603604081101561095b57600080fd5b506001600160a01b03813516906020013561153d565b60008064e8d4a510003411156109985760088054340190556109916116aa565b905061099d565b600080fd5b905090565b6001600160a01b0381166000908152600460209081526040808320546003909252822054600f54600160401b929102030490505b919050565b6000806109e7336109a2565b905080831115610a285760405162461bcd60e51b8152600401808060200182810382526021815260200180611b9a6021913960400191505060405180910390fd5b3360009081526003602052604090205481848103820281610a4557fe5b3360008181526003602090815260408083209590940494859055600780549587039586019055600680548690039055600f5460049091528382208054918602600160401b8b02819003928301909155600e8054909201909155600880548a90039055925188156108fc0291899190818181858888f19350505050158015610ad0573d6000803e3d6000fd5b506040805187815260208101849052815133927ff279e6a1f5e320cca91135676d9cb6e44ca8a08c0b88342bcdb1144f6511b568928290030190a250949350505050565b60405180604001604052806004815260200163109bdb9960e21b81525081565b600080610b3f611258565b9050600554831415610b525790506109d6565b6000610b82600160026801337fa66607bada5419610b7388600554036117c4565b030281610b7c57fe5b056118b8565b905081811115610b97576000925050506109d6565b900392915050565b600060065460001415610bb4575060006109d6565b600754601054604080516318160ddd60e01b81529051600093926001600160a01b0316916318160ddd916004808301926020929190829003018186803b158015610bfd57600080fd5b505afa158015610c11573d6000803e3d6000fd5b505050506040513d6020811015610c2757600080fd5b5051600954600a54600654939092039350918390860281610c4457fe5b040281610c4d57fe5b049392505050565b60055490565b60016020526000908152604090205481565b33600090815260036020526040902054811115610cd1576040805162461bcd60e51b815260206004820152601860248201527f7468617420616d6f756e7420697320746f6f206c617267650000000000000000604482015290519081900360640190fd5b336000818152600360205260408120549091600160401b91908490610cf5906109a2565b0281610cfd57fe5b3360009081526003602052604090208054869003905560068054869003908190559190049190910291508181610d2f57fe5b600f80549290910490910190556010546040805163a9059cbb60e01b81523360048201526024810185905290516001600160a01b039092169163a9059cbb916044808201926020929091908290030181600087803b158015610d9057600080fd5b505af1158015610da4573d6000803e3d6000fd5b505050506040513d6020811015610dba57600080fd5b505060408051838152600160401b83046020820152815133927ff597bb09fb98a90b578e74952df9d7e06d7505f52a264d786bb11770873dccb2928290030190a25050565b60065481565b600c81565b6000600554610e446801337fa66607bada541960026001610e358888610e2e611258565b03016117c4565b0281610e3d57fe5b05016118b8565b0390505b92915050565b600a5481565b60055481565b60026020526000908152604090205481565b60046020526000908152604090205481565b600080600080610e91600160401b610b9f565b600160401b03610ea28660016110e6565b600160401b0281610eaf57fe5b0490506000610ebf8660006110e6565b9050610eca81610b9f565b90038181610ed788610b9f565b94509450945050509193909250565b600080600080600080610ef887610b34565b6001600160a01b0389166000908152602081815260408083205460019092528220549293509091890281610f2857fe5b6001600160a01b038b1660009081526001602090815260408083205460029092528220549390920493509181610f5a57fe5b049050600081600160401b610f6d61100e565b02039050600082600160401b8584020402600c540190506000600160401b84860281610f9557fe5b04600b540190506000818381610fa757fe5b04905086878783878a0281610fb857fe5b040281610fc157fe5b919d5090049a509198509650929450505050509295509295909350565b6001600160a01b031660009081526020819052604090205490565b60095481565b6010546001600160a01b031690565b600d54420390565b60085481565b60006020819052908152604090205481565b604051806040016040528060048152602001631093d39160e21b81525081565b6000806110756801337fa66607bada541960026001610e358761106f611258565b016117c4565b905060055481101561108b5760009150506109d6565b600554900390506109d6565b6010546001600160a01b031681565b600d5481565b6110bd6110b833610fde565b6119a5565b5050565b6801337fa66607bada541981565b6110d76110ac565b6110e3610271336109a2565b50565b6000806110f1611258565b9050821561112757600061111a600160026801337fa66607bada5419610b7389600554016117c4565b919091039150610e489050565b6000611148600160026801337fa66607bada5419610b7389600554036117c4565b9091039150610e489050565b6010546001600160a01b031633141561121b576001600160a01b03841660008181526003602090815260408083208054880190556006805488019055600f54600483529281902080549388029384019055600e80548401905580518781529182018181529082018590529192917f496d21a3791df17b9e71acba0bd6c88352f3da2636dc2bfae959f09af6c4fb999187918791879160608201848480828437600083820152604051601f909101601f1916909201829003965090945050505050a250611252565b6040805162461bcd60e51b81526020600482015260076024820152661b9bc81dd85b9d60ca1b604482015290519081900360640190fd5b50505050565b6000600160401b600e54600654600f5402038161127157fe5b0461127a611b90565b03905090565b600b5481565b6000806000611294336109a2565b9050808411156112d55760405162461bcd60e51b8152600401808060200182810382526021815260200180611b9a6021913960400191505060405180910390fd5b33600090815260036020526040902054818581038202816112f257fe5b3360009081526003602090815260408083209490930493849055600780549486039485019055600680548590039055600f5460049091529190208054918302600160401b8902819003928301909155600e80549092019091558664e8d4a5100081101561135e57600080fd5b33600061136a83610b9f565b60098054828603908101909155909150600061138461100e565b336000908152600160209081526040808320805487019055600290915281208054858402600160401b020190559091506113be838e610e0a565b90506000806005541180156113d35750600085115b156113fd57600160401b85029050600060065482816113ee57fe5b600f8054929091049091019055505b60058054830190556001600160a01b0386166000908152602081815260409182902080548501905581518981529081018b905280820184905260608101839052905133917fc7209ba1b691ad661f5afd3d5360a45f0f4e3dac25357bf4f346e73166f35c93919081900360800190a2509a509598505050505050505050915091565b6000600160401b600b54600c548161149357fe5b048161149b57fe5b04905090565b60075481565b60036020526000908152604090205481565b600c5481565b60008060006114cd33610fde565b905083811015611524576040805162461bcd60e51b815260206004820152601b60248201527f416d6f756e74206973206d6f7265207468616e2062616c616e63650000000000604482015290519081900360640190fd5b600080611530866119a5565b9095509350505050915091565b33600081815260208190526040902054808311156115a2576040805162461bcd60e51b815260206004820152601860248201527f616d6f756e74206578636565647320686f646c426f6e64730000000000000000604482015290519081900360640190fd5b6001600160a01b03821660009081526001602052604081205482908502816115c657fe5b6001600160a01b0385166000908152600260205260408120549290910492509083908602816115f157fe5b6001600160a01b03808716600081815260016020818152604080842080548b9003905560028083528185208054999098049889900390975583825280842080548e90039055948d1680845291815284832080548a0190559485528382208054870190558185529083902080548b019055825191825292810192909252818101889052519192507ffa9d858e507f19f06f1a6fb70a83f432e083a0eff84c60e90a1c858471a2a09d919081900360600190a1505050505050565b600064e8d4a510003410156116be57600080fd5b60006116c934610b9f565b600980543483900390810190915590915060006116e461100e565b336000908152600160209081526040808320805487019055600290915281208054858402600160401b0201905590915061171d8361104e565b60058054820181553360009081526020819052604081208054840190559054919250901580159061174e5750600085115b1561177857600160401b850290506000600654828161176957fe5b600f8054929091049091019055505b6040805134815260208101849052808201839052905133917fbeae048c6d270d9469f86cf6e8fedda3c60ad770f16c24c9fc131c8e9a09101d919081900360600190a250935050505090565b6000805b68016a09e667f3bcc9088311156117e7576002830492506001016117c8565b5b67b504f333f9de648483116118075760029290920291600019016117e8565b6000600160401b8401600160401b808603028161182057fe5b059050600160401b81800281900590808080806738bd75ed37753d68673284a0c14610924f8702829005018602056749254026a7630acf0185028161186157fe5b0567666664e5e9fa0c990184028161187557fe5b0567aaaaaaac168779080183028161188957fe5b056801ffffffffff9dac9b0183028161189e57fe5b0567b17217f7d1cf79ac8460030b02019350505050919050565b600080604067b17217f7d1cf79ac682cb53f09f05cc627c885010503905067b17217f7d1cf79ac8102830392506000600160401b848502816118f657fe5b0590506000600160401b808080651b893ad04b3919860205660455956bccdd060185028161192057fe5b0566b60b60808399d0190184028161193457fe5b05672aaaaaaaaa015db00183028161194857fe5b05600160401b600202019050848103600160401b868301028161196757fe5b05935060008312611988578284600082121561197f57fe5b901b935061199d565b8260000384600082121561199857fe5b901c93505b505050919050565b60008060008060008060006119ba3389610ee6565b601054604080516340c10f1960e01b8152336004820152602481018790529051969b5094995092975090955093506001600160a01b0316916340c10f199160448082019260009290919082900301818387803b158015611a1957600080fd5b505af1158015611a2d573d6000803e3d6000fd5b505050600c84905550600b82905533600090815260016020908152604080832080548590039055828252808320546002909252909120548982030281611a6f57fe5b33600090815260026020526040812092909104909155611a8e86610b9f565b600a805484019055600580548b9003815533600090815260208190526040812080548d9003905590549192508288039115801590611ace57506000600654115b15611af857600160401b8302905060006006548281611ae957fe5b600f8054929091049091019055505b600880548390039055604051339083156108fc029084906000818181858888f19350505050158015611b2e573d6000803e3d6000fd5b50604080518c8152602081018490528082018990526060810183905260808101869052905133917f20a7fc03b19d7f251cc907f177ff82194c6aebe9a2b47e1cd734dcb6bf772cc2919081900360a00190a25097509395505050505050915091565b6008543490039056fe74686520616d6f756e74206578636565647320746f74616c206561726e696e6773a265627a7a723158201afc5d70c8648c3cb67f6d769ba46865968443d6796d88154d9a713c79a85eef64736f6c634300050b003260c0604052600760808190527f5265736f6c76650000000000000000000000000000000000000000000000000060a090815261003e91600391906100d9565b506040805180820190915260058082527f506f5748720000000000000000000000000000000000000000000000000000006020909201918252610083916004916100d9565b5034801561009057600080fd5b50604051610c4e380380610c4e833981810160405260208110156100b357600080fd5b5051600080546001600160a01b0319166001600160a01b03909216919091179055610174565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f1061011a57805160ff1916838001178555610147565b82800160010185558215610147579182015b8281111561014757825182559160200191906001019061012c565b50610153929150610157565b5090565b61017191905b80821115610153576000815560010161015d565b90565b610acb806101836000396000f3fe608060405234801561001057600080fd5b50600436106100b45760003560e01c806340c10f191161007157806340c10f191461020a57806370a082311461023857806395d89b411461025e578063a9059cbb14610266578063be45fd6214610292578063dd62ed3e1461034d576100b4565b806306fdde03146100b9578063095ea7b314610136578063162790551461017657806318160ddd1461019c57806323b872dd146101b6578063313ce567146101ec575b600080fd5b6100c161037b565b6040805160208082528351818301528351919283929083019185019080838360005b838110156100fb5781810151838201526020016100e3565b50505050905090810190601f1680156101285780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b6101626004803603604081101561014c57600080fd5b506001600160a01b038135169060200135610409565b604080519115158252519081900360200190f35b6101626004803603602081101561018c57600080fd5b50356001600160a01b0316610470565b6101a461048f565b60408051918252519081900360200190f35b610162600480360360608110156101cc57600080fd5b506001600160a01b03813581169160208101359091169060400135610495565b6101f461066e565b6040805160ff9092168252519081900360200190f35b6102366004803603604081101561022057600080fd5b506001600160a01b038135169060200135610673565b005b6101a46004803603602081101561024e57600080fd5b50356001600160a01b03166106e9565b6100c1610704565b6101626004803603604081101561027c57600080fd5b506001600160a01b03813516906020013561075f565b610162600480360360608110156102a857600080fd5b6001600160a01b03823516916020810135918101906060810160408201356401000000008111156102d857600080fd5b8201836020820111156102ea57600080fd5b8035906020019184600183028401116401000000008311171561030c57600080fd5b91908080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152509295506107a4945050505050565b6101a46004803603604081101561036357600080fd5b506001600160a01b03813581169160200135166107e6565b6003805460408051602060026001851615610100026000190190941693909304601f810184900484028201840190925281815292918301828280156104015780601f106103d657610100808354040283529160200191610401565b820191906000526020600020905b8154815290600101906020018083116103e457829003601f168201915b505050505081565b3360008181526002602090815260408083206001600160a01b038716808552908352818420869055815186815291519394909390927f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925928290030190a35060015b92915050565b6000813b801561048457600191505061048a565b60009150505b919050565b60055490565b6001600160a01b038316600090815260026020908152604080832033845290915281205482111561050d576040805162461bcd60e51b815260206004820152601b60248201527f5468617420616d6f756e74206973206e6f7420617070726f7665640000000000604482015290519081900360640190fd5b6001600160a01b0384166000908152600160205260409020548211156105645760405162461bcd60e51b815260040180806020018281038252602d815260200180610a6a602d913960400191505060405180910390fd5b6001600160a01b038416331461059f576001600160a01b03841660009081526002602090815260408083203384529091529020805483900390555b6105aa848484610811565b6060836001600160a01b0316856001600160a01b03167fe19260aff97b920c7df27010903aeb9c8d2be5d310a2c67824cf3f15396e4c1685846040518083815260200180602001828103825283818151815260200191508051906020019080838360005b8381101561062657818101518382015260200161060e565b50505050905090810190601f1680156106535780820380516001836020036101000a031916815260200191505b50935050505060405180910390a360019150505b9392505050565b601281565b6000546001600160a01b0316331461068a57600080fd5b6001600160a01b0382166000818152600160209081526040918290208054850190556005805485019055815184815291517f0f6798a560793a54c3bcfe86a93cde1e73087d944c0ea20544137d41213968859281900390910190a25050565b6001600160a01b031660009081526001602052604090205490565b6004805460408051602060026001851615610100026000190190941693909304601f810184900484028201840190925281815292918301828280156104015780601f106103d657610100808354040283529160200191610401565b60008161076b336106e9565b101561077657600080fd5b606061078184610470565b1561079957610791848483610843565b91505061046a565b61079184848361099d565b6000826107b0336106e9565b10156107bb57600080fd5b6107c484610470565b156107db576107d4848484610843565b9050610667565b6107d484848461099d565b6001600160a01b03918216600090815260026020908152604080832093909416825291909152205490565b6001600160a01b0392831660009081526001602052604080822080548490039055929093168352912080549091019055565b6000610850338585610811565b60405163607705c560e11b815233600482018181526024830186905260606044840190815285516064850152855188946001600160a01b0386169463c0ee0b8a9490938a938a9360840190602085019080838360005b838110156108be5781810151838201526020016108a6565b50505050905090810190601f1680156108eb5780820380516001836020036101000a031916815260200191505b50945050505050600060405180830381600087803b15801561090c57600080fd5b505af1158015610920573d6000803e3d6000fd5b50505050846001600160a01b0316336001600160a01b03167fe19260aff97b920c7df27010903aeb9c8d2be5d310a2c67824cf3f15396e4c1686866040518083815260200180602001828103825283818151815260200191508051906020019080838360008381101561062657818101518382015260200161060e565b60006109aa338585610811565b836001600160a01b0316336001600160a01b03167fe19260aff97b920c7df27010903aeb9c8d2be5d310a2c67824cf3f15396e4c1685856040518083815260200180602001828103825283818151815260200191508051906020019080838360005b83811015610a24578181015183820152602001610a0c565b50505050905090810190601f168015610a515780820380516001836020036101000a031916815260200191505b50935050505060405180910390a3506001939250505056fe5468617420616d6f756e74206973206e6f7420617661696c61626c652066726f6d20746869732077616c6c6574a265627a7a723158205628d58443cf0a52b58a2aa34cfba85383e349201d6049bfd273f9c36a20bdc464736f6c634300050b0032

Deployed Bytecode

0x6080604052600436106102515760003560e01c80638b7afe2e11610139578063b77fed2d116100b6578063e0cfe6ba1161007a578063e0cfe6ba1461089c578063e10591f3146108b1578063e3c4d97d146108c6578063e6eaadd7146108f9578063ee4350ed1461090e578063f054fdcb1461093857610251565b8063b77fed2d1461076b578063c0ee0b8a1461079d578063cd3293de1461082f578063da9b464014610844578063dce050101461085957610251565b8063a7f0b3de116100fd578063a7f0b3de1461070f578063aa57424414610724578063af5f835f14610739578063b1e352421461074e578063b60d42881461076357610251565b80638b7afe2e146106735780638bd259c51461068857806395d89b41146106bb57806398de3989146106d0578063a3e5301c146106fa57610251565b8063382fbdd7116101d25780636945d800116101965780636945d800146105395780636a540df01461058157806370a08231146105e557806372b566f81461061857806378d748d01461062d5780637f1673711461065e57610251565b8063382fbdd7146104765780633eaaf86b1461048b5780634851f91a146104a05780635d10b425146104d357806365bcfbe71461050657610251565b80631fc5cfc4116102195780631fc5cfc4146103b257806328823774146103dc5780632e1a7d4d146103f1578063313ce5671461041b5780633733e6b31461044657610251565b806306fdde031461027a5780630fc0a430146103045780631554784a1461034057806318160ddd1461036a5780631a81ea2a1461037f575b34156102655761025f610971565b50610278565b610276610271336109a2565b6109db565b505b005b34801561028657600080fd5b5061028f610b14565b6040805160208082528351818301528351919283929083019185019080838360005b838110156102c95781810151838201526020016102b1565b50505050905090810190601f1680156102f65780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34801561031057600080fd5b5061032e6004803603602081101561032757600080fd5b5035610b34565b60408051918252519081900360200190f35b34801561034c57600080fd5b5061032e6004803603602081101561036357600080fd5b5035610b9f565b34801561037657600080fd5b5061032e610c55565b34801561038b57600080fd5b5061032e600480360360208110156103a257600080fd5b50356001600160a01b0316610c5b565b3480156103be57600080fd5b50610278600480360360208110156103d557600080fd5b5035610c6d565b3480156103e857600080fd5b5061032e610dff565b3480156103fd57600080fd5b5061032e6004803603602081101561041457600080fd5b50356109db565b34801561042757600080fd5b50610430610e05565b6040805160ff9092168252519081900360200190f35b34801561045257600080fd5b5061032e6004803603604081101561046957600080fd5b5080359060200135610e0a565b34801561048257600080fd5b5061032e610e4e565b34801561049757600080fd5b5061032e610e54565b3480156104ac57600080fd5b5061032e600480360360208110156104c357600080fd5b50356001600160a01b03166109a2565b3480156104df57600080fd5b5061032e600480360360208110156104f657600080fd5b50356001600160a01b0316610e5a565b34801561051257600080fd5b5061032e6004803603602081101561052957600080fd5b50356001600160a01b0316610e6c565b34801561054557600080fd5b506105636004803603602081101561055c57600080fd5b5035610e7e565b60408051938452602084019290925282820152519081900360600190f35b34801561058d57600080fd5b506105ba600480360360408110156105a457600080fd5b506001600160a01b038135169060200135610ee6565b6040805195865260208601949094528484019290925260608401526080830152519081900360a00190f35b3480156105f157600080fd5b5061032e6004803603602081101561060857600080fd5b50356001600160a01b0316610fde565b34801561062457600080fd5b5061032e610ff9565b34801561063957600080fd5b50610642610fff565b604080516001600160a01b039092168252519081900360200190f35b34801561066a57600080fd5b5061032e61100e565b34801561067f57600080fd5b5061032e611016565b34801561069457600080fd5b5061032e600480360360208110156106ab57600080fd5b50356001600160a01b031661101c565b3480156106c757600080fd5b5061028f61102e565b3480156106dc57600080fd5b5061032e600480360360208110156106f357600080fd5b503561104e565b34801561070657600080fd5b50610642611097565b34801561071b57600080fd5b5061032e6110a6565b34801561073057600080fd5b506102786110ac565b34801561074557600080fd5b5061032e6110c1565b34801561075a57600080fd5b506102786110cf565b61032e610971565b34801561077757600080fd5b5061032e6004803603604081101561078e57600080fd5b508035906020013515156110e6565b3480156107a957600080fd5b50610278600480360360608110156107c057600080fd5b6001600160a01b03823516916020810135918101906060810160408201356401000000008111156107f057600080fd5b82018360208201111561080257600080fd5b8035906020019184600183028401116401000000008311171561082457600080fd5b509092509050611154565b34801561083b57600080fd5b5061032e611258565b34801561085057600080fd5b5061032e611280565b34801561086557600080fd5b506108836004803603602081101561087c57600080fd5b5035611286565b6040805192835260208301919091528051918290030190f35b3480156108a857600080fd5b5061032e61147f565b3480156108bd57600080fd5b5061032e6114a1565b3480156108d257600080fd5b5061032e600480360360208110156108e957600080fd5b50356001600160a01b03166114a7565b34801561090557600080fd5b5061032e6114b9565b34801561091a57600080fd5b506108836004803603602081101561093157600080fd5b50356114bf565b34801561094457600080fd5b506102786004803603604081101561095b57600080fd5b506001600160a01b03813516906020013561153d565b60008064e8d4a510003411156109985760088054340190556109916116aa565b905061099d565b600080fd5b905090565b6001600160a01b0381166000908152600460209081526040808320546003909252822054600f54600160401b929102030490505b919050565b6000806109e7336109a2565b905080831115610a285760405162461bcd60e51b8152600401808060200182810382526021815260200180611b9a6021913960400191505060405180910390fd5b3360009081526003602052604090205481848103820281610a4557fe5b3360008181526003602090815260408083209590940494859055600780549587039586019055600680548690039055600f5460049091528382208054918602600160401b8b02819003928301909155600e8054909201909155600880548a90039055925188156108fc0291899190818181858888f19350505050158015610ad0573d6000803e3d6000fd5b506040805187815260208101849052815133927ff279e6a1f5e320cca91135676d9cb6e44ca8a08c0b88342bcdb1144f6511b568928290030190a250949350505050565b60405180604001604052806004815260200163109bdb9960e21b81525081565b600080610b3f611258565b9050600554831415610b525790506109d6565b6000610b82600160026801337fa66607bada5419610b7388600554036117c4565b030281610b7c57fe5b056118b8565b905081811115610b97576000925050506109d6565b900392915050565b600060065460001415610bb4575060006109d6565b600754601054604080516318160ddd60e01b81529051600093926001600160a01b0316916318160ddd916004808301926020929190829003018186803b158015610bfd57600080fd5b505afa158015610c11573d6000803e3d6000fd5b505050506040513d6020811015610c2757600080fd5b5051600954600a54600654939092039350918390860281610c4457fe5b040281610c4d57fe5b049392505050565b60055490565b60016020526000908152604090205481565b33600090815260036020526040902054811115610cd1576040805162461bcd60e51b815260206004820152601860248201527f7468617420616d6f756e7420697320746f6f206c617267650000000000000000604482015290519081900360640190fd5b336000818152600360205260408120549091600160401b91908490610cf5906109a2565b0281610cfd57fe5b3360009081526003602052604090208054869003905560068054869003908190559190049190910291508181610d2f57fe5b600f80549290910490910190556010546040805163a9059cbb60e01b81523360048201526024810185905290516001600160a01b039092169163a9059cbb916044808201926020929091908290030181600087803b158015610d9057600080fd5b505af1158015610da4573d6000803e3d6000fd5b505050506040513d6020811015610dba57600080fd5b505060408051838152600160401b83046020820152815133927ff597bb09fb98a90b578e74952df9d7e06d7505f52a264d786bb11770873dccb2928290030190a25050565b60065481565b600c81565b6000600554610e446801337fa66607bada541960026001610e358888610e2e611258565b03016117c4565b0281610e3d57fe5b05016118b8565b0390505b92915050565b600a5481565b60055481565b60026020526000908152604090205481565b60046020526000908152604090205481565b600080600080610e91600160401b610b9f565b600160401b03610ea28660016110e6565b600160401b0281610eaf57fe5b0490506000610ebf8660006110e6565b9050610eca81610b9f565b90038181610ed788610b9f565b94509450945050509193909250565b600080600080600080610ef887610b34565b6001600160a01b0389166000908152602081815260408083205460019092528220549293509091890281610f2857fe5b6001600160a01b038b1660009081526001602090815260408083205460029092528220549390920493509181610f5a57fe5b049050600081600160401b610f6d61100e565b02039050600082600160401b8584020402600c540190506000600160401b84860281610f9557fe5b04600b540190506000818381610fa757fe5b04905086878783878a0281610fb857fe5b040281610fc157fe5b919d5090049a509198509650929450505050509295509295909350565b6001600160a01b031660009081526020819052604090205490565b60095481565b6010546001600160a01b031690565b600d54420390565b60085481565b60006020819052908152604090205481565b604051806040016040528060048152602001631093d39160e21b81525081565b6000806110756801337fa66607bada541960026001610e358761106f611258565b016117c4565b905060055481101561108b5760009150506109d6565b600554900390506109d6565b6010546001600160a01b031681565b600d5481565b6110bd6110b833610fde565b6119a5565b5050565b6801337fa66607bada541981565b6110d76110ac565b6110e3610271336109a2565b50565b6000806110f1611258565b9050821561112757600061111a600160026801337fa66607bada5419610b7389600554016117c4565b919091039150610e489050565b6000611148600160026801337fa66607bada5419610b7389600554036117c4565b9091039150610e489050565b6010546001600160a01b031633141561121b576001600160a01b03841660008181526003602090815260408083208054880190556006805488019055600f54600483529281902080549388029384019055600e80548401905580518781529182018181529082018590529192917f496d21a3791df17b9e71acba0bd6c88352f3da2636dc2bfae959f09af6c4fb999187918791879160608201848480828437600083820152604051601f909101601f1916909201829003965090945050505050a250611252565b6040805162461bcd60e51b81526020600482015260076024820152661b9bc81dd85b9d60ca1b604482015290519081900360640190fd5b50505050565b6000600160401b600e54600654600f5402038161127157fe5b0461127a611b90565b03905090565b600b5481565b6000806000611294336109a2565b9050808411156112d55760405162461bcd60e51b8152600401808060200182810382526021815260200180611b9a6021913960400191505060405180910390fd5b33600090815260036020526040902054818581038202816112f257fe5b3360009081526003602090815260408083209490930493849055600780549486039485019055600680548590039055600f5460049091529190208054918302600160401b8902819003928301909155600e80549092019091558664e8d4a5100081101561135e57600080fd5b33600061136a83610b9f565b60098054828603908101909155909150600061138461100e565b336000908152600160209081526040808320805487019055600290915281208054858402600160401b020190559091506113be838e610e0a565b90506000806005541180156113d35750600085115b156113fd57600160401b85029050600060065482816113ee57fe5b600f8054929091049091019055505b60058054830190556001600160a01b0386166000908152602081815260409182902080548501905581518981529081018b905280820184905260608101839052905133917fc7209ba1b691ad661f5afd3d5360a45f0f4e3dac25357bf4f346e73166f35c93919081900360800190a2509a509598505050505050505050915091565b6000600160401b600b54600c548161149357fe5b048161149b57fe5b04905090565b60075481565b60036020526000908152604090205481565b600c5481565b60008060006114cd33610fde565b905083811015611524576040805162461bcd60e51b815260206004820152601b60248201527f416d6f756e74206973206d6f7265207468616e2062616c616e63650000000000604482015290519081900360640190fd5b600080611530866119a5565b9095509350505050915091565b33600081815260208190526040902054808311156115a2576040805162461bcd60e51b815260206004820152601860248201527f616d6f756e74206578636565647320686f646c426f6e64730000000000000000604482015290519081900360640190fd5b6001600160a01b03821660009081526001602052604081205482908502816115c657fe5b6001600160a01b0385166000908152600260205260408120549290910492509083908602816115f157fe5b6001600160a01b03808716600081815260016020818152604080842080548b9003905560028083528185208054999098049889900390975583825280842080548e90039055948d1680845291815284832080548a0190559485528382208054870190558185529083902080548b019055825191825292810192909252818101889052519192507ffa9d858e507f19f06f1a6fb70a83f432e083a0eff84c60e90a1c858471a2a09d919081900360600190a1505050505050565b600064e8d4a510003410156116be57600080fd5b60006116c934610b9f565b600980543483900390810190915590915060006116e461100e565b336000908152600160209081526040808320805487019055600290915281208054858402600160401b0201905590915061171d8361104e565b60058054820181553360009081526020819052604081208054840190559054919250901580159061174e5750600085115b1561177857600160401b850290506000600654828161176957fe5b600f8054929091049091019055505b6040805134815260208101849052808201839052905133917fbeae048c6d270d9469f86cf6e8fedda3c60ad770f16c24c9fc131c8e9a09101d919081900360600190a250935050505090565b6000805b68016a09e667f3bcc9088311156117e7576002830492506001016117c8565b5b67b504f333f9de648483116118075760029290920291600019016117e8565b6000600160401b8401600160401b808603028161182057fe5b059050600160401b81800281900590808080806738bd75ed37753d68673284a0c14610924f8702829005018602056749254026a7630acf0185028161186157fe5b0567666664e5e9fa0c990184028161187557fe5b0567aaaaaaac168779080183028161188957fe5b056801ffffffffff9dac9b0183028161189e57fe5b0567b17217f7d1cf79ac8460030b02019350505050919050565b600080604067b17217f7d1cf79ac682cb53f09f05cc627c885010503905067b17217f7d1cf79ac8102830392506000600160401b848502816118f657fe5b0590506000600160401b808080651b893ad04b3919860205660455956bccdd060185028161192057fe5b0566b60b60808399d0190184028161193457fe5b05672aaaaaaaaa015db00183028161194857fe5b05600160401b600202019050848103600160401b868301028161196757fe5b05935060008312611988578284600082121561197f57fe5b901b935061199d565b8260000384600082121561199857fe5b901c93505b505050919050565b60008060008060008060006119ba3389610ee6565b601054604080516340c10f1960e01b8152336004820152602481018790529051969b5094995092975090955093506001600160a01b0316916340c10f199160448082019260009290919082900301818387803b158015611a1957600080fd5b505af1158015611a2d573d6000803e3d6000fd5b505050600c84905550600b82905533600090815260016020908152604080832080548590039055828252808320546002909252909120548982030281611a6f57fe5b33600090815260026020526040812092909104909155611a8e86610b9f565b600a805484019055600580548b9003815533600090815260208190526040812080548d9003905590549192508288039115801590611ace57506000600654115b15611af857600160401b8302905060006006548281611ae957fe5b600f8054929091049091019055505b600880548390039055604051339083156108fc029084906000818181858888f19350505050158015611b2e573d6000803e3d6000fd5b50604080518c8152602081018490528082018990526060810183905260808101869052905133917f20a7fc03b19d7f251cc907f177ff82194c6aebe9a2b47e1cd734dcb6bf772cc2919081900360a00190a25097509395505050505050915091565b6008543490039056fe74686520616d6f756e74206578636565647320746f74616c206561726e696e6773a265627a7a723158201afc5d70c8648c3cb67f6d769ba46865968443d6796d88154d9a713c79a85eef64736f6c634300050b0032

Deployed Bytecode Sourcemap

26:21533:0:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17848:9;:13;17844:94;;17869:6;:4;:6::i;:::-;;17844:94;;;17893:39;17903:27;17919:10;17903:15;:27::i;:::-;17893:8;:39::i;:::-;;17844:94;26:21533;417:36;;8:9:-1;5:2;;;30:1;27;20:12;5:2;417:36:0;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:100:-1;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;417:36:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14663:873;;8:9:-1;5:2;;;30:1;27;20:12;5:2;14663:873:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;14663:873:0;;:::i;:::-;;;;;;;;;;;;;;;;2761:272;;8:9:-1;5:2;;;30:1;27;20:12;5:2;2761:272:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;2761:272:0;;:::i;2402:91::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;2402:91:0;;;:::i;684:53::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;684:53:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;684:53:0;-1:-1:-1;;;;;684:53:0;;:::i;20213:589::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;20213:589:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;20213:589:0;;:::i;1345:33::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;1345:33:0;;;:::i;19045:1076::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;19045:1076:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;19045:1076:0;;:::i;499:35::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;499:35:0;;;:::i;:::-;;;;;;;;;;;;;;;;;;;14383:225;;8:9:-1;5:2;;;30:1;27;20:12;5:2;14383:225:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;14383:225:0;;;;;;;:::i;1698:22::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;1698:22:0;;;:::i;1248:27::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;1248:27:0;;;:::i;7859:191::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;7859:191:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;7859:191:0;-1:-1:-1;;;;;7859:191:0;;:::i;812:57::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;812:57:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;812:57:0;-1:-1:-1;;;;;812:57:0;;:::i;1137:41::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;1137:41:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;1137:41:0;-1:-1:-1;;;;;1137:41:0;;:::i;6820:357::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;6820:357:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;6820:357:0;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;10055:1007;;8:9:-1;5:2;;;30:1;27;20:12;5:2;10055:1007:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;10055:1007:0;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2649:107;;8:9:-1;5:2;;;30:1;27;20:12;5:2;2649:107:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;2649:107:0;-1:-1:-1;;;;;2649:107:0;;:::i;1673:21::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;1673:21:0;;;:::i;2496:91::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;2496:91:0;;;:::i;:::-;;;;-1:-1:-1;;;;;2496:91:0;;;;;;;;;;;;;;9840:75;;8:9:-1;5:2;;;30:1;27;20:12;5:2;9840:75:0;;;:::i;1536:27::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;1536:27:0;;;:::i;599:44::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;599:44:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;599:44:0;-1:-1:-1;;;;;599:44:0;;:::i;457:38::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;457:38:0;;;:::i;13956:291::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;13956:291:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;13956:291:0;;:::i;2260:32::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;2260:32:0;;;:::i;1925:19::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;1925:19:0;;;:::i;5866:70::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;5866:70:0;;;:::i;312:54::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;312:54:0;;;:::i;6340:101::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;6340:101:0;;;:::i;6530:209::-;;;:::i;7217:392::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;7217:392:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;7217:392:0;;;;;;;;;:::i;18074:726::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;18074:726:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;18074:726:0;;;;;;;;;;;;;;;;;;;21:11:-1;5:28;;2:2;;;46:1;43;36:12;2:2;18074:726:0;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;18074:726:0;;;;;;100:9:-1;95:1;81:12;77:20;67:8;63:35;60:50;39:11;25:12;22:29;11:107;8:2;;;131:1;128;121:12;8:2;-1:-1;18074:726:0;;-1:-1:-1;18074:726:0;-1:-1:-1;18074:726:0;:::i;13582:183::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;13582:183:0;;;:::i;1798:35::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;1798:35:0;;;:::i;3307:2522::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;3307:2522:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;3307:2522:0;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;9918:134;;8:9:-1;5:2;;;30:1;27;20:12;5:2;9918:134:0;;;:::i;1472:24::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;1472:24:0;;;:::i;948:48::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;948:48:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;948:48:0;-1:-1:-1;;;;;948:48:0;;:::i;1837:36::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;1837:36:0;;;:::i;5939:312::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;5939:312:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;5939:312:0;;:::i;20868:688::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;20868:688:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;20868:688:0;;;;;;;;:::i;6530:209::-;6569:4;6579:11;6611:14;6599:9;:26;6595:120;;;6635:15;:28;;6654:9;6635:28;;;6678:5;:3;:5::i;:::-;6669:14;;6595:120;;;6701:8;;;6595:120;6726:6;-1:-1:-1;6530:209:0;:::o;7859:191::-;-1:-1:-1;;;;;8015:15:0;;7921:14;8015:15;;;:7;:15;;;;;;;;;7990:13;:21;;;;;;7969:18;;-1:-1:-1;;;233:19:0;7969:42;;7960:70;7949:96;7942:103;;7859:191;;;;:::o;19045:1076::-;19091:4;19187:18;19208:27;19224:10;19208:15;:27::i;:::-;19187:48;;19258:13;19248:6;:23;;19240:69;;;;-1:-1:-1;;;19240:69:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;19345:10;19314:14;19331:25;;;:13;:25;;;;;;19428:13;19402:22;;;19389:36;;19428:13;19389:52;;;;19375:10;19361:25;;;;:13;:25;;;;;;;;19389:52;;;;19361:80;;;;19506:9;:23;;19464:37;;;19506:23;;;;;19534:18;:32;;;;;;;19640:18;;19679:7;:19;;;;;;:74;;19640:31;;;-1:-1:-1;;;19712:20:0;;19702:51;;;19679:74;;;;;;19837:12;:67;;;;;;;;19986:15;:25;;;;;;;20016:27;;;;;;;19712:6;;20016:27;;19361:25;20016:27;19712:6;19375:10;20016:27;;;;;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;-1:-1;20053:41:0;;;;;;;;;;;;;;20063:10;;20053:41;;;;;;;;-1:-1:-1;20106:10:0;19045:1076;-1:-1:-1;;;;19045:1076:0:o;417:36::-;;;;;;;;;;;;;;-1:-1:-1;;;417:36:0;;;;:::o;14663:873::-;14730:18;14817;14838:9;:7;:9::i;:::-;14817:30;;14968:12;;14954:10;:26;14950:56;;;14993:13;-1:-1:-1;14986:20:0;;14950:56;15376:6;15385:75;279:1;305;-1:-1:-1;;15395:35:0;15419:10;15404:12;;:25;15395:8;:35::i;:::-;:49;15394:59;:65;;;;;;15385:8;:75::i;:::-;15376:84;;15473:13;15469:1;:17;15465:35;;;15499:1;15492:8;;;;;;15465:35;15514:17;;;14663:873;-1:-1:-1;;14663:873:0:o;2761:272::-;2816:8;2835:18;;2857:1;2835:23;2831:41;;;-1:-1:-1;2871:1:0;2864:8;;2831:41;2936:9;;2907:12;;:26;;;-1:-1:-1;;;2907:26:0;;;;2881:23;;2936:9;-1:-1:-1;;;;;2907:12:0;;:24;;:26;;;;;;;;;;;;;;:12;:26;;;5:2:-1;;;;30:1;27;20:12;5:2;2907:26:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;2907:26:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;2907:26:0;3022:6;;3012:7;;2970:18;;2907:38;;;;;-1:-1:-1;3022:6:0;2907:38;;2957:31;;2907:38;2957:52;;;;;:62;:71;;;;;;;2761:272;-1:-1:-1;;;2761:272:0:o;2402:91::-;2473:12;;2402:91;:::o;684:53::-;;;;;;;;;;;;;:::o;20213:589::-;20291:10;20277:25;;;;:13;:25;;;;;;20267:35;;;20259:72;;;;;-1:-1:-1;;;20259:72:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;20451:10;20370:22;20437:25;;;:13;:25;;;;;;20370:22;;-1:-1:-1;;;233:19:0;20437:25;20428:6;;20397:27;;:15;:27::i;:::-;:37;:65;;;;;20495:10;20481:25;;;;:13;:25;;;;;:35;;;;;;;20521:18;:28;;;;;;;;;20397:65;;;:79;;;;;-1:-1:-1;20397:79:0;20521:28;20637:38;;;;20615:18;:60;;20637:38;;;;20615:60;;;;;20680:12;;:41;;;-1:-1:-1;;;20680:41:0;;20702:10;20680:41;;;;;;;;;;;;-1:-1:-1;;;;;20680:12:0;;;;:21;;:41;;;;;;;;;;;;;;;-1:-1:-1;20680:12:0;:41;;;5:2:-1;;;;30:1;27;20:12;5:2;20680:41:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;20680:41:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;20731:66:0;;;;;;-1:-1:-1;;;20765:31:0;;20731:66;;;;;;20745:10;;20731:66;;;;;;;;20213:589;;:::o;1345:33::-;;;;:::o;499:35::-;532:2;499:35;:::o;14383:225::-;14478:18;14591:12;;14510:79;-1:-1:-1;;305:1:0;279;14519:43;14551:10;14540:8;14528:9;:7;:9::i;:::-;:20;:33;14519:8;:43::i;:::-;:49;:55;;;;;;:69;14510:8;:79::i;:::-;:93;14503:100;;14383:225;;;;;:::o;1698:22::-;;;;:::o;1248:27::-;;;;:::o;812:57::-;;;;;;;;;;;;;:::o;1137:41::-;;;;;;;;;;;;;:::o;6820:357::-;6870:13;6885:14;6901:8;6916:12;6994:20;-1:-1:-1;;;6994:7:0;:20::i;:::-;-1:-1:-1;;;6980:34:0;6945:30;6963:5;6970:4;6945:16;:30::i;:::-;-1:-1:-1;;;6931:44:0;:85;;;;;;6916:100;;7028:13;7044:30;7061:5;7068;7044:16;:30::i;:::-;7028:46;;7097:17;7105:8;7097:7;:17::i;:::-;7085:29;;7134:7;7085:29;7153:14;7161:5;7153:7;:14::i;:::-;7125:44;;;;;;;;6820:357;;;;;:::o;10055:1007::-;10137:15;10154:19;10175:23;10200:22;10224:21;10251:15;10269:31;10286:13;10269:16;:31::i;:::-;-1:-1:-1;;;;;10365:15:0;;10305:14;10365:15;;;;;;;;;;;;10322:18;:24;;;;;;10251:49;;-1:-1:-1;10305:14:0;;10322:40;;10365:15;10322:58;;;;-1:-1:-1;;;;;10612:24:0;;10564:14;10612:24;;;:18;:24;;;;;;;;;10581:22;:28;;;;;;10322:58;;;;;-1:-1:-1;10564:14:0;10612:24;10581:55;;;;;10564:72;;10641:16;10680:9;-1:-1:-1;;;10660:5:0;:3;:5::i;:::-;:17;:29;;-1:-1:-1;10694:19:0;10777:9;-1:-1:-1;;;10743:21:0;;;:33;:43;10716:24;;:70;10694:92;;10791:18;-1:-1:-1;;;10848:9:0;10838;:19;:31;;;;;;10812:23;;:57;10791:78;;10874:19;10911:13;10896:14;:28;;;;;;10874:50;;10937:10;11004;10992:9;10975:14;10961:11;10949:9;:23;:40;;;;;;:52;:65;;;;;10929:128;;-1:-1:-1;10949:65:0;;;-1:-1:-1;11016:14:0;;-1:-1:-1;11032:13:0;-1:-1:-1;11047:9:0;;-1:-1:-1;;;;;10055:1007:0;;;;;;;;:::o;2649:107::-;-1:-1:-1;;;;;2734:17:0;2705:15;2734:17;;;;;;;;;;;;2649:107::o;1673:21::-;;;;:::o;2496:91::-;2571:12;;-1:-1:-1;;;;;2571:12:0;2496:91;:::o;9840:75::-;9903:7;;9897:3;:13;9840:75;:::o;1536:27::-;;;;:::o;599:44::-;;;;;;;;;;;;;;:::o;457:38::-;;;;;;;;;;;;;;-1:-1:-1;;;457:38:0;;;;:::o;13956:291::-;14023:13;14043:20;14066:72;-1:-1:-1;;305:1:0;279;14076:33;14097:10;14085:9;:7;:9::i;:::-;:22;14076:8;:33::i;14066:72::-;14043:95;;14165:12;;14147:15;:30;14143:99;;;14190:1;14183:8;;;;;14143:99;14230:12;;14212:30;;;-1:-1:-1;14205:37:0;;2260:32;;;-1:-1:-1;;;;;2260:32:0;;:::o;1925:19::-;;;;:::o;5866:70::-;5902:29;5908:21;5918:10;5908:9;:21::i;:::-;5902:4;:29::i;:::-;;;5866:70::o;312:54::-;-1:-1:-1;;312:54:0;:::o;6340:101::-;6378:14;:12;:14::i;:::-;6397:39;6407:27;6423:10;6407:15;:27::i;6397:39::-;;6340:101::o;7217:392::-;7292:13;7312:18;7333:9;:7;:9::i;:::-;7312:30;;7352:6;7349:256;;;7365:6;7374:70;279:1;305;-1:-1:-1;;7384:30:0;7408:5;7393:12;;:20;7384:8;:30::i;7374:70::-;7457:17;;;;;-1:-1:-1;7450:24:0;;-1:-1:-1;7450:24:0;7349:256;7490:6;7499:70;279:1;305;-1:-1:-1;;7509:30:0;7533:5;7518:12;;:20;7509:8;:30::i;7499:70::-;7582:17;;;;-1:-1:-1;7575:24:0;;-1:-1:-1;7575:24:0;18074:726;18183:12;;-1:-1:-1;;;;;18183:12:0;18161:10;:35;18158:638;;;-1:-1:-1;;;;;18204:19:0;;;;;;:13;:19;;;;;;;;:28;;;;;;18238:18;:27;;;;;;18424:18;;18546:7;:13;;;;;;:27;;18424:26;;;18546:27;;;;;18687:12;:26;;;;;;18724:33;;;;;;;;;;;;;;;;;18424:26;;18204:19;18724:33;;18227:5;;18751;;;;18724:33;;;18751:5;;;;18724:33;1::-1;99:1;81:16;;;74:27;18724:33:0;;137:4:-1;117:14;;;-1:-1;;113:30;157:16;;;18724:33:0;;;;-1:-1:-1;18724:33:0;;-1:-1:-1;;;;;18724:33:0;18158:638;;;;18773:17;;;-1:-1:-1;;;18773:17:0;;;;;;;;;;;;-1:-1:-1;;;18773:17:0;;;;;;;;;;;;;;18158:638;18074:726;;;;:::o;13582:183::-;13622:14;-1:-1:-1;;;13732:12:0;;13710:18;;13689;;:39;13679:65;13668:91;;;;;;13650:9;:7;:9::i;:::-;:110;13643:117;;13582:183;:::o;1798:35::-;;;;:::o;3307:2522::-;3373:4;3378;3476:18;3497:27;3513:10;3497:15;:27::i;:::-;3476:48;;3559:13;3537:18;:35;;3529:81;;;;-1:-1:-1;;;3529:81:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3646:10;3615:14;3632:25;;;:13;:25;;;;;;3742:13;3704:34;;;3690:49;;3742:13;3690:65;;;;3676:10;3662:25;;;;:13;:25;;;;;;;;3690:65;;;;3662:93;;;;3820:9;:23;;3778:37;;;3820:23;;;;;3848:18;:32;;;;;;;3960:18;;3999:7;:19;;;;;;:86;;3960:31;;;-1:-1:-1;;;4032:32:0;;4022:63;;;3999:86;;;;;;4092:12;:79;;;;;;;;4032:18;4345:14;4336:23;;4332:41;;;4365:8;;;4332:41;4444:10;4427:14;4496:15;4504:6;4496:7;:15::i;:::-;4619:6;:18;;4602:12;;;4619:18;;;;;;4485:26;;-1:-1:-1;4586:13:0;4698:5;:3;:5::i;:::-;4727:10;4708:30;;;;:18;:30;;;;;;;;:42;;;;;;4755:22;:34;;;;;:74;;4793:36;;;-1:-1:-1;;;4793:36:0;4755:74;;;4679:24;;-1:-1:-1;4919:56:0;4742:8;4956:18;4919:26;:56::i;:::-;4899:76;;5042:15;5125:1;5110:12;;:16;:27;;;;;5136:1;5130:3;:7;5110:27;5106:428;;;-1:-1:-1;;;5158:3:0;:17;5145:30;;5365:21;5402:18;;5389:10;:31;;;;;5490:18;:38;;5389:31;;;;5490:38;;;;;-1:-1:-1;5106:428:0;5588:12;:28;;;;;;-1:-1:-1;;;;;5675:17:0;;5588:12;5675:17;;;;;;;;;;;;:33;;;;;;5720:66;;;;;;;;;;;;;;;;;;;;;;;;;5729:10;;5720:66;;;;;;;;;;-1:-1:-1;5799:12:0;-1:-1:-1;5813:10:0;;-1:-1:-1;;;;;;;;;3307:2522:0;;;:::o;9918:134::-;9957:13;-1:-1:-1;;;10010:23:0;;9983:24;;:50;;;;;;:64;;;;;;9976:71;;9918:134;:::o;1472:24::-;;;;:::o;948:48::-;;;;;;;;;;;;;:::o;1837:36::-;;;;:::o;5939:312::-;5986:4;5991;6001:12;6016:21;6026:10;6016:9;:21::i;:::-;6001:36;;6061:6;6050:7;:17;;6042:57;;;;;-1:-1:-1;;;6042:57:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;6104:17;6126:22;6189:12;6194:6;6189:4;:12::i;:::-;6153:48;;-1:-1:-1;6153:48:0;-1:-1:-1;;;;5939:312:0;;;:::o;20868:688::-;21011:10;20994:14;21044:17;;;;;;;;;;;21074:20;;;;21066:57;;;;;-1:-1:-1;;;21066:57:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;21144:26:0;;21128:13;21144:26;;;:18;:26;;;;;;21182:10;;21144:35;;21182:10;21144:48;;;;-1:-1:-1;;;;;21217:30:0;;21197:17;21217:30;;;:22;:30;;;;;;21144:48;;;;;-1:-1:-1;21197:17:0;21259:10;;21217:39;;21259:10;21217:52;;;;-1:-1:-1;;;;;21274:26:0;;;;;;;:18;:26;;;;;;;;:38;;;;;;;21317:22;:30;;;;;;:46;;21217:52;;;;21317:46;;;;;;;21368:17;;;;;;:27;;;;;;;21400:22;;;;;;;;;;;;:34;;;;;;21439:26;;;;;;:42;;;;;;21486:13;;;;;;;:23;;;;;;21519:32;;;;;;;;;;;;;;;;;;;21217:52;;-1:-1:-1;21519:32:0;;;;;;;;;;20868:688;;;;;;:::o;8387:1450::-;8419:4;8546:14;8534:9;:26;8529:46;;;8567:8;;;8529:46;8606:8;8617:18;8625:9;8617:7;:18::i;:::-;8747:6;:18;;8727:9;:15;;;8747:18;;;;;;8606:29;;-1:-1:-1;8711:13:0;8826:5;:3;:5::i;:::-;8855:10;8836:30;;;;:18;:30;;;;;;;;:42;;;;;;8883:22;:34;;;;;:74;;8921:36;;;-1:-1:-1;;;8921:36:0;8883:74;;;8807:24;;-1:-1:-1;9047:26:0;8870:8;9047:16;:26::i;:::-;9128:12;:28;;;;;;9225:10;9128:12;9215:21;;;;;;;;;;:37;;;;;;9325:12;;9027:46;;-1:-1:-1;9128:12:0;9325:16;;;;:27;;;9351:1;9345:3;:7;9325:27;9321:425;;;-1:-1:-1;;;9373:3:0;:17;9360:30;;9575:21;9612:18;;9599:10;:31;;;;;9702:18;:38;;9599:31;;;;9702:38;;;;;-1:-1:-1;9321:425:0;9755:53;;;9772:9;9755:53;;;;;;;;;;;;;;;;9760:10;;9755:53;;;;;;;;;;-1:-1:-1;9820:12:0;-1:-1:-1;;;;8387:1450:0;:::o;16446:410::-;16498:10;;16535:49;15784:19;16542:1;:9;16535:49;;;16564:1;16559:6;;;-1:-1:-1;16571:7:0;;16535:49;;;16588:53;15838:19;16595:1;:13;16588:53;;16621:1;16616:6;;;;;-1:-1:-1;;16628:7:0;16588:53;;;16645:8;-1:-1:-1;;;16696:1:0;16687:17;-1:-1:-1;;;15730:19:0;16667:1;16658:17;16657:25;16656:49;;;;;;;-1:-1:-1;;;;16719:3:0;;;16718:11;;;;15730:19;;;;16217;16271;16805:5;;:9;;;16799:16;16796:20;;:30;16163:19;16790:37;16787:1;:41;:45;;;;;;16109:19;16781:52;16778:1;:56;:60;;;;;;16055:19;16772:67;16769:1;:71;:75;;;;;;16001:19;16763:82;16760:1;:86;:90;;;;;;15892:19;16741:5;:11;;;:110;16734:117;;;;;16446:410;;;:::o;17186:390::-;17237:11;;17297:2;15892:19;15946:20;17271:16;;17270:24;:29;17255:44;;15892:19;17309:5;:9;17304:14;;;;17323:8;-1:-1:-1;;;17337:1:0;17335;:3;17334:11;;;;;;;-1:-1:-1;17350:8:0;-1:-1:-1;;;15730:19:0;;;-1:-1:-1;;17415:4:0;;:8;16973:19;17409:15;17406:1;:19;:23;;;;;;-1:-1:-1;;17400:30:0;17397:1;:34;:38;;;;;;16883:19;17391:45;17388:1;:49;:53;;;;;;-1:-1:-1;;;17371:1:0;17362:17;17361:81;17350:92;;17487:1;17483;:5;-1:-1:-1;;;17470:1:0;17466;:5;17465:13;17464:25;;;;;;17447:43;;17508:1;17499:5;:10;17495:61;;17523:5;17515:13;;;;;;;;;;;;;17495:61;;;17551:5;17550:6;;17542:14;;;;;;;;;;;;;17495:61;-1:-1:-1;;;17186:390:0;;;:::o;11197:2306::-;11244:8;11254:13;11382:23;11410:19;11434;11458:18;11481:21;11591:38;11610:10;11622:6;11591:18;:38::i;:::-;11661:12;;:45;;;-1:-1:-1;;;11661:45:0;;11679:10;11661:45;;;;;;;;;;;;11507:122;;-1:-1:-1;11507:122:0;;-1:-1:-1;11507:122:0;;-1:-1:-1;11507:122:0;;-1:-1:-1;11507:122:0;-1:-1:-1;;;;;;11661:12:0;;:17;;:45;;;;;:12;;:45;;;;;;;;:12;;:45;;;5:2:-1;;;;30:1;27;20:12;5:2;11661:45:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;-1:-1;;;11756:24:0;:41;;;-1:-1:-1;11802:23:0;:39;;;11973:10;-1:-1:-1;11954:30:0;;;-1:-1:-1;11954:30:0;;;;;;;;:50;;;;;;;12187:21;;;;;;;12115:22;:34;;;;;;;12153:30;;;12115:69;12187:21;12115:93;;;;12101:10;12078:34;;;;:22;:34;;;;;12115:93;;;;12078:130;;;12255:27;12263:18;12255:7;:27::i;:::-;12465:7;:27;;;;;;12564:12;:22;;;;;;;12663:10;12358:14;12653:21;;;;;;;;;;:31;;;;;;;12759:12;;12244:38;;-1:-1:-1;12375:24:0;;;;12759:16;;;;:42;;;12800:1;12779:18;;:22;12759:42;12755:477;;;-1:-1:-1;;;12898:3:0;:17;12885:30;;13061:21;13098:18;;13085:10;:31;;;;;13188:18;:38;;13085:31;;;;13188:38;;;;;-1:-1:-1;12755:477:0;13304:15;:28;;;;;;;13337:30;;:10;;:30;;;;;13323:9;;13304:15;13337:30;13304:15;13337:30;13323:9;13337:10;:30;;;;;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;-1:-1;13377:82:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;13383:10;;13377:82;;;;;;;;;;-1:-1:-1;13472:9:0;-1:-1:-1;13483:14:0;;-1:-1:-1;;;;;;11197:2306:0;;;:::o;8132:166::-;8266:15;;8284:9;8266:27;;8132:166;:::o

Swarm Source

bzzr://5628d58443cf0a52b58a2aa34cfba85383e349201d6049bfd273f9c36a20bdc4

Block Transaction Difficulty Gas Used Reward
View All Blocks Produced

Block Uncle Number Difficulty Gas Used Reward
View All Uncles
Loading...
Loading
Loading...
Loading

Validator Index Block Amount
View All Withdrawals

Transaction Hash Block Value Eth2 PubKey Valid
View All Deposits
Loading...
Loading
[ Download: CSV Export  ]
[ Download: CSV Export  ]

A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.