Contract 0xef88808d0fbb5c0c2c89f6d9b45eda53c0150993

 

TxHash Block Age From To Value [TxFee]
0xca3be18fda6998f19c610ba571e670c133f1ce70be8309492c58771c6e5edb5e72220361 day 1 hr ago0x69f7de589cfbb8dcab258a7c130aaa4ef5c8ee53  IN   0xef88808d0fbb5c0c2c89f6d9b45eda53c01509930 Ether0.00069789
0x26750d9e7db56b452681d6627d10f656b9eee6cf1908c67143ffaa2f783bcb7072220271 day 1 hr ago0x4c4579f632da0f65560fd87baf5366f8541e973c  IN   0xef88808d0fbb5c0c2c89f6d9b45eda53c01509930 Ether0.000700007
0x1ca51640f16655d8d47e415fa58f379f06d6db76f381b022c915caf4c4269ceb713977718 days 13 hrs ago0xf0fee4ffafbd2e28d26891702bd0b395e6e4dce7  IN   0xef88808d0fbb5c0c2c89f6d9b45eda53c01509930 Ether0.000700711
0x896fabc562e0f53211a999291f509c8f688a6e7a222f1333963e9d5fb4676a1e711573923 days 7 hrs ago0x283ede026bb359b4c4390dc5e00112ee48568d7c  IN   0xef88808d0fbb5c0c2c89f6d9b45eda53c01509930 Ether0.000732561516
0x50d4a90eb07165c668582432c33abb368d035d5439c8037a3e69cfe2706efb35701567041 days 11 hrs ago0xd894c048c27469ee7a573327382be9f4ce54414d  IN   0xef88808d0fbb5c0c2c89f6d9b45eda53c01509930 Ether0.0001312572
0x080681bc81e74e991bf69e5f7ffc3f7989a4cb322978ad7d9ac32e7443dc674c698155747 days 9 hrs ago0x71deaae5b8ef651f930bdf7683c8893047721bb5  IN   0xef88808d0fbb5c0c2c89f6d9b45eda53c01509930 Ether0.0001750932
0xb999ef0645664183c4c5b965b2247268d2ae63fc47759d1baa7b205b6af14a8f698024047 days 14 hrs ago0xd57183d0a6b62ee98a24c0837d5cdefaee67a37d  IN   0xef88808d0fbb5c0c2c89f6d9b45eda53c01509930 Ether0.00025534346
0xb6654107c3d0e0afef8a40ba5c53920bff2f97e94f8349102a72caae9a233039694115454 days 5 hrs ago0x6b7d219711469b469bbd205b8950e2572033d136  IN   0xef88808d0fbb5c0c2c89f6d9b45eda53c01509930 Ether0.000328143
0x778cbce71df724a95a56879b5025c08265f9fec3c5f6cec812cd9b740f794c17693978054 days 10 hrs ago0x51feb09f82313a99cb0d90be3702df6d7a3e1caa  IN   0xef88808d0fbb5c0c2c89f6d9b45eda53c01509930 Ether0.000328143
0x1679566638ad720a477f850733aa432109394c5730aad82cb4869891300d0e95693976954 days 10 hrs ago0x51feb09f82313a99cb0d90be3702df6d7a3e1caa  IN   0xef88808d0fbb5c0c2c89f6d9b45eda53c01509930 Ether0.0003
0x452d6be28e72921d92f0f2f80ee2da14b9d22e5ee47d5120532abb183082647f687343265 days 14 hrs ago0x58b254b4f283cd61aec0769452a9b3309620ff0d  IN   0xef88808d0fbb5c0c2c89f6d9b45eda53c01509930 Ether0.004484621
0x98bc6c1f02539ba0b01f39c039f5b7f8464b30286ca8754873e0f190f0c3317c677761981 days 10 hrs ago0xf0fee4ffafbd2e28d26891702bd0b395e6e4dce7  IN   0xef88808d0fbb5c0c2c89f6d9b45eda53c01509930 Ether0.00063701
0x57e543f35085f205937a500d688240aca93c172f3ace6847d4294524bc2a80396630431105 days 13 hrs ago0xf0fee4ffafbd2e28d26891702bd0b395e6e4dce7  IN   0xef88808d0fbb5c0c2c89f6d9b45eda53c01509930 Ether0.00063637
0x0e446e81d74d7229b276db007865393ebbd90dcb3d10c07b0b4240855c74c4cf6529980122 days 11 mins ago0x3821e0ef606ea550e2bc3c7e4cf496ccc83b1d51  IN   0xef88808d0fbb5c0c2c89f6d9b45eda53c01509930 Ether0.001994117
0xa72b8e151dd268e16bcc0f3c9ac2339fdabc13f47b66d68481ed4fa5dc47f7cd6481142129 days 22 hrs ago0xce666cf016a52165b77b2fc3da105c5d90978f6c  IN   0xef88808d0fbb5c0c2c89f6d9b45eda53c01509930 Ether0.002781379125
0xfa20344d36ae5ae8634876f2ba87874500867ae9617e25095d3313e45a9276a06395684143 days 21 hrs ago0x738ba26e74d3e81a1d13b6d6c21b94c8e2911044  IN   0xef88808d0fbb5c0c2c89f6d9b45eda53c01509930 Ether0.003128400106
0xd2cb7f036d0a6237236831d9d34749e4d095b504c4c56a0e6376c006350f61866307144158 days 12 hrs ago0x174a5d6c8e22aff28f837c9e37b9c3425d54df5a  IN   0xef88808d0fbb5c0c2c89f6d9b45eda53c01509930 Ether0.000231
0x1be909647eb65bc5fe7729ec4133ff4118af298873976b3e9ef50af7a84298286304597158 days 22 hrs ago0x508e2d213ed9d3879df9ef497cf276306661eea1  IN   0xef88808d0fbb5c0c2c89f6d9b45eda53c01509930 Ether0.000276783
0x13122c480a279a058ba2fbba36c4edefd007386eceb4e96fd78f876091ebf8b56304115159 days 17 mins ago0x9f00ad0503a82226d57bf090c16ae594f59bcd01  IN   0xef88808d0fbb5c0c2c89f6d9b45eda53c01509930 Ether0.000018676608
0x3c48b272075d61b9f2ae784ce39d0bc2fbce9b0f9979be6a4cc82025df86b70d6294748160 days 14 hrs ago0xe30f0fb983439fa9e7c58fd7736f2b4b64b64848  IN   0xef88808d0fbb5c0c2c89f6d9b45eda53c01509930 Ether0.002613897562
0xdd524dbeacac58b6cf992d96a9349426a7c2c0f3c237bb68be615b59a8426c176178140180 days 5 hrs ago0x49778d1578e18bc00ac9521832a5c0e9238ee575  IN   0xef88808d0fbb5c0c2c89f6d9b45eda53c01509930 Ether0.005
0x17ac230daca015e606a767e7124756fa57807115f24d698d8654b092531ccd606176337180 days 13 hrs ago0x20275e007f9678e47a9f3c52ea85d68c24217a65  IN   0xef88808d0fbb5c0c2c89f6d9b45eda53c01509930 Ether0.005
0x40799d35bf4557707f327a94bcc1b3ead3db4d50bad2e6d0d5af21a6ccfe49c66157305183 days 18 hrs ago0xe639bd0f74bc3859f86dd01885b60915d780e686  IN   0xef88808d0fbb5c0c2c89f6d9b45eda53c01509930 Ether0.000280806869
0xb0b2a0aa5d26a7990edf5d7acf13a71df326652b956b5d32b524148e0c2037d96129749188 days 10 hrs ago0x994731de7be59e5d82f36f8704173028aa13822b  IN   0xef88808d0fbb5c0c2c89f6d9b45eda53c01509930 Ether0.000279156
0xd4dcbbfe22af51f32edbff8383b9a2653295bf01231e5e74497e97184b5ecc586103489192 days 20 hrs ago0x4c1bf6a1c9f6c6c67012f4467e0a6384c5a50dae  IN   0xef88808d0fbb5c0c2c89f6d9b45eda53c01509930 Ether0.000279668
[ Download CSV Export 

Internal Transactions as a result of Contract Execution

Parent TxHash Block Age From To Value
Contract Name: iBuildAppNetworkToken
Compiler Version: v0.4.11+commit.68ef5810
Optimization Enabled: Yes
Runs (Optimizer):  10000


Contract Source Code
pragma solidity 0.4.11;

contract RegistryICAPInterface {
    function parse(bytes32 _icap) constant returns(address, bytes32, bool);
    function institutions(bytes32 _institution) constant returns(address);
}

contract EToken2Interface {
    function registryICAP() constant returns(RegistryICAPInterface);
    function baseUnit(bytes32 _symbol) constant returns(uint8);
    function description(bytes32 _symbol) constant returns(string);
    function owner(bytes32 _symbol) constant returns(address);
    function isOwner(address _owner, bytes32 _symbol) constant returns(bool);
    function totalSupply(bytes32 _symbol) constant returns(uint);
    function balanceOf(address _holder, bytes32 _symbol) constant returns(uint);
    function isLocked(bytes32 _symbol) constant returns(bool);
    function issueAsset(bytes32 _symbol, uint _value, string _name, string _description, uint8 _baseUnit, bool _isReissuable) returns(bool);
    function reissueAsset(bytes32 _symbol, uint _value) returns(bool);
    function revokeAsset(bytes32 _symbol, uint _value) returns(bool);
    function setProxy(address _address, bytes32 _symbol) returns(bool);
    function lockAsset(bytes32 _symbol) returns(bool);
    function proxyTransferFromToICAPWithReference(address _from, bytes32 _icap, uint _value, string _reference, address _sender) returns(bool);
    function proxyApprove(address _spender, uint _value, bytes32 _symbol, address _sender) returns(bool);
    function allowance(address _from, address _spender, bytes32 _symbol) constant returns(uint);
    function proxyTransferFromWithReference(address _from, address _to, uint _value, bytes32 _symbol, string _reference, address _sender) returns(bool);
}

contract AssetInterface {
    function _performTransferWithReference(address _to, uint _value, string _reference, address _sender) returns(bool);
    function _performTransferToICAPWithReference(bytes32 _icap, uint _value, string _reference, address _sender) returns(bool);
    function _performApprove(address _spender, uint _value, address _sender) returns(bool);
    function _performTransferFromWithReference(address _from, address _to, uint _value, string _reference, address _sender) returns(bool);
    function _performTransferFromToICAPWithReference(address _from, bytes32 _icap, uint _value, string _reference, address _sender) returns(bool);
    function _performGeneric(bytes _data, address _sender) payable returns(bytes32) {
        throw;
    }
}

contract ERC20Interface {
    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);

    // function symbol() constant returns(string);
    function decimals() constant returns(uint8);
    // function name() constant returns(string);
}

contract AssetProxyInterface {
    function _forwardApprove(address _spender, uint _value, address _sender) returns(bool);
    function _forwardTransferFromWithReference(address _from, address _to, uint _value, string _reference, address _sender) returns(bool);
    function _forwardTransferFromToICAPWithReference(address _from, bytes32 _icap, uint _value, string _reference, address _sender) returns(bool);
    function balanceOf(address _owner) constant returns(uint);
}

contract Bytes32 {
    function _bytes32(string _input) internal constant returns(bytes32 result) {
        assembly {
            result := mload(add(_input, 32))
        }
    }
}

/**
 * @title EToken2 Asset Proxy.
 *
 * Proxy implements ERC20 interface and acts as a gateway to a single EToken2 asset.
 * Proxy adds etoken2Symbol and caller(sender) when forwarding requests to EToken2.
 * Every request that is made by caller first sent to the specific asset implementation
 * contract, which then calls back to be forwarded onto EToken2.
 *
 * Calls flow: Caller ->
 *             Proxy.func(...) ->
 *             Asset._performFunc(..., Caller.address) ->
 *             Proxy._forwardFunc(..., Caller.address) ->
 *             Platform.proxyFunc(..., symbol, Caller.address)
 *
 * Generic call flow: Caller ->
 *             Proxy.unknownFunc(...) ->
 *             Asset._performGeneric(..., Caller.address) ->
 *             Asset.unknownFunc(...)
 *
 * Asset implementation contract is mutable, but each user have an option to stick with
 * old implementation, through explicit decision made in timely manner, if he doesn't agree
 * with new rules.
 * Each user have a possibility to upgrade to latest asset contract implementation, without the
 * possibility to rollback.
 *
 * Note: all the non constant functions return false instead of throwing in case if state change
 * didn't happen yet.
 */
contract iBuildAppNetworkToken is ERC20Interface, AssetProxyInterface, Bytes32 {
    // Assigned EToken2, immutable.
    EToken2Interface public etoken2;

    // Assigned symbol, immutable.
    bytes32 public etoken2Symbol;

    // Assigned name, immutable. For UI.
    string public name;
    string public symbol;

    /**
     * Sets EToken2 address, assigns symbol and name.
     *
     * Can be set only once.
     *
     * @param _etoken2 EToken2 contract address.
     * @param _symbol assigned symbol.
     * @param _name assigned name.
     *
     * @return success.
     */
    function init(EToken2Interface _etoken2, string _symbol, string _name) returns(bool) {
        if (address(etoken2) != 0x0) {
            return false;
        }
        etoken2 = _etoken2;
        etoken2Symbol = _bytes32(_symbol);
        name = _name;
        symbol = _symbol;
        return true;
    }

    /**
     * Only EToken2 is allowed to call.
     */
    modifier onlyEToken2() {
        if (msg.sender == address(etoken2)) {
            _;
        }
    }

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

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

    function recoverTokens(uint _value) onlyAssetOwner() returns(bool) {
        return this.transferWithReference(msg.sender, _value, 'Tokens recovery');
    }

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

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

    /**
     * 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 etoken2.allowance(_from, _spender, etoken2Symbol);
    }

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

    /**
     * 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.
     * Resolves asset implementation contract for the caller and forwards there arguments along with
     * the caller address.
     *
     * @param _to holder address to give to.
     * @param _value amount to transfer.
     * @param _reference transfer comment to be included in a EToken2's Transfer event.
     *
     * @return success.
     */
    function transferWithReference(address _to, uint _value, string _reference) returns(bool) {
        return _getAsset()._performTransferWithReference(_to, _value, _reference, msg.sender);
    }

    /**
     * Transfers asset balance from the caller to specified ICAP.
     *
     * @param _icap recipient ICAP to give to.
     * @param _value amount to transfer.
     *
     * @return success.
     */
    function transferToICAP(bytes32 _icap, uint _value) returns(bool) {
        return transferToICAPWithReference(_icap, _value, '');
    }

    /**
     * Transfers asset balance from the caller to specified ICAP adding specified comment.
     * Resolves asset implementation contract for the caller and forwards there arguments along with
     * the caller address.
     *
     * @param _icap recipient ICAP to give to.
     * @param _value amount to transfer.
     * @param _reference transfer comment to be included in a EToken2's Transfer event.
     *
     * @return success.
     */
    function transferToICAPWithReference(bytes32 _icap, uint _value, string _reference) returns(bool) {
        return _getAsset()._performTransferToICAPWithReference(_icap, _value, _reference, msg.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.
     * Resolves asset implementation contract for the caller and forwards there arguments along with
     * the caller address.
     *
     * @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 EToken2's Transfer event.
     *
     * @return success.
     */
    function transferFromWithReference(address _from, address _to, uint _value, string _reference) returns(bool) {
        return _getAsset()._performTransferFromWithReference(_from, _to, _value, _reference, msg.sender);
    }

    /**
     * Performs transfer call on the EToken2 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 EToken2's Transfer event.
     * @param _sender initial caller.
     *
     * @return success.
     */
    function _forwardTransferFromWithReference(address _from, address _to, uint _value, string _reference, address _sender) onlyImplementationFor(_sender) returns(bool) {
        return etoken2.proxyTransferFromWithReference(_from, _to, _value, etoken2Symbol, _reference, _sender);
    }

    /**
     * Prforms allowance transfer of asset balance between holders.
     *
     * @param _from holder address to take from.
     * @param _icap recipient ICAP address to give to.
     * @param _value amount to transfer.
     *
     * @return success.
     */
    function transferFromToICAP(address _from, bytes32 _icap, uint _value) returns(bool) {
        return transferFromToICAPWithReference(_from, _icap, _value, '');
    }

    /**
     * Prforms allowance transfer of asset balance between holders adding specified comment.
     * Resolves asset implementation contract for the caller and forwards there arguments along with
     * the caller address.
     *
     * @param _from holder address to take from.
     * @param _icap recipient ICAP address to give to.
     * @param _value amount to transfer.
     * @param _reference transfer comment to be included in a EToken2's Transfer event.
     *
     * @return success.
     */
    function transferFromToICAPWithReference(address _from, bytes32 _icap, uint _value, string _reference) returns(bool) {
        return _getAsset()._performTransferFromToICAPWithReference(_from, _icap, _value, _reference, msg.sender);
    }

    /**
     * Performs allowance transfer to ICAP call on the EToken2 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 _icap recipient ICAP address to give to.
     * @param _value amount to transfer.
     * @param _reference transfer comment to be included in a EToken2's Transfer event.
     * @param _sender initial caller.
     *
     * @return success.
     */
    function _forwardTransferFromToICAPWithReference(address _from, bytes32 _icap, uint _value, string _reference, address _sender) onlyImplementationFor(_sender) returns(bool) {
        return etoken2.proxyTransferFromToICAPWithReference(_from, _icap, _value, _reference, _sender);
    }

    /**
     * Sets asset spending allowance for a specified spender.
     * Resolves asset implementation contract for the caller and forwards there arguments along with
     * the caller address.
     *
     * @param _spender holder address to set allowance to.
     * @param _value amount to allow.
     *
     * @return success.
     */
    function approve(address _spender, uint _value) returns(bool) {
        return _getAsset()._performApprove(_spender, _value, msg.sender);
    }

    /**
     * Performs allowance setting call on the EToken2 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 _forwardApprove(address _spender, uint _value, address _sender) onlyImplementationFor(_sender) returns(bool) {
        return etoken2.proxyApprove(_spender, _value, etoken2Symbol, _sender);
    }

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

    /**
     * Emits ERC20 Approval event on this contract.
     *
     * Can only be, and, called by assigned EToken2 when asset allowance set happens.
     */
    function emitApprove(address _from, address _spender, uint _value) onlyEToken2() {
        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 {
        bytes32 result = _getAsset()._performGeneric.value(msg.value)(msg.data, msg.sender);
        assembly {
            mstore(0, result)
            return(0, 32)
        }
    }

    /**
     * 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 onlyImplementationFor(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;
    }

    // Backwards compatibility.
    function multiAsset() constant returns(EToken2Interface) {
        return etoken2;
    }
}

Contract ABI
[{"constant":true,"inputs":[],"name":"multiAsset","outputs":[{"name":"","type":"address"}],"payable":false,"type":"function"},{"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":false,"inputs":[{"name":"_from","type":"address"},{"name":"_to","type":"address"},{"name":"_value","type":"uint256"},{"name":"_reference","type":"string"},{"name":"_sender","type":"address"}],"name":"_forwardTransferFromWithReference","outputs":[{"name":"","type":"bool"}],"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":false,"inputs":[{"name":"_value","type":"uint256"}],"name":"recoverTokens","outputs":[{"name":"","type":"bool"}],"payable":false,"type":"function"},{"constant":true,"inputs":[],"name":"decimals","outputs":[{"name":"","type":"uint8"}],"payable":false,"type":"function"},{"constant":true,"inputs":[],"name":"etoken2","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":true,"inputs":[{"name":"_owner","type":"address"}],"name":"balanceOf","outputs":[{"name":"","type":"uint256"}],"payable":false,"type":"function"},{"constant":false,"inputs":[{"name":"_icap","type":"bytes32"},{"name":"_value","type":"uint256"}],"name":"transferToICAP","outputs":[{"name":"","type":"bool"}],"payable":false,"type":"function"},{"constant":false,"inputs":[{"name":"_icap","type":"bytes32"},{"name":"_value","type":"uint256"},{"name":"_reference","type":"string"}],"name":"transferToICAPWithReference","outputs":[{"name":"","type":"bool"}],"payable":false,"type":"function"},{"constant":false,"inputs":[{"name":"_spender","type":"address"},{"name":"_value","type":"uint256"},{"name":"_sender","type":"address"}],"name":"_forwardApprove","outputs":[{"name":"","type":"bool"}],"payable":false,"type":"function"},{"constant":true,"inputs":[],"name":"symbol","outputs":[{"name":"","type":"string"}],"payable":false,"type":"function"},{"constant":false,"inputs":[{"name":"_from","type":"address"},{"name":"_icap","type":"bytes32"},{"name":"_value","type":"uint256"},{"name":"_reference","type":"string"},{"name":"_sender","type":"address"}],"name":"_forwardTransferFromToICAPWithReference","outputs":[{"name":"","type":"bool"}],"payable":false,"type":"function"},{"constant":false,"inputs":[{"name":"_from","type":"address"},{"name":"_icap","type":"bytes32"},{"name":"_value","type":"uint256"},{"name":"_reference","type":"string"}],"name":"transferFromToICAPWithReference","outputs":[{"name":"","type":"bool"}],"payable":false,"type":"function"},{"constant":false,"inputs":[{"name":"_from","type":"address"},{"name":"_icap","type":"bytes32"},{"name":"_value","type":"uint256"}],"name":"transferFromToICAP","outputs":[{"name":"","type":"bool"}],"payable":false,"type":"function"},{"constant":true,"inputs":[],"name":"etoken2Symbol","outputs":[{"name":"","type":"bytes32"}],"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":"_etoken2","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":"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":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
6060604052341561000c57fe5b5b6125a08061001c6000396000f300606060405236156101a95763ffffffff7c0100000000000000000000000000000000000000000000000000000000600035041663029a8bf781146102a357806306fdde03146102dc578063095ea7b31461036c5780630ba12c83146103ac5780630e6d1de9146103d057806314cba0021461040957806318160ddd146104ad57806323385089146104cf57806323b872dd1461050357806323de66511461054957806330599fc51461057d578063313ce567146105a4578063406838b3146105ca5780634bfaf2e8146106035780634dfe950d146106255780635b48684e146106495780636461fe391461066d57806370a08231146106f9578063733480b71461073457806377fe38a41461075e5780637bcdc2f0146107cc57806395d89b41146108135780639b487f3f146108a3578063a48a663c14610941578063a525f42c146109c7578063a66e6e5c14610a0a578063a883fb9014610a2c578063a9059cbb14610a65578063ac35caee14610aa5578063b2b45df514610b29578063c915fc9314610be7578063d4eec5a614610c24578063dd62ed3e14610c48578063fe8beb7114610c89575b6102a15b60006101b7610cdb565b73ffffffffffffffffffffffffffffffffffffffff1663db00b84834600036336000604051602001526040518563ffffffff167c010000000000000000000000000000000000000000000000000000000002815260040180806020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001828103825285858281815260200192508082843782019150509450505050506020604051808303818588803b151561027957fe5b6125ee5a03f1151561028757fe5b505050506040518051905090508060005260206000f35b50565b005b34156102ab57fe5b6102b3610cec565b6040805173ffffffffffffffffffffffffffffffffffffffff9092168252519081900360200190f35b34156102e457fe5b6102ec610d09565b604080516020808252835181830152835191928392908301918501908083838215610332575b80518252602083111561033257601f199092019160209182019101610312565b505050905090810190601f16801561035e5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b341561037457fe5b61039873ffffffffffffffffffffffffffffffffffffffff60043516602435610db2565b604080519115158252519081900360200190f35b34156103b457fe5b610398610eb5565b604080519115158252519081900360200190f35b34156103d857fe5b6102b3610f4c565b6040805173ffffffffffffffffffffffffffffffffffffffff9092168252519081900360200190f35b341561041157fe5b604080516020600460643581810135601f810184900484028501840190955284845261039894823573ffffffffffffffffffffffffffffffffffffffff9081169560248035909216956044359594608494929301919081908401838280828437509496505050923573ffffffffffffffffffffffffffffffffffffffff169250610f69915050565b604080519115158252519081900360200190f35b34156104b557fe5b6104bd6110ec565b60408051918252519081900360200190f35b34156104d757fe5b6102a173ffffffffffffffffffffffffffffffffffffffff60043581169060243516604435611181565b005b341561050b57fe5b61039873ffffffffffffffffffffffffffffffffffffffff60043581169060243516604435611212565b604080519115158252519081900360200190f35b341561055157fe5b6102a173ffffffffffffffffffffffffffffffffffffffff6004358116906024351660443561123a565b005b341561058557fe5b6103986004356112cb565b604080519115158252519081900360200190f35b34156105ac57fe5b6105b4611438565b6040805160ff9092168252519081900360200190f35b34156105d257fe5b6102b36114cd565b6040805173ffffffffffffffffffffffffffffffffffffffff9092168252519081900360200190f35b341561060b57fe5b6104bd6114e9565b60408051918252519081900360200190f35b341561062d57fe5b6103986114f0565b604080519115158252519081900360200190f35b341561065157fe5b6103986115e9565b604080519115158252519081900360200190f35b341561067557fe5b604080516020600460643581810135601f810184900484028501840190955284845261039894823573ffffffffffffffffffffffffffffffffffffffff90811695602480359092169560443595946084949293019190819084018382808284375094965061163a95505050505050565b604080519115158252519081900360200190f35b341561070157fe5b6104bd73ffffffffffffffffffffffffffffffffffffffff600435166117ea565b60408051918252519081900360200190f35b341561073c57fe5b610398600435602435611888565b604080519115158252519081900360200190f35b341561076657fe5b604080516020600460443581810135601f81018490048402850184019095528484526103989482359460248035956064949293919092019181908401838280828437509496506118ae95505050505050565b604080519115158252519081900360200190f35b34156107d457fe5b61039873ffffffffffffffffffffffffffffffffffffffff6004358116906024359060443516611a05565b604080519115158252519081900360200190f35b341561081b57fe5b6102ec611afc565b604080516020808252835181830152835191928392908301918501908083838215610332575b80518252602083111561033257601f199092019160209182019101610312565b505050905090810190601f16801561035e5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34156108ab57fe5b604080516020600460643581810135601f810184900484028501840190955284845261039894823573ffffffffffffffffffffffffffffffffffffffff1694602480359560443595946084949201919081908401838280828437509496505050923573ffffffffffffffffffffffffffffffffffffffff169250611ba8915050565b604080519115158252519081900360200190f35b341561094957fe5b604080516020600460643581810135601f810184900484028501840190955284845261039894823573ffffffffffffffffffffffffffffffffffffffff169460248035956044359594608494920191908190840183828082843750949650611d1f95505050505050565b604080519115158252519081900360200190f35b34156109cf57fe5b61039873ffffffffffffffffffffffffffffffffffffffff60043516602435604435611eab565b604080519115158252519081900360200190f35b3415610a1257fe5b6104bd611ed3565b60408051918252519081900360200190f35b3415610a3457fe5b6102b3611ed9565b6040805173ffffffffffffffffffffffffffffffffffffffff9092168252519081900360200190f35b3415610a6d57fe5b61039873ffffffffffffffffffffffffffffffffffffffff60043516602435611ef6565b604080519115158252519081900360200190f35b3415610aad57fe5b604080516020600460443581810135601f810184900484028501840190955284845261039894823573ffffffffffffffffffffffffffffffffffffffff16946024803595606494929391909201918190840183828082843750949650611f1c95505050505050565b604080519115158252519081900360200190f35b3415610b3157fe5b60408051602060046024803582810135601f810185900485028601850190965285855261039895833573ffffffffffffffffffffffffffffffffffffffff16959394604494939290920191819084018382808284375050604080516020601f89358b0180359182018390048302840183019094528083529799988101979196509182019450925082915084018382808284375094965061209795505050505050565b604080519115158252519081900360200190f35b3415610bef57fe5b61039873ffffffffffffffffffffffffffffffffffffffff6004351661213e565b604080519115158252519081900360200190f35b3415610c2c57fe5b610398612311565b604080519115158252519081900360200190f35b3415610c5057fe5b6104bd73ffffffffffffffffffffffffffffffffffffffff600435811690602435166123a4565b60408051918252519081900360200190f35b3415610c9157fe5b6102b373ffffffffffffffffffffffffffffffffffffffff6004351661244b565b6040805173ffffffffffffffffffffffffffffffffffffffff9092168252519081900360200190f35b6000610ce63361244b565b90505b90565b60005473ffffffffffffffffffffffffffffffffffffffff165b90565b600280546040805160206001841615610100027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff01909316849004601f81018490048402820184019092528181529291830182828015610daa5780601f10610d7f57610100808354040283529160200191610daa565b820191906000526020600020905b815481529060010190602001808311610d8d57829003601f168201915b505050505081565b6000610dbc610cdb565b73ffffffffffffffffffffffffffffffffffffffff1663e34f71378484336000604051602001526040518463ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018381526020018273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019350505050602060405180830381600087803b1515610e9757fe5b6102c65a03f11515610ea557fe5b5050604051519150505b92915050565b60055460009073ffffffffffffffffffffffffffffffffffffffff161515610edf57506000610ce9565b426203f480600654011115610ef657506000610ce9565b5060058054600480547fffffffffffffffffffffffff000000000000000000000000000000000000000090811673ffffffffffffffffffffffffffffffffffffffff841617909155169055600060065560015b90565b60045473ffffffffffffffffffffffffffffffffffffffff165b90565b6000813373ffffffffffffffffffffffffffffffffffffffff16610f8c8261244b565b73ffffffffffffffffffffffffffffffffffffffff1614156110e0576000805460015460408051602090810194909452517f161ff66200000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8b8116600483019081528b82166024840152604483018b90526064830184905288821660a484015260c0608484019081528a5160c48501528a51929095169563161ff662958e958e958e9591948e948e949193919260e4019190860190808383821561107c575b80518252602083111561107c57601f19909201916020918201910161105c565b505050905090810190601f1680156110a85780820380516001836020036101000a031916815260200191505b50975050505050505050602060405180830381600087803b15156110c857fe5b6102c65a03f115156110d657fe5b5050604051519250505b5b5b5095945050505050565b6000805460015460408051602090810185905281517fb524abcf0000000000000000000000000000000000000000000000000000000081526004810193909352905173ffffffffffffffffffffffffffffffffffffffff9093169263b524abcf92602480820193929182900301818787803b151561116657fe5b6102c65a03f1151561117457fe5b5050604051519150505b90565b6000543373ffffffffffffffffffffffffffffffffffffffff9081169116141561120b578173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925836040518082815260200191505060405180910390a35b5b5b505050565b6000611230848484602060405190810160405280600081525061163a565b90505b9392505050565b6000543373ffffffffffffffffffffffffffffffffffffffff9081169116141561120b578173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040518082815260200191505060405180910390a35b5b5b505050565b6000805460015460408051602090810185905281517fe96b462a00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff338116600483015260248201949094529151929093169263e96b462a9260448084019382900301818787803b151561134c57fe5b6102c65a03f1151561135a57fe5b50506040515115905061143157604080516000602091820181905282517fac35caee00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff33811660048301526024820187905260606044830152600f60648301527f546f6b656e73207265636f76657279000000000000000000000000000000000060848301529351309094169363ac35caee9360a48084019491938390030190829087803b151561141957fe5b6102c65a03f1151561142757fe5b5050604051519150505b5b5b919050565b6000805460015460408051602090810185905281517fdc86e6f00000000000000000000000000000000000000000000000000000000081526004810193909352905173ffffffffffffffffffffffffffffffffffffffff9093169263dc86e6f092602480820193929182900301818787803b151561116657fe5b6102c65a03f1151561117457fe5b5050604051519150505b90565b60005473ffffffffffffffffffffffffffffffffffffffff1681565b6006545b90565b6000805460015460408051602090810185905281517fe96b462a00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff338116600483015260248201949094529151929093169263e96b462a9260448084019382900301818787803b151561157157fe5b6102c65a03f1151561157f57fe5b505060405151159050610ce95760055473ffffffffffffffffffffffffffffffffffffffff1615156115b357506000610ce9565b50600580547fffffffffffffffffffffffff0000000000000000000000000000000000000000169055600060065560015b5b5b90565b73ffffffffffffffffffffffffffffffffffffffff3316600090815260076020526040902080547fffffffffffffffffffffffff000000000000000000000000000000000000000016905560015b90565b6000611644610cdb565b73ffffffffffffffffffffffffffffffffffffffff1663cca9702586868686336000604051602001526040518663ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001848152602001806020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200182810382528481815181526020019150805190602001908083836000831461177f575b80518252602083111561177f57601f19909201916020918201910161175f565b505050905090810190601f1680156117ab5780820380516001836020036101000a031916815260200191505b509650505050505050602060405180830381600087803b15156117ca57fe5b6102c65a03f115156117d857fe5b5050604051519150505b949350505050565b6000805460015460408051602090810185905281517f4d30b6be00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8781166004830152602482019490945291519290931692634d30b6be9260448084019382900301818787803b151561141957fe5b6102c65a03f1151561142757fe5b5050604051519150505b919050565b60006118a5838360206040519081016040528060008152506118ae565b90505b92915050565b60006118b8610cdb565b73ffffffffffffffffffffffffffffffffffffffff1663c10796df858585336000604051602001526040518563ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808560001916600019168152602001848152602001806020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200182810382528481815181526020019150805190602001908083836000831461199c575b80518252602083111561199c57601f19909201916020918201910161197c565b505050905090810190601f1680156119c85780820380516001836020036101000a031916815260200191505b5095505050505050602060405180830381600087803b15156119e657fe5b6102c65a03f115156119f457fe5b5050604051519150505b9392505050565b6000813373ffffffffffffffffffffffffffffffffffffffff16611a288261244b565b73ffffffffffffffffffffffffffffffffffffffff161415611af2576000805460015460408051602090810185905281517f14712e2f00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8b81166004830152602482018b905260448201949094528884166064820152915192909316936314712e2f9360848084019491939192918390030190829087803b1515611ada57fe5b6102c65a03f11515611ae857fe5b5050604051519250505b5b5b509392505050565b6003805460408051602060026001851615610100027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0190941693909304601f81018490048402820184019092528181529291830182828015610daa5780601f10610d7f57610100808354040283529160200191610daa565b820191906000526020600020905b815481529060010190602001808311610d8d57829003601f168201915b505050505081565b6000813373ffffffffffffffffffffffffffffffffffffffff16611bcb8261244b565b73ffffffffffffffffffffffffffffffffffffffff1614156110e0576000805460408051602090810193909352517fa69032ee00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8a811660048301908152602483018b9052604483018a9052878216608484015260a060648401908152895160a48501528951929094169463a69032ee948d948d948d948d948d949193919260c490920191908601908083838215611cb0575b805182526020831115611cb057601f199092019160209182019101611c90565b505050905090810190601f168015611cdc5780820380516001836020036101000a031916815260200191505b509650505050505050602060405180830381600087803b15156110c857fe5b6102c65a03f115156110d657fe5b5050604051519250505b5b5b5095945050505050565b6000611d29610cdb565b73ffffffffffffffffffffffffffffffffffffffff1663eb58705b86868686336000604051602001526040518663ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018560001916600019168152602001848152602001806020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200182810382528481815181526020019150805190602001908083836000831461177f575b80518252602083111561177f57601f19909201916020918201910161175f565b505050905090810190601f1680156117ab5780820380516001836020036101000a031916815260200191505b509650505050505050602060405180830381600087803b15156117ca57fe5b6102c65a03f115156117d857fe5b5050604051519150505b949350505050565b60006112308484846020604051908101604052806000815250611d1f565b90505b9392505050565b60015481565b60055473ffffffffffffffffffffffffffffffffffffffff165b90565b60006118a583836020604051908101604052806000815250611f1c565b90505b92915050565b6000611f26610cdb565b73ffffffffffffffffffffffffffffffffffffffff16631962df71858585336000604051602001526040518563ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001848152602001806020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200182810382528481815181526020019150805190602001908083836000831461199c575b80518252602083111561199c57601f19909201916020918201910161197c565b505050905090810190601f1680156119c85780820380516001836020036101000a031916815260200191505b5095505050505050602060405180830381600087803b15156119e657fe5b6102c65a03f115156119f457fe5b5050604051519150505b9392505050565b6000805473ffffffffffffffffffffffffffffffffffffffff16156120be57506000611233565b600080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff8616179055612107836124c9565b600155815161211d9060029060208501906124d4565b5082516121319060039060208601906124d4565b50600190505b9392505050565b6000805460015460408051602090810185905281517fe96b462a00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff338116600483015260248201949094529151929093169263e96b462a9260448084019382900301818787803b15156121bf57fe5b6102c65a03f115156121cd57fe5b5050604051511590506114315760055473ffffffffffffffffffffffffffffffffffffffff161561220057506000611431565b73ffffffffffffffffffffffffffffffffffffffff8216151561222557506000611431565b60045473ffffffffffffffffffffffffffffffffffffffff16151561228c5750600480547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83161790556001611431565b6005805473ffffffffffffffffffffffffffffffffffffffff84167fffffffffffffffffffffffff000000000000000000000000000000000000000090911681179091554260065560408051918252517faf574319215a31df9b528258f1bdeef2b12b169dc85ff443a49373248c77493a9181900360200190a15060015b5b5b919050565b73ffffffffffffffffffffffffffffffffffffffff3381166000908152600760205260408120549091161561234857506000610ce9565b506004543373ffffffffffffffffffffffffffffffffffffffff908116600090815260076020526040902080547fffffffffffffffffffffffff0000000000000000000000000000000000000000169190921617905560015b90565b6000805460015460408051602090810185905281517f1c8d5d3800000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff88811660048301528781166024830152604482019490945291519290931692631c8d5d389260648084019382900301818787803b1515610e9757fe5b6102c65a03f11515610ea557fe5b5050604051519150505b92915050565b73ffffffffffffffffffffffffffffffffffffffff808216600090815260076020526040812054909116156124a75773ffffffffffffffffffffffffffffffffffffffff808316600090815260076020526040902054166124c1565b60045473ffffffffffffffffffffffffffffffffffffffff165b90505b919050565b60208101515b919050565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f1061251557805160ff1916838001178555612542565b82800160010185558215612542579182015b82811115612542578251825591602001919060010190612527565b5b5061254f929150612553565b5090565b610ce991905b8082111561254f5760008155600101612559565b5090565b905600a165627a7a7230582098e94b8b6bc6c305ad672235323039c0f64eae1b06a90d411d66a33af7ccf5060029


   Swarm Source:
bzzr://98e94b8b6bc6c305ad672235323039c0f64eae1b06a90d411d66a33af7ccf506
Block Age transaction Difficulty GasUsed Reward
Block Age Uncle Number Difficulty GasUsed Reward
Make sure to use the "Vote Down" button for any spammy posts, and the "Vote Up" for interesting conversations.