ETH Price: $3,348.10 (+0.40%)

Token

Bond (BOND)
 

Overview

Max Total Supply

439,682,629,702,083,727,312,948,744,567,885,379.524420960256 BOND

Holders

0

Total Transfers

-

Market

Onchain Market Cap

$0.00

Circulating Supply Market Cap

-

Other Info

Token Contract (WITH 12 Decimals)

Loading...
Loading
Loading...
Loading
Loading...
Loading

Click here to update the token information / general information
# Exchange Pair Price  24H Volume % Volume

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
Loading...
Loading
Loading...
Loading
[ Download: CSV Export  ]

A token is a representation of an on-chain or off-chain asset. The token page shows information such as price, total supply, holders, transfers and social links. Learn more about this page in our Knowledge Base.