ETH Price: $3,384.17 (+3.41%)
 

Overview

ETH Balance

0 ETH

Eth Value

$0.00

Multichain Info

No addresses found
Transaction Hash
Method
Block
From
To
Mass Transfer60098022018-07-22 12:15:412385 days ago1532261741IN
0x8f5175Be...A8c3F2ae5
0 ETH0.001226042
Mass Transfer60097982018-07-22 12:15:052385 days ago1532261705IN
0x8f5175Be...A8c3F2ae5
0 ETH0.013019982
Mass Transfer60097522018-07-22 12:04:362385 days ago1532261076IN
0x8f5175Be...A8c3F2ae5
0 ETH0.012773162
Mass Transfer60097302018-07-22 12:00:022385 days ago1532260802IN
0x8f5175Be...A8c3F2ae5
0 ETH0.013015622
Mass Transfer60096892018-07-22 11:50:372385 days ago1532260237IN
0x8f5175Be...A8c3F2ae5
0 ETH0.012530062
Mass Transfer60096792018-07-22 11:48:202385 days ago1532260100IN
0x8f5175Be...A8c3F2ae5
0 ETH0.012895162
Mass Transfer60096702018-07-22 11:46:302385 days ago1532259990IN
0x8f5175Be...A8c3F2ae5
0 ETH0.012893882
Mass Transfer60096622018-07-22 11:45:142385 days ago1532259914IN
0x8f5175Be...A8c3F2ae5
0 ETH0.013016142
Mass Transfer60096432018-07-22 11:40:412385 days ago1532259641IN
0x8f5175Be...A8c3F2ae5
0 ETH0.012893372
Mass Transfer60096202018-07-22 11:36:042385 days ago1532259364IN
0x8f5175Be...A8c3F2ae5
0 ETH0.013015112
Mass Transfer60095752018-07-22 11:26:392385 days ago1532258799IN
0x8f5175Be...A8c3F2ae5
0 ETH0.013015882
Mass Transfer60094532018-07-22 10:57:222385 days ago1532257042IN
0x8f5175Be...A8c3F2ae5
0 ETH0.012650912
Mass Transfer60094412018-07-22 10:55:232385 days ago1532256923IN
0x8f5175Be...A8c3F2ae5
0 ETH0.013014092
Mass Transfer60094192018-07-22 10:49:562385 days ago1532256596IN
0x8f5175Be...A8c3F2ae5
0 ETH0.013014732
Mass Transfer60094002018-07-22 10:44:102385 days ago1532256250IN
0x8f5175Be...A8c3F2ae5
0 ETH0.012893242
Mass Transfer60093942018-07-22 10:42:332385 days ago1532256153IN
0x8f5175Be...A8c3F2ae5
0 ETH0.012894142
Mass Transfer60092512018-07-22 10:06:072385 days ago1532253967IN
0x8f5175Be...A8c3F2ae5
0 ETH0.013015752
Mass Transfer60086242018-07-22 7:24:432385 days ago1532244283IN
0x8f5175Be...A8c3F2ae5
0 ETH0.012772272
Mass Transfer60085892018-07-22 7:14:512385 days ago1532243691IN
0x8f5175Be...A8c3F2ae5
0 ETH0.01301462
Mass Transfer60085192018-07-22 6:58:512385 days ago1532242731IN
0x8f5175Be...A8c3F2ae5
0 ETH0.012893372
Mass Transfer60085122018-07-22 6:57:012385 days ago1532242621IN
0x8f5175Be...A8c3F2ae5
0 ETH0.012651042
Mass Transfer60085002018-07-22 6:54:382385 days ago1532242478IN
0x8f5175Be...A8c3F2ae5
0 ETH0.012773682
Mass Transfer60084452018-07-22 6:41:202385 days ago1532241680IN
0x8f5175Be...A8c3F2ae5
0 ETH0.012893632
Mass Transfer60084072018-07-22 6:31:232385 days ago1532241083IN
0x8f5175Be...A8c3F2ae5
0 ETH0.013013962
Mass Transfer60083732018-07-22 6:20:112385 days ago1532240411IN
0x8f5175Be...A8c3F2ae5
0 ETH0.012772912
View all transactions

View more zero value Internal Transactions in Advanced View mode

Advanced mode:
Loading...
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
CAVPlatform

Compiler Version
v0.4.19+commit.c4cbbb05

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2018-03-16
*/

pragma solidity ^0.4.11;

// File: contracts/CAVPlatformEmitter.sol

//import '../event/MultiEventsHistoryAdapter.sol';

/// @title CAV Platform Emitter.
///
/// Contains all the original event emitting function definitions and events.
/// In case of new events needed later, additional emitters can be developed.
/// All the functions is meant to be called using delegatecall.
contract CAVPlatformEmitter {
    event Transfer(address indexed from, address indexed to, bytes32 indexed symbol, uint value, string reference);
    event Issue(bytes32 indexed symbol, uint value, address indexed by);
    event Revoke(bytes32 indexed symbol, uint value, address indexed by);
    event OwnershipChange(address indexed from, address indexed to, bytes32 indexed symbol);
    event Approve(address indexed from, address indexed spender, bytes32 indexed symbol, uint value);
    event Recovery(address indexed from, address indexed to, address by);
    event Error(uint errorCode);

    function emitTransfer(address _from, address _to, bytes32 _symbol, uint _value, string _reference) public {
        Transfer(_from, _to, _symbol, _value, _reference);
    }

    function emitIssue(bytes32 _symbol, uint _value, address _by) public {
        Issue(_symbol, _value, _by);
    }

    function emitRevoke(bytes32 _symbol, uint _value, address _by) public {
        Revoke(_symbol, _value, _by);
    }

    function emitOwnershipChange(address _from, address _to, bytes32 _symbol) public {
        OwnershipChange(_from, _to, _symbol);
    }

    function emitApprove(address _from, address _spender, bytes32 _symbol, uint _value) public {
        Approve(_from, _spender, _symbol, _value);
    }

    function emitRecovery(address _from, address _to, address _by) public {
        Recovery(_from, _to, _by);
    }

    function emitError(uint _errorCode) public {
        Error(_errorCode);
    }
}

// File: contracts/ERC20Interface.sol

contract ERC20Interface {
    event Transfer(address indexed from, address indexed to, uint256 value);
    event Approval(address indexed from, address indexed spender, uint256 value);
    string public symbol;

    function decimals() constant returns (uint8);
    function totalSupply() constant returns (uint256 supply);
    function balanceOf(address _owner) constant returns (uint256 balance);
    function transfer(address _to, uint256 _value) returns (bool success);
    function transferFrom(address _from, address _to, uint256 _value) returns (bool success);
    function approve(address _spender, uint256 _value) returns (bool success);
    function allowance(address _owner, address _spender) constant returns (uint256 remaining);
}

// File: contracts/Owned.sol

/**
 * @title Owned contract with safe ownership pass.
 *
 * Note: all the non constant functions return false instead of throwing in case if state change
 * didn't happen yet.
 */
contract Owned {
    /**
     * Contract owner address
     */
    address public contractOwner;

    /**
     * Contract owner address
     */
    address public pendingContractOwner;

    function Owned() {
        contractOwner = msg.sender;
    }

    /**
    * @dev Owner check modifier
    */
    modifier onlyContractOwner() {
        if (contractOwner == msg.sender) {
            _;
        }
    }

    /**
     * @dev Destroy contract and scrub a data
     * @notice Only owner can call it
     */
    function destroy() onlyContractOwner {
        suicide(msg.sender);
    }

    /**
     * Prepares ownership pass.
     *
     * Can only be called by current owner.
     *
     * @param _to address of the next owner. 0x0 is not allowed.
     *
     * @return success.
     */
    function changeContractOwnership(address _to) onlyContractOwner public returns (bool) {
        if (_to == 0x0) {
            return false;
        }

        pendingContractOwner = _to;
        return true;
    }

    /**
     * Finalize ownership pass.
     *
     * Can only be called by pending owner.
     *
     * @return success.
     */
    function claimContractOwnership() public returns (bool) {
        if (pendingContractOwner != msg.sender) {
            return false;
        }

        contractOwner = pendingContractOwner;
        delete pendingContractOwner;

        return true;
    }

    /**
    * @dev Direct ownership pass without change/claim pattern. Can be invoked only by current contract owner
    *
    * @param _to the next contract owner
    *
    * @return `true` if success, `false` otherwise
    */
    function transferContractOwnership(address _to) onlyContractOwner public returns (bool) {
        if (_to == 0x0) {
            return false;
        }

        if (pendingContractOwner != 0x0) {
            pendingContractOwner = 0x0;
        }

        contractOwner = _to;
        return true;
    }
}

// File: contracts/Object.sol

/**
 * @title Generic owned destroyable contract
 */
contract Object is Owned {
    /**
    *  Common result code. Means everything is fine.
    */
    uint constant OK = 1;

    function withdrawnTokens(address[] tokens, address _to) onlyContractOwner returns(uint) {
        for(uint i=0;i<tokens.length;i++) {
            address token = tokens[i];
            uint balance = ERC20Interface(token).balanceOf(this);
            if(balance != 0)
                ERC20Interface(token).transfer(_to,balance);
        }
        return OK;
    }
}

// File: contracts/SafeMath.sol

/**
 * @title SafeMath
 * @dev Math operations with safety checks that throw on error
 */
library SafeMath {
  function mul(uint256 a, uint256 b) internal constant returns (uint256) {
    uint256 c = a * b;
    assert(a == 0 || c / a == b);
    return c;
  }

  function div(uint256 a, uint256 b) internal constant returns (uint256) {
    // assert(b > 0); // Solidity automatically throws when dividing by 0
    uint256 c = a / b;
    // assert(a == b * c + a % b); // There is no case in which this doesn't hold
    return c;
  }

  function sub(uint256 a, uint256 b) internal constant returns (uint256) {
    assert(b <= a);
    return a - b;
  }

  function add(uint256 a, uint256 b) internal constant returns (uint256) {
    uint256 c = a + b;
    assert(c >= a);
    return c;
  }
}

// File: contracts/CAVPlatform.sol

contract ProxyEventsEmitter {
    function emitTransfer(address _from, address _to, uint _value) public;
    function emitApprove(address _from, address _spender, uint _value) public;
}

///  @title CAV Platform.
///
///  The official CAV assets platform powering TIME and LHT tokens, and possibly
///  other unknown tokens needed later.
///  Platform uses MultiEventsHistory contract to keep events, so that in case it needs to be redeployed
///  at some point, all the events keep appearing at the same place.
///
///  Every asset is meant to be used through a proxy contract. Only one proxy contract have access
///  rights for a particular asset.
///
///  Features: transfers, allowances, supply adjustments, lost wallet access recovery.
///
///  Note: all the non constant functions return false instead of throwing in case if state change
/// didn't happen yet.
contract CAVPlatform is Object, CAVPlatformEmitter {
    using SafeMath for uint;

    uint constant CAV_PLATFORM_SCOPE = 15000;
    uint constant CAV_PLATFORM_PROXY_ALREADY_EXISTS = CAV_PLATFORM_SCOPE + 0;
    uint constant CAV_PLATFORM_CANNOT_APPLY_TO_ONESELF = CAV_PLATFORM_SCOPE + 1;
    uint constant CAV_PLATFORM_INVALID_VALUE = CAV_PLATFORM_SCOPE + 2;
    uint constant CAV_PLATFORM_INSUFFICIENT_BALANCE = CAV_PLATFORM_SCOPE + 3;
    uint constant CAV_PLATFORM_NOT_ENOUGH_ALLOWANCE = CAV_PLATFORM_SCOPE + 4;
    uint constant CAV_PLATFORM_ASSET_ALREADY_ISSUED = CAV_PLATFORM_SCOPE + 5;
    uint constant CAV_PLATFORM_CANNOT_ISSUE_FIXED_ASSET_WITH_INVALID_VALUE = CAV_PLATFORM_SCOPE + 6;
    uint constant CAV_PLATFORM_CANNOT_REISSUE_FIXED_ASSET = CAV_PLATFORM_SCOPE + 7;
    uint constant CAV_PLATFORM_SUPPLY_OVERFLOW = CAV_PLATFORM_SCOPE + 8;
    uint constant CAV_PLATFORM_NOT_ENOUGH_TOKENS = CAV_PLATFORM_SCOPE + 9;
    uint constant CAV_PLATFORM_INVALID_NEW_OWNER = CAV_PLATFORM_SCOPE + 10;
    uint constant CAV_PLATFORM_ALREADY_TRUSTED = CAV_PLATFORM_SCOPE + 11;
    uint constant CAV_PLATFORM_SHOULD_RECOVER_TO_NEW_ADDRESS = CAV_PLATFORM_SCOPE + 12;
    uint constant CAV_PLATFORM_ASSET_IS_NOT_ISSUED = CAV_PLATFORM_SCOPE + 13;
    uint constant CAV_PLATFORM_INVALID_INVOCATION = CAV_PLATFORM_SCOPE + 17;

    /// Structure of a particular asset.
    struct Asset {
        uint owner;                       // Asset's owner id.
        uint totalSupply;                 // Asset's total supply.
        string name;                      // Asset's name, for information purposes.
        string description;               // Asset's description, for information purposes.
        bool isReissuable;                // Indicates if asset have dynamic or fixed supply.
        uint8 baseUnit;                   // Proposed number of decimals.
        mapping(uint => Wallet) wallets;  // Holders wallets.
        mapping(uint => bool) partowners; // Part-owners of an asset; have less access rights than owner
    }

    /// Structure of an asset holder wallet for particular asset.
    struct Wallet {
        uint balance;
        mapping(uint => uint) allowance;
    }

    /// Structure of an asset holder.
    struct Holder {
        address addr;                    // Current address of the holder.
        mapping(address => bool) trust;  // Addresses that are trusted with recovery proocedure.
    }

    /// Iterable mapping pattern is used for holders.
    uint public holdersCount;
    mapping(uint => Holder) public holders;

    /// This is an access address mapping. Many addresses may have access to a single holder.
    mapping(address => uint) holderIndex;

    /// List of symbols that exist in a platform
    bytes32[] public symbols;

    /// Asset symbol to asset mapping.
    mapping(bytes32 => Asset) public assets;

    /// Asset symbol to asset proxy mapping.
    mapping(bytes32 => address) public proxies;

    /// Co-owners of a platform. Has less access rights than a root contract owner
    mapping(address => bool) public partowners;

    // Should use interface of the emitter, but address of events history.
    address public eventsHistory;

    /// Emits Error event with specified error message.
    /// Should only be used if no state changes happened.
    /// @param _errorCode code of an error
    function _error(uint _errorCode) internal returns (uint) {
        CAVPlatformEmitter(eventsHistory).emitError(_errorCode);
        return _errorCode;
    }

    /// Emits Error if called not by asset owner.
    modifier onlyOwner(bytes32 _symbol) {
        if (isOwner(msg.sender, _symbol)) {
            _;
        }
    }

    /// @dev UNAUTHORIZED if called not by one of symbol's partowners or owner
    modifier onlyOneOfOwners(bytes32 _symbol) {
        if (hasAssetRights(msg.sender, _symbol)) {
            _;
        }
    }

    /// @dev UNAUTHORIZED if called not by one of partowners or contract's owner
    modifier onlyOneOfContractOwners() {
        if (contractOwner == msg.sender || partowners[msg.sender]) {
            _;
        }
    }

    /// Emits Error if called not by asset proxy.
    modifier onlyProxy(bytes32 _symbol) {
        if (proxies[_symbol] == msg.sender) {
            _;
        }
    }

    /// Emits Error if _from doesn't trust _to.
    modifier checkTrust(address _from, address _to) {
        if (isTrusted(_from, _to)) {
            _;
        }
    }

    /// Adds a co-owner of a contract. Might be more than one co-owner
    /// @dev Allowed to only contract onwer
    /// @param _partowner a co-owner of a contract
    /// @return result code of an operation
    function addPartOwner(address _partowner) onlyContractOwner public returns (uint) {
        partowners[_partowner] = true;
        return OK;
    }

    /// Removes a co-owner of a contract
    /// @dev Should be performed only by root contract owner
    /// @param _partowner a co-owner of a contract
    /// @return result code of an operation
    function removePartOwner(address _partowner) onlyContractOwner public returns (uint) {
        delete partowners[_partowner];
        return OK;
    }

    /// Sets EventsHstory contract address.
    ///
    /// Can be set only by events history admon or owner.
    ///
    /// @param _eventsHistory MultiEventsHistory contract address.
    ///
    /// @return success.
    function setupEventsHistory(address _eventsHistory) onlyContractOwner public returns (uint errorCode) {
        eventsHistory = _eventsHistory;
        return OK;
    }

    /// Provides a cheap way to get number of symbols registered in a platform
    /// @return number of symbols
    function symbolsCount() public view returns (uint) {
        return symbols.length;
    }

    /// Check asset existance.
    ///
    /// @param _symbol asset symbol.
    ///
    /// @return asset existance.
    function isCreated(bytes32 _symbol) public view returns (bool) {
        return assets[_symbol].owner != 0;
    }

    /// Returns asset decimals.
    ///
    /// @param _symbol asset symbol.
    ///
    /// @return asset decimals.
    function baseUnit(bytes32 _symbol) public view returns (uint8) {
        return assets[_symbol].baseUnit;
    }

    /// Returns asset name.
    ///
    /// @param _symbol asset symbol.
    ///
    /// @return asset name.
    function name(bytes32 _symbol) public view returns (string) {
        return assets[_symbol].name;
    }

    /// Returns asset description.
    ///
    /// @param _symbol asset symbol.
    ///
    /// @return asset description.
    function description(bytes32 _symbol) public view returns (string) {
        return assets[_symbol].description;
    }

    /// Returns asset reissuability.
    ///
    /// @param _symbol asset symbol.
    ///
    /// @return asset reissuability.
    function isReissuable(bytes32 _symbol) public view returns (bool) {
        return assets[_symbol].isReissuable;
    }

    /// Returns asset owner address.
    /// @param _symbol asset symbol.
    /// @return asset owner address.
    function owner(bytes32 _symbol) public view returns (address) {
        return holders[assets[_symbol].owner].addr;
    }

    /// Check if specified address has asset owner rights.
    /// @param _owner address to check.
    /// @param _symbol asset symbol.
    /// @return owner rights availability.
    function isOwner(address _owner, bytes32 _symbol) public view returns (bool) {
        return isCreated(_symbol) && (assets[_symbol].owner == getHolderId(_owner));
    }

    /// Checks if a specified address has asset owner or co-owner rights.
    /// @param _owner address to check.
    /// @param _symbol asset symbol.
    /// @return owner rights availability.
    function hasAssetRights(address _owner, bytes32 _symbol) public view returns (bool) {
        uint holderId = getHolderId(_owner);
        return isCreated(_symbol) && (assets[_symbol].owner == holderId || assets[_symbol].partowners[holderId]);
    }

    /// Returns asset total supply.
    ///
    /// @param _symbol asset symbol.
    ///
    /// @return asset total supply.
    function totalSupply(bytes32 _symbol) public view returns (uint) {
        return assets[_symbol].totalSupply;
    }

    /// Returns asset balance for a particular holder.
    ///
    /// @param _holder holder address.
    /// @param _symbol asset symbol.
    ///
    /// @return holder balance.
    function balanceOf(address _holder, bytes32 _symbol) public view returns (uint) {
        return _balanceOf(getHolderId(_holder), _symbol);
    }

    /// Returns asset balance for a particular holder id.
    ///
    /// @param _holderId holder id.
    /// @param _symbol asset symbol.
    ///
    /// @return holder balance.
    function _balanceOf(uint _holderId, bytes32 _symbol) public view returns (uint) {
        return assets[_symbol].wallets[_holderId].balance;
    }

    /// Returns current address for a particular holder id.
    ///
    /// @param _holderId holder id.
    ///
    /// @return holder address.
    function _address(uint _holderId) public view returns (address) {
        return holders[_holderId].addr;
    }

    /// Adds a co-owner for an asset with provided symbol.
    /// @dev Should be performed by a contract owner or its co-owners
    ///
    /// @param _symbol asset's symbol
    /// @param _partowner a co-owner of an asset
    ///
    /// @return errorCode result code of an operation
    function addAssetPartOwner(bytes32 _symbol, address _partowner) onlyOneOfOwners(_symbol) public returns (uint) {
        uint holderId = _createHolderId(_partowner);
        assets[_symbol].partowners[holderId] = true;
        CAVPlatformEmitter(eventsHistory).emitOwnershipChange(0x0, _partowner, _symbol);
        return OK;
    }

    /// Removes a co-owner for an asset with provided symbol.
    /// @dev Should be performed by a contract owner or its co-owners
    ///
    /// @param _symbol asset's symbol
    /// @param _partowner a co-owner of an asset
    ///
    /// @return errorCode result code of an operation
    function removeAssetPartOwner(bytes32 _symbol, address _partowner) onlyOneOfOwners(_symbol) public returns (uint) {
        uint holderId = getHolderId(_partowner);
        delete assets[_symbol].partowners[holderId];
        CAVPlatformEmitter(eventsHistory).emitOwnershipChange(_partowner, 0x0, _symbol);
        return OK;
    }

    /// Sets Proxy contract address for a particular asset.
    ///
    /// Can be set only once for each asset, and only by contract owner.
    ///
    /// @param _proxyAddress Proxy contract address.
    /// @param _symbol asset symbol.
    ///
    /// @return success.
    function setProxy(address _proxyAddress, bytes32 _symbol) public onlyOneOfContractOwners returns (uint) {
        if (proxies[_symbol] != 0x0) {
            return CAV_PLATFORM_PROXY_ALREADY_EXISTS;
        }

        proxies[_symbol] = _proxyAddress;
        return OK;
    }

    /// Transfers asset balance between holders wallets.
    ///
    /// @param _fromId holder id to take from.
    /// @param _toId holder id to give to.
    /// @param _value amount to transfer.
    /// @param _symbol asset symbol.
    function _transferDirect(uint _fromId, uint _toId, uint _value, bytes32 _symbol) internal {
        assets[_symbol].wallets[_fromId].balance = assets[_symbol].wallets[_fromId].balance.sub(_value);
        assets[_symbol].wallets[_toId].balance = assets[_symbol].wallets[_toId].balance.add(_value);
    }

    /// Transfers asset balance between holders wallets.
    ///
    /// Performs sanity checks and takes care of allowances adjustment.
    ///
    /// @param _fromId holder id to take from.
    /// @param _toId holder id to give to.
    /// @param _value amount to transfer.
    /// @param _symbol asset symbol.
    /// @param _reference transfer comment to be included in a Transfer event.
    /// @param _senderId transfer initiator holder id.
    ///
    /// @return success.
    function _transfer(uint _fromId, uint _toId, uint _value, bytes32 _symbol, string _reference, uint _senderId) internal returns (uint) {
        // Should not allow to send to oneself.
        if (_fromId == _toId) {
            return _error(CAV_PLATFORM_CANNOT_APPLY_TO_ONESELF);
        }
        // Should have positive value.
        if (_value == 0) {
            return _error(CAV_PLATFORM_INVALID_VALUE);
        }
        // Should have enough balance.
        if (_balanceOf(_fromId, _symbol) < _value) {
            return _error(CAV_PLATFORM_INSUFFICIENT_BALANCE);
        }
        // Should have enough allowance.
        if (_fromId != _senderId && _allowance(_fromId, _senderId, _symbol) < _value) {
            return _error(CAV_PLATFORM_NOT_ENOUGH_ALLOWANCE);
        }

        _transferDirect(_fromId, _toId, _value, _symbol);
        // Adjust allowance.
        if (_fromId != _senderId) {
            assets[_symbol].wallets[_fromId].allowance[_senderId] = assets[_symbol].wallets[_fromId].allowance[_senderId].sub(_value);
        }
        // Internal Out Of Gas/Throw: revert this transaction too;
        // Call Stack Depth Limit reached: n/a after HF 4;
        // Recursive Call: safe, all changes already made.
        CAVPlatformEmitter(eventsHistory).emitTransfer(_address(_fromId), _address(_toId), _symbol, _value, _reference);
        _proxyTransferEvent(_fromId, _toId, _value, _symbol);
        return OK;
    }

    /// Transfers asset balance between holders wallets.
    ///
    /// Can only be called by asset proxy.
    ///
    /// @param _to holder address to give to.
    /// @param _value amount to transfer.
    /// @param _symbol asset symbol.
    /// @param _reference transfer comment to be included in a Transfer event.
    /// @param _sender transfer initiator address.
    ///
    /// @return success.
    function proxyTransferWithReference(address _to, uint _value, bytes32 _symbol, string _reference, address _sender) public onlyProxy(_symbol) returns (uint) {
        return _transfer(getHolderId(_sender), _createHolderId(_to), _value, _symbol, _reference, getHolderId(_sender));
    }

    /// Ask asset Proxy contract to emit ERC20 compliant Transfer event.
    ///
    /// @param _fromId holder id to take from.
    /// @param _toId holder id to give to.
    /// @param _value amount to transfer.
    /// @param _symbol asset symbol.
    function _proxyTransferEvent(uint _fromId, uint _toId, uint _value, bytes32 _symbol) internal {
        if (proxies[_symbol] != 0x0) {
            // Internal Out Of Gas/Throw: revert this transaction too;
            // Call Stack Depth Limit reached: n/a after HF 4;
            // Recursive Call: safe, all changes already made.
            ProxyEventsEmitter(proxies[_symbol]).emitTransfer(_address(_fromId), _address(_toId), _value);
        }
    }

    /// Returns holder id for the specified address.
    ///
    /// @param _holder holder address.
    ///
    /// @return holder id.
    function getHolderId(address _holder) public view returns (uint) {
        return holderIndex[_holder];
    }

    /// Returns holder id for the specified address, creates it if needed.
    ///
    /// @param _holder holder address.
    ///
    /// @return holder id.
    function _createHolderId(address _holder) internal returns (uint) {
        uint holderId = holderIndex[_holder];
        if (holderId == 0) {
            holderId = ++holdersCount;
            holders[holderId].addr = _holder;
            holderIndex[_holder] = holderId;
        }
        return holderId;
    }

    /// Issues new asset token on the platform.
    ///
    /// Tokens issued with this call go straight to contract owner.
    /// Each symbol can be issued only once, and only by contract owner.
    ///
    /// @param _symbol asset symbol.
    /// @param _value amount of tokens to issue immediately.
    /// @param _name name of the asset.
    /// @param _description description for the asset.
    /// @param _baseUnit number of decimals.
    /// @param _isReissuable dynamic or fixed supply.
    ///
    /// @return success.
    function issueAsset(bytes32 _symbol, uint _value, string _name, string _description, uint8 _baseUnit, bool _isReissuable) public returns (uint) {
        return issueAsset(_symbol, _value, _name, _description, _baseUnit, _isReissuable, msg.sender);
    }

    /// Issues new asset token on the platform.
    ///
    /// Tokens issued with this call go straight to contract owner.
    /// Each symbol can be issued only once, and only by contract owner.
    ///
    /// @param _symbol asset symbol.
    /// @param _value amount of tokens to issue immediately.
    /// @param _name name of the asset.
    /// @param _description description for the asset.
    /// @param _baseUnit number of decimals.
    /// @param _isReissuable dynamic or fixed supply.
    /// @param _account address where issued balance will be held
    ///
    /// @return success.
    function issueAsset(bytes32 _symbol, uint _value, string _name, string _description, uint8 _baseUnit, bool _isReissuable, address _account) onlyOneOfContractOwners public returns (uint) {
        // Should have positive value if supply is going to be fixed.
        if (_value == 0 && !_isReissuable) {
            return _error(CAV_PLATFORM_CANNOT_ISSUE_FIXED_ASSET_WITH_INVALID_VALUE);
        }
        // Should not be issued yet.
        if (isCreated(_symbol)) {
            return _error(CAV_PLATFORM_ASSET_ALREADY_ISSUED);
        }
        uint holderId = _createHolderId(_account);
        uint creatorId = _account == msg.sender ? holderId : _createHolderId(msg.sender);

        symbols.push(_symbol);
        assets[_symbol] = Asset(creatorId, _value, _name, _description, _isReissuable, _baseUnit);
        assets[_symbol].wallets[holderId].balance = _value;
        // Internal Out Of Gas/Throw: revert this transaction too;
        // Call Stack Depth Limit reached: n/a after HF 4;
        // Recursive Call: safe, all changes already made.
        CAVPlatformEmitter(eventsHistory).emitIssue(_symbol, _value, _address(holderId));
        return OK;
    }

    /// Issues additional asset tokens if the asset have dynamic supply.
    ///
    /// Tokens issued with this call go straight to asset owner.
    /// Can only be called by asset owner.
    ///
    /// @param _symbol asset symbol.
    /// @param _value amount of additional tokens to issue.
    ///
    /// @return success.
    function reissueAsset(bytes32 _symbol, uint _value) onlyOneOfOwners(_symbol) public returns (uint) {
        // Should have positive value.
        if (_value == 0) {
            return _error(CAV_PLATFORM_INVALID_VALUE);
        }
        Asset storage asset = assets[_symbol];
        // Should have dynamic supply.
        if (!asset.isReissuable) {
            return _error(CAV_PLATFORM_CANNOT_REISSUE_FIXED_ASSET);
        }
        // Resulting total supply should not overflow.
        if (asset.totalSupply + _value < asset.totalSupply) {
            return _error(CAV_PLATFORM_SUPPLY_OVERFLOW);
        }
        uint holderId = getHolderId(msg.sender);
        asset.wallets[holderId].balance = asset.wallets[holderId].balance.add(_value);
        asset.totalSupply = asset.totalSupply.add(_value);
        // Internal Out Of Gas/Throw: revert this transaction too;
        // Call Stack Depth Limit reached: n/a after HF 4;
        // Recursive Call: safe, all changes already made.
        CAVPlatformEmitter(eventsHistory).emitIssue(_symbol, _value, _address(holderId));
        _proxyTransferEvent(0, holderId, _value, _symbol);
        return OK;
    }

    /// Destroys specified amount of senders asset tokens.
    ///
    /// @param _symbol asset symbol.
    /// @param _value amount of tokens to destroy.
    ///
    /// @return success.
    function revokeAsset(bytes32 _symbol, uint _value) public returns (uint) {
        // Should have positive value.
        if (_value == 0) {
            return _error(CAV_PLATFORM_INVALID_VALUE);
        }
        Asset storage asset = assets[_symbol];
        uint holderId = getHolderId(msg.sender);
        // Should have enough tokens.
        if (asset.wallets[holderId].balance < _value) {
            return _error(CAV_PLATFORM_NOT_ENOUGH_TOKENS);
        }
        asset.wallets[holderId].balance = asset.wallets[holderId].balance.sub(_value);
        asset.totalSupply = asset.totalSupply.sub(_value);
        // Internal Out Of Gas/Throw: revert this transaction too;
        // Call Stack Depth Limit reached: n/a after HF 4;
        // Recursive Call: safe, all changes already made.
        CAVPlatformEmitter(eventsHistory).emitRevoke(_symbol, _value, _address(holderId));
        _proxyTransferEvent(holderId, 0, _value, _symbol);
        return OK;
    }

    /// Passes asset ownership to specified address.
    ///
    /// Only ownership is changed, balances are not touched.
    /// Can only be called by asset owner.
    ///
    /// @param _symbol asset symbol.
    /// @param _newOwner address to become a new owner.
    ///
    /// @return success.
    function changeOwnership(bytes32 _symbol, address _newOwner) public onlyOwner(_symbol) returns (uint) {
        if (_newOwner == 0x0) {
            return _error(CAV_PLATFORM_INVALID_NEW_OWNER);
        }

        Asset storage asset = assets[_symbol];
        uint newOwnerId = _createHolderId(_newOwner);
        // Should pass ownership to another holder.
        if (asset.owner == newOwnerId) {
            return _error(CAV_PLATFORM_CANNOT_APPLY_TO_ONESELF);
        }
        address oldOwner = _address(asset.owner);
        asset.owner = newOwnerId;
        // Internal Out Of Gas/Throw: revert this transaction too;
        // Call Stack Depth Limit reached: n/a after HF 4;
        // Recursive Call: safe, all changes already made.
        CAVPlatformEmitter(eventsHistory).emitOwnershipChange(oldOwner, _newOwner, _symbol);
        return OK;
    }

    /// Check if specified holder trusts an address with recovery procedure.
    ///
    /// @param _from truster.
    /// @param _to trustee.
    ///
    /// @return trust existance.
    function isTrusted(address _from, address _to) public view returns (bool) {
        return holders[getHolderId(_from)].trust[_to];
    }

    /// Trust an address to perform recovery procedure for the caller.
    ///
    /// @param _to trustee.
    ///
    /// @return success.
    function trust(address _to) public returns (uint) {
        uint fromId = _createHolderId(msg.sender);
        // Should trust to another address.
        if (fromId == getHolderId(_to)) {
            return _error(CAV_PLATFORM_CANNOT_APPLY_TO_ONESELF);
        }
        // Should trust to yet untrusted.
        if (isTrusted(msg.sender, _to)) {
            return _error(CAV_PLATFORM_ALREADY_TRUSTED);
        }

        holders[fromId].trust[_to] = true;
        return OK;
    }

    /// Revoke trust to perform recovery procedure from an address.
    ///
    /// @param _to trustee.
    ///
    /// @return success.
    function distrust(address _to) checkTrust(msg.sender, _to) public returns (uint) {
        holders[getHolderId(msg.sender)].trust[_to] = false;
        return OK;
    }

    function massTransfer(address[] addresses, uint[] values, bytes32 _symbol)
    external
    onlyOneOfOwners(_symbol)
    returns (uint errorCode, uint count)
    {
        require(addresses.length == values.length);
        require(_symbol != 0x0);

        uint senderId = _createHolderId(msg.sender);

        uint success = 0;
        for(uint idx = 0; idx < addresses.length && msg.gas > 110000; idx++) {
            uint value = values[idx];

            if (value == 0) {
              _error(CAV_PLATFORM_INVALID_VALUE);
              continue;
            }

            if (_balanceOf(senderId, _symbol) < value) {
              _error(CAV_PLATFORM_INSUFFICIENT_BALANCE);
              continue;
            }

            if (msg.sender == addresses[idx]) {
              _error(CAV_PLATFORM_CANNOT_APPLY_TO_ONESELF);
              continue;
            }

            uint holderId = _createHolderId(addresses[idx]);

            _transferDirect(senderId, holderId, value, _symbol);
            CAVPlatformEmitter(eventsHistory).emitTransfer(msg.sender, addresses[idx], _symbol, value, "");

            success++;
          }

          return (OK, success);
    }

    /// Perform recovery procedure.
    ///
    /// This function logic is actually more of an addAccess(uint _holderId, address _to).
    /// It grants another address access to recovery subject wallets.
    /// Can only be called by trustee of recovery subject.
    ///
    /// @param _from holder address to recover from.
    /// @param _to address to grant access to.
    ///
    /// @return success.
    function recover(address _from, address _to) checkTrust(_from, msg.sender) public returns (uint errorCode) {
        // Should recover to previously unused address.
        if (getHolderId(_to) != 0) {
            return _error(CAV_PLATFORM_SHOULD_RECOVER_TO_NEW_ADDRESS);
        }
        // We take current holder address because it might not equal _from.
        // It is possible to recover from any old holder address, but event should have the current one.
        address from = holders[getHolderId(_from)].addr;
        holders[getHolderId(_from)].addr = _to;
        holderIndex[_to] = getHolderId(_from);
        // Internal Out Of Gas/Throw: revert this transaction too;
        // Call Stack Depth Limit reached: revert this transaction too;
        // Recursive Call: safe, all changes already made.
        CAVPlatformEmitter(eventsHistory).emitRecovery(from, _to, msg.sender);
        return OK;
    }

    /// Sets asset spending allowance for a specified spender.
    ///
    /// Note: to revoke allowance, one needs to set allowance to 0.
    ///
    /// @param _spenderId holder id to set allowance for.
    /// @param _value amount to allow.
    /// @param _symbol asset symbol.
    /// @param _senderId approve initiator holder id.
    ///
    /// @return success.
    function _approve(uint _spenderId, uint _value, bytes32 _symbol, uint _senderId) internal returns (uint) {
        // Asset should exist.
        if (!isCreated(_symbol)) {
            return _error(CAV_PLATFORM_ASSET_IS_NOT_ISSUED);
        }
        // Should allow to another holder.
        if (_senderId == _spenderId) {
            return _error(CAV_PLATFORM_CANNOT_APPLY_TO_ONESELF);
        }

        // Double Spend Attack checkpoint
        if (assets[_symbol].wallets[_senderId].allowance[_spenderId] != 0 && _value != 0) {
            return _error(CAV_PLATFORM_INVALID_INVOCATION);
        }

        assets[_symbol].wallets[_senderId].allowance[_spenderId] = _value;

        // Internal Out Of Gas/Throw: revert this transaction too;
        // Call Stack Depth Limit reached: revert this transaction too;
        // Recursive Call: safe, all changes already made.
        CAVPlatformEmitter(eventsHistory).emitApprove(_address(_senderId), _address(_spenderId), _symbol, _value);
        if (proxies[_symbol] != 0x0) {
            // Internal Out Of Gas/Throw: revert this transaction too;
            // Call Stack Depth Limit reached: n/a after HF 4;
            // Recursive Call: safe, all changes already made.
            ProxyEventsEmitter(proxies[_symbol]).emitApprove(_address(_senderId), _address(_spenderId), _value);
        }
        return OK;
    }

    /// Sets asset spending allowance for a specified spender.
    ///
    /// Can only be called by asset proxy.
    ///
    /// @param _spender holder address to set allowance to.
    /// @param _value amount to allow.
    /// @param _symbol asset symbol.
    /// @param _sender approve initiator address.
    ///
    /// @return success.
    function proxyApprove(address _spender, uint _value, bytes32 _symbol, address _sender) onlyProxy(_symbol) public returns (uint) {
        return _approve(_createHolderId(_spender), _value, _symbol, _createHolderId(_sender));
    }

    /// Returns asset allowance from one holder to another.
    ///
    /// @param _from holder that allowed spending.
    /// @param _spender holder that is allowed to spend.
    /// @param _symbol asset symbol.
    ///
    /// @return holder to spender allowance.
    function allowance(address _from, address _spender, bytes32 _symbol) public view returns (uint) {
        return _allowance(getHolderId(_from), getHolderId(_spender), _symbol);
    }

    /// Returns asset allowance from one holder to another.
    ///
    /// @param _fromId holder id that allowed spending.
    /// @param _toId holder id that is allowed to spend.
    /// @param _symbol asset symbol.
    ///
    /// @return holder to spender allowance.
    function _allowance(uint _fromId, uint _toId, bytes32 _symbol) internal view returns (uint) {
        return assets[_symbol].wallets[_fromId].allowance[_toId];
    }

    /// Prforms allowance transfer of asset balance between holders wallets.
    ///
    /// Can only be called by asset proxy.
    ///
    /// @param _from holder address to take from.
    /// @param _to holder address to give to.
    /// @param _value amount to transfer.
    /// @param _symbol asset symbol.
    /// @param _reference transfer comment to be included in a Transfer event.
    /// @param _sender allowance transfer initiator address.
    ///
    /// @return success.
    function proxyTransferFromWithReference(address _from, address _to, uint _value, bytes32 _symbol, string _reference, address _sender) onlyProxy(_symbol) public returns (uint) {
        return _transfer(getHolderId(_from), _createHolderId(_to), _value, _symbol, _reference, getHolderId(_sender));
    }
}

Contract Security Audit

Contract ABI

[{"constant":true,"inputs":[{"name":"_symbol","type":"bytes32"}],"name":"owner","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_eventsHistory","type":"address"}],"name":"setupEventsHistory","outputs":[{"name":"errorCode","type":"uint256"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_symbol","type":"bytes32"},{"name":"_partowner","type":"address"}],"name":"addAssetPartOwner","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_symbol","type":"bytes32"},{"name":"_value","type":"uint256"},{"name":"_name","type":"string"},{"name":"_description","type":"string"},{"name":"_baseUnit","type":"uint8"},{"name":"_isReissuable","type":"bool"}],"name":"issueAsset","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"_holder","type":"address"}],"name":"getHolderId","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_partowner","type":"address"}],"name":"removePartOwner","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_spender","type":"address"},{"name":"_value","type":"uint256"},{"name":"_symbol","type":"bytes32"},{"name":"_sender","type":"address"}],"name":"proxyApprove","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_from","type":"address"},{"name":"_to","type":"address"},{"name":"_value","type":"uint256"},{"name":"_symbol","type":"bytes32"},{"name":"_reference","type":"string"},{"name":"_sender","type":"address"}],"name":"proxyTransferFromWithReference","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"_from","type":"address"},{"name":"_spender","type":"address"},{"name":"_symbol","type":"bytes32"}],"name":"allowance","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"","type":"uint256"}],"name":"holders","outputs":[{"name":"addr","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_symbol","type":"bytes32"}],"name":"isCreated","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"claimContractOwnership","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_to","type":"address"}],"name":"trust","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"_holder","type":"address"},{"name":"_symbol","type":"bytes32"}],"name":"balanceOf","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_from","type":"address"},{"name":"_to","type":"address"},{"name":"_symbol","type":"bytes32"},{"name":"_value","type":"uint256"},{"name":"_reference","type":"string"}],"name":"emitTransfer","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_to","type":"address"}],"name":"changeContractOwnership","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_to","type":"address"},{"name":"_value","type":"uint256"},{"name":"_symbol","type":"bytes32"},{"name":"_reference","type":"string"},{"name":"_sender","type":"address"}],"name":"proxyTransferWithReference","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"pendingContractOwner","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_holderId","type":"uint256"},{"name":"_symbol","type":"bytes32"}],"name":"_balanceOf","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_proxyAddress","type":"address"},{"name":"_symbol","type":"bytes32"}],"name":"setProxy","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_from","type":"address"},{"name":"_to","type":"address"}],"name":"recover","outputs":[{"name":"errorCode","type":"uint256"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"_from","type":"address"},{"name":"_to","type":"address"}],"name":"isTrusted","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_holderId","type":"uint256"}],"name":"_address","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_symbol","type":"bytes32"}],"name":"name","outputs":[{"name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"","type":"bytes32"}],"name":"proxies","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"holdersCount","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"destroy","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"","type":"bytes32"}],"name":"assets","outputs":[{"name":"owner","type":"uint256"},{"name":"totalSupply","type":"uint256"},{"name":"name","type":"string"},{"name":"description","type":"string"},{"name":"isReissuable","type":"bool"},{"name":"baseUnit","type":"uint8"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_symbol","type":"bytes32"},{"name":"_value","type":"uint256"},{"name":"_name","type":"string"},{"name":"_description","type":"string"},{"name":"_baseUnit","type":"uint8"},{"name":"_isReissuable","type":"bool"},{"name":"_account","type":"address"}],"name":"issueAsset","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_partowner","type":"address"}],"name":"addPartOwner","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_to","type":"address"}],"name":"transferContractOwnership","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_from","type":"address"},{"name":"_to","type":"address"},{"name":"_symbol","type":"bytes32"}],"name":"emitOwnershipChange","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_symbol","type":"bytes32"},{"name":"_value","type":"uint256"},{"name":"_by","type":"address"}],"name":"emitIssue","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"_symbol","type":"bytes32"}],"name":"totalSupply","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_symbol","type":"bytes32"}],"name":"description","outputs":[{"name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_symbol","type":"bytes32"}],"name":"isReissuable","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_symbol","type":"bytes32"},{"name":"_value","type":"uint256"},{"name":"_by","type":"address"}],"name":"emitRevoke","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_symbol","type":"bytes32"},{"name":"_value","type":"uint256"}],"name":"revokeAsset","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"","type":"address"}],"name":"partowners","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_owner","type":"address"},{"name":"_symbol","type":"bytes32"}],"name":"hasAssetRights","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"","type":"uint256"}],"name":"symbols","outputs":[{"name":"","type":"bytes32"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"addresses","type":"address[]"},{"name":"values","type":"uint256[]"},{"name":"_symbol","type":"bytes32"}],"name":"massTransfer","outputs":[{"name":"errorCode","type":"uint256"},{"name":"count","type":"uint256"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"contractOwner","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_from","type":"address"},{"name":"_spender","type":"address"},{"name":"_symbol","type":"bytes32"},{"name":"_value","type":"uint256"}],"name":"emitApprove","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"tokens","type":"address[]"},{"name":"_to","type":"address"}],"name":"withdrawnTokens","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"_symbol","type":"bytes32"}],"name":"baseUnit","outputs":[{"name":"","type":"uint8"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_errorCode","type":"uint256"}],"name":"emitError","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_symbol","type":"bytes32"},{"name":"_value","type":"uint256"}],"name":"reissueAsset","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"_owner","type":"address"},{"name":"_symbol","type":"bytes32"}],"name":"isOwner","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_from","type":"address"},{"name":"_to","type":"address"},{"name":"_by","type":"address"}],"name":"emitRecovery","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_symbol","type":"bytes32"},{"name":"_partowner","type":"address"}],"name":"removeAssetPartOwner","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"symbolsCount","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"eventsHistory","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_to","type":"address"}],"name":"distrust","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_symbol","type":"bytes32"},{"name":"_newOwner","type":"address"}],"name":"changeOwnership","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"anonymous":false,"inputs":[{"indexed":true,"name":"from","type":"address"},{"indexed":true,"name":"to","type":"address"},{"indexed":true,"name":"symbol","type":"bytes32"},{"indexed":false,"name":"value","type":"uint256"},{"indexed":false,"name":"reference","type":"string"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"symbol","type":"bytes32"},{"indexed":false,"name":"value","type":"uint256"},{"indexed":true,"name":"by","type":"address"}],"name":"Issue","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"symbol","type":"bytes32"},{"indexed":false,"name":"value","type":"uint256"},{"indexed":true,"name":"by","type":"address"}],"name":"Revoke","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"from","type":"address"},{"indexed":true,"name":"to","type":"address"},{"indexed":true,"name":"symbol","type":"bytes32"}],"name":"OwnershipChange","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"from","type":"address"},{"indexed":true,"name":"spender","type":"address"},{"indexed":true,"name":"symbol","type":"bytes32"},{"indexed":false,"name":"value","type":"uint256"}],"name":"Approve","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"from","type":"address"},{"indexed":true,"name":"to","type":"address"},{"indexed":false,"name":"by","type":"address"}],"name":"Recovery","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"errorCode","type":"uint256"}],"name":"Error","type":"event"}]

606060405260008054600160a060020a033316600160a060020a0319909116179055612b20806100306000396000f3006060604052600436106102795763ffffffff60e060020a60003504166302571be3811461027e57806302927d20146102b0578063048ae1bb146102e1578063085a4705146103035780630af3e660146103ad5780631286e393146103cc57806314712e2f146103eb578063161ff662146104185780631c8d5d38146104945780632a11ced0146104bc5780632f553d31146104d25780634592cd1d146104fc5780634637d8271461050f5780634d30b6be1461052e578063515c145714610550578063557f4bc9146105c357806357a96dd0146105e25780635aa77d3c146106555780635b7da33814610668578063638a9ce914610681578063648bf774146106a35780636713e230146106c85780636825c843146106ed578063691f3431146107035780636932af36146107905780636b4ed21b146107a657806383197ef0146107b95780639fda5b66146107cc578063a3ff0ea214610907578063a831751d146109c0578063a843c51f146109df578063a9612f72146109fe578063abafaa1614610a26578063b524abcf14610a4b578063bebcc04514610a61578063c4eeeeb914610a77578063c70bbc1314610a8d578063ca448a8814610ab2578063cb59646614610acb578063ccc11f1114610aea578063ccce413b14610b0c578063cdeb148514610b22578063ce606ee014610b67578063d54c8c8714610b7a578063d8f9659b14610ba5578063dc86e6f014610bff578063df26ca0814610c2b578063e0873c0614610c41578063e96b462a14610c5a578063ea14457e14610c7c578063ec77809f14610ca7578063ecac7f4b14610cc9578063f07629f814610cdc578063f0c06aa514610cef578063fd83915e14610d0e575b600080fd5b341561028957600080fd5b610294600435610d30565b604051600160a060020a03909116815260200160405180910390f35b34156102bb57600080fd5b6102cf600160a060020a0360043516610d5b565b60405190815260200160405180910390f35b34156102ec57600080fd5b6102cf600435600160a060020a0360243516610d98565b341561030e57600080fd5b6102cf600480359060248035919060649060443590810190830135806020601f8201819004810201604051908101604052818152929190602084018383808284378201915050505050509190803590602001908201803590602001908080601f0160208091040260200160405190810160405281815292919060208401838380828437509496505060ff853516946020013515159350610e6692505050565b34156103b857600080fd5b6102cf600160a060020a0360043516610e84565b34156103d757600080fd5b6102cf600160a060020a0360043516610e9f565b34156103f657600080fd5b6102cf600160a060020a03600435811690602435906044359060643516610edc565b341561042357600080fd5b6102cf600160a060020a0360048035821691602480359091169160443591606435919060a49060843590810190830135806020601f8201819004810201604051908101604052818152929190602084018383808284375094965050509235600160a060020a03169250610f29915050565b341561049f57600080fd5b6102cf600160a060020a0360043581169060243516604435610f82565b34156104c757600080fd5b610294600435610fa7565b34156104dd57600080fd5b6104e8600435610fc2565b604051901515815260200160405180910390f35b341561050757600080fd5b6104e8610fd6565b341561051a57600080fd5b6102cf600160a060020a0360043516611021565b341561053957600080fd5b6102cf600160a060020a03600435166024356110a6565b341561055b57600080fd5b6105c1600160a060020a0360048035821691602480359091169160443591606435919060a49060843590810190830135806020601f820181900481020160405190810160405281815292919060208401838380828437509496506110c395505050505050565b005b34156105ce57600080fd5b6104e8600160a060020a0360043516611179565b34156105ed57600080fd5b6102cf60048035600160a060020a03169060248035916044359160849060643590810190830135806020601f8201819004810201604051908101604052818152929190602084018383808284375094965050509235600160a060020a031692506111cc915050565b341561066057600080fd5b61029461120a565b341561067357600080fd5b6102cf600435602435611219565b341561068c57600080fd5b6102cf600160a060020a0360043516602435611239565b34156106ae57600080fd5b6102cf600160a060020a03600435811690602435166112cc565b34156106d357600080fd5b6104e8600160a060020a036004358116906024351661140e565b34156106f857600080fd5b610294600435611452565b341561070e57600080fd5b61071960043561146d565b60405160208082528190810183818151815260200191508051906020019080838360005b8381101561075557808201518382015260200161073d565b50505050905090810190601f1680156107825780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b341561079b57600080fd5b610294600435611533565b34156107b157600080fd5b6102cf61154e565b34156107c457600080fd5b6105c1611554565b34156107d757600080fd5b6107e2600435611579565b60405186815260208101869052821515608082015260ff821660a082015260c06040820181815286546002600019610100600184161502019091160491830182905290606083019060e08401908890801561087e5780601f106108535761010080835404028352916020019161087e565b820191906000526020600020905b81548152906001019060200180831161086157829003601f168201915b50508381038252865460026000196101006001841615020190911604808252602090910190879080156108f25780601f106108c7576101008083540402835291602001916108f2565b820191906000526020600020905b8154815290600101906020018083116108d557829003601f168201915b50509850505050505050505060405180910390f35b341561091257600080fd5b6102cf600480359060248035919060649060443590810190830135806020601f8201819004810201604051908101604052818152929190602084018383808284378201915050505050509190803590602001908201803590602001908080601f0160208091040260200160405190810160405281815292919060208401838380828437509496505050833560ff169360208101351515935060400135600160a060020a031691506115af9050565b34156109cb57600080fd5b6102cf600160a060020a03600435166117f1565b34156109ea57600080fd5b6104e8600160a060020a0360043516611832565b3415610a0957600080fd5b6105c1600160a060020a03600435811690602435166044356118a9565b3415610a3157600080fd5b6105c1600435602435600160a060020a03604435166118e9565b3415610a5657600080fd5b6102cf60043561192c565b3415610a6c57600080fd5b610719600435611941565b3415610a8257600080fd5b6104e86004356119d0565b3415610a9857600080fd5b6105c1600435602435600160a060020a03604435166119e8565b3415610abd57600080fd5b6102cf600435602435611a2b565b3415610ad657600080fd5b6104e8600160a060020a0360043516611b68565b3415610af557600080fd5b6104e8600160a060020a0360043516602435611b7d565b3415610b1757600080fd5b6102cf600435611bd9565b3415610b2d57600080fd5b610b4f6024600480358281019290820135918135918201910135604435611bf8565b60405191825260208201526040908101905180910390f35b3415610b7257600080fd5b610294611de5565b3415610b8557600080fd5b6105c1600160a060020a0360043581169060243516604435606435611df4565b3415610bb057600080fd5b6102cf600460248135818101908301358060208181020160405190810160405280939291908181526020018383602002808284375094965050509235600160a060020a03169250611e3c915050565b3415610c0a57600080fd5b610c15600435611f89565b60405160ff909116815260200160405180910390f35b3415610c3657600080fd5b6105c1600435611fa6565b3415610c4c57600080fd5b6102cf600435602435611fdc565b3415610c6557600080fd5b6104e8600160a060020a0360043516602435612127565b3415610c8757600080fd5b6105c1600160a060020a036004358116906024358116906044351661215a565b3415610cb257600080fd5b6102cf600435600160a060020a03602435166121b0565b3415610cd457600080fd5b6102cf612259565b3415610ce757600080fd5b61029461225f565b3415610cfa57600080fd5b6102cf600160a060020a036004351661226e565b3415610d1957600080fd5b6102cf600435600160a060020a03602435166122d4565b60008181526006602090815260408083205483526003909152902054600160a060020a03165b919050565b6000805433600160a060020a0390811691161415610d56575060098054600160a060020a038316600160a060020a03199091161790556001919050565b60008083610da63382611b7d565b15610e5e57610db4846123d3565b60008681526006602081815260408084208585529092019052808220805460ff19166001179055600954929450600160a060020a039092169163a9612f729190879089905160e060020a63ffffffff8616028152600160a060020a0393841660048201529190921660248201526044810191909152606401600060405180830381600087803b1515610e4557600080fd5b6102c65a03f11515610e5657600080fd5b505050600192505b505092915050565b6000610e77878787878787336115af565b90505b9695505050505050565b600160a060020a031660009081526004602052604090205490565b6000805433600160a060020a0390811691161415610d565750600160a060020a03166000908152600860205260409020805460ff19169055600190565b600082815260076020526040812054839033600160a060020a0390811691161415610f2057610f1d610f0d876123d3565b8686610f18876123d3565b61243e565b91505b50949350505050565b600083815260076020526040812054849033600160a060020a0390811691161415610f7757610f74610f5a89610e84565b610f63896123d3565b888888610f6f89610e84565b61262b565b91505b509695505050505050565b6000610f9f610f9085610e84565b610f9985610e84565b8461282c565b949350505050565b600360205260009081526040902054600160a060020a031681565b600090815260066020526040902054151590565b60015460009033600160a060020a03908116911614610ff75750600061101e565b506001805460008054600160a060020a0319908116600160a060020a038416179091551681555b90565b60008061102d336123d3565b905061103883610e84565b8114156110515761104a613a9961285a565b91506110a0565b61105b338461140e565b1561106b5761104a613aa361285a565b6000818152600360209081526040808320600160a060020a03871684526001908101909252909120805460ff19168217905591505b50919050565b60006110ba6110b484610e84565b83611219565b90505b92915050565b82600160a060020a038086169087167f8f1b83868d2ecc962fd90cfee71c9c52455fe10940937bc7571d90ba404c5c3b858560405182815260406020820181815290820183818151815260200191508051906020019080838360005b8381101561113757808201518382015260200161111f565b50505050905090810190601f1680156111645780820380516001836020036101000a031916815260200191505b50935050505060405180910390a45050505050565b6000805433600160a060020a0390811691161415610d5657600160a060020a03821615156111a957506000610d56565b5060018054600160a060020a038316600160a060020a0319909116178155919050565b600083815260076020526040812054849033600160a060020a0390811691161415611200576111fd610f5a84610e84565b91505b5095945050505050565b600154600160a060020a031681565b600090815260066020908152604080832093835260059093019052205490565b6000805433600160a060020a039081169116148061126f5750600160a060020a03331660009081526008602052604090205460ff165b156110bd57600082815260076020526040902054600160a060020a03161561129a5750613a986110bd565b5060008181526007602052604090208054600160a060020a038416600160a060020a0319909116179055600192915050565b60008083336112db828261140e565b15611405576112e985610e84565b15611300576112f9613aa461285a565b9350611405565b6003600061130d88610e84565b81526020810191909152604001600090812054600160a060020a03169350859060039061133989610e84565b815260208101919091526040016000208054600160a060020a031916600160a060020a039290921691909117905561137086610e84565b600160a060020a038087166000908152600460205260409081902092909255600954169063ea14457e908590889033905160e060020a63ffffffff8616028152600160a060020a03938416600482015291831660248301529091166044820152606401600060405180830381600087803b15156113ec57600080fd5b6102c65a03f115156113fd57600080fd5b505050600193505b50505092915050565b60006003600061141d85610e84565b815260208082019290925260409081016000908120600160a060020a038616825260010190925290205460ff16905092915050565b600090815260036020526040902054600160a060020a031690565b611475612a21565b6006600083600019166000191681526020019081526020016000206002018054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156115275780601f106114fc57610100808354040283529160200191611527565b820191906000526020600020905b81548152906001019060200180831161150a57829003601f168201915b50505050509050919050565b600760205260009081526040902054600160a060020a031681565b60025481565b60005433600160a060020a03908116911614156115775733600160a060020a0316ff5b565b60066020526000908152604090208054600182015460048301549192909160028201916003019060ff8082169161010090041686565b600080548190819033600160a060020a03908116911614806115e95750600160a060020a03331660009081526008602052604090205460ff165b156117e457881580156115fa575084155b156116115761160a613a9e61285a565b92506117e4565b61161a8a610fc2565b1561162a5761160a613a9d61285a565b611633846123d3565b915033600160a060020a031684600160a060020a03161461165c57611657336123d3565b61165e565b815b9050600580548060010182816116749190612a33565b5060009182526020909120018a905560c0604051908101604090815282825260208083018c90528183018b9052606083018a9052871515608084015260ff891660a084015260008d815260069091522081518155602082015181600101556040820151816002019080516116ec929160200190612a5c565b50606082015181600301908051611707929160200190612a5c565b50608082015160048201805460ff191691151591909117905560a08201516004909101805460ff929092166101000261ff00199092169190911790555060008a81526006602090815260408083208584526005019091529020899055600954600160a060020a031663abafaa168b8b61177f86611452565b60405160e060020a63ffffffff861602815260048101939093526024830191909152600160a060020a03166044820152606401600060405180830381600087803b15156117cb57600080fd5b6102c65a03f115156117dc57600080fd5b505050600192505b5050979650505050505050565b6000805433600160a060020a0390811691161415610d565750600160a060020a03166000908152600860205260409020805460ff1916600190811790915590565b6000805433600160a060020a0390811691161415610d5657600160a060020a038216151561186257506000610d56565b600154600160a060020a0316156118845760018054600160a060020a03191690555b5060008054600160a060020a038316600160a060020a03199091161790556001919050565b80600160a060020a038084169085167f0de92ba2d86c482d7f947cc22a580692bb78d6277988023434905f44b8cd261a60405160405180910390a4505050565b600160a060020a038116837fd03c2206e12a8eb3553d780874e1a7941b9c67f3a726ce6edb4a9fd65e25ec988460405190815260200160405180910390a3505050565b60009081526006602052604090206001015490565b611949612a21565b6006600083600019166000191681526020019081526020016000206003018054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156115275780601f106114fc57610100808354040283529160200191611527565b60009081526006602052604090206004015460ff1690565b600160a060020a038116837fa4e2520a41c90422e37fc8ba7153c519a427a62ea5f494a14a218a7b9bceb6ca8460405190815260200160405180910390a3505050565b60008080831515611a4857611a41613a9a61285a565b9250610e5e565b60008581526006602052604090209150611a6133610e84565b600081815260058401602052604090205490915084901015611a8857611a41613aa161285a565b6000818152600583016020526040902054611aa9908563ffffffff6128bf16565b60008281526005840160205260409020556001820154611acf908563ffffffff6128bf16565b6001830155600954600160a060020a031663c70bbc138686611af085611452565b60405160e060020a63ffffffff861602815260048101939093526024830191909152600160a060020a03166044820152606401600060405180830381600087803b1515611b3c57600080fd5b6102c65a03f11515611b4d57600080fd5b505050611b5d81600086886128d1565b506001949350505050565b60086020526000908152604090205460ff1681565b600080611b8984610e84565b9050611b9483610fc2565b8015610f9f5750600083815260066020526040902054811480610f9f57506000838152600660208181526040808420858552909201905290205460ff16949350505050565b6005805482908110611be757fe5b600091825260209091200154905081565b600080600080600080600087611c0e3382611b7d565b15611dd5578b8a14611c1f57600080fd5b881515611c2b57600080fd5b611c34336123d3565b955060009450600093505b8b84108015611c5057506201adb05a115b15611dcd578a8a85818110611c6157fe5b9050602002013592508260001415611c8457611c7e613a9a61285a565b50611dc2565b82611c8f878b611219565b1015611ca057611c7e613a9b61285a565b8c8c85818110611cac57fe5b90506020020135600160a060020a0316600160a060020a031633600160a060020a03161415611ce057611c7e613a9961285a565b611d048d8d86818110611cef57fe5b90506020020135600160a060020a03166123d3565b9150611d128683858c612988565b600954600160a060020a031663515c1457338f8f88818110611d3057fe5b90506020020135600160a060020a03168c8760405160e060020a63ffffffff8716028152600160a060020a0394851660048201529290931660248301526044820152606481019190915260a06084820152600060a4820181905260e49091019060405180830381600087803b1515611da757600080fd5b6102c65a03f11515611db857600080fd5b5050600190950194505b600190930192611c3f565b600185975097505b5050505050509550959350505050565b600054600160a060020a031681565b81600160a060020a038085169086167f859b1cddb4da93a04541d62c27d7d83aa8173a1b37bbccd3c60ceb4ee19ee13e8460405190815260200160405180910390a450505050565b6000805481908190819033600160a060020a039081169116141561140557600092505b8551831015611f7d57858381518110611e7457fe5b90602001906020020151915081600160a060020a03166370a082313060006040516020015260405160e060020a63ffffffff8416028152600160a060020a039091166004820152602401602060405180830381600087803b1515611ed757600080fd5b6102c65a03f11515611ee857600080fd5b50505060405180519150508015611f725781600160a060020a031663a9059cbb868360006040516020015260405160e060020a63ffffffff8516028152600160a060020a0390921660048301526024820152604401602060405180830381600087803b1515611f5657600080fd5b6102c65a03f11515611f6757600080fd5b505050604051805150505b600190920191611e5f565b50600195945050505050565b600090815260066020526040902060040154610100900460ff1690565b7f2e36a7093f25f22bd4cbdeb6040174c3ba4c5fe8f1abc04e7c3c48f26c7413e08160405190815260200160405180910390a150565b600080600084611fec3382611b7d565b1561140557841515612003576112f9613a9a61285a565b6000868152600660205260409020600481015490935060ff16151561202d576112f9613a9f61285a565b60018301548581011015612046576112f9613aa061285a565b61204f33610e84565b6000818152600585016020526040902054909250612073908663ffffffff612a0b16565b60008381526005850160205260409020556001830154612099908663ffffffff612a0b16565b6001840155600954600160a060020a031663abafaa1687876120ba86611452565b60405160e060020a63ffffffff861602815260048101939093526024830191909152600160a060020a03166044820152606401600060405180830381600087803b151561210657600080fd5b6102c65a03f1151561211757600080fd5b505050611f7d60008387896128d1565b600061213282610fc2565b80156110ba575061214283610e84565b60008381526006602052604090205414905092915050565b81600160a060020a031683600160a060020a03167f6c0468512076e943ed3d1c5aae1d6903c72162713d86aedd1381b3ac19e10cec83604051600160a060020a03909116815260200160405180910390a3505050565b600080836121be3382611b7d565b15610e5e576121cc84610e84565b60008681526006602081815260408084208585529092019052808220805460ff19169055600954929450600160a060020a039092169163a9612f7291879189905160e060020a63ffffffff8616028152600160a060020a0393841660048201529190921660248201526044810191909152606401600060405180830381600087803b1515610e4557600080fd5b60055490565b600954600160a060020a031681565b6000338261227c828261140e565b156122cd5760006003600061229033610e84565b815260208082019290925260409081016000908120600160a060020a0389168252600190810190935220805460ff19169215159290921790915592505b5050919050565b600080600080856122e53382612127565b156123c957600160a060020a038616151561230c57612305613aa261285a565b94506123c9565b60008781526006602052604090209350612325866123d3565b845490935083141561233c57612305613a9961285a565b835461234790611452565b838555600954909250600160a060020a031663a9612f7283888a60405160e060020a63ffffffff8616028152600160a060020a0393841660048201529190921660248201526044810191909152606401600060405180830381600087803b15156123b057600080fd5b6102c65a03f115156123c157600080fd5b505050600194505b5050505092915050565b600160a060020a0381166000908152600460205260408120548015156110bd5750600280546001019081905560008181526003602090815260408083208054600160a060020a031916600160a060020a03881690811790915583526004909152902081905592915050565b600061244983610fc2565b15156124615761245a613aa561285a565b9050610f9f565b848214156124745761245a613a9961285a565b60008381526006602090815260408083208584526005018252808320888452600101909152902054158015906124a957508315155b156124b95761245a613aa961285a565b600083815260066020908152604080832085845260050182528083208884526001019091529020849055600954600160a060020a031663d54c8c876124fd84611452565b61250688611452565b868860405160e060020a63ffffffff8716028152600160a060020a03948516600482015292909316602483015260448201526064810191909152608401600060405180830381600087803b151561255c57600080fd5b6102c65a03f1151561256d57600080fd5b505050600083815260076020526040902054600160a060020a031615611b5d57600083815260076020526040902054600160a060020a031663233850896125b384611452565b6125bc88611452565b8760405160e060020a63ffffffff8616028152600160a060020a0393841660048201529190921660248201526044810191909152606401600060405180830381600087803b151561260c57600080fd5b6102c65a03f1151561261d57600080fd5b505050506001949350505050565b60008587141561264757612640613a9961285a565b9050610e7a565b84151561265957612640613a9a61285a565b846126648886611219565b101561267557612640613a9b61285a565b81871415801561268e57508461268c88848761282c565b105b1561269e57612640613a9c61285a565b6126aa87878787612988565b8682146127125760008481526006602090815260408083208a845260050182528083208584526001019091529020546126e9908663ffffffff6128bf16565b60008581526006602090815260408083208b845260050182528083208684526001019091529020555b600954600160a060020a031663515c145761272c89611452565b61273589611452565b87898860405160e060020a63ffffffff8816028152600160a060020a03808716600483019081529086166024830152604482018590526064820184905260a060848301908152909160a40183818151815260200191508051906020019080838360005b838110156127b0578082015183820152602001612798565b50505050905090810190601f1680156127dd5780820380516001836020036101000a031916815260200191505b509650505050505050600060405180830381600087803b15156127ff57600080fd5b6102c65a03f1151561281057600080fd5b50505061281f878787876128d1565b5060019695505050505050565b6000908152600660209081526040808320948352600590940181528382209282526001909201909152205490565b600954600090600160a060020a031663df26ca088360405160e060020a63ffffffff84160281526004810191909152602401600060405180830381600087803b15156128a557600080fd5b6102c65a03f115156128b657600080fd5b50929392505050565b6000828211156128cb57fe5b50900390565b600081815260076020526040902054600160a060020a03161561298257600081815260076020526040902054600160a060020a03166323de665161291486611452565b61291d86611452565b8560405160e060020a63ffffffff8616028152600160a060020a0393841660048201529190921660248201526044810191909152606401600060405180830381600087803b151561296d57600080fd5b6102c65a03f1151561297e57600080fd5b5050505b50505050565b60008181526006602090815260408083208784526005019091529020546129b5908363ffffffff6128bf16565b60008281526006602090815260408083208884526005019091528082209290925584815220546129e59083612a0b565b600091825260066020908152604080842095845260059095019052929020919091555050565b600082820183811015612a1a57fe5b9392505050565b60206040519081016040526000815290565b815481835581811511612a5757600083815260209020612a57918101908301612ada565b505050565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f10612a9d57805160ff1916838001178555612aca565b82800160010185558215612aca579182015b82811115612aca578251825591602001919060010190612aaf565b50612ad6929150612ada565b5090565b61101e91905b80821115612ad65760008155600101612ae05600a165627a7a723058206aae976c16e8c07327c074bb015463740b047fa06a6e0cd1b3b22c8e4f2a8f2a0029

Deployed Bytecode

0x6060604052600436106102795763ffffffff60e060020a60003504166302571be3811461027e57806302927d20146102b0578063048ae1bb146102e1578063085a4705146103035780630af3e660146103ad5780631286e393146103cc57806314712e2f146103eb578063161ff662146104185780631c8d5d38146104945780632a11ced0146104bc5780632f553d31146104d25780634592cd1d146104fc5780634637d8271461050f5780634d30b6be1461052e578063515c145714610550578063557f4bc9146105c357806357a96dd0146105e25780635aa77d3c146106555780635b7da33814610668578063638a9ce914610681578063648bf774146106a35780636713e230146106c85780636825c843146106ed578063691f3431146107035780636932af36146107905780636b4ed21b146107a657806383197ef0146107b95780639fda5b66146107cc578063a3ff0ea214610907578063a831751d146109c0578063a843c51f146109df578063a9612f72146109fe578063abafaa1614610a26578063b524abcf14610a4b578063bebcc04514610a61578063c4eeeeb914610a77578063c70bbc1314610a8d578063ca448a8814610ab2578063cb59646614610acb578063ccc11f1114610aea578063ccce413b14610b0c578063cdeb148514610b22578063ce606ee014610b67578063d54c8c8714610b7a578063d8f9659b14610ba5578063dc86e6f014610bff578063df26ca0814610c2b578063e0873c0614610c41578063e96b462a14610c5a578063ea14457e14610c7c578063ec77809f14610ca7578063ecac7f4b14610cc9578063f07629f814610cdc578063f0c06aa514610cef578063fd83915e14610d0e575b600080fd5b341561028957600080fd5b610294600435610d30565b604051600160a060020a03909116815260200160405180910390f35b34156102bb57600080fd5b6102cf600160a060020a0360043516610d5b565b60405190815260200160405180910390f35b34156102ec57600080fd5b6102cf600435600160a060020a0360243516610d98565b341561030e57600080fd5b6102cf600480359060248035919060649060443590810190830135806020601f8201819004810201604051908101604052818152929190602084018383808284378201915050505050509190803590602001908201803590602001908080601f0160208091040260200160405190810160405281815292919060208401838380828437509496505060ff853516946020013515159350610e6692505050565b34156103b857600080fd5b6102cf600160a060020a0360043516610e84565b34156103d757600080fd5b6102cf600160a060020a0360043516610e9f565b34156103f657600080fd5b6102cf600160a060020a03600435811690602435906044359060643516610edc565b341561042357600080fd5b6102cf600160a060020a0360048035821691602480359091169160443591606435919060a49060843590810190830135806020601f8201819004810201604051908101604052818152929190602084018383808284375094965050509235600160a060020a03169250610f29915050565b341561049f57600080fd5b6102cf600160a060020a0360043581169060243516604435610f82565b34156104c757600080fd5b610294600435610fa7565b34156104dd57600080fd5b6104e8600435610fc2565b604051901515815260200160405180910390f35b341561050757600080fd5b6104e8610fd6565b341561051a57600080fd5b6102cf600160a060020a0360043516611021565b341561053957600080fd5b6102cf600160a060020a03600435166024356110a6565b341561055b57600080fd5b6105c1600160a060020a0360048035821691602480359091169160443591606435919060a49060843590810190830135806020601f820181900481020160405190810160405281815292919060208401838380828437509496506110c395505050505050565b005b34156105ce57600080fd5b6104e8600160a060020a0360043516611179565b34156105ed57600080fd5b6102cf60048035600160a060020a03169060248035916044359160849060643590810190830135806020601f8201819004810201604051908101604052818152929190602084018383808284375094965050509235600160a060020a031692506111cc915050565b341561066057600080fd5b61029461120a565b341561067357600080fd5b6102cf600435602435611219565b341561068c57600080fd5b6102cf600160a060020a0360043516602435611239565b34156106ae57600080fd5b6102cf600160a060020a03600435811690602435166112cc565b34156106d357600080fd5b6104e8600160a060020a036004358116906024351661140e565b34156106f857600080fd5b610294600435611452565b341561070e57600080fd5b61071960043561146d565b60405160208082528190810183818151815260200191508051906020019080838360005b8381101561075557808201518382015260200161073d565b50505050905090810190601f1680156107825780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b341561079b57600080fd5b610294600435611533565b34156107b157600080fd5b6102cf61154e565b34156107c457600080fd5b6105c1611554565b34156107d757600080fd5b6107e2600435611579565b60405186815260208101869052821515608082015260ff821660a082015260c06040820181815286546002600019610100600184161502019091160491830182905290606083019060e08401908890801561087e5780601f106108535761010080835404028352916020019161087e565b820191906000526020600020905b81548152906001019060200180831161086157829003601f168201915b50508381038252865460026000196101006001841615020190911604808252602090910190879080156108f25780601f106108c7576101008083540402835291602001916108f2565b820191906000526020600020905b8154815290600101906020018083116108d557829003601f168201915b50509850505050505050505060405180910390f35b341561091257600080fd5b6102cf600480359060248035919060649060443590810190830135806020601f8201819004810201604051908101604052818152929190602084018383808284378201915050505050509190803590602001908201803590602001908080601f0160208091040260200160405190810160405281815292919060208401838380828437509496505050833560ff169360208101351515935060400135600160a060020a031691506115af9050565b34156109cb57600080fd5b6102cf600160a060020a03600435166117f1565b34156109ea57600080fd5b6104e8600160a060020a0360043516611832565b3415610a0957600080fd5b6105c1600160a060020a03600435811690602435166044356118a9565b3415610a3157600080fd5b6105c1600435602435600160a060020a03604435166118e9565b3415610a5657600080fd5b6102cf60043561192c565b3415610a6c57600080fd5b610719600435611941565b3415610a8257600080fd5b6104e86004356119d0565b3415610a9857600080fd5b6105c1600435602435600160a060020a03604435166119e8565b3415610abd57600080fd5b6102cf600435602435611a2b565b3415610ad657600080fd5b6104e8600160a060020a0360043516611b68565b3415610af557600080fd5b6104e8600160a060020a0360043516602435611b7d565b3415610b1757600080fd5b6102cf600435611bd9565b3415610b2d57600080fd5b610b4f6024600480358281019290820135918135918201910135604435611bf8565b60405191825260208201526040908101905180910390f35b3415610b7257600080fd5b610294611de5565b3415610b8557600080fd5b6105c1600160a060020a0360043581169060243516604435606435611df4565b3415610bb057600080fd5b6102cf600460248135818101908301358060208181020160405190810160405280939291908181526020018383602002808284375094965050509235600160a060020a03169250611e3c915050565b3415610c0a57600080fd5b610c15600435611f89565b60405160ff909116815260200160405180910390f35b3415610c3657600080fd5b6105c1600435611fa6565b3415610c4c57600080fd5b6102cf600435602435611fdc565b3415610c6557600080fd5b6104e8600160a060020a0360043516602435612127565b3415610c8757600080fd5b6105c1600160a060020a036004358116906024358116906044351661215a565b3415610cb257600080fd5b6102cf600435600160a060020a03602435166121b0565b3415610cd457600080fd5b6102cf612259565b3415610ce757600080fd5b61029461225f565b3415610cfa57600080fd5b6102cf600160a060020a036004351661226e565b3415610d1957600080fd5b6102cf600435600160a060020a03602435166122d4565b60008181526006602090815260408083205483526003909152902054600160a060020a03165b919050565b6000805433600160a060020a0390811691161415610d56575060098054600160a060020a038316600160a060020a03199091161790556001919050565b60008083610da63382611b7d565b15610e5e57610db4846123d3565b60008681526006602081815260408084208585529092019052808220805460ff19166001179055600954929450600160a060020a039092169163a9612f729190879089905160e060020a63ffffffff8616028152600160a060020a0393841660048201529190921660248201526044810191909152606401600060405180830381600087803b1515610e4557600080fd5b6102c65a03f11515610e5657600080fd5b505050600192505b505092915050565b6000610e77878787878787336115af565b90505b9695505050505050565b600160a060020a031660009081526004602052604090205490565b6000805433600160a060020a0390811691161415610d565750600160a060020a03166000908152600860205260409020805460ff19169055600190565b600082815260076020526040812054839033600160a060020a0390811691161415610f2057610f1d610f0d876123d3565b8686610f18876123d3565b61243e565b91505b50949350505050565b600083815260076020526040812054849033600160a060020a0390811691161415610f7757610f74610f5a89610e84565b610f63896123d3565b888888610f6f89610e84565b61262b565b91505b509695505050505050565b6000610f9f610f9085610e84565b610f9985610e84565b8461282c565b949350505050565b600360205260009081526040902054600160a060020a031681565b600090815260066020526040902054151590565b60015460009033600160a060020a03908116911614610ff75750600061101e565b506001805460008054600160a060020a0319908116600160a060020a038416179091551681555b90565b60008061102d336123d3565b905061103883610e84565b8114156110515761104a613a9961285a565b91506110a0565b61105b338461140e565b1561106b5761104a613aa361285a565b6000818152600360209081526040808320600160a060020a03871684526001908101909252909120805460ff19168217905591505b50919050565b60006110ba6110b484610e84565b83611219565b90505b92915050565b82600160a060020a038086169087167f8f1b83868d2ecc962fd90cfee71c9c52455fe10940937bc7571d90ba404c5c3b858560405182815260406020820181815290820183818151815260200191508051906020019080838360005b8381101561113757808201518382015260200161111f565b50505050905090810190601f1680156111645780820380516001836020036101000a031916815260200191505b50935050505060405180910390a45050505050565b6000805433600160a060020a0390811691161415610d5657600160a060020a03821615156111a957506000610d56565b5060018054600160a060020a038316600160a060020a0319909116178155919050565b600083815260076020526040812054849033600160a060020a0390811691161415611200576111fd610f5a84610e84565b91505b5095945050505050565b600154600160a060020a031681565b600090815260066020908152604080832093835260059093019052205490565b6000805433600160a060020a039081169116148061126f5750600160a060020a03331660009081526008602052604090205460ff165b156110bd57600082815260076020526040902054600160a060020a03161561129a5750613a986110bd565b5060008181526007602052604090208054600160a060020a038416600160a060020a0319909116179055600192915050565b60008083336112db828261140e565b15611405576112e985610e84565b15611300576112f9613aa461285a565b9350611405565b6003600061130d88610e84565b81526020810191909152604001600090812054600160a060020a03169350859060039061133989610e84565b815260208101919091526040016000208054600160a060020a031916600160a060020a039290921691909117905561137086610e84565b600160a060020a038087166000908152600460205260409081902092909255600954169063ea14457e908590889033905160e060020a63ffffffff8616028152600160a060020a03938416600482015291831660248301529091166044820152606401600060405180830381600087803b15156113ec57600080fd5b6102c65a03f115156113fd57600080fd5b505050600193505b50505092915050565b60006003600061141d85610e84565b815260208082019290925260409081016000908120600160a060020a038616825260010190925290205460ff16905092915050565b600090815260036020526040902054600160a060020a031690565b611475612a21565b6006600083600019166000191681526020019081526020016000206002018054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156115275780601f106114fc57610100808354040283529160200191611527565b820191906000526020600020905b81548152906001019060200180831161150a57829003601f168201915b50505050509050919050565b600760205260009081526040902054600160a060020a031681565b60025481565b60005433600160a060020a03908116911614156115775733600160a060020a0316ff5b565b60066020526000908152604090208054600182015460048301549192909160028201916003019060ff8082169161010090041686565b600080548190819033600160a060020a03908116911614806115e95750600160a060020a03331660009081526008602052604090205460ff165b156117e457881580156115fa575084155b156116115761160a613a9e61285a565b92506117e4565b61161a8a610fc2565b1561162a5761160a613a9d61285a565b611633846123d3565b915033600160a060020a031684600160a060020a03161461165c57611657336123d3565b61165e565b815b9050600580548060010182816116749190612a33565b5060009182526020909120018a905560c0604051908101604090815282825260208083018c90528183018b9052606083018a9052871515608084015260ff891660a084015260008d815260069091522081518155602082015181600101556040820151816002019080516116ec929160200190612a5c565b50606082015181600301908051611707929160200190612a5c565b50608082015160048201805460ff191691151591909117905560a08201516004909101805460ff929092166101000261ff00199092169190911790555060008a81526006602090815260408083208584526005019091529020899055600954600160a060020a031663abafaa168b8b61177f86611452565b60405160e060020a63ffffffff861602815260048101939093526024830191909152600160a060020a03166044820152606401600060405180830381600087803b15156117cb57600080fd5b6102c65a03f115156117dc57600080fd5b505050600192505b5050979650505050505050565b6000805433600160a060020a0390811691161415610d565750600160a060020a03166000908152600860205260409020805460ff1916600190811790915590565b6000805433600160a060020a0390811691161415610d5657600160a060020a038216151561186257506000610d56565b600154600160a060020a0316156118845760018054600160a060020a03191690555b5060008054600160a060020a038316600160a060020a03199091161790556001919050565b80600160a060020a038084169085167f0de92ba2d86c482d7f947cc22a580692bb78d6277988023434905f44b8cd261a60405160405180910390a4505050565b600160a060020a038116837fd03c2206e12a8eb3553d780874e1a7941b9c67f3a726ce6edb4a9fd65e25ec988460405190815260200160405180910390a3505050565b60009081526006602052604090206001015490565b611949612a21565b6006600083600019166000191681526020019081526020016000206003018054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156115275780601f106114fc57610100808354040283529160200191611527565b60009081526006602052604090206004015460ff1690565b600160a060020a038116837fa4e2520a41c90422e37fc8ba7153c519a427a62ea5f494a14a218a7b9bceb6ca8460405190815260200160405180910390a3505050565b60008080831515611a4857611a41613a9a61285a565b9250610e5e565b60008581526006602052604090209150611a6133610e84565b600081815260058401602052604090205490915084901015611a8857611a41613aa161285a565b6000818152600583016020526040902054611aa9908563ffffffff6128bf16565b60008281526005840160205260409020556001820154611acf908563ffffffff6128bf16565b6001830155600954600160a060020a031663c70bbc138686611af085611452565b60405160e060020a63ffffffff861602815260048101939093526024830191909152600160a060020a03166044820152606401600060405180830381600087803b1515611b3c57600080fd5b6102c65a03f11515611b4d57600080fd5b505050611b5d81600086886128d1565b506001949350505050565b60086020526000908152604090205460ff1681565b600080611b8984610e84565b9050611b9483610fc2565b8015610f9f5750600083815260066020526040902054811480610f9f57506000838152600660208181526040808420858552909201905290205460ff16949350505050565b6005805482908110611be757fe5b600091825260209091200154905081565b600080600080600080600087611c0e3382611b7d565b15611dd5578b8a14611c1f57600080fd5b881515611c2b57600080fd5b611c34336123d3565b955060009450600093505b8b84108015611c5057506201adb05a115b15611dcd578a8a85818110611c6157fe5b9050602002013592508260001415611c8457611c7e613a9a61285a565b50611dc2565b82611c8f878b611219565b1015611ca057611c7e613a9b61285a565b8c8c85818110611cac57fe5b90506020020135600160a060020a0316600160a060020a031633600160a060020a03161415611ce057611c7e613a9961285a565b611d048d8d86818110611cef57fe5b90506020020135600160a060020a03166123d3565b9150611d128683858c612988565b600954600160a060020a031663515c1457338f8f88818110611d3057fe5b90506020020135600160a060020a03168c8760405160e060020a63ffffffff8716028152600160a060020a0394851660048201529290931660248301526044820152606481019190915260a06084820152600060a4820181905260e49091019060405180830381600087803b1515611da757600080fd5b6102c65a03f11515611db857600080fd5b5050600190950194505b600190930192611c3f565b600185975097505b5050505050509550959350505050565b600054600160a060020a031681565b81600160a060020a038085169086167f859b1cddb4da93a04541d62c27d7d83aa8173a1b37bbccd3c60ceb4ee19ee13e8460405190815260200160405180910390a450505050565b6000805481908190819033600160a060020a039081169116141561140557600092505b8551831015611f7d57858381518110611e7457fe5b90602001906020020151915081600160a060020a03166370a082313060006040516020015260405160e060020a63ffffffff8416028152600160a060020a039091166004820152602401602060405180830381600087803b1515611ed757600080fd5b6102c65a03f11515611ee857600080fd5b50505060405180519150508015611f725781600160a060020a031663a9059cbb868360006040516020015260405160e060020a63ffffffff8516028152600160a060020a0390921660048301526024820152604401602060405180830381600087803b1515611f5657600080fd5b6102c65a03f11515611f6757600080fd5b505050604051805150505b600190920191611e5f565b50600195945050505050565b600090815260066020526040902060040154610100900460ff1690565b7f2e36a7093f25f22bd4cbdeb6040174c3ba4c5fe8f1abc04e7c3c48f26c7413e08160405190815260200160405180910390a150565b600080600084611fec3382611b7d565b1561140557841515612003576112f9613a9a61285a565b6000868152600660205260409020600481015490935060ff16151561202d576112f9613a9f61285a565b60018301548581011015612046576112f9613aa061285a565b61204f33610e84565b6000818152600585016020526040902054909250612073908663ffffffff612a0b16565b60008381526005850160205260409020556001830154612099908663ffffffff612a0b16565b6001840155600954600160a060020a031663abafaa1687876120ba86611452565b60405160e060020a63ffffffff861602815260048101939093526024830191909152600160a060020a03166044820152606401600060405180830381600087803b151561210657600080fd5b6102c65a03f1151561211757600080fd5b505050611f7d60008387896128d1565b600061213282610fc2565b80156110ba575061214283610e84565b60008381526006602052604090205414905092915050565b81600160a060020a031683600160a060020a03167f6c0468512076e943ed3d1c5aae1d6903c72162713d86aedd1381b3ac19e10cec83604051600160a060020a03909116815260200160405180910390a3505050565b600080836121be3382611b7d565b15610e5e576121cc84610e84565b60008681526006602081815260408084208585529092019052808220805460ff19169055600954929450600160a060020a039092169163a9612f7291879189905160e060020a63ffffffff8616028152600160a060020a0393841660048201529190921660248201526044810191909152606401600060405180830381600087803b1515610e4557600080fd5b60055490565b600954600160a060020a031681565b6000338261227c828261140e565b156122cd5760006003600061229033610e84565b815260208082019290925260409081016000908120600160a060020a0389168252600190810190935220805460ff19169215159290921790915592505b5050919050565b600080600080856122e53382612127565b156123c957600160a060020a038616151561230c57612305613aa261285a565b94506123c9565b60008781526006602052604090209350612325866123d3565b845490935083141561233c57612305613a9961285a565b835461234790611452565b838555600954909250600160a060020a031663a9612f7283888a60405160e060020a63ffffffff8616028152600160a060020a0393841660048201529190921660248201526044810191909152606401600060405180830381600087803b15156123b057600080fd5b6102c65a03f115156123c157600080fd5b505050600194505b5050505092915050565b600160a060020a0381166000908152600460205260408120548015156110bd5750600280546001019081905560008181526003602090815260408083208054600160a060020a031916600160a060020a03881690811790915583526004909152902081905592915050565b600061244983610fc2565b15156124615761245a613aa561285a565b9050610f9f565b848214156124745761245a613a9961285a565b60008381526006602090815260408083208584526005018252808320888452600101909152902054158015906124a957508315155b156124b95761245a613aa961285a565b600083815260066020908152604080832085845260050182528083208884526001019091529020849055600954600160a060020a031663d54c8c876124fd84611452565b61250688611452565b868860405160e060020a63ffffffff8716028152600160a060020a03948516600482015292909316602483015260448201526064810191909152608401600060405180830381600087803b151561255c57600080fd5b6102c65a03f1151561256d57600080fd5b505050600083815260076020526040902054600160a060020a031615611b5d57600083815260076020526040902054600160a060020a031663233850896125b384611452565b6125bc88611452565b8760405160e060020a63ffffffff8616028152600160a060020a0393841660048201529190921660248201526044810191909152606401600060405180830381600087803b151561260c57600080fd5b6102c65a03f1151561261d57600080fd5b505050506001949350505050565b60008587141561264757612640613a9961285a565b9050610e7a565b84151561265957612640613a9a61285a565b846126648886611219565b101561267557612640613a9b61285a565b81871415801561268e57508461268c88848761282c565b105b1561269e57612640613a9c61285a565b6126aa87878787612988565b8682146127125760008481526006602090815260408083208a845260050182528083208584526001019091529020546126e9908663ffffffff6128bf16565b60008581526006602090815260408083208b845260050182528083208684526001019091529020555b600954600160a060020a031663515c145761272c89611452565b61273589611452565b87898860405160e060020a63ffffffff8816028152600160a060020a03808716600483019081529086166024830152604482018590526064820184905260a060848301908152909160a40183818151815260200191508051906020019080838360005b838110156127b0578082015183820152602001612798565b50505050905090810190601f1680156127dd5780820380516001836020036101000a031916815260200191505b509650505050505050600060405180830381600087803b15156127ff57600080fd5b6102c65a03f1151561281057600080fd5b50505061281f878787876128d1565b5060019695505050505050565b6000908152600660209081526040808320948352600590940181528382209282526001909201909152205490565b600954600090600160a060020a031663df26ca088360405160e060020a63ffffffff84160281526004810191909152602401600060405180830381600087803b15156128a557600080fd5b6102c65a03f115156128b657600080fd5b50929392505050565b6000828211156128cb57fe5b50900390565b600081815260076020526040902054600160a060020a03161561298257600081815260076020526040902054600160a060020a03166323de665161291486611452565b61291d86611452565b8560405160e060020a63ffffffff8616028152600160a060020a0393841660048201529190921660248201526044810191909152606401600060405180830381600087803b151561296d57600080fd5b6102c65a03f1151561297e57600080fd5b5050505b50505050565b60008181526006602090815260408083208784526005019091529020546129b5908363ffffffff6128bf16565b60008281526006602090815260408083208884526005019091528082209290925584815220546129e59083612a0b565b600091825260066020908152604080842095845260059095019052929020919091555050565b600082820183811015612a1a57fe5b9392505050565b60206040519081016040526000815290565b815481835581811511612a5757600083815260209020612a57918101908301612ada565b505050565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f10612a9d57805160ff1916838001178555612aca565b82800160010185558215612aca579182015b82811115612aca578251825591602001919060010190612aaf565b50612ad6929150612ada565b5090565b61101e91905b80821115612ad65760008155600101612ae05600a165627a7a723058206aae976c16e8c07327c074bb015463740b047fa06a6e0cd1b3b22c8e4f2a8f2a0029

Swarm Source

bzzr://6aae976c16e8c07327c074bb015463740b047fa06a6e0cd1b3b22c8e4f2a8f2a

Block Transaction Difficulty Gas Used Reward
View All Blocks Produced

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

Validator Index Block Amount
View All Withdrawals

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

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.