Sponsored:   Ubex.com - Additional 17% of tokens are available for purchase! Trading on exchanges already started.
 Latest 25 txns from a total Of 39797 transactions

TxHash Age From To Value [TxFee]
0x7fc884e34ea64f5a9a4badbbed8e955b8f8581ad1fec110c13319591464118c83 hrs 51 mins ago0x4ac6fd7a9f9b906135d67aee7da90869063176fb  IN   TimeToken0 Ether0.00050309
0x881ee7cb9bccbfa0ef53fb9e377c3ec4d008ff79fe399c99c564fd67d390ffbf3 hrs 51 mins ago0x6003f2f988e7ca5bde21b975068effe4fed7436c  IN   TimeToken0 Ether0.00050245
0xa41dfd8e3437be178b18af66098b9e49ad181d5e254e641f7bda50007a26a7463 hrs 51 mins ago0x5161dcbc47740ffd3ce9b00bb32189edf354c006  IN   TimeToken0 Ether0.00050309
0x64a477af32572140f4948b9e71aa376c4f5c34025d488d0ec7dfb7b1540dee0d3 hrs 51 mins ago0xab71cf6fb9d656c4e9b9d6b6964ec6b6e3351535  IN   TimeToken0 Ether0.00050309
0x7e0190439e0c93e95f7d0a1e584b38aeeb0222935666ad2407d7655778b75b9e3 hrs 51 mins ago0xd75d765fbb98cfc93d1b1812a00a2bfa41da93d9  IN   TimeToken0 Ether0.00050309
0x4e851aa7cbc64cb8f399baac1a0dc812aa86bf71680b30423f2de63f5a4412e03 hrs 51 mins ago0x7568256da79eefd156df288100687439cc1efd11  IN   TimeToken0 Ether0.00050309
0x46dda28cf61c1bee1766b0817873b8d2cb60b3af2b50654c6aab0e68ad12dd523 hrs 51 mins ago0x141f8634067e6187b7bf81ad36653accff584696  IN   TimeToken0 Ether0.00050309
0x560a871c389f25ca7381b4578c16006770690dcc25de7a35489041327b99a8c03 hrs 51 mins ago0x1b2256cd36b32a759ab696e344b784c42915e875  IN   TimeToken0 Ether0.00050309
0x37117be7a05f0162e2252dd1f3b4e8996c959883f108ca817ba31ee98776873d3 hrs 51 mins ago0xd302126e09e8b350d4800bc4b80e92500bd6dd4a  IN   TimeToken0 Ether0.00050309
0x22e4caa8b1c344d4e1b8e616a38d83579dbbb0b1f9e33b2da871b8970a74af473 hrs 51 mins ago0x384707bc5531cac23e75042f685f142cf31ae144  IN   TimeToken0 Ether0.00050309
0x57c408a2c3a9ecb1299f14e3e09058216efc73a23591445751b70c18a248dceb3 hrs 51 mins ago0xd5a7d236187f035b255233fc5d63d30ffd6a8375  IN   TimeToken0 Ether0.00050245
0x6df9d43e1aa04910fdea4156bb1dd6f47dc2bf0ff73a0195f3431a6a4e4c844b3 hrs 51 mins ago0x02c2e38798deefa94fc6db7282086f182851e70e  IN   TimeToken0 Ether0.00050245
0xe69530381e19c5f0feaff9dfeec8f8849c2b0351e0abc3b406cb09e2f821b82e3 hrs 52 mins ago0x5c995072612a738ffc0ddf47bc6267909fdd52ca  IN   TimeToken0 Ether0.00050309
0x3b08b699095a84179e8b4dce04238623f11663569b3ecbe0789e1573b919a3be3 hrs 52 mins ago0x5b0f5491ad3218c38b62af7e65de80cdd4f33f8f  IN   TimeToken0 Ether0.00050309
0xac8a78b8ce4d1c6ddb9f624086857230726c33541668c2f1c3eca6c635c12adb3 hrs 52 mins ago0xce06071324cfb84c8548e2319f7bae4576ec48f8  IN   TimeToken0 Ether0.00050309
0x09e6059707f99145c83f52daa829cab782fa0d60f70fabb3aa898189ac6a20183 hrs 52 mins ago0x7ae95ec19cb393f8aed7e429c51a576c489f5e82  IN   TimeToken0 Ether0.00050309
0xf89455cd6e39459684c3b5fd3399a177e15e29cde5b6240065e5d30baa4b707d3 hrs 52 mins ago0x4cb5d4f3563def34b6593f42d45e585eadab955f  IN   TimeToken0 Ether0.00050309
0x4342aa2dd107cc860aacb33441ca758cee4ed22244be6e5d827c7ad10499a66e3 hrs 52 mins ago0xea1aabf5b8dd0d1e15ad4ea4647a22b82f1c590b  IN   TimeToken0 Ether0.00050309
0xf4521b0d2018323578f864fceb9a34918a9b0ed0b205a0e5d288924b995e5e7d3 hrs 52 mins ago0xcdb7e1b54dfdfc14fa870dfd10b0ccec4d34d5d8  IN   TimeToken0 Ether0.00050309
0x6757fbdd94117e80ea1495357f5a1694153d060d7482d9562171229ef968a0ac3 hrs 52 mins ago0x23133bc3fcbaf4c0bdaf533b8a5008b27e6cef18  IN   TimeToken0 Ether0.00050309
0x9d2ad59610168739b908a70b6e6d9e00cf43dc8e0188d6bc36b267306c18d2ad3 hrs 52 mins ago0x516860cfbf0160ab40db90d2c62a19c32348c5dc  IN   TimeToken0 Ether0.00050309
0xf6e9a521b26178508b1f9573296c1db792e1635caa1b25a3dc42699f0fbf71d03 hrs 52 mins ago0x19448b28a259b08ec38ec5c8226c9c97ba0f50e3  IN   TimeToken0 Ether0.00050245
0x783e5c9649492bc69b34405b194a8e7179e7abc26a499f0c1eaae066ae3b439f3 hrs 52 mins ago0xca9f60bb6cdd60e104a446df22329252925e76a2  IN   TimeToken0 Ether0.00050309
0x8646b4874c1d57eaabb977adee460aa14d143e0fc3c002eaffbf0940411a37733 hrs 52 mins ago0xd49994b003fc7c3c4b43948ef82ca1b66598cb1d  IN   TimeToken0 Ether0.00050245
0x0542154821c9061555b81297cfae8ea9d953d722df547d532222e43451b9e4dd3 hrs 52 mins ago0xe34ae0e91dfea6a9be045b3b8d6f18925250e301  IN   TimeToken0 Ether0.00050309
[ Download CSV Export  ] 
 Internal Transactions as a result of Contract Execution
 Latest 7 Internal Transactions

ParentTxHash Block Age From To Value
0xf16e5433861187599a10426b8a0f055bd10526278b67bb5106ae7ef294cc86ed571905374 days 2 hrs ago0x6531f133e6deebe7f2dce5a0441aa7ef330b4e530xc7c5d612536d167627b217d08b9ff05da1db75f70.00001 Ether
0xdc2766b869becb713d745f4d25b6d54a164e8e625e9286cb8da423e4996edb275464215118 days 18 hrs ago0x6531f133e6deebe7f2dce5a0441aa7ef330b4e530xc7c5d612536d167627b217d08b9ff05da1db75f70.0001 Ether
0x2e44db16c044eb67c5b38f3700888bcd17327449967e04d52c1a33396b41844e4428323293 days 19 hrs ago0x6531f133e6deebe7f2dce5a0441aa7ef330b4e530xc7c5d612536d167627b217d08b9ff05da1db75f70.1 Ether
0xa0d83ea9dd907a300465b216d8030145591ac7b78a58988977b14c950c9a97a14047981391 days 3 hrs ago0x6531f133e6deebe7f2dce5a0441aa7ef330b4e530xc7c5d612536d167627b217d08b9ff05da1db75f70.5322793419465383 Ether
0xbe1be1167a4083652139a21c1ee9d748141fd0f03020666be897815e1bc364f13571442481 days 14 hrs ago0x6531f133e6deebe7f2dce5a0441aa7ef330b4e530xc7c5d612536d167627b217d08b9ff05da1db75f70.01 Ether
0x86765cced8fb36548918ec38a83b8bb41e16ddcc57ef9e9457888a49819c49603536272487 days 15 hrs ago0x6531f133e6deebe7f2dce5a0441aa7ef330b4e530xc7c5d612536d167627b217d08b9ff05da1db75f70.01305335 Ether
0x4002d7bb787f44ab09c9f408008c90e56508d2fcab7198e2cc3aa9d87039242c3500061493 days 21 hrs ago0x6531f133e6deebe7f2dce5a0441aa7ef330b4e530xc7c5d612536d167627b217d08b9ff05da1db75f71 Ether
[ Download CSV Export  ] 
Warning: The compiled contract might be susceptible to ZeroFunctionSelector (very low-severity), DelegateCallReturnValue (low-severity), ECRecoverMalformedInput (medium-severity), SkipEmptyStringLiteral (low-severity), ConstantOptimizerSubtraction (low-severity) Solidity compiler bugs.

Contract Source Code Verified (Exact match)
Contract Name: ChronoBankAssetProxy
Compiler Version: v0.4.8+commit.60cc1668
Optimization Enabled: Yes
Runs (Optimiser):  200



  Contract Source Code   Find Similiar Contracts

pragma solidity ^0.4.4;

contract Owned {
    address public contractOwner;
    address public pendingContractOwner;

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

    modifier onlyContractOwner() {
        if (contractOwner == msg.sender) {
            _;
        }
    }

    /**
     * Prepares ownership pass.
     *
     * Can only be called by current owner.
     *
     * @param _to address of the next owner.
     *
     * @return success.
     */
    function changeContractOwnership(address _to) onlyContractOwner() returns(bool) {
        pendingContractOwner = _to;
        return true;
    }

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


contract Emitter {
    function emitTransfer(address _from, address _to, bytes32 _symbol, uint _value, string _reference);
    function emitIssue(bytes32 _symbol, uint _value, address _by);
    function emitRevoke(bytes32 _symbol, uint _value, address _by);
    function emitOwnershipChange(address _from, address _to, bytes32 _symbol);
    function emitApprove(address _from, address _spender, bytes32 _symbol, uint _value);
    function emitRecovery(address _from, address _to, address _by);
    function emitError(bytes32 _message);
}

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

/**
 * @title ChronoBank Platform.
 *
 * The official ChronoBank assets platform powering TIME and LHT tokens, and possibly
 * other unknown tokens needed later.
 * Platform uses EventsHistory 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 ChronoBankPlatform is Owned {
    // 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 of fixed supply.
        uint8 baseUnit;                   // Proposed number of decimals.
        mapping(uint => Wallet) wallets;  // Holders wallets.
    }

    // 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;

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

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

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

    /**
     * Emits Error event with specified error message.
     *
     * Should only be used if no state changes happened.
     *
     * @param _message error message.
     */
    function _error(bytes32 _message) internal {
        eventsHistory.emitError(_message);
    }

    /**
     * Sets EventsHstory contract address.
     *
     * Can be set only once, and only by contract owner.
     *
     * @param _eventsHistory EventsHistory contract address.
     *
     * @return success.
     */
    function setupEventsHistory(address _eventsHistory) onlyContractOwner() returns(bool) {
        if (address(eventsHistory) != 0) {
            return false;
        }
        eventsHistory = Emitter(_eventsHistory);
        return true;
    }

    /**
     * Emits Error if called not by asset owner.
     */
    modifier onlyOwner(bytes32 _symbol) {
        if (isOwner(msg.sender, _symbol)) {
            _;
        } else {
            _error("Only owner: access denied");
        }
    }

    /**
     * Emits Error if called not by asset proxy.
     */
    modifier onlyProxy(bytes32 _symbol) {
        if (proxies[_symbol] == msg.sender) {
            _;
        } else {
            _error("Only proxy: access denied");
        }
    }

    /**
     * Emits Error if _from doesn't trust _to.
     */
    modifier checkTrust(address _from, address _to) {
        if (isTrusted(_from, _to)) {
            _;
        } else {
            _error("Only trusted: access denied");
        }
    }

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

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

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

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

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

    /**
     * Returns asset owner address.
     *
     * @param _symbol asset symbol.
     *
     * @return asset owner address.
     */
    function owner(bytes32 _symbol) constant 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) constant returns(bool) {
        return isCreated(_symbol) && (assets[_symbol].owner == getHolderId(_owner));
    }

    /**
     * Returns asset total supply.
     *
     * @param _symbol asset symbol.
     *
     * @return asset total supply.
     */
    function totalSupply(bytes32 _symbol) constant 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) constant 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) constant 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) constant returns(address) {
        return holders[_holderId].addr;
    }

    /**
     * Sets Proxy contract address for a particular asset.
     *
     * Can be set only once for each asset, and only by contract owner.
     *
     * @param _address Proxy contract address.
     * @param _symbol asset symbol.
     *
     * @return success.
     */
    function setProxy(address _address, bytes32 _symbol) onlyContractOwner() returns(bool) {
        if (proxies[_symbol] != 0x0) {
            return false;
        }
        proxies[_symbol] = _address;
        return true;
    }

    /**
     * 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 -= _value;
        assets[_symbol].wallets[_toId].balance += _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(bool) {
        // Should not allow to send to oneself.
        if (_fromId == _toId) {
            _error("Cannot send to oneself");
            return false;
        }
        // Should have positive value.
        if (_value == 0) {
            _error("Cannot send 0 value");
            return false;
        }
        // Should have enough balance.
        if (_balanceOf(_fromId, _symbol) < _value) {
            _error("Insufficient balance");
            return false;
        }
        // Should have enough allowance.
        if (_fromId != _senderId && _allowance(_fromId, _senderId, _symbol) < _value) {
            _error("Not enough allowance");
            return false;
        }
        _transferDirect(_fromId, _toId, _value, _symbol);
        // Adjust allowance.
        if (_fromId != _senderId) {
            assets[_symbol].wallets[_fromId].allowance[_senderId] -= _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.
        eventsHistory.emitTransfer(_address(_fromId), _address(_toId), _symbol, _value, _reference);
        _proxyTransferEvent(_fromId, _toId, _value, _symbol);
        return true;
    }

    /**
     * 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) onlyProxy(_symbol) returns(bool) {
        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.
            Proxy(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) constant 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) onlyContractOwner() returns(bool) {
        // Should have positive value if supply is going to be fixed.
        if (_value == 0 && !_isReissuable) {
            _error("Cannot issue 0 value fixed asset");
            return false;
        }
        // Should not be issued yet.
        if (isCreated(_symbol)) {
            _error("Asset already issued");
            return false;
        }
        uint holderId = _createHolderId(msg.sender);

        assets[_symbol] = Asset(holderId, _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.
        eventsHistory.emitIssue(_symbol, _value, _address(holderId));
        return true;
    }

    /**
     * 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) onlyOwner(_symbol) returns(bool) {
        // Should have positive value.
        if (_value == 0) {
            _error("Cannot reissue 0 value");
            return false;
        }
        Asset asset = assets[_symbol];
        // Should have dynamic supply.
        if (!asset.isReissuable) {
            _error("Cannot reissue fixed asset");
            return false;
        }
        // Resulting total supply should not overflow.
        if (asset.totalSupply + _value < asset.totalSupply) {
            _error("Total supply overflow");
            return false;
        }
        uint holderId = getHolderId(msg.sender);
        asset.wallets[holderId].balance += _value;
        asset.totalSupply += _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.
        eventsHistory.emitIssue(_symbol, _value, _address(holderId));
        _proxyTransferEvent(0, holderId, _value, _symbol);
        return true;
    }

    /**
     * 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) returns(bool) {
        // Should have positive value.
        if (_value == 0) {
            _error("Cannot revoke 0 value");
            return false;
        }
        Asset asset = assets[_symbol];
        uint holderId = getHolderId(msg.sender);
        // Should have enough tokens.
        if (asset.wallets[holderId].balance < _value) {
            _error("Not enough tokens to revoke");
            return false;
        }
        asset.wallets[holderId].balance -= _value;
        asset.totalSupply -= _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.
        eventsHistory.emitRevoke(_symbol, _value, _address(holderId));
        _proxyTransferEvent(holderId, 0, _value, _symbol);
        return true;
    }

    /**
     * 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) onlyOwner(_symbol) returns(bool) {
        Asset asset = assets[_symbol];
        uint newOwnerId = _createHolderId(_newOwner);
        // Should pass ownership to another holder.
        if (asset.owner == newOwnerId) {
            _error("Cannot pass ownership to oneself");
            return false;
        }
        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.
        eventsHistory.emitOwnershipChange(oldOwner, _address(newOwnerId), _symbol);
        return true;
    }

    /**
     * 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) constant 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) returns(bool) {
        uint fromId = _createHolderId(msg.sender);
        // Should trust to another address.
        if (fromId == getHolderId(_to)) {
            _error("Cannot trust to oneself");
            return false;
        }
        // Should trust to yet untrusted.
        if (isTrusted(msg.sender, _to)) {
            _error("Already trusted");
            return false;
        }
        holders[fromId].trust[_to] = true;
        return true;
    }

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

    /**
     * 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) returns(bool) {
        // Should recover to previously unused address.
        if (getHolderId(_to) != 0) {
            _error("Should recover to new address");
            return false;
        }
        // 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.
        eventsHistory.emitRecovery(from, _to, msg.sender);
        return true;
    }

    /**
     * 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(bool) {
        // Asset should exist.
        if (!isCreated(_symbol)) {
            _error("Asset is not issued");
            return false;
        }
        // Should allow to another holder.
        if (_senderId == _spenderId) {
            _error("Cannot approve to oneself");
            return false;
        }
        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.
        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.
            Proxy(proxies[_symbol]).emitApprove(_address(_senderId), _address(_spenderId), _value);
        }
        return true;
    }

    /**
     * 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) returns(bool) {
        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) constant 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) constant internal 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) returns(bool) {
        return _transfer(getHolderId(_from), _createHolderId(_to), _value, _symbol, _reference, getHolderId(_sender));
    }
}

contract ChronoBankAsset {
    function __transferWithReference(address _to, uint _value, string _reference, address _sender) returns(bool);
    function __transferFromWithReference(address _from, address _to, uint _value, string _reference, address _sender) returns(bool);
    function __approve(address _spender, uint _value, address _sender) returns(bool);
    function __process(bytes _data, address _sender) payable {
        throw;
    }
}

contract ERC20 {
    event Transfer(address indexed from, address indexed to, uint256 value);
    event Approval(address indexed from, address indexed spender, uint256 value);

    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);
}

contract ChronoBankAssetProxy is ERC20 {
    // Assigned platform, immutable.
    ChronoBankPlatform public chronoBankPlatform;

    // Assigned symbol, immutable.
    bytes32 smbl;

    // Assigned name, immutable.
    string public name;

    string public symbol;

    /**
     * Sets platform address, assigns symbol and name.
     *
     * Can be set only once.
     *
     * @param _chronoBankPlatform platform contract address.
     * @param _symbol assigned symbol.
     * @param _name assigned name.
     *
     * @return success.
     */
    function init(ChronoBankPlatform _chronoBankPlatform, string _symbol, string _name) returns(bool) {
        if (address(chronoBankPlatform) != 0x0) {
            return false;
        }
        chronoBankPlatform = _chronoBankPlatform;
        symbol = _symbol;
        smbl = stringToBytes32(_symbol);
        name = _name;
        return true;
    }

function stringToBytes32(string memory source) returns (bytes32 result) {
    assembly {
        result := mload(add(source, 32))
    }
}

    /**
     * Only platform is allowed to call.
     */
    modifier onlyChronoBankPlatform() {
        if (msg.sender == address(chronoBankPlatform)) {
            _;
        }
    }

    /**
     * Only current asset owner is allowed to call.
     */
    modifier onlyAssetOwner() {
        if (chronoBankPlatform.isOwner(msg.sender, smbl)) {
            _;
        }
    }

    /**
     * Returns asset implementation contract for current caller.
     *
     * @return asset implementation contract.
     */
    function _getAsset() internal returns(ChronoBankAsset) {
        return ChronoBankAsset(getVersionFor(msg.sender));
    }

    /**
     * Returns asset total supply.
     *
     * @return asset total supply.
     */
    function totalSupply() constant returns(uint) {
        return chronoBankPlatform.totalSupply(smbl);
    }

    /**
     * Returns asset balance for a particular holder.
     *
     * @param _owner holder address.
     *
     * @return holder balance.
     */
    function balanceOf(address _owner) constant returns(uint) {
        return chronoBankPlatform.balanceOf(_owner, smbl);
    }

    /**
     * Returns asset allowance from one holder to another.
     *
     * @param _from holder that allowed spending.
     * @param _spender holder that is allowed to spend.
     *
     * @return holder to spender allowance.
     */
    function allowance(address _from, address _spender) constant returns(uint) {
        return chronoBankPlatform.allowance(_from, _spender, smbl);
    }

    /**
     * Returns asset decimals.
     *
     * @return asset decimals.
     */
    function decimals() constant returns(uint8) {
        return chronoBankPlatform.baseUnit(smbl);
    }

    /**
     * Transfers asset balance from the caller to specified receiver.
     *
     * @param _to holder address to give to.
     * @param _value amount to transfer.
     *
     * @return success.
     */
    function transfer(address _to, uint _value) returns(bool) {
        return _transferWithReference(_to, _value, "");
    }

    /**
     * Transfers asset balance from the caller to specified receiver adding specified comment.
     *
     * @param _to holder address to give to.
     * @param _value amount to transfer.
     * @param _reference transfer comment to be included in a platform's Transfer event.
     *
     * @return success.
     */
    function transferWithReference(address _to, uint _value, string _reference) returns(bool) {
        return _transferWithReference(_to, _value, _reference);
    }

    /**
     * Resolves asset implementation contract for the caller and forwards there arguments along with
     * the caller address.
     *
     * @return success.
     */
    function _transferWithReference(address _to, uint _value, string _reference) internal returns(bool) {
        return _getAsset().__transferWithReference(_to, _value, _reference, msg.sender);
    }

    /**
     * Performs transfer call on the platform by the name of specified sender.
     *
     * Can only be called by asset implementation contract assigned to sender.
     *
     * @param _to holder address to give to.
     * @param _value amount to transfer.
     * @param _reference transfer comment to be included in a platform's Transfer event.
     * @param _sender initial caller.
     *
     * @return success.
     */
    function __transferWithReference(address _to, uint _value, string _reference, address _sender) onlyAccess(_sender) returns(bool) {
        return chronoBankPlatform.proxyTransferWithReference(_to, _value, smbl, _reference, _sender);
    }

    /**
     * Prforms allowance transfer of asset balance between holders.
     *
     * @param _from holder address to take from.
     * @param _to holder address to give to.
     * @param _value amount to transfer.
     *
     * @return success.
     */
    function transferFrom(address _from, address _to, uint _value) returns(bool) {
        return _transferFromWithReference(_from, _to, _value, "");
    }

    /**
     * Prforms allowance transfer of asset balance between holders adding specified comment.
     *
     * @param _from holder address to take from.
     * @param _to holder address to give to.
     * @param _value amount to transfer.
     * @param _reference transfer comment to be included in a platform's Transfer event.
     *
     * @return success.
     */
    function transferFromWithReference(address _from, address _to, uint _value, string _reference) returns(bool) {
        return _transferFromWithReference(_from, _to, _value, _reference);
    }

    /**
     * Resolves asset implementation contract for the caller and forwards there arguments along with
     * the caller address.
     *
     * @return success.
     */
    function _transferFromWithReference(address _from, address _to, uint _value, string _reference) internal returns(bool) {
        return _getAsset().__transferFromWithReference(_from, _to, _value, _reference, msg.sender);
    }

    /**
     * Performs allowance transfer call on the platform by the name of specified sender.
     *
     * Can only be called by asset implementation contract assigned to sender.
     *
     * @param _from holder address to take from.
     * @param _to holder address to give to.
     * @param _value amount to transfer.
     * @param _reference transfer comment to be included in a platform's Transfer event.
     * @param _sender initial caller.
     *
     * @return success.
     */
    function __transferFromWithReference(address _from, address _to, uint _value, string _reference, address _sender) onlyAccess(_sender) returns(bool) {
        return chronoBankPlatform.proxyTransferFromWithReference(_from, _to, _value, smbl, _reference, _sender);
    }

    /**
     * Sets asset spending allowance for a specified spender.
     *
     * @param _spender holder address to set allowance to.
     * @param _value amount to allow.
     *
     * @return success.
     */
    function approve(address _spender, uint _value) returns(bool) {
        return _approve(_spender, _value);
    }

    /**
     * Resolves asset implementation contract for the caller and forwards there arguments along with
     * the caller address.
     *
     * @return success.
     */
    function _approve(address _spender, uint _value) internal returns(bool) {
        return _getAsset().__approve(_spender, _value, msg.sender);
    }

    /**
     * Performs allowance setting call on the platform by the name of specified sender.
     *
     * Can only be called by asset implementation contract assigned to sender.
     *
     * @param _spender holder address to set allowance to.
     * @param _value amount to allow.
     * @param _sender initial caller.
     *
     * @return success.
     */
    function __approve(address _spender, uint _value, address _sender) onlyAccess(_sender) returns(bool) {
        return chronoBankPlatform.proxyApprove(_spender, _value, smbl, _sender);
    }

    /**
     * Emits ERC20 Transfer event on this contract.
     *
     * Can only be, and, called by assigned platform when asset transfer happens.
     */
    function emitTransfer(address _from, address _to, uint _value) onlyChronoBankPlatform() {
        Transfer(_from, _to, _value);
    }

    /**
     * Emits ERC20 Approval event on this contract.
     *
     * Can only be, and, called by assigned platform when asset allowance set happens.
     */
    function emitApprove(address _from, address _spender, uint _value) onlyChronoBankPlatform() {
        Approval(_from, _spender, _value);
    }

    /**
     * Resolves asset implementation contract for the caller and forwards there transaction data,
     * along with the value. This allows for proxy interface growth.
     */
    function () payable {
        _getAsset().__process.value(msg.value)(msg.data, msg.sender);
    }

    /**
     * Indicates an upgrade freeze-time start, and the next asset implementation contract.
     */
    event UpgradeProposal(address newVersion);

    // Current asset implementation contract address.
    address latestVersion;

    // Proposed next asset implementation contract address.
    address pendingVersion;

    // Upgrade freeze-time start.
    uint pendingVersionTimestamp;

    // Timespan for users to review the new implementation and make decision.
    uint constant UPGRADE_FREEZE_TIME = 3 days;

    // Asset implementation contract address that user decided to stick with.
    // 0x0 means that user uses latest version.
    mapping(address => address) userOptOutVersion;

    /**
     * Only asset implementation contract assigned to sender is allowed to call.
     */
    modifier onlyAccess(address _sender) {
        if (getVersionFor(_sender) == msg.sender) {
            _;
        }
    }

    /**
     * Returns asset implementation contract address assigned to sender.
     *
     * @param _sender sender address.
     *
     * @return asset implementation contract address.
     */
    function getVersionFor(address _sender) constant returns(address) {
        return userOptOutVersion[_sender] == 0 ? latestVersion : userOptOutVersion[_sender];
    }

    /**
     * Returns current asset implementation contract address.
     *
     * @return asset implementation contract address.
     */
    function getLatestVersion() constant returns(address) {
        return latestVersion;
    }

    /**
     * Returns proposed next asset implementation contract address.
     *
     * @return asset implementation contract address.
     */
    function getPendingVersion() constant returns(address) {
        return pendingVersion;
    }

    /**
     * Returns upgrade freeze-time start.
     *
     * @return freeze-time start.
     */
    function getPendingVersionTimestamp() constant returns(uint) {
        return pendingVersionTimestamp;
    }

    /**
     * Propose next asset implementation contract address.
     *
     * Can only be called by current asset owner.
     *
     * Note: freeze-time should not be applied for the initial setup.
     *
     * @param _newVersion asset implementation contract address.
     *
     * @return success.
     */
    function proposeUpgrade(address _newVersion) onlyAssetOwner() returns(bool) {
        // Should not already be in the upgrading process.
        if (pendingVersion != 0x0) {
            return false;
        }
        // New version address should be other than 0x0.
        if (_newVersion == 0x0) {
            return false;
        }
        // Don't apply freeze-time for the initial setup.
        if (latestVersion == 0x0) {
            latestVersion = _newVersion;
            return true;
        }
        pendingVersion = _newVersion;
        pendingVersionTimestamp = now;
        UpgradeProposal(_newVersion);
        return true;
    }

    /**
     * Cancel the pending upgrade process.
     *
     * Can only be called by current asset owner.
     *
     * @return success.
     */
    function purgeUpgrade() onlyAssetOwner() returns(bool) {
        if (pendingVersion == 0x0) {
            return false;
        }
        delete pendingVersion;
        delete pendingVersionTimestamp;
        return true;
    }

    /**
     * Finalize an upgrade process setting new asset implementation contract address.
     *
     * Can only be called after an upgrade freeze-time.
     *
     * @return success.
     */
    function commitUpgrade() returns(bool) {
        if (pendingVersion == 0x0) {
            return false;
        }
        if (pendingVersionTimestamp + UPGRADE_FREEZE_TIME > now) {
            return false;
        }
        latestVersion = pendingVersion;
        delete pendingVersion;
        delete pendingVersionTimestamp;
        return true;
    }

    /**
     * Disagree with proposed upgrade, and stick with current asset implementation
     * until further explicit agreement to upgrade.
     *
     * @return success.
     */
    function optOut() returns(bool) {
        if (userOptOutVersion[msg.sender] != 0x0) {
            return false;
        }
        userOptOutVersion[msg.sender] = latestVersion;
        return true;
    }

    /**
     * Implicitly agree to upgrade to current and future asset implementation upgrades,
     * until further explicit disagreement.
     *
     * @return success.
     */
    function optIn() returns(bool) {
        delete userOptOutVersion[msg.sender];
        return true;
    }
}

    Contract ABI  
[{"constant":true,"inputs":[],"name":"name","outputs":[{"name":"","type":"string"}],"payable":false,"type":"function"},{"constant":false,"inputs":[{"name":"_spender","type":"address"},{"name":"_value","type":"uint256"}],"name":"approve","outputs":[{"name":"","type":"bool"}],"payable":false,"type":"function"},{"constant":false,"inputs":[],"name":"commitUpgrade","outputs":[{"name":"","type":"bool"}],"payable":false,"type":"function"},{"constant":true,"inputs":[],"name":"getLatestVersion","outputs":[{"name":"","type":"address"}],"payable":false,"type":"function"},{"constant":true,"inputs":[],"name":"totalSupply","outputs":[{"name":"","type":"uint256"}],"payable":false,"type":"function"},{"constant":false,"inputs":[{"name":"_from","type":"address"},{"name":"_spender","type":"address"},{"name":"_value","type":"uint256"}],"name":"emitApprove","outputs":[],"payable":false,"type":"function"},{"constant":false,"inputs":[{"name":"_from","type":"address"},{"name":"_to","type":"address"},{"name":"_value","type":"uint256"}],"name":"transferFrom","outputs":[{"name":"","type":"bool"}],"payable":false,"type":"function"},{"constant":false,"inputs":[{"name":"_from","type":"address"},{"name":"_to","type":"address"},{"name":"_value","type":"uint256"}],"name":"emitTransfer","outputs":[],"payable":false,"type":"function"},{"constant":true,"inputs":[],"name":"decimals","outputs":[{"name":"","type":"uint8"}],"payable":false,"type":"function"},{"constant":true,"inputs":[],"name":"chronoBankPlatform","outputs":[{"name":"","type":"address"}],"payable":false,"type":"function"},{"constant":true,"inputs":[],"name":"getPendingVersionTimestamp","outputs":[{"name":"","type":"uint256"}],"payable":false,"type":"function"},{"constant":false,"inputs":[],"name":"purgeUpgrade","outputs":[{"name":"","type":"bool"}],"payable":false,"type":"function"},{"constant":false,"inputs":[],"name":"optIn","outputs":[{"name":"","type":"bool"}],"payable":false,"type":"function"},{"constant":false,"inputs":[{"name":"_from","type":"address"},{"name":"_to","type":"address"},{"name":"_value","type":"uint256"},{"name":"_reference","type":"string"}],"name":"transferFromWithReference","outputs":[{"name":"","type":"bool"}],"payable":false,"type":"function"},{"constant":false,"inputs":[{"name":"_to","type":"address"},{"name":"_value","type":"uint256"},{"name":"_reference","type":"string"},{"name":"_sender","type":"address"}],"name":"__transferWithReference","outputs":[{"name":"","type":"bool"}],"payable":false,"type":"function"},{"constant":true,"inputs":[{"name":"_owner","type":"address"}],"name":"balanceOf","outputs":[{"name":"","type":"uint256"}],"payable":false,"type":"function"},{"constant":false,"inputs":[{"name":"_spender","type":"address"},{"name":"_value","type":"uint256"},{"name":"_sender","type":"address"}],"name":"__approve","outputs":[{"name":"","type":"bool"}],"payable":false,"type":"function"},{"constant":true,"inputs":[],"name":"symbol","outputs":[{"name":"","type":"string"}],"payable":false,"type":"function"},{"constant":true,"inputs":[],"name":"getPendingVersion","outputs":[{"name":"","type":"address"}],"payable":false,"type":"function"},{"constant":false,"inputs":[{"name":"_to","type":"address"},{"name":"_value","type":"uint256"}],"name":"transfer","outputs":[{"name":"","type":"bool"}],"payable":false,"type":"function"},{"constant":false,"inputs":[{"name":"_to","type":"address"},{"name":"_value","type":"uint256"},{"name":"_reference","type":"string"}],"name":"transferWithReference","outputs":[{"name":"","type":"bool"}],"payable":false,"type":"function"},{"constant":false,"inputs":[{"name":"_chronoBankPlatform","type":"address"},{"name":"_symbol","type":"string"},{"name":"_name","type":"string"}],"name":"init","outputs":[{"name":"","type":"bool"}],"payable":false,"type":"function"},{"constant":false,"inputs":[{"name":"_newVersion","type":"address"}],"name":"proposeUpgrade","outputs":[{"name":"","type":"bool"}],"payable":false,"type":"function"},{"constant":false,"inputs":[{"name":"source","type":"string"}],"name":"stringToBytes32","outputs":[{"name":"result","type":"bytes32"}],"payable":false,"type":"function"},{"constant":false,"inputs":[],"name":"optOut","outputs":[{"name":"","type":"bool"}],"payable":false,"type":"function"},{"constant":true,"inputs":[{"name":"_from","type":"address"},{"name":"_spender","type":"address"}],"name":"allowance","outputs":[{"name":"","type":"uint256"}],"payable":false,"type":"function"},{"constant":false,"inputs":[{"name":"_from","type":"address"},{"name":"_to","type":"address"},{"name":"_value","type":"uint256"},{"name":"_reference","type":"string"},{"name":"_sender","type":"address"}],"name":"__transferFromWithReference","outputs":[{"name":"","type":"bool"}],"payable":false,"type":"function"},{"constant":true,"inputs":[{"name":"_sender","type":"address"}],"name":"getVersionFor","outputs":[{"name":"","type":"address"}],"payable":false,"type":"function"},{"payable":true,"type":"fallback"},{"anonymous":false,"inputs":[{"indexed":false,"name":"newVersion","type":"address"}],"name":"UpgradeProposal","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"from","type":"address"},{"indexed":true,"name":"to","type":"address"},{"indexed":false,"name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"from","type":"address"},{"indexed":true,"name":"spender","type":"address"},{"indexed":false,"name":"value","type":"uint256"}],"name":"Approval","type":"event"}]

  Contract Creation Code Switch To Opcodes View
606060405234610000575b61198d806100196000396000f3006060604052361561014e5763ffffffff60e060020a60003504166306fdde0381146101ed578063095ea7b31461027a5780630ba12c83146102aa5780630e6d1de9146102cb57806318160ddd146102f4578063233850891461031357806323b872dd1461033757806323de66511461036d578063313ce5671461039157806349752baf146103b45780634bfaf2e8146103dd5780634dfe950d146103fc5780635b48684e1461041d5780636461fe391461043e5780636a630ee7146104ba57806370a08231146105395780637b7054c81461056457806395d89b411461059b578063a883fb9014610628578063a9059cbb14610651578063ac35caee14610681578063b2b45df5146106f5578063c915fc93146107a3578063cfb51928146107d0578063d4eec5a614610835578063dd62ed3e14610856578063ec698a2814610887578063fe8beb711461090e575b6101eb5b61015a610943565b604080517ff2d6e0ab00000000000000000000000000000000000000000000000000000000815233600160a060020a03818116602484015260048301938452366044840181905294169363f2d6e0ab9334936000939190819060640185858082843782019150509450505050506000604051808303818588803b156100005761235a5a03f11561000057505050505b565b005b34610000576101fa610954565b604080516020808252835181830152835191928392908301918501908083838215610240575b80518252602083111561024057601f199092019160209182019101610220565b505050905090810190601f16801561026c5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b3461000057610296600160a060020a03600435166024356109df565b604080519115158252519081900360200190f35b34610000576102966109f4565b604080519115158252519081900360200190f35b34610000576102d8610a59565b60408051600160a060020a039092168252519081900360200190f35b3461000057610301610a69565b60408051918252519081900360200190f35b34610000576101eb600160a060020a0360043581169060243516604435610aea565b005b3461000057610296600160a060020a0360043581169060243516604435610b54565b604080519115158252519081900360200190f35b34610000576101eb600160a060020a0360043581169060243516604435610b7c565b005b346100005761039e610be6565b6040805160ff9092168252519081900360200190f35b34610000576102d8610c67565b60408051600160a060020a039092168252519081900360200190f35b3461000057610301610c76565b60408051918252519081900360200190f35b3461000057610296610c7d565b604080519115158252519081900360200190f35b3461000057610296610d27565b604080519115158252519081900360200190f35b3461000057604080516020600460643581810135601f8101849004840285018401909552848452610296948235600160a060020a03908116956024803590921695604435959460849492930191908190840183828082843750949650610d5395505050505050565b604080519115158252519081900360200190f35b3461000057604080516020600460443581810135601f8101849004840285018401909552848452610296948235600160a060020a031694602480359560649492939190920191819084018382808284375094965050509235600160a060020a03169250610d6c915050565b604080519115158252519081900360200190f35b3461000057610301600160a060020a0360043516610eb4565b60408051918252519081900360200190f35b3461000057610296600160a060020a036004358116906024359060443516610f3e565b604080519115158252519081900360200190f35b34610000576101fa611007565b604080516020808252835181830152835191928392908301918501908083838215610240575b80518252602083111561024057601f199092019160209182019101610220565b505050905090810190601f16801561026c5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34610000576102d8611095565b60408051600160a060020a039092168252519081900360200190f35b3461000057610296600160a060020a03600435166024356110a5565b604080519115158252519081900360200190f35b3461000057604080516020600460443581810135601f8101849004840285018401909552848452610296948235600160a060020a03169460248035956064949293919092019181908401838280828437509496506110cb95505050505050565b604080519115158252519081900360200190f35b346100005760408051602060046024803582810135601f8101859004850286018501909652858552610296958335600160a060020a0316959394604494939290920191819084018382808284375050604080516020601f89358b018035918201839004830284018301909452808352979998810197919650918201945092508291508401838280828437509496506110e295505050505050565b604080519115158252519081900360200190f35b3461000057610296600160a060020a036004351661128d565b604080519115158252519081900360200190f35b3461000057610301600480803590602001908201803590602001908080601f016020809104026020016040519081016040528093929190818152602001838380828437509496506113c595505050505050565b60408051918252519081900360200190f35b34610000576102966113d0565b604080519115158252519081900360200190f35b3461000057610301600160a060020a0360043581169060243516611431565b60408051918252519081900360200190f35b3461000057604080516020600460643581810135601f8101849004840285018401909552848452610296948235600160a060020a0390811695602480359092169560443595946084949293019190819084018382808284375094965050509235600160a060020a031692506114c4915050565b604080519115158252519081900360200190f35b34610000576102d8600160a060020a0360043516611619565b60408051600160a060020a039092168252519081900360200190f35b600061094e33611619565b90505b90565b6002805460408051602060018416156101000260001901909316849004601f810184900484028201840190925281815292918301828280156109d75780601f106109ac576101008083540402835291602001916109d7565b820191906000526020600020905b8154815290600101906020018083116109ba57829003601f168201915b505050505081565b60006109eb8383611670565b90505b92915050565b600554600090600160a060020a03161515610a1157506000610951565b426203f480600654011115610a2857506000610951565b506005805460048054600160a060020a0319908116600160a060020a03841617909155169055600060065560015b90565b600454600160a060020a03165b90565b6000805460015460408051602090810185905281517fb524abcf00000000000000000000000000000000000000000000000000000000815260048101939093529051600160a060020a039093169263b524abcf92602480820193929182900301818787803b156100005760325a03f115610000575050604051519150505b90565b60005433600160a060020a0390811691161415610b4d5781600160a060020a031683600160a060020a03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925836040518082815260200191505060405180910390a35b5b5b505050565b6000610b728484846020604051908101604052806000815250611712565b90505b9392505050565b60005433600160a060020a0390811691161415610b4d5781600160a060020a031683600160a060020a03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040518082815260200191505060405180910390a35b5b5b505050565b6000805460015460408051602090810185905281517fdc86e6f000000000000000000000000000000000000000000000000000000000815260048101939093529051600160a060020a039093169263dc86e6f092602480820193929182900301818787803b156100005760325a03f115610000575050604051519150505b90565b600054600160a060020a031681565b6006545b90565b60008054600154604080516020908101859052815160e160020a6374b5a315028152600160a060020a03338116600483015260248201949094529151929093169263e96b462a9260448084019382900301818787803b156100005760325a03f1156100005750506040515115905061095157600554600160a060020a03161515610d0957506000610951565b5060058054600160a060020a0319169055600060065560015b5b5b90565b600160a060020a03331660009081526007602052604090208054600160a060020a031916905560015b90565b6000610d6185858585611712565b90505b949350505050565b60008133600160a060020a0316610d8282611619565b600160a060020a03161415610ea9576000805460015460408051602090810194909452517f57a96dd0000000000000000000000000000000000000000000000000000000008152600160a060020a038a811660048301908152602483018b905260448301849052888216608484015260a0606484019081528a5160a48501528a5192909516956357a96dd0958d958d9590948d948d9490939260c40191908601908083838215610e4d575b805182526020831115610e4d57601f199092019160209182019101610e2d565b505050905090810190601f168015610e795780820380516001836020036101000a031916815260200191505b509650505050505050602060405180830381600087803b156100005760325a03f115610000575050604051519250505b5b5b50949350505050565b6000805460015460408051602090810185905281517f4d30b6be000000000000000000000000000000000000000000000000000000008152600160a060020a038781166004830152602482019490945291519290931692634d30b6be9260448084019382900301818787803b156100005760325a03f115610000575050604051519150505b919050565b60008133600160a060020a0316610f5482611619565b600160a060020a03161415610ffd576000805460015460408051602090810185905281517f14712e2f000000000000000000000000000000000000000000000000000000008152600160a060020a038b81166004830152602482018b905260448201949094528884166064820152915192909316936314712e2f9360848084019491939192918390030190829087803b156100005760325a03f115610000575050604051519250505b5b5b509392505050565b6003805460408051602060026001851615610100026000190190941693909304601f810184900484028201840190925281815292918301828280156109d75780601f106109ac576101008083540402835291602001916109d7565b820191906000526020600020905b8154815290600101906020018083116109ba57829003601f168201915b505050505081565b600554600160a060020a03165b90565b60006109eb83836020604051908101604052806000815250611847565b90505b92915050565b6000610b72848484611847565b90505b9392505050565b60008054600160a060020a0316156110fc57506000610b75565b60008054600160a060020a031916600160a060020a03861617815583516003805492819052917fc2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85b602060026101006001851615026000190190931692909204601f9081018390048201939288019083901061118257805160ff19168380011785556111af565b828001600101855582156111af579182015b828111156111af578251825591602001919060010190611194565b5b506111d09291505b808211156111cc57600081556001016111b8565b5090565b50506111db836113c5565b600181600019169055508160029080519060200190828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f1061123157805160ff191683800117855561125e565b8280016001018555821561125e579182015b8281111561125e578251825591602001919060010190611243565b5b5061127f9291505b808211156111cc57600081556001016111b8565b5090565b5050600190505b9392505050565b60008054600154604080516020908101859052815160e160020a6374b5a315028152600160a060020a03338116600483015260248201949094529151929093169263e96b462a9260448084019382900301818787803b156100005760325a03f11561000057505060405151159050610f3957600554600160a060020a03161561131857506000610f39565b600160a060020a038216151561133057506000610f39565b600454600160a060020a03161515611365575060048054600160a060020a031916600160a060020a0383161790556001610f39565b60058054600160a060020a038416600160a060020a031990911681179091554260065560408051918252517faf574319215a31df9b528258f1bdeef2b12b169dc85ff443a49373248c77493a9181900360200190a15060015b5b5b919050565b60208101515b919050565b600160a060020a03338116600090815260076020526040812054909116156113fa57506000610951565b5060045433600160a060020a0390811660009081526007602052604090208054600160a060020a0319169190921617905560015b90565b6000805460015460408051602090810185905281517f1c8d5d38000000000000000000000000000000000000000000000000000000008152600160a060020a0388811660048301528781166024830152604482019490945291519290931692631c8d5d389260648084019382900301818787803b156100005760325a03f115610000575050604051519150505b92915050565b60008133600160a060020a03166114da82611619565b600160a060020a0316141561160d576000805460015460408051602090810194909452517f161ff662000000000000000000000000000000000000000000000000000000008152600160a060020a038b8116600483019081528b82166024840152604483018b90526064830184905288821660a484015260c0608484019081528a5160c48501528a51929095169563161ff662958e958e958e9591948e948e949193919260e401919086019080838382156115b0575b8051825260208311156115b057601f199092019160209182019101611590565b505050905090810190601f1680156115dc5780820380516001836020036101000a031916815260200191505b50975050505050505050602060405180830381600087803b156100005760325a03f115610000575050604051519250505b5b5b5095945050505050565b600160a060020a038082166000908152600760205260408120549091161561165b57600160a060020a0380831660009081526007602052604090205416611668565b600454600160a060020a03165b90505b919050565b600061167a610943565b600160a060020a0316637b7054c88484336000604051602001526040518463ffffffff1660e060020a0281526004018084600160a060020a0316600160a060020a0316815260200183815260200182600160a060020a0316600160a060020a031681526020019350505050602060405180830381600087803b156100005760325a03f115610000575050604051519150505b92915050565b600061171c610943565b600160a060020a031663ec698a2886868686336000604051602001526040518663ffffffff1660e060020a0281526004018086600160a060020a0316600160a060020a0316815260200185600160a060020a0316600160a060020a031681526020018481526020018060200183600160a060020a0316600160a060020a031681526020018281038252848181518152602001915080519060200190808383600083146117e3575b8051825260208311156117e357601f1990920191602091820191016117c3565b505050905090810190601f16801561180f5780820380516001836020036101000a031916815260200191505b509650505050505050602060405180830381600087803b156100005760325a03f115610000575050604051519150505b949350505050565b6000611851610943565b600160a060020a0316636a630ee7858585336000604051602001526040518563ffffffff1660e060020a0281526004018085600160a060020a0316600160a060020a031681526020018481526020018060200183600160a060020a0316600160a060020a031681526020018281038252848181518152602001915080519060200190808383600083146118ff575b8051825260208311156118ff57601f1990920191602091820191016118df565b505050905090810190601f16801561192b5780820380516001836020036101000a031916815260200191505b5095505050505050602060405180830381600087803b156100005760325a03f115610000575050604051519150505b93925050505600a165627a7a7230582014a2415442d222c840a9f97e881c3a1a8b3b9e45ca90ea33df3ca27a39dd6a500029

   Swarm Source:
bzzr://14a2415442d222c840a9f97e881c3a1a8b3b9e45ca90ea33df3ca27a39dd6a50

 

View All
Block Age txn Difficulty GasUsed Reward
View All
Block Age UncleNumber Difficulty GasUsed Reward
Make sure to use the "downvote" button for any spammy posts, and the "upvote" for interesting conversations.