More Info
Private Name Tags
ContractCreator
Latest 25 from a total of 2,409 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Transfer | 7521963 | 2111 days ago | IN | 0.1 ETH | 0.00008693 | ||||
Transfer | 5183859 | 2512 days ago | IN | 1.04 ETH | 0.00119537 | ||||
Transfer | 5147097 | 2519 days ago | IN | 0.414 ETH | 0.00032601 | ||||
Transfer | 5113810 | 2524 days ago | IN | 0.22 ETH | 0.0010867 | ||||
Transfer | 5113782 | 2524 days ago | IN | 0.11 ETH | 0.00004346 | ||||
Transfer | 5113760 | 2524 days ago | IN | 0.1 ETH | 0.00004346 | ||||
Transfer | 5113741 | 2524 days ago | IN | 0.075 ETH | 0.00018475 | ||||
Transfer | 5113740 | 2524 days ago | IN | 2.9 ETH | 0.00124754 | ||||
Transfer | 5113736 | 2524 days ago | IN | 3 ETH | 0.00277131 | ||||
Transfer | 5113734 | 2524 days ago | IN | 2.2 ETH | 0.00155942 | ||||
Transfer | 5113733 | 2524 days ago | IN | 2.63 ETH | 0.00378745 | ||||
Transfer | 5113727 | 2524 days ago | IN | 1.3 ETH | 0.00277131 | ||||
Transfer | 5113725 | 2524 days ago | IN | 0.2246 ETH | 0.00108513 | ||||
Transfer | 5113720 | 2524 days ago | IN | 2 ETH | 0.00277131 | ||||
Transfer | 5113717 | 2524 days ago | IN | 0.095 ETH | 0.00018475 | ||||
Transfer | 5113717 | 2524 days ago | IN | 0.1 ETH | 0.00007475 | ||||
Transfer | 5113716 | 2524 days ago | IN | 1.3 ETH | 0.00063 | ||||
Transfer | 5113715 | 2524 days ago | IN | 0.9873 ETH | 0.00277131 | ||||
Transfer | 5113715 | 2524 days ago | IN | 1 ETH | 0.00378745 | ||||
Transfer | 5113708 | 2524 days ago | IN | 4 ETH | 0.00378745 | ||||
Transfer | 5113697 | 2524 days ago | IN | 0.061 ETH | 0.0002495 | ||||
Transfer | 5113695 | 2524 days ago | IN | 8 ETH | 0.00461885 | ||||
Transfer | 5113691 | 2524 days ago | IN | 0.062 ETH | 0.000105 | ||||
Transfer | 5113690 | 2524 days ago | IN | 0.9933 ETH | 0.00268746 | ||||
Transfer | 5113690 | 2524 days ago | IN | 0.1 ETH | 0.00255745 |
Latest 25 internal transactions (View All)
Advanced mode:
Parent Transaction Hash | Block |
From
|
To
|
|||
---|---|---|---|---|---|---|
5113741 | 2524 days ago | 0.075 ETH | ||||
5113740 | 2524 days ago | 2.9 ETH | ||||
5113736 | 2524 days ago | 3 ETH | ||||
5113734 | 2524 days ago | 2.2 ETH | ||||
5113733 | 2524 days ago | 2.63 ETH | ||||
5113727 | 2524 days ago | 1.3 ETH | ||||
5113720 | 2524 days ago | 2 ETH | ||||
5113717 | 2524 days ago | 0.095 ETH | ||||
5113715 | 2524 days ago | 0.9873 ETH | ||||
5113715 | 2524 days ago | 1 ETH | ||||
5113708 | 2524 days ago | 4 ETH | ||||
5113697 | 2524 days ago | 0.061 ETH | ||||
5113695 | 2524 days ago | 8 ETH | ||||
5113690 | 2524 days ago | 0.9933 ETH | ||||
5113690 | 2524 days ago | 0.1 ETH | ||||
5113682 | 2524 days ago | 0.5 ETH | ||||
5113671 | 2524 days ago | 0.65 ETH | ||||
5113664 | 2524 days ago | 0.996 ETH | ||||
5113662 | 2524 days ago | 0.18 ETH | ||||
5113653 | 2524 days ago | 0.16 ETH | ||||
5113646 | 2524 days ago | 0.15 ETH | ||||
5113644 | 2524 days ago | 0.99462492 ETH | ||||
5113641 | 2524 days ago | 0.03 ETH | ||||
5113636 | 2524 days ago | 1 ETH | ||||
5113636 | 2524 days ago | 20 ETH |
Loading...
Loading
This contract may be a proxy contract. Click on More Options and select Is this a proxy? to confirm and enable the "Read as Proxy" & "Write as Proxy" tabs.
Contract Name:
ColuLocalNetworkSale
Compiler Version
v0.4.18+commit.9cf6e910
Optimization Enabled:
Yes with 200 runs
Other Settings:
default evmVersion
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2018-02-11 */ pragma solidity 0.4.18; /// @title Ownable /// @dev The Ownable contract has an owner address, and provides basic authorization control functions, /// this simplifies the implementation of "user permissions". /// @dev Based on OpenZeppelin's Ownable. contract Ownable { address public owner; address public newOwnerCandidate; event OwnershipRequested(address indexed _by, address indexed _to); event OwnershipTransferred(address indexed _from, address indexed _to); /// @dev Constructor sets the original `owner` of the contract to the sender account. function Ownable() public { owner = msg.sender; } /// @dev Reverts if called by any account other than the owner. modifier onlyOwner() { require(msg.sender == owner); _; } modifier onlyOwnerCandidate() { require(msg.sender == newOwnerCandidate); _; } /// @dev Proposes to transfer control of the contract to a newOwnerCandidate. /// @param _newOwnerCandidate address The address to transfer ownership to. function requestOwnershipTransfer(address _newOwnerCandidate) external onlyOwner { require(_newOwnerCandidate != address(0)); newOwnerCandidate = _newOwnerCandidate; OwnershipRequested(msg.sender, newOwnerCandidate); } /// @dev Accept ownership transfer. This method needs to be called by the perviously proposed owner. function acceptOwnership() external onlyOwnerCandidate { address previousOwner = owner; owner = newOwnerCandidate; newOwnerCandidate = address(0); OwnershipTransferred(previousOwner, owner); } } /// @title Math operations with safety checks library SafeMath { function mul(uint256 a, uint256 b) internal pure returns (uint256) { uint256 c = a * b; require(a == 0 || c / a == b); return c; } function div(uint256 a, uint256 b) internal pure returns (uint256) { // require(b > 0); // Solidity automatically throws when dividing by 0 uint256 c = a / b; // require(a == b * c + a % b); // There is no case in which this doesn't hold return c; } function sub(uint256 a, uint256 b) internal pure returns (uint256) { require(b <= a); return a - b; } function add(uint256 a, uint256 b) internal pure returns (uint256) { uint256 c = a + b; require(c >= a); return c; } function max64(uint64 a, uint64 b) internal pure returns (uint64) { return a >= b ? a : b; } function min64(uint64 a, uint64 b) internal pure returns (uint64) { return a < b ? a : b; } function max256(uint256 a, uint256 b) internal pure returns (uint256) { return a >= b ? a : b; } function min256(uint256 a, uint256 b) internal pure returns (uint256) { return a < b ? a : b; } function toPower2(uint256 a) internal pure returns (uint256) { return mul(a, a); } function sqrt(uint256 a) internal pure returns (uint256) { uint256 c = (a + 1) / 2; uint256 b = a; while (c < b) { b = c; c = (a / c + c) / 2; } return b; } } /// @title ERC Token Standard #20 Interface (https://github.com/ethereum/EIPs/issues/20) contract ERC20 { uint public totalSupply; function balanceOf(address _owner) constant public returns (uint balance); function transfer(address _to, uint _value) public returns (bool success); function transferFrom(address _from, address _to, uint _value) public returns (bool success); function approve(address _spender, uint _value) public returns (bool success); function allowance(address _owner, address _spender) public constant returns (uint remaining); event Transfer(address indexed from, address indexed to, uint value); event Approval(address indexed owner, address indexed spender, uint value); } /// @title ERC Token Standard #677 Interface (https://github.com/ethereum/EIPs/issues/677) contract ERC677 is ERC20 { function transferAndCall(address to, uint value, bytes data) public returns (bool ok); event TransferAndCall(address indexed from, address indexed to, uint value, bytes data); } /// @title ERC223Receiver Interface /// @dev Based on the specs form: https://github.com/ethereum/EIPs/issues/223 contract ERC223Receiver { function tokenFallback(address _sender, uint _value, bytes _data) external returns (bool ok); } /// @title Basic ERC20 token contract implementation. /// @dev Based on OpenZeppelin's StandardToken. contract BasicToken is ERC20 { using SafeMath for uint256; uint256 public totalSupply; mapping (address => mapping (address => uint256)) allowed; mapping (address => uint256) balances; event Approval(address indexed owner, address indexed spender, uint256 value); event Transfer(address indexed from, address indexed to, uint256 value); /// @dev Approve the passed address to spend the specified amount of tokens on behalf of msg.sender. /// @param _spender address The address which will spend the funds. /// @param _value uint256 The amount of tokens to be spent. function approve(address _spender, uint256 _value) public returns (bool) { // https://github.com/ethereum/EIPs/blob/master/EIPS/eip-20.md#approve (see NOTE) if ((_value != 0) && (allowed[msg.sender][_spender] != 0)) { revert(); } allowed[msg.sender][_spender] = _value; Approval(msg.sender, _spender, _value); return true; } /// @dev Function to check the amount of tokens that an owner allowed to a spender. /// @param _owner address The address which owns the funds. /// @param _spender address The address which will spend the funds. /// @return uint256 specifying the amount of tokens still available for the spender. function allowance(address _owner, address _spender) constant public returns (uint256 remaining) { return allowed[_owner][_spender]; } /// @dev Gets the balance of the specified address. /// @param _owner address The address to query the the balance of. /// @return uint256 representing the amount owned by the passed address. function balanceOf(address _owner) constant public returns (uint256 balance) { return balances[_owner]; } /// @dev Transfer token to a specified address. /// @param _to address The address to transfer to. /// @param _value uint256 The amount to be transferred. function transfer(address _to, uint256 _value) public returns (bool) { require(_to != address(0)); balances[msg.sender] = balances[msg.sender].sub(_value); balances[_to] = balances[_to].add(_value); Transfer(msg.sender, _to, _value); return true; } /// @dev Transfer tokens from one address to another. /// @param _from address The address which you want to send tokens from. /// @param _to address The address which you want to transfer to. /// @param _value uint256 the amount of tokens to be transferred. function transferFrom(address _from, address _to, uint256 _value) public returns (bool) { require(_to != address(0)); var _allowance = allowed[_from][msg.sender]; balances[_from] = balances[_from].sub(_value); balances[_to] = balances[_to].add(_value); allowed[_from][msg.sender] = _allowance.sub(_value); Transfer(_from, _to, _value); return true; } } /// @title Standard677Token implentation, base on https://github.com/ethereum/EIPs/issues/677 contract Standard677Token is ERC677, BasicToken { /// @dev ERC223 safe token transfer from one address to another /// @param _to address the address which you want to transfer to. /// @param _value uint256 the amount of tokens to be transferred. /// @param _data bytes data that can be attached to the token transation function transferAndCall(address _to, uint _value, bytes _data) public returns (bool) { require(super.transfer(_to, _value)); // do a normal token transfer TransferAndCall(msg.sender, _to, _value, _data); //filtering if the target is a contract with bytecode inside it if (isContract(_to)) return contractFallback(_to, _value, _data); return true; } /// @dev called when transaction target is a contract /// @param _to address the address which you want to transfer to. /// @param _value uint256 the amount of tokens to be transferred. /// @param _data bytes data that can be attached to the token transation function contractFallback(address _to, uint _value, bytes _data) private returns (bool) { ERC223Receiver receiver = ERC223Receiver(_to); require(receiver.tokenFallback(msg.sender, _value, _data)); return true; } /// @dev check if the address is contract /// assemble the given address bytecode. If bytecode exists then the _addr is a contract. /// @param _addr address the address to check function isContract(address _addr) private constant returns (bool is_contract) { // retrieve the size of the code on target address, this needs assembly uint length; assembly { length := extcodesize(_addr) } return length > 0; } } /// @title Token holder contract. contract TokenHolder is Ownable { /// @dev Allow the owner to transfer out any accidentally sent ERC20 tokens. /// @param _tokenAddress address The address of the ERC20 contract. /// @param _amount uint256 The amount of tokens to be transferred. function transferAnyERC20Token(address _tokenAddress, uint256 _amount) public onlyOwner returns (bool success) { return ERC20(_tokenAddress).transfer(owner, _amount); } } /// @title Colu Local Network contract. /// @author Tal Beja. contract ColuLocalNetwork is Ownable, Standard677Token, TokenHolder { using SafeMath for uint256; string public constant name = "Colu Local Network"; string public constant symbol = "CLN"; // Using same decimals value as ETH (makes ETH-CLN conversion much easier). uint8 public constant decimals = 18; // States whether token transfers is allowed or not. // Used during token sale. bool public isTransferable = false; event TokensTransferable(); modifier transferable() { require(msg.sender == owner || isTransferable); _; } /// @dev Creates all tokens and gives them to the owner. function ColuLocalNetwork(uint256 _totalSupply) public { totalSupply = _totalSupply; balances[msg.sender] = totalSupply; } /// @dev start transferable mode. function makeTokensTransferable() external onlyOwner { if (isTransferable) { return; } isTransferable = true; TokensTransferable(); } /// @dev Same ERC20 behavior, but reverts if not transferable. /// @param _spender address The address which will spend the funds. /// @param _value uint256 The amount of tokens to be spent. function approve(address _spender, uint256 _value) public transferable returns (bool) { return super.approve(_spender, _value); } /// @dev Same ERC20 behavior, but reverts if not transferable. /// @param _to address The address to transfer to. /// @param _value uint256 The amount to be transferred. function transfer(address _to, uint256 _value) public transferable returns (bool) { return super.transfer(_to, _value); } /// @dev Same ERC20 behavior, but reverts if not transferable. /// @param _from address The address to send tokens from. /// @param _to address The address to transfer to. /// @param _value uint256 the amount of tokens to be transferred. function transferFrom(address _from, address _to, uint256 _value) public transferable returns (bool) { return super.transferFrom(_from, _to, _value); } /// @dev Same ERC677 behavior, but reverts if not transferable. /// @param _to address The address to transfer to. /// @param _value uint256 The amount to be transferred. /// @param _data bytes data to send to receiver if it is a contract. function transferAndCall(address _to, uint _value, bytes _data) public transferable returns (bool success) { return super.transferAndCall(_to, _value, _data); } } /// @title Standard ERC223 Token Receiver implementing tokenFallback function and tokenPayable modifier contract Standard223Receiver is ERC223Receiver { Tkn tkn; struct Tkn { address addr; address sender; // the transaction caller uint256 value; } bool __isTokenFallback; modifier tokenPayable { require(__isTokenFallback); _; } /// @dev Called when the receiver of transfer is contract /// @param _sender address the address of tokens sender /// @param _value uint256 the amount of tokens to be transferred. /// @param _data bytes data that can be attached to the token transation function tokenFallback(address _sender, uint _value, bytes _data) external returns (bool ok) { if (!supportsToken(msg.sender)) { return false; } // Problem: This will do a sstore which is expensive gas wise. Find a way to keep it in memory. // Solution: Remove the the data tkn = Tkn(msg.sender, _sender, _value); __isTokenFallback = true; if (!address(this).delegatecall(_data)) { __isTokenFallback = false; return false; } // avoid doing an overwrite to .token, which would be more expensive // makes accessing .tkn values outside tokenPayable functions unsafe __isTokenFallback = false; return true; } function supportsToken(address token) public constant returns (bool); } /// @title TokenOwnable /// @dev The TokenOwnable contract adds a onlyTokenOwner modifier as a tokenReceiver with ownable addaptation contract TokenOwnable is Standard223Receiver, Ownable { /// @dev Reverts if called by any account other than the owner for token sending. modifier onlyTokenOwner() { require(tkn.sender == owner); _; } } /// @title Vesting trustee contract for Colu Local Network. /// @dev This Contract can't be TokenHolder, since it will allow its owner to drain its vested tokens. /// @dev This means that any token sent to it different than ColuLocalNetwork is basicly stucked here forever. /// @dev ColuLocalNetwork that sent here (by mistake) can withdrawn using the grant method. contract VestingTrustee is TokenOwnable { using SafeMath for uint256; // Colu Local Network contract. ColuLocalNetwork public cln; // Vesting grant for a speicifc holder. struct Grant { uint256 value; uint256 start; uint256 cliff; uint256 end; uint256 installmentLength; // In seconds. uint256 transferred; bool revokable; } // Holder to grant information mapping. mapping (address => Grant) public grants; // Total tokens vested. uint256 public totalVesting; event NewGrant(address indexed _from, address indexed _to, uint256 _value); event TokensUnlocked(address indexed _to, uint256 _value); event GrantRevoked(address indexed _holder, uint256 _refund); uint constant OK = 1; uint constant ERR_INVALID_VALUE = 10001; uint constant ERR_INVALID_VESTED = 10002; uint constant ERR_INVALID_TRANSFERABLE = 10003; event Error(address indexed sender, uint error); /// @dev Constructor that initializes the address of the Colu Local Network contract. /// @param _cln ColuLocalNetwork The address of the previously deployed Colu Local Network contract. function VestingTrustee(ColuLocalNetwork _cln) public { require(_cln != address(0)); cln = _cln; } /// @dev Allow only cln token to be tokenPayable /// @param token the token to check function supportsToken(address token) public constant returns (bool) { return (cln == token); } /// @dev Grant tokens to a specified address. /// @param _to address The holder address. /// @param _start uint256 The beginning of the vesting period (timestamp). /// @param _cliff uint256 When the first installment is made (timestamp). /// @param _end uint256 The end of the vesting period (timestamp). /// @param _installmentLength uint256 The length of each vesting installment (in seconds). /// @param _revokable bool Whether the grant is revokable or not. function grant(address _to, uint256 _start, uint256 _cliff, uint256 _end, uint256 _installmentLength, bool _revokable) external onlyTokenOwner tokenPayable { require(_to != address(0)); require(_to != address(this)); // Protect this contract from receiving a grant. uint256 value = tkn.value; require(value > 0); // Require that every holder can be granted tokens only once. require(grants[_to].value == 0); // Require for time ranges to be consistent and valid. require(_start <= _cliff && _cliff <= _end); // Require installment length to be valid and no longer than (end - start). require(_installmentLength > 0 && _installmentLength <= _end.sub(_start)); // Grant must not exceed the total amount of tokens currently available for vesting. require(totalVesting.add(value) <= cln.balanceOf(address(this))); // Assign a new grant. grants[_to] = Grant({ value: value, start: _start, cliff: _cliff, end: _end, installmentLength: _installmentLength, transferred: 0, revokable: _revokable }); // Since tokens have been granted, increase the total amount vested. totalVesting = totalVesting.add(value); NewGrant(msg.sender, _to, value); } /// @dev Grant tokens to a specified address. /// @param _to address The holder address. /// @param _value uint256 The amount of tokens to be granted. /// @param _start uint256 The beginning of the vesting period (timestamp). /// @param _cliff uint256 When the first installment is made (timestamp). /// @param _end uint256 The end of the vesting period (timestamp). /// @param _installmentLength uint256 The length of each vesting installment (in seconds). /// @param _revokable bool Whether the grant is revokable or not. function grant(address _to, uint256 _value, uint256 _start, uint256 _cliff, uint256 _end, uint256 _installmentLength, bool _revokable) external onlyOwner { require(_to != address(0)); require(_to != address(this)); // Protect this contract from receiving a grant. require(_value > 0); // Require that every holder can be granted tokens only once. require(grants[_to].value == 0); // Require for time ranges to be consistent and valid. require(_start <= _cliff && _cliff <= _end); // Require installment length to be valid and no longer than (end - start). require(_installmentLength > 0 && _installmentLength <= _end.sub(_start)); // Grant must not exceed the total amount of tokens currently available for vesting. require(totalVesting.add(_value) <= cln.balanceOf(address(this))); // Assign a new grant. grants[_to] = Grant({ value: _value, start: _start, cliff: _cliff, end: _end, installmentLength: _installmentLength, transferred: 0, revokable: _revokable }); // Since tokens have been granted, increase the total amount vested. totalVesting = totalVesting.add(_value); NewGrant(msg.sender, _to, _value); } /// @dev Revoke the grant of tokens of a specifed address. /// @dev Unlocked tokens will be sent to the grantee, the rest is transferred to the trustee's owner. /// @param _holder The address which will have its tokens revoked. function revoke(address _holder) public onlyOwner { Grant memory grant = grants[_holder]; // Grant must be revokable. require(grant.revokable); // Get the total amount of vested tokens, acccording to grant. uint256 vested = calculateVestedTokens(grant, now); // Calculate the untransferred vested tokens. uint256 transferable = vested.sub(grant.transferred); if (transferable > 0) { // Update transferred and total vesting amount, then transfer remaining vested funds to holder. grant.transferred = grant.transferred.add(transferable); totalVesting = totalVesting.sub(transferable); require(cln.transfer(_holder, transferable)); TokensUnlocked(_holder, transferable); } // Calculate amount of remaining tokens that can still be returned. uint256 refund = grant.value.sub(grant.transferred); // Remove the grant. delete grants[_holder]; // Update total vesting amount and transfer previously calculated tokens to owner. totalVesting = totalVesting.sub(refund); require(cln.transfer(msg.sender, refund)); GrantRevoked(_holder, refund); } /// @dev Calculate the amount of ready tokens of a holder. /// @param _holder address The address of the holder. /// @return a uint256 Representing a holder's total amount of vested tokens. function readyTokens(address _holder) public constant returns (uint256) { Grant memory grant = grants[_holder]; if (grant.value == 0) { return 0; } uint256 vested = calculateVestedTokens(grant, now); if (vested == 0) { return 0; } return vested.sub(grant.transferred); } /// @dev Calculate the total amount of vested tokens of a holder at a given time. /// @param _holder address The address of the holder. /// @param _time uint256 The specific time to calculate against. /// @return a uint256 Representing a holder's total amount of vested tokens. function vestedTokens(address _holder, uint256 _time) public constant returns (uint256) { Grant memory grant = grants[_holder]; if (grant.value == 0) { return 0; } return calculateVestedTokens(grant, _time); } /// @dev Calculate amount of vested tokens at a specifc time. /// @param _grant Grant The vesting grant. /// @param _time uint256 The time to be checked /// @return An uint256 Representing the amount of vested tokens of a specific grant. function calculateVestedTokens(Grant _grant, uint256 _time) private pure returns (uint256) { // If we're before the cliff, then nothing is vested. if (_time < _grant.cliff) { return 0; } // If we're after the end of the vesting period - everything is vested. if (_time >= _grant.end) { return _grant.value; } // Calculate amount of installments past until now. // // NOTE: result gets floored because of integer division. uint256 installmentsPast = _time.sub(_grant.start).div(_grant.installmentLength); // Calculate amount of days in entire vesting period. uint256 vestingDays = _grant.end.sub(_grant.start); // Calculate and return the number of tokens according to vesting days that have passed. return _grant.value.mul(installmentsPast.mul(_grant.installmentLength)).div(vestingDays); } /// @dev Unlock vested tokens and transfer them to the grantee. /// @return a uint The success or error code. function unlockVestedTokens() external returns (uint) { return unlockVestedTokens(msg.sender); } /// @dev Unlock vested tokens and transfer them to the grantee (helper function). /// @param _grantee address The address of the grantee. /// @return a uint The success or error code. function unlockVestedTokens(address _grantee) private returns (uint) { Grant storage grant = grants[_grantee]; // Make sure the grant has tokens available. if (grant.value == 0) { Error(_grantee, ERR_INVALID_VALUE); return ERR_INVALID_VALUE; } // Get the total amount of vested tokens, acccording to grant. uint256 vested = calculateVestedTokens(grant, now); if (vested == 0) { Error(_grantee, ERR_INVALID_VESTED); return ERR_INVALID_VESTED; } // Make sure the holder doesn't transfer more than what he already has. uint256 transferable = vested.sub(grant.transferred); if (transferable == 0) { Error(_grantee, ERR_INVALID_TRANSFERABLE); return ERR_INVALID_TRANSFERABLE; } // Update transferred and total vesting amount, then transfer remaining vested funds to holder. grant.transferred = grant.transferred.add(transferable); totalVesting = totalVesting.sub(transferable); require(cln.transfer(_grantee, transferable)); TokensUnlocked(_grantee, transferable); return OK; } /// @dev batchUnlockVestedTokens vested tokens and transfer them to the grantees. /// @param _grantees address[] The addresses of the grantees. /// @return a boo if success. function batchUnlockVestedTokens(address[] _grantees) external onlyOwner returns (bool success) { for (uint i = 0; i<_grantees.length; i++) { unlockVestedTokens(_grantees[i]); } return true; } /// @dev Allow the owner to transfer out any accidentally sent ERC20 tokens. /// @param _tokenAddress address The address of the ERC20 contract. /// @param _amount uint256 The amount of tokens to be transferred. function withdrawERC20(address _tokenAddress, uint256 _amount) public onlyOwner returns (bool success) { if (_tokenAddress == address(cln)) { // If the token is cln, allow to withdraw only non vested tokens. uint256 availableCLN = cln.balanceOf(this).sub(totalVesting); require(_amount <= availableCLN); } return ERC20(_tokenAddress).transfer(owner, _amount); } } /// @title Colu Local Network sale contract. /// @author Tal Beja. contract ColuLocalNetworkSale is Ownable, TokenHolder { using SafeMath for uint256; // External parties: // Colu Local Network contract. ColuLocalNetwork public cln; // Vesting contract for presale participants. VestingTrustee public trustee; // Received funds are forwarded to this address. address public fundingRecipient; // Post-TDE multisig addresses. address public communityPoolAddress; address public futureDevelopmentPoolAddress; address public stakeholdersPoolAddress; // Colu Local Network decimals. // Using same decimals value as ETH (makes ETH-CLN conversion much easier). // This is the same as in Colu Local Network contract. uint256 public constant TOKEN_DECIMALS = 10 ** 18; // Additional Lockup Allocation Pool uint256 public constant ALAP = 40701333592592592592614116; // Maximum number of tokens in circulation: 1.5 trillion. uint256 public constant MAX_TOKENS = 15 * 10 ** 8 * TOKEN_DECIMALS + ALAP; // Maximum tokens offered in the sale (35%) + ALAP. uint256 public constant MAX_TOKENS_SOLD = 525 * 10 ** 6 * TOKEN_DECIMALS + ALAP; // Maximum tokens offered in the presale (from the initial 35% offered tokens) + ALAP. uint256 public constant MAX_PRESALE_TOKENS_SOLD = 2625 * 10 ** 5 * TOKEN_DECIMALS + ALAP; // Tokens allocated for Community pool (30%). uint256 public constant COMMUNITY_POOL = 45 * 10 ** 7 * TOKEN_DECIMALS; // Tokens allocated for Future development pool (29%). uint256 public constant FUTURE_DEVELOPMENT_POOL = 435 * 10 ** 6 * TOKEN_DECIMALS; // Tokens allocated for Stakeholdes pool (6%). uint256 public constant STAKEHOLDERS_POOL = 9 * 10 ** 7 * TOKEN_DECIMALS; // CLN to ETH ratio. uint256 public constant CLN_PER_ETH = 8600; // Sale start, end blocks (time ranges) uint256 public constant SALE_DURATION = 4 days; uint256 public startTime; uint256 public endTime; // Amount of tokens sold until now in the sale. uint256 public tokensSold = 0; // Amount of tokens sold until now in the presale. uint256 public presaleTokensSold = 0; // Accumulated amount each participant has contributed so far in the sale (in WEI). mapping (address => uint256) public participationHistory; // Accumulated amount each participant have contributed so far in the presale. mapping (address => uint256) public participationPresaleHistory; // Maximum amount that each particular is allowed to contribute (in ETH-WEI). // Defaults to zero. Serving as a functional whitelist. mapping (address => uint256) public participationCaps; // Maximum amount ANYONE is currently allowed to contribute. Set to max uint256 so no limitation other than personal participationCaps. uint256 public hardParticipationCap = uint256(-1); // initialization of the contract, splitted from the constructor to avoid gas block limit. bool public initialized = false; // Vesting plan structure for presale struct VestingPlan { uint256 startOffset; uint256 cliffOffset; uint256 endOffset; uint256 installmentLength; uint8 alapPercent; } // Vesting plans for presale VestingPlan[] public vestingPlans; // Each token that is sent from the ColuLocalNetworkSale is considered as issued. event TokensIssued(address indexed to, uint256 tokens); /// @dev Reverts if called not before the sale. modifier onlyBeforeSale() { if (now >= startTime) { revert(); } _; } /// @dev Reverts if called not during the sale. modifier onlyDuringSale() { if (tokensSold >= MAX_TOKENS_SOLD || now < startTime || now >= endTime) { revert(); } _; } /// @dev Reverts if called before the sale ends. modifier onlyAfterSale() { if (!(tokensSold >= MAX_TOKENS_SOLD || now >= endTime)) { revert(); } _; } /// @dev Reverts if called before the sale is initialized. modifier notInitialized() { if (initialized) { revert(); } _; } /// @dev Reverts if called after the sale is initialized. modifier isInitialized() { if (!initialized) { revert(); } _; } /// @dev Constructor sets the sale addresses and start time. /// @param _owner address The address of this contract owner. /// @param _fundingRecipient address The address of the funding recipient. /// @param _communityPoolAddress address The address of the community pool. /// @param _futureDevelopmentPoolAddress address The address of the future development pool. /// @param _stakeholdersPoolAddress address The address of the team pool. /// @param _startTime uint256 The start time of the token sale. function ColuLocalNetworkSale(address _owner, address _fundingRecipient, address _communityPoolAddress, address _futureDevelopmentPoolAddress, address _stakeholdersPoolAddress, uint256 _startTime) public { require(_owner != address(0)); require(_fundingRecipient != address(0)); require(_communityPoolAddress != address(0)); require(_futureDevelopmentPoolAddress != address(0)); require(_stakeholdersPoolAddress != address(0)); require(_startTime > now); owner = _owner; fundingRecipient = _fundingRecipient; communityPoolAddress = _communityPoolAddress; futureDevelopmentPoolAddress = _futureDevelopmentPoolAddress; stakeholdersPoolAddress = _stakeholdersPoolAddress; startTime = _startTime; endTime = startTime + SALE_DURATION; } /// @dev Initialize the sale conditions. function initialize() public onlyOwner notInitialized { initialized = true; uint256 months = 1 years / 12; vestingPlans.push(VestingPlan(0, 0, 1, 1, 0)); vestingPlans.push(VestingPlan(0, 0, 6 * months, 1 * months, 4)); vestingPlans.push(VestingPlan(0, 0, 1 years, 1 * months, 12)); vestingPlans.push(VestingPlan(0, 0, 2 years, 1 * months, 26)); vestingPlans.push(VestingPlan(0, 0, 3 years, 1 * months, 35)); // Deploy new ColuLocalNetwork contract. cln = new ColuLocalNetwork(MAX_TOKENS); // Deploy new VestingTrustee contract. trustee = new VestingTrustee(cln); // allocate pool tokens: // Issue the remaining tokens to designated pools. require(transferTokens(communityPoolAddress, COMMUNITY_POOL)); // stakeholdersPoolAddress will create its own vesting trusts. require(transferTokens(stakeholdersPoolAddress, STAKEHOLDERS_POOL)); } /// @dev Allocate tokens to presale participant according to its vesting plan and invesment value. /// @param _recipient address The presale participant address to recieve the tokens. /// @param _etherValue uint256 The invesment value (in ETH). /// @param _vestingPlanIndex uint8 The vesting plan index. function presaleAllocation(address _recipient, uint256 _etherValue, uint8 _vestingPlanIndex) external onlyOwner onlyBeforeSale isInitialized { require(_recipient != address(0)); require(_vestingPlanIndex < vestingPlans.length); // Calculate plan and token amount. VestingPlan memory plan = vestingPlans[_vestingPlanIndex]; uint256 tokensAndALAPPerEth = CLN_PER_ETH.mul(SafeMath.add(100, plan.alapPercent)).div(100); uint256 tokensLeftInPreSale = MAX_PRESALE_TOKENS_SOLD.sub(presaleTokensSold); uint256 weiLeftInSale = tokensLeftInPreSale.div(tokensAndALAPPerEth); uint256 weiToParticipate = SafeMath.min256(_etherValue, weiLeftInSale); require(weiToParticipate > 0); participationPresaleHistory[msg.sender] = participationPresaleHistory[msg.sender].add(weiToParticipate); uint256 tokensToTransfer = weiToParticipate.mul(tokensAndALAPPerEth); presaleTokensSold = presaleTokensSold.add(tokensToTransfer); tokensSold = tokensSold.add(tokensToTransfer); // Transfer tokens to trustee and create grant. grant(_recipient, tokensToTransfer, startTime.add(plan.startOffset), startTime.add(plan.cliffOffset), startTime.add(plan.endOffset), plan.installmentLength, false); } /// @dev Add a list of participants to a capped participation tier. /// @param _participants address[] The list of participant addresses. /// @param _cap uint256 The cap amount (in ETH-WEI). function setParticipationCap(address[] _participants, uint256 _cap) external onlyOwner isInitialized { for (uint i = 0; i < _participants.length; i++) { participationCaps[_participants[i]] = _cap; } } /// @dev Set hard participation cap for all participants. /// @param _cap uint256 The hard cap amount. function setHardParticipationCap(uint256 _cap) external onlyOwner isInitialized { require(_cap > 0); hardParticipationCap = _cap; } /// @dev Fallback function that will delegate the request to participate(). function () external payable onlyDuringSale isInitialized { participate(msg.sender); } /// @dev Create and sell tokens to the caller. /// @param _recipient address The address of the recipient receiving the tokens. function participate(address _recipient) public payable onlyDuringSale isInitialized { require(_recipient != address(0)); // Enforce participation cap (in WEI received). uint256 weiAlreadyParticipated = participationHistory[_recipient]; uint256 participationCap = SafeMath.min256(participationCaps[_recipient], hardParticipationCap); uint256 cappedWeiReceived = SafeMath.min256(msg.value, participationCap.sub(weiAlreadyParticipated)); require(cappedWeiReceived > 0); // Accept funds and transfer to funding recipient. uint256 tokensLeftInSale = MAX_TOKENS_SOLD.sub(tokensSold); uint256 weiLeftInSale = tokensLeftInSale.div(CLN_PER_ETH); uint256 weiToParticipate = SafeMath.min256(cappedWeiReceived, weiLeftInSale); participationHistory[_recipient] = weiAlreadyParticipated.add(weiToParticipate); fundingRecipient.transfer(weiToParticipate); // Transfer tokens to recipient. uint256 tokensToTransfer = weiToParticipate.mul(CLN_PER_ETH); if (tokensLeftInSale.sub(tokensToTransfer) < CLN_PER_ETH) { // If purchase would cause less than CLN_PER_ETH tokens to be left then nobody could ever buy them. // So, gift them to the last buyer. tokensToTransfer = tokensLeftInSale; } tokensSold = tokensSold.add(tokensToTransfer); require(transferTokens(_recipient, tokensToTransfer)); // Partial refund if full participation not possible // e.g. due to cap being reached. uint256 refund = msg.value.sub(weiToParticipate); if (refund > 0) { msg.sender.transfer(refund); } } /// @dev Finalizes the token sale event: make future development pool grant (lockup) and make token transfarable. function finalize() external onlyAfterSale onlyOwner isInitialized { if (cln.isTransferable()) { revert(); } // Add unsold token to the future development pool grant (lockup). uint256 tokensLeftInSale = MAX_TOKENS_SOLD.sub(tokensSold); uint256 futureDevelopmentPool = FUTURE_DEVELOPMENT_POOL.add(tokensLeftInSale); // Future Development Pool is locked for 3 years. grant(futureDevelopmentPoolAddress, futureDevelopmentPool, startTime, startTime.add(3 years), startTime.add(3 years), 1 days, false); // Make tokens Transferable, end the sale!. cln.makeTokensTransferable(); } function grant(address _grantee, uint256 _amount, uint256 _start, uint256 _cliff, uint256 _end, uint256 _installmentLength, bool _revokable) private { // bytes4 grantSig = bytes4(keccak256("grant(address,uint256,uint256,uint256,uint256,bool)")); bytes4 grantSig = 0x5ee7e96d; // 6 arguments of size 32 uint256 argsSize = 6 * 32; // sig + arguments size uint256 dataSize = 4 + argsSize; bytes memory m_data = new bytes(dataSize); assembly { // Add the signature first to memory mstore(add(m_data, 0x20), grantSig) // Add the parameters mstore(add(m_data, 0x24), _grantee) mstore(add(m_data, 0x44), _start) mstore(add(m_data, 0x64), _cliff) mstore(add(m_data, 0x84), _end) mstore(add(m_data, 0xa4), _installmentLength) mstore(add(m_data, 0xc4), _revokable) } require(transferTokens(trustee, _amount, m_data)); } /// @dev Transfer tokens from the sale contract to a recipient. /// @param _recipient address The address of the recipient. /// @param _tokens uint256 The amount of tokens to transfer. function transferTokens(address _recipient, uint256 _tokens) private returns (bool ans) { ans = cln.transfer(_recipient, _tokens); if (ans) { TokensIssued(_recipient, _tokens); } } /// @dev Transfer tokens from the sale contract to a recipient. /// @param _recipient address The address of the recipient. /// @param _tokens uint256 The amount of tokens to transfer. /// @param _data bytes data to send to receiver if it is a contract. function transferTokens(address _recipient, uint256 _tokens, bytes _data) private returns (bool ans) { // Request Colu Local Network contract to transfer the requested tokens for the buyer. ans = cln.transferAndCall(_recipient, _tokens, _data); if (ans) { TokensIssued(_recipient, _tokens); } } /// @dev Requests to transfer control of the Colu Local Network contract to a new owner. /// @param _newOwnerCandidate address The address to transfer ownership to. /// /// NOTE: /// 1. The new owner will need to call Colu Local Network contract's acceptOwnership directly in order to accept the ownership. /// 2. Calling this method during the token sale will prevent the token sale to continue, since only the owner of /// the Colu Local Network contract can transfer tokens during the sale. function requestColuLocalNetworkOwnershipTransfer(address _newOwnerCandidate) external onlyOwner { cln.requestOwnershipTransfer(_newOwnerCandidate); } /// @dev Accepts new ownership on behalf of the Colu Local Network contract. // This can be used by the sale contract itself to claim back ownership of the Colu Local Network contract. function acceptColuLocalNetworkOwnership() external onlyOwner { cln.acceptOwnership(); } /// @dev Requests to transfer control of the VestingTrustee contract to a new owner. /// @param _newOwnerCandidate address The address to transfer ownership to. /// /// NOTE: /// 1. The new owner will need to call trustee contract's acceptOwnership directly in order to accept the ownership. /// 2. Calling this method during the token sale will prevent the token sale from alocation presale grunts add finalize, since only the owner of /// the trustee contract can create grunts needed in the presaleAlocation add finalize methods. function requestVestingTrusteeOwnershipTransfer(address _newOwnerCandidate) external onlyOwner { trustee.requestOwnershipTransfer(_newOwnerCandidate); } /// @dev Accepts new ownership on behalf of the VestingTrustee contract. /// This can be used by the token sale contract itself to claim back ownership of the VestingTrustee contract. function acceptVestingTrusteeOwnership() external onlyOwner { trustee.acceptOwnership(); } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"constant":false,"inputs":[{"name":"_newOwnerCandidate","type":"address"}],"name":"requestOwnershipTransfer","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_recipient","type":"address"},{"name":"_etherValue","type":"uint256"},{"name":"_vestingPlanIndex","type":"uint8"}],"name":"presaleAllocation","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"initialized","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"MAX_TOKENS_SOLD","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"fundingRecipient","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"endTime","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"presaleTokensSold","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"","type":"address"}],"name":"participationHistory","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"finalize","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"tokensSold","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"stakeholdersPoolAddress","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"","type":"uint256"}],"name":"vestingPlans","outputs":[{"name":"startOffset","type":"uint256"},{"name":"cliffOffset","type":"uint256"},{"name":"endOffset","type":"uint256"},{"name":"installmentLength","type":"uint256"},{"name":"alapPercent","type":"uint8"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"CLN_PER_ETH","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"TOKEN_DECIMALS","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_cap","type":"uint256"}],"name":"setHardParticipationCap","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"hardParticipationCap","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"SALE_DURATION","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"FUTURE_DEVELOPMENT_POOL","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"","type":"address"}],"name":"participationCaps","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"startTime","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"acceptOwnership","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"STAKEHOLDERS_POOL","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"ALAP","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"initialize","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_participants","type":"address[]"},{"name":"_cap","type":"uint256"}],"name":"setParticipationCap","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"owner","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"cln","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"COMMUNITY_POOL","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"acceptColuLocalNetworkOwnership","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_recipient","type":"address"}],"name":"participate","outputs":[],"payable":true,"stateMutability":"payable","type":"function"},{"constant":false,"inputs":[{"name":"_newOwnerCandidate","type":"address"}],"name":"requestColuLocalNetworkOwnershipTransfer","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_newOwnerCandidate","type":"address"}],"name":"requestVestingTrusteeOwnershipTransfer","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[],"name":"acceptVestingTrusteeOwnership","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"newOwnerCandidate","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_tokenAddress","type":"address"},{"name":"_amount","type":"uint256"}],"name":"transferAnyERC20Token","outputs":[{"name":"success","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"MAX_PRESALE_TOKENS_SOLD","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"communityPoolAddress","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"futureDevelopmentPoolAddress","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"MAX_TOKENS","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"","type":"address"}],"name":"participationPresaleHistory","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"trustee","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"inputs":[{"name":"_owner","type":"address"},{"name":"_fundingRecipient","type":"address"},{"name":"_communityPoolAddress","type":"address"},{"name":"_futureDevelopmentPoolAddress","type":"address"},{"name":"_stakeholdersPoolAddress","type":"address"},{"name":"_startTime","type":"uint256"}],"payable":false,"stateMutability":"nonpayable","type":"constructor"},{"payable":true,"stateMutability":"payable","type":"fallback"},{"anonymous":false,"inputs":[{"indexed":true,"name":"to","type":"address"},{"indexed":false,"name":"tokens","type":"uint256"}],"name":"TokensIssued","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"_by","type":"address"},{"indexed":true,"name":"_to","type":"address"}],"name":"OwnershipRequested","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"_from","type":"address"},{"indexed":true,"name":"_to","type":"address"}],"name":"OwnershipTransferred","type":"event"}]
Contract Creation Code
60606040526000600a819055600b55600019600f556010805460ff19169055341561002957600080fd5b60405160c08062003f1683398101604052808051919060200180519190602001805191906020018051919060200180519190602001805160008054600160a060020a03191633600160a060020a039081169190911790915590925087161515905061009357600080fd5b600160a060020a03851615156100a857600080fd5b600160a060020a03841615156100bd57600080fd5b600160a060020a03831615156100d257600080fd5b600160a060020a03821615156100e757600080fd5b4281116100f357600080fd5b60008054600160a060020a0319908116600160a060020a0398891617825560048054821697891697909717909655600580548716958816959095179094556006805486169387169390931790925560078054909416941693909317909155600882905562054600909101600955613da59081906200017190396000f3006060604052600436106101df5763ffffffff60e060020a6000350416630952c504811461023157806310ae4a7314610250578063158ef93e1461027857806317f5de951461029f5780631bb534ba146102c45780633197cbb6146102f3578063341c33041461030657806349432923146103195780634bb278f314610338578063518ab2a81461034b57806355b1182c1461035e5780635a592380146103715780635b3b20e1146103ba5780635b7f415c146103cd57806364329400146103e057806365b9e37d146103f65780636d79207c14610409578063751ecea01461041c57806376e532211461042f57806378e979251461044e57806379ba5097146104615780637eddea211461047457806381030e35146104875780638129fc1c1461049a57806383d880d0146104ad5780638da5cb5b146104cf57806390604005146104e2578063aeb47e2a146104f5578063b3b4ec5414610508578063b91038c71461051b578063baa835681461052f578063c28f9df11461054e578063cfabe67b1461056d578063d091b55014610580578063dc39d06d14610593578063e5514c9d146105b5578063ea02db0f146105c8578063ed3788c9146105db578063f47c84c5146105ee578063fae95a7114610601578063fdf97cb214610620575b600a546b01d3efeabe3216ca7036b2e4901015806101fe575060085442105b8061020b57506009544210155b1561021557600080fd5b60105460ff16151561022657600080fd5b61022f33610633565b005b341561023c57600080fd5b61022f600160a060020a0360043516610857565b341561025b57600080fd5b61022f600160a060020a036004351660243560ff604435166108ea565b341561028357600080fd5b61028b610b13565b604051901515815260200160405180910390f35b34156102aa57600080fd5b6102b2610b1c565b60405190815260200160405180910390f35b34156102cf57600080fd5b6102d7610b2c565b604051600160a060020a03909116815260200160405180910390f35b34156102fe57600080fd5b6102b2610b3b565b341561031157600080fd5b6102b2610b41565b341561032457600080fd5b6102b2600160a060020a0360043516610b47565b341561034357600080fd5b61022f610b59565b341561035657600080fd5b6102b2610d08565b341561036957600080fd5b6102d7610d0e565b341561037c57600080fd5b610387600435610d1d565b6040519485526020850193909352604080850192909252606084015260ff909116608083015260a0909101905180910390f35b34156103c557600080fd5b6102b2610d5f565b34156103d857600080fd5b6102b2610d65565b34156103eb57600080fd5b61022f600435610d71565b341561040157600080fd5b6102b2610daf565b341561041457600080fd5b6102b2610db5565b341561042757600080fd5b6102b2610dbc565b341561043a57600080fd5b6102b2600160a060020a0360043516610dcc565b341561045957600080fd5b6102b2610dde565b341561046c57600080fd5b61022f610de4565b341561047f57600080fd5b6102b2610e71565b341561049257600080fd5b6102b2610e80565b34156104a557600080fd5b61022f610e8f565b34156104b857600080fd5b61022f6024600480358281019291013590356112b6565b34156104da57600080fd5b6102d7611331565b34156104ed57600080fd5b6102d7611340565b341561050057600080fd5b6102b261134f565b341561051357600080fd5b61022f61135f565b61022f600160a060020a0360043516610633565b341561053a57600080fd5b61022f600160a060020a03600435166113cf565b341561055957600080fd5b61022f600160a060020a036004351661144b565b341561057857600080fd5b61022f6114b6565b341561058b57600080fd5b6102d7611510565b341561059e57600080fd5b61028b600160a060020a036004351660243561151f565b34156105c057600080fd5b6102b26115c4565b34156105d357600080fd5b6102d76115d3565b34156105e657600080fd5b6102d76115e2565b34156105f957600080fd5b6102b26115f1565b341561060c57600080fd5b6102b2600160a060020a0360043516611601565b341561062b57600080fd5b6102d7611613565b6000806000806000806000806a21aad7b717d3774336b2e4670de0b6b3a7640000631f4add400201600a5410158061066c575060085442105b8061067957506009544210155b1561068357600080fd5b60105460ff16151561069457600080fd5b600160a060020a03891615156106a957600080fd5b600160a060020a0389166000908152600c6020908152604080832054600e90925290912054600f549199506106dd91611622565b96506106f8346106f3898b63ffffffff61163a16565b611622565b95506000861161070757600080fd5b600a54610727906b01d3efeabe3216ca7036b2e49063ffffffff61163a16565b945061073b8561219863ffffffff61164f16565b93506107478685611622565b9250610759888463ffffffff61166616565b600160a060020a03808b166000908152600c60205260409081902092909255600454169084156108fc0290859051600060405180830381858888f1935050505015156107a457600080fd5b6107b68361219863ffffffff61167816565b91506121986107cb868463ffffffff61163a16565b10156107d5578491505b600a546107e8908363ffffffff61166616565b600a556107f5898361169f565b151561080057600080fd5b610810348463ffffffff61163a16565b9050600081111561084c57600160a060020a03331681156108fc0282604051600060405180830381858888f19350505050151561084c57600080fd5b505050505050505050565b60005433600160a060020a0390811691161461087257600080fd5b600160a060020a038116151561088757600080fd5b6001805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a0383811691909117918290559081169033167f13a4b3bc0d5234dd3d87c9f1557d8faefa37986da62c36ba49309e2fb2c9aec460405160405180910390a350565b6108f2611963565b60008054819081908190819033600160a060020a0390811691161461091657600080fd5b600854421061092457600080fd5b60105460ff16151561093557600080fd5b600160a060020a038916151561094a57600080fd5b60115460ff88161061095b57600080fd5b6011805460ff891690811061096c57fe5b906000526020600020906005020160a0604051908101604090815282548252600183015460208301526002830154908201526003820154606082015260049091015460ff16608082019081529096506109f0906064906109e4906109d59083905160ff16611666565b6121989063ffffffff61167816565b9063ffffffff61164f16565b600b54909550610a12906afacd613aa4f520d9b6b2e49063ffffffff61163a16565b9350610a24848663ffffffff61164f16565b9250610a308884611622565b915060008211610a3f57600080fd5b600160a060020a0333166000908152600d6020526040902054610a68908363ffffffff61166616565b600160a060020a0333166000908152600d6020526040902055610a91828663ffffffff61167816565b600b54909150610aa7908263ffffffff61166616565b600b55600a54610abd908263ffffffff61166616565b600a5561084c8982610ad989516008549063ffffffff61166616565b610af08a602001516008549063ffffffff61166616565b610b078b604001516008549063ffffffff61166616565b8b606001516000611765565b60105460ff1681565b6b01d3efeabe3216ca7036b2e481565b600454600160a060020a031681565b60095481565b600b5481565b600c6020526000908152604090205481565b600a5460009081906b01d3efeabe3216ca7036b2e490101580610b7e57506009544210155b1515610b8957600080fd5b60005433600160a060020a03908116911614610ba457600080fd5b60105460ff161515610bb557600080fd5b600254600160a060020a0316632121dc756000604051602001526040518163ffffffff1660e060020a028152600401602060405180830381600087803b1515610bfd57600080fd5b6102c65a03f11515610c0e57600080fd5b5050506040518051905015610c2257600080fd5b600a54610c42906b01d3efeabe3216ca7036b2e49063ffffffff61163a16565b9150610c606b0167d2d5406637c8930000008363ffffffff61166616565b600654600854919250610cb191600160a060020a03909116908390610c8f816305a39a8063ffffffff61166616565b600854610ca6906305a39a8063ffffffff61166616565b620151806000611765565b600254600160a060020a0316635348ac956040518163ffffffff1660e060020a028152600401600060405180830381600087803b1515610cf057600080fd5b6102c65a03f11515610d0157600080fd5b5050505050565b600a5481565b600754600160a060020a031681565b6011805482908110610d2b57fe5b6000918252602090912060059091020180546001820154600283015460038401546004909401549294509092909160ff1685565b61219881565b670de0b6b3a764000081565b60005433600160a060020a03908116911614610d8c57600080fd5b60105460ff161515610d9d57600080fd5b60008111610daa57600080fd5b600f55565b600f5481565b6205460081565b6b0167d2d5406637c89300000081565b600e6020526000908152604090205481565b60085481565b60015460009033600160a060020a03908116911614610e0257600080fd5b50600080546001805473ffffffffffffffffffffffffffffffffffffffff19808416600160a060020a03838116919091179586905591169091559081169116817f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a350565b6a4a723dc6b40b8a9a00000081565b6a21aad7b717d3774336b2e481565b6000805433600160a060020a03908116911614610eab57600080fd5b60105460ff1615610ebb57600080fd5b506010805460ff1916600190811790915560118054622819a0928101610ee18382611996565b9160005260206000209060050201600060a06040519081016040908152600080835260208301819052600191830182905260608301919091526080820152919050815181556020820151816001015560408201518160020155606082015181600301556080820151600491909101805460ff191660ff90921691909117905550506011805460018101610f748382611996565b9160005260206000209060050201600060a060405190810160409081526000808352602083015260068602908201526060810185905260046080820152919050815181556020820151816001015560408201518160020155606082015181600301556080820151600491909101805460ff191660ff909216919091179055505060118054600181016110068382611996565b9160005260206000209060050201600060a06040519081016040908152600080835260208301526301e133809082015260608101859052600c6080820152919050815181556020820151816001015560408201518160020155606082015181600301556080820151600491909101805460ff191660ff909216919091179055505060118054600181016110998382611996565b9160005260206000209060050201600060a06040519081016040908152600080835260208301526303c267009082015260608101859052601a6080820152919050815181556020820151816001015560408201518160020155606082015181600301556080820151600491909101805460ff191660ff9092169190911790555050601180546001810161112c8382611996565b9160005260206000209060050201600060a06040519081016040908152600080835260208301526305a39a80908201526060810185905260236080820152919050815181556020820151816001015560408201518160020155606082015181600301556080820151600491909101805460ff191660ff909216919091179055506b04fa7032a6d093d29f36b2e490506111c36119c2565b908152602001604051809103906000f08015156111df57600080fd5b6002805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a039283161790819055166112136119d2565b600160a060020a039091168152602001604051809103906000f080151561123957600080fd5b6003805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a0392831617905560055461127c91166b01743b34e18439b50200000061169f565b151561128757600080fd5b6007546112a890600160a060020a03166a4a723dc6b40b8a9a00000061169f565b15156112b357600080fd5b50565b6000805433600160a060020a039081169116146112d257600080fd5b60105460ff1615156112e357600080fd5b5060005b8281101561132b5781600e600086868581811061130057fe5b60209081029290920135600160a060020a0316835250810191909152604001600020556001016112e7565b50505050565b600054600160a060020a031681565b600254600160a060020a031681565b6b01743b34e18439b50200000081565b60005433600160a060020a0390811691161461137a57600080fd5b600254600160a060020a03166379ba50976040518163ffffffff1660e060020a028152600401600060405180830381600087803b15156113b957600080fd5b6102c65a03f115156113ca57600080fd5b505050565b60005433600160a060020a039081169116146113ea57600080fd5b600254600160a060020a0316630952c5048260405160e060020a63ffffffff8416028152600160a060020a039091166004820152602401600060405180830381600087803b151561143a57600080fd5b6102c65a03f1151561132b57600080fd5b60005433600160a060020a0390811691161461146657600080fd5b600354600160a060020a0316630952c5048260405160e060020a63ffffffff8416028152600160a060020a039091166004820152602401600060405180830381600087803b151561143a57600080fd5b60005433600160a060020a039081169116146114d157600080fd5b600354600160a060020a03166379ba50976040518163ffffffff1660e060020a028152600401600060405180830381600087803b15156113b957600080fd5b600154600160a060020a031681565b6000805433600160a060020a0390811691161461153b57600080fd5b60008054600160a060020a038086169263a9059cbb929091169085906040516020015260405160e060020a63ffffffff8516028152600160a060020a0390921660048301526024820152604401602060405180830381600087803b15156115a157600080fd5b6102c65a03f115156115b257600080fd5b50505060405180519150505b92915050565b6afacd613aa4f520d9b6b2e481565b600554600160a060020a031681565b600654600160a060020a031681565b6b04fa7032a6d093d29f36b2e481565b600d6020526000908152604090205481565b600354600160a060020a031681565b60008183106116315781611633565b825b9392505050565b60008282111561164957600080fd5b50900390565b600080828481151561165d57fe5b04949350505050565b60008282018381101561163357600080fd5b6000828202831580611694575082848281151561169157fe5b04145b151561163357600080fd5b600254600090600160a060020a031663a9059cbb8484846040516020015260405160e060020a63ffffffff8516028152600160a060020a0390921660048301526024820152604401602060405180830381600087803b151561170057600080fd5b6102c65a03f1151561171157600080fd5b505050604051805191505080156115be5782600160a060020a03167f21d739f160a7464fddaac4a1d1517d84e76b75618a053943b345c408c4160fe08360405190815260200160405180910390a292915050565b60008060006117726119e2565b7f5ee7e96d00000000000000000000000000000000000000000000000000000000935060c0925060c49150816040518059106117ab5750595b818152601f19601f8301168101602001604052905090508360208201528a60248201528860448201528760648201528660848201528560a48201528460c482015261180c600360009054906101000a9004600160a060020a03168b83611824565b151561181757600080fd5b5050505050505050505050565b600254600090600160a060020a0316634000aea085858585604051602001526040518463ffffffff1660e060020a0281526004018084600160a060020a0316600160a060020a0316815260200183815260200180602001828103825283818151815260200191508051906020019080838360005b838110156118b0578082015183820152602001611898565b50505050905090810190601f1680156118dd5780820380516001836020036101000a031916815260200191505b50945050505050602060405180830381600087803b15156118fd57600080fd5b6102c65a03f1151561190e57600080fd5b505050604051805191505080156116335783600160a060020a03167f21d739f160a7464fddaac4a1d1517d84e76b75618a053943b345c408c4160fe08460405190815260200160405180910390a29392505050565b60a06040519081016040528060008152602001600081526020016000815260200160008152602001600060ff1681525090565b8154818355818115116113ca576005028160050283600052602060002091820191016113ca91906119f4565b604051610d6180611a3683390190565b6040516115e38061279783390190565b60206040519081016040526000815290565b611a3291905b80821115611a2e5760008082556001820181905560028201819055600382015560048101805460ff191690556005016119fa565b5090565b90560060606040526005805460a060020a60ff0219169055341561001f57600080fd5b604051602080610d618339810160405280805160048054600160a060020a033316600160a060020a0319909116811790915560018290556000908152600360205260409020555050610ceb806100766000396000f3006060604052600436106100d75763ffffffff60e060020a60003504166306fdde0381146100dc5780630952c50414610166578063095ea7b31461018757806318160ddd146101bd5780632121dc75146101e257806323b872dd146101f5578063313ce5671461021d5780634000aea0146102465780635348ac95146102ab57806370a08231146102be57806379ba5097146102dd5780638da5cb5b146102f057806395d89b411461031f578063a9059cbb14610332578063d091b55014610354578063dc39d06d14610367578063dd62ed3e14610389575b600080fd5b34156100e757600080fd5b6100ef6103ae565b60405160208082528190810183818151815260200191508051906020019080838360005b8381101561012b578082015183820152602001610113565b50505050905090810190601f1680156101585780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b341561017157600080fd5b610185600160a060020a03600435166103e5565b005b341561019257600080fd5b6101a9600160a060020a0360043516602435610478565b604051901515815260200160405180910390f35b34156101c857600080fd5b6101d06104bd565b60405190815260200160405180910390f35b34156101ed57600080fd5b6101a96104c3565b341561020057600080fd5b6101a9600160a060020a03600435811690602435166044356104d3565b341561022857600080fd5b61023061051a565b60405160ff909116815260200160405180910390f35b341561025157600080fd5b6101a960048035600160a060020a03169060248035919060649060443590810190830135806020601f8201819004810201604051908101604052818152929190602084018383808284375094965061051f95505050505050565b34156102b657600080fd5b61018561055e565b34156102c957600080fd5b6101d0600160a060020a03600435166105e3565b34156102e857600080fd5b6101856105fe565b34156102fb57600080fd5b61030361068b565b604051600160a060020a03909116815260200160405180910390f35b341561032a57600080fd5b6100ef61069a565b341561033d57600080fd5b6101a9600160a060020a03600435166024356106d1565b341561035f57600080fd5b61030361070f565b341561037257600080fd5b6101a9600160a060020a036004351660243561071e565b341561039457600080fd5b6101d0600160a060020a03600435811690602435166107c0565b60408051908101604052601281527f436f6c75204c6f63616c204e6574776f726b0000000000000000000000000000602082015281565b60045433600160a060020a0390811691161461040057600080fd5b600160a060020a038116151561041557600080fd5b6005805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a0383811691909117918290559081169033167f13a4b3bc0d5234dd3d87c9f1557d8faefa37986da62c36ba49309e2fb2c9aec460405160405180910390a350565b60045460009033600160a060020a03908116911614806104a1575060055460a060020a900460ff165b15156104ac57600080fd5b6104b683836107eb565b9392505050565b60015481565b60055460a060020a900460ff1681565b60045460009033600160a060020a03908116911614806104fc575060055460a060020a900460ff165b151561050757600080fd5b610512848484610893565b949350505050565b601281565b60045460009033600160a060020a0390811691161480610548575060055460a060020a900460ff165b151561055357600080fd5b6105128484846109bd565b60045433600160a060020a0390811691161461057957600080fd5b60055460a060020a900460ff1615610590576105e1565b6005805474ff0000000000000000000000000000000000000000191660a060020a1790557fa693ca1b20114bcad5861562c3007eb477c4926f79219f624bdbfde146fd2b6460405160405180910390a15b565b600160a060020a031660009081526003602052604090205490565b60055460009033600160a060020a0390811691161461061c57600080fd5b50600480546005805473ffffffffffffffffffffffffffffffffffffffff19808416600160a060020a03838116919091179586905591169091559081169116817f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a350565b600454600160a060020a031681565b60408051908101604052600381527f434c4e0000000000000000000000000000000000000000000000000000000000602082015281565b60045460009033600160a060020a03908116911614806106fa575060055460a060020a900460ff165b151561070557600080fd5b6104b68383610ab2565b600554600160a060020a031681565b60045460009033600160a060020a0390811691161461073c57600080fd5b600454600160a060020a038085169163a9059cbb91168460006040516020015260405160e060020a63ffffffff8516028152600160a060020a0390921660048301526024820152604401602060405180830381600087803b151561079f57600080fd5b6102c65a03f115156107b057600080fd5b5050506040518051949350505050565b600160a060020a03918216600090815260026020908152604080832093909416825291909152205490565b600081158015906108205750600160a060020a0333811660009081526002602090815260408083209387168352929052205415155b1561082a57600080fd5b600160a060020a03338116600081815260026020908152604080832094881680845294909152908190208590557f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9259085905190815260200160405180910390a350600192915050565b600080600160a060020a03841615156108ab57600080fd5b50600160a060020a038085166000818152600260209081526040808320339095168352938152838220549282526003905291909120546108f1908463ffffffff610b8816565b600160a060020a038087166000908152600360205260408082209390935590861681522054610926908463ffffffff610b9d16565b600160a060020a03851660009081526003602052604090205561094f818463ffffffff610b8816565b600160a060020a03808716600081815260026020908152604080832033861684529091529081902093909355908616917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9086905190815260200160405180910390a3506001949350505050565b60006109c98484610ab2565b15156109d457600080fd5b83600160a060020a031633600160a060020a03167fce8124fd2ae9fd7904103e5a9ebe88b527b9ca0e32a32fd497845c82706542d3858560405182815260406020820181815290820183818151815260200191508051906020019080838360005b83811015610a4d578082015183820152602001610a35565b50505050905090810190601f168015610a7a5780820380516001836020036101000a031916815260200191505b50935050505060405180910390a3610a9184610baf565b15610aa857610aa1848484610bb7565b90506104b6565b5060019392505050565b6000600160a060020a0383161515610ac957600080fd5b600160a060020a033316600090815260036020526040902054610af2908363ffffffff610b8816565b600160a060020a033381166000908152600360205260408082209390935590851681522054610b27908363ffffffff610b9d16565b600160a060020a0380851660008181526003602052604090819020939093559133909116907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9085905190815260200160405180910390a350600192915050565b600082821115610b9757600080fd5b50900390565b6000828201838110156104b657600080fd5b6000903b1190565b600083600160a060020a03811663c0ee0b8a33868686604051602001526040518463ffffffff1660e060020a0281526004018084600160a060020a0316600160a060020a0316815260200183815260200180602001828103825283818151815260200191508051906020019080838360005b83811015610c41578082015183820152602001610c29565b50505050905090810190601f168015610c6e5780820380516001836020036101000a031916815260200191505b50945050505050602060405180830381600087803b1515610c8e57600080fd5b6102c65a03f11515610c9f57600080fd5b505050604051805190501515610cb457600080fd5b5060019493505050505600a165627a7a723058205ad7a6a2d562512bf45fa613c725473ae4db5a17be681123885fd9935ff3546f00296060604052341561000f57600080fd5b6040516020806115e38339810160405280805160038054600160a060020a033381166101000261010060a860020a03199092169190911790915590925082161515905061005b57600080fd5b60058054600160a060020a031916600160a060020a03929092169190911790556115598061008a6000396000f3006060604052600436106100d75763ffffffff60e060020a600035041663061f765081146100dc5780630952c5041461010f5780631a64adae146101305780631e075aba146101645780635ee7e96d146101825780636bfa379e146101b257806374a8f103146101d157806379ba5097146101f05780637c17357d1461020357806383fcf973146102165780638da5cb5b146102295780639060400514610258578063957924301461026b578063a1db97821461029e578063b869cea3146102c0578063c0ee0b8a1461031d578063d091b5501461034c575b600080fd5b34156100e757600080fd5b6100fb600160a060020a036004351661035f565b604051901515815260200160405180910390f35b341561011a57600080fd5b61012e600160a060020a0360043516610373565b005b341561013b57600080fd5b610152600160a060020a036004351660243561040b565b60405190815260200160405180910390f35b341561016f57600080fd5b6100fb60048035602481019101356104a8565b341561018d57600080fd5b61012e600160a060020a036004351660243560443560643560843560a4351515610510565b34156101bd57600080fd5b610152600160a060020a0360043516610782565b34156101dc57600080fd5b61012e600160a060020a0360043516610845565b34156101fb57600080fd5b61012e610b52565b341561020e57600080fd5b610152610c00565b341561022157600080fd5b610152610c06565b341561023457600080fd5b61023c610c16565b604051600160a060020a03909116815260200160405180910390f35b341561026357600080fd5b61023c610c2a565b341561027657600080fd5b61012e600160a060020a036004351660243560443560643560843560a43560c4351515610c39565b34156102a957600080fd5b6100fb600160a060020a0360043516602435610e91565b34156102cb57600080fd5b6102df600160a060020a0360043516610fee565b60405196875260208701959095526040808701949094526060860192909252608085015260a084015290151560c083015260e0909101905180910390f35b341561032857600080fd5b6100fb60048035600160a060020a031690602480359160443591820191013561102f565b341561035757600080fd5b61023c611147565b600554600160a060020a0391821691161490565b60035433600160a060020a03908116610100909204161461039357600080fd5b600160a060020a03811615156103a857600080fd5b6004805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a0383811691909117918290559081169033167f13a4b3bc0d5234dd3d87c9f1557d8faefa37986da62c36ba49309e2fb2c9aec460405160405180910390a350565b60006104156114ed565b600160a060020a038416600090815260066020526040908190209060e09051908101604090815282548252600183015460208301526002830154908201526003820154606082015260048201546080820152600582015460a082015260069091015460ff16151560c082015290508051151561049457600091506104a1565b61049e8184611156565b91505b5092915050565b600354600090819033600160a060020a0390811661010090920416146104cd57600080fd5b5060005b82811015610506576104fd8484838181106104e857fe5b90506020020135600160a060020a03166111ff565b506001016104d1565b5060019392505050565b6003546001546000916101009004600160a060020a0390811691161461053557600080fd5b60035460ff16151561054657600080fd5b600160a060020a038716151561055b57600080fd5b30600160a060020a031687600160a060020a03161415151561057c57600080fd5b506002546000811161058d57600080fd5b600160a060020a038716600090815260066020526040902054156105b057600080fd5b8486111580156105c05750838511155b15156105cb57600080fd5b6000831180156105ea57506105e6848763ffffffff61148116565b8311155b15156105f557600080fd5b600554600160a060020a03166370a082313060006040516020015260405160e060020a63ffffffff8416028152600160a060020a039091166004820152602401602060405180830381600087803b151561064e57600080fd5b6102c65a03f1151561065f57600080fd5b505050604051805160075490915061067d908363ffffffff61149616565b111561068857600080fd5b60e0604051908101604090815282825260208083018990528183018890526060830187905260808301869052600060a0840181905285151560c0850152600160a060020a038b168152600690915220815181556020820151816001015560408201518160020155606082015181600301556080820151816004015560a0820151816005015560c0820151600691909101805460ff1916911515919091179055506007546107359082611496565b600755600160a060020a038088169033167ffabf00c3717e5e33d6fcc433d4d70ef919a4101fb7d5c444fe349927034eaa458360405190815260200160405180910390a350505050505050565b600061078c6114ed565b600160a060020a0383166000908152600660205260408082209060e09051908101604090815282548252600183015460208301526002830154908201526003820154606082015260048201546080820152600582015460a082015260069091015460ff16151560c082015291508151151561080a576000925061083e565b6108148242611156565b9050801515610826576000925061083e565b61083b8260a00151829063ffffffff61148116565b92505b5050919050565b61084d6114ed565b6003546000908190819033600160a060020a03908116610100909204161461087457600080fd5b600160a060020a038516600090815260066020526040908190209060e09051908101604090815282548252600183015460208301526002830154908201526003820154606082015260048201546080820152600582015460a082015260069091015460ff16151560c082019081529094505115156108f157600080fd5b6108fb8442611156565b92506109128460a00151849063ffffffff61148116565b91506000821115610a1057610932828560a001519063ffffffff61149616565b60a085015260075461094a908363ffffffff61148116565b600755600554600160a060020a031663a9059cbb868460006040516020015260405160e060020a63ffffffff8516028152600160a060020a0390921660048301526024820152604401602060405180830381600087803b15156109ac57600080fd5b6102c65a03f115156109bd57600080fd5b5050506040518051905015156109d257600080fd5b84600160a060020a03167fe7b379c6c1fa169e9079c25e9143b127637eef8ec8c9d5c06ddb4ab3e11958888360405190815260200160405180910390a25b610a268460a0015185519063ffffffff61148116565b600160a060020a0386166000908152600660208190526040822082815560018101839055600281018390556003810183905560048101839055600581019290925501805460ff19169055600754909150610a86908263ffffffff61148116565b600755600554600160a060020a031663a9059cbb338360006040516020015260405160e060020a63ffffffff8516028152600160a060020a0390921660048301526024820152604401602060405180830381600087803b1515610ae857600080fd5b6102c65a03f11515610af957600080fd5b505050604051805190501515610b0e57600080fd5b84600160a060020a03167f740528a7c317c81f0923adc30df75db3f448298c78cdaf548adfcfdb3c84ff6f8260405190815260200160405180910390a25050505050565b60045460009033600160a060020a03908116911614610b7057600080fd5b506003805460048054600160a060020a0381811661010090810274ffffffffffffffffffffffffffffffffffffffff00198616179586905573ffffffffffffffffffffffffffffffffffffffff19909216909255918290048116929190910416817f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a350565b60075481565b6000610c11336111ff565b905090565b6003546101009004600160a060020a031681565b600554600160a060020a031681565b60035433600160a060020a039081166101009092041614610c5957600080fd5b600160a060020a0387161515610c6e57600080fd5b30600160a060020a031687600160a060020a031614151515610c8f57600080fd5b60008611610c9c57600080fd5b600160a060020a03871660009081526006602052604090205415610cbf57600080fd5b838511158015610ccf5750828411155b1515610cda57600080fd5b600082118015610cf95750610cf5838663ffffffff61148116565b8211155b1515610d0457600080fd5b600554600160a060020a03166370a082313060006040516020015260405160e060020a63ffffffff8416028152600160a060020a039091166004820152602401602060405180830381600087803b1515610d5d57600080fd5b6102c65a03f11515610d6e57600080fd5b5050506040518051600754909150610d8c908863ffffffff61149616565b1115610d9757600080fd5b60e0604051908101604090815287825260208083018890528183018790526060830186905260808301859052600060a0840181905284151560c0850152600160a060020a038b168152600690915220815181556020820151816001015560408201518160020155606082015181600301556080820151816004015560a0820151816005015560c0820151600691909101805460ff191691151591909117905550600754610e449087611496565b600755600160a060020a038088169033167ffabf00c3717e5e33d6fcc433d4d70ef919a4101fb7d5c444fe349927034eaa458860405190815260200160405180910390a350505050505050565b600354600090819033600160a060020a039081166101009092041614610eb657600080fd5b600554600160a060020a0385811691161415610f6357600754600554610f549190600160a060020a03166370a082313060006040516020015260405160e060020a63ffffffff8416028152600160a060020a039091166004820152602401602060405180830381600087803b1515610f2d57600080fd5b6102c65a03f11515610f3e57600080fd5b505050604051805191905063ffffffff61148116565b905080831115610f6357600080fd5b600354600160a060020a038086169163a9059cbb91610100909104168560006040516020015260405160e060020a63ffffffff8516028152600160a060020a0390921660048301526024820152604401602060405180830381600087803b1515610fcc57600080fd5b6102c65a03f11515610fdd57600080fd5b505050604051805195945050505050565b600660208190526000918252604090912080546001820154600283015460038401546004850154600586015495909601549395929491939092919060ff1687565b600061103a3361035f565b15156110485750600061113f565b60606040519081016040908152600160a060020a03338116835287166020830152810185905260008151815473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a0391909116178155602082015160018201805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a03929092169190911790556040820151600290910155506003805460ff19166001179055600160a060020a0330168383604051808383808284378201915050925050506000604051808303818561646e5a03f4915050151561113157506003805460ff19169055600061113f565b506003805460ff1916905560015b949350505050565b600454600160a060020a031681565b6000806000846040015184101561117057600092506111f7565b8460600151841061118457845192506111f7565b6111ad85608001516111a18760200151879063ffffffff61148116565b9063ffffffff6114af16565b91506111c8856020015186606001519063ffffffff61148116565b90506111f4816111a16111e68860800151869063ffffffff6114c616565b88519063ffffffff6114c616565b92505b505092915050565b600160a060020a0381166000908152600660205260408120805482908190151561126c5784600160a060020a03167f9cf38cf2dbf9139f5c32639950507b10775fbbe0421f3e168bc2d1bb1ae3208c61271160405190815260200160405180910390a26127119350611479565b6112c88360e0604051908101604090815282548252600183015460208301526002830154908201526003820154606082015260048201546080820152600582015460a082015260069091015460ff16151560c082015242611156565b915081151561131a5784600160a060020a03167f9cf38cf2dbf9139f5c32639950507b10775fbbe0421f3e168bc2d1bb1ae3208c61271260405190815260200160405180910390a26127129350611479565b600583015461133090839063ffffffff61148116565b90508015156113825784600160a060020a03167f9cf38cf2dbf9139f5c32639950507b10775fbbe0421f3e168bc2d1bb1ae3208c61271360405190815260200160405180910390a26127139350611479565b6005830154611397908263ffffffff61149616565b60058401556007546113af908263ffffffff61148116565b600755600554600160a060020a031663a9059cbb868360006040516020015260405160e060020a63ffffffff8516028152600160a060020a0390921660048301526024820152604401602060405180830381600087803b151561141157600080fd5b6102c65a03f1151561142257600080fd5b50505060405180519050151561143757600080fd5b84600160a060020a03167fe7b379c6c1fa169e9079c25e9143b127637eef8ec8c9d5c06ddb4ab3e11958888260405190815260200160405180910390a2600193505b505050919050565b60008282111561149057600080fd5b50900390565b6000828201838110156114a857600080fd5b9392505050565b60008082848115156114bd57fe5b04949350505050565b60008282028315806114e257508284828115156114df57fe5b04145b15156114a857600080fd5b60e06040519081016040528060008152602001600081526020016000815260200160008152602001600081526020016000815260200160001515815250905600a165627a7a7230582023e279ba6dd17c7f0a8770f361cf7543be16a96d1d1db31ee899c3caf7ddfa8d0029a165627a7a72305820f0b0180cdeeba8e04242bf01de41a0a5ec21d89f2549775ddf4e6ca8672e806e0029000000000000000000000000a76e676c9cdc7aa2ab12b3ec4dd4c2be9a6774aa00000000000000000000000034df02e145f0a6b5df675e9dfab54ae745e6c4ff000000000000000000000000254158138007803eebc95d082c02d0db4381ebac0000000000000000000000006b83c6a03d99ffadf2416767d64cc959f1b2e2f5000000000000000000000000b0f37b1878fd6a3006467d9cacc8cdef082e11f8000000000000000000000000000000000000000000000000000000005a846b10
Deployed Bytecode
0x6060604052600436106101df5763ffffffff60e060020a6000350416630952c504811461023157806310ae4a7314610250578063158ef93e1461027857806317f5de951461029f5780631bb534ba146102c45780633197cbb6146102f3578063341c33041461030657806349432923146103195780634bb278f314610338578063518ab2a81461034b57806355b1182c1461035e5780635a592380146103715780635b3b20e1146103ba5780635b7f415c146103cd57806364329400146103e057806365b9e37d146103f65780636d79207c14610409578063751ecea01461041c57806376e532211461042f57806378e979251461044e57806379ba5097146104615780637eddea211461047457806381030e35146104875780638129fc1c1461049a57806383d880d0146104ad5780638da5cb5b146104cf57806390604005146104e2578063aeb47e2a146104f5578063b3b4ec5414610508578063b91038c71461051b578063baa835681461052f578063c28f9df11461054e578063cfabe67b1461056d578063d091b55014610580578063dc39d06d14610593578063e5514c9d146105b5578063ea02db0f146105c8578063ed3788c9146105db578063f47c84c5146105ee578063fae95a7114610601578063fdf97cb214610620575b600a546b01d3efeabe3216ca7036b2e4901015806101fe575060085442105b8061020b57506009544210155b1561021557600080fd5b60105460ff16151561022657600080fd5b61022f33610633565b005b341561023c57600080fd5b61022f600160a060020a0360043516610857565b341561025b57600080fd5b61022f600160a060020a036004351660243560ff604435166108ea565b341561028357600080fd5b61028b610b13565b604051901515815260200160405180910390f35b34156102aa57600080fd5b6102b2610b1c565b60405190815260200160405180910390f35b34156102cf57600080fd5b6102d7610b2c565b604051600160a060020a03909116815260200160405180910390f35b34156102fe57600080fd5b6102b2610b3b565b341561031157600080fd5b6102b2610b41565b341561032457600080fd5b6102b2600160a060020a0360043516610b47565b341561034357600080fd5b61022f610b59565b341561035657600080fd5b6102b2610d08565b341561036957600080fd5b6102d7610d0e565b341561037c57600080fd5b610387600435610d1d565b6040519485526020850193909352604080850192909252606084015260ff909116608083015260a0909101905180910390f35b34156103c557600080fd5b6102b2610d5f565b34156103d857600080fd5b6102b2610d65565b34156103eb57600080fd5b61022f600435610d71565b341561040157600080fd5b6102b2610daf565b341561041457600080fd5b6102b2610db5565b341561042757600080fd5b6102b2610dbc565b341561043a57600080fd5b6102b2600160a060020a0360043516610dcc565b341561045957600080fd5b6102b2610dde565b341561046c57600080fd5b61022f610de4565b341561047f57600080fd5b6102b2610e71565b341561049257600080fd5b6102b2610e80565b34156104a557600080fd5b61022f610e8f565b34156104b857600080fd5b61022f6024600480358281019291013590356112b6565b34156104da57600080fd5b6102d7611331565b34156104ed57600080fd5b6102d7611340565b341561050057600080fd5b6102b261134f565b341561051357600080fd5b61022f61135f565b61022f600160a060020a0360043516610633565b341561053a57600080fd5b61022f600160a060020a03600435166113cf565b341561055957600080fd5b61022f600160a060020a036004351661144b565b341561057857600080fd5b61022f6114b6565b341561058b57600080fd5b6102d7611510565b341561059e57600080fd5b61028b600160a060020a036004351660243561151f565b34156105c057600080fd5b6102b26115c4565b34156105d357600080fd5b6102d76115d3565b34156105e657600080fd5b6102d76115e2565b34156105f957600080fd5b6102b26115f1565b341561060c57600080fd5b6102b2600160a060020a0360043516611601565b341561062b57600080fd5b6102d7611613565b6000806000806000806000806a21aad7b717d3774336b2e4670de0b6b3a7640000631f4add400201600a5410158061066c575060085442105b8061067957506009544210155b1561068357600080fd5b60105460ff16151561069457600080fd5b600160a060020a03891615156106a957600080fd5b600160a060020a0389166000908152600c6020908152604080832054600e90925290912054600f549199506106dd91611622565b96506106f8346106f3898b63ffffffff61163a16565b611622565b95506000861161070757600080fd5b600a54610727906b01d3efeabe3216ca7036b2e49063ffffffff61163a16565b945061073b8561219863ffffffff61164f16565b93506107478685611622565b9250610759888463ffffffff61166616565b600160a060020a03808b166000908152600c60205260409081902092909255600454169084156108fc0290859051600060405180830381858888f1935050505015156107a457600080fd5b6107b68361219863ffffffff61167816565b91506121986107cb868463ffffffff61163a16565b10156107d5578491505b600a546107e8908363ffffffff61166616565b600a556107f5898361169f565b151561080057600080fd5b610810348463ffffffff61163a16565b9050600081111561084c57600160a060020a03331681156108fc0282604051600060405180830381858888f19350505050151561084c57600080fd5b505050505050505050565b60005433600160a060020a0390811691161461087257600080fd5b600160a060020a038116151561088757600080fd5b6001805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a0383811691909117918290559081169033167f13a4b3bc0d5234dd3d87c9f1557d8faefa37986da62c36ba49309e2fb2c9aec460405160405180910390a350565b6108f2611963565b60008054819081908190819033600160a060020a0390811691161461091657600080fd5b600854421061092457600080fd5b60105460ff16151561093557600080fd5b600160a060020a038916151561094a57600080fd5b60115460ff88161061095b57600080fd5b6011805460ff891690811061096c57fe5b906000526020600020906005020160a0604051908101604090815282548252600183015460208301526002830154908201526003820154606082015260049091015460ff16608082019081529096506109f0906064906109e4906109d59083905160ff16611666565b6121989063ffffffff61167816565b9063ffffffff61164f16565b600b54909550610a12906afacd613aa4f520d9b6b2e49063ffffffff61163a16565b9350610a24848663ffffffff61164f16565b9250610a308884611622565b915060008211610a3f57600080fd5b600160a060020a0333166000908152600d6020526040902054610a68908363ffffffff61166616565b600160a060020a0333166000908152600d6020526040902055610a91828663ffffffff61167816565b600b54909150610aa7908263ffffffff61166616565b600b55600a54610abd908263ffffffff61166616565b600a5561084c8982610ad989516008549063ffffffff61166616565b610af08a602001516008549063ffffffff61166616565b610b078b604001516008549063ffffffff61166616565b8b606001516000611765565b60105460ff1681565b6b01d3efeabe3216ca7036b2e481565b600454600160a060020a031681565b60095481565b600b5481565b600c6020526000908152604090205481565b600a5460009081906b01d3efeabe3216ca7036b2e490101580610b7e57506009544210155b1515610b8957600080fd5b60005433600160a060020a03908116911614610ba457600080fd5b60105460ff161515610bb557600080fd5b600254600160a060020a0316632121dc756000604051602001526040518163ffffffff1660e060020a028152600401602060405180830381600087803b1515610bfd57600080fd5b6102c65a03f11515610c0e57600080fd5b5050506040518051905015610c2257600080fd5b600a54610c42906b01d3efeabe3216ca7036b2e49063ffffffff61163a16565b9150610c606b0167d2d5406637c8930000008363ffffffff61166616565b600654600854919250610cb191600160a060020a03909116908390610c8f816305a39a8063ffffffff61166616565b600854610ca6906305a39a8063ffffffff61166616565b620151806000611765565b600254600160a060020a0316635348ac956040518163ffffffff1660e060020a028152600401600060405180830381600087803b1515610cf057600080fd5b6102c65a03f11515610d0157600080fd5b5050505050565b600a5481565b600754600160a060020a031681565b6011805482908110610d2b57fe5b6000918252602090912060059091020180546001820154600283015460038401546004909401549294509092909160ff1685565b61219881565b670de0b6b3a764000081565b60005433600160a060020a03908116911614610d8c57600080fd5b60105460ff161515610d9d57600080fd5b60008111610daa57600080fd5b600f55565b600f5481565b6205460081565b6b0167d2d5406637c89300000081565b600e6020526000908152604090205481565b60085481565b60015460009033600160a060020a03908116911614610e0257600080fd5b50600080546001805473ffffffffffffffffffffffffffffffffffffffff19808416600160a060020a03838116919091179586905591169091559081169116817f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a350565b6a4a723dc6b40b8a9a00000081565b6a21aad7b717d3774336b2e481565b6000805433600160a060020a03908116911614610eab57600080fd5b60105460ff1615610ebb57600080fd5b506010805460ff1916600190811790915560118054622819a0928101610ee18382611996565b9160005260206000209060050201600060a06040519081016040908152600080835260208301819052600191830182905260608301919091526080820152919050815181556020820151816001015560408201518160020155606082015181600301556080820151600491909101805460ff191660ff90921691909117905550506011805460018101610f748382611996565b9160005260206000209060050201600060a060405190810160409081526000808352602083015260068602908201526060810185905260046080820152919050815181556020820151816001015560408201518160020155606082015181600301556080820151600491909101805460ff191660ff909216919091179055505060118054600181016110068382611996565b9160005260206000209060050201600060a06040519081016040908152600080835260208301526301e133809082015260608101859052600c6080820152919050815181556020820151816001015560408201518160020155606082015181600301556080820151600491909101805460ff191660ff909216919091179055505060118054600181016110998382611996565b9160005260206000209060050201600060a06040519081016040908152600080835260208301526303c267009082015260608101859052601a6080820152919050815181556020820151816001015560408201518160020155606082015181600301556080820151600491909101805460ff191660ff9092169190911790555050601180546001810161112c8382611996565b9160005260206000209060050201600060a06040519081016040908152600080835260208301526305a39a80908201526060810185905260236080820152919050815181556020820151816001015560408201518160020155606082015181600301556080820151600491909101805460ff191660ff909216919091179055506b04fa7032a6d093d29f36b2e490506111c36119c2565b908152602001604051809103906000f08015156111df57600080fd5b6002805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a039283161790819055166112136119d2565b600160a060020a039091168152602001604051809103906000f080151561123957600080fd5b6003805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a0392831617905560055461127c91166b01743b34e18439b50200000061169f565b151561128757600080fd5b6007546112a890600160a060020a03166a4a723dc6b40b8a9a00000061169f565b15156112b357600080fd5b50565b6000805433600160a060020a039081169116146112d257600080fd5b60105460ff1615156112e357600080fd5b5060005b8281101561132b5781600e600086868581811061130057fe5b60209081029290920135600160a060020a0316835250810191909152604001600020556001016112e7565b50505050565b600054600160a060020a031681565b600254600160a060020a031681565b6b01743b34e18439b50200000081565b60005433600160a060020a0390811691161461137a57600080fd5b600254600160a060020a03166379ba50976040518163ffffffff1660e060020a028152600401600060405180830381600087803b15156113b957600080fd5b6102c65a03f115156113ca57600080fd5b505050565b60005433600160a060020a039081169116146113ea57600080fd5b600254600160a060020a0316630952c5048260405160e060020a63ffffffff8416028152600160a060020a039091166004820152602401600060405180830381600087803b151561143a57600080fd5b6102c65a03f1151561132b57600080fd5b60005433600160a060020a0390811691161461146657600080fd5b600354600160a060020a0316630952c5048260405160e060020a63ffffffff8416028152600160a060020a039091166004820152602401600060405180830381600087803b151561143a57600080fd5b60005433600160a060020a039081169116146114d157600080fd5b600354600160a060020a03166379ba50976040518163ffffffff1660e060020a028152600401600060405180830381600087803b15156113b957600080fd5b600154600160a060020a031681565b6000805433600160a060020a0390811691161461153b57600080fd5b60008054600160a060020a038086169263a9059cbb929091169085906040516020015260405160e060020a63ffffffff8516028152600160a060020a0390921660048301526024820152604401602060405180830381600087803b15156115a157600080fd5b6102c65a03f115156115b257600080fd5b50505060405180519150505b92915050565b6afacd613aa4f520d9b6b2e481565b600554600160a060020a031681565b600654600160a060020a031681565b6b04fa7032a6d093d29f36b2e481565b600d6020526000908152604090205481565b600354600160a060020a031681565b60008183106116315781611633565b825b9392505050565b60008282111561164957600080fd5b50900390565b600080828481151561165d57fe5b04949350505050565b60008282018381101561163357600080fd5b6000828202831580611694575082848281151561169157fe5b04145b151561163357600080fd5b600254600090600160a060020a031663a9059cbb8484846040516020015260405160e060020a63ffffffff8516028152600160a060020a0390921660048301526024820152604401602060405180830381600087803b151561170057600080fd5b6102c65a03f1151561171157600080fd5b505050604051805191505080156115be5782600160a060020a03167f21d739f160a7464fddaac4a1d1517d84e76b75618a053943b345c408c4160fe08360405190815260200160405180910390a292915050565b60008060006117726119e2565b7f5ee7e96d00000000000000000000000000000000000000000000000000000000935060c0925060c49150816040518059106117ab5750595b818152601f19601f8301168101602001604052905090508360208201528a60248201528860448201528760648201528660848201528560a48201528460c482015261180c600360009054906101000a9004600160a060020a03168b83611824565b151561181757600080fd5b5050505050505050505050565b600254600090600160a060020a0316634000aea085858585604051602001526040518463ffffffff1660e060020a0281526004018084600160a060020a0316600160a060020a0316815260200183815260200180602001828103825283818151815260200191508051906020019080838360005b838110156118b0578082015183820152602001611898565b50505050905090810190601f1680156118dd5780820380516001836020036101000a031916815260200191505b50945050505050602060405180830381600087803b15156118fd57600080fd5b6102c65a03f1151561190e57600080fd5b505050604051805191505080156116335783600160a060020a03167f21d739f160a7464fddaac4a1d1517d84e76b75618a053943b345c408c4160fe08460405190815260200160405180910390a29392505050565b60a06040519081016040528060008152602001600081526020016000815260200160008152602001600060ff1681525090565b8154818355818115116113ca576005028160050283600052602060002091820191016113ca91906119f4565b604051610d6180611a3683390190565b6040516115e38061279783390190565b60206040519081016040526000815290565b611a3291905b80821115611a2e5760008082556001820181905560028201819055600382015560048101805460ff191690556005016119fa565b5090565b90560060606040526005805460a060020a60ff0219169055341561001f57600080fd5b604051602080610d618339810160405280805160048054600160a060020a033316600160a060020a0319909116811790915560018290556000908152600360205260409020555050610ceb806100766000396000f3006060604052600436106100d75763ffffffff60e060020a60003504166306fdde0381146100dc5780630952c50414610166578063095ea7b31461018757806318160ddd146101bd5780632121dc75146101e257806323b872dd146101f5578063313ce5671461021d5780634000aea0146102465780635348ac95146102ab57806370a08231146102be57806379ba5097146102dd5780638da5cb5b146102f057806395d89b411461031f578063a9059cbb14610332578063d091b55014610354578063dc39d06d14610367578063dd62ed3e14610389575b600080fd5b34156100e757600080fd5b6100ef6103ae565b60405160208082528190810183818151815260200191508051906020019080838360005b8381101561012b578082015183820152602001610113565b50505050905090810190601f1680156101585780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b341561017157600080fd5b610185600160a060020a03600435166103e5565b005b341561019257600080fd5b6101a9600160a060020a0360043516602435610478565b604051901515815260200160405180910390f35b34156101c857600080fd5b6101d06104bd565b60405190815260200160405180910390f35b34156101ed57600080fd5b6101a96104c3565b341561020057600080fd5b6101a9600160a060020a03600435811690602435166044356104d3565b341561022857600080fd5b61023061051a565b60405160ff909116815260200160405180910390f35b341561025157600080fd5b6101a960048035600160a060020a03169060248035919060649060443590810190830135806020601f8201819004810201604051908101604052818152929190602084018383808284375094965061051f95505050505050565b34156102b657600080fd5b61018561055e565b34156102c957600080fd5b6101d0600160a060020a03600435166105e3565b34156102e857600080fd5b6101856105fe565b34156102fb57600080fd5b61030361068b565b604051600160a060020a03909116815260200160405180910390f35b341561032a57600080fd5b6100ef61069a565b341561033d57600080fd5b6101a9600160a060020a03600435166024356106d1565b341561035f57600080fd5b61030361070f565b341561037257600080fd5b6101a9600160a060020a036004351660243561071e565b341561039457600080fd5b6101d0600160a060020a03600435811690602435166107c0565b60408051908101604052601281527f436f6c75204c6f63616c204e6574776f726b0000000000000000000000000000602082015281565b60045433600160a060020a0390811691161461040057600080fd5b600160a060020a038116151561041557600080fd5b6005805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a0383811691909117918290559081169033167f13a4b3bc0d5234dd3d87c9f1557d8faefa37986da62c36ba49309e2fb2c9aec460405160405180910390a350565b60045460009033600160a060020a03908116911614806104a1575060055460a060020a900460ff165b15156104ac57600080fd5b6104b683836107eb565b9392505050565b60015481565b60055460a060020a900460ff1681565b60045460009033600160a060020a03908116911614806104fc575060055460a060020a900460ff165b151561050757600080fd5b610512848484610893565b949350505050565b601281565b60045460009033600160a060020a0390811691161480610548575060055460a060020a900460ff165b151561055357600080fd5b6105128484846109bd565b60045433600160a060020a0390811691161461057957600080fd5b60055460a060020a900460ff1615610590576105e1565b6005805474ff0000000000000000000000000000000000000000191660a060020a1790557fa693ca1b20114bcad5861562c3007eb477c4926f79219f624bdbfde146fd2b6460405160405180910390a15b565b600160a060020a031660009081526003602052604090205490565b60055460009033600160a060020a0390811691161461061c57600080fd5b50600480546005805473ffffffffffffffffffffffffffffffffffffffff19808416600160a060020a03838116919091179586905591169091559081169116817f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a350565b600454600160a060020a031681565b60408051908101604052600381527f434c4e0000000000000000000000000000000000000000000000000000000000602082015281565b60045460009033600160a060020a03908116911614806106fa575060055460a060020a900460ff165b151561070557600080fd5b6104b68383610ab2565b600554600160a060020a031681565b60045460009033600160a060020a0390811691161461073c57600080fd5b600454600160a060020a038085169163a9059cbb91168460006040516020015260405160e060020a63ffffffff8516028152600160a060020a0390921660048301526024820152604401602060405180830381600087803b151561079f57600080fd5b6102c65a03f115156107b057600080fd5b5050506040518051949350505050565b600160a060020a03918216600090815260026020908152604080832093909416825291909152205490565b600081158015906108205750600160a060020a0333811660009081526002602090815260408083209387168352929052205415155b1561082a57600080fd5b600160a060020a03338116600081815260026020908152604080832094881680845294909152908190208590557f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9259085905190815260200160405180910390a350600192915050565b600080600160a060020a03841615156108ab57600080fd5b50600160a060020a038085166000818152600260209081526040808320339095168352938152838220549282526003905291909120546108f1908463ffffffff610b8816565b600160a060020a038087166000908152600360205260408082209390935590861681522054610926908463ffffffff610b9d16565b600160a060020a03851660009081526003602052604090205561094f818463ffffffff610b8816565b600160a060020a03808716600081815260026020908152604080832033861684529091529081902093909355908616917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9086905190815260200160405180910390a3506001949350505050565b60006109c98484610ab2565b15156109d457600080fd5b83600160a060020a031633600160a060020a03167fce8124fd2ae9fd7904103e5a9ebe88b527b9ca0e32a32fd497845c82706542d3858560405182815260406020820181815290820183818151815260200191508051906020019080838360005b83811015610a4d578082015183820152602001610a35565b50505050905090810190601f168015610a7a5780820380516001836020036101000a031916815260200191505b50935050505060405180910390a3610a9184610baf565b15610aa857610aa1848484610bb7565b90506104b6565b5060019392505050565b6000600160a060020a0383161515610ac957600080fd5b600160a060020a033316600090815260036020526040902054610af2908363ffffffff610b8816565b600160a060020a033381166000908152600360205260408082209390935590851681522054610b27908363ffffffff610b9d16565b600160a060020a0380851660008181526003602052604090819020939093559133909116907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9085905190815260200160405180910390a350600192915050565b600082821115610b9757600080fd5b50900390565b6000828201838110156104b657600080fd5b6000903b1190565b600083600160a060020a03811663c0ee0b8a33868686604051602001526040518463ffffffff1660e060020a0281526004018084600160a060020a0316600160a060020a0316815260200183815260200180602001828103825283818151815260200191508051906020019080838360005b83811015610c41578082015183820152602001610c29565b50505050905090810190601f168015610c6e5780820380516001836020036101000a031916815260200191505b50945050505050602060405180830381600087803b1515610c8e57600080fd5b6102c65a03f11515610c9f57600080fd5b505050604051805190501515610cb457600080fd5b5060019493505050505600a165627a7a723058205ad7a6a2d562512bf45fa613c725473ae4db5a17be681123885fd9935ff3546f00296060604052341561000f57600080fd5b6040516020806115e38339810160405280805160038054600160a060020a033381166101000261010060a860020a03199092169190911790915590925082161515905061005b57600080fd5b60058054600160a060020a031916600160a060020a03929092169190911790556115598061008a6000396000f3006060604052600436106100d75763ffffffff60e060020a600035041663061f765081146100dc5780630952c5041461010f5780631a64adae146101305780631e075aba146101645780635ee7e96d146101825780636bfa379e146101b257806374a8f103146101d157806379ba5097146101f05780637c17357d1461020357806383fcf973146102165780638da5cb5b146102295780639060400514610258578063957924301461026b578063a1db97821461029e578063b869cea3146102c0578063c0ee0b8a1461031d578063d091b5501461034c575b600080fd5b34156100e757600080fd5b6100fb600160a060020a036004351661035f565b604051901515815260200160405180910390f35b341561011a57600080fd5b61012e600160a060020a0360043516610373565b005b341561013b57600080fd5b610152600160a060020a036004351660243561040b565b60405190815260200160405180910390f35b341561016f57600080fd5b6100fb60048035602481019101356104a8565b341561018d57600080fd5b61012e600160a060020a036004351660243560443560643560843560a4351515610510565b34156101bd57600080fd5b610152600160a060020a0360043516610782565b34156101dc57600080fd5b61012e600160a060020a0360043516610845565b34156101fb57600080fd5b61012e610b52565b341561020e57600080fd5b610152610c00565b341561022157600080fd5b610152610c06565b341561023457600080fd5b61023c610c16565b604051600160a060020a03909116815260200160405180910390f35b341561026357600080fd5b61023c610c2a565b341561027657600080fd5b61012e600160a060020a036004351660243560443560643560843560a43560c4351515610c39565b34156102a957600080fd5b6100fb600160a060020a0360043516602435610e91565b34156102cb57600080fd5b6102df600160a060020a0360043516610fee565b60405196875260208701959095526040808701949094526060860192909252608085015260a084015290151560c083015260e0909101905180910390f35b341561032857600080fd5b6100fb60048035600160a060020a031690602480359160443591820191013561102f565b341561035757600080fd5b61023c611147565b600554600160a060020a0391821691161490565b60035433600160a060020a03908116610100909204161461039357600080fd5b600160a060020a03811615156103a857600080fd5b6004805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a0383811691909117918290559081169033167f13a4b3bc0d5234dd3d87c9f1557d8faefa37986da62c36ba49309e2fb2c9aec460405160405180910390a350565b60006104156114ed565b600160a060020a038416600090815260066020526040908190209060e09051908101604090815282548252600183015460208301526002830154908201526003820154606082015260048201546080820152600582015460a082015260069091015460ff16151560c082015290508051151561049457600091506104a1565b61049e8184611156565b91505b5092915050565b600354600090819033600160a060020a0390811661010090920416146104cd57600080fd5b5060005b82811015610506576104fd8484838181106104e857fe5b90506020020135600160a060020a03166111ff565b506001016104d1565b5060019392505050565b6003546001546000916101009004600160a060020a0390811691161461053557600080fd5b60035460ff16151561054657600080fd5b600160a060020a038716151561055b57600080fd5b30600160a060020a031687600160a060020a03161415151561057c57600080fd5b506002546000811161058d57600080fd5b600160a060020a038716600090815260066020526040902054156105b057600080fd5b8486111580156105c05750838511155b15156105cb57600080fd5b6000831180156105ea57506105e6848763ffffffff61148116565b8311155b15156105f557600080fd5b600554600160a060020a03166370a082313060006040516020015260405160e060020a63ffffffff8416028152600160a060020a039091166004820152602401602060405180830381600087803b151561064e57600080fd5b6102c65a03f1151561065f57600080fd5b505050604051805160075490915061067d908363ffffffff61149616565b111561068857600080fd5b60e0604051908101604090815282825260208083018990528183018890526060830187905260808301869052600060a0840181905285151560c0850152600160a060020a038b168152600690915220815181556020820151816001015560408201518160020155606082015181600301556080820151816004015560a0820151816005015560c0820151600691909101805460ff1916911515919091179055506007546107359082611496565b600755600160a060020a038088169033167ffabf00c3717e5e33d6fcc433d4d70ef919a4101fb7d5c444fe349927034eaa458360405190815260200160405180910390a350505050505050565b600061078c6114ed565b600160a060020a0383166000908152600660205260408082209060e09051908101604090815282548252600183015460208301526002830154908201526003820154606082015260048201546080820152600582015460a082015260069091015460ff16151560c082015291508151151561080a576000925061083e565b6108148242611156565b9050801515610826576000925061083e565b61083b8260a00151829063ffffffff61148116565b92505b5050919050565b61084d6114ed565b6003546000908190819033600160a060020a03908116610100909204161461087457600080fd5b600160a060020a038516600090815260066020526040908190209060e09051908101604090815282548252600183015460208301526002830154908201526003820154606082015260048201546080820152600582015460a082015260069091015460ff16151560c082019081529094505115156108f157600080fd5b6108fb8442611156565b92506109128460a00151849063ffffffff61148116565b91506000821115610a1057610932828560a001519063ffffffff61149616565b60a085015260075461094a908363ffffffff61148116565b600755600554600160a060020a031663a9059cbb868460006040516020015260405160e060020a63ffffffff8516028152600160a060020a0390921660048301526024820152604401602060405180830381600087803b15156109ac57600080fd5b6102c65a03f115156109bd57600080fd5b5050506040518051905015156109d257600080fd5b84600160a060020a03167fe7b379c6c1fa169e9079c25e9143b127637eef8ec8c9d5c06ddb4ab3e11958888360405190815260200160405180910390a25b610a268460a0015185519063ffffffff61148116565b600160a060020a0386166000908152600660208190526040822082815560018101839055600281018390556003810183905560048101839055600581019290925501805460ff19169055600754909150610a86908263ffffffff61148116565b600755600554600160a060020a031663a9059cbb338360006040516020015260405160e060020a63ffffffff8516028152600160a060020a0390921660048301526024820152604401602060405180830381600087803b1515610ae857600080fd5b6102c65a03f11515610af957600080fd5b505050604051805190501515610b0e57600080fd5b84600160a060020a03167f740528a7c317c81f0923adc30df75db3f448298c78cdaf548adfcfdb3c84ff6f8260405190815260200160405180910390a25050505050565b60045460009033600160a060020a03908116911614610b7057600080fd5b506003805460048054600160a060020a0381811661010090810274ffffffffffffffffffffffffffffffffffffffff00198616179586905573ffffffffffffffffffffffffffffffffffffffff19909216909255918290048116929190910416817f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a350565b60075481565b6000610c11336111ff565b905090565b6003546101009004600160a060020a031681565b600554600160a060020a031681565b60035433600160a060020a039081166101009092041614610c5957600080fd5b600160a060020a0387161515610c6e57600080fd5b30600160a060020a031687600160a060020a031614151515610c8f57600080fd5b60008611610c9c57600080fd5b600160a060020a03871660009081526006602052604090205415610cbf57600080fd5b838511158015610ccf5750828411155b1515610cda57600080fd5b600082118015610cf95750610cf5838663ffffffff61148116565b8211155b1515610d0457600080fd5b600554600160a060020a03166370a082313060006040516020015260405160e060020a63ffffffff8416028152600160a060020a039091166004820152602401602060405180830381600087803b1515610d5d57600080fd5b6102c65a03f11515610d6e57600080fd5b5050506040518051600754909150610d8c908863ffffffff61149616565b1115610d9757600080fd5b60e0604051908101604090815287825260208083018890528183018790526060830186905260808301859052600060a0840181905284151560c0850152600160a060020a038b168152600690915220815181556020820151816001015560408201518160020155606082015181600301556080820151816004015560a0820151816005015560c0820151600691909101805460ff191691151591909117905550600754610e449087611496565b600755600160a060020a038088169033167ffabf00c3717e5e33d6fcc433d4d70ef919a4101fb7d5c444fe349927034eaa458860405190815260200160405180910390a350505050505050565b600354600090819033600160a060020a039081166101009092041614610eb657600080fd5b600554600160a060020a0385811691161415610f6357600754600554610f549190600160a060020a03166370a082313060006040516020015260405160e060020a63ffffffff8416028152600160a060020a039091166004820152602401602060405180830381600087803b1515610f2d57600080fd5b6102c65a03f11515610f3e57600080fd5b505050604051805191905063ffffffff61148116565b905080831115610f6357600080fd5b600354600160a060020a038086169163a9059cbb91610100909104168560006040516020015260405160e060020a63ffffffff8516028152600160a060020a0390921660048301526024820152604401602060405180830381600087803b1515610fcc57600080fd5b6102c65a03f11515610fdd57600080fd5b505050604051805195945050505050565b600660208190526000918252604090912080546001820154600283015460038401546004850154600586015495909601549395929491939092919060ff1687565b600061103a3361035f565b15156110485750600061113f565b60606040519081016040908152600160a060020a03338116835287166020830152810185905260008151815473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a0391909116178155602082015160018201805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a03929092169190911790556040820151600290910155506003805460ff19166001179055600160a060020a0330168383604051808383808284378201915050925050506000604051808303818561646e5a03f4915050151561113157506003805460ff19169055600061113f565b506003805460ff1916905560015b949350505050565b600454600160a060020a031681565b6000806000846040015184101561117057600092506111f7565b8460600151841061118457845192506111f7565b6111ad85608001516111a18760200151879063ffffffff61148116565b9063ffffffff6114af16565b91506111c8856020015186606001519063ffffffff61148116565b90506111f4816111a16111e68860800151869063ffffffff6114c616565b88519063ffffffff6114c616565b92505b505092915050565b600160a060020a0381166000908152600660205260408120805482908190151561126c5784600160a060020a03167f9cf38cf2dbf9139f5c32639950507b10775fbbe0421f3e168bc2d1bb1ae3208c61271160405190815260200160405180910390a26127119350611479565b6112c88360e0604051908101604090815282548252600183015460208301526002830154908201526003820154606082015260048201546080820152600582015460a082015260069091015460ff16151560c082015242611156565b915081151561131a5784600160a060020a03167f9cf38cf2dbf9139f5c32639950507b10775fbbe0421f3e168bc2d1bb1ae3208c61271260405190815260200160405180910390a26127129350611479565b600583015461133090839063ffffffff61148116565b90508015156113825784600160a060020a03167f9cf38cf2dbf9139f5c32639950507b10775fbbe0421f3e168bc2d1bb1ae3208c61271360405190815260200160405180910390a26127139350611479565b6005830154611397908263ffffffff61149616565b60058401556007546113af908263ffffffff61148116565b600755600554600160a060020a031663a9059cbb868360006040516020015260405160e060020a63ffffffff8516028152600160a060020a0390921660048301526024820152604401602060405180830381600087803b151561141157600080fd5b6102c65a03f1151561142257600080fd5b50505060405180519050151561143757600080fd5b84600160a060020a03167fe7b379c6c1fa169e9079c25e9143b127637eef8ec8c9d5c06ddb4ab3e11958888260405190815260200160405180910390a2600193505b505050919050565b60008282111561149057600080fd5b50900390565b6000828201838110156114a857600080fd5b9392505050565b60008082848115156114bd57fe5b04949350505050565b60008282028315806114e257508284828115156114df57fe5b04145b15156114a857600080fd5b60e06040519081016040528060008152602001600081526020016000815260200160008152602001600081526020016000815260200160001515815250905600a165627a7a7230582023e279ba6dd17c7f0a8770f361cf7543be16a96d1d1db31ee899c3caf7ddfa8d0029a165627a7a72305820f0b0180cdeeba8e04242bf01de41a0a5ec21d89f2549775ddf4e6ca8672e806e0029
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
000000000000000000000000a76e676c9cdc7aa2ab12b3ec4dd4c2be9a6774aa00000000000000000000000034df02e145f0a6b5df675e9dfab54ae745e6c4ff000000000000000000000000254158138007803eebc95d082c02d0db4381ebac0000000000000000000000006b83c6a03d99ffadf2416767d64cc959f1b2e2f5000000000000000000000000b0f37b1878fd6a3006467d9cacc8cdef082e11f8000000000000000000000000000000000000000000000000000000005a846b10
-----Decoded View---------------
Arg [0] : _owner (address): 0xA76e676C9CdC7AA2ab12B3eC4Dd4c2BE9a6774AA
Arg [1] : _fundingRecipient (address): 0x34Df02E145F0A6B5dF675e9dFaB54aE745E6c4FF
Arg [2] : _communityPoolAddress (address): 0x254158138007803EEbc95d082c02D0dB4381EBac
Arg [3] : _futureDevelopmentPoolAddress (address): 0x6b83C6a03d99FfAdf2416767D64CC959F1B2E2F5
Arg [4] : _stakeholdersPoolAddress (address): 0xB0f37b1878FD6A3006467D9cACC8CdEF082e11F8
Arg [5] : _startTime (uint256): 1518627600
-----Encoded View---------------
6 Constructor Arguments found :
Arg [0] : 000000000000000000000000a76e676c9cdc7aa2ab12b3ec4dd4c2be9a6774aa
Arg [1] : 00000000000000000000000034df02e145f0a6b5df675e9dfab54ae745e6c4ff
Arg [2] : 000000000000000000000000254158138007803eebc95d082c02d0db4381ebac
Arg [3] : 0000000000000000000000006b83c6a03d99ffadf2416767d64cc959f1b2e2f5
Arg [4] : 000000000000000000000000b0f37b1878fd6a3006467d9cacc8cdef082e11f8
Arg [5] : 000000000000000000000000000000000000000000000000000000005a846b10
Swarm Source
bzzr://f0b0180cdeeba8e04242bf01de41a0a5ec21d89f2549775ddf4e6ca8672e806e
Loading...
Loading
Loading...
Loading
OVERVIEW
The deployer address for Cln.network's contract.Multichain Portfolio | 30 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
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.