ETH Price: $3,160.64 (+1.41%)
Gas: 2 Gwei

Contract

0x331d077518216c07C87f4f18bA64cd384c411F84
 

Overview

ETH Balance

0 ETH

Eth Value

$0.00

Multichain Info

No addresses found
Transaction Hash
Method
Block
From
To
Proxy Transfer F...186428022023-11-24 16:37:35232 days ago1700843855IN
0x331d0775...84c411F84
0 ETH0.0021275251.42314345
Change Ownership183207702023-10-10 14:52:11277 days ago1696949531IN
0x331d0775...84c411F84
0 ETH0.0009945716.8
Set Proxy183207702023-10-10 14:52:11277 days ago1696949531IN
0x331d0775...84c411F84
0 ETH0.0008795916.8
Issue Asset183207702023-10-10 14:52:11277 days ago1696949531IN
0x331d0775...84c411F84
0 ETH0.0047002216.8
Enable Switch182220322023-09-26 19:28:23291 days ago1695756503IN
0x331d0775...84c411F84
0 ETH0.0007899115
Enable Switch182220322023-09-26 19:28:23291 days ago1695756503IN
0x331d0775...84c411F84
0 ETH0.0007900915
Enable Switch182220322023-09-26 19:28:23291 days ago1695756503IN
0x331d0775...84c411F84
0 ETH0.0007900915
Enable Switch182220322023-09-26 19:28:23291 days ago1695756503IN
0x331d0775...84c411F84
0 ETH0.0007900915
Enable Switch182220322023-09-26 19:28:23291 days ago1695756503IN
0x331d0775...84c411F84
0 ETH0.0007900915
Enable Switch182220322023-09-26 19:28:23291 days ago1695756503IN
0x331d0775...84c411F84
0 ETH0.0007900915
Change Ownership181129562023-09-11 11:56:47306 days ago1694433407IN
0x331d0775...84c411F84
0 ETH0.0024326641.1
Set Proxy181129532023-09-11 11:56:11306 days ago1694433371IN
0x331d0775...84c411F84
0 ETH0.0021513741.1
Issue Asset181129522023-09-11 11:55:59306 days ago1694433359IN
0x331d0775...84c411F84
0 ETH0.0077927641.1
Enable Switch181129522023-09-11 11:55:59306 days ago1694433359IN
0x331d0775...84c411F84
0 ETH0.0021648641.1
Enable Switch181129522023-09-11 11:55:59306 days ago1694433359IN
0x331d0775...84c411F84
0 ETH0.0021648641.1
Enable Switch181129522023-09-11 11:55:59306 days ago1694433359IN
0x331d0775...84c411F84
0 ETH0.0021648641.1
Enable Switch181129512023-09-11 11:55:47306 days ago1694433347IN
0x331d0775...84c411F84
0 ETH0.0021648641.1
Enable Switch181129512023-09-11 11:55:47306 days ago1694433347IN
0x331d0775...84c411F84
0 ETH0.0021643641.1
Enable Switch181129512023-09-11 11:55:47306 days ago1694433347IN
0x331d0775...84c411F84
0 ETH0.0021648641.1
Change Ownership169739412023-04-04 7:02:59466 days ago1680591779IN
0x331d0775...84c411F84
0 ETH0.0024326641.1
Set Proxy169739402023-04-04 7:02:47466 days ago1680591767IN
0x331d0775...84c411F84
0 ETH0.0021508841.1
Issue Asset169739392023-04-04 7:02:35466 days ago1680591755IN
0x331d0775...84c411F84
0 ETH0.0077809241.1
Enable Switch169739392023-04-04 7:02:35466 days ago1680591755IN
0x331d0775...84c411F84
0 ETH0.0021648641.1
Enable Switch169739392023-04-04 7:02:35466 days ago1680591755IN
0x331d0775...84c411F84
0 ETH0.0021648641.1
Enable Switch169739392023-04-04 7:02:35466 days ago1680591755IN
0x331d0775...84c411F84
0 ETH0.0021648641.1
View all transactions

View more zero value Internal Transactions in Advanced View mode

Advanced mode:
Loading...
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
EToken2

Compiler Version
v0.4.8+commit.60cc1668

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2018-07-17
*/

// This software is a subject to Ambisafe License Agreement.
// No use or distribution is allowed without written permission from Ambisafe.
// https://ambisafe.com/terms.pdf

pragma solidity 0.4.8;

contract Ambi2 {
    function claimFor(address _address, address _owner) returns(bool);
    function hasRole(address _from, bytes32 _role, address _to) constant returns(bool);
    function isOwner(address _node, address _owner) constant returns(bool);
}

contract Ambi2Enabled {
    Ambi2 ambi2;

    modifier onlyRole(bytes32 _role) {
        if (address(ambi2) != 0x0 && ambi2.hasRole(this, _role, msg.sender)) {
            _;
        }
    }

    // Perform only after claiming the node, or claim in the same tx.
    function setupAmbi2(Ambi2 _ambi2) returns(bool) {
        if (address(ambi2) != 0x0) {
            return false;
        }

        ambi2 = _ambi2;
        return true;
    }
}

contract Ambi2EnabledFull is Ambi2Enabled {
    // Setup and claim atomically.
    function setupAmbi2(Ambi2 _ambi2) returns(bool) {
        if (address(ambi2) != 0x0) {
            return false;
        }
        if (!_ambi2.claimFor(this, msg.sender) && !_ambi2.isOwner(this, msg.sender)) {
            return false;
        }

        ambi2 = _ambi2;
        return true;
    }
}

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

contract Cosigner {
    function consumeOperation(bytes32 _opHash, uint _required) returns(bool);
}

contract Emitter {
    function emitTransfer(address _from, address _to, bytes32 _symbol, uint _value, string _reference);
    function emitTransferToICAP(address _from, address _to, bytes32 _icap, 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);
    function emitChange(bytes32 _symbol);
}

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

/**
 * @title EToken2.
 *
 * The official Ambisafe assets platform powering all kinds of tokens.
 * EToken2 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: assets issuance, transfers, allowances, supply adjustments, lost wallet access recovery.
 *           cosignature check, ICAP.
 *
 * Note: all the non constant functions return false instead of throwing in case if state change
 * didn't happen yet.
 */
contract EToken2 is Ambi2EnabledFull {
    mapping(bytes32 => bool) switches;

    function isEnabled(bytes32 _switch) constant returns(bool) {
        return switches[_switch];
    }

    function enableSwitch(bytes32 _switch) onlyRole('issuance') returns(bool) {
        switches[_switch] = true;
        return true;
    }

    modifier checkEnabledSwitch(bytes32 _switch) {
        if (!isEnabled(_switch)) {
            _error('Feature is disabled');
        } else {
            _;
        }
    }

    enum Features { Issue, TransferWithReference, Revoke, ChangeOwnership, Allowances, ICAP }

    // 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.
        bool isLocked;                    // Are changes still allowed.
        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.
        Cosigner cosigner;               // Cosigner contract for 2FA and recovery.
        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;

    // ICAP registry contract.
    RegistryICAPInterface public registryICAP;

    // 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(Emitter _eventsHistory) onlyRole('setup') returns(bool) {
        if (address(eventsHistory) != 0) {
            return false;
        }
        eventsHistory = _eventsHistory;
        return true;
    }

    /**
     * Sets RegistryICAP contract address.
     *
     * Can be set only once, and only by contract owner.
     *
     * @param _registryICAP RegistryICAP contract address.
     *
     * @return success.
     */
    function setupRegistryICAP(RegistryICAPInterface _registryICAP) onlyRole('setup') returns(bool) {
        if (address(registryICAP) != 0) {
            return false;
        }
        registryICAP = _registryICAP;
        return true;
    }

    /**
     * Emits Error if called not by asset owner.
     */
    modifier onlyOwner(bytes32 _symbol) {
        if (_isSignedOwner(_symbol)) {
            _;
        } else {
            _error('Only owner: access denied');
        }
    }

    /**
     * Emits Error if called not by asset proxy.
     */
    modifier onlyProxy(bytes32 _symbol) {
        if (_isProxy(_symbol)) {
            _;
        } 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');
        }
    }

    function _isSignedOwner(bytes32 _symbol) internal checkSigned(getHolderId(msg.sender), 1) returns(bool) {
        return isOwner(msg.sender, _symbol);
    }

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

    function isLocked(bytes32 _symbol) constant returns(bool) {
        return assets[_symbol].isLocked;
    }

    /**
     * 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 current address of a particular holder.
     *
     * @param _holder holder address.
     * @param _symbol asset symbol.
     *
     * @return holder balance.
     */
    function balanceOf(address _holder, bytes32 _symbol) constant returns(uint) {
        uint holderId = getHolderId(_holder);
        return holders[holderId].addr == _holder ? _balanceOf(holderId, _symbol) : 0;
    }

    /**
     * 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 internal 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 internal returns(address) {
        return holders[_holderId].addr;
    }

    function _isProxy(bytes32 _symbol) constant internal returns(bool) {
        return proxies[_symbol] == msg.sender;
    }

    /**
     * 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) onlyOwner(_symbol) returns(bool) {
        if (proxies[_symbol] != 0x0 && assets[_symbol].isLocked) {
            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 checkSigned(_senderId, 1) 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 allow references.
        if (bytes(_reference).length > 0 && !isEnabled(sha3(_symbol, Features.TransferWithReference))) {
            _error('References feature is disabled');
            return false;
        }
        // Should have enough allowance.
        if (_fromId != _senderId && _allowance(_fromId, _senderId, _symbol) < _value) {
            _error('Not enough allowance');
            return false;
        }
        // Adjust allowance.
        if (_fromId != _senderId) {
            assets[_symbol].wallets[_fromId].allowance[_senderId] -= _value;
        }
        _transferDirect(_fromId, _toId, _value, _symbol);
        // Internal Out Of Gas/Throw: revert this transaction too;
        // Recursive Call: safe, all changes already made.
        eventsHistory.emitTransfer(_address(_fromId), _address(_toId), _symbol, _value, _reference);
        _proxyTransferEvent(_fromId, _toId, _value, _symbol);
        return true;
    }

    // Feature and proxy checks done internally due to unknown symbol when the function is called.
    function _transferToICAP(uint _fromId, bytes32 _icap, uint _value, string _reference, uint _senderId) internal returns(bool) {
        var (to, symbol, success) = registryICAP.parse(_icap);
        if (!success) {
            _error('ICAP is not registered');
            return false;
        }
        if (!isEnabled(sha3(symbol, Features.ICAP))) {
            _error('ICAP feature is disabled');
            return false;
        }
        if (!_isProxy(symbol)) {
            _error('Only proxy: access denied');
            return false;
        }
        uint toId = _createHolderId(to);
        if (!_transfer(_fromId, toId, _value, symbol, _reference, _senderId)) {
            return false;
        }
        // Internal Out Of Gas/Throw: revert this transaction too;
        // Recursive Call: safe, all changes already made.
        eventsHistory.emitTransferToICAP(_address(_fromId), _address(toId), _icap, _value, _reference);
        return true;
    }

    function proxyTransferFromToICAPWithReference(address _from, bytes32 _icap, uint _value, string _reference, address _sender) returns(bool) {
        return _transferToICAP(getHolderId(_from), _icap, _value, _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;
            // 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.
     *
     * _isReissuable is included in checkEnabledSwitch because it should be
     * explicitly allowed before issuing new asset.
     *
     * @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) checkEnabledSwitch(sha3(_symbol, _isReissuable, Features.Issue)) 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, false);
        assets[_symbol].wallets[holderId].balance = _value;
        // Internal Out Of Gas/Throw: revert this transaction too;
        // Recursive Call: safe, all changes already made.
        eventsHistory.emitIssue(_symbol, _value, _address(holderId));
        return true;
    }

    function changeAsset(bytes32 _symbol, string _name, string _description, uint8 _baseUnit) onlyOwner(_symbol) returns(bool) {
        if (isLocked(_symbol)) {
            _error('Asset is locked');
            return false;
        }
        assets[_symbol].name = _name;
        assets[_symbol].description = _description;
        assets[_symbol].baseUnit = _baseUnit;
        eventsHistory.emitChange(_symbol);
        return true;
    }

    function lockAsset(bytes32 _symbol) onlyOwner(_symbol) returns(bool) {
        if (isLocked(_symbol)) {
            _error('Asset is locked');
            return false;
        }
        assets[_symbol].isLocked = true;
        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;
        // 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) checkEnabledSwitch(sha3(_symbol, Features.Revoke)) checkSigned(getHolderId(msg.sender), 1) 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;
        // 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) checkEnabledSwitch(sha3(_symbol, Features.ChangeOwnership)) 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;
        // Recursive Call: safe, all changes already made.
        eventsHistory.emitOwnershipChange(oldOwner, _address(newOwnerId), _symbol);
        return true;
    }

    function setCosignerAddress(Cosigner _cosigner) checkSigned(_createHolderId(msg.sender), 1) returns(bool) {
        if (!_checkSigned(_cosigner, getHolderId(msg.sender), 1)) {
            _error('Invalid cosigner');
            return false;
        }
        holders[_createHolderId(msg.sender)].cosigner = _cosigner;
        return true;
    }

    function isCosignerSet(uint _holderId) constant returns(bool) {
        return address(holders[_holderId].cosigner) != 0x0;
    }

    function _checkSigned(Cosigner _cosigner, uint _holderId, uint _required) internal returns(bool) {
        return _cosigner.consumeOperation(sha3(msg.data, _holderId), _required);
    }

    modifier checkSigned(uint _holderId, uint _required) {
        if (!isCosignerSet(_holderId) || _checkSigned(holders[_holderId].cosigner, _holderId, _required)) {
            _;
        } else {
            _error('Cosigner: access denied');
        }
    }

    /**
     * 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 grantAccess(uint _holderId, address _to).
     * It grants another address access to recovery subject wallets.
     * Can only be called by trustee of recovery subject.
     * If cosigning is enabled, should have atleast 2 confirmations.
     *
     * @dev Deprecated. Backward compatibility.
     *
     * @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) {
        return _grantAccess(getHolderId(_from), _to);
    }

    /**
     * Perform recovery procedure.
     *
     * This function logic is actually more of an grantAccess(uint _holderId, address _to).
     * It grants another address access to subject holder wallets.
     * Can only be called if pre-confirmed by atleast 2 cosign oracles.
     *
     * @param _from holder address to recover from.
     * @param _to address to grant access to.
     *
     * @return success.
     */
    function grantAccess(address _from, address _to) returns(bool) {
        if (!isCosignerSet(getHolderId(_from))) {
            _error('Cosigner not set');
            return false;
        }
        return _grantAccess(getHolderId(_from), _to);
    }

    function _grantAccess(uint _fromId, address _to) internal checkSigned(_fromId, 2) 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[_fromId].addr;
        holders[_fromId].addr = _to;
        holderIndex[_to] = _fromId;
        // Internal Out Of Gas/Throw: 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 checkEnabledSwitch(sha3(_symbol, Features.Allowances)) checkSigned(_senderId, 1) 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;
        // 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;
            // 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 Security Audit

Contract ABI

[{"constant":true,"inputs":[{"name":"_symbol","type":"bytes32"}],"name":"owner","outputs":[{"name":"","type":"address"}],"payable":false,"type":"function"},{"constant":false,"inputs":[{"name":"_eventsHistory","type":"address"}],"name":"setupEventsHistory","outputs":[{"name":"","type":"bool"}],"payable":false,"type":"function"},{"constant":true,"inputs":[{"name":"_switch","type":"bytes32"}],"name":"isEnabled","outputs":[{"name":"","type":"bool"}],"payable":false,"type":"function"},{"constant":false,"inputs":[{"name":"_symbol","type":"bytes32"},{"name":"_value","type":"uint256"},{"name":"_name","type":"string"},{"name":"_description","type":"string"},{"name":"_baseUnit","type":"uint8"},{"name":"_isReissuable","type":"bool"}],"name":"issueAsset","outputs":[{"name":"","type":"bool"}],"payable":false,"type":"function"},{"constant":true,"inputs":[{"name":"_holder","type":"address"}],"name":"getHolderId","outputs":[{"name":"","type":"uint256"}],"payable":false,"type":"function"},{"constant":false,"inputs":[{"name":"_symbol","type":"bytes32"},{"name":"_name","type":"string"},{"name":"_description","type":"string"},{"name":"_baseUnit","type":"uint8"}],"name":"changeAsset","outputs":[{"name":"","type":"bool"}],"payable":false,"type":"function"},{"constant":false,"inputs":[{"name":"_spender","type":"address"},{"name":"_value","type":"uint256"},{"name":"_symbol","type":"bytes32"},{"name":"_sender","type":"address"}],"name":"proxyApprove","outputs":[{"name":"","type":"bool"}],"payable":false,"type":"function"},{"constant":false,"inputs":[{"name":"_from","type":"address"},{"name":"_to","type":"address"},{"name":"_value","type":"uint256"},{"name":"_symbol","type":"bytes32"},{"name":"_reference","type":"string"},{"name":"_sender","type":"address"}],"name":"proxyTransferFromWithReference","outputs":[{"name":"","type":"bool"}],"payable":false,"type":"function"},{"constant":true,"inputs":[{"name":"_from","type":"address"},{"name":"_spender","type":"address"},{"name":"_symbol","type":"bytes32"}],"name":"allowance","outputs":[{"name":"","type":"uint256"}],"payable":false,"type":"function"},{"constant":true,"inputs":[{"name":"","type":"uint256"}],"name":"holders","outputs":[{"name":"addr","type":"address"},{"name":"cosigner","type":"address"}],"payable":false,"type":"function"},{"constant":true,"inputs":[{"name":"_symbol","type":"bytes32"}],"name":"isCreated","outputs":[{"name":"","type":"bool"}],"payable":false,"type":"function"},{"constant":true,"inputs":[{"name":"_symbol","type":"bytes32"}],"name":"isLocked","outputs":[{"name":"","type":"bool"}],"payable":false,"type":"function"},{"constant":false,"inputs":[{"name":"_to","type":"address"}],"name":"trust","outputs":[{"name":"","type":"bool"}],"payable":false,"type":"function"},{"constant":false,"inputs":[{"name":"_switch","type":"bytes32"}],"name":"enableSwitch","outputs":[{"name":"","type":"bool"}],"payable":false,"type":"function"},{"constant":true,"inputs":[{"name":"_holder","type":"address"},{"name":"_symbol","type":"bytes32"}],"name":"balanceOf","outputs":[{"name":"","type":"uint256"}],"payable":false,"type":"function"},{"constant":false,"inputs":[{"name":"_address","type":"address"},{"name":"_symbol","type":"bytes32"}],"name":"setProxy","outputs":[{"name":"","type":"bool"}],"payable":false,"type":"function"},{"constant":false,"inputs":[{"name":"_from","type":"address"},{"name":"_to","type":"address"}],"name":"recover","outputs":[{"name":"","type":"bool"}],"payable":false,"type":"function"},{"constant":true,"inputs":[{"name":"_from","type":"address"},{"name":"_to","type":"address"}],"name":"isTrusted","outputs":[{"name":"","type":"bool"}],"payable":false,"type":"function"},{"constant":true,"inputs":[{"name":"_symbol","type":"bytes32"}],"name":"name","outputs":[{"name":"","type":"string"}],"payable":false,"type":"function"},{"constant":true,"inputs":[{"name":"","type":"bytes32"}],"name":"proxies","outputs":[{"name":"","type":"address"}],"payable":false,"type":"function"},{"constant":true,"inputs":[],"name":"holdersCount","outputs":[{"name":"","type":"uint256"}],"payable":false,"type":"function"},{"constant":false,"inputs":[{"name":"_registryICAP","type":"address"}],"name":"setupRegistryICAP","outputs":[{"name":"","type":"bool"}],"payable":false,"type":"function"},{"constant":false,"inputs":[{"name":"_ambi2","type":"address"}],"name":"setupAmbi2","outputs":[{"name":"","type":"bool"}],"payable":false,"type":"function"},{"constant":false,"inputs":[{"name":"_cosigner","type":"address"}],"name":"setCosignerAddress","outputs":[{"name":"","type":"bool"}],"payable":false,"type":"function"},{"constant":true,"inputs":[{"name":"_holderId","type":"uint256"}],"name":"isCosignerSet","outputs":[{"name":"","type":"bool"}],"payable":false,"type":"function"},{"constant":true,"inputs":[{"name":"","type":"bytes32"}],"name":"assets","outputs":[{"name":"owner","type":"uint256"},{"name":"totalSupply","type":"uint256"},{"name":"name","type":"string"},{"name":"description","type":"string"},{"name":"isReissuable","type":"bool"},{"name":"baseUnit","type":"uint8"},{"name":"isLocked","type":"bool"}],"payable":false,"type":"function"},{"constant":true,"inputs":[],"name":"registryICAP","outputs":[{"name":"","type":"address"}],"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":"proxyTransferFromToICAPWithReference","outputs":[{"name":"","type":"bool"}],"payable":false,"type":"function"},{"constant":true,"inputs":[{"name":"_symbol","type":"bytes32"}],"name":"totalSupply","outputs":[{"name":"","type":"uint256"}],"payable":false,"type":"function"},{"constant":true,"inputs":[{"name":"_symbol","type":"bytes32"}],"name":"description","outputs":[{"name":"","type":"string"}],"payable":false,"type":"function"},{"constant":true,"inputs":[{"name":"_symbol","type":"bytes32"}],"name":"isReissuable","outputs":[{"name":"","type":"bool"}],"payable":false,"type":"function"},{"constant":false,"inputs":[{"name":"_from","type":"address"},{"name":"_to","type":"address"}],"name":"grantAccess","outputs":[{"name":"","type":"bool"}],"payable":false,"type":"function"},{"constant":false,"inputs":[{"name":"_symbol","type":"bytes32"},{"name":"_value","type":"uint256"}],"name":"revokeAsset","outputs":[{"name":"","type":"bool"}],"payable":false,"type":"function"},{"constant":false,"inputs":[{"name":"_symbol","type":"bytes32"}],"name":"lockAsset","outputs":[{"name":"","type":"bool"}],"payable":false,"type":"function"},{"constant":true,"inputs":[{"name":"_symbol","type":"bytes32"}],"name":"baseUnit","outputs":[{"name":"","type":"uint8"}],"payable":false,"type":"function"},{"constant":false,"inputs":[{"name":"_symbol","type":"bytes32"},{"name":"_value","type":"uint256"}],"name":"reissueAsset","outputs":[{"name":"","type":"bool"}],"payable":false,"type":"function"},{"constant":true,"inputs":[{"name":"_owner","type":"address"},{"name":"_symbol","type":"bytes32"}],"name":"isOwner","outputs":[{"name":"","type":"bool"}],"payable":false,"type":"function"},{"constant":true,"inputs":[],"name":"eventsHistory","outputs":[{"name":"","type":"address"}],"payable":false,"type":"function"},{"constant":false,"inputs":[{"name":"_to","type":"address"}],"name":"distrust","outputs":[{"name":"","type":"bool"}],"payable":false,"type":"function"},{"constant":false,"inputs":[{"name":"_symbol","type":"bytes32"},{"name":"_newOwner","type":"address"}],"name":"changeOwnership","outputs":[{"name":"","type":"bool"}],"payable":false,"type":"function"}]

606060405234610000575b6132d9806100196000396000f300606060405236156101d25763ffffffff60e060020a60003504166302571be381146101d757806302927d20146102035780630610e03714610230578063085a4705146102545780630af3e66014610308578063106fcb7a1461033357806314712e2f146103dd578063161ff662146104185780631c8d5d381461049f5780632a11ced0146104d35780632f553d311461050957806332a16f4e1461052d5780634637d827146105515780634ba4079a1461057e5780634d30b6be146105a2578063638a9ce9146105d0578063648bf774146106005780636713e23014610633578063691f3431146106665780636932af36146106f65780636b4ed21b14610722578063774248a3146107415780637a386e881461076e57806382fc49b81461079b5780639666e1f9146107c85780639fda5b66146107ec578063a0f15b871461092e578063a69032ee14610957578063b524abcf146109d8578063bebcc045146109fa578063c4eeeeb914610a8a578063c6a09d9514610aae578063ca448a8814610ae1578063d0169c1e14610b08578063dc86e6f014610b2c578063e0873c0614610b52578063e96b462a14610b79578063f07629f814610ba9578063f0c06aa514610bd2578063fd83915e14610bff575b610000565b34610000576101e7600435610c2f565b60408051600160a060020a039092168252519081900360200190f35b346100005761021c600160a060020a0360043516610c5a565b604080519115158252519081900360200190f35b346100005761021c600435610d39565b604080519115158252519081900360200190f35b3461000057604080516020600460443581810135601f810184900484028501840190955284845261021c94823594602480359560649492939190920191819084018382808284375050604080516020601f89358b018035918201839004830284018301909452808352979998810197919650918201945092508291508401838280828437509496505060ff853516946020013515159350610d5192505050565b604080519115158252519081900360200190f35b3461000057610321600160a060020a03600435166110bb565b60408051918252519081900360200190f35b346100005760408051602060046024803582810135601f810185900485028601850190965285855261021c958335959394604494939290920191819084018382808284375050604080516020601f89358b018035918201839004830284018301909452808352979998810197919650918201945092508291508401838280828437509496505050923560ff1692506110da915050565b604080519115158252519081900360200190f35b346100005761021c600160a060020a03600435811690602435906044359060643516611343565b604080519115158252519081900360200190f35b3461000057604080516020601f60843560048181013592830184900484028501840190955281845261021c94600160a060020a0381358116956024803590921695604435956064359560a4940191819084018382808284375094965050509235600160a060020a031692506113ac915050565b604080519115158252519081900360200190f35b3461000057610321600160a060020a0360043581169060243516604435611421565b60408051918252519081900360200190f35b34610000576104e3600435611448565b60408051600160a060020a03938416815291909216602082015281519081900390910190f35b346100005761021c60043561146e565b604080519115158252519081900360200190f35b346100005761021c600435611485565b604080519115158252519081900360200190f35b346100005761021c600160a060020a03600435166114a6565b604080519115158252519081900360200190f35b346100005761021c600435611574565b604080519115158252519081900360200190f35b3461000057610321600160a060020a036004351660243561164c565b60408051918252519081900360200190f35b346100005761021c600160a060020a0360043516602435611699565b604080519115158252519081900360200190f35b346100005761021c600160a060020a0360043581169060243516611746565b604080519115158252519081900360200190f35b346100005761021c600160a060020a03600435811690602435166117a6565b604080519115158252519081900360200190f35b34610000576106766004356117eb565b6040805160208082528351818301528351919283929083019185019080838382156106bc575b8051825260208311156106bc57601f19909201916020918201910161069c565b505050905090810190601f1680156106e85780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34610000576101e7600435611898565b60408051600160a060020a039092168252519081900360200190f35b34610000576103216118b3565b60408051918252519081900360200190f35b346100005761021c600160a060020a03600435166118b9565b604080519115158252519081900360200190f35b346100005761021c600160a060020a0360043516611998565b604080519115158252519081900360200190f35b346100005761021c600160a060020a0360043516611aff565b604080519115158252519081900360200190f35b346100005761021c600435611c01565b604080519115158252519081900360200190f35b34610000576107fc600435611c24565b6040805188815260208101889052841515608082015260ff841660a082015282151560c082015260e0918101828152875460026001821615610100908102600019019092160493830184905291929091606084019190840190899080156108a45780601f10610879576101008083540402835291602001916108a4565b820191906000526020600020905b81548152906001019060200180831161088757829003601f168201915b50508381038252875460026000196101006001841615020190911604808252602090910190889080156109185780601f106108ed57610100808354040283529160200191610918565b820191906000526020600020905b8154815290600101906020018083116108fb57829003601f168201915b5050995050505050505050505060405180910390f35b34610000576101e7611c64565b60408051600160a060020a039092168252519081900360200190f35b3461000057604080516020600460643581810135601f810184900484028501840190955284845261021c948235600160a060020a0316946024803595604435959460849492019190819084018382808284375094965050509235600160a060020a03169250611c73915050565b604080519115158252519081900360200190f35b3461000057610321600435611c9e565b60408051918252519081900360200190f35b3461000057610676600435611cb6565b6040805160208082528351818301528351919283929083019185019080838382156106bc575b8051825260208311156106bc57601f19909201916020918201910161069c565b505050905090810190601f1680156106e85780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b346100005761021c600435611d62565b604080519115158252519081900360200190f35b346100005761021c600160a060020a0360043581169060243516611d7d565b604080519115158252519081900360200190f35b346100005761021c600435602435611de2565b604080519115158252519081900360200190f35b346100005761021c600435611fea565b604080519115158252519081900360200190f35b3461000057610b3c600435612084565b6040805160ff9092168252519081900360200190f35b346100005761021c6004356024356120a4565b604080519115158252519081900360200190f35b346100005761021c600160a060020a036004351660243561225c565b604080519115158252519081900360200190f35b34610000576101e7612291565b60408051600160a060020a039092168252519081900360200190f35b346100005761021c600160a060020a03600435166122a0565b604080519115158252519081900360200190f35b346100005761021c600435600160a060020a0360243516612336565b604080519115158252519081900360200190f35b60008181526005602090815260408083205483526003909152902054600160a060020a03165b919050565b6000805460dc60020a6407365747570290600160a060020a031615801590610cf2575060008054604080516020908101849052815160e160020a63169f2bcd028152600160a060020a03308116600483015260248201879052338116604483015292519290931693632d3e579a9360648082019492918390030190829087803b156100005760325a03f1156100005750506040515190505b15610d3157600854600160a060020a031615610d115760009150610d31565b60088054600160a060020a031916600160a060020a038516179055600191505b5b5b50919050565b60008181526001602052604090205460ff165b919050565b6040805187815282151560f860020a02602082015260006021820181905291519081900360220190208190610d8581610d39565b1515610da757610da260008051602061328e8339815191526124bf565b6110ad565b87158015610db3575083155b15610dea57610de17f43616e6e6f7420697373756520302076616c75652066697865642061737365746124bf565b600092506110ad565b610df38961146e565b15610e2a57610de17f417373657420616c7265616479206973737565640000000000000000000000006124bf565b600092506110ad565b610e333361252f565b6040805160e08101825282815260208082018c81528284018c8152606084018c9052891515608085015260ff8b1660a0850152600060c085018190528f8152600584529485208451815591516001838101919091559051805160028085018054818a5298879020999b5096989497601f61010095821615959095026000190116048301859004840194909392910190839010610eda57805160ff1916838001178555610f07565b82800160010185558215610f07579182015b82811115610f07578251825591602001919060010190610eec565b5b50610f289291505b80821115610f245760008155600101610f10565b5090565b50506060820151816003019080519060200190828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f10610f7c57805160ff1916838001178555610fa9565b82800160010185558215610fa9579182015b82811115610fa9578251825591602001919060010190610f8e565b5b50610fca9291505b80821115610f245760008155600101610f10565b5090565b505060808201516004909101805460a084015160c0909401511515620100000262ff00001960ff959095166101000261ff001994151560ff1990931692909217939093161792909216179055600089815260056020818152604080842086855290920190529020889055600854600160a060020a031663abafaa168a8a6110508661259f565b6040805160e060020a63ffffffff871602815260048101949094526024840192909252600160a060020a0316604483015251606480830192600092919082900301818387803b156100005760325a03f11561000057505050600192505b5b5b50509695505050505050565b600160a060020a0381166000908152600460205260409020545b919050565b6000846110e6816125bd565b15611321576110f486611485565b1561112b576111227f4173736574206973206c6f636b656400000000000000000000000000000000006124bf565b6000915061131c565b846005600088600019166000191681526020019081526020016000206002019080519060200190828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f1061119357805160ff19168380011785556111c0565b828001600101855582156111c0579182015b828111156111c05782518255916020019190600101906111a5565b5b506111e19291505b80821115610f245760008155600101610f10565b5090565b50506000868152600560209081526040822086516003909101805481855293839020909360026000196001831615610100020190911604601f90810184900482019389019083901061123e57805160ff191683800117855561126b565b8280016001018555821561126b579182015b8281111561126b578251825591602001919060010190611250565b5b5061128c9291505b80821115610f245760008155600101610f10565b5090565b50506000868152600560205260408082206004908101805461ff00191661010060ff89160217905560085482517fa4a833170000000000000000000000000000000000000000000000000000000081529182018a90529151600160a060020a039092169263a4a833179260248084019382900301818387803b156100005760325a03f11561000057505050600191505b611338565b61133860008051602061324e8339815191526124bf565b5b5b50949350505050565b60008261134f81612638565b15611378576113706113608761252f565b868661136b8761252f565b61265c565b91505b611338565b6113387f4f6e6c792070726f78793a206163636573732064656e696564000000000000006124bf565b5b5b50949350505050565b6000836113b881612638565b156113eb576113e36113c9896110bb565b6113d28961252f565b8888886113de896110bb565b6128fd565b91505b611414565b6114147f4f6e6c792070726f78793a206163636573732064656e696564000000000000006124bf565b5b5b509695505050505050565b600061143e61142f856110bb565b611438856110bb565b84612c2b565b90505b9392505050565b60036020526000908152604090208054600190910154600160a060020a03918216911682565b60008181526005602052604090205415155b919050565b60008181526005602052604090206004015462010000900460ff165b919050565b600060006114b33361252f565b90506114be836110bb565b8114156114f7576114ee7f43616e6e6f7420747275737420746f206f6e6573656c660000000000000000006124bf565b60009150610d31565b61150133846117a6565b15611538576114ee7f416c7265616479207472757374656400000000000000000000000000000000006124bf565b60009150610d31565b6000818152600360209081526040808320600160a060020a03871684526002019091529020805460ff1916600190811790915591505b50919050565b600080547f69737375616e636500000000000000000000000000000000000000000000000090600160a060020a031615801590611621575060008054604080516020908101849052815160e160020a63169f2bcd028152600160a060020a03308116600483015260248201879052338116604483015292519290931693632d3e579a9360648082019492918390030190829087803b156100005760325a03f1156100005750506040515190505b15610d31576000838152600160208190526040909120805460ff19168217905591505b5b5b50919050565b60006000611659846110bb565b600081815260036020526040902054909150600160a060020a0385811691161461168457600061168e565b61168e8184612c5a565b5b91505b5092915050565b6000816116a5816125bd565b1561172657600083815260066020526040902054600160a060020a0316158015906116e7575060008381526005602052604090206004015462010000900460ff165b156116f55760009150611721565b60008381526006602052604090208054600160a060020a031916600160a060020a038616179055600191505b611692565b61169260008051602061324e8339815191526124bf565b5b5b5092915050565b6000823361175482826117a6565b156117735761176b611765866110bb565b85612c7d565b92505b61179c565b61179c7f4f6e6c7920747275737465643a206163636573732064656e69656400000000006124bf565b5b5b505092915050565b6000600360006117b5856110bb565b815260208082019290925260409081016000908120600160a060020a038616825260020190925290205460ff1690505b92915050565b60408051602080820183526000808352848152600582528390206002908101805485516000196001831615610100020190911692909204601f8101849004840283018401909552848252929390929183018282801561188b5780601f106118605761010080835404028352916020019161188b565b820191906000526020600020905b81548152906001019060200180831161186e57829003601f168201915b505050505090505b919050565b600660205260009081526040902054600160a060020a031681565b60025481565b6000805460dc60020a6407365747570290600160a060020a031615801590611951575060008054604080516020908101849052815160e160020a63169f2bcd028152600160a060020a03308116600483015260248201879052338116604483015292519290931693632d3e579a9360648082019492918390030190829087803b156100005760325a03f1156100005750506040515190505b15610d3157600754600160a060020a0316156119705760009150610d31565b60078054600160a060020a031916600160a060020a038516179055600191505b5b5b50919050565b60008054600160a060020a0316156119b257506000610c55565b81600160a060020a031663b4ba9e1130336000604051602001526040518363ffffffff1660e060020a0281526004018083600160a060020a0316600160a060020a0316815260200182600160a060020a0316600160a060020a0316815260200192505050602060405180830381600087803b156100005760325a03f115610000575050604051511590508015611ace575081600160a060020a0316637ddc02d430336000604051602001526040518363ffffffff1660e060020a0281526004018083600160a060020a0316600160a060020a0316815260200182600160a060020a0316600160a060020a0316815260200192505050602060405180830381600087803b156100005760325a03f115610000575050604051511590505b15611adb57506000610c55565b5060008054600160a060020a031916600160a060020a03831617905560015b919050565b6000611b0a3361252f565b6001611b1582611c01565b1580611b425750600082815260036020526040902060010154611b4290600160a060020a03168383612dd9565b5b15611be157611b5c84611b55336110bb565b6001612dd9565b1515611b9457611b8b7f496e76616c696420636f7369676e6572000000000000000000000000000000006124bf565b60009250611bdc565b8360036000611ba23361252f565b815260200190815260200160002060010160006101000a815481600160a060020a030219169083600160a060020a03160217905550600192505b611bf8565b611bf860008051602061326e8339815191526124bf565b5b5b5050919050565b600081815260036020526040902060010154600160a060020a031615155b919050565b60056020526000908152604090208054600182015460048301549192909160028201916003019060ff808216916101008104821691620100009091041687565b600754600160a060020a031681565b6000611c92611c81876110bb565b868686611c8d876110bb565b612e76565b90505b95945050505050565b6000818152600560205260409020600101545b919050565b60408051602080820183526000808352848152600582528390206003018054845160026000196001841615610100020190921691909104601f81018490048402820184019095528481529293909183018282801561188b5780601f106118605761010080835404028352916020019161188b565b820191906000526020600020905b81548152906001019060200180831161186e57829003601f168201915b505050505090505b919050565b60008181526005602052604090206004015460ff165b919050565b6000611d90611d8b846110bb565b611c01565b1515611dc757611dbf7f436f7369676e6572206e6f7420736574000000000000000000000000000000006124bf565b5060006117e5565b611dd9611dd3846110bb565b83612c7d565b90505b92915050565b6040805183815260f960020a6020820152905190819003602101902060009081908190611e0e81610d39565b1515611e3057611e2b60008051602061328e8339815191526124bf565b611fe0565b611e39336110bb565b6001611e4482611c01565b1580611e715750600082815260036020526040902060010154611e7190600160a060020a03168383612dd9565b5b15611fc457861515611eb057611ea77f43616e6e6f74207265766f6b6520302076616c756500000000000000000000006124bf565b60009550611fbf565b60008881526005602052604090209450611ec9336110bb565b600081815260058701602052604090205490945087901015611f1757611ea77f4e6f7420656e6f75676820746f6b656e7320746f207265766f6b6500000000006124bf565b60009550611fbf565b60008481526005860160205260409020805488900390556001850180548890039055600854600160a060020a031663c70bbc138989611f558861259f565b6040805160e060020a63ffffffff871602815260048101949094526024840192909252600160a060020a0316604483015251606480830192600092919082900301818387803b156100005760325a03f11561000057505050611fba846000898b613152565b600195505b611fdb565b611fdb60008051602061326e8339815191526124bf565b5b5b50505b5b50505092915050565b600081611ff6816125bd565b156120655761200483611485565b1561203b576120327f4173736574206973206c6f636b656400000000000000000000000000000000006124bf565b60009150612060565b6000838152600560205260409020600401805462ff0000191662010000179055600191505b610d31565b610d3160008051602061324e8339815191526124bf565b5b5b50919050565b600081815260056020526040902060040154610100900460ff165b919050565b600060006000846120b4816125bd565b1561223a578415156120f2576120e97f43616e6e6f74207265697373756520302076616c7565000000000000000000006124bf565b60009350611e2b565b6000868152600560205260409020600481015490935060ff161515612143576120e97f43616e6e6f7420726569737375652066697865642061737365740000000000006124bf565b60009350611e2b565b60018301548581011015612183576120e97f546f74616c20737570706c79206f766572666c6f7700000000000000000000006124bf565b60009350611e2b565b61218c336110bb565b6000818152600585016020526040902080548701905560018401805487019055600854909250600160a060020a031663abafaa1687876121cb8661259f565b6040805160e060020a63ffffffff871602815260048101949094526024840192909252600160a060020a0316604483015251606480830192600092919082900301818387803b156100005760325a03f115610000575050506122306000838789613152565b600193505b611fe0565b611fe060008051602061324e8339815191526124bf565b5b5b50505092915050565b60006122678261146e565b8015611dd95750612277836110bb565b600083815260056020526040902054145b90505b92915050565b600854600160a060020a031681565b600033826122ae82826117a6565b15612304576000600360006122c2336110bb565b815260208082019290925260409081016000908120600160a060020a03891682526002019092529020805460ff1916911515919091179055600192505b611bf8565b611bf87f4f6e6c7920747275737465643a206163636573732064656e69656400000000006124bf565b5b5b5050919050565b604080518381527f03000000000000000000000000000000000000000000000000000000000000006020820152905190819003602101902060009081908190819061238081610d39565b15156123a25761239d60008051602061328e8339815191526124bf565b6124b4565b866123ac816125bd565b1561249957600088815260056020526040902094506123ca8761252f565b855490945084141561240857611ea77f43616e6e6f742070617373206f776e65727368697020746f206f6e6573656c666124bf565b60009550611fbf565b84546124139061259f565b848655600854909350600160a060020a031663a9612f72846124348761259f565b6040805160e060020a63ffffffff8616028152600160a060020a039384166004820152919092166024820152604481018c90529051606480830192600092919082900301818387803b156100005760325a03f11561000057505050600195505b611fdb565b611fdb60008051602061324e8339815191526124bf565b5b5b505b5b5050505092915050565b600854604080517fe90459f8000000000000000000000000000000000000000000000000000000008152600481018490529051600160a060020a039092169163e90459f89160248082019260009290919082900301818387803b156100005760325a03f115610000575050505b50565b600160a060020a0381166000908152600460205260408120548015156125955750600280546001019081905560008181526003602090815260408083208054600160a060020a031916600160a060020a0388169081179091558352600490915290208190555b8091505b50919050565b600081815260036020526040902054600160a060020a03165b919050565b60006125c8336110bb565b60016125d382611c01565b1580612600575060008281526003602052604090206001015461260090600160a060020a03168383612dd9565b5b15611be157612610338561225c565b92505b611bf8565b611bf860008051602061326e8339815191526124bf565b5b5b5050919050565b60008181526006602052604090205433600160a060020a039081169116145b919050565b6040805183815260fa60020a6020820152905190819003602101902060009061268481610d39565b15156126a65761131c60008051602061328e8339815191526124bf565b611338565b8260016126b282611c01565b15806126df57506000828152600360205260409020600101546126df90600160a060020a03168383612dd9565b5b156128d7576126ee8661146e565b15156127265761271d7f4173736574206973206e6f7420697373756564000000000000000000000000006124bf565b600093506128d2565b878514156127605761271d7f43616e6e6f7420617070726f766520746f206f6e6573656c66000000000000006124bf565b600093506128d2565b600086815260056020818152604080842089855290920181528183208b845260010190529020879055600854600160a060020a031663d54c8c876127a38761259f565b6127ac8b61259f565b6040805160e060020a63ffffffff8616028152600160a060020a039384166004820152919092166024820152604481018a9052606481018b90529051608480830192600092919082900301818387803b156100005760325a03f11561000057505050600086815260066020526040902054600160a060020a0316156128cd57600086815260066020526040902054600160a060020a031663233850896128518761259f565b61285a8b61259f565b8a6040518463ffffffff1660e060020a0281526004018084600160a060020a0316600160a060020a0316815260200183600160a060020a0316600160a060020a031681526020018281526020019350505050600060405180830381600087803b156100005760325a03f115610000575050505b600193505b6128ee565b6128ee60008051602061326e8339815191526124bf565b5b5b50505b5b50949350505050565b600081600161290b82611c01565b1580612938575060008281526003602052604090206001015461293890600160a060020a03168383612dd9565b5b15612c0657878914156129785761296f7f43616e6e6f742073656e6420746f206f6e6573656c66000000000000000000006124bf565b60009250610da2565b8615156129b15761296f7f43616e6e6f742073656e6420302076616c7565000000000000000000000000006124bf565b60009250610da2565b866129bc8a88612c5a565b10156129f45761296f7f496e73756666696369656e742062616c616e63650000000000000000000000006124bf565b60009250610da2565b60008551118015612a2757506040805187815260f860020a60208201529051908190036021019020612a2590610d39565b155b15612a5e5761296f7f5265666572656e63657320666561747572652069732064697361626c656400006124bf565b60009250610da2565b838914158015612a77575086612a758a8689612c2b565b105b15612aae5761296f7f4e6f7420656e6f75676820616c6c6f77616e63650000000000000000000000006124bf565b60009250610da2565b888414612ae35760008681526005602081815260408084208d8552909201815281832087845260010190529020805488900390555b612aef89898989613218565b600854600160a060020a031663515c1457612b098b61259f565b612b128b61259f565b60405160e060020a63ffffffff8516028152600160a060020a03808416600483019081529083166024830152604482018c9052606482018d905260a0608483019081528b5160a48401528b518d938f938e939092909160c4019060208501908083838215612b9b575b805182526020831115612b9b57601f199092019160209182019101612b7b565b505050905090810190601f168015612bc75780820380516001836020036101000a031916815260200191505b509650505050505050600060405180830381600087803b156100005760325a03f11561000057505050612bfc89898989613152565b600192505b6110ad565b6110ad60008051602061326e8339815191526124bf565b5b5b50509695505050505050565b6000818152600560208181526040808420878552909201815281832085845260010190529020545b9392505050565b600081815260056020818152604080842086855290920190529020545b92915050565b60006000836002612c8d82611c01565b1580612cba5750600082815260036020526040902060010154612cba90600160a060020a03168383612dd9565b5b15612db757612cc9856110bb565b15612d00576120e97f53686f756c64207265636f76657220746f206e657720616464726573730000006124bf565b60009350611e2b565b60008681526003602090815260408083208054600160a060020a038a8116600160a060020a0319831681179093558286526004948590528386208c905560085484517fea14457e00000000000000000000000000000000000000000000000000000000815292821695830186905260248301939093523381166044830152925193975091169263ea14457e9260648084019382900301818387803b156100005760325a03f11561000057505050600193505b611fe0565b611fe060008051602061326e8339815191526124bf565b5b5b50505092915050565b600083600160a060020a031663809b296d6000368660405180848480828437820191505082815260200193505050506040518091039020846000604051602001526040518363ffffffff1660e060020a02815260040180836000191660001916815260200182815260200192505050602060405180830381600087803b156100005760325a03f115610000575050604051519150505b9392505050565b600754604080516000606091820181905282517f4f71ef8100000000000000000000000000000000000000000000000000000000815260048101899052925190938493849384938493600160a060020a031692634f71ef8192602480830193919282900301818787803b156100005760325a03f115610000575050604080518051602082015191909201519196509450925050811515612f4257612f397f49434150206973206e6f742072656769737465726564000000000000000000006124bf565b60009450613145565b604080518481527f050000000000000000000000000000000000000000000000000000000000000060208201529051908190036021019020612f8390610d39565b1515612fbb57612f397f4943415020666561747572652069732064697361626c656400000000000000006124bf565b60009450613145565b612fc483612638565b1515612ffc57612f397f4f6e6c792070726f78793a206163636573732064656e696564000000000000006124bf565b60009450613145565b6130058461252f565b90506130158a828a868b8b6128fd565b15156130245760009450613145565b600854600160a060020a031663eacbc23661303e8c61259f565b6130478461259f565b8c8c8c6040518663ffffffff1660e060020a0281526004018086600160a060020a0316600160a060020a0316815260200185600160a060020a0316600160a060020a031681526020018460001916600019168152602001838152602001806020018281038252838181518152602001915080519060200190808383600083146130eb575b8051825260208311156130eb57601f1990920191602091820191016130cb565b505050905090810190601f1680156131175780820380516001836020036101000a031916815260200191505b509650505050505050600060405180830381600087803b156100005760325a03f11561000057505050600194505b5050505095945050505050565b600081815260066020526040902054600160a060020a03161561321157600081815260066020526040902054600160a060020a03166323de66516131958661259f565b61319e8661259f565b856040518463ffffffff1660e060020a0281526004018084600160a060020a0316600160a060020a0316815260200183600160a060020a0316600160a060020a031681526020018281526020019350505050600060405180830381600087803b156100005760325a03f115610000575050505b5b50505050565b600081815260056020818152604080842088855290920190528082208054859003905584825290208054830190555b5050505056004f6e6c79206f776e65723a206163636573732064656e69656400000000000000436f7369676e65723a206163636573732064656e696564000000000000000000466561747572652069732064697361626c656400000000000000000000000000a165627a7a72305820c6b0f154e0142d65bb5467dca4a26c852d2e6e792db2d104e3fe12d1f0e717710029

Deployed Bytecode

0x606060405236156101d25763ffffffff60e060020a60003504166302571be381146101d757806302927d20146102035780630610e03714610230578063085a4705146102545780630af3e66014610308578063106fcb7a1461033357806314712e2f146103dd578063161ff662146104185780631c8d5d381461049f5780632a11ced0146104d35780632f553d311461050957806332a16f4e1461052d5780634637d827146105515780634ba4079a1461057e5780634d30b6be146105a2578063638a9ce9146105d0578063648bf774146106005780636713e23014610633578063691f3431146106665780636932af36146106f65780636b4ed21b14610722578063774248a3146107415780637a386e881461076e57806382fc49b81461079b5780639666e1f9146107c85780639fda5b66146107ec578063a0f15b871461092e578063a69032ee14610957578063b524abcf146109d8578063bebcc045146109fa578063c4eeeeb914610a8a578063c6a09d9514610aae578063ca448a8814610ae1578063d0169c1e14610b08578063dc86e6f014610b2c578063e0873c0614610b52578063e96b462a14610b79578063f07629f814610ba9578063f0c06aa514610bd2578063fd83915e14610bff575b610000565b34610000576101e7600435610c2f565b60408051600160a060020a039092168252519081900360200190f35b346100005761021c600160a060020a0360043516610c5a565b604080519115158252519081900360200190f35b346100005761021c600435610d39565b604080519115158252519081900360200190f35b3461000057604080516020600460443581810135601f810184900484028501840190955284845261021c94823594602480359560649492939190920191819084018382808284375050604080516020601f89358b018035918201839004830284018301909452808352979998810197919650918201945092508291508401838280828437509496505060ff853516946020013515159350610d5192505050565b604080519115158252519081900360200190f35b3461000057610321600160a060020a03600435166110bb565b60408051918252519081900360200190f35b346100005760408051602060046024803582810135601f810185900485028601850190965285855261021c958335959394604494939290920191819084018382808284375050604080516020601f89358b018035918201839004830284018301909452808352979998810197919650918201945092508291508401838280828437509496505050923560ff1692506110da915050565b604080519115158252519081900360200190f35b346100005761021c600160a060020a03600435811690602435906044359060643516611343565b604080519115158252519081900360200190f35b3461000057604080516020601f60843560048181013592830184900484028501840190955281845261021c94600160a060020a0381358116956024803590921695604435956064359560a4940191819084018382808284375094965050509235600160a060020a031692506113ac915050565b604080519115158252519081900360200190f35b3461000057610321600160a060020a0360043581169060243516604435611421565b60408051918252519081900360200190f35b34610000576104e3600435611448565b60408051600160a060020a03938416815291909216602082015281519081900390910190f35b346100005761021c60043561146e565b604080519115158252519081900360200190f35b346100005761021c600435611485565b604080519115158252519081900360200190f35b346100005761021c600160a060020a03600435166114a6565b604080519115158252519081900360200190f35b346100005761021c600435611574565b604080519115158252519081900360200190f35b3461000057610321600160a060020a036004351660243561164c565b60408051918252519081900360200190f35b346100005761021c600160a060020a0360043516602435611699565b604080519115158252519081900360200190f35b346100005761021c600160a060020a0360043581169060243516611746565b604080519115158252519081900360200190f35b346100005761021c600160a060020a03600435811690602435166117a6565b604080519115158252519081900360200190f35b34610000576106766004356117eb565b6040805160208082528351818301528351919283929083019185019080838382156106bc575b8051825260208311156106bc57601f19909201916020918201910161069c565b505050905090810190601f1680156106e85780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34610000576101e7600435611898565b60408051600160a060020a039092168252519081900360200190f35b34610000576103216118b3565b60408051918252519081900360200190f35b346100005761021c600160a060020a03600435166118b9565b604080519115158252519081900360200190f35b346100005761021c600160a060020a0360043516611998565b604080519115158252519081900360200190f35b346100005761021c600160a060020a0360043516611aff565b604080519115158252519081900360200190f35b346100005761021c600435611c01565b604080519115158252519081900360200190f35b34610000576107fc600435611c24565b6040805188815260208101889052841515608082015260ff841660a082015282151560c082015260e0918101828152875460026001821615610100908102600019019092160493830184905291929091606084019190840190899080156108a45780601f10610879576101008083540402835291602001916108a4565b820191906000526020600020905b81548152906001019060200180831161088757829003601f168201915b50508381038252875460026000196101006001841615020190911604808252602090910190889080156109185780601f106108ed57610100808354040283529160200191610918565b820191906000526020600020905b8154815290600101906020018083116108fb57829003601f168201915b5050995050505050505050505060405180910390f35b34610000576101e7611c64565b60408051600160a060020a039092168252519081900360200190f35b3461000057604080516020600460643581810135601f810184900484028501840190955284845261021c948235600160a060020a0316946024803595604435959460849492019190819084018382808284375094965050509235600160a060020a03169250611c73915050565b604080519115158252519081900360200190f35b3461000057610321600435611c9e565b60408051918252519081900360200190f35b3461000057610676600435611cb6565b6040805160208082528351818301528351919283929083019185019080838382156106bc575b8051825260208311156106bc57601f19909201916020918201910161069c565b505050905090810190601f1680156106e85780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b346100005761021c600435611d62565b604080519115158252519081900360200190f35b346100005761021c600160a060020a0360043581169060243516611d7d565b604080519115158252519081900360200190f35b346100005761021c600435602435611de2565b604080519115158252519081900360200190f35b346100005761021c600435611fea565b604080519115158252519081900360200190f35b3461000057610b3c600435612084565b6040805160ff9092168252519081900360200190f35b346100005761021c6004356024356120a4565b604080519115158252519081900360200190f35b346100005761021c600160a060020a036004351660243561225c565b604080519115158252519081900360200190f35b34610000576101e7612291565b60408051600160a060020a039092168252519081900360200190f35b346100005761021c600160a060020a03600435166122a0565b604080519115158252519081900360200190f35b346100005761021c600435600160a060020a0360243516612336565b604080519115158252519081900360200190f35b60008181526005602090815260408083205483526003909152902054600160a060020a03165b919050565b6000805460dc60020a6407365747570290600160a060020a031615801590610cf2575060008054604080516020908101849052815160e160020a63169f2bcd028152600160a060020a03308116600483015260248201879052338116604483015292519290931693632d3e579a9360648082019492918390030190829087803b156100005760325a03f1156100005750506040515190505b15610d3157600854600160a060020a031615610d115760009150610d31565b60088054600160a060020a031916600160a060020a038516179055600191505b5b5b50919050565b60008181526001602052604090205460ff165b919050565b6040805187815282151560f860020a02602082015260006021820181905291519081900360220190208190610d8581610d39565b1515610da757610da260008051602061328e8339815191526124bf565b6110ad565b87158015610db3575083155b15610dea57610de17f43616e6e6f7420697373756520302076616c75652066697865642061737365746124bf565b600092506110ad565b610df38961146e565b15610e2a57610de17f417373657420616c7265616479206973737565640000000000000000000000006124bf565b600092506110ad565b610e333361252f565b6040805160e08101825282815260208082018c81528284018c8152606084018c9052891515608085015260ff8b1660a0850152600060c085018190528f8152600584529485208451815591516001838101919091559051805160028085018054818a5298879020999b5096989497601f61010095821615959095026000190116048301859004840194909392910190839010610eda57805160ff1916838001178555610f07565b82800160010185558215610f07579182015b82811115610f07578251825591602001919060010190610eec565b5b50610f289291505b80821115610f245760008155600101610f10565b5090565b50506060820151816003019080519060200190828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f10610f7c57805160ff1916838001178555610fa9565b82800160010185558215610fa9579182015b82811115610fa9578251825591602001919060010190610f8e565b5b50610fca9291505b80821115610f245760008155600101610f10565b5090565b505060808201516004909101805460a084015160c0909401511515620100000262ff00001960ff959095166101000261ff001994151560ff1990931692909217939093161792909216179055600089815260056020818152604080842086855290920190529020889055600854600160a060020a031663abafaa168a8a6110508661259f565b6040805160e060020a63ffffffff871602815260048101949094526024840192909252600160a060020a0316604483015251606480830192600092919082900301818387803b156100005760325a03f11561000057505050600192505b5b5b50509695505050505050565b600160a060020a0381166000908152600460205260409020545b919050565b6000846110e6816125bd565b15611321576110f486611485565b1561112b576111227f4173736574206973206c6f636b656400000000000000000000000000000000006124bf565b6000915061131c565b846005600088600019166000191681526020019081526020016000206002019080519060200190828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f1061119357805160ff19168380011785556111c0565b828001600101855582156111c0579182015b828111156111c05782518255916020019190600101906111a5565b5b506111e19291505b80821115610f245760008155600101610f10565b5090565b50506000868152600560209081526040822086516003909101805481855293839020909360026000196001831615610100020190911604601f90810184900482019389019083901061123e57805160ff191683800117855561126b565b8280016001018555821561126b579182015b8281111561126b578251825591602001919060010190611250565b5b5061128c9291505b80821115610f245760008155600101610f10565b5090565b50506000868152600560205260408082206004908101805461ff00191661010060ff89160217905560085482517fa4a833170000000000000000000000000000000000000000000000000000000081529182018a90529151600160a060020a039092169263a4a833179260248084019382900301818387803b156100005760325a03f11561000057505050600191505b611338565b61133860008051602061324e8339815191526124bf565b5b5b50949350505050565b60008261134f81612638565b15611378576113706113608761252f565b868661136b8761252f565b61265c565b91505b611338565b6113387f4f6e6c792070726f78793a206163636573732064656e696564000000000000006124bf565b5b5b50949350505050565b6000836113b881612638565b156113eb576113e36113c9896110bb565b6113d28961252f565b8888886113de896110bb565b6128fd565b91505b611414565b6114147f4f6e6c792070726f78793a206163636573732064656e696564000000000000006124bf565b5b5b509695505050505050565b600061143e61142f856110bb565b611438856110bb565b84612c2b565b90505b9392505050565b60036020526000908152604090208054600190910154600160a060020a03918216911682565b60008181526005602052604090205415155b919050565b60008181526005602052604090206004015462010000900460ff165b919050565b600060006114b33361252f565b90506114be836110bb565b8114156114f7576114ee7f43616e6e6f7420747275737420746f206f6e6573656c660000000000000000006124bf565b60009150610d31565b61150133846117a6565b15611538576114ee7f416c7265616479207472757374656400000000000000000000000000000000006124bf565b60009150610d31565b6000818152600360209081526040808320600160a060020a03871684526002019091529020805460ff1916600190811790915591505b50919050565b600080547f69737375616e636500000000000000000000000000000000000000000000000090600160a060020a031615801590611621575060008054604080516020908101849052815160e160020a63169f2bcd028152600160a060020a03308116600483015260248201879052338116604483015292519290931693632d3e579a9360648082019492918390030190829087803b156100005760325a03f1156100005750506040515190505b15610d31576000838152600160208190526040909120805460ff19168217905591505b5b5b50919050565b60006000611659846110bb565b600081815260036020526040902054909150600160a060020a0385811691161461168457600061168e565b61168e8184612c5a565b5b91505b5092915050565b6000816116a5816125bd565b1561172657600083815260066020526040902054600160a060020a0316158015906116e7575060008381526005602052604090206004015462010000900460ff165b156116f55760009150611721565b60008381526006602052604090208054600160a060020a031916600160a060020a038616179055600191505b611692565b61169260008051602061324e8339815191526124bf565b5b5b5092915050565b6000823361175482826117a6565b156117735761176b611765866110bb565b85612c7d565b92505b61179c565b61179c7f4f6e6c7920747275737465643a206163636573732064656e69656400000000006124bf565b5b5b505092915050565b6000600360006117b5856110bb565b815260208082019290925260409081016000908120600160a060020a038616825260020190925290205460ff1690505b92915050565b60408051602080820183526000808352848152600582528390206002908101805485516000196001831615610100020190911692909204601f8101849004840283018401909552848252929390929183018282801561188b5780601f106118605761010080835404028352916020019161188b565b820191906000526020600020905b81548152906001019060200180831161186e57829003601f168201915b505050505090505b919050565b600660205260009081526040902054600160a060020a031681565b60025481565b6000805460dc60020a6407365747570290600160a060020a031615801590611951575060008054604080516020908101849052815160e160020a63169f2bcd028152600160a060020a03308116600483015260248201879052338116604483015292519290931693632d3e579a9360648082019492918390030190829087803b156100005760325a03f1156100005750506040515190505b15610d3157600754600160a060020a0316156119705760009150610d31565b60078054600160a060020a031916600160a060020a038516179055600191505b5b5b50919050565b60008054600160a060020a0316156119b257506000610c55565b81600160a060020a031663b4ba9e1130336000604051602001526040518363ffffffff1660e060020a0281526004018083600160a060020a0316600160a060020a0316815260200182600160a060020a0316600160a060020a0316815260200192505050602060405180830381600087803b156100005760325a03f115610000575050604051511590508015611ace575081600160a060020a0316637ddc02d430336000604051602001526040518363ffffffff1660e060020a0281526004018083600160a060020a0316600160a060020a0316815260200182600160a060020a0316600160a060020a0316815260200192505050602060405180830381600087803b156100005760325a03f115610000575050604051511590505b15611adb57506000610c55565b5060008054600160a060020a031916600160a060020a03831617905560015b919050565b6000611b0a3361252f565b6001611b1582611c01565b1580611b425750600082815260036020526040902060010154611b4290600160a060020a03168383612dd9565b5b15611be157611b5c84611b55336110bb565b6001612dd9565b1515611b9457611b8b7f496e76616c696420636f7369676e6572000000000000000000000000000000006124bf565b60009250611bdc565b8360036000611ba23361252f565b815260200190815260200160002060010160006101000a815481600160a060020a030219169083600160a060020a03160217905550600192505b611bf8565b611bf860008051602061326e8339815191526124bf565b5b5b5050919050565b600081815260036020526040902060010154600160a060020a031615155b919050565b60056020526000908152604090208054600182015460048301549192909160028201916003019060ff808216916101008104821691620100009091041687565b600754600160a060020a031681565b6000611c92611c81876110bb565b868686611c8d876110bb565b612e76565b90505b95945050505050565b6000818152600560205260409020600101545b919050565b60408051602080820183526000808352848152600582528390206003018054845160026000196001841615610100020190921691909104601f81018490048402820184019095528481529293909183018282801561188b5780601f106118605761010080835404028352916020019161188b565b820191906000526020600020905b81548152906001019060200180831161186e57829003601f168201915b505050505090505b919050565b60008181526005602052604090206004015460ff165b919050565b6000611d90611d8b846110bb565b611c01565b1515611dc757611dbf7f436f7369676e6572206e6f7420736574000000000000000000000000000000006124bf565b5060006117e5565b611dd9611dd3846110bb565b83612c7d565b90505b92915050565b6040805183815260f960020a6020820152905190819003602101902060009081908190611e0e81610d39565b1515611e3057611e2b60008051602061328e8339815191526124bf565b611fe0565b611e39336110bb565b6001611e4482611c01565b1580611e715750600082815260036020526040902060010154611e7190600160a060020a03168383612dd9565b5b15611fc457861515611eb057611ea77f43616e6e6f74207265766f6b6520302076616c756500000000000000000000006124bf565b60009550611fbf565b60008881526005602052604090209450611ec9336110bb565b600081815260058701602052604090205490945087901015611f1757611ea77f4e6f7420656e6f75676820746f6b656e7320746f207265766f6b6500000000006124bf565b60009550611fbf565b60008481526005860160205260409020805488900390556001850180548890039055600854600160a060020a031663c70bbc138989611f558861259f565b6040805160e060020a63ffffffff871602815260048101949094526024840192909252600160a060020a0316604483015251606480830192600092919082900301818387803b156100005760325a03f11561000057505050611fba846000898b613152565b600195505b611fdb565b611fdb60008051602061326e8339815191526124bf565b5b5b50505b5b50505092915050565b600081611ff6816125bd565b156120655761200483611485565b1561203b576120327f4173736574206973206c6f636b656400000000000000000000000000000000006124bf565b60009150612060565b6000838152600560205260409020600401805462ff0000191662010000179055600191505b610d31565b610d3160008051602061324e8339815191526124bf565b5b5b50919050565b600081815260056020526040902060040154610100900460ff165b919050565b600060006000846120b4816125bd565b1561223a578415156120f2576120e97f43616e6e6f74207265697373756520302076616c7565000000000000000000006124bf565b60009350611e2b565b6000868152600560205260409020600481015490935060ff161515612143576120e97f43616e6e6f7420726569737375652066697865642061737365740000000000006124bf565b60009350611e2b565b60018301548581011015612183576120e97f546f74616c20737570706c79206f766572666c6f7700000000000000000000006124bf565b60009350611e2b565b61218c336110bb565b6000818152600585016020526040902080548701905560018401805487019055600854909250600160a060020a031663abafaa1687876121cb8661259f565b6040805160e060020a63ffffffff871602815260048101949094526024840192909252600160a060020a0316604483015251606480830192600092919082900301818387803b156100005760325a03f115610000575050506122306000838789613152565b600193505b611fe0565b611fe060008051602061324e8339815191526124bf565b5b5b50505092915050565b60006122678261146e565b8015611dd95750612277836110bb565b600083815260056020526040902054145b90505b92915050565b600854600160a060020a031681565b600033826122ae82826117a6565b15612304576000600360006122c2336110bb565b815260208082019290925260409081016000908120600160a060020a03891682526002019092529020805460ff1916911515919091179055600192505b611bf8565b611bf87f4f6e6c7920747275737465643a206163636573732064656e69656400000000006124bf565b5b5b5050919050565b604080518381527f03000000000000000000000000000000000000000000000000000000000000006020820152905190819003602101902060009081908190819061238081610d39565b15156123a25761239d60008051602061328e8339815191526124bf565b6124b4565b866123ac816125bd565b1561249957600088815260056020526040902094506123ca8761252f565b855490945084141561240857611ea77f43616e6e6f742070617373206f776e65727368697020746f206f6e6573656c666124bf565b60009550611fbf565b84546124139061259f565b848655600854909350600160a060020a031663a9612f72846124348761259f565b6040805160e060020a63ffffffff8616028152600160a060020a039384166004820152919092166024820152604481018c90529051606480830192600092919082900301818387803b156100005760325a03f11561000057505050600195505b611fdb565b611fdb60008051602061324e8339815191526124bf565b5b5b505b5b5050505092915050565b600854604080517fe90459f8000000000000000000000000000000000000000000000000000000008152600481018490529051600160a060020a039092169163e90459f89160248082019260009290919082900301818387803b156100005760325a03f115610000575050505b50565b600160a060020a0381166000908152600460205260408120548015156125955750600280546001019081905560008181526003602090815260408083208054600160a060020a031916600160a060020a0388169081179091558352600490915290208190555b8091505b50919050565b600081815260036020526040902054600160a060020a03165b919050565b60006125c8336110bb565b60016125d382611c01565b1580612600575060008281526003602052604090206001015461260090600160a060020a03168383612dd9565b5b15611be157612610338561225c565b92505b611bf8565b611bf860008051602061326e8339815191526124bf565b5b5b5050919050565b60008181526006602052604090205433600160a060020a039081169116145b919050565b6040805183815260fa60020a6020820152905190819003602101902060009061268481610d39565b15156126a65761131c60008051602061328e8339815191526124bf565b611338565b8260016126b282611c01565b15806126df57506000828152600360205260409020600101546126df90600160a060020a03168383612dd9565b5b156128d7576126ee8661146e565b15156127265761271d7f4173736574206973206e6f7420697373756564000000000000000000000000006124bf565b600093506128d2565b878514156127605761271d7f43616e6e6f7420617070726f766520746f206f6e6573656c66000000000000006124bf565b600093506128d2565b600086815260056020818152604080842089855290920181528183208b845260010190529020879055600854600160a060020a031663d54c8c876127a38761259f565b6127ac8b61259f565b6040805160e060020a63ffffffff8616028152600160a060020a039384166004820152919092166024820152604481018a9052606481018b90529051608480830192600092919082900301818387803b156100005760325a03f11561000057505050600086815260066020526040902054600160a060020a0316156128cd57600086815260066020526040902054600160a060020a031663233850896128518761259f565b61285a8b61259f565b8a6040518463ffffffff1660e060020a0281526004018084600160a060020a0316600160a060020a0316815260200183600160a060020a0316600160a060020a031681526020018281526020019350505050600060405180830381600087803b156100005760325a03f115610000575050505b600193505b6128ee565b6128ee60008051602061326e8339815191526124bf565b5b5b50505b5b50949350505050565b600081600161290b82611c01565b1580612938575060008281526003602052604090206001015461293890600160a060020a03168383612dd9565b5b15612c0657878914156129785761296f7f43616e6e6f742073656e6420746f206f6e6573656c66000000000000000000006124bf565b60009250610da2565b8615156129b15761296f7f43616e6e6f742073656e6420302076616c7565000000000000000000000000006124bf565b60009250610da2565b866129bc8a88612c5a565b10156129f45761296f7f496e73756666696369656e742062616c616e63650000000000000000000000006124bf565b60009250610da2565b60008551118015612a2757506040805187815260f860020a60208201529051908190036021019020612a2590610d39565b155b15612a5e5761296f7f5265666572656e63657320666561747572652069732064697361626c656400006124bf565b60009250610da2565b838914158015612a77575086612a758a8689612c2b565b105b15612aae5761296f7f4e6f7420656e6f75676820616c6c6f77616e63650000000000000000000000006124bf565b60009250610da2565b888414612ae35760008681526005602081815260408084208d8552909201815281832087845260010190529020805488900390555b612aef89898989613218565b600854600160a060020a031663515c1457612b098b61259f565b612b128b61259f565b60405160e060020a63ffffffff8516028152600160a060020a03808416600483019081529083166024830152604482018c9052606482018d905260a0608483019081528b5160a48401528b518d938f938e939092909160c4019060208501908083838215612b9b575b805182526020831115612b9b57601f199092019160209182019101612b7b565b505050905090810190601f168015612bc75780820380516001836020036101000a031916815260200191505b509650505050505050600060405180830381600087803b156100005760325a03f11561000057505050612bfc89898989613152565b600192505b6110ad565b6110ad60008051602061326e8339815191526124bf565b5b5b50509695505050505050565b6000818152600560208181526040808420878552909201815281832085845260010190529020545b9392505050565b600081815260056020818152604080842086855290920190529020545b92915050565b60006000836002612c8d82611c01565b1580612cba5750600082815260036020526040902060010154612cba90600160a060020a03168383612dd9565b5b15612db757612cc9856110bb565b15612d00576120e97f53686f756c64207265636f76657220746f206e657720616464726573730000006124bf565b60009350611e2b565b60008681526003602090815260408083208054600160a060020a038a8116600160a060020a0319831681179093558286526004948590528386208c905560085484517fea14457e00000000000000000000000000000000000000000000000000000000815292821695830186905260248301939093523381166044830152925193975091169263ea14457e9260648084019382900301818387803b156100005760325a03f11561000057505050600193505b611fe0565b611fe060008051602061326e8339815191526124bf565b5b5b50505092915050565b600083600160a060020a031663809b296d6000368660405180848480828437820191505082815260200193505050506040518091039020846000604051602001526040518363ffffffff1660e060020a02815260040180836000191660001916815260200182815260200192505050602060405180830381600087803b156100005760325a03f115610000575050604051519150505b9392505050565b600754604080516000606091820181905282517f4f71ef8100000000000000000000000000000000000000000000000000000000815260048101899052925190938493849384938493600160a060020a031692634f71ef8192602480830193919282900301818787803b156100005760325a03f115610000575050604080518051602082015191909201519196509450925050811515612f4257612f397f49434150206973206e6f742072656769737465726564000000000000000000006124bf565b60009450613145565b604080518481527f050000000000000000000000000000000000000000000000000000000000000060208201529051908190036021019020612f8390610d39565b1515612fbb57612f397f4943415020666561747572652069732064697361626c656400000000000000006124bf565b60009450613145565b612fc483612638565b1515612ffc57612f397f4f6e6c792070726f78793a206163636573732064656e696564000000000000006124bf565b60009450613145565b6130058461252f565b90506130158a828a868b8b6128fd565b15156130245760009450613145565b600854600160a060020a031663eacbc23661303e8c61259f565b6130478461259f565b8c8c8c6040518663ffffffff1660e060020a0281526004018086600160a060020a0316600160a060020a0316815260200185600160a060020a0316600160a060020a031681526020018460001916600019168152602001838152602001806020018281038252838181518152602001915080519060200190808383600083146130eb575b8051825260208311156130eb57601f1990920191602091820191016130cb565b505050905090810190601f1680156131175780820380516001836020036101000a031916815260200191505b509650505050505050600060405180830381600087803b156100005760325a03f11561000057505050600194505b5050505095945050505050565b600081815260066020526040902054600160a060020a03161561321157600081815260066020526040902054600160a060020a03166323de66516131958661259f565b61319e8661259f565b856040518463ffffffff1660e060020a0281526004018084600160a060020a0316600160a060020a0316815260200183600160a060020a0316600160a060020a031681526020018281526020019350505050600060405180830381600087803b156100005760325a03f115610000575050505b5b50505050565b600081815260056020818152604080842088855290920190528082208054859003905584825290208054830190555b5050505056004f6e6c79206f776e65723a206163636573732064656e69656400000000000000436f7369676e65723a206163636573732064656e696564000000000000000000466561747572652069732064697361626c656400000000000000000000000000a165627a7a72305820c6b0f154e0142d65bb5467dca4a26c852d2e6e792db2d104e3fe12d1f0e717710029

Swarm Source

bzzr://c6b0f154e0142d65bb5467dca4a26c852d2e6e792db2d104e3fe12d1f0e71771

Block Transaction Difficulty Gas Used Reward
View All Blocks Produced

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

Validator Index Block Amount
View All Withdrawals

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

A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.