ETH Price: $2,677.55 (-0.73%)

Contract

0x14F952AbFEc17B8b7791AdB63BcB1de82C76D549
 

Overview

ETH Balance

0 ETH

Eth Value

$0.00

Multichain Info

No addresses found
Transaction Hash
Method
Block
From
To
0x6080604063032192018-09-10 1:17:292210 days ago1536542249IN
 Create: OwnerValidatorImpl
0 ETH0.0055303410

View more zero value Internal Transactions in Advanced View mode

Advanced mode:
Loading...
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
OwnerValidatorImpl

Compiler Version
v0.4.24+commit.e67f0147

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2018-09-10
*/

pragma solidity ^0.4.1;

// File: contracts/OwnerValidator.sol

contract TokenContract {
    function totalSupply() constant returns (uint256 supply);
    function decimals() constant returns(uint8 units);
    function balanceOf(address _owner) constant returns (uint256 balance);
    function transfer(address _to, address _msgSender, uint256 _value) returns (bool success);
    function transferFrom(address _from, address _to, address _msgSender, uint256 _value) returns (bool success);
    function transferFromSender(address _to, uint256 _value) returns (bool success);
    function approve(address _spender, address _msgSender, uint256 _value) returns (bool success);
    function allowance(address _owner, address _spender) constant returns (uint256 remaining);
}
contract OwnerValidator {
    function validate(address addr) constant returns (bool);
}

contract Owned {
    function ownerValidate(address addr) constant returns (bool);
    bool public isWorking;

    function Owned() {
        isWorking = true;
    }

    modifier onlyOwner {
        if (!ownerValidate(msg.sender)) throw;
        _;
    }

    modifier onlyWorking {
        if (!isWorking) throw;
        _;
    }

    modifier onlyNotWorking {
        if (isWorking) throw;
        _;
    }

    function setWorking(bool _isWorking) onlyOwner {
        isWorking = _isWorking;
    }
}

contract OwnerValidatorImpl is OwnerValidator, Owned {

    address[] public owners;


    TokenContract public tokenContract;

    function OwnerValidatorImpl() {
        owners.push(msg.sender);
    }


    function indexOfOwners(address _address) private constant returns (uint pos) {
        pos = 0;
        for (uint i = 0; i < owners.length; i++) {
            if (owners[i] == _address) {
                pos = i + 1;
                break;
            }
        }
        return pos;                
    }

    function validate(address addr) constant returns (bool) {
        return (indexOfOwners(addr) != 0);
    }
        
    function getOwners() constant returns (address[]) {
        return owners;
    } 

    function addOwner(address addr) onlyWorking {
        if (validate(msg.sender)) {
            if (!validate(addr)) {
                owners.push(addr);
            }
        }
    }

    function removeOwner(address addr) onlyWorking {
        if (validate(msg.sender)) {
            uint pos = indexOfOwners(addr);
            if (pos > 0) {
                owners[pos - 1] = 0x0;
            }
        }
    }

    function setTokenContract(address _tokenContract) onlyWorking {
        if (validate(msg.sender)) {
            tokenContract = TokenContract(_tokenContract);
        }
    }

    function ownerValidate(address addr) constant returns (bool) {
        return validate(addr);
    }

    function transferFromSender(address _to, uint256 _value) returns (bool success) {
        if (!validate(msg.sender)) throw;
        return tokenContract.transferFromSender(_to, _value);
    }

    function sendFromOwn(address _to, uint256 _value) returns (bool success) {
        if (!validate(msg.sender)) throw;
        if (!_to.send(_value)) throw;
        return true;
    }
}

// File: contracts/OffChainManager.sol

contract OffChainManager {
    function isToOffChainAddress(address addr) constant returns (bool);
    function getOffChainRootAddress() constant returns (address);
}

contract OffChainManagerImpl is OffChainManager, Owned {
    address public rootAddress;
    address[] public offChainAddreses;

    mapping (address => uint256) refOffChainAddresses; 

    OwnerValidator public ownerValidator;

    TokenContract public tokenContract;

    function OffChainManagerImpl(
        address _rootAddress,
        address _ownerValidator
    ) {
        rootAddress = _rootAddress;
        ownerValidator = OwnerValidator(_ownerValidator);
    }

    function setRootAddress(address _address) onlyWorking {
        if (ownerValidator.validate(msg.sender)) {
            rootAddress = _address;
        }
    }

    function setOwnerValidatorAddress(address _ownerValidator) onlyWorking {
        if (ownerValidator.validate(msg.sender)) {
            ownerValidator = OwnerValidator(_ownerValidator);
        }
    }

    function setTokenContract(address _tokenContract) {
        if (ownerValidator.validate(msg.sender)) {
            tokenContract = TokenContract(_tokenContract);
        }
    }

    function offChainAddresesValidCount() constant returns (uint) {
        uint cnt = 0;
        for (uint i = 0; i < offChainAddreses.length; i++) {
            if (offChainAddreses[i] != 0) {
                cnt++;
            }
        }
        return cnt;
    }

    function addOffChainAddress(address _address) private {
        if (!isToOffChainAddress(_address)) {
            offChainAddreses.push(_address);
            refOffChainAddresses[_address] = offChainAddreses.length;
        }
    }

    function removeOffChainAddress(address _address) private {
        uint pos = refOffChainAddresses[_address];
        if (pos > 0) {
            offChainAddreses[pos - 1] = 0;
            refOffChainAddresses[_address] = 0x0;
        }
    }

    function addOffChainAddresses(address[] _addresses) onlyWorking {
        if (ownerValidator.validate(msg.sender)) {
            for (uint i = 0; i < _addresses.length; i++) {
                addOffChainAddress(_addresses[i]);
            }
        }
    }

    function removeOffChainAddresses(address[] _addresses) onlyWorking {
        if (ownerValidator.validate(msg.sender)) {
            for (uint i = 0; i < _addresses.length; i++) {
                removeOffChainAddress(_addresses[i]);
            }
        }
    }

    function ownerValidate(address addr) constant returns (bool) {
        return ownerValidator.validate(addr);
    }

    function transferFromSender(address _to, uint256 _value) returns (bool success) {
        if (!ownerValidator.validate(msg.sender)) throw;
        return tokenContract.transferFromSender(_to, _value);
    }

    function sendFromOwn(address _to, uint256 _value) returns (bool success) {
        if (!ownerValidator.validate(msg.sender)) throw; 
        if (!_to.send(_value)) throw;
        return true;
    }

    function isToOffChainAddress(address addr) constant returns (bool) {
        return refOffChainAddresses[addr] > 0;
    }

    function getOffChainRootAddress() constant returns (address) {
        return rootAddress;
    }

    function getOffChainAddresses() constant returns (address[]) {
        return offChainAddreses;
    } 

    function isToOffChainAddresses(address[] _addresses) constant returns (bool) {
        for (uint i = 0; i < _addresses.length; i++) {
            if (!isToOffChainAddress(_addresses[i])) {
                return false;
            }
        }
        return true;
    }
}

// File: contracts/TokenContract.sol

library SafeMath {
  function mul(uint256 a, uint256 b) internal constant returns (uint256) {
    uint256 c = a * b;
    assert(a == 0 || c / a == b);
    return c;
  }

  function div(uint256 a, uint256 b) internal constant returns (uint256) {
// assert(b > 0);
    uint256 c = a / b;
// assert(a == b * c + a % b);
    return c;
  }

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

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

contract TokenContractImpl is TokenContract, Owned {
    using SafeMath for uint256;
    string public standard = "Token 0.1";
    uint256 _totalSupply;
    uint8 _decimals;
    address public _mainAddress;

    mapping (address => uint256) public balances;
    mapping (address => mapping (address => uint256)) public allowed;

    OwnerValidator public ownerValidator;
    OffChainManager public offChainManager;

    bool public isRedenominated;
    uint256 public redenomiValue;
    mapping (address => uint256) public redenominatedBalances;
    mapping (address => mapping (address => uint256)) public redenominatedAllowed;

    function TokenContractImpl(
        uint256 initialSupply,
        uint8 decimals,
        address _ownerValidator,
        address _offChainManager
    ){
        balances[msg.sender] = initialSupply;
        _totalSupply = initialSupply;
        _decimals = decimals;
        ownerValidator = OwnerValidator(_ownerValidator);
        offChainManager = OffChainManager(_offChainManager);
    }

    function totalSupply() constant returns (uint256 totalSupply) {
        if (isRedenominated) {
            return redenominatedValue(_totalSupply);
        }
        return _totalSupply;
    }

    function decimals() constant returns (uint8 decimals) {
        return _decimals;
    }

    function balanceOf(address _owner) constant returns (uint256 balance) {
        if (isRedenominated) {
            if (redenominatedBalances[_owner] > 0) {
                return redenominatedBalances[_owner];
            }
            return redenominatedValue(balances[_owner]);
        }
        return balances[_owner];
    }

    function allowance(address _owner, address _spender) constant returns (uint remaining) {
        if (isRedenominated) {
            if (redenominatedAllowed[_owner][_spender] > 0) {
                return redenominatedAllowed[_owner][_spender];
            }
            return redenominatedValue(allowed[_owner][_spender]);
        }
        return allowed[_owner][_spender];
    }

    function redenominatedValue(uint256 _value) private returns (uint256) {
        return _value.mul(redenomiValue);
    }

    function ownerValidate(address addr) constant returns (bool) {
        return ownerValidator.validate(addr);
    }


    function redenominate(uint256 _redenomiValue) {
        if (isRedenominated) throw;
        if (ownerValidator.validate(msg.sender)) {
            redenomiValue = _redenomiValue;
            Redenominate(msg.sender, isRedenominated, redenomiValue);
        }
    }   


    function applyRedenomination() onlyNotWorking {
        if (isRedenominated) throw;
        if (redenomiValue == 0) throw;
        if (ownerValidator.validate(msg.sender)) {
            isRedenominated = true;
            ApplyRedenomination(msg.sender, isRedenominated, redenomiValue);
        }
    }   

    function setOwnerValidatorAddress(address _ownerValidator) onlyWorking {
        if (ownerValidator.validate(msg.sender)) {
            ownerValidator = OwnerValidator(_ownerValidator);
        }
    }

    function setOffChainManagerAddress(address _offChainManager) onlyWorking {
        if (ownerValidator.validate(msg.sender)) {
            offChainManager = OffChainManager(_offChainManager);
        }
    }

    function transfer(address _to, address _msgSender, uint256 _value) onlyWorking returns (bool success) {
        if (msg.sender != _mainAddress) throw; 
        return transferProcess(_msgSender, _to, _value);
    }

    function transferProcess(address _from, address _to, uint256 _value) private returns (bool success) {
        if (balanceOf(_from) < _value) throw;
        subtractBalance(_from, _value);
        if (offChainManager.isToOffChainAddress(_to)) {
            addBalance(offChainManager.getOffChainRootAddress(), _value);
            ToOffChainTransfer(_from, _to, _to, _value);
        } else {
            addBalance(_to, _value);
        }
        return true;        
    }

    function addBalance(address _address, uint256 _value) private {
        if (isRedenominated) {
            if (redenominatedBalances[_address] == 0) {
                if (balances[_address] > 0) {
                    redenominatedBalances[_address] = redenominatedValue(balances[_address]);
                    balances[_address] = 0;
                }
            }
            redenominatedBalances[_address] = redenominatedBalances[_address].add(_value);
        } else {
            balances[_address] = balances[_address].add(_value);
        }
    }

    function subtractBalance(address _address, uint256 _value) private {
        if (isRedenominated) {
            if (redenominatedBalances[_address] == 0) {
                if (balances[_address] > 0) {
                    redenominatedBalances[_address] = redenominatedValue(balances[_address]);
                    balances[_address] = 0;
                }
            }
            redenominatedBalances[_address] = redenominatedBalances[_address].sub(_value);
        } else {
            balances[_address] = balances[_address].sub(_value);
        }
    }

    function transferFrom(address _from, address _to, address _msgSender, uint256 _value) onlyWorking returns (bool success) {
        if (msg.sender != _mainAddress) throw; 
        if (balanceOf(_from) < _value) throw;
        if (balanceOf(_to).add(_value) < balanceOf(_to)) throw;
        if (_value > allowance(_from, _msgSender)) throw;
        subtractBalance(_from, _value);
        if (offChainManager.isToOffChainAddress(_to)) {
            addBalance(offChainManager.getOffChainRootAddress(), _value);
            ToOffChainTransfer(_msgSender, _to, _to, _value);
        } else {
            addBalance(_to, _value);
        }
        subtractAllowed(_from, _msgSender, _value);
        return true;
    }


    function transferFromSender(address _to, uint256 _value) onlyWorking returns (bool success) {
        if (!transferProcess(msg.sender, _to, _value)) throw;
        TransferFromSender(msg.sender, _to, _value);
        return true;
    }


    function transferFromOwn(address _to, uint256 _value) onlyWorking returns (bool success) {
        if (!ownerValidator.validate(msg.sender)) throw;
        if (!transferProcess(this, _to, _value)) throw;
        TransferFromSender(this, _to, _value);    
        return true;
    }

    function sendFromOwn(address _to, uint256 _value) returns (bool success) {
        if (!ownerValidator.validate(msg.sender)) throw; 
        if (!_to.send(_value)) throw;
        return true;
    }

    function approve(address _spender, address _msgSender, uint256 _value) onlyWorking returns (bool success) {
        if (msg.sender != _mainAddress) throw; 
        setAllowed(_msgSender, _spender, _value);
        return true;
    }

    function subtractAllowed(address _from, address _spender, uint256 _value) private {
        if (isRedenominated) {
            if (redenominatedAllowed[_from][_spender] == 0) {
                if (allowed[_from][_spender] > 0) {
                    redenominatedAllowed[_from][_spender] = redenominatedValue(allowed[_from][_spender]);
                    allowed[_from][_spender] = 0;
                }
            }
            redenominatedAllowed[_from][_spender] = redenominatedAllowed[_from][_spender].sub(_value);
        } else {
            allowed[_from][_spender] = allowed[_from][_spender].sub(_value);
        }
    }

    function setAllowed(address _owner, address _spender, uint256 _value) private {
        if (isRedenominated) {
            redenominatedAllowed[_owner][_spender] = _value;
        } else {
            allowed[_owner][_spender] = _value;
        }
    }

    function setMainAddress(address _address) onlyOwner {
        _mainAddress = _address;
    }

    event TransferFromSender(address indexed _from, address indexed _to, uint256 _value);
    event ToOffChainTransfer(address indexed _from, address indexed _toKey, address _to, uint256 _value);
    event Redenominate(address _owner, bool _isRedenominated, uint256 _redenomiVakye);
    event ApplyRedenomination(address _owner, bool _isRedenominated, uint256 _redenomiVakye);
}

// File: contracts/MainContract.sol

contract MainContract {
    string public standard = "Token 0.1";
    string public name;
    string public symbol;

    OwnerValidator public ownerValidator;
    TokenContract public tokenContract;

    function MainContract(
        string _tokenName,
        address _ownerValidator,
        address _tokenContract,
        string _symbol
    ) {
        ownerValidator = OwnerValidator(_ownerValidator);
        tokenContract = TokenContract(_tokenContract);
        name = _tokenName;
        symbol = _symbol;
    }

    function totalSupply() constant returns(uint256 totalSupply) {
        return tokenContract.totalSupply();
    }

    function decimals() constant returns(uint8 decimals) {
        return tokenContract.decimals();
    }

    function setOwnerValidateAddress(address _ownerValidator) {
        if (ownerValidator.validate(msg.sender)) {
            ownerValidator = OwnerValidator(_ownerValidator);
        }
    }

    function setTokenContract(address _tokenContract) {
        if (ownerValidator.validate(msg.sender)) {
            tokenContract = TokenContract(_tokenContract);
        }
    }

    function transferFromSender(address _to, uint256 _value) returns (bool success) {
        if (!ownerValidator.validate(msg.sender)) throw;
        return tokenContract.transferFromSender(_to, _value);
    }

    function sendFromOwn(address _to, uint256 _value) returns (bool success) {
        if (!ownerValidator.validate(msg.sender)) throw; 
        if (!_to.send(_value)) throw;
        return true;
    }

    function balanceOf(address _owner) constant returns (uint256 balance) {
        return uint256(tokenContract.balanceOf(_owner));
    }

    function transfer(address _to, uint256 _value) returns (bool success) {
        if (tokenContract.transfer(_to, msg.sender, _value)) {
            Transfer(msg.sender, _to, _value);
            return true;
        } else {
            throw;
        }
    }

    function transferFrom(address _from, address _to, uint256 _value) returns (bool success) {
        if (tokenContract.transferFrom(_from, _to, msg.sender, _value)) {
            Transfer(_from, _to, _value);
            return true;
        } else {
            throw;
        }
    }

    function approve(address _spender, uint256 _value) returns (bool success) {
        if (tokenContract.approve(_spender,msg.sender,_value)) {
            Approval(msg.sender,_spender,_value);
            return true;
        } else {
            throw;
        }
    }

    function allowance(address _owner, address _spender) constant returns (uint256 remaining) {
        return tokenContract.allowance(_owner,_spender);
    }

    event Transfer(address indexed _from, address indexed _to, uint256 _value);
    event Approval(address indexed _owner, address indexed _spender, uint256 _value);
}

Contract Security Audit

Contract ABI

[{"constant":true,"inputs":[{"name":"","type":"uint256"}],"name":"owners","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"isWorking","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"addr","type":"address"}],"name":"removeOwner","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"addr","type":"address"}],"name":"validate","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"tokenContract","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_isWorking","type":"bool"}],"name":"setWorking","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"addr","type":"address"}],"name":"addOwner","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_to","type":"address"},{"name":"_value","type":"uint256"}],"name":"sendFromOwn","outputs":[{"name":"success","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"getOwners","outputs":[{"name":"","type":"address[]"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"addr","type":"address"}],"name":"ownerValidate","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_to","type":"address"},{"name":"_value","type":"uint256"}],"name":"transferFromSender","outputs":[{"name":"success","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_tokenContract","type":"address"}],"name":"setTokenContract","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"inputs":[],"payable":false,"stateMutability":"nonpayable","type":"constructor"}]

608060405234801561001057600080fd5b506000805460ff1916600190811782558054808201825591527fb10e2d527612073b26eecdfd717e6a320cf44b4afac2b0732d9fcbe2b7fa0cf6018054600160a060020a031916331790556106688061006a6000396000f3006080604052600436106100b95763ffffffff7c0100000000000000000000000000000000000000000000000000000000600035041663025e7c2781146100be578063099aea0a146100f2578063173825d91461011b578063207c64fb1461013e57806355a373d61461015f5780636fb3ba9e146101745780637065cb481461018e5780637e621667146101af578063a0e67e2b146101d3578063b43545bb14610238578063bae804a714610259578063bbcd5bbe1461027d575b600080fd5b3480156100ca57600080fd5b506100d660043561029e565b60408051600160a060020a039092168252519081900360200190f35b3480156100fe57600080fd5b506101076102c6565b604080519115158252519081900360200190f35b34801561012757600080fd5b5061013c600160a060020a03600435166102cf565b005b34801561014a57600080fd5b50610107600160a060020a0360043516610349565b34801561016b57600080fd5b506100d661035c565b34801561018057600080fd5b5061013c600435151561036b565b34801561019a57600080fd5b5061013c600160a060020a0360043516610392565b3480156101bb57600080fd5b50610107600160a060020a036004351660243561041b565b3480156101df57600080fd5b506101e861046a565b60408051602080825283518183015283519192839290830191858101910280838360005b8381101561022457818101518382015260200161020c565b505050509050019250505060405180910390f35b34801561024457600080fd5b50610107600160a060020a03600435166104cc565b34801561026557600080fd5b50610107600160a060020a03600435166024356104dd565b34801561028957600080fd5b5061013c600160a060020a0360043516610595565b60018054829081106102ac57fe5b600091825260209091200154600160a060020a0316905081565b60005460ff1681565b6000805460ff1615156102e157600080fd5b6102ea33610349565b15610345576102f8826105e1565b90506000811115610345576000600180830381548110151561031657fe5b9060005260206000200160006101000a815481600160a060020a030219169083600160a060020a031602179055505b5050565b6000610354826105e1565b151592915050565b600254600160a060020a031681565b610374336104cc565b151561037f57600080fd5b6000805460ff1916911515919091179055565b60005460ff1615156103a357600080fd5b6103ac33610349565b15610418576103ba81610349565b1515610418576001805480820182556000919091527fb10e2d527612073b26eecdfd717e6a320cf44b4afac2b0732d9fcbe2b7fa0cf601805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a0383161790555b50565b600061042633610349565b151561043157600080fd5b604051600160a060020a0384169083156108fc029084906000818181858888f19350505050151561046157600080fd5b50600192915050565b606060018054806020026020016040519081016040528092919081815260200182805480156104c257602002820191906000526020600020905b8154600160a060020a031681526001909101906020018083116104a4575b5050505050905090565b60006104d782610349565b92915050565b60006104e833610349565b15156104f357600080fd5b600254604080517fbae804a7000000000000000000000000000000000000000000000000000000008152600160a060020a038681166004830152602482018690529151919092169163bae804a79160448083019260209291908290030181600087803b15801561056257600080fd5b505af1158015610576573d6000803e3d6000fd5b505050506040513d602081101561058c57600080fd5b50519392505050565b60005460ff1615156105a657600080fd5b6105af33610349565b156104185760028054600160a060020a03831673ffffffffffffffffffffffffffffffffffffffff1990911617905550565b6000805b6001548110156106365782600160a060020a031660018281548110151561060857fe5b600091825260209091200154600160a060020a0316141561062e57806001019150610636565b6001016105e5565b509190505600a165627a7a723058207d490d70fc7d421c271ea9832c36a9b751804db26adfec463ee1d0853ed033090029

Deployed Bytecode

0x6080604052600436106100b95763ffffffff7c0100000000000000000000000000000000000000000000000000000000600035041663025e7c2781146100be578063099aea0a146100f2578063173825d91461011b578063207c64fb1461013e57806355a373d61461015f5780636fb3ba9e146101745780637065cb481461018e5780637e621667146101af578063a0e67e2b146101d3578063b43545bb14610238578063bae804a714610259578063bbcd5bbe1461027d575b600080fd5b3480156100ca57600080fd5b506100d660043561029e565b60408051600160a060020a039092168252519081900360200190f35b3480156100fe57600080fd5b506101076102c6565b604080519115158252519081900360200190f35b34801561012757600080fd5b5061013c600160a060020a03600435166102cf565b005b34801561014a57600080fd5b50610107600160a060020a0360043516610349565b34801561016b57600080fd5b506100d661035c565b34801561018057600080fd5b5061013c600435151561036b565b34801561019a57600080fd5b5061013c600160a060020a0360043516610392565b3480156101bb57600080fd5b50610107600160a060020a036004351660243561041b565b3480156101df57600080fd5b506101e861046a565b60408051602080825283518183015283519192839290830191858101910280838360005b8381101561022457818101518382015260200161020c565b505050509050019250505060405180910390f35b34801561024457600080fd5b50610107600160a060020a03600435166104cc565b34801561026557600080fd5b50610107600160a060020a03600435166024356104dd565b34801561028957600080fd5b5061013c600160a060020a0360043516610595565b60018054829081106102ac57fe5b600091825260209091200154600160a060020a0316905081565b60005460ff1681565b6000805460ff1615156102e157600080fd5b6102ea33610349565b15610345576102f8826105e1565b90506000811115610345576000600180830381548110151561031657fe5b9060005260206000200160006101000a815481600160a060020a030219169083600160a060020a031602179055505b5050565b6000610354826105e1565b151592915050565b600254600160a060020a031681565b610374336104cc565b151561037f57600080fd5b6000805460ff1916911515919091179055565b60005460ff1615156103a357600080fd5b6103ac33610349565b15610418576103ba81610349565b1515610418576001805480820182556000919091527fb10e2d527612073b26eecdfd717e6a320cf44b4afac2b0732d9fcbe2b7fa0cf601805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a0383161790555b50565b600061042633610349565b151561043157600080fd5b604051600160a060020a0384169083156108fc029084906000818181858888f19350505050151561046157600080fd5b50600192915050565b606060018054806020026020016040519081016040528092919081815260200182805480156104c257602002820191906000526020600020905b8154600160a060020a031681526001909101906020018083116104a4575b5050505050905090565b60006104d782610349565b92915050565b60006104e833610349565b15156104f357600080fd5b600254604080517fbae804a7000000000000000000000000000000000000000000000000000000008152600160a060020a038681166004830152602482018690529151919092169163bae804a79160448083019260209291908290030181600087803b15801561056257600080fd5b505af1158015610576573d6000803e3d6000fd5b505050506040513d602081101561058c57600080fd5b50519392505050565b60005460ff1615156105a657600080fd5b6105af33610349565b156104185760028054600160a060020a03831673ffffffffffffffffffffffffffffffffffffffff1990911617905550565b6000805b6001548110156106365782600160a060020a031660018281548110151561060857fe5b600091825260209091200154600160a060020a0316141561062e57806001019150610636565b6001016105e5565b509190505600a165627a7a723058207d490d70fc7d421c271ea9832c36a9b751804db26adfec463ee1d0853ed033090029

Swarm Source

bzzr://7d490d70fc7d421c271ea9832c36a9b751804db26adfec463ee1d0853ed03309

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.