ETH Price: $3,357.71 (-8.48%)

Contract

0xE4c94d45f7Aef7018a5D66f44aF780ec6023378e
 
Transaction Hash
Method
Block
From
To
Approve204530122024-08-04 5:11:23138 days ago1722748283IN
0xE4c94d45...c6023378e
0 ETH0.000115721
Approve204090782024-07-29 1:56:35144 days ago1722218195IN
0xE4c94d45...c6023378e
0 ETH0.000115721
Approve204084912024-07-28 23:58:47144 days ago1722211127IN
0xE4c94d45...c6023378e
0 ETH0.000115721
Transfer152887332022-08-06 12:29:20866 days ago1659788960IN
0xE4c94d45...c6023378e
0 ETH0.000617842.9
Transfer151990452022-07-23 12:57:45880 days ago1658581065IN
0xE4c94d45...c6023378e
0 ETH0.000767784
Transfer138419552021-12-20 12:19:331095 days ago1640002773IN
0xE4c94d45...c6023378e
0 ETH0.0072619442.11678558
Transfer135837222021-11-09 18:23:221136 days ago1636482202IN
0xE4c94d45...c6023378e
0 ETH0.01970094179.3
Transfer135836392021-11-09 18:04:291136 days ago1636481069IN
0xE4c94d45...c6023378e
0 ETH0.021973200
Transfer135836392021-11-09 18:04:291136 days ago1636481069IN
0xE4c94d45...c6023378e
0 ETH0.0344848200
Transfer133652822021-10-06 11:57:351170 days ago1633521455IN
0xE4c94d45...c6023378e
0 ETH0.0085804578.1
Transfer129257512021-07-30 7:48:451238 days ago1627631325IN
0xE4c94d45...c6023378e
0 ETH0.0022922923
Transfer129203282021-07-29 10:56:201239 days ago1627556180IN
0xE4c94d45...c6023378e
0 ETH0.0028023624
Transfer128321942021-07-15 15:01:331253 days ago1626361293IN
0xE4c94d45...c6023378e
0 ETH0.004586640
Transfer128321882021-07-15 15:00:041253 days ago1626361204IN
0xE4c94d45...c6023378e
0 ETH0.004586640
Transfer128321862021-07-15 14:59:231253 days ago1626361163IN
0xE4c94d45...c6023378e
0 ETH0.0045861240
Transfer128316102021-07-15 12:41:151253 days ago1626352875IN
0xE4c94d45...c6023378e
0 ETH0.0039812734.1
Transfer127845122021-07-08 4:10:031261 days ago1625717403IN
0xE4c94d45...c6023378e
0 ETH0.003467229.7
Transfer127821992021-07-07 19:27:571261 days ago1625686077IN
0xE4c94d45...c6023378e
0 ETH0.0038989222
Transfer127816662021-07-07 17:25:231261 days ago1625678723IN
0xE4c94d45...c6023378e
0 ETH0.0038986622
Transfer127816662021-07-07 17:25:231261 days ago1625678723IN
0xE4c94d45...c6023378e
0 ETH0.0025226322
Transfer127816662021-07-07 17:25:231261 days ago1625678723IN
0xE4c94d45...c6023378e
0 ETH0.0038986622
Transfer127816512021-07-07 17:22:271261 days ago1625678547IN
0xE4c94d45...c6023378e
0 ETH0.0025226322
Transfer127816412021-07-07 17:20:211261 days ago1625678421IN
0xE4c94d45...c6023378e
0 ETH0.0038989222
Transfer127816412021-07-07 17:20:211261 days ago1625678421IN
0xE4c94d45...c6023378e
0 ETH0.0038986622
Transfer127816412021-07-07 17:20:211261 days ago1625678421IN
0xE4c94d45...c6023378e
0 ETH0.0038986622
View all transactions

Latest 25 internal transactions (View All)

Advanced mode:
Parent Transaction Hash Block
From
To
108343702020-09-10 13:51:361561 days ago1599745896
0xE4c94d45...c6023378e
0.1 ETH
61342152018-08-12 13:07:042321 days ago1534079224
0xE4c94d45...c6023378e
0.005 ETH
54635802018-04-18 16:37:462437 days ago1524069466
0xE4c94d45...c6023378e
0.00005 ETH
54092092018-04-09 12:25:362446 days ago1523276736
0xE4c94d45...c6023378e
0.001 ETH
24405302016-10-14 19:49:422988 days ago1476474582
0xE4c94d45...c6023378e
0 ETH
24405272016-10-14 19:49:162988 days ago1476474556
0xE4c94d45...c6023378e
0 ETH
24396002016-10-14 16:14:242988 days ago1476461664
0xE4c94d45...c6023378e
0 ETH
24395942016-10-14 16:13:532988 days ago1476461633
0xE4c94d45...c6023378e
0 ETH
24395922016-10-14 16:13:122988 days ago1476461592
0xE4c94d45...c6023378e
0 ETH
24391492016-10-14 14:29:042988 days ago1476455344
0xE4c94d45...c6023378e
0 ETH
24390742016-10-14 14:07:272988 days ago1476454047
0xE4c94d45...c6023378e
0 ETH
24389482016-10-14 13:30:492988 days ago1476451849
0xE4c94d45...c6023378e
0 ETH
24389362016-10-14 13:27:502988 days ago1476451670
0xE4c94d45...c6023378e
0 ETH
24388632016-10-14 13:10:532988 days ago1476450653
0xE4c94d45...c6023378e
0 ETH
24387242016-10-14 12:32:192988 days ago1476448339
0xE4c94d45...c6023378e
0 ETH
24385172016-10-14 11:39:212988 days ago1476445161
0xE4c94d45...c6023378e
0 ETH
24385072016-10-14 11:35:482988 days ago1476444948
0xE4c94d45...c6023378e
0 ETH
24384652016-10-14 11:24:342988 days ago1476444274
0xE4c94d45...c6023378e
0 ETH
24384592016-10-14 11:22:492988 days ago1476444169
0xE4c94d45...c6023378e
0 ETH
24384382016-10-14 11:18:022988 days ago1476443882
0xE4c94d45...c6023378e
0 ETH
24384352016-10-14 11:17:302988 days ago1476443850
0xE4c94d45...c6023378e
0 ETH
24384332016-10-14 11:17:032988 days ago1476443823
0xE4c94d45...c6023378e
0 ETH
24383882016-10-14 11:07:592988 days ago1476443279
0xE4c94d45...c6023378e
0 ETH
24383832016-10-14 11:06:362988 days ago1476443196
0xE4c94d45...c6023378e
0 ETH
24383322016-10-14 10:55:592988 days ago1476442559
0xE4c94d45...c6023378e
0 ETH
View All Internal Transactions
Loading...
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
CryptoCarbon

Compiler Version
v0.3.5-2016-07-21-6610add

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2016-08-31
*/

contract MultiAsset {
    function isCreated(bytes32 _symbol) constant returns(bool);
    function owner(bytes32 _symbol) constant returns(address);
    function totalSupply(bytes32 _symbol) constant returns(uint);
    function balanceOf(address _holder, bytes32 _symbol) constant returns(uint);
    function transfer(address _to, uint _value, bytes32 _symbol) returns(bool);
    function proxyTransferWithReference(address _to, uint _value, bytes32 _symbol, string _reference) returns(bool);
    function proxyTransferToICAPWithReference(bytes32 _icap, uint _value, string _reference) returns(bool);
    function proxyApprove(address _spender, uint _value, bytes32 _symbol) returns(bool);
    function allowance(address _from, address _spender, bytes32 _symbol) constant returns(uint);
    function transferFromWithReference(address _from, address _to, uint _value, bytes32 _symbol, string _reference) returns(bool);
    function transferFromToICAPWithReference(address _from, bytes32 _icap, uint _value, string _reference) returns(bool);
    function proxyTransferFromWithReference(address _from, address _to, uint _value, bytes32 _symbol, string _reference) returns(bool);
    function proxyTransferFromToICAPWithReference(address _from, bytes32 _icap, uint _value, string _reference) returns(bool);
    function proxySetCosignerAddress(address _address, bytes32 _symbol) returns(bool);
}

contract Ambi {
    function getNodeAddress(bytes32 _name) constant returns (address);
    function addNode(bytes32 _name, address _addr) external returns (bool);
    function hasRelation(bytes32 _from, bytes32 _role, address _to) constant returns (bool);
}

contract EtherTreasuryInterface {
    function withdraw(address _to, uint _value) returns(bool);
}

contract Safe {
    // Should always be placed as first modifier!
    modifier noValue {
        if (msg.value > 0) {
            // Internal Out Of Gas/Throw: revert this transaction too;
            // Call Stack Depth Limit reached: revert this transaction too;
            // Recursive Call: safe, no any changes applied yet, we are inside of modifier.
            _safeSend(msg.sender, msg.value);
        }
        _
    }

    modifier onlyHuman {
        if (_isHuman()) {
            _
        }
    }

    modifier noCallback {
        if (!isCall) {
            _
        }
    }

    modifier immutable(address _address) {
        if (_address == 0) {
            _
        }
    }

    address stackDepthLib;
    function setupStackDepthLib(address _stackDepthLib) immutable(address(stackDepthLib)) returns(bool) {
        stackDepthLib = _stackDepthLib;
        return true;
    }

    modifier requireStackDepth(uint16 _depth) {
        if (stackDepthLib == 0x0) {
            throw;
        }
        if (_depth > 1023) {
            throw;
        }
        if (!stackDepthLib.delegatecall(0x32921690, stackDepthLib, _depth)) {
            throw;
        }
        _
    }

    // Must not be used inside the functions that have noValue() modifier!
    function _safeFalse() internal noValue() returns(bool) {
        return false;
    }

    function _safeSend(address _to, uint _value) internal {
        if (!_unsafeSend(_to, _value)) {
            throw;
        }
    }

    function _unsafeSend(address _to, uint _value) internal returns(bool) {
        return _to.call.value(_value)();
    }

    function _isContract() constant internal returns(bool) {
        return msg.sender != tx.origin;
    }

    function _isHuman() constant internal returns(bool) {
        return !_isContract();
    }

    bool private isCall = false;
    function _setupNoCallback() internal {
        isCall = true;
    }

    function _finishNoCallback() internal {
        isCall = false;
    }
}

contract Asset is Safe {
    event Transfer(address indexed from, address indexed to, uint value);
    event Approve(address indexed from, address indexed spender, uint value);

    MultiAsset public multiAsset;
    bytes32 public symbol;

    function init(address _multiAsset, bytes32 _symbol) noValue() immutable(address(multiAsset)) returns(bool) {
        MultiAsset ma = MultiAsset(_multiAsset);
        if (!ma.isCreated(_symbol)) {
            return false;
        }
        multiAsset = ma;
        symbol = _symbol;
        return true;
    }

    modifier onlyMultiAsset() {
        if (msg.sender == address(multiAsset)) {
            _
        }
    }

    function totalSupply() constant returns(uint) {
        return multiAsset.totalSupply(symbol);
    }

    function balanceOf(address _owner) constant returns(uint) {
        return multiAsset.balanceOf(_owner, symbol);
    }

    function allowance(address _from, address _spender) constant returns(uint) {
        return multiAsset.allowance(_from, _spender, symbol);
    }

    function transfer(address _to, uint _value) returns(bool) {
        return __transferWithReference(_to, _value, "");
    }

    function transferWithReference(address _to, uint _value, string _reference) returns(bool) {
        return __transferWithReference(_to, _value, _reference);
    }

    function __transferWithReference(address _to, uint _value, string _reference) private noValue() returns(bool) {
        return _isHuman() ?
            multiAsset.proxyTransferWithReference(_to, _value, symbol, _reference) :
            multiAsset.transferFromWithReference(msg.sender, _to, _value, symbol, _reference);
    }

    function transferToICAP(bytes32 _icap, uint _value) returns(bool) {
        return __transferToICAPWithReference(_icap, _value, "");
    }

    function transferToICAPWithReference(bytes32 _icap, uint _value, string _reference) returns(bool) {
        return __transferToICAPWithReference(_icap, _value, _reference);
    }

    function __transferToICAPWithReference(bytes32 _icap, uint _value, string _reference) private noValue() returns(bool) {
        return _isHuman() ?
            multiAsset.proxyTransferToICAPWithReference(_icap, _value, _reference) :
            multiAsset.transferFromToICAPWithReference(msg.sender, _icap, _value, _reference);
    }
    
    function transferFrom(address _from, address _to, uint _value) returns(bool) {
        return __transferFromWithReference(_from, _to, _value, "");
    }

    function transferFromWithReference(address _from, address _to, uint _value, string _reference) returns(bool) {
        return __transferFromWithReference(_from, _to, _value, _reference);
    }

    function __transferFromWithReference(address _from, address _to, uint _value, string _reference) private noValue() onlyHuman() returns(bool) {
        return multiAsset.proxyTransferFromWithReference(_from, _to, _value, symbol, _reference);
    }

    function transferFromToICAP(address _from, bytes32 _icap, uint _value) returns(bool) {
        return __transferFromToICAPWithReference(_from, _icap, _value, "");
    }

    function transferFromToICAPWithReference(address _from, bytes32 _icap, uint _value, string _reference) returns(bool) {
        return __transferFromToICAPWithReference(_from, _icap, _value, _reference);
    }

    function __transferFromToICAPWithReference(address _from, bytes32 _icap, uint _value, string _reference) private noValue() onlyHuman() returns(bool) {
        return multiAsset.proxyTransferFromToICAPWithReference(_from, _icap, _value, _reference);
    }

    function approve(address _spender, uint _value) noValue() onlyHuman() returns(bool) {
        return multiAsset.proxyApprove(_spender, _value, symbol);
    }

    function setCosignerAddress(address _cosigner) noValue() onlyHuman() returns(bool) {
        return multiAsset.proxySetCosignerAddress(_cosigner, symbol);
    }

    function emitTransfer(address _from, address _to, uint _value) onlyMultiAsset() {
        Transfer(_from, _to, _value);
    }

    function emitApprove(address _from, address _spender, uint _value) onlyMultiAsset() {
        Approve(_from, _spender, _value);
    }

    function sendToOwner() noValue() returns(bool) {
        address owner = multiAsset.owner(symbol);
        uint balance = this.balance;
        bool success = true;
        if (balance > 0) {
            success = _unsafeSend(owner, balance);
        }
        return multiAsset.transfer(owner, balanceOf(owner), symbol) && success;
    }
}

contract AmbiEnabled {
    Ambi public ambiC;
    bool public isImmortal;
    bytes32 public name;

    modifier checkAccess(bytes32 _role) {
        if(address(ambiC) != 0x0 && ambiC.hasRelation(name, _role, msg.sender)){
            _
        }
    }
    
    function getAddress(bytes32 _name) constant returns (address) {
        return ambiC.getNodeAddress(_name);
    }

    function setAmbiAddress(address _ambi, bytes32 _name) returns (bool){
        if(address(ambiC) != 0x0){
            return false;
        }
        Ambi ambiContract = Ambi(_ambi);
        if(ambiContract.getNodeAddress(_name)!=address(this)) {
            if (!ambiContract.addNode(_name, address(this))){
                return false;
            }
        }
        name = _name;
        ambiC = ambiContract;
        return true;
    }

    function immortality() checkAccess("owner") returns(bool) {
        isImmortal = true;
        return true;
    }

    function remove() checkAccess("owner") returns(bool) {
        if (isImmortal) {
            return false;
        }
        selfdestruct(msg.sender);
        return true;
    }
}

contract CryptoCarbon is Asset, AmbiEnabled {
    uint public txGasPriceLimit = 21000000000;
    uint public refundGas = 40000;
    uint public transferCallGas = 21000;
    uint public transferWithReferenceCallGas = 21000;
    uint public transferFromCallGas = 21000;
    uint public transferFromWithReferenceCallGas = 21000;
    uint public transferToICAPCallGas = 21000;
    uint public transferToICAPWithReferenceCallGas = 21000;
    uint public transferFromToICAPCallGas = 21000;
    uint public transferFromToICAPWithReferenceCallGas = 21000;
    uint public approveCallGas = 21000;
    uint public forwardCallGas = 21000;
    uint public setCosignerCallGas = 21000;
    uint public absMinFee;
    uint public feePercent; // set up in 1/100 of percent, 10 is 0.1%
    uint public absMaxFee;
    EtherTreasuryInterface public treasury;
    address public feeAddress;
    bool private __isAllowed;
    mapping(bytes32 => address) public allowedForwards;

    function setFeeStructure(uint _absMinFee, uint _feePercent, uint _absMaxFee) noValue() checkAccess("cron") returns (bool) {
        if(_feePercent > 10000 || _absMaxFee < _absMinFee) {
            return false;
        }
        absMinFee = _absMinFee;
        feePercent = _feePercent;
        absMaxFee = _absMaxFee;
        return true;
    }

    function setupFee(address _feeAddress) noValue() checkAccess("admin") returns(bool) {
        feeAddress = _feeAddress;
        return true;
    }

    function updateRefundGas() noValue() checkAccess("setup") returns(uint) {
        uint startGas = msg.gas;
        // just to simulate calculations
        uint refund = (startGas - msg.gas + refundGas) * tx.gasprice;
        if (tx.gasprice > txGasPriceLimit) {
            return 0;
        }
        // end
        if (!_refund(5000000000000000)) {
            return 0;
        }
        refundGas = startGas - msg.gas;
        return refundGas;
    }

    function setOperationsCallGas(
        uint _transfer,
        uint _transferFrom,
        uint _transferToICAP,
        uint _transferFromToICAP,
        uint _transferWithReference,
        uint _transferFromWithReference,
        uint _transferToICAPWithReference,
        uint _transferFromToICAPWithReference,
        uint _approve,
        uint _forward,
        uint _setCosigner
    )
        noValue()
        checkAccess("setup")
        returns(bool)
    {
        transferCallGas = _transfer;
        transferFromCallGas = _transferFrom;
        transferToICAPCallGas = _transferToICAP;
        transferFromToICAPCallGas = _transferFromToICAP;
        transferWithReferenceCallGas = _transferWithReference;
        transferFromWithReferenceCallGas = _transferFromWithReference;
        transferToICAPWithReferenceCallGas = _transferToICAPWithReference;
        transferFromToICAPWithReferenceCallGas = _transferFromToICAPWithReference;
        approveCallGas = _approve;
        forwardCallGas = _forward;
        setCosignerCallGas = _setCosigner;
        return true;
    }

    function setupTreasury(address _treasury, uint _txGasPriceLimit) checkAccess("admin") returns(bool) {
        if (_txGasPriceLimit == 0) {
            return _safeFalse();
        }
        treasury = EtherTreasuryInterface(_treasury);
        txGasPriceLimit = _txGasPriceLimit;
        if (msg.value > 0) {
            _safeSend(_treasury, msg.value);
        }
        return true;
    }

    function setForward(bytes4 _msgSig, address _forward) noValue() checkAccess("admin") returns(bool) {
        allowedForwards[sha3(_msgSig)] = _forward;
        return true;
    }

    function _stringGas(string _string) constant internal returns(uint) {
        return bytes(_string).length * 75; // ~75 gas per byte, empirical shown 68-72.
    }

    function _transferFee(address _feeFrom, uint _value, string _reference) internal returns(bool) {
        if (feeAddress == 0x0 || feeAddress == _feeFrom || _value == 0) {
            return true;
        }
        return multiAsset.transferFromWithReference(_feeFrom, feeAddress, _value, symbol, _reference);
    }

    function _returnFee(address _to, uint _value) internal returns(bool, bool) {
        if (feeAddress == 0x0 || feeAddress == _to || _value == 0) {
            return (false, true);
        }
        if (!multiAsset.transferFromWithReference(feeAddress, _to, _value, symbol, "Fee return")) {
            throw;
        }
        return (false, true);
    }

    function _applyRefund(uint _startGas) internal returns(bool) {
        uint refund = (_startGas - msg.gas + refundGas) * tx.gasprice;
        return _refund(refund);
    }

    function _refund(uint _value) internal returns(bool) {
        if (tx.gasprice > txGasPriceLimit) {
            return false;
        }
        return treasury.withdraw(tx.origin, _value);
    }

    function _allow() internal {
        __isAllowed = true;
    }

    function _disallow() internal {
        __isAllowed = false;
    }

    function calculateFee(uint _value) constant returns(uint) {
        uint fee = (_value * feePercent) / 10000;
        if (fee < absMinFee) {
            return absMinFee;
        }
        if (fee > absMaxFee) {
            return absMaxFee;
        }
        return fee;
    }

    function calculateFeeDynamic(uint _value, uint _additionalGas) constant returns(uint) {
        uint fee = calculateFee(_value);
        if (_additionalGas <= 7500) {
            return fee;
        }
        // Assuming that absMinFee covers at least 100000 gas refund, let's add another absMinFee
        // for every other 100000 additional gas.
        uint additionalFee = ((_additionalGas / 100000) + 1) * absMinFee;
        return fee + additionalFee;
    }

    function takeFee(address _feeFrom, uint _value, string _reference) noValue() checkAccess("fee") returns(bool) {
        return _transferFee(_feeFrom, _value, _reference);
    }

    function _transfer(address _to, uint _value) internal returns(bool, bool) {
        uint startGas = msg.gas + transferCallGas;
        uint fee = calculateFee(_value);
        if (!_transferFee(msg.sender, fee, "Transfer fee")) {
            return (false, false);
        }
        _allow();
        bool success = super.transfer(_to, _value);
        _disallow();
        if (!success) {
            return _returnFee(msg.sender, fee);
        }
        return (true, _applyRefund(startGas));
    }

    function _transferFrom(address _from, address _to, uint _value) internal returns(bool, bool) {
        uint startGas = msg.gas + transferFromCallGas;
        _allow();
        uint fee = calculateFee(_value);
        if (!_transferFee(_from, fee, "Transfer fee")) {
            return (false, false);
        }
        _allow();
        bool success = super.transferFrom(_from, _to, _value);
        _disallow();
        if (!success) {
            return _returnFee(_from, fee);
        }
        return (true, _applyRefund(startGas));
    }

    function _transferToICAP(bytes32 _icap, uint _value) internal returns(bool, bool) {
        uint startGas = msg.gas + transferToICAPCallGas;
        uint fee = calculateFee(_value);
        if (!_transferFee(msg.sender, fee, "Transfer fee")) {
            return (false, false);
        }
        _allow();
        bool success = super.transferToICAP(_icap, _value);
        _disallow();
        if (!success) {
            return _returnFee(msg.sender, fee);
        }
        return (true, _applyRefund(startGas));
    }

    function _transferFromToICAP(address _from, bytes32 _icap, uint _value) internal returns(bool, bool) {
        uint startGas = msg.gas + transferFromToICAPCallGas;
        uint fee = calculateFee(_value);
        if (!_transferFee(_from, fee, "Transfer fee")) {
            return (false, false);
        }
        _allow();
        bool success = super.transferFromToICAP(_from, _icap, _value);
        _disallow();
        if (!success) {
            return _returnFee(_from, fee);
        }
        return (true, _applyRefund(startGas));
    }

    function _transferWithReference(address _to, uint _value, string _reference) internal returns(bool, bool) {
        uint startGas = msg.gas + transferWithReferenceCallGas;
        uint additionalGas = _stringGas(_reference);
        uint fee = calculateFeeDynamic(_value, additionalGas);
        if (!_transferFee(msg.sender, fee, "Transfer fee")) {
            return (false, false);
        }
        _allow();
        bool success = super.transferWithReference(_to, _value, _reference);
        _disallow();
        if (!success) {
            return _returnFee(msg.sender, fee);
        }
        return (true, _applyRefund(startGas + additionalGas));
    }

    function _transferFromWithReference(address _from, address _to, uint _value, string _reference) internal returns(bool, bool) {
        uint startGas = msg.gas + transferFromWithReferenceCallGas;
        uint additionalGas = _stringGas(_reference);
        uint fee = calculateFeeDynamic(_value, additionalGas);
        if (!_transferFee(_from, fee, "Transfer fee")) {
            return (false, false);
        }
        _allow();
        bool success = super.transferFromWithReference(_from, _to, _value, _reference);
        _disallow();
        if (!success) {
            return _returnFee(_from, fee);
        }
        return (true, _applyRefund(startGas + additionalGas));
    }

    function _transferToICAPWithReference(bytes32 _icap, uint _value, string _reference) internal returns(bool, bool) {
        uint startGas = msg.gas + transferToICAPWithReferenceCallGas;
        uint additionalGas = _stringGas(_reference);
        uint fee = calculateFeeDynamic(_value, additionalGas);
        if (!_transferFee(msg.sender, fee, "Transfer fee")) {
            return (false, false);
        }
        _allow();
        bool success = super.transferToICAPWithReference(_icap, _value, _reference);
        _disallow();
        if (!success) {
            return _returnFee(msg.sender, fee);
        }
        return (true, _applyRefund(startGas + additionalGas));
    }

    function _transferFromToICAPWithReference(address _from, bytes32 _icap, uint _value, string _reference) internal returns(bool, bool) {
        uint startGas = msg.gas + transferFromToICAPWithReferenceCallGas;
        uint additionalGas = _stringGas(_reference);
        uint fee = calculateFeeDynamic(_value, additionalGas);
        if (!_transferFee(_from, fee, "Transfer fee")) {
            return (false, false);
        }
        _allow();
        bool success = super.transferFromToICAPWithReference(_from, _icap, _value, _reference);
        _disallow();
        if (!success) {
            return _returnFee(_from, fee);
        }
        return (true, _applyRefund(startGas + additionalGas));
    }

    function _approve(address _spender, uint _value) internal returns(bool, bool) {
        uint startGas = msg.gas + approveCallGas;
        // Don't take fee when enabling fee taking.
        // Don't refund either.
        if (_spender == address(this)) {
            return (super.approve(_spender, _value), false);
        }
        uint fee = calculateFee(0);
        if (!_transferFee(msg.sender, fee, "Approve fee")) {
            return (false, false);
        }
        _allow();
        bool success = super.approve(_spender, _value);
        _disallow();
        if (!success) {
            return _returnFee(msg.sender, fee);
        }
        return (true, _applyRefund(startGas));
    }

    function _setCosignerAddress(address _cosigner) internal returns(bool, bool) {
        uint startGas = msg.gas + setCosignerCallGas;
        uint fee = calculateFee(0);
        if (!_transferFee(msg.sender, fee, "Cosigner fee")) {
            return (false, false);
        }
        if (!super.setCosignerAddress(_cosigner)) {
            return _returnFee(msg.sender, fee);
        }
        return (true, _applyRefund(startGas));
    }

    function transfer(address _to, uint _value) returns(bool) {
        bool success;
        (success,) = _transfer(_to, _value);
        return success;
    }

    function transferFrom(address _from, address _to, uint _value) returns(bool) {
        bool success;
        (success,) = _transferFrom(_from, _to, _value);
        return success;
    }

    function transferToICAP(bytes32 _icap, uint _value) returns(bool) {
        bool success;
        (success,) = _transferToICAP(_icap, _value);
        return success;
    }

    function transferFromToICAP(address _from, bytes32 _icap, uint _value) returns(bool) {
        bool success;
        (success,) = _transferFromToICAP(_from, _icap, _value);
        return success;
    }

    function transferWithReference(address _to, uint _value, string _reference) returns(bool) {
        bool success;
        (success,) = _transferWithReference(_to, _value, _reference);
        return success;
    }

    function transferFromWithReference(address _from, address _to, uint _value, string _reference) returns(bool) {
        bool success;
        (success,) = _transferFromWithReference(_from, _to, _value, _reference);
        return success;
    }

    function transferToICAPWithReference(bytes32 _icap, uint _value, string _reference) returns(bool) {
        bool success;
        (success,) = _transferToICAPWithReference(_icap, _value, _reference);
        return success;
    }

    function transferFromToICAPWithReference(address _from, bytes32 _icap, uint _value, string _reference) returns(bool) {
        bool success;
        (success,) = _transferFromToICAPWithReference(_from, _icap, _value, _reference);
        return success;
    }

    function approve(address _spender, uint _value) returns(bool) {
        bool success;
        (success,) = _approve(_spender, _value);
        return success;
    }

    function setCosignerAddress(address _cosigner) returns(bool) {
        bool success;
        (success,) = _setCosignerAddress(_cosigner);
        return success;
    }

    function checkTransfer(address _to, uint _value) constant returns(bool, bool) {
        return _transfer(_to, _value);
    }

    function checkTransferFrom(address _from, address _to, uint _value) constant returns(bool, bool) {
        return _transferFrom(_from, _to, _value);
    }

    function checkTransferToICAP(bytes32 _icap, uint _value) constant returns(bool, bool) {
        return _transferToICAP(_icap, _value);
    }

    function checkTransferFromToICAP(address _from, bytes32 _icap, uint _value) constant returns(bool, bool) {
        return _transferFromToICAP(_from, _icap, _value);
    }

    function checkTransferWithReference(address _to, uint _value, string _reference) constant returns(bool, bool) {
        return _transferWithReference(_to, _value, _reference);
    }

    function checkTransferFromWithReference(address _from, address _to, uint _value, string _reference) constant returns(bool, bool) {
        return _transferFromWithReference(_from, _to, _value, _reference);
    }

    function checkTransferToICAPWithReference(bytes32 _icap, uint _value, string _reference) constant returns(bool, bool) {
        return _transferToICAPWithReference(_icap, _value, _reference);
    }

    function checkTransferFromToICAPWithReference(address _from, bytes32 _icap, uint _value, string _reference) constant returns(bool, bool) {
        return _transferFromToICAPWithReference(_from, _icap, _value, _reference);
    }

    function checkApprove(address _spender, uint _value) constant returns(bool, bool) {
        return _approve(_spender, _value);
    }

    function checkSetCosignerAddress(address _cosigner) constant returns(bool, bool) {
        return _setCosignerAddress(_cosigner);
    }

    function checkForward(bytes _data) constant returns(bool, bool) {
        return _forward(allowedForwards[sha3(_data[0], _data[1], _data[2], _data[3])], _data);
    }

    function _forward(address _to, bytes _data) internal returns(bool, bool) {
        uint startGas = msg.gas + forwardCallGas;
        uint additionalGas = (_data.length * 50);  // 50 gas per byte;
        if (_to == 0x0) {
            return (false, _safeFalse());
        }
        uint fee = calculateFeeDynamic(0, additionalGas);
        if (!_transferFee(msg.sender, fee, "Forward fee")) {
            return (false, false);
        }
        if (!_to.call.value(msg.value)(_data)) {
            _returnFee(msg.sender, fee);
            return (false, _safeFalse());
        }
        return (true, _applyRefund(startGas + additionalGas));
    }

    function () returns(bool) {
        bool success;
        (success,) = _forward(allowedForwards[sha3(msg.sig)], msg.data);
        return success;
    }

    function emitTransfer(address _from, address _to, uint _value) onlyMultiAsset() {
        Transfer(_from, _to, _value);
        if (__isAllowed) {
            return;
        }
        if (feeAddress == 0x0 || _to == feeAddress || _from == feeAddress) {
            return;
        }
        if (_transferFee(_from, calculateFee(_value), "Transfer fee")) {
            return;
        }
        throw;
    }

    function emitApprove(address _from, address _spender, uint _value) onlyMultiAsset() {
        Approve(_from, _spender, _value);
        if (__isAllowed) {
            return;
        }
        if (feeAddress == 0x0 || _spender == address(this)) {
            return;
        }
        if (_transferFee(_from, calculateFee(0), "Approve fee")) {
            return;
        }
        throw;
    }
}

Contract Security Audit

Contract ABI

[{"constant":true,"inputs":[{"name":"_from","type":"address"},{"name":"_icap","type":"bytes32"},{"name":"_value","type":"uint256"}],"name":"checkTransferFromToICAP","outputs":[{"name":"","type":"bool"},{"name":"","type":"bool"}],"type":"function"},{"constant":true,"inputs":[],"name":"multiAsset","outputs":[{"name":"","type":"address"}],"type":"function"},{"constant":false,"inputs":[{"name":"_msgSig","type":"bytes4"},{"name":"_forward","type":"address"}],"name":"setForward","outputs":[{"name":"","type":"bool"}],"type":"function"},{"constant":true,"inputs":[{"name":"_icap","type":"bytes32"},{"name":"_value","type":"uint256"},{"name":"_reference","type":"string"}],"name":"checkTransferToICAPWithReference","outputs":[{"name":"","type":"bool"},{"name":"","type":"bool"}],"type":"function"},{"constant":true,"inputs":[],"name":"name","outputs":[{"name":"","type":"bytes32"}],"type":"function"},{"constant":true,"inputs":[],"name":"setCosignerCallGas","outputs":[{"name":"","type":"uint256"}],"type":"function"},{"constant":false,"inputs":[{"name":"_spender","type":"address"},{"name":"_value","type":"uint256"}],"name":"approve","outputs":[{"name":"","type":"bool"}],"type":"function"},{"constant":true,"inputs":[{"name":"_data","type":"bytes"}],"name":"checkForward","outputs":[{"name":"","type":"bool"},{"name":"","type":"bool"}],"type":"function"},{"constant":false,"inputs":[{"name":"_stackDepthLib","type":"address"}],"name":"setupStackDepthLib","outputs":[{"name":"","type":"bool"}],"type":"function"},{"constant":true,"inputs":[],"name":"transferFromToICAPCallGas","outputs":[{"name":"","type":"uint256"}],"type":"function"},{"constant":true,"inputs":[],"name":"totalSupply","outputs":[{"name":"","type":"uint256"}],"type":"function"},{"constant":true,"inputs":[],"name":"txGasPriceLimit","outputs":[{"name":"","type":"uint256"}],"type":"function"},{"constant":true,"inputs":[],"name":"approveCallGas","outputs":[{"name":"","type":"uint256"}],"type":"function"},{"constant":true,"inputs":[{"name":"_name","type":"bytes32"}],"name":"getAddress","outputs":[{"name":"","type":"address"}],"type":"function"},{"constant":false,"inputs":[{"name":"_from","type":"address"},{"name":"_spender","type":"address"},{"name":"_value","type":"uint256"}],"name":"emitApprove","outputs":[],"type":"function"},{"constant":false,"inputs":[{"name":"_from","type":"address"},{"name":"_to","type":"address"},{"name":"_value","type":"uint256"}],"name":"transferFrom","outputs":[{"name":"","type":"bool"}],"type":"function"},{"constant":false,"inputs":[{"name":"_from","type":"address"},{"name":"_to","type":"address"},{"name":"_value","type":"uint256"}],"name":"emitTransfer","outputs":[],"type":"function"},{"constant":false,"inputs":[],"name":"updateRefundGas","outputs":[{"name":"","type":"uint256"}],"type":"function"},{"constant":false,"inputs":[{"name":"_feeAddress","type":"address"}],"name":"setupFee","outputs":[{"name":"","type":"bool"}],"type":"function"},{"constant":false,"inputs":[{"name":"_multiAsset","type":"address"},{"name":"_symbol","type":"bytes32"}],"name":"init","outputs":[{"name":"","type":"bool"}],"type":"function"},{"constant":false,"inputs":[{"name":"_treasury","type":"address"},{"name":"_txGasPriceLimit","type":"uint256"}],"name":"setupTreasury","outputs":[{"name":"","type":"bool"}],"type":"function"},{"constant":true,"inputs":[],"name":"feeAddress","outputs":[{"name":"","type":"address"}],"type":"function"},{"constant":true,"inputs":[],"name":"absMaxFee","outputs":[{"name":"","type":"uint256"}],"type":"function"},{"constant":true,"inputs":[],"name":"refundGas","outputs":[{"name":"","type":"uint256"}],"type":"function"},{"constant":true,"inputs":[],"name":"ambiC","outputs":[{"name":"","type":"address"}],"type":"function"},{"constant":true,"inputs":[],"name":"transferToICAPWithReferenceCallGas","outputs":[{"name":"","type":"uint256"}],"type":"function"},{"constant":true,"inputs":[],"name":"transferFromCallGas","outputs":[{"name":"","type":"uint256"}],"type":"function"},{"constant":true,"inputs":[],"name":"treasury","outputs":[{"name":"","type":"address"}],"type":"function"},{"constant":false,"inputs":[{"name":"_from","type":"address"},{"name":"_to","type":"address"},{"name":"_value","type":"uint256"},{"name":"_reference","type":"string"}],"name":"transferFromWithReference","outputs":[{"name":"","type":"bool"}],"type":"function"},{"constant":false,"inputs":[{"name":"_transfer","type":"uint256"},{"name":"_transferFrom","type":"uint256"},{"name":"_transferToICAP","type":"uint256"},{"name":"_transferFromToICAP","type":"uint256"},{"name":"_transferWithReference","type":"uint256"},{"name":"_transferFromWithReference","type":"uint256"},{"name":"_transferToICAPWithReference","type":"uint256"},{"name":"_transferFromToICAPWithReference","type":"uint256"},{"name":"_approve","type":"uint256"},{"name":"_forward","type":"uint256"},{"name":"_setCosigner","type":"uint256"}],"name":"setOperationsCallGas","outputs":[{"name":"","type":"bool"}],"type":"function"},{"constant":false,"inputs":[],"name":"sendToOwner","outputs":[{"name":"","type":"bool"}],"type":"function"},{"constant":true,"inputs":[{"name":"_owner","type":"address"}],"name":"balanceOf","outputs":[{"name":"","type":"uint256"}],"type":"function"},{"constant":true,"inputs":[],"name":"forwardCallGas","outputs":[{"name":"","type":"uint256"}],"type":"function"},{"constant":false,"inputs":[{"name":"_icap","type":"bytes32"},{"name":"_value","type":"uint256"}],"name":"transferToICAP","outputs":[{"name":"","type":"bool"}],"type":"function"},{"constant":true,"inputs":[],"name":"isImmortal","outputs":[{"name":"","type":"bool"}],"type":"function"},{"constant":false,"inputs":[{"name":"_icap","type":"bytes32"},{"name":"_value","type":"uint256"},{"name":"_reference","type":"string"}],"name":"transferToICAPWithReference","outputs":[{"name":"","type":"bool"}],"type":"function"},{"constant":false,"inputs":[{"name":"_ambi","type":"address"},{"name":"_name","type":"bytes32"}],"name":"setAmbiAddress","outputs":[{"name":"","type":"bool"}],"type":"function"},{"constant":true,"inputs":[],"name":"transferFromWithReferenceCallGas","outputs":[{"name":"","type":"uint256"}],"type":"function"},{"constant":true,"inputs":[],"name":"feePercent","outputs":[{"name":"","type":"uint256"}],"type":"function"},{"constant":false,"inputs":[{"name":"_cosigner","type":"address"}],"name":"setCosignerAddress","outputs":[{"name":"","type":"bool"}],"type":"function"},{"constant":true,"inputs":[{"name":"_to","type":"address"},{"name":"_value","type":"uint256"}],"name":"checkTransfer","outputs":[{"name":"","type":"bool"},{"name":"","type":"bool"}],"type":"function"},{"constant":true,"inputs":[{"name":"_icap","type":"bytes32"},{"name":"_value","type":"uint256"}],"name":"checkTransferToICAP","outputs":[{"name":"","type":"bool"},{"name":"","type":"bool"}],"type":"function"},{"constant":true,"inputs":[{"name":"","type":"bytes32"}],"name":"allowedForwards","outputs":[{"name":"","type":"address"}],"type":"function"},{"constant":true,"inputs":[],"name":"symbol","outputs":[{"name":"","type":"bytes32"}],"type":"function"},{"constant":true,"inputs":[{"name":"_value","type":"uint256"}],"name":"calculateFee","outputs":[{"name":"","type":"uint256"}],"type":"function"},{"constant":true,"inputs":[],"name":"transferWithReferenceCallGas","outputs":[{"name":"","type":"uint256"}],"type":"function"},{"constant":false,"inputs":[{"name":"_from","type":"address"},{"name":"_icap","type":"bytes32"},{"name":"_value","type":"uint256"},{"name":"_reference","type":"string"}],"name":"transferFromToICAPWithReference","outputs":[{"name":"","type":"bool"}],"type":"function"},{"constant":true,"inputs":[],"name":"transferFromToICAPWithReferenceCallGas","outputs":[{"name":"","type":"uint256"}],"type":"function"},{"constant":false,"inputs":[{"name":"_from","type":"address"},{"name":"_icap","type":"bytes32"},{"name":"_value","type":"uint256"}],"name":"transferFromToICAP","outputs":[{"name":"","type":"bool"}],"type":"function"},{"constant":false,"inputs":[],"name":"remove","outputs":[{"name":"","type":"bool"}],"type":"function"},{"constant":false,"inputs":[{"name":"_to","type":"address"},{"name":"_value","type":"uint256"}],"name":"transfer","outputs":[{"name":"","type":"bool"}],"type":"function"},{"constant":false,"inputs":[{"name":"_to","type":"address"},{"name":"_value","type":"uint256"},{"name":"_reference","type":"string"}],"name":"transferWithReference","outputs":[{"name":"","type":"bool"}],"type":"function"},{"constant":true,"inputs":[],"name":"absMinFee","outputs":[{"name":"","type":"uint256"}],"type":"function"},{"constant":true,"inputs":[],"name":"transferToICAPCallGas","outputs":[{"name":"","type":"uint256"}],"type":"function"},{"constant":true,"inputs":[{"name":"_cosigner","type":"address"}],"name":"checkSetCosignerAddress","outputs":[{"name":"","type":"bool"},{"name":"","type":"bool"}],"type":"function"},{"constant":true,"inputs":[{"name":"_from","type":"address"},{"name":"_icap","type":"bytes32"},{"name":"_value","type":"uint256"},{"name":"_reference","type":"string"}],"name":"checkTransferFromToICAPWithReference","outputs":[{"name":"","type":"bool"},{"name":"","type":"bool"}],"type":"function"},{"constant":true,"inputs":[],"name":"transferCallGas","outputs":[{"name":"","type":"uint256"}],"type":"function"},{"constant":true,"inputs":[{"name":"_value","type":"uint256"},{"name":"_additionalGas","type":"uint256"}],"name":"calculateFeeDynamic","outputs":[{"name":"","type":"uint256"}],"type":"function"},{"constant":true,"inputs":[{"name":"_from","type":"address"},{"name":"_to","type":"address"},{"name":"_value","type":"uint256"}],"name":"checkTransferFrom","outputs":[{"name":"","type":"bool"},{"name":"","type":"bool"}],"type":"function"},{"constant":true,"inputs":[{"name":"_from","type":"address"},{"name":"_to","type":"address"},{"name":"_value","type":"uint256"},{"name":"_reference","type":"string"}],"name":"checkTransferFromWithReference","outputs":[{"name":"","type":"bool"},{"name":"","type":"bool"}],"type":"function"},{"constant":true,"inputs":[{"name":"_to","type":"address"},{"name":"_value","type":"uint256"},{"name":"_reference","type":"string"}],"name":"checkTransferWithReference","outputs":[{"name":"","type":"bool"},{"name":"","type":"bool"}],"type":"function"},{"constant":false,"inputs":[{"name":"_feeFrom","type":"address"},{"name":"_value","type":"uint256"},{"name":"_reference","type":"string"}],"name":"takeFee","outputs":[{"name":"","type":"bool"}],"type":"function"},{"constant":true,"inputs":[{"name":"_from","type":"address"},{"name":"_spender","type":"address"}],"name":"allowance","outputs":[{"name":"","type":"uint256"}],"type":"function"},{"constant":false,"inputs":[{"name":"_absMinFee","type":"uint256"},{"name":"_feePercent","type":"uint256"},{"name":"_absMaxFee","type":"uint256"}],"name":"setFeeStructure","outputs":[{"name":"","type":"bool"}],"type":"function"},{"constant":true,"inputs":[{"name":"_spender","type":"address"},{"name":"_value","type":"uint256"}],"name":"checkApprove","outputs":[{"name":"","type":"bool"},{"name":"","type":"bool"}],"type":"function"},{"constant":false,"inputs":[],"name":"immortality","outputs":[{"name":"","type":"bool"}],"type":"function"},{"anonymous":false,"inputs":[{"indexed":true,"name":"from","type":"address"},{"indexed":true,"name":"to","type":"address"},{"indexed":false,"name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"from","type":"address"},{"indexed":true,"name":"spender","type":"address"},{"indexed":false,"name":"value","type":"uint256"}],"name":"Approve","type":"event"}]

60606040526000805460a060020a60ff02191681556404e3b29200600555619c40600655615208600781905560088190556009819055600a819055600b819055600c819055600d819055600e819055600f8190556010819055601155612d3490819061006a90396000f3606060405236156102e95760e060020a6000350462a7d6b3811461038e578063029a8bf7146103c257806302aa274b146103d4578063058026d01461041e57806306fdde031461049a5780630787006d146104a3578063095ea7b3146104ac578063119aa5c8146104f757806312ab72421461063157806312b0b3ca1461066457806318160ddd1461066d5780631a1feae1146106e357806321538acb146106ec57806321f8a721146106f5578063233850891461076d57806323b872dd146107f457806323de66511461083b57806324c65f35146108c157806326881518146108dd5780632cc0b254146108f85780633f2f15961461091857806341275358146109c3578063431e83ce146109d55780634f6d3aed146109de57806352959d16146109e75780635b36fea6146109f9578063604f87d814610a0257806361d027b314610a0b5780636461fe3914610a1d5780636522893414610a955780636620a93514610ad157806370a0823114610aef57806371ce9a4a14610b77578063733480b714610b8057806377f18ed314610bb057806377fe38a414610bc35780637948f52314610c1e5780637afa838814610c435780637fd6f15c14610c4c57806382fc49b814610c5557806388e072b214610c805780638e4afa5114610cb05780639407a68814610cc757806395d89b4114610ce857806399a5d74714610cf1578063a39385de14610d1a578063a48a663c14610d23578063a4b7459a14610d9b578063a525f42c14610da4578063a7f4377914610dbf578063a9059cbb14610e6f578063ac35caee14610e86578063ace3088314610efc578063afa560b014610f05578063b623f5e514610f0e578063bd8c1d3314610f21578063be78bb7a14610f7e578063c1cc077514610f87578063c5575ef014610fa0578063c6e0c90814610fbb578063cbcaacab14611018578063d422e4e014611073578063dd62ed3e146110d4578063e5782fd514611166578063ede8ebf314611187578063f7c3ee7a1461119e575b61125160408051600160e060020a031960008035919091168252825191829003600401822081526017602090815283822054601f369081018390048302850183019095528484529193849361126593600160a060020a03169290918591819084018382808284375050505050505b600060006000600060006010600050545a0192508551603202915086600160a060020a0316600014156112cb5760006112bc6112de565b611270600435602435604435600060006114808585855b60006000600060006000600d600050545a019250611fc986610cf8565b61128b600154600160a060020a031681565b6112516004356024356000600034111561149b5761149b33345b61208882825b604051600090600160a060020a0384169083908381818185876185025a03f1925050509050611495565b604080516020604435600481810135601f8101849004840285018401909552848452611270948135946024803595939460649492939101918190840183828082843750949650505050505050600060006114808585855b600060006000600060006000600c600050545a0193506120a8875b8051604b0261157d565b6112a860045481565b6112a860115481565b6112516004356024356000600061148c84845b60006000600060006000600f600050545a01925030600160a060020a031687600160a060020a031614156121535761215d878761216e565b6040805160206004803580820135601f81018490048402850184019095528484526112709491936024939092918401919081908401838280828437509496505050505050506000600061156b6017600050600085600081518110156100025790602001015160f860020a900460f860020a0286600181518110156100025790602001015160f860020a900460f860020a0287600281518110156100025790602001015160f860020a900460f860020a02886003815181101561000257604080516023909301517fff0000000000000000000000000000000000000000000000000000000000000096871684529486166001840152928516600283015260f860020a938490049093029390931691830191909152805191829003600401909120909152602091909152822054600160a060020a031684610357565b61125160043560008054600160a060020a03168082141561157b57508054600160a060020a03191682179055600161157d565b6112a8600d5481565b6112a8604080516001546002547fb524abcf00000000000000000000000000000000000000000000000000000000835260048301529151600092600160a060020a03169163b524abcf916024828101926020929190829003018187876161da5a03f1156100025750506040515191506115869050565b6112a860055481565b6112a8600f5481565b61128b600435604080516003547f2ade6c36000000000000000000000000000000000000000000000000000000008252600482018490529151600092600160a060020a031691632ade6c36916024828101926020929190829003018187876161da5a03f11561000257505060405151915061157d9050565b6112ba600435602435604435600154600160a060020a039081163390911614156107ef5781600160a060020a031683600160a060020a03167f6e11fb1b7f119e3f2fa29896ef5fdf8b8a2d0d4df6fe90ba8668e7d8b2ffa25e836040518082815260200191505060405180910390a360165460a060020a900460ff1615611589575b505050565b611251600435602435604435600060006116148585855b600060006000600060006009600050545a01925061220a5b6016805460a060020a60ff02191660a060020a179055565b6112ba600435602435604435600154600160a060020a039081163390911614156107ef5781600160a060020a031683600160a060020a03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040518082815260200191505060405180910390a360165460a060020a900460ff1615611623576107ef565b6112a860006000600060003411156117125761171233346103ee565b611251600435600060003411156117fb576117fb33346103ee565b6112516004356024356000600060003411156118a6576118a633346103ee565b61125160043560243560035460009060d960020a6430b236b4b70290600160a060020a031682148015906109ad5750604080516003546004805460e460020a630a1add51028452908301526024820184905233600160a060020a039081166044840152925192169163a1add51091606481810192602092909190829003018188876161da5a03f1156100025750506040515190505b156114935782600014156119555761197f6112de565b61128b601654600160a060020a031681565b6112a860145481565b6112a860065481565b61128b600354600160a060020a031681565b6112a8600c5481565b6112a860095481565b61128b601554600160a060020a031681565b604080516020606435600481810135601f81018490048402850184019095528484526112519481359460248035956044359560849492019190819084018382808284375094965050505050505060006000611991868686865b600060006000600060006000600a600050545a01935061232b87610490565b61125160043560243560443560643560843560a43560c43560e435610104356101243561014435600060003411156119ad576119ad33346103ee565b61125160006000600060006000341115611a7d57611a7d33346103ee565b6112a86004355b604080516001546002547f4d30b6be000000000000000000000000000000000000000000000000000000008352600160a060020a038581166004850152602484019190915292516000939190911691634d30b6be916044828101926020929190829003018187876161da5a03f11561000257505060405151915061157d9050565b6112a860105481565b6112516004356024356000600061148c84845b60006000600060006000600b600050545a0192506123c786610cf8565b61125160035460a060020a900460ff1681565b604080516020604435600481810135601f810184900484028501840190955284845261125194813594602480359593946064949293910191819084018382808284375094965050505050505060006000611614858585610475565b6112516004356024356003546000908190600160a060020a03168114611b2d57611493565b6112a8600a5481565b6112a860135481565b61125160043560006000611574835b60006000600060006011600050545a01915061244b6000610cf8565b61127060043560243560006000611c2284845b600060006000600060006007600050545a0192506124d886610cf8565b61127060043560243560006000611c228484610b93565b61128b600435601760205260009081526040902054600160a060020a031681565b6112a860025481565b6112a86004355b6013546012546000916127109084020490811015611c2e57601254915061157b565b6112a860085481565b604080516020606435600481810135601f81018490048402850184019095528484526112519481359460248035956044359560849492019190819084018382808284375094965050505050505060006000611991868686865b600060006000600060006000600e600050545a01935061256187610490565b6112a8600e5481565b611251600435602435604435600060006116148585856103a5565b61125160035460009060d960020a6437bbb732b90290600160a060020a03168214801590610e4e5750604080516003546004805460e460020a630a1add51028452908301526024820184905233600160a060020a039081166044840152925192169163a1add51091606481810192602092909190829003018188876161da5a03f1156100025750506040515190505b1561126c5760035460a060020a900460ff1615611c4a576000915050611586565b6112516004356024356000600061148c8484610c93565b604080516020604435600481810135601f8101849004840285018401909552848452611251948135946024803595939460649492939101918190840183828082843750949650505050505050600060006116148585855b6000600060006000600060006008600050545a0193506125d587610490565b6112a860125481565b6112a8600b5481565b6112706004356000600061156b83610c64565b604080516020606435600481810135601f81018490048402850184019095528484526112709481359460248035956044359560849492019190819084018382808284375094965050505050505060006000611c5686868686610d7c565b6112a860075481565b6112a86004356024355b600060006000611c6385610cf8565b6112706004356024356044356000600061148085858561080b565b604080516020606435600481810135601f81018490048402850184019095528484526112709481359460248035956044359560849492019190819084018382808284375094965050505050505060006000611c5686868686610a76565b604080516020604435600481810135601f810184900484028501840190955284845261127094813594602480359593946064949293910191819084018382808284375094965050505050505060006000611480858585610edd565b604080516020604435600481810135601f810184900484028501840190955284845261125194813594602480359593946064949293910191819084018382808284375094965050505050505060006000341115611c8157611c8133346103ee565b6112a8600435602435604080516001546002547f1c8d5d38000000000000000000000000000000000000000000000000000000008352600160a060020a0386811660048501528581166024850152604484019190915292516000939190911691631c8d5d38916064828101926020929190829003018187876161da5a03f1156100025750506040515191506114959050565b61125160043560243560443560006000341115611d3157611d3133346103ee565b61127060043560243560006000611c2284846104bf565b61125160035460009060d960020a6437bbb732b90290600160a060020a0316821480159061122d5750604080516003546004805460e460020a630a1add51028452908301526024820184905233600160a060020a039081166044840152925192169163a1add51091606481810192602092909190829003018188876161da5a03f1156100025750506040515190505b1561126c5750506003805460a060020a60ff02191660a060020a1790556001611586565b604080519115158252519081900360200190f35b5091508190505b5090565b60408051921515835290151560208301528051918290030190f35b60408051600160a060020a03929092168252519081900360200190f35b60408051918252519081900360200190f35b005b945094505b5050509250929050565b6112f3600083610f91565b505060006112bc5b600060003411156115825761158233346103ee565b90506113763382604060405190810160405280600b81526020017f466f7277617264206665650000000000000000000000000000000000000000008152602001505b601654600090600160a060020a031681148061135e5750601654600160a060020a038581169116145b806113695750826000145b15611e0c57506001611c7a565b15156113895760006000945094506112c1565b86600160a060020a03163487604051808280519060200190808383829060006004602084601f0104600f02600301f150905090810190601f1680156113e25780820380516001836020036101000a031916815260200191505b5091505060006040518083038185876185025a03f192505050151561144e576112d633825b6016546000908190600160a060020a03168114806114325750601654600160a060020a038581169116145b8061143d5750826000145b15611ef65750600090506001611c27565b60016112bc8385015b600060003a6006600050545a850301029050611fb2815b6005546000903a111561229e5761157d565b91509150935093915050565b5091508190505b505b92915050565b60035460d960020a6430b236b4b70290600160a060020a03166000148015906115265750604080516003546004805460e460020a630a1add51028452908301526024820184905233600160a060020a039081166044840152925192169163a1add5109160648181019260209290919082900301816000876161da5a03f1156100025750506040515190505b1561149357505060408051600160e060020a031984168152815190819003600401902060009081526017602052208054600160a060020a031916821790556001611495565b91509150915091565b5091508190505b505b919050565b5060005b90565b601654600160a060020a0316600014806115b4575030600160a060020a031682600160a060020a0316145b156115be576107ef565b6115cc836115d66000610cf8565b1561160f576107ef565b60408051808201909152600b81527f417070726f7665206665650000000000000000000000000000000000000000006020820152611335565b610002565b5091508190505b509392505050565b601654600160a060020a03166000148061164b5750601654600160a060020a03908116908316145b806116645750601654600160a060020a03908116908416145b1561166e576107ef565b6115cc8361167b83610cf8565b60408051808201909152600c815260a060020a6b5472616e7366657220666565026020820152611335565b6002600050546040518460e060020a0281526004018084600160a060020a031681526020018381526020018260001916815260200193505050506020604051808303816000876161da5a03f11561000257505060405151905080156117085750805b93505b505b505090565b60035460dc60020a6407365747570290600160a060020a031660001480159061179d5750604080516003546004805460e460020a630a1add51028452908301526024820184905233600160a060020a039081166044840152925192169163a1add5109160648181019260209290919082900301816000876161da5a03f1156100025750506040515190505b1561170b575a92503a6006600050545a8503010291506005600050543a11156117ca57600093505061170d565b6117da6611c37937e0800061146e565b15156117ea57600093505061170d565b5a83036006819055935061170d9050565b60035460d960020a6430b236b4b70290600160a060020a03166000148015906118865750604080516003546004805460e460020a630a1add51028452908301526024820184905233600160a060020a039081166044840152925192169163a1add5109160648181019260209290919082900301816000876161da5a03f1156100025750506040515190505b1561157b57505060168054600160a060020a03191682179055600161157d565b600154600160a060020a0316600081141561192e5784915081600160a060020a0316632f553d31856040518260e060020a02815260040180826000191681526020019150506020604051808303816000876161da5a03f1156100025750506040515115159050611936576000925050611493565b50601254620186a084046001010280820192505b505092915050565b5060018054600160a060020a0319168217815560028490559150611493565b60158054600160a060020a03191685179055600583905560003411156119875761198784346103ee565b915050611495565b6001915050611495565b509695505050505050565b505b9b9a5050505050505050505050565b60035460dc60020a6407365747570290600160a060020a0316600014801590611a385750604080516003546004805460e460020a630a1add51028452908301526024820184905233600160a060020a039081166044840152925192169163a1add5109160648181019260209290919082900301816000876161da5a03f1156100025750506040515190505b1561199c57505060078b905560098a9055600b899055600d8890556008879055600a869055600c859055600e849055600f83905560108290556011819055600161199e565b604080516001546002547f02571be300000000000000000000000000000000000000000000000000000000835260048301529151600160a060020a0392909216916302571be39160248181019260209290919082900301816000876161da5a03f115610002575050604051519350505030600160a060020a031631905060016000821115611b1257611b0f83836103f4565b90505b600154600160a060020a03166357cfeeee846116a681610af6565b83905030600160a060020a031681600160a060020a0316632ade6c36856040518260e060020a02815260040180826000191681526020019150506020604051808303816000876161da5a03f11561000257505060405151600160a060020a03169091149050611c025780600160a060020a0316637684937684306040518360e060020a028152600401808360001916815260200182600160a060020a03168152602001925050506020604051808303816000876161da5a03f1156100025750506040515115159050611c025760009150611493565b600483905560038054600160a060020a0319168217905560019150611493565b915091505b9250929050565b601454811115611c4257601454915061157b565b80915061157b565b33600160a060020a0316ff5b9150915094509492505050565b9150611d4c841161191a5781925061192e565b9150505b9392505050565b6003547f666565000000000000000000000000000000000000000000000000000000000090600160a060020a0316600014801590611d215750604080516003546004805460e460020a630a1add51028452908301526024820184905233600160a060020a039081166044840152925192169163a1add5109160648181019260209290919082900301816000876161da5a03f1156100025750506040515190505b1561161b57611c76858585611335565b6003547f63726f6e0000000000000000000000000000000000000000000000000000000090600160a060020a0316600014801590611dd15750604080516003546004805460e460020a630a1add51028452908301526024820184905233600160a060020a039081166044840152925192169163a1add5109160648181019260209290919082900301816000876161da5a03f1156100025750506040515190505b1561161b57612710841180611de557508483105b15611df4576000915050611c7a565b50506012839055601382905560148190556001611c7a565b60165460405160015460025460e060020a6331c6c4cf028352600160a060020a03888116600485810191825295821660248601819052604486018a90526064860184905260a060848701908152895160a4880152895195909316966331c6c4cf968c9692958c9590948c949093919260c40191602086810192918291859183918691600091601f850104600f02600301f150905090810190601f168015611ec75780820380516001836020036101000a031916815260200191505b5096505050505050506020604051808303816000876161da5a03f115610002575050604051519150611c7a9050565b6016546040805160015460025460e060020a6331c6c4cf028352600160a060020a039485166004840152888516602484015260448301889052606483015260a06084830152600a60a48301527f4665652072657475726e0000000000000000000000000000000000000000000060c4830152915191909216916331c6c4cf9160e480830192602092919082900301816000876161da5a03f1156100025750506040515115159050611fa657610002565b50600090506001611c27565b915061157b565b945094505b505050935093915050565b91506120018883604060405190810160405280600c815260200160a060020a6b5472616e736665722066656502815260200150611335565b1515612014576000600094509450611fbe565b61201c610823565b612054888888600061272684848460206040519081016040528060008152602001505b6000600034111561287c5761287c33346103ee565b905061206c5b6016805460a060020a60ff0219169055565b80151561207d57611fb98883611407565b6001611fb984611457565b151561209357610002565b5050565b955095505b50505050935093915050565b92506120b48884610f91565b91506120ec3383604060405190810160405280600c815260200160a060020a6b5472616e736665722066656502815260200150611335565b15156120ff57600060009550955061209c565b612107610823565b61212b89898960006127268484845b6000600034111561296a5761296a33346103ee565b905061213561205a565b801515612146576120973383611407565b6001612097848601611457565b6121836000610cf8565b6000945094506112c1565b6121e487875b6000600034111561272d5761272d33346103ee565b91506121c93383604060405190810160405280600b81526020017f417070726f766520666565000000000000000000000000000000000000000000815260200150611335565b15156121dc5760006000945094506112c1565b612168610823565b90506121ee61205a565b8015156121ff576112bc3383611407565b60016112bc84611457565b61221386610cf8565b915061224b8883604060405190810160405280600c815260200160a060020a6b5472616e736665722066656502815260200150611335565b151561225e576000600094509450611fbe565b612266610823565b612054888888600061272684848460206040519081016040528060008152602001505b60006000341115612a4a57612a4a33346103ee565b604080516015547ff3fef3a300000000000000000000000000000000000000000000000000000000825232600160a060020a03908116600484015260248301869052925192169163f3fef3a39160448082019260209290919082900301816000876161da5a03f11561000257505060405151915061157d9050565b955095505b5050505094509492505050565b92506123378884610f91565b915061236f8a83604060405190810160405280600c815260200160a060020a6b5472616e736665722066656502815260200150611335565b151561238257600060009550955061231e565b61238a610823565b61239f8a8a8a8a60006127df85858585612289565b90506123a961205a565b8015156123ba576123198a83611407565b6001612319848601611457565b91506123ff3383604060405190810160405280600c815260200160a060020a6b5472616e736665722066656502815260200150611335565b15156124125760006000945094506112c1565b61241a610823565b6121e4878760006127ea83836020604051908101604052806000815260200150612116565b935093505b5050915091565b90506124913382604060405190810160405280600c81526020017f436f7369676e6572206665650000000000000000000000000000000000000000815260200150611335565b15156124a4576000600093509350612444565b6124bd85600060003411156127f1576127f133346103ee565b15156124cd5761243f3382611407565b600161243f83611457565b91506125103383604060405190810160405280600c815260200160a060020a6b5472616e736665722066656502815260200150611335565b15156125235760006000945094506112c1565b61252b610823565b6121e4878760006127ea838360206040519081016040528060008152602001505b60006000341115612b4e57612b4e33346103ee565b925061256d8884610f91565b91506125a58a83604060405190810160405280600c815260200160a060020a6b5472616e736665722066656502815260200150611335565b15156125b857600060009550955061231e565b6125c0610823565b61239f8a8a8a8a60006127df8585858561203f565b92506125e18884610f91565b91506126193383604060405190810160405280600c815260200160a060020a6b5472616e736665722066656502815260200150611335565b151561262c57600060009550955061209c565b612634610823565b61212b898989600061272684848461254c565b61297257600160009054906101000a9004600160a060020a0316600160a060020a031663a48a663c338686866040518560e060020a0281526004018085600160a060020a0316815260200184600019168152602001838152602001806020018281038252838181518152602001915080519060200190808383829060006004602084601f0104600f02600301f150905090810190601f1680156126fe5780820380516001836020036101000a031916815260200191505b50955050505050506020604051808303816000876161da5a03f1156100025750506040515190505b9050611c7a565b6127555b6000612a42600032600160a060020a031633600160a060020a031614159050611586565b1561149557604080516001546002547f4f09eba7000000000000000000000000000000000000000000000000000000008352600160a060020a0387811660048501526024840187905260448401919091529251921691634f09eba79160648181019260209290919082900301816000876161da5a03f1156100025750506040515191506114959050565b90505b949350505050565b9050611495565b6127f9612731565b1561157d57604080516001546002547fe82b7cb2000000000000000000000000000000000000000000000000000000008352600160a060020a0386811660048501526024840191909152925192169163e82b7cb29160448181019260209290919082900301816000876161da5a03f11561000257505060405151915061157d9050565b612884612731565b156127e257600160009054906101000a9004600160a060020a0316600160a060020a031663ea98e540868686866040518560e060020a0281526004018085600160a060020a0316815260200184600019168152602001838152602001806020018281038252838181518152602001915080519060200190808383829060006004602084601f0104600f02600301f150905090810190601f16801561293c5780820380516001836020036101000a031916815260200191505b50955050505050506020604051808303816000876161da5a03f1156100025750506040515191506127e29050565b612647612731565b600160009054906101000a9004600160a060020a0316600160a060020a031663c54876618585856040518460e060020a0281526004018084600019168152602001838152602001806020018281038252838181518152602001915080519060200190808383829060006004602084601f0104600f02600301f150905090810190601f168015612a155780820380516001836020036101000a031916815260200191505b509450505050506020604051808303816000876161da5a03f1156100025750506040515190509050611c7a565b159050611586565b612a52612731565b156127e257600160009054906101000a9004600160a060020a0316600160a060020a031663f0cbe059868686600260005054876040518660e060020a0281526004018086600160a060020a0316815260200185600160a060020a0316815260200184815260200183600019168152602001806020018281038252838181518152602001915080519060200190808383829060006004602084601f0104600f02600301f150905090810190601f168015612b1f5780820380516001836020036101000a031916815260200191505b5096505050505050506020604051808303816000876161da5a03f1156100025750506040515191506127e29050565b612b56612731565b612c4f57600160009054906101000a9004600160a060020a0316600160a060020a03166331c6c4cf338686600260005054876040518660e060020a0281526004018086600160a060020a0316815260200185600160a060020a0316815260200184815260200183600019168152602001806020018281038252838181518152602001915080519060200190808383829060006004602084601f0104600f02600301f150905090810190601f168015612c225780820380516001836020036101000a031916815260200191505b5096505050505050506020604051808303816000876161da5a03f115610002575050604051519050612726565b600160009054906101000a9004600160a060020a0316600160a060020a03166364ef212e8585600260005054866040518560e060020a0281526004018085600160a060020a0316815260200184815260200183600019168152602001806020018281038252838181518152602001915080519060200190808383829060006004602084601f0104600f02600301f150905090810190601f1680156126fe5780820380516001836020036101000a0319168152602001915050955050505050506020604051808303816000876161da5a03f1156100025750506040515190509050611c7a56

Deployed Bytecode

0x606060405236156102e95760e060020a6000350462a7d6b3811461038e578063029a8bf7146103c257806302aa274b146103d4578063058026d01461041e57806306fdde031461049a5780630787006d146104a3578063095ea7b3146104ac578063119aa5c8146104f757806312ab72421461063157806312b0b3ca1461066457806318160ddd1461066d5780631a1feae1146106e357806321538acb146106ec57806321f8a721146106f5578063233850891461076d57806323b872dd146107f457806323de66511461083b57806324c65f35146108c157806326881518146108dd5780632cc0b254146108f85780633f2f15961461091857806341275358146109c3578063431e83ce146109d55780634f6d3aed146109de57806352959d16146109e75780635b36fea6146109f9578063604f87d814610a0257806361d027b314610a0b5780636461fe3914610a1d5780636522893414610a955780636620a93514610ad157806370a0823114610aef57806371ce9a4a14610b77578063733480b714610b8057806377f18ed314610bb057806377fe38a414610bc35780637948f52314610c1e5780637afa838814610c435780637fd6f15c14610c4c57806382fc49b814610c5557806388e072b214610c805780638e4afa5114610cb05780639407a68814610cc757806395d89b4114610ce857806399a5d74714610cf1578063a39385de14610d1a578063a48a663c14610d23578063a4b7459a14610d9b578063a525f42c14610da4578063a7f4377914610dbf578063a9059cbb14610e6f578063ac35caee14610e86578063ace3088314610efc578063afa560b014610f05578063b623f5e514610f0e578063bd8c1d3314610f21578063be78bb7a14610f7e578063c1cc077514610f87578063c5575ef014610fa0578063c6e0c90814610fbb578063cbcaacab14611018578063d422e4e014611073578063dd62ed3e146110d4578063e5782fd514611166578063ede8ebf314611187578063f7c3ee7a1461119e575b61125160408051600160e060020a031960008035919091168252825191829003600401822081526017602090815283822054601f369081018390048302850183019095528484529193849361126593600160a060020a03169290918591819084018382808284375050505050505b600060006000600060006010600050545a0192508551603202915086600160a060020a0316600014156112cb5760006112bc6112de565b611270600435602435604435600060006114808585855b60006000600060006000600d600050545a019250611fc986610cf8565b61128b600154600160a060020a031681565b6112516004356024356000600034111561149b5761149b33345b61208882825b604051600090600160a060020a0384169083908381818185876185025a03f1925050509050611495565b604080516020604435600481810135601f8101849004840285018401909552848452611270948135946024803595939460649492939101918190840183828082843750949650505050505050600060006114808585855b600060006000600060006000600c600050545a0193506120a8875b8051604b0261157d565b6112a860045481565b6112a860115481565b6112516004356024356000600061148c84845b60006000600060006000600f600050545a01925030600160a060020a031687600160a060020a031614156121535761215d878761216e565b6040805160206004803580820135601f81018490048402850184019095528484526112709491936024939092918401919081908401838280828437509496505050505050506000600061156b6017600050600085600081518110156100025790602001015160f860020a900460f860020a0286600181518110156100025790602001015160f860020a900460f860020a0287600281518110156100025790602001015160f860020a900460f860020a02886003815181101561000257604080516023909301517fff0000000000000000000000000000000000000000000000000000000000000096871684529486166001840152928516600283015260f860020a938490049093029390931691830191909152805191829003600401909120909152602091909152822054600160a060020a031684610357565b61125160043560008054600160a060020a03168082141561157b57508054600160a060020a03191682179055600161157d565b6112a8600d5481565b6112a8604080516001546002547fb524abcf00000000000000000000000000000000000000000000000000000000835260048301529151600092600160a060020a03169163b524abcf916024828101926020929190829003018187876161da5a03f1156100025750506040515191506115869050565b6112a860055481565b6112a8600f5481565b61128b600435604080516003547f2ade6c36000000000000000000000000000000000000000000000000000000008252600482018490529151600092600160a060020a031691632ade6c36916024828101926020929190829003018187876161da5a03f11561000257505060405151915061157d9050565b6112ba600435602435604435600154600160a060020a039081163390911614156107ef5781600160a060020a031683600160a060020a03167f6e11fb1b7f119e3f2fa29896ef5fdf8b8a2d0d4df6fe90ba8668e7d8b2ffa25e836040518082815260200191505060405180910390a360165460a060020a900460ff1615611589575b505050565b611251600435602435604435600060006116148585855b600060006000600060006009600050545a01925061220a5b6016805460a060020a60ff02191660a060020a179055565b6112ba600435602435604435600154600160a060020a039081163390911614156107ef5781600160a060020a031683600160a060020a03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040518082815260200191505060405180910390a360165460a060020a900460ff1615611623576107ef565b6112a860006000600060003411156117125761171233346103ee565b611251600435600060003411156117fb576117fb33346103ee565b6112516004356024356000600060003411156118a6576118a633346103ee565b61125160043560243560035460009060d960020a6430b236b4b70290600160a060020a031682148015906109ad5750604080516003546004805460e460020a630a1add51028452908301526024820184905233600160a060020a039081166044840152925192169163a1add51091606481810192602092909190829003018188876161da5a03f1156100025750506040515190505b156114935782600014156119555761197f6112de565b61128b601654600160a060020a031681565b6112a860145481565b6112a860065481565b61128b600354600160a060020a031681565b6112a8600c5481565b6112a860095481565b61128b601554600160a060020a031681565b604080516020606435600481810135601f81018490048402850184019095528484526112519481359460248035956044359560849492019190819084018382808284375094965050505050505060006000611991868686865b600060006000600060006000600a600050545a01935061232b87610490565b61125160043560243560443560643560843560a43560c43560e435610104356101243561014435600060003411156119ad576119ad33346103ee565b61125160006000600060006000341115611a7d57611a7d33346103ee565b6112a86004355b604080516001546002547f4d30b6be000000000000000000000000000000000000000000000000000000008352600160a060020a038581166004850152602484019190915292516000939190911691634d30b6be916044828101926020929190829003018187876161da5a03f11561000257505060405151915061157d9050565b6112a860105481565b6112516004356024356000600061148c84845b60006000600060006000600b600050545a0192506123c786610cf8565b61125160035460a060020a900460ff1681565b604080516020604435600481810135601f810184900484028501840190955284845261125194813594602480359593946064949293910191819084018382808284375094965050505050505060006000611614858585610475565b6112516004356024356003546000908190600160a060020a03168114611b2d57611493565b6112a8600a5481565b6112a860135481565b61125160043560006000611574835b60006000600060006011600050545a01915061244b6000610cf8565b61127060043560243560006000611c2284845b600060006000600060006007600050545a0192506124d886610cf8565b61127060043560243560006000611c228484610b93565b61128b600435601760205260009081526040902054600160a060020a031681565b6112a860025481565b6112a86004355b6013546012546000916127109084020490811015611c2e57601254915061157b565b6112a860085481565b604080516020606435600481810135601f81018490048402850184019095528484526112519481359460248035956044359560849492019190819084018382808284375094965050505050505060006000611991868686865b600060006000600060006000600e600050545a01935061256187610490565b6112a8600e5481565b611251600435602435604435600060006116148585856103a5565b61125160035460009060d960020a6437bbb732b90290600160a060020a03168214801590610e4e5750604080516003546004805460e460020a630a1add51028452908301526024820184905233600160a060020a039081166044840152925192169163a1add51091606481810192602092909190829003018188876161da5a03f1156100025750506040515190505b1561126c5760035460a060020a900460ff1615611c4a576000915050611586565b6112516004356024356000600061148c8484610c93565b604080516020604435600481810135601f8101849004840285018401909552848452611251948135946024803595939460649492939101918190840183828082843750949650505050505050600060006116148585855b6000600060006000600060006008600050545a0193506125d587610490565b6112a860125481565b6112a8600b5481565b6112706004356000600061156b83610c64565b604080516020606435600481810135601f81018490048402850184019095528484526112709481359460248035956044359560849492019190819084018382808284375094965050505050505060006000611c5686868686610d7c565b6112a860075481565b6112a86004356024355b600060006000611c6385610cf8565b6112706004356024356044356000600061148085858561080b565b604080516020606435600481810135601f81018490048402850184019095528484526112709481359460248035956044359560849492019190819084018382808284375094965050505050505060006000611c5686868686610a76565b604080516020604435600481810135601f810184900484028501840190955284845261127094813594602480359593946064949293910191819084018382808284375094965050505050505060006000611480858585610edd565b604080516020604435600481810135601f810184900484028501840190955284845261125194813594602480359593946064949293910191819084018382808284375094965050505050505060006000341115611c8157611c8133346103ee565b6112a8600435602435604080516001546002547f1c8d5d38000000000000000000000000000000000000000000000000000000008352600160a060020a0386811660048501528581166024850152604484019190915292516000939190911691631c8d5d38916064828101926020929190829003018187876161da5a03f1156100025750506040515191506114959050565b61125160043560243560443560006000341115611d3157611d3133346103ee565b61127060043560243560006000611c2284846104bf565b61125160035460009060d960020a6437bbb732b90290600160a060020a0316821480159061122d5750604080516003546004805460e460020a630a1add51028452908301526024820184905233600160a060020a039081166044840152925192169163a1add51091606481810192602092909190829003018188876161da5a03f1156100025750506040515190505b1561126c5750506003805460a060020a60ff02191660a060020a1790556001611586565b604080519115158252519081900360200190f35b5091508190505b5090565b60408051921515835290151560208301528051918290030190f35b60408051600160a060020a03929092168252519081900360200190f35b60408051918252519081900360200190f35b005b945094505b5050509250929050565b6112f3600083610f91565b505060006112bc5b600060003411156115825761158233346103ee565b90506113763382604060405190810160405280600b81526020017f466f7277617264206665650000000000000000000000000000000000000000008152602001505b601654600090600160a060020a031681148061135e5750601654600160a060020a038581169116145b806113695750826000145b15611e0c57506001611c7a565b15156113895760006000945094506112c1565b86600160a060020a03163487604051808280519060200190808383829060006004602084601f0104600f02600301f150905090810190601f1680156113e25780820380516001836020036101000a031916815260200191505b5091505060006040518083038185876185025a03f192505050151561144e576112d633825b6016546000908190600160a060020a03168114806114325750601654600160a060020a038581169116145b8061143d5750826000145b15611ef65750600090506001611c27565b60016112bc8385015b600060003a6006600050545a850301029050611fb2815b6005546000903a111561229e5761157d565b91509150935093915050565b5091508190505b505b92915050565b60035460d960020a6430b236b4b70290600160a060020a03166000148015906115265750604080516003546004805460e460020a630a1add51028452908301526024820184905233600160a060020a039081166044840152925192169163a1add5109160648181019260209290919082900301816000876161da5a03f1156100025750506040515190505b1561149357505060408051600160e060020a031984168152815190819003600401902060009081526017602052208054600160a060020a031916821790556001611495565b91509150915091565b5091508190505b505b919050565b5060005b90565b601654600160a060020a0316600014806115b4575030600160a060020a031682600160a060020a0316145b156115be576107ef565b6115cc836115d66000610cf8565b1561160f576107ef565b60408051808201909152600b81527f417070726f7665206665650000000000000000000000000000000000000000006020820152611335565b610002565b5091508190505b509392505050565b601654600160a060020a03166000148061164b5750601654600160a060020a03908116908316145b806116645750601654600160a060020a03908116908416145b1561166e576107ef565b6115cc8361167b83610cf8565b60408051808201909152600c815260a060020a6b5472616e7366657220666565026020820152611335565b6002600050546040518460e060020a0281526004018084600160a060020a031681526020018381526020018260001916815260200193505050506020604051808303816000876161da5a03f11561000257505060405151905080156117085750805b93505b505b505090565b60035460dc60020a6407365747570290600160a060020a031660001480159061179d5750604080516003546004805460e460020a630a1add51028452908301526024820184905233600160a060020a039081166044840152925192169163a1add5109160648181019260209290919082900301816000876161da5a03f1156100025750506040515190505b1561170b575a92503a6006600050545a8503010291506005600050543a11156117ca57600093505061170d565b6117da6611c37937e0800061146e565b15156117ea57600093505061170d565b5a83036006819055935061170d9050565b60035460d960020a6430b236b4b70290600160a060020a03166000148015906118865750604080516003546004805460e460020a630a1add51028452908301526024820184905233600160a060020a039081166044840152925192169163a1add5109160648181019260209290919082900301816000876161da5a03f1156100025750506040515190505b1561157b57505060168054600160a060020a03191682179055600161157d565b600154600160a060020a0316600081141561192e5784915081600160a060020a0316632f553d31856040518260e060020a02815260040180826000191681526020019150506020604051808303816000876161da5a03f1156100025750506040515115159050611936576000925050611493565b50601254620186a084046001010280820192505b505092915050565b5060018054600160a060020a0319168217815560028490559150611493565b60158054600160a060020a03191685179055600583905560003411156119875761198784346103ee565b915050611495565b6001915050611495565b509695505050505050565b505b9b9a5050505050505050505050565b60035460dc60020a6407365747570290600160a060020a0316600014801590611a385750604080516003546004805460e460020a630a1add51028452908301526024820184905233600160a060020a039081166044840152925192169163a1add5109160648181019260209290919082900301816000876161da5a03f1156100025750506040515190505b1561199c57505060078b905560098a9055600b899055600d8890556008879055600a869055600c859055600e849055600f83905560108290556011819055600161199e565b604080516001546002547f02571be300000000000000000000000000000000000000000000000000000000835260048301529151600160a060020a0392909216916302571be39160248181019260209290919082900301816000876161da5a03f115610002575050604051519350505030600160a060020a031631905060016000821115611b1257611b0f83836103f4565b90505b600154600160a060020a03166357cfeeee846116a681610af6565b83905030600160a060020a031681600160a060020a0316632ade6c36856040518260e060020a02815260040180826000191681526020019150506020604051808303816000876161da5a03f11561000257505060405151600160a060020a03169091149050611c025780600160a060020a0316637684937684306040518360e060020a028152600401808360001916815260200182600160a060020a03168152602001925050506020604051808303816000876161da5a03f1156100025750506040515115159050611c025760009150611493565b600483905560038054600160a060020a0319168217905560019150611493565b915091505b9250929050565b601454811115611c4257601454915061157b565b80915061157b565b33600160a060020a0316ff5b9150915094509492505050565b9150611d4c841161191a5781925061192e565b9150505b9392505050565b6003547f666565000000000000000000000000000000000000000000000000000000000090600160a060020a0316600014801590611d215750604080516003546004805460e460020a630a1add51028452908301526024820184905233600160a060020a039081166044840152925192169163a1add5109160648181019260209290919082900301816000876161da5a03f1156100025750506040515190505b1561161b57611c76858585611335565b6003547f63726f6e0000000000000000000000000000000000000000000000000000000090600160a060020a0316600014801590611dd15750604080516003546004805460e460020a630a1add51028452908301526024820184905233600160a060020a039081166044840152925192169163a1add5109160648181019260209290919082900301816000876161da5a03f1156100025750506040515190505b1561161b57612710841180611de557508483105b15611df4576000915050611c7a565b50506012839055601382905560148190556001611c7a565b60165460405160015460025460e060020a6331c6c4cf028352600160a060020a03888116600485810191825295821660248601819052604486018a90526064860184905260a060848701908152895160a4880152895195909316966331c6c4cf968c9692958c9590948c949093919260c40191602086810192918291859183918691600091601f850104600f02600301f150905090810190601f168015611ec75780820380516001836020036101000a031916815260200191505b5096505050505050506020604051808303816000876161da5a03f115610002575050604051519150611c7a9050565b6016546040805160015460025460e060020a6331c6c4cf028352600160a060020a039485166004840152888516602484015260448301889052606483015260a06084830152600a60a48301527f4665652072657475726e0000000000000000000000000000000000000000000060c4830152915191909216916331c6c4cf9160e480830192602092919082900301816000876161da5a03f1156100025750506040515115159050611fa657610002565b50600090506001611c27565b915061157b565b945094505b505050935093915050565b91506120018883604060405190810160405280600c815260200160a060020a6b5472616e736665722066656502815260200150611335565b1515612014576000600094509450611fbe565b61201c610823565b612054888888600061272684848460206040519081016040528060008152602001505b6000600034111561287c5761287c33346103ee565b905061206c5b6016805460a060020a60ff0219169055565b80151561207d57611fb98883611407565b6001611fb984611457565b151561209357610002565b5050565b955095505b50505050935093915050565b92506120b48884610f91565b91506120ec3383604060405190810160405280600c815260200160a060020a6b5472616e736665722066656502815260200150611335565b15156120ff57600060009550955061209c565b612107610823565b61212b89898960006127268484845b6000600034111561296a5761296a33346103ee565b905061213561205a565b801515612146576120973383611407565b6001612097848601611457565b6121836000610cf8565b6000945094506112c1565b6121e487875b6000600034111561272d5761272d33346103ee565b91506121c93383604060405190810160405280600b81526020017f417070726f766520666565000000000000000000000000000000000000000000815260200150611335565b15156121dc5760006000945094506112c1565b612168610823565b90506121ee61205a565b8015156121ff576112bc3383611407565b60016112bc84611457565b61221386610cf8565b915061224b8883604060405190810160405280600c815260200160a060020a6b5472616e736665722066656502815260200150611335565b151561225e576000600094509450611fbe565b612266610823565b612054888888600061272684848460206040519081016040528060008152602001505b60006000341115612a4a57612a4a33346103ee565b604080516015547ff3fef3a300000000000000000000000000000000000000000000000000000000825232600160a060020a03908116600484015260248301869052925192169163f3fef3a39160448082019260209290919082900301816000876161da5a03f11561000257505060405151915061157d9050565b955095505b5050505094509492505050565b92506123378884610f91565b915061236f8a83604060405190810160405280600c815260200160a060020a6b5472616e736665722066656502815260200150611335565b151561238257600060009550955061231e565b61238a610823565b61239f8a8a8a8a60006127df85858585612289565b90506123a961205a565b8015156123ba576123198a83611407565b6001612319848601611457565b91506123ff3383604060405190810160405280600c815260200160a060020a6b5472616e736665722066656502815260200150611335565b15156124125760006000945094506112c1565b61241a610823565b6121e4878760006127ea83836020604051908101604052806000815260200150612116565b935093505b5050915091565b90506124913382604060405190810160405280600c81526020017f436f7369676e6572206665650000000000000000000000000000000000000000815260200150611335565b15156124a4576000600093509350612444565b6124bd85600060003411156127f1576127f133346103ee565b15156124cd5761243f3382611407565b600161243f83611457565b91506125103383604060405190810160405280600c815260200160a060020a6b5472616e736665722066656502815260200150611335565b15156125235760006000945094506112c1565b61252b610823565b6121e4878760006127ea838360206040519081016040528060008152602001505b60006000341115612b4e57612b4e33346103ee565b925061256d8884610f91565b91506125a58a83604060405190810160405280600c815260200160a060020a6b5472616e736665722066656502815260200150611335565b15156125b857600060009550955061231e565b6125c0610823565b61239f8a8a8a8a60006127df8585858561203f565b92506125e18884610f91565b91506126193383604060405190810160405280600c815260200160a060020a6b5472616e736665722066656502815260200150611335565b151561262c57600060009550955061209c565b612634610823565b61212b898989600061272684848461254c565b61297257600160009054906101000a9004600160a060020a0316600160a060020a031663a48a663c338686866040518560e060020a0281526004018085600160a060020a0316815260200184600019168152602001838152602001806020018281038252838181518152602001915080519060200190808383829060006004602084601f0104600f02600301f150905090810190601f1680156126fe5780820380516001836020036101000a031916815260200191505b50955050505050506020604051808303816000876161da5a03f1156100025750506040515190505b9050611c7a565b6127555b6000612a42600032600160a060020a031633600160a060020a031614159050611586565b1561149557604080516001546002547f4f09eba7000000000000000000000000000000000000000000000000000000008352600160a060020a0387811660048501526024840187905260448401919091529251921691634f09eba79160648181019260209290919082900301816000876161da5a03f1156100025750506040515191506114959050565b90505b949350505050565b9050611495565b6127f9612731565b1561157d57604080516001546002547fe82b7cb2000000000000000000000000000000000000000000000000000000008352600160a060020a0386811660048501526024840191909152925192169163e82b7cb29160448181019260209290919082900301816000876161da5a03f11561000257505060405151915061157d9050565b612884612731565b156127e257600160009054906101000a9004600160a060020a0316600160a060020a031663ea98e540868686866040518560e060020a0281526004018085600160a060020a0316815260200184600019168152602001838152602001806020018281038252838181518152602001915080519060200190808383829060006004602084601f0104600f02600301f150905090810190601f16801561293c5780820380516001836020036101000a031916815260200191505b50955050505050506020604051808303816000876161da5a03f1156100025750506040515191506127e29050565b612647612731565b600160009054906101000a9004600160a060020a0316600160a060020a031663c54876618585856040518460e060020a0281526004018084600019168152602001838152602001806020018281038252838181518152602001915080519060200190808383829060006004602084601f0104600f02600301f150905090810190601f168015612a155780820380516001836020036101000a031916815260200191505b509450505050506020604051808303816000876161da5a03f1156100025750506040515190509050611c7a565b159050611586565b612a52612731565b156127e257600160009054906101000a9004600160a060020a0316600160a060020a031663f0cbe059868686600260005054876040518660e060020a0281526004018086600160a060020a0316815260200185600160a060020a0316815260200184815260200183600019168152602001806020018281038252838181518152602001915080519060200190808383829060006004602084601f0104600f02600301f150905090810190601f168015612b1f5780820380516001836020036101000a031916815260200191505b5096505050505050506020604051808303816000876161da5a03f1156100025750506040515191506127e29050565b612b56612731565b612c4f57600160009054906101000a9004600160a060020a0316600160a060020a03166331c6c4cf338686600260005054876040518660e060020a0281526004018086600160a060020a0316815260200185600160a060020a0316815260200184815260200183600019168152602001806020018281038252838181518152602001915080519060200190808383829060006004602084601f0104600f02600301f150905090810190601f168015612c225780820380516001836020036101000a031916815260200191505b5096505050505050506020604051808303816000876161da5a03f115610002575050604051519050612726565b600160009054906101000a9004600160a060020a0316600160a060020a03166364ef212e8585600260005054866040518560e060020a0281526004018085600160a060020a0316815260200184815260200183600019168152602001806020018281038252838181518152602001915080519060200190808383829060006004602084601f0104600f02600301f150905090810190601f1680156126fe5780820380516001836020036101000a0319168152602001915050955050505050506020604051808303816000876161da5a03f1156100025750506040515190509050611c7a56

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  ]
[ 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.