ETH Price: $2,632.93 (+1.76%)

Contract

0xA6cd930Fc92F1634d8183af2Fb86bd1766f2f82a
 

Multichain Info

No addresses found
Transaction Hash
Method
Block
From
To
Deposit ERC20111331532020-10-26 16:34:451395 days ago1603730085IN
0xA6cd930F...766f2f82a
0 ETH0.0025663178.92217898
Transfer83466122019-08-14 5:01:451834 days ago1565758905IN
0xA6cd930F...766f2f82a
0.0001 ETH0.000105235
Transfer83465992019-08-14 4:59:401834 days ago1565758780IN
0xA6cd930F...766f2f82a
0 ETH0.0001055
Renounce Pauser80753782019-07-03 0:53:471876 days ago1562115227IN
0xA6cd930F...766f2f82a
0 ETH0.000086336
Add Pauser80753702019-07-03 0:52:571876 days ago1562115177IN
0xA6cd930F...766f2f82a
0 ETH0.000274756
0x6080604080688072019-07-02 0:19:341877 days ago1562026774IN
 Create: CelerWallet
0 ETH0.009393545.567471

Latest 25 internal transactions (View All)

Advanced mode:
Parent Transaction Hash Block From To
153609302022-08-17 20:51:56735 days ago1660769516
0xA6cd930F...766f2f82a
0.06 ETH
153481992022-08-15 20:47:54737 days ago1660596474
0xA6cd930F...766f2f82a
0.06 ETH
153138002022-08-10 10:26:23742 days ago1660127183
0xA6cd930F...766f2f82a
0.06 ETH
153138002022-08-10 10:26:23742 days ago1660127183
0xA6cd930F...766f2f82a
0.06 ETH
152798702022-08-05 3:23:38747 days ago1659669818
0xA6cd930F...766f2f82a
0.06 ETH
152798702022-08-05 3:23:38747 days ago1659669818
0xA6cd930F...766f2f82a
0.06 ETH
149311892022-06-09 6:47:45804 days ago1654757265
0xA6cd930F...766f2f82a
0.2 ETH
148915952022-06-02 14:44:05811 days ago1654181045
0xA6cd930F...766f2f82a
0.052 ETH
148894002022-06-02 6:20:28811 days ago1654150828
0xA6cd930F...766f2f82a
0.06 ETH
148894002022-06-02 6:20:28811 days ago1654150828
0xA6cd930F...766f2f82a
0.06 ETH
148892862022-06-02 5:52:53811 days ago1654149173
0xA6cd930F...766f2f82a
0.004 ETH
148892602022-06-02 5:47:08811 days ago1654148828
0xA6cd930F...766f2f82a
0.06 ETH
148892602022-06-02 5:47:08811 days ago1654148828
0xA6cd930F...766f2f82a
0.06 ETH
148540642022-05-27 12:05:23817 days ago1653653123
0xA6cd930F...766f2f82a
0.061 ETH
148540642022-05-27 12:05:23817 days ago1653653123
0xA6cd930F...766f2f82a
0.061 ETH
148177992022-05-21 14:31:57823 days ago1653143517
0xA6cd930F...766f2f82a
0.09553223 ETH
148177992022-05-21 14:31:57823 days ago1653143517
0xA6cd930F...766f2f82a
0.09553223 ETH
147105512022-05-04 11:03:07840 days ago1651662187
0xA6cd930F...766f2f82a
0.0723 ETH
146430592022-04-23 19:51:11851 days ago1650743471
0xA6cd930F...766f2f82a
0.026 ETH
145553732022-04-10 2:43:03864 days ago1649558583
0xA6cd930F...766f2f82a
0.08483561 ETH
137038622021-11-28 18:06:25997 days ago1638122785
0xA6cd930F...766f2f82a
0.325 ETH
131011062021-08-26 12:57:081091 days ago1629982628
0xA6cd930F...766f2f82a
0.235 ETH
130388692021-08-16 22:08:111101 days ago1629151691
0xA6cd930F...766f2f82a
0.0415 ETH
127467332021-07-02 7:02:151146 days ago1625209335
0xA6cd930F...766f2f82a
0.08853526 ETH
127270432021-06-29 5:12:171149 days ago1624943537
0xA6cd930F...766f2f82a
0.07 ETH
View All Internal Transactions
Loading...
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
CelerWallet

Compiler Version
v0.5.10+commit.5a6ea5b1

Optimization Enabled:
Yes with 200 runs

Other Settings:
byzantium EvmVersion, GNU GPLv3 license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2020-10-26
*/

// File: contracts/lib/interface/ICelerWallet.sol

pragma solidity ^0.5.1;

/**
 * @title CelerWallet interface
 */
interface ICelerWallet {
    function create(address[] calldata _owners, address _operator, bytes32 _nonce) external returns(bytes32);

    function depositETH(bytes32 _walletId) external payable;

    function depositERC20(bytes32 _walletId, address _tokenAddress, uint _amount) external;
    
    function withdraw(bytes32 _walletId, address _tokenAddress, address _receiver, uint _amount) external;

    function transferToWallet(bytes32 _fromWalletId, bytes32 _toWalletId, address _tokenAddress, address _receiver, uint _amount) external;

    function transferOperatorship(bytes32 _walletId, address _newOperator) external;

    function proposeNewOperator(bytes32 _walletId, address _newOperator) external;

    function drainToken(address _tokenAddress, address _receiver, uint _amount) external;

    function getWalletOwners(bytes32 _walletId) external view returns(address[] memory);

    function getOperator(bytes32 _walletId) external view returns(address);

    function getBalance(bytes32 _walletId, address _tokenAddress) external view returns(uint);

    function getProposedNewOperator(bytes32 _walletId) external view returns(address);

    function getProposalVote(bytes32 _walletId, address _owner) external view returns(bool);

    event CreateWallet(bytes32 indexed walletId, address[] indexed owners, address indexed operator);

    event DepositToWallet(bytes32 indexed walletId, address indexed tokenAddress, uint amount);

    event WithdrawFromWallet(bytes32 indexed walletId, address indexed tokenAddress, address indexed receiver, uint amount);

    event TransferToWallet(bytes32 indexed fromWalletId, bytes32 indexed toWalletId, address indexed tokenAddress, address receiver, uint amount);

    event ChangeOperator(bytes32 indexed walletId, address indexed oldOperator, address indexed newOperator);

    event ProposeNewOperator(bytes32 indexed walletId, address indexed newOperator, address indexed proposer);

    event DrainToken(address indexed tokenAddress, address indexed receiver, uint amount);
}

// File: openzeppelin-solidity/contracts/math/SafeMath.sol

pragma solidity ^0.5.0;

/**
 * @title SafeMath
 * @dev Unsigned math operations with safety checks that revert on error
 */
library SafeMath {
    /**
    * @dev Multiplies two unsigned integers, reverts on overflow.
    */
    function mul(uint256 a, uint256 b) internal pure returns (uint256) {
        // Gas optimization: this is cheaper than requiring 'a' not being zero, but the
        // benefit is lost if 'b' is also tested.
        // See: https://github.com/OpenZeppelin/openzeppelin-solidity/pull/522
        if (a == 0) {
            return 0;
        }

        uint256 c = a * b;
        require(c / a == b);

        return c;
    }

    /**
    * @dev Integer division of two unsigned integers truncating the quotient, reverts on division by zero.
    */
    function div(uint256 a, uint256 b) internal pure returns (uint256) {
        // Solidity only automatically asserts when dividing by 0
        require(b > 0);
        uint256 c = a / b;
        // assert(a == b * c + a % b); // There is no case in which this doesn't hold

        return c;
    }

    /**
    * @dev Subtracts two unsigned integers, reverts on overflow (i.e. if subtrahend is greater than minuend).
    */
    function sub(uint256 a, uint256 b) internal pure returns (uint256) {
        require(b <= a);
        uint256 c = a - b;

        return c;
    }

    /**
    * @dev Adds two unsigned integers, reverts on overflow.
    */
    function add(uint256 a, uint256 b) internal pure returns (uint256) {
        uint256 c = a + b;
        require(c >= a);

        return c;
    }

    /**
    * @dev Divides two unsigned integers and returns the remainder (unsigned integer modulo),
    * reverts when dividing by zero.
    */
    function mod(uint256 a, uint256 b) internal pure returns (uint256) {
        require(b != 0);
        return a % b;
    }
}

// File: openzeppelin-solidity/contracts/token/ERC20/IERC20.sol

pragma solidity ^0.5.0;

/**
 * @title ERC20 interface
 * @dev see https://github.com/ethereum/EIPs/issues/20
 */
interface IERC20 {
    function transfer(address to, uint256 value) external returns (bool);

    function approve(address spender, uint256 value) external returns (bool);

    function transferFrom(address from, address to, uint256 value) external returns (bool);

    function totalSupply() external view returns (uint256);

    function balanceOf(address who) external view returns (uint256);

    function allowance(address owner, address spender) external view returns (uint256);

    event Transfer(address indexed from, address indexed to, uint256 value);

    event Approval(address indexed owner, address indexed spender, uint256 value);
}

// File: openzeppelin-solidity/contracts/token/ERC20/SafeERC20.sol

pragma solidity ^0.5.0;



/**
 * @title SafeERC20
 * @dev Wrappers around ERC20 operations that throw on failure.
 * To use this library you can add a `using SafeERC20 for ERC20;` statement to your contract,
 * which allows you to call the safe operations as `token.safeTransfer(...)`, etc.
 */
library SafeERC20 {
    using SafeMath for uint256;

    function safeTransfer(IERC20 token, address to, uint256 value) internal {
        require(token.transfer(to, value));
    }

    function safeTransferFrom(IERC20 token, address from, address to, uint256 value) internal {
        require(token.transferFrom(from, to, value));
    }

    function safeApprove(IERC20 token, address spender, uint256 value) internal {
        // safeApprove should only be called when setting an initial allowance,
        // or when resetting it to zero. To increase and decrease it, use
        // 'safeIncreaseAllowance' and 'safeDecreaseAllowance'
        require((value == 0) || (token.allowance(msg.sender, spender) == 0));
        require(token.approve(spender, value));
    }

    function safeIncreaseAllowance(IERC20 token, address spender, uint256 value) internal {
        uint256 newAllowance = token.allowance(address(this), spender).add(value);
        require(token.approve(spender, newAllowance));
    }

    function safeDecreaseAllowance(IERC20 token, address spender, uint256 value) internal {
        uint256 newAllowance = token.allowance(address(this), spender).sub(value);
        require(token.approve(spender, newAllowance));
    }
}

// File: openzeppelin-solidity/contracts/access/Roles.sol

pragma solidity ^0.5.0;

/**
 * @title Roles
 * @dev Library for managing addresses assigned to a Role.
 */
library Roles {
    struct Role {
        mapping (address => bool) bearer;
    }

    /**
     * @dev give an account access to this role
     */
    function add(Role storage role, address account) internal {
        require(account != address(0));
        require(!has(role, account));

        role.bearer[account] = true;
    }

    /**
     * @dev remove an account's access to this role
     */
    function remove(Role storage role, address account) internal {
        require(account != address(0));
        require(has(role, account));

        role.bearer[account] = false;
    }

    /**
     * @dev check if an account has this role
     * @return bool
     */
    function has(Role storage role, address account) internal view returns (bool) {
        require(account != address(0));
        return role.bearer[account];
    }
}

// File: openzeppelin-solidity/contracts/access/roles/PauserRole.sol

pragma solidity ^0.5.0;


contract PauserRole {
    using Roles for Roles.Role;

    event PauserAdded(address indexed account);
    event PauserRemoved(address indexed account);

    Roles.Role private _pausers;

    constructor () internal {
        _addPauser(msg.sender);
    }

    modifier onlyPauser() {
        require(isPauser(msg.sender));
        _;
    }

    function isPauser(address account) public view returns (bool) {
        return _pausers.has(account);
    }

    function addPauser(address account) public onlyPauser {
        _addPauser(account);
    }

    function renouncePauser() public {
        _removePauser(msg.sender);
    }

    function _addPauser(address account) internal {
        _pausers.add(account);
        emit PauserAdded(account);
    }

    function _removePauser(address account) internal {
        _pausers.remove(account);
        emit PauserRemoved(account);
    }
}

// File: openzeppelin-solidity/contracts/lifecycle/Pausable.sol

pragma solidity ^0.5.0;


/**
 * @title Pausable
 * @dev Base contract which allows children to implement an emergency stop mechanism.
 */
contract Pausable is PauserRole {
    event Paused(address account);
    event Unpaused(address account);

    bool private _paused;

    constructor () internal {
        _paused = false;
    }

    /**
     * @return true if the contract is paused, false otherwise.
     */
    function paused() public view returns (bool) {
        return _paused;
    }

    /**
     * @dev Modifier to make a function callable only when the contract is not paused.
     */
    modifier whenNotPaused() {
        require(!_paused);
        _;
    }

    /**
     * @dev Modifier to make a function callable only when the contract is paused.
     */
    modifier whenPaused() {
        require(_paused);
        _;
    }

    /**
     * @dev called by the owner to pause, triggers stopped state
     */
    function pause() public onlyPauser whenNotPaused {
        _paused = true;
        emit Paused(msg.sender);
    }

    /**
     * @dev called by the owner to unpause, returns to normal state
     */
    function unpause() public onlyPauser whenPaused {
        _paused = false;
        emit Unpaused(msg.sender);
    }
}

// File: contracts/CelerWallet.sol

pragma solidity ^0.5.1;






/**
 * @title CelerWallet contract
 * @notice A multi-owner, multi-token, operator-centric wallet designed for CelerChannel.
 *   This wallet can run independetly and doesn't rely on trust of any external contracts
 *   even CelerLedger to maximize its security.
 */
contract CelerWallet is ICelerWallet, Pausable {
    using SafeMath for uint;
    using SafeERC20 for IERC20;

    enum MathOperation { Add, Sub }

    struct Wallet {
        // corresponding to peers in CelerLedger
        address[] owners;
        // corresponding to CelerLedger
        address operator;
        // adderss(0) for ETH
        mapping(address => uint) balances;
        address proposedNewOperator;
        mapping(address => bool) proposalVotes;
    }

    uint public walletNum;
    mapping(bytes32 => Wallet) private wallets;

    /**
     * @dev Throws if called by any account other than the wallet's operator
     * @param _walletId id of the wallet to be operated
     */
    modifier onlyOperator(bytes32 _walletId) {
        require(msg.sender == wallets[_walletId].operator, "msg.sender is not operator");
        _;
    }

    /**
     * @dev Throws if given address is not an owner of the wallet
     * @param _walletId id of the wallet to be operated
     * @param _addr address to be checked
     */
    modifier onlyWalletOwner(bytes32 _walletId, address _addr) {
        require(_isWalletOwner(_walletId, _addr), "Given address is not wallet owner");
        _;
    }

    /**
     * @notice Create a new wallet
     * @param _owners owners of the wallet
     * @param _operator initial operator of the wallet
     * @param _nonce nonce given by caller to generate the wallet id
     * @return id of created wallet
     */
    function create(
        address[] memory _owners,
        address _operator,
        bytes32 _nonce
    )
        public
        whenNotPaused
        returns(bytes32)
    {
        require(_operator != address(0), "New operator is address(0)");

        bytes32 walletId = keccak256(abi.encodePacked(address(this), msg.sender, _nonce));
        Wallet storage w = wallets[walletId];
        // wallet must be uninitialized
        require(w.operator == address(0), "Occupied wallet id");
        w.owners = _owners;
        w.operator = _operator;
        walletNum++;

        emit CreateWallet(walletId, _owners, _operator);
        return walletId;
    }

    /**
     * @notice Deposit ETH to a wallet
     * @param _walletId id of the wallet to deposit into
     */
    function depositETH(bytes32 _walletId) public payable whenNotPaused {
        uint amount = msg.value;
        _updateBalance(_walletId, address(0), amount, MathOperation.Add);
        emit DepositToWallet(_walletId, address(0), amount);
    }

    /**
     * @notice Deposit ERC20 tokens to a wallet
     * @param _walletId id of the wallet to deposit into
     * @param _tokenAddress address of token to deposit
     * @param _amount deposit token amount
     */
    function depositERC20(
        bytes32 _walletId,
        address _tokenAddress,
        uint _amount
    )
        public
        whenNotPaused
    {
        _updateBalance(_walletId, _tokenAddress, _amount, MathOperation.Add);
        emit DepositToWallet(_walletId, _tokenAddress, _amount);

        IERC20(_tokenAddress).safeTransferFrom(msg.sender, address(this), _amount);
    }

    /**
     * @notice Withdraw funds to an address
     * @dev Since this withdraw() function uses direct transfer to send ETH, if CelerLedger
     *   allows non externally-owned account (EOA) to be a peer of the channel namely an owner
     *   of the wallet, CelerLedger should implement a withdraw pattern for ETH to avoid
     *   maliciously fund locking. Withdraw pattern reference:
     *   https://solidity.readthedocs.io/en/v0.5.9/common-patterns.html#withdrawal-from-contracts
     * @param _walletId id of the wallet to withdraw from
     * @param _tokenAddress address of token to withdraw
     * @param _receiver token receiver
     * @param _amount withdrawal token amount
     */
    function withdraw(
        bytes32 _walletId,
        address _tokenAddress,
        address _receiver,
        uint _amount
    )
        public
        whenNotPaused
        onlyOperator(_walletId)
        onlyWalletOwner(_walletId, _receiver)
    {
        _updateBalance(_walletId, _tokenAddress, _amount, MathOperation.Sub);
        emit WithdrawFromWallet(_walletId, _tokenAddress, _receiver, _amount);

        _withdrawToken(_tokenAddress, _receiver, _amount);
    }

    /**
     * @notice Transfer funds from one wallet to another wallet with a same owner (as the receiver)
     * @dev from wallet and to wallet must have one common owner as the receiver or beneficiary
     *   of this transfer
     * @param _fromWalletId id of wallet to transfer funds from
     * @param _toWalletId id of wallet to transfer funds to
     * @param _tokenAddress address of token to transfer
     * @param _receiver beneficiary who transfers her funds from one wallet to another wallet
     * @param _amount transferred token amount
     */
    function transferToWallet(
        bytes32 _fromWalletId,
        bytes32 _toWalletId,
        address _tokenAddress,
        address _receiver,
        uint _amount
    )
        public
        whenNotPaused
        onlyOperator(_fromWalletId)
        onlyWalletOwner(_fromWalletId, _receiver)
        onlyWalletOwner(_toWalletId, _receiver)
    {
        _updateBalance(_fromWalletId, _tokenAddress, _amount, MathOperation.Sub);
        _updateBalance(_toWalletId, _tokenAddress, _amount, MathOperation.Add);
        emit TransferToWallet(_fromWalletId, _toWalletId, _tokenAddress, _receiver, _amount);
    }

    /**
     * @notice Current operator transfers the operatorship of a wallet to the new operator
     * @param _walletId id of wallet to transfer the operatorship
     * @param _newOperator the new operator
     */
    function transferOperatorship(
        bytes32 _walletId,
        address _newOperator
    )
        public
        whenNotPaused
        onlyOperator(_walletId)
    {
        _changeOperator(_walletId, _newOperator);
    }

    /**
     * @notice Wallet owners propose and assign a new operator of their wallet
     * @dev it will assign a new operator if all owners propose the same new operator.
     *   This does not require unpaused.
     * @param _walletId id of wallet which owners propose new operator of
     * @param _newOperator the new operator proposal
     */
    function proposeNewOperator(
        bytes32 _walletId,
        address _newOperator
    )
        public
        onlyWalletOwner(_walletId, msg.sender)
    {
        require(_newOperator != address(0), "New operator is address(0)");

        Wallet storage w = wallets[_walletId];
        if (_newOperator != w.proposedNewOperator) {
            _clearVotes(w);
            w.proposedNewOperator = _newOperator;
        }

        w.proposalVotes[msg.sender] = true;
        emit ProposeNewOperator(_walletId, _newOperator, msg.sender);

        if (_checkAllVotes(w)) {
            _changeOperator(_walletId, _newOperator);
            _clearVotes(w);
        }
    }

    /**
     * @notice Pauser drains one type of tokens when paused
     * @dev This is for emergency situations.
     * @param _tokenAddress address of token to drain
     * @param _receiver token receiver
     * @param _amount drained token amount
     */
    function drainToken(
        address _tokenAddress,
        address _receiver,
        uint _amount
    )
        public
        whenPaused
        onlyPauser
    {
        emit DrainToken(_tokenAddress, _receiver, _amount);

        _withdrawToken(_tokenAddress, _receiver, _amount);
    }

    /**
     * @notice Get owners of a given wallet
     * @param _walletId id of the queried wallet
     * @return wallet's owners
     */
    function getWalletOwners(bytes32 _walletId) external view returns(address[] memory) {
        return wallets[_walletId].owners;
    }

    /**
     * @notice Get operator of a given wallet
     * @param _walletId id of the queried wallet
     * @return wallet's operator
     */
    function getOperator(bytes32 _walletId) public view returns(address) {
        return wallets[_walletId].operator;
    }

    /**
     * @notice Get balance of a given token in a given wallet
     * @param _walletId id of the queried wallet
     * @param _tokenAddress address of the queried token
     * @return amount of the given token in the wallet
     */
    function getBalance(bytes32 _walletId, address _tokenAddress) public view returns(uint) {
        return wallets[_walletId].balances[_tokenAddress];
    }

    /**
     * @notice Get proposedNewOperator of a given wallet
     * @param _walletId id of the queried wallet
     * @return wallet's proposedNewOperator
     */
    function getProposedNewOperator(bytes32 _walletId) external view returns(address) {
        return wallets[_walletId].proposedNewOperator;

    }

    /**
     * @notice Get the vote of an owner for the proposedNewOperator of a wallet
     * @param _walletId id of the queried wallet
     * @param _owner owner to be checked
     * @return the owner's vote for the proposedNewOperator
     */
    function getProposalVote(
        bytes32 _walletId,
        address _owner
    )
        external
        view
        onlyWalletOwner(_walletId, _owner)
        returns(bool)
    {
        return wallets[_walletId].proposalVotes[_owner];
    }

    /**
     * @notice Internal function to withdraw out one type of token
     * @param _tokenAddress address of token to withdraw
     * @param _receiver token receiver
     * @param _amount withdrawal token amount
     */
    function _withdrawToken(address _tokenAddress, address _receiver, uint _amount) internal {
        if (_tokenAddress == address(0)) {
            // convert from address to address payable
            // TODO: latest version of openzeppelin Address.sol provide this api toPayable()
            address payable receiver  = address(uint160(_receiver));
            receiver.transfer(_amount);
        } else {
            IERC20(_tokenAddress).safeTransfer(_receiver, _amount);
        }
    }

    /**
     * @notice Update balance record
     * @param _walletId id of wallet to update
     * @param _tokenAddress address of token to update
     * @param _amount update amount
     * @param _op update operation
     */
    function _updateBalance(
        bytes32 _walletId,
        address _tokenAddress,
        uint _amount,
        MathOperation _op
    )
        internal
    {
        Wallet storage w = wallets[_walletId];
        if (_op == MathOperation.Add) {
            w.balances[_tokenAddress] = w.balances[_tokenAddress].add(_amount);
        } else if (_op == MathOperation.Sub) {
            w.balances[_tokenAddress] = w.balances[_tokenAddress].sub(_amount);
        } else {
            assert(false);
        }
    }

    /**
     * @notice Clear all votes of new operator proposals of the wallet
     * @param _w the wallet
     */
    function _clearVotes(Wallet storage _w) internal {
        for (uint i = 0; i < _w.owners.length; i++) {
            _w.proposalVotes[_w.owners[i]] = false;
        }
    }

    /**
     * @notice Internal function of changing the operator of a wallet
     * @param _walletId id of wallet to change its operator
     * @param _newOperator the new operator
     */
    function _changeOperator(bytes32 _walletId, address _newOperator) internal {
        require(_newOperator != address(0), "New operator is address(0)");

        Wallet storage w = wallets[_walletId];
        address oldOperator = w.operator;
        w.operator = _newOperator;
        emit ChangeOperator(_walletId, oldOperator, _newOperator);
    }

    /**
     * @notice Check if all owners have voted for the same new operator
     * @param _w the wallet
     * @return true if all owners have voted for a same operator; otherwise false
     */
    function _checkAllVotes(Wallet storage _w) internal view returns(bool) {
        for (uint i = 0; i < _w.owners.length; i++) {
            if (_w.proposalVotes[_w.owners[i]] == false) {
                return false;
            }
        }
        return true;
    }

    /**
     * @notice Check if an address is an owner of a wallet
     * @param _walletId id of wallet to check
     * @param _addr address to check
     * @return true if this address is an owner of the wallet; otherwise false
     */
    function _isWalletOwner(bytes32 _walletId, address _addr) internal view returns(bool) {
        Wallet storage w = wallets[_walletId];
        for (uint i = 0; i < w.owners.length; i++) {
            if (_addr == w.owners[i]) {
                return true;
            }
        }
        return false;
    }
}

Contract Security Audit

Contract ABI

[{"constant":false,"inputs":[{"name":"_owners","type":"address[]"},{"name":"_operator","type":"address"},{"name":"_nonce","type":"bytes32"}],"name":"create","outputs":[{"name":"","type":"bytes32"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"_walletId","type":"bytes32"}],"name":"getProposedNewOperator","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_walletId","type":"bytes32"}],"name":"getWalletOwners","outputs":[{"name":"","type":"address[]"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_walletId","type":"bytes32"},{"name":"_newOperator","type":"address"}],"name":"proposeNewOperator","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"walletNum","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"unpause","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"account","type":"address"}],"name":"isPauser","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_walletId","type":"bytes32"},{"name":"_tokenAddress","type":"address"}],"name":"getBalance","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"paused","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"renouncePauser","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_fromWalletId","type":"bytes32"},{"name":"_toWalletId","type":"bytes32"},{"name":"_tokenAddress","type":"address"},{"name":"_receiver","type":"address"},{"name":"_amount","type":"uint256"}],"name":"transferToWallet","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"account","type":"address"}],"name":"addPauser","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[],"name":"pause","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_walletId","type":"bytes32"},{"name":"_tokenAddress","type":"address"},{"name":"_receiver","type":"address"},{"name":"_amount","type":"uint256"}],"name":"withdraw","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_walletId","type":"bytes32"},{"name":"_newOperator","type":"address"}],"name":"transferOperatorship","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"_walletId","type":"bytes32"}],"name":"getOperator","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_tokenAddress","type":"address"},{"name":"_receiver","type":"address"},{"name":"_amount","type":"uint256"}],"name":"drainToken","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_walletId","type":"bytes32"},{"name":"_tokenAddress","type":"address"},{"name":"_amount","type":"uint256"}],"name":"depositERC20","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"_walletId","type":"bytes32"},{"name":"_owner","type":"address"}],"name":"getProposalVote","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_walletId","type":"bytes32"}],"name":"depositETH","outputs":[],"payable":true,"stateMutability":"payable","type":"function"},{"anonymous":false,"inputs":[{"indexed":false,"name":"account","type":"address"}],"name":"Paused","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"account","type":"address"}],"name":"Unpaused","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"account","type":"address"}],"name":"PauserAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"account","type":"address"}],"name":"PauserRemoved","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"walletId","type":"bytes32"},{"indexed":true,"name":"owners","type":"address[]"},{"indexed":true,"name":"operator","type":"address"}],"name":"CreateWallet","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"walletId","type":"bytes32"},{"indexed":true,"name":"tokenAddress","type":"address"},{"indexed":false,"name":"amount","type":"uint256"}],"name":"DepositToWallet","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"walletId","type":"bytes32"},{"indexed":true,"name":"tokenAddress","type":"address"},{"indexed":true,"name":"receiver","type":"address"},{"indexed":false,"name":"amount","type":"uint256"}],"name":"WithdrawFromWallet","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"fromWalletId","type":"bytes32"},{"indexed":true,"name":"toWalletId","type":"bytes32"},{"indexed":true,"name":"tokenAddress","type":"address"},{"indexed":false,"name":"receiver","type":"address"},{"indexed":false,"name":"amount","type":"uint256"}],"name":"TransferToWallet","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"walletId","type":"bytes32"},{"indexed":true,"name":"oldOperator","type":"address"},{"indexed":true,"name":"newOperator","type":"address"}],"name":"ChangeOperator","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"walletId","type":"bytes32"},{"indexed":true,"name":"newOperator","type":"address"},{"indexed":true,"name":"proposer","type":"address"}],"name":"ProposeNewOperator","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"tokenAddress","type":"address"},{"indexed":true,"name":"receiver","type":"address"},{"indexed":false,"name":"amount","type":"uint256"}],"name":"DrainToken","type":"event"}]

6080604052620000183364010000000062000028810204565b6001805460ff1916905562000109565b62000043600082640100000000620015796200007a82021704565b604051600160a060020a038216907f6719d08c1888103bea251a4ed56406bd0c3e69723c8a1686e017e7bbe159b6f890600090a250565b600160a060020a0381166200008e57600080fd5b620000a38282640100000000620000d3810204565b15620000ae57600080fd5b600160a060020a0316600090815260209190915260409020805460ff19166001179055565b6000600160a060020a038216620000e957600080fd5b50600160a060020a03166000908152602091909152604090205460ff1690565b61176f80620001196000396000f3fe60806040526004361061013c576000357c01000000000000000000000000000000000000000000000000000000009004806380ba952e116100bd578063a96a5f9411610081578063a96a5f94146104f9578063bfa2c1d214610523578063c108bb4014610566578063cafd4600146105a5578063d68d9d4e146105de5761013c565b806380ba952e146103e057806382dc1ec41461042f5780638456cb59146104625780638e0cc17614610477578063a0c89a8c146104c05761013c565b80633f4ba83a116101045780633f4ba83a1461032157806346fbf68e14610336578063530e931c1461037d5780635c975abb146103b65780636ef8d66d146103cb5761013c565b80630d63a1fd1461014157806314da2906146102115780631687cc6014610257578063323c4480146102d157806336cc9e8d1461030c575b600080fd5b34801561014d57600080fd5b506101ff6004803603606081101561016457600080fd5b81019060208101813564010000000081111561017f57600080fd5b82018360208201111561019157600080fd5b803590602001918460208302840111640100000000831117156101b357600080fd5b91908080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525092955050600160a060020a0383351693505050602001356105fb565b60408051918252519081900360200190f35b34801561021d57600080fd5b5061023b6004803603602081101561023457600080fd5b50356107e5565b60408051600160a060020a039092168252519081900360200190f35b34801561026357600080fd5b506102816004803603602081101561027a57600080fd5b5035610807565b60408051602080825283518183015283519192839290830191858101910280838360005b838110156102bd5781810151838201526020016102a5565b505050509050019250505060405180910390f35b3480156102dd57600080fd5b5061030a600480360360408110156102f457600080fd5b5080359060200135600160a060020a0316610873565b005b34801561031857600080fd5b506101ff6109ed565b34801561032d57600080fd5b5061030a6109f3565b34801561034257600080fd5b506103696004803603602081101561035957600080fd5b5035600160a060020a0316610a53565b604080519115158252519081900360200190f35b34801561038957600080fd5b506101ff600480360360408110156103a057600080fd5b5080359060200135600160a060020a0316610a6b565b3480156103c257600080fd5b50610369610a97565b3480156103d757600080fd5b5061030a610aa1565b3480156103ec57600080fd5b5061030a600480360360a081101561040357600080fd5b50803590602081013590600160a060020a03604082013581169160608101359091169060800135610aac565b34801561043b57600080fd5b5061030a6004803603602081101561045257600080fd5b5035600160a060020a0316610c46565b34801561046e57600080fd5b5061030a610c64565b34801561048357600080fd5b5061030a6004803603608081101561049a57600080fd5b50803590600160a060020a03602082013581169160408101359091169060600135610cc7565b3480156104cc57600080fd5b5061030a600480360360408110156104e357600080fd5b5080359060200135600160a060020a0316610e01565b34801561050557600080fd5b5061023b6004803603602081101561051c57600080fd5b5035610e93565b34801561052f57600080fd5b5061030a6004803603606081101561054657600080fd5b50600160a060020a03813581169160208101359091169060400135610eb1565b34801561057257600080fd5b5061030a6004803603606081101561058957600080fd5b50803590600160a060020a036020820135169060400135610f28565b3480156105b157600080fd5b50610369600480360360408110156105c857600080fd5b5080359060200135600160a060020a0316610fa0565b61030a600480360360208110156105f457600080fd5b503561101e565b60015460009060ff161561060e57600080fd5b600160a060020a03831661066c576040805160e560020a62461bcd02815260206004820152601a60248201527f4e6577206f70657261746f722069732061646472657373283029000000000000604482015290519081900360640190fd5b604080516c010000000000000000000000003081026020808401919091523391909102603483015260488083018690528351808403909101815260689092018352815191810191909120600081815260039092529190206001810154600160a060020a031615610726576040805160e560020a62461bcd02815260206004820152601260248201527f4f636375706965642077616c6c65742069640000000000000000000000000000604482015290519081900360640190fd5b85516107389082906020890190611676565b506001818101805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a03881690811790915560028054909201909155604051875188919081906020808501910280838360005b838110156107a0578181015183820152602001610788565b505060405192909401829003822095508894507fe778e91533ef049a5fc99752bc4efb2b50ca4c967dfc0d4bb4782fb128070c3493506000925050a450949350505050565b60008181526003602081905260409091200154600160a060020a03165b919050565b60008181526003602090815260409182902080548351818402810184019094528084526060939283018282801561086757602002820191906000526020600020905b8154600160a060020a03168152600190910190602001808311610849575b50505050509050919050565b813361087f8282611078565b6108bd5760405160e560020a62461bcd02815260040180806020018281038252602181526020018061171a6021913960400191505060405180910390fd5b600160a060020a03831661091b576040805160e560020a62461bcd02815260206004820152601a60248201527f4e6577206f70657261746f722069732061646472657373283029000000000000604482015290519081900360640190fd5b600084815260036020819052604090912090810154600160a060020a038581169116146109765761094b816110dd565b60038101805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a0386161790555b336000818152600483016020526040808220805460ff1916600117905551600160a060020a0387169188917f71f9e7796b33cb192d1670169ee7f4af7c5364f8f01bab4b95466787593745c39190a46109ce81611140565b156109e6576109dd85856111a9565b6109e6816110dd565b5050505050565b60025481565b6109fc33610a53565b610a0557600080fd5b60015460ff16610a1457600080fd5b6001805460ff191690556040805133815290517f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa9181900360200190a1565b6000610a65818363ffffffff61127b16565b92915050565b6000828152600360209081526040808320600160a060020a038516845260020190915290205492915050565b60015460ff165b90565b610aaa336112b0565b565b60015460ff1615610abc57600080fd5b6000858152600360205260409020600101548590600160a060020a03163314610b2f576040805160e560020a62461bcd02815260206004820152601a60248201527f6d73672e73656e646572206973206e6f74206f70657261746f72000000000000604482015290519081900360640190fd5b8583610b3b8282611078565b610b795760405160e560020a62461bcd02815260040180806020018281038252602181526020018061171a6021913960400191505060405180910390fd5b8685610b858282611078565b610bc35760405160e560020a62461bcd02815260040180806020018281038252602181526020018061171a6021913960400191505060405180910390fd5b610bd08a898860016112f8565b610bdd89898860006112f8565b87600160a060020a0316898b7f1b56f805e5edb1e61b0d3f46feffdcbab5e591aa0e70e978ada9fc22093601c88a8a6040518083600160a060020a0316600160a060020a031681526020018281526020019250505060405180910390a450505050505050505050565b610c4f33610a53565b610c5857600080fd5b610c61816113a5565b50565b610c6d33610a53565b610c7657600080fd5b60015460ff1615610c8657600080fd5b6001805460ff1916811790556040805133815290517f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a2589181900360200190a1565b60015460ff1615610cd757600080fd5b6000848152600360205260409020600101548490600160a060020a03163314610d4a576040805160e560020a62461bcd02815260206004820152601a60248201527f6d73672e73656e646572206973206e6f74206f70657261746f72000000000000604482015290519081900360640190fd5b8483610d568282611078565b610d945760405160e560020a62461bcd02815260040180806020018281038252602181526020018061171a6021913960400191505060405180910390fd5b610da187878660016112f8565b84600160a060020a031686600160a060020a0316887fd897e862036b62a0f770979fbd2227f3210565bba2eb4d9acd1dc8ccc00c928b876040518082815260200191505060405180910390a4610df88686866113ed565b50505050505050565b60015460ff1615610e1157600080fd5b6000828152600360205260409020600101548290600160a060020a03163314610e84576040805160e560020a62461bcd02815260206004820152601a60248201527f6d73672e73656e646572206973206e6f74206f70657261746f72000000000000604482015290519081900360640190fd5b610e8e83836111a9565b505050565b600090815260036020526040902060010154600160a060020a031690565b60015460ff16610ec057600080fd5b610ec933610a53565b610ed257600080fd5b81600160a060020a031683600160a060020a03167f896ecb17b26927fb33933fc5f413873193bced3c59fe736c42968a9778bf6b58836040518082815260200191505060405180910390a3610e8e8383836113ed565b60015460ff1615610f3857600080fd5b610f4583838360006112f8565b604080518281529051600160a060020a0384169185917fbc8e388b96ba8b9f627cb6d72d3513182f763c33c6107ecd31191de1f71abc1a9181900360200190a3610e8e600160a060020a03831633308463ffffffff61145416565b60008282610fae8282611078565b610fec5760405160e560020a62461bcd02815260040180806020018281038252602181526020018061171a6021913960400191505060405180910390fd5b5050506000918252600360209081526040808420600160a060020a039390931684526004909201905290205460ff1690565b60015460ff161561102e57600080fd5b3461103c82600083816112f8565b60408051828152905160009184917fbc8e388b96ba8b9f627cb6d72d3513182f763c33c6107ecd31191de1f71abc1a9181900360200190a35050565b6000828152600360205260408120815b81548110156110d2578160000181815481106110a057fe5b600091825260209091200154600160a060020a03858116911614156110ca57600192505050610a65565b600101611088565b506000949350505050565b60005b815481101561113c57600082600401600084600001848154811061110057fe5b600091825260208083209190910154600160a060020a031683528201929092526040019020805460ff19169115159190911790556001016110e0565b5050565b6000805b82548110156111a05782600401600084600001838154811061116257fe5b6000918252602080832090910154600160a060020a0316835282019290925260400190205460ff16611198576000915050610802565b600101611144565b50600192915050565b600160a060020a038116611207576040805160e560020a62461bcd02815260206004820152601a60248201527f4e6577206f70657261746f722069732061646472657373283029000000000000604482015290519081900360640190fd5b600082815260036020526040808220600181018054600160a060020a0386811673ffffffffffffffffffffffffffffffffffffffff1983168117909355935192949316929091839187917f118c3f8030bc3c8254e737a0bd0584403c33646afbcbee8321c3bd5b26543cda9190a450505050565b6000600160a060020a03821661129057600080fd5b50600160a060020a03166000908152602091909152604090205460ff1690565b6112c160008263ffffffff61150316565b604051600160a060020a038216907fcd265ebaf09df2871cc7bd4133404a235ba12eff2041bb89d9c714a2621c7c7e90600090a250565b60008481526003602052604081209082600181111561131357fe5b141561136457600160a060020a0384166000908152600282016020526040902054611344908463ffffffff61154b16565b600160a060020a03851660009081526002830160205260409020556109e6565b600182600181111561137257fe5b14156113a357600160a060020a0384166000908152600282016020526040902054611344908463ffffffff61156416565bfe5b6113b660008263ffffffff61157916565b604051600160a060020a038216907f6719d08c1888103bea251a4ed56406bd0c3e69723c8a1686e017e7bbe159b6f890600090a250565b600160a060020a03831661143a576040518290600160a060020a0382169083156108fc029084906000818181858888f19350505050158015611433573d6000803e3d6000fd5b5050610e8e565b610e8e600160a060020a038416838363ffffffff6115c516565b604080517f23b872dd000000000000000000000000000000000000000000000000000000008152600160a060020a0385811660048301528481166024830152604482018490529151918616916323b872dd916064808201926020929091908290030181600087803b1580156114c857600080fd5b505af11580156114dc573d6000803e3d6000fd5b505050506040513d60208110156114f257600080fd5b50516114fd57600080fd5b50505050565b600160a060020a03811661151657600080fd5b611520828261127b565b61152957600080fd5b600160a060020a0316600090815260209190915260409020805460ff19169055565b60008282018381101561155d57600080fd5b9392505050565b60008282111561157357600080fd5b50900390565b600160a060020a03811661158c57600080fd5b611596828261127b565b156115a057600080fd5b600160a060020a0316600090815260209190915260409020805460ff19166001179055565b82600160a060020a031663a9059cbb83836040518363ffffffff167c01000000000000000000000000000000000000000000000000000000000281526004018083600160a060020a0316600160a060020a0316815260200182815260200192505050602060405180830381600087803b15801561164157600080fd5b505af1158015611655573d6000803e3d6000fd5b505050506040513d602081101561166b57600080fd5b5051610e8e57600080fd5b8280548282559060005260206000209081019282156116d8579160200282015b828111156116d8578251825473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a03909116178255602090920191600190910190611696565b506116e49291506116e8565b5090565b610a9e91905b808211156116e457805473ffffffffffffffffffffffffffffffffffffffff191681556001016116ee56fe476976656e2061646472657373206973206e6f742077616c6c6574206f776e6572a265627a7a72305820a267d9485b9aea3cd16e5d5b2dc6fc9eaf93731dd38628af3c5eebbf47de01e064736f6c634300050a0032

Deployed Bytecode

0x60806040526004361061013c576000357c01000000000000000000000000000000000000000000000000000000009004806380ba952e116100bd578063a96a5f9411610081578063a96a5f94146104f9578063bfa2c1d214610523578063c108bb4014610566578063cafd4600146105a5578063d68d9d4e146105de5761013c565b806380ba952e146103e057806382dc1ec41461042f5780638456cb59146104625780638e0cc17614610477578063a0c89a8c146104c05761013c565b80633f4ba83a116101045780633f4ba83a1461032157806346fbf68e14610336578063530e931c1461037d5780635c975abb146103b65780636ef8d66d146103cb5761013c565b80630d63a1fd1461014157806314da2906146102115780631687cc6014610257578063323c4480146102d157806336cc9e8d1461030c575b600080fd5b34801561014d57600080fd5b506101ff6004803603606081101561016457600080fd5b81019060208101813564010000000081111561017f57600080fd5b82018360208201111561019157600080fd5b803590602001918460208302840111640100000000831117156101b357600080fd5b91908080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525092955050600160a060020a0383351693505050602001356105fb565b60408051918252519081900360200190f35b34801561021d57600080fd5b5061023b6004803603602081101561023457600080fd5b50356107e5565b60408051600160a060020a039092168252519081900360200190f35b34801561026357600080fd5b506102816004803603602081101561027a57600080fd5b5035610807565b60408051602080825283518183015283519192839290830191858101910280838360005b838110156102bd5781810151838201526020016102a5565b505050509050019250505060405180910390f35b3480156102dd57600080fd5b5061030a600480360360408110156102f457600080fd5b5080359060200135600160a060020a0316610873565b005b34801561031857600080fd5b506101ff6109ed565b34801561032d57600080fd5b5061030a6109f3565b34801561034257600080fd5b506103696004803603602081101561035957600080fd5b5035600160a060020a0316610a53565b604080519115158252519081900360200190f35b34801561038957600080fd5b506101ff600480360360408110156103a057600080fd5b5080359060200135600160a060020a0316610a6b565b3480156103c257600080fd5b50610369610a97565b3480156103d757600080fd5b5061030a610aa1565b3480156103ec57600080fd5b5061030a600480360360a081101561040357600080fd5b50803590602081013590600160a060020a03604082013581169160608101359091169060800135610aac565b34801561043b57600080fd5b5061030a6004803603602081101561045257600080fd5b5035600160a060020a0316610c46565b34801561046e57600080fd5b5061030a610c64565b34801561048357600080fd5b5061030a6004803603608081101561049a57600080fd5b50803590600160a060020a03602082013581169160408101359091169060600135610cc7565b3480156104cc57600080fd5b5061030a600480360360408110156104e357600080fd5b5080359060200135600160a060020a0316610e01565b34801561050557600080fd5b5061023b6004803603602081101561051c57600080fd5b5035610e93565b34801561052f57600080fd5b5061030a6004803603606081101561054657600080fd5b50600160a060020a03813581169160208101359091169060400135610eb1565b34801561057257600080fd5b5061030a6004803603606081101561058957600080fd5b50803590600160a060020a036020820135169060400135610f28565b3480156105b157600080fd5b50610369600480360360408110156105c857600080fd5b5080359060200135600160a060020a0316610fa0565b61030a600480360360208110156105f457600080fd5b503561101e565b60015460009060ff161561060e57600080fd5b600160a060020a03831661066c576040805160e560020a62461bcd02815260206004820152601a60248201527f4e6577206f70657261746f722069732061646472657373283029000000000000604482015290519081900360640190fd5b604080516c010000000000000000000000003081026020808401919091523391909102603483015260488083018690528351808403909101815260689092018352815191810191909120600081815260039092529190206001810154600160a060020a031615610726576040805160e560020a62461bcd02815260206004820152601260248201527f4f636375706965642077616c6c65742069640000000000000000000000000000604482015290519081900360640190fd5b85516107389082906020890190611676565b506001818101805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a03881690811790915560028054909201909155604051875188919081906020808501910280838360005b838110156107a0578181015183820152602001610788565b505060405192909401829003822095508894507fe778e91533ef049a5fc99752bc4efb2b50ca4c967dfc0d4bb4782fb128070c3493506000925050a450949350505050565b60008181526003602081905260409091200154600160a060020a03165b919050565b60008181526003602090815260409182902080548351818402810184019094528084526060939283018282801561086757602002820191906000526020600020905b8154600160a060020a03168152600190910190602001808311610849575b50505050509050919050565b813361087f8282611078565b6108bd5760405160e560020a62461bcd02815260040180806020018281038252602181526020018061171a6021913960400191505060405180910390fd5b600160a060020a03831661091b576040805160e560020a62461bcd02815260206004820152601a60248201527f4e6577206f70657261746f722069732061646472657373283029000000000000604482015290519081900360640190fd5b600084815260036020819052604090912090810154600160a060020a038581169116146109765761094b816110dd565b60038101805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a0386161790555b336000818152600483016020526040808220805460ff1916600117905551600160a060020a0387169188917f71f9e7796b33cb192d1670169ee7f4af7c5364f8f01bab4b95466787593745c39190a46109ce81611140565b156109e6576109dd85856111a9565b6109e6816110dd565b5050505050565b60025481565b6109fc33610a53565b610a0557600080fd5b60015460ff16610a1457600080fd5b6001805460ff191690556040805133815290517f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa9181900360200190a1565b6000610a65818363ffffffff61127b16565b92915050565b6000828152600360209081526040808320600160a060020a038516845260020190915290205492915050565b60015460ff165b90565b610aaa336112b0565b565b60015460ff1615610abc57600080fd5b6000858152600360205260409020600101548590600160a060020a03163314610b2f576040805160e560020a62461bcd02815260206004820152601a60248201527f6d73672e73656e646572206973206e6f74206f70657261746f72000000000000604482015290519081900360640190fd5b8583610b3b8282611078565b610b795760405160e560020a62461bcd02815260040180806020018281038252602181526020018061171a6021913960400191505060405180910390fd5b8685610b858282611078565b610bc35760405160e560020a62461bcd02815260040180806020018281038252602181526020018061171a6021913960400191505060405180910390fd5b610bd08a898860016112f8565b610bdd89898860006112f8565b87600160a060020a0316898b7f1b56f805e5edb1e61b0d3f46feffdcbab5e591aa0e70e978ada9fc22093601c88a8a6040518083600160a060020a0316600160a060020a031681526020018281526020019250505060405180910390a450505050505050505050565b610c4f33610a53565b610c5857600080fd5b610c61816113a5565b50565b610c6d33610a53565b610c7657600080fd5b60015460ff1615610c8657600080fd5b6001805460ff1916811790556040805133815290517f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a2589181900360200190a1565b60015460ff1615610cd757600080fd5b6000848152600360205260409020600101548490600160a060020a03163314610d4a576040805160e560020a62461bcd02815260206004820152601a60248201527f6d73672e73656e646572206973206e6f74206f70657261746f72000000000000604482015290519081900360640190fd5b8483610d568282611078565b610d945760405160e560020a62461bcd02815260040180806020018281038252602181526020018061171a6021913960400191505060405180910390fd5b610da187878660016112f8565b84600160a060020a031686600160a060020a0316887fd897e862036b62a0f770979fbd2227f3210565bba2eb4d9acd1dc8ccc00c928b876040518082815260200191505060405180910390a4610df88686866113ed565b50505050505050565b60015460ff1615610e1157600080fd5b6000828152600360205260409020600101548290600160a060020a03163314610e84576040805160e560020a62461bcd02815260206004820152601a60248201527f6d73672e73656e646572206973206e6f74206f70657261746f72000000000000604482015290519081900360640190fd5b610e8e83836111a9565b505050565b600090815260036020526040902060010154600160a060020a031690565b60015460ff16610ec057600080fd5b610ec933610a53565b610ed257600080fd5b81600160a060020a031683600160a060020a03167f896ecb17b26927fb33933fc5f413873193bced3c59fe736c42968a9778bf6b58836040518082815260200191505060405180910390a3610e8e8383836113ed565b60015460ff1615610f3857600080fd5b610f4583838360006112f8565b604080518281529051600160a060020a0384169185917fbc8e388b96ba8b9f627cb6d72d3513182f763c33c6107ecd31191de1f71abc1a9181900360200190a3610e8e600160a060020a03831633308463ffffffff61145416565b60008282610fae8282611078565b610fec5760405160e560020a62461bcd02815260040180806020018281038252602181526020018061171a6021913960400191505060405180910390fd5b5050506000918252600360209081526040808420600160a060020a039390931684526004909201905290205460ff1690565b60015460ff161561102e57600080fd5b3461103c82600083816112f8565b60408051828152905160009184917fbc8e388b96ba8b9f627cb6d72d3513182f763c33c6107ecd31191de1f71abc1a9181900360200190a35050565b6000828152600360205260408120815b81548110156110d2578160000181815481106110a057fe5b600091825260209091200154600160a060020a03858116911614156110ca57600192505050610a65565b600101611088565b506000949350505050565b60005b815481101561113c57600082600401600084600001848154811061110057fe5b600091825260208083209190910154600160a060020a031683528201929092526040019020805460ff19169115159190911790556001016110e0565b5050565b6000805b82548110156111a05782600401600084600001838154811061116257fe5b6000918252602080832090910154600160a060020a0316835282019290925260400190205460ff16611198576000915050610802565b600101611144565b50600192915050565b600160a060020a038116611207576040805160e560020a62461bcd02815260206004820152601a60248201527f4e6577206f70657261746f722069732061646472657373283029000000000000604482015290519081900360640190fd5b600082815260036020526040808220600181018054600160a060020a0386811673ffffffffffffffffffffffffffffffffffffffff1983168117909355935192949316929091839187917f118c3f8030bc3c8254e737a0bd0584403c33646afbcbee8321c3bd5b26543cda9190a450505050565b6000600160a060020a03821661129057600080fd5b50600160a060020a03166000908152602091909152604090205460ff1690565b6112c160008263ffffffff61150316565b604051600160a060020a038216907fcd265ebaf09df2871cc7bd4133404a235ba12eff2041bb89d9c714a2621c7c7e90600090a250565b60008481526003602052604081209082600181111561131357fe5b141561136457600160a060020a0384166000908152600282016020526040902054611344908463ffffffff61154b16565b600160a060020a03851660009081526002830160205260409020556109e6565b600182600181111561137257fe5b14156113a357600160a060020a0384166000908152600282016020526040902054611344908463ffffffff61156416565bfe5b6113b660008263ffffffff61157916565b604051600160a060020a038216907f6719d08c1888103bea251a4ed56406bd0c3e69723c8a1686e017e7bbe159b6f890600090a250565b600160a060020a03831661143a576040518290600160a060020a0382169083156108fc029084906000818181858888f19350505050158015611433573d6000803e3d6000fd5b5050610e8e565b610e8e600160a060020a038416838363ffffffff6115c516565b604080517f23b872dd000000000000000000000000000000000000000000000000000000008152600160a060020a0385811660048301528481166024830152604482018490529151918616916323b872dd916064808201926020929091908290030181600087803b1580156114c857600080fd5b505af11580156114dc573d6000803e3d6000fd5b505050506040513d60208110156114f257600080fd5b50516114fd57600080fd5b50505050565b600160a060020a03811661151657600080fd5b611520828261127b565b61152957600080fd5b600160a060020a0316600090815260209190915260409020805460ff19169055565b60008282018381101561155d57600080fd5b9392505050565b60008282111561157357600080fd5b50900390565b600160a060020a03811661158c57600080fd5b611596828261127b565b156115a057600080fd5b600160a060020a0316600090815260209190915260409020805460ff19166001179055565b82600160a060020a031663a9059cbb83836040518363ffffffff167c01000000000000000000000000000000000000000000000000000000000281526004018083600160a060020a0316600160a060020a0316815260200182815260200192505050602060405180830381600087803b15801561164157600080fd5b505af1158015611655573d6000803e3d6000fd5b505050506040513d602081101561166b57600080fd5b5051610e8e57600080fd5b8280548282559060005260206000209081019282156116d8579160200282015b828111156116d8578251825473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a03909116178255602090920191600190910190611696565b506116e49291506116e8565b5090565b610a9e91905b808211156116e457805473ffffffffffffffffffffffffffffffffffffffff191681556001016116ee56fe476976656e2061646472657373206973206e6f742077616c6c6574206f776e6572a265627a7a72305820a267d9485b9aea3cd16e5d5b2dc6fc9eaf93731dd38628af3c5eebbf47de01e064736f6c634300050a0032

Deployed Bytecode Sourcemap

10508:12936:0:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12017:680;;8:9:-1;5:2;;;30:1;27;20:12;5:2;12017:680:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;12017:680:0;;;;;;;;21:11:-1;5:28;;2:2;;;46:1;43;36:12;2:2;12017:680:0;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;12017:680:0;;;;;;101:9:-1;95:2;81:12;77:21;67:8;63:36;60:51;39:11;25:12;22:29;11:108;8:2;;;132:1;129;122:12;8:2;12017:680:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16;;74:27;;;;-1:-1;12017:680:0;;-1:-1:-1;;;;;;;12017:680:0;;;;-1:-1:-1;;;12017:680:0;;;;:::i;:::-;;;;;;;;;;;;;;;;19356:148;;8:9:-1;5:2;;;30:1;27;20:12;5:2;19356:148:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;19356:148:0;;:::i;:::-;;;;-1:-1:-1;;;;;19356:148:0;;;;;;;;;;;;;;18354:135;;8:9:-1;5:2;;;30:1;27;20:12;5:2;18354:135:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;18354:135:0;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:100:-1;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;18354:135:0;;;;;;;;;;;;;;;;;16935:691;;8:9:-1;5:2;;;30:1;27;20:12;5:2;16935:691:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;16935:691:0;;;;;;-1:-1:-1;;;;;16935:691:0;;:::i;:::-;;11003:21;;8:9:-1;5:2;;;30:1;27;20:12;5:2;11003:21:0;;;:::i;10035:118::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;10035:118:0;;;:::i;8213:109::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;8213:109:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;8213:109:0;-1:-1:-1;;;;;8213:109:0;;:::i;:::-;;;;;;;;;;;;;;;;;;19021:156;;8:9:-1;5:2;;;30:1;27;20:12;5:2;19021:156:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;19021:156:0;;;;;;-1:-1:-1;;;;;19021:156:0;;:::i;9288:78::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;9288:78:0;;;:::i;8430:77::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;8430:77:0;;;:::i;15482:626::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;15482:626:0;;;;;;13:3:-1;8;5:12;2:2;;;30:1;27;20:12;2:2;-1:-1;15482:626:0;;;;;;;;-1:-1:-1;;;;;15482:626:0;;;;;;;;;;;;;;;;;;;:::i;8330:92::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;8330:92:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;8330:92:0;-1:-1:-1;;;;;8330:92:0;;:::i;9824:116::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;9824:116:0;;;:::i;14415:489::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;14415:489:0;;;;;;13:3:-1;8;5:12;2:2;;;30:1;27;20:12;2:2;-1:-1;14415:489:0;;;-1:-1:-1;;;;;14415:489:0;;;;;;;;;;;;;;;;;;;:::i;16338:232::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;16338:232:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;16338:232:0;;;;;;-1:-1:-1;;;;;16338:232:0;;:::i;18646:122::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;18646:122:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;18646:122:0;;:::i;17899:302::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;17899:302:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;17899:302:0;;;;;;;;;;;;;;;;;:::i;13302:396::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;13302:396:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;13302:396:0;;;-1:-1:-1;;;;;13302:396:0;;;;;;;;;;:::i;19764:255::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;19764:255:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;19764:255:0;;;;;;-1:-1:-1;;;;;19764:255:0;;:::i;12821:247::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;12821:247:0;;:::i;12017:680::-;9525:7;;12184;;9525;;9524:8;9516:17;;;;;;-1:-1:-1;;;;;12217:23:0;;12209:62;;;;;-1:-1:-1;;;;;12209:62:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;12313:51;;;;12338:4;12313:51;;;;;;;;;;12345:10;12313:51;;;;;;;;;;;;;;;;;26:21:-1;;;22:32;;;6:49;;12313:51:0;;;;;;12303:62;;;;;;;;;12284:16;12395:17;;;:7;:17;;;;;;12472:10;;;;-1:-1:-1;;;;;12472:10:0;:24;12464:55;;;;;-1:-1:-1;;;;;12464:55:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;12530:18;;;;:1;;:18;;;;;:::i;:::-;-1:-1:-1;12559:10:0;;;;:22;;-1:-1:-1;;12559:22:0;-1:-1:-1;;;;;12559:22:0;;;;;;;;12592:9;:11;;;;;;;;12621:42;;;;;;;;;;;;;;;;;;-1:-1:-1;8:100;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;-1:-1;;12621:42:0;;;;;;;;;;;;-1:-1:-1;12634:8:0;;-1:-1:-1;12621:42:0;;-1:-1:-1;12621:42:0;;-1:-1:-1;;12621:42:0;-1:-1:-1;12681:8:0;12017:680;-1:-1:-1;;;;12017:680:0:o;19356:148::-;19429:7;19456:18;;;:7;:18;;;;;;;;:38;;-1:-1:-1;;;;;19456:38:0;19356:148;;;;:::o;18354:135::-;18456:18;;;;:7;:18;;;;;;;;;18449:32;;;;;;;;;;;;;;;;;18420:16;;18449:32;;;18456:18;18449:32;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;18449:32:0;;;;;;;;;;;;;;;;;;;;;;;18354:135;;;:::o;16935:691::-;17070:9;17081:10;11658:32;11673:9;11684:5;11658:14;:32::i;:::-;11650:78;;;;-1:-1:-1;;;;;11650:78:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;17117:26:0;;17109:65;;;;;-1:-1:-1;;;;;17109:65:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;17187:16;17206:18;;;:7;:18;;;;;;;;17255:21;;;;-1:-1:-1;;;;;17239:37:0;;;17255:21;;17239:37;17235:135;;17293:14;17305:1;17293:11;:14::i;:::-;17322:21;;;:36;;-1:-1:-1;;17322:36:0;-1:-1:-1;;;;;17322:36:0;;;;;17235:135;17398:10;17382:27;;;;:15;;;:27;;;;;;:34;;-1:-1:-1;;17382:34:0;17412:4;17382:34;;;17432:55;-1:-1:-1;;;;;17432:55:0;;;17451:9;;17432:55;;17382:27;17432:55;17504:17;17519:1;17504:14;:17::i;:::-;17500:119;;;17538:40;17554:9;17565:12;17538:15;:40::i;:::-;17593:14;17605:1;17593:11;:14::i;:::-;11739:1;16935:691;;;;:::o;11003:21::-;;;;:::o;10035:118::-;8164:20;8173:10;8164:8;:20::i;:::-;8156:29;;;;;;9704:7;;;;9696:16;;;;;;10094:7;:15;;-1:-1:-1;;10094:15:0;;;10125:20;;;10134:10;10125:20;;;;;;;;;;;;;10035:118::o;8213:109::-;8269:4;8293:21;8269:4;8306:7;8293:21;:12;:21;:::i;:::-;8286:28;8213:109;-1:-1:-1;;8213:109:0:o;19021:156::-;19103:4;19127:18;;;:7;:18;;;;;;;;-1:-1:-1;;;;;19127:42:0;;;;:27;;:42;;;;;;19021:156;;;;:::o;9288:78::-;9351:7;;;;9288:78;;:::o;8430:77::-;8474:25;8488:10;8474:13;:25::i;:::-;8430:77::o;15482:626::-;9525:7;;;;9524:8;9516:17;;;;;;11309:18;;;;:7;:18;;;;;:27;;;:18;;-1:-1:-1;;;;;11309:27:0;11295:10;:41;11287:80;;;;;-1:-1:-1;;;;;11287:80:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;15761:13;15776:9;11658:32;11673:9;11684:5;11658:14;:32::i;:::-;11650:78;;;;-1:-1:-1;;;;;11650:78:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;15812:11;15825:9;11658:32;11673:9;11684:5;11658:14;:32::i;:::-;11650:78;;;;-1:-1:-1;;;;;11650:78:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;15852:72;15867:13;15882;15897:7;15906:17;15852:14;:72::i;:::-;15935:70;15950:11;15963:13;15978:7;15987:17;15935:14;:70::i;:::-;16066:13;-1:-1:-1;;;;;16021:79:0;16053:11;16038:13;16021:79;16081:9;16092:7;16021:79;;;;-1:-1:-1;;;;;16021:79:0;-1:-1:-1;;;;;16021:79:0;;;;;;;;;;;;;;;;;;;;;11739:1;;11378;;9544;15482:626;;;;;:::o;8330:92::-;8164:20;8173:10;8164:8;:20::i;:::-;8156:29;;;;;;8395:19;8406:7;8395:10;:19::i;:::-;8330:92;:::o;9824:116::-;8164:20;8173:10;8164:8;:20::i;:::-;8156:29;;;;;;9525:7;;;;9524:8;9516:17;;;;;;9894:4;9884:14;;-1:-1:-1;;9884:14:0;;;;;9914:18;;;9921:10;9914:18;;;;;;;;;;;;;9824:116::o;14415:489::-;9525:7;;;;9524:8;9516:17;;;;;;11309:18;;;;:7;:18;;;;;:27;;;:18;;-1:-1:-1;;;;;11309:27:0;11295:10;:41;11287:80;;;;;-1:-1:-1;;;;;11287:80:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;14648:9;14659;11658:32;11673:9;11684:5;11658:14;:32::i;:::-;11650:78;;;;-1:-1:-1;;;;;11650:78:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14686:68;14701:9;14712:13;14727:7;14736:17;14686:14;:68::i;:::-;14815:9;-1:-1:-1;;;;;14770:64:0;14800:13;-1:-1:-1;;;;;14770:64:0;14789:9;14770:64;14826:7;14770:64;;;;;;;;;;;;;;;;;;14847:49;14862:13;14877:9;14888:7;14847:14;:49::i;:::-;11378:1;;9544;14415:489;;;;:::o;16338:232::-;9525:7;;;;9524:8;9516:17;;;;;;11309:18;;;;:7;:18;;;;;:27;;;:18;;-1:-1:-1;;;;;11309:27:0;11295:10;:41;11287:80;;;;;-1:-1:-1;;;;;11287:80:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;16522:40;16538:9;16549:12;16522:15;:40::i;:::-;9544:1;16338:232;;:::o;18646:122::-;18706:7;18733:18;;;:7;:18;;;;;:27;;;-1:-1:-1;;;;;18733:27:0;;18646:122::o;17899:302::-;9704:7;;;;9696:16;;;;;;8164:20;8173:10;8164:8;:20::i;:::-;8156:29;;;;;;18112:9;-1:-1:-1;;;;;18086:45:0;18097:13;-1:-1:-1;;;;;18086:45:0;;18123:7;18086:45;;;;;;;;;;;;;;;;;;18144:49;18159:13;18174:9;18185:7;18144:14;:49::i;13302:396::-;9525:7;;;;9524:8;9516:17;;;;;;13469:68;13484:9;13495:13;13510:7;13519:17;13469:14;:68::i;:::-;13553:50;;;;;;;;-1:-1:-1;;;;;13553:50:0;;;13569:9;;13553:50;;;;;;;;;13616:74;-1:-1:-1;;;;;13616:38:0;;13655:10;13675:4;13682:7;13616:74;:38;:74;:::i;19764:255::-;19942:4;19906:9;19917:6;11658:32;11673:9;11684:5;11658:14;:32::i;:::-;11650:78;;;;-1:-1:-1;;;;;11650:78:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;19971:18:0;;;;:7;:18;;;;;;;;-1:-1:-1;;;;;19971:40:0;;;;;;:32;;;;:40;;;;;;;;19764:255::o;12821:247::-;9525:7;;;;9524:8;9516:17;;;;;;12914:9;12934:64;12949:9;12900:11;12914:9;12900:11;12934:14;:64::i;:::-;13014:46;;;;;;;;13049:1;;13030:9;;13014:46;;;;;;;;;9544:1;12821:247;:::o;23125:316::-;23205:4;23241:18;;;:7;:18;;;;;23205:4;23270:141;23291:15;;23287:19;;23270:141;;;23341:1;:8;;23350:1;23341:11;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;23332:20:0;;;23341:11;;23332:20;23328:72;;;23380:4;23373:11;;;;;;23328:72;23308:3;;23270:141;;;-1:-1:-1;23428:5:0;;23125:316;-1:-1:-1;;;;23125:316:0:o;21655:176::-;21720:6;21715:109;21736:16;;21732:20;;21715:109;;;21807:5;21774:2;:16;;:30;21791:2;:9;;21801:1;21791:12;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;21791:12:0;21774:30;;;;;;;;;;;;:38;;-1:-1:-1;;21774:38:0;;;;;;;;;;-1:-1:-1;21754:3:0;21715:109;;;;21655:176;:::o;22601:273::-;22666:4;;22683:162;22704:16;;22700:20;;22683:162;;;22746:2;:16;;:30;22763:2;:9;;22773:1;22763:12;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;22763:12:0;22746:30;;;;;;;;;;;;;;;22742:92;;22813:5;22806:12;;;;;22742:92;22722:3;;22683:162;;;-1:-1:-1;22862:4:0;;22601:273;-1:-1:-1;;22601:273:0:o;22034:356::-;-1:-1:-1;;;;;22128:26:0;;22120:65;;;;;-1:-1:-1;;;;;22120:65:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;22198:16;22217:18;;;:7;:18;;;;;;22268:10;;;;;-1:-1:-1;;;;;22289:25:0;;;-1:-1:-1;;22289:25:0;;;;;;;22330:52;;22217:18;;22268:10;;;22289:25;;22268:10;;22225:9;;22330:52;;22198:16;22330:52;22034:356;;;;:::o;7577:165::-;7649:4;-1:-1:-1;;;;;7674:21:0;;7666:30;;;;;;-1:-1:-1;;;;;;7714:20:0;:11;:20;;;;;;;;;;;;;;;7577:165::o;8645:130::-;8705:24;:8;8721:7;8705:24;:15;:24;:::i;:::-;8745:22;;-1:-1:-1;;;;;8745:22:0;;;;;;;;8645:130;:::o;20999:529::-;21175:16;21194:18;;;:7;:18;;;;;;21227:3;:24;;;;;;;;;21223:298;;;-1:-1:-1;;;;;21296:25:0;;;;;;:10;;;:25;;;;;;:38;;21326:7;21296:38;:29;:38;:::i;:::-;-1:-1:-1;;;;;21268:25:0;;;;;;:10;;;:25;;;;;:66;21223:298;;;21363:17;21356:3;:24;;;;;;;;;21352:169;;;-1:-1:-1;;;;;21425:25:0;;;;;;:10;;;:25;;;;;;:38;;21455:7;21425:38;:29;:38;:::i;21352:169::-;21496:13;8515:122;8572:21;:8;8585:7;8572:21;:12;:21;:::i;:::-;8609:20;;-1:-1:-1;;;;;8609:20:0;;;;;;;;8515:122;:::o;20258:500::-;-1:-1:-1;;;;;20362:27:0;;20358:393;;20626:26;;20600:9;;-1:-1:-1;;;;;20626:17:0;;;:26;;;;;20644:7;;20556:24;20626:26;20556:24;20626:26;20644:7;20626:17;:26;;;;;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;20626:26:0;20358:393;;;;20685:54;-1:-1:-1;;;;;20685:34:0;;20720:9;20731:7;20685:54;:34;:54;:::i;5611:153::-;5720:35;;;;;;-1:-1:-1;;;;;5720:35:0;;;;;;;;;;;;;;;;;;;;;;:18;;;;;;:35;;;;;;;;;;;;;;;-1:-1:-1;5720:18:0;:35;;;5:2:-1;;;;30:1;27;20:12;5:2;5720:35:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;5720:35:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;5720:35:0;5712:44;;;;;;5611:153;;;;:::o;7294:189::-;-1:-1:-1;;;;;7374:21:0;;7366:30;;;;;;7415:18;7419:4;7425:7;7415:3;:18::i;:::-;7407:27;;;;;;-1:-1:-1;;;;;7447:20:0;7470:5;7447:20;;;;;;;;;;;:28;;-1:-1:-1;;7447:28:0;;;7294:189::o;3748:150::-;3806:7;3838:5;;;3862:6;;;;3854:15;;;;;;3889:1;3748:150;-1:-1:-1;;;3748:150:0:o;3512:::-;3570:7;3603:1;3598;:6;;3590:15;;;;;;-1:-1:-1;3628:5:0;;;3512:150::o;7029:186::-;-1:-1:-1;;;;;7106:21:0;;7098:30;;;;;;7148:18;7152:4;7158:7;7148:3;:18::i;:::-;7147:19;7139:28;;;;;;-1:-1:-1;;;;;7180:20:0;:11;:20;;;;;;;;;;;:27;;-1:-1:-1;;7180:27:0;7203:4;7180:27;;;7029:186::o;5478:125::-;5569:5;-1:-1:-1;;;;;5569:14:0;;5584:2;5588:5;5569:25;;;;;;;;;;;;;-1:-1:-1;;;;;5569:25:0;-1:-1:-1;;;;;5569:25:0;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;5569:25:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;5569:25:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;5569:25:0;5561:34;;;;;10508:12936;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;10508:12936:0;-1:-1:-1;;;;;10508:12936:0;;;;;;;;;;;-1:-1:-1;10508:12936:0;;;;;;;-1:-1:-1;10508:12936:0;;;-1:-1:-1;10508:12936:0;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;-1:-1:-1;;10508:12936:0;;;;;;

Swarm Source

bzzr://a267d9485b9aea3cd16e5d5b2dc6fc9eaf93731dd38628af3c5eebbf47de01e0

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.