ETH Price: $3,450.39 (-1.06%)
Gas: 3 Gwei

Contract

0x6DEc671d53F33a4a7314Ea596A8E892F18ecEc91
 

Overview

ETH Balance

0.46505 ETH

Eth Value

$1,604.60 (@ $3,450.39/ETH)

Multichain Info

No addresses found
Transaction Hash
Method
Block
From
To
Make Payment175269302023-06-21 8:44:35398 days ago1687337075IN
0x6DEc671d...F18ecEc91
0.165 ETH0.0003431812.4735616
Execute172412382023-05-12 2:39:23439 days ago1683859163IN
0x6DEc671d...F18ecEc91
0 ETH0.0051799574.50390522
Approve172411852023-05-12 2:28:35439 days ago1683858515IN
0x6DEc671d...F18ecEc91
0 ETH0.003746860.93164166
Approve172411852023-05-12 2:28:35439 days ago1683858515IN
0x6DEc671d...F18ecEc91
0 ETH0.003746860.93164166
Request Withdraw...172354582023-05-11 6:53:47439 days ago1683788027IN
0x6DEc671d...F18ecEc91
0 ETH0.0089721874.34569956
Make Payment170935662023-04-21 8:24:47459 days ago1682065487IN
0x6DEc671d...F18ecEc91
0.165 ETH0.0010798339.24817271
Execute170806362023-04-19 12:26:23461 days ago1681907183IN
0x6DEc671d...F18ecEc91
0 ETH0.0050501172.63638968
Approve170789622023-04-19 6:44:23461 days ago1681886663IN
0x6DEc671d...F18ecEc91
0 ETH0.0031116750.60289452
Approve170789282023-04-19 6:37:35461 days ago1681886255IN
0x6DEc671d...F18ecEc91
0 ETH0.0017194250.93235524
Approve170789272023-04-19 6:37:23461 days ago1681886243IN
0x6DEc671d...F18ecEc91
0 ETH0.0031700551.55231109
Request Withdraw...170738482023-04-18 13:26:11462 days ago1681824371IN
0x6DEc671d...F18ecEc91
0 ETH0.0058262348.27757093
Make Payment170735712023-04-18 12:29:35462 days ago1681820975IN
0x6DEc671d...F18ecEc91
0.1 ETH0.0012254644.54143033
Make Payment167831742023-03-08 11:14:23503 days ago1678274063IN
0x6DEc671d...F18ecEc91
0.1 ETH0.0005306419.29535631
Make Payment162604132022-12-25 7:56:59576 days ago1671955019IN
0x6DEc671d...F18ecEc91
0.1 ETH0.0003205811.6520082
Make Payment161452292022-12-09 6:00:59592 days ago1670565659IN
0x6DEc671d...F18ecEc91
0.1 ETH0.0004138515.04200112
Make Payment160267312022-11-22 16:26:47609 days ago1669134407IN
0x6DEc671d...F18ecEc91
0.1 ETH0.0004455316.19350688
Make Payment157825902022-10-19 13:56:23643 days ago1666187783IN
0x6DEc671d...F18ecEc91
0.1 ETH0.0006270122.78977905
Make Payment156887062022-10-06 11:16:47656 days ago1665055007IN
0x6DEc671d...F18ecEc91
0.1 ETH0.000151675.51269566
Make Payment156875772022-10-06 7:28:47656 days ago1665041327IN
0x6DEc671d...F18ecEc91
0.1 ETH0.000151165.49413853
Make Payment155377382022-09-15 7:52:35677 days ago1663228355IN
0x6DEc671d...F18ecEc91
0.165 ETH0.0005282419.1998326
Make Payment155023062022-09-09 10:39:24683 days ago1662719964IN
0x6DEc671d...F18ecEc91
0.1 ETH0.0003748313.62971668
Make Payment152511232022-07-31 15:44:14723 days ago1659282254IN
0x6DEc671d...F18ecEc91
0.1 ETH0.0003682513.39060854
Make Payment151394702022-07-14 7:55:13740 days ago1657785313IN
0x6DEc671d...F18ecEc91
0.165 ETH0.0006048221.98338285
Make Payment150900022022-07-06 16:25:56748 days ago1657124756IN
0x6DEc671d...F18ecEc91
0.1 ETH0.0011664242.41387704
Execute150749002022-07-04 8:25:33750 days ago1656923133IN
0x6DEc671d...F18ecEc91
0 ETH0.0019184927.59386005
View all transactions

Latest 25 internal transactions (View All)

Advanced mode:
Parent Transaction Hash Block From To
175974362023-07-01 6:29:59388 days ago1688192999
0x6DEc671d...F18ecEc91
0.0005 ETH
175037682023-06-18 2:42:47402 days ago1687056167
0x6DEc671d...F18ecEc91
0.0005 ETH
175035602023-06-18 2:00:47402 days ago1687053647
0x6DEc671d...F18ecEc91
0.0005 ETH
172412382023-05-12 2:39:23439 days ago1683859163
0x6DEc671d...F18ecEc91
0.5 ETH
170872972023-04-20 11:05:23460 days ago1681988723
0x6DEc671d...F18ecEc91
0.0015 ETH
170806362023-04-19 12:26:23461 days ago1681907183
0x6DEc671d...F18ecEc91
5 ETH
167624022023-03-05 13:09:47506 days ago1678021787
0x6DEc671d...F18ecEc91
0.0015 ETH
167596132023-03-05 3:44:47506 days ago1677987887
0x6DEc671d...F18ecEc91
0.002 ETH
167552702023-03-04 13:07:35507 days ago1677935255
0x6DEc671d...F18ecEc91
0.0005 ETH
167544952023-03-04 10:30:23507 days ago1677925823
0x6DEc671d...F18ecEc91
0.0005 ETH
165989642023-02-10 14:30:11529 days ago1676039411
0x6DEc671d...F18ecEc91
0.0025 ETH
165989622023-02-10 14:29:47529 days ago1676039387
0x6DEc671d...F18ecEc91
0.0025 ETH
165974222023-02-10 9:20:11529 days ago1676020811
0x6DEc671d...F18ecEc91
0.001 ETH
165969852023-02-10 7:52:47529 days ago1676015567
0x6DEc671d...F18ecEc91
0.0045 ETH
165967102023-02-10 6:57:23529 days ago1676012243
0x6DEc671d...F18ecEc91
0.0005 ETH
165778182023-02-07 15:32:47532 days ago1675783967
0x6DEc671d...F18ecEc91
0.0005 ETH
165777422023-02-07 15:17:35532 days ago1675783055
0x6DEc671d...F18ecEc91
0.001 ETH
165396402023-02-02 7:30:35537 days ago1675323035
0x6DEc671d...F18ecEc91
0.0025 ETH
165266052023-01-31 11:47:59539 days ago1675165679
0x6DEc671d...F18ecEc91
0.002 ETH
165177802023-01-30 6:14:35540 days ago1675059275
0x6DEc671d...F18ecEc91
0.0015 ETH
165123972023-01-29 12:12:11541 days ago1674994331
0x6DEc671d...F18ecEc91
0.005 ETH
165032842023-01-28 5:41:11542 days ago1674884471
0x6DEc671d...F18ecEc91
0.0005 ETH
165032822023-01-28 5:40:47542 days ago1674884447
0x6DEc671d...F18ecEc91
0.0005 ETH
164979362023-01-27 11:44:59543 days ago1674819899
0x6DEc671d...F18ecEc91
0.002 ETH
164901402023-01-26 9:37:47544 days ago1674725867
0x6DEc671d...F18ecEc91
0.0005 ETH
View All Internal Transactions
Loading...
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
OmnuumWallet

Compiler Version
v0.8.10+commit.fc410830

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion
File 1 of 2 : OmnuumWallet.sol
// SPDX-License-Identifier: GPL-3.0
pragma solidity 0.8.10;

/// @title OmnuumWallet Allows multiple owners to agree to withdraw money, add/remove/change owners before execution
/// @notice This contract is not managed by Omnuum admin, but for owners
/// @author Omnuum Dev Team <[email protected]>

import '@openzeppelin/contracts/utils/math/Math.sol';

contract OmnuumWallet {
    /// @notice consensusRatio Ratio of votes to reach consensus as a percentage of total votes
    uint256 public immutable consensusRatio;

    /// @notice Minimum limit of required number of votes for consensus
    uint8 public immutable minLimitForConsensus;

    /// @notice Withdraw = 0
    /// @notice Add = 1
    /// @notice Remove = 2
    /// @notice Change = 3
    /// @notice Cancel = 4
    enum RequestTypes {
        Withdraw,
        Add,
        Remove,
        Change,
        Cancel
    }

    /// @notice F = 0 (F-Level Not owner)
    /// @notice D = 1 (D-Level own 1 vote)
    /// @notice C = 2 (C-Level own 2 votes)
    enum OwnerVotes {
        F,
        D,
        C
    }
    struct OwnerAccount {
        address addr;
        OwnerVotes vote;
    }
    struct Request {
        address requester;
        RequestTypes requestType;
        OwnerAccount currentOwner;
        OwnerAccount newOwner;
        uint256 withdrawalAmount;
        mapping(address => bool) voters;
        uint256 votes;
        bool isExecute;
    }

    Request[] public requests;
    mapping(OwnerVotes => uint8) public ownerCounter;
    mapping(address => OwnerVotes) public ownerVote;

    constructor(
        uint256 _consensusRatio,
        uint8 _minLimitForConsensus,
        OwnerAccount[] memory _initialOwnerAccounts
    ) {
        consensusRatio = _consensusRatio;
        minLimitForConsensus = _minLimitForConsensus;
        for (uint256 i; i < _initialOwnerAccounts.length; i++) {
            OwnerVotes vote = _initialOwnerAccounts[i].vote;
            ownerVote[_initialOwnerAccounts[i].addr] = vote;
            ownerCounter[vote]++;
        }

        _checkMinConsensus();
    }

    event PaymentReceived(address indexed sender, address indexed target, string topic, string description, uint256 value);
    event MintFeeReceived(address indexed nftContract, uint256 value);
    event EtherReceived(address indexed sender, uint256 value);
    event Requested(address indexed owner, uint256 indexed requestId, RequestTypes indexed requestType);
    event Approved(address indexed owner, uint256 indexed requestId, OwnerVotes votes);
    event Revoked(address indexed owner, uint256 indexed requestId, OwnerVotes votes);
    event Canceled(address indexed owner, uint256 indexed requestId);
    event Executed(address indexed owner, uint256 indexed requestId, RequestTypes indexed requestType);

    modifier onlyOwner(address _address) {
        /// @custom:error (004) - Only the owner of the wallet is allowed
        require(isOwner(_address), 'OO4');
        _;
    }

    modifier notOwner(address _address) {
        /// @custom:error (005) - Already the owner of the wallet
        require(!isOwner(_address), 'OO5');
        _;
    }

    modifier isOwnerAccount(OwnerAccount memory _ownerAccount) {
        /// @custom:error (NX2) - Non-existent wallet account
        address _addr = _ownerAccount.addr;
        require(isOwner(_addr) && uint8(ownerVote[_addr]) == uint8(_ownerAccount.vote), 'NX2');
        _;
    }

    modifier onlyRequester(uint256 _reqId) {
        /// @custom:error (OO6) - Only the requester is allowed
        require(requests[_reqId].requester == msg.sender, 'OO6');
        _;
    }

    modifier reachConsensus(uint256 _reqId) {
        /// @custom:error (NE2) - Not reach consensus
        require(requests[_reqId].votes >= requiredVotesForConsensus(), 'NE2');
        _;
    }

    modifier reqExists(uint256 _reqId) {
        /// @custom:error (NX3) - Non-existent owner request
        require(_reqId < requests.length, 'NX3');
        _;
    }

    modifier notExecutedOrCanceled(uint256 _reqId) {
        /// @custom:error (SE1) - Already executed
        require(!requests[_reqId].isExecute, 'SE1');

        /// @custom:error (SE2) - Request canceled
        require(requests[_reqId].requestType != RequestTypes.Cancel, 'SE2');
        _;
    }

    modifier notVoted(address _owner, uint256 _reqId) {
        /// @custom:error (SE3) - Already voted
        require(!isOwnerVoted(_owner, _reqId), 'SE3');
        _;
    }

    modifier voted(address _owner, uint256 _reqId) {
        /// @custom:error (SE4) - Not voted
        require(isOwnerVoted(_owner, _reqId), 'SE4');
        _;
    }

    modifier isValidAddress(address _address) {
        /// @custom:error (AE1) - Zero address not acceptable
        require(_address != address(0), 'AE1');
        uint256 codeSize;
        assembly {
            codeSize := extcodesize(_address)
        }

        /// @notice It's not perfect filtering against CA, but the owners can handle it cautiously.
        /// @custom:error (AE2) - Contract address not acceptable
        require(codeSize == 0, 'AE2');
        _;
    }

    function mintFeePayment(address _nftContract) external payable {
        /// @custom:error (NE3) - A zero payment is not acceptable
        require(msg.value > 0, 'NE3');
        emit MintFeeReceived(_nftContract, msg.value);
    }

    function makePayment(
        address _target,
        string calldata _topic,
        string calldata _description
    ) external payable {
        /// @custom:error (NE3) - A zero payment is not acceptable
        require(msg.value > 0, 'NE3');
        emit PaymentReceived(msg.sender, _target, _topic, _description, msg.value);
    }

    receive() external payable {
        emit EtherReceived(msg.sender, msg.value);
    }

    /// @notice requestOwnerManage
    /// @dev Allows an owner to request for an agenda that wants to proceed
    /// @dev The owner can make multiple requests even if the previous one is unresolved
    /// @dev The requester is automatically voted for the request
    /// @param _requestType Withdraw(0) / Add(1) / Remove(2) / Change(3) / Cancel(4)
    /// @param _currentAccount Tuple[address, OwnerVotes] for current exist owner account (use for Request Type as Remove or Change)
    /// @param _newAccount Tuple[address, OwnerVotes] for new owner account (use for Request Type as Add or Change)

    function requestOwnerManagement(
        RequestTypes _requestType,
        OwnerAccount calldata _currentAccount,
        OwnerAccount calldata _newAccount
    ) external onlyOwner(msg.sender) {
        address requester = msg.sender;

        Request storage request_ = requests.push();
        request_.requester = requester;
        request_.requestType = _requestType;
        request_.currentOwner = OwnerAccount({ addr: _currentAccount.addr, vote: _currentAccount.vote });
        request_.newOwner = OwnerAccount({ addr: _newAccount.addr, vote: _newAccount.vote });
        request_.voters[requester] = true;
        request_.votes = uint8(ownerVote[requester]);

        emit Requested(msg.sender, requests.length - 1, _requestType);
    }

    /// @notice requestWithdrawal
    /// @dev Allows an owner to request withdrawal
    /// @dev The owner can make multiple requests even if the previous one is unresolved
    /// @dev The requester is automatically voted for the request
    /// @param _withdrawalAmount Amount of Ether to be withdrawal (use for Request Type as Withdrawal)
    function requestWithdrawal(uint256 _withdrawalAmount) external onlyOwner(msg.sender) {
        address requester = msg.sender;

        Request storage request_ = requests.push();
        request_.withdrawalAmount = _withdrawalAmount;
        request_.requester = requester;
        request_.requestType = RequestTypes.Withdraw;
        request_.voters[requester] = true;
        request_.votes = uint8(ownerVote[requester]);

        emit Requested(msg.sender, requests.length - 1, RequestTypes.Withdraw);
    }

    /// @notice approve
    /// @dev Allows owners to approve the request
    /// @dev The owner can revoke the approval whenever the request is still in progress (not executed or canceled)
    /// @param _reqId Request id that the owner wants to approve

    function approve(uint256 _reqId)
        external
        onlyOwner(msg.sender)
        reqExists(_reqId)
        notExecutedOrCanceled(_reqId)
        notVoted(msg.sender, _reqId)
    {
        OwnerVotes _vote = ownerVote[msg.sender];
        Request storage request_ = requests[_reqId];
        request_.voters[msg.sender] = true;
        request_.votes += uint8(_vote);

        emit Approved(msg.sender, _reqId, _vote);
    }

    /// @notice revoke
    /// @dev Allow an approver(owner) to revoke the approval
    /// @param _reqId Request id that the owner wants to revoke

    function revoke(uint256 _reqId)
        external
        onlyOwner(msg.sender)
        reqExists(_reqId)
        notExecutedOrCanceled(_reqId)
        voted(msg.sender, _reqId)
    {
        OwnerVotes vote = ownerVote[msg.sender];
        Request storage request_ = requests[_reqId];
        delete request_.voters[msg.sender];
        request_.votes -= uint8(vote);

        emit Revoked(msg.sender, _reqId, vote);
    }

    /// @notice cancel
    /// @dev Allows a requester(owner) to cancel the own request
    /// @dev After proceeding, it cannot revert the cancellation. Be cautious
    /// @param _reqId Request id requested by the requester

    function cancel(uint256 _reqId) external reqExists(_reqId) notExecutedOrCanceled(_reqId) onlyRequester(_reqId) {
        requests[_reqId].requestType = RequestTypes.Cancel;

        emit Canceled(msg.sender, _reqId);
    }

    /// @notice execute
    /// @dev Allow an requester(owner) to execute the request
    /// @dev After proceeding, it cannot revert the execution. Be cautious
    /// @param _reqId Request id that the requester wants to execute

    function execute(uint256 _reqId) external reqExists(_reqId) notExecutedOrCanceled(_reqId) onlyRequester(_reqId) reachConsensus(_reqId) {
        Request storage request_ = requests[_reqId];
        uint8 type_ = uint8(request_.requestType);
        request_.isExecute = true;

        if (type_ == uint8(RequestTypes.Withdraw)) {
            _withdraw(request_.withdrawalAmount, request_.requester);
        } else if (type_ == uint8(RequestTypes.Add)) {
            _addOwner(request_.newOwner);
        } else if (type_ == uint8(RequestTypes.Remove)) {
            _removeOwner(request_.currentOwner);
        } else if (type_ == uint8(RequestTypes.Change)) {
            _changeOwner(request_.currentOwner, request_.newOwner);
        }
        emit Executed(msg.sender, _reqId, request_.requestType);
    }

    /// @notice totalVotes
    /// @dev Allows users to see how many total votes the wallet currently have
    /// @return votes The total number of voting rights the owners have

    function totalVotes() public view returns (uint256 votes) {
        return ownerCounter[OwnerVotes.D] + 2 * ownerCounter[OwnerVotes.C];
    }

    /// @notice isOwner
    /// @dev Allows users to verify registered owners in the wallet
    /// @param _owner Address of the owner that you want to verify
    /// @return isVerified Verification result of whether the owner is correct

    function isOwner(address _owner) public view returns (bool isVerified) {
        return uint8(ownerVote[_owner]) > 0;
    }

    /// @notice isOwnerVoted
    /// @dev Allows users to check which owner voted
    /// @param _owner Address of the owner
    /// @param _reqId Request id that you want to check
    /// @return isVoted Whether the owner voted

    function isOwnerVoted(address _owner, uint256 _reqId) public view returns (bool isVoted) {
        return requests[_reqId].voters[_owner];
    }

    /// @notice requiredVotesForConsensus
    /// @dev Allows users to see how many votes are needed to reach consensus.
    /// @return votesForConsensus The number of votes required to reach a consensus

    function requiredVotesForConsensus() public view returns (uint256 votesForConsensus) {
        return Math.ceilDiv((totalVotes() * consensusRatio), 100);
    }

    /// @notice getRequestIdsByExecution
    /// @dev Allows users to see the array of request ids filtered by execution
    /// @param _isExecuted Whether the request was executed or not
    /// @param _cursorIndex A pointer to a specific request ID that starts in the data list
    /// @param _length The amount of request ids you want to query from the _cursorIndex (not always mean the amount of data you can retrieve)
    /// @return requestIds Array of request ids (if the boundary of search pointer exceeds the length of requests list, it always checks the last request id only, then returns the result)

    function getRequestIdsByExecution(
        bool _isExecuted,
        uint256 _cursorIndex,
        uint256 _length
    ) public view returns (uint256[] memory requestIds) {
        uint256[] memory filteredArray = new uint256[](requests.length);
        uint256 counter = 0;
        uint256 lastReqIdx = getLastRequestNo();
        for (uint256 i = Math.min(_cursorIndex, lastReqIdx); i < Math.min(_cursorIndex + _length, lastReqIdx + 1); i++) {
            if (_isExecuted) {
                if (requests[i].isExecute) {
                    filteredArray[counter] = i;
                    counter++;
                }
            } else {
                if (!requests[i].isExecute) {
                    filteredArray[counter] = i;
                    counter++;
                }
            }
        }
        return _compactUintArray(filteredArray, counter);
    }

    /// @notice getRequestIdsByOwner
    /// @dev Allows users to see the array of request ids filtered by owner address
    /// @param _owner The address of owner
    /// @param _isExecuted If you want to see only for that have not been executed, input this argument into true
    /// @param _cursorIndex A pointer to a specific request ID that starts in the data list
    /// @param _length The amount of request ids you want to query from the _cursorIndex (not always mean the amount of data you can retrieve)
    /// @return requestIds Array of request ids (if the boundary of search pointer exceeds the length of requests list, it always checks the last request id only, then returns the result)

    function getRequestIdsByOwner(
        address _owner,
        bool _isExecuted,
        uint256 _cursorIndex,
        uint256 _length
    ) public view returns (uint256[] memory requestIds) {
        uint256[] memory filteredArray = new uint256[](requests.length);
        uint256 counter = 0;
        uint256 lastReqIdx = getLastRequestNo();
        for (uint256 i = Math.min(_cursorIndex, lastReqIdx); i < Math.min(_cursorIndex + _length, lastReqIdx + 1); i++) {
            if (_isExecuted) {
                if ((requests[i].requester == _owner) && (requests[i].isExecute)) {
                    filteredArray[counter] = i;
                    counter++;
                }
            } else {
                if ((requests[i].requester == _owner) && (!requests[i].isExecute)) {
                    filteredArray[counter] = i;
                    counter++;
                }
            }
        }
        return _compactUintArray(filteredArray, counter);
    }

    /// @notice getRequestIdsByType
    /// @dev Allows users to see the array of request ids filtered by request type
    /// @param _requestType Withdraw(0) / Add(1) / Remove(2) / Change(3) / Cancel(4)
    /// @param _cursorIndex A pointer to a specific request ID that starts in the data list
    /// @param _length The amount of request ids you want to query from the _cursorIndex (not always mean the amount of data you can retrieve)
    /// @return requestIds Array of request ids (if the boundary of search pointer exceeds the length of requests list, it always checks the last request id only, then returns the result)

    function getRequestIdsByType(
        RequestTypes _requestType,
        bool _isExecuted,
        uint256 _cursorIndex,
        uint256 _length
    ) public view returns (uint256[] memory requestIds) {
        uint256[] memory filteredArray = new uint256[](requests.length);
        uint256 counter = 0;
        uint256 lastReqIdx = getLastRequestNo();
        for (uint256 i = Math.min(_cursorIndex, lastReqIdx); i < Math.min(_cursorIndex + _length, lastReqIdx + 1); i++) {
            if (_isExecuted) {
                if ((requests[i].requestType == _requestType) && (requests[i].isExecute)) {
                    filteredArray[counter] = i;
                    counter++;
                }
            } else {
                if ((requests[i].requestType == _requestType) && (!requests[i].isExecute)) {
                    filteredArray[counter] = i;
                    counter++;
                }
            }
        }
        return _compactUintArray(filteredArray, counter);
    }

    /// @notice getLastRequestNo
    /// @dev Allows users to get the last request number
    /// @return requestNo The last request number

    function getLastRequestNo() public view returns (uint256 requestNo) {
        return requests.length - 1;
    }

    /// @notice _withdraw
    /// @dev Withdraw Ethers from the wallet
    /// @param _value Withdraw amount
    /// @param _to Withdrawal recipient

    function _withdraw(uint256 _value, address _to) private {
        /// @custom:error (NE4) - Insufficient balance
        require(_value <= address(this).balance, 'NE4');
        (bool withdrawn, ) = payable(_to).call{ value: _value }('');

        /// @custom:error (SE5) - Address: unable to send value, recipient may have reverted
        require(withdrawn, 'SE5');
    }

    /// @notice _addOwner
    /// @dev Add a new Owner to the wallet
    /// @param _newAccount New owner account to be added

    function _addOwner(OwnerAccount memory _newAccount) private notOwner(_newAccount.addr) isValidAddress(_newAccount.addr) {
        OwnerVotes vote = _newAccount.vote;
        ownerVote[_newAccount.addr] = vote;
        ownerCounter[vote]++;
    }

    /// @notice _removeOwner
    /// @dev Remove existing owner form the wallet
    /// @param _removalAccount Current owner account to be removed

    function _removeOwner(OwnerAccount memory _removalAccount) private isOwnerAccount(_removalAccount) {
        ownerCounter[_removalAccount.vote]--;
        _checkMinConsensus();
        delete ownerVote[_removalAccount.addr];
    }

    /// @notice _changeOwner
    /// @dev Allows changing the existing owner to the new one. It also includes the functionality to change the existing owner's level
    /// @param _currentAccount Current owner account to be changed
    /// @param _newAccount New owner account to be applied

    function _changeOwner(OwnerAccount memory _currentAccount, OwnerAccount memory _newAccount) private {
        OwnerVotes _currentVote = _currentAccount.vote;
        OwnerVotes _newVote = _newAccount.vote;
        ownerCounter[_currentVote]--;
        ownerCounter[_newVote]++;
        _checkMinConsensus();

        if (_currentAccount.addr != _newAccount.addr) {
            delete ownerVote[_currentAccount.addr];
        }
        ownerVote[_newAccount.addr] = _newVote;
    }

    /// @notice _checkMinConsensus
    /// @dev It is the verification function to prevent a dangerous situation in which the number of votes that an owner has
    /// @dev is equal to or greater than the number of votes required for reaching consensus so that the owner achieves consensus by himself or herself.

    function _checkMinConsensus() private view {
        /// @custom:error (NE5) - Violate min limit for consensus
        require(requiredVotesForConsensus() >= minLimitForConsensus, 'NE5');
    }

    function _compactUintArray(uint256[] memory targetArray, uint256 length) internal pure returns (uint256[] memory array) {
        uint256[] memory compactArray = new uint256[](length);
        for (uint256 i = 0; i < length; i++) {
            compactArray[i] = targetArray[i];
        }
        return compactArray;
    }
}

File 2 of 2 : Math.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.5.0) (utils/math/Math.sol)

pragma solidity ^0.8.0;

/**
 * @dev Standard math utilities missing in the Solidity language.
 */
library Math {
    /**
     * @dev Returns the largest of two numbers.
     */
    function max(uint256 a, uint256 b) internal pure returns (uint256) {
        return a >= b ? a : b;
    }

    /**
     * @dev Returns the smallest of two numbers.
     */
    function min(uint256 a, uint256 b) internal pure returns (uint256) {
        return a < b ? a : b;
    }

    /**
     * @dev Returns the average of two numbers. The result is rounded towards
     * zero.
     */
    function average(uint256 a, uint256 b) internal pure returns (uint256) {
        // (a + b) / 2 can overflow.
        return (a & b) + (a ^ b) / 2;
    }

    /**
     * @dev Returns the ceiling of the division of two numbers.
     *
     * This differs from standard division with `/` in that it rounds up instead
     * of rounding down.
     */
    function ceilDiv(uint256 a, uint256 b) internal pure returns (uint256) {
        // (a + b - 1) / b can overflow on addition, so we distribute.
        return a / b + (a % b == 0 ? 0 : 1);
    }
}

Settings
{
  "optimizer": {
    "enabled": false,
    "runs": 200
  },
  "outputSelection": {
    "*": {
      "*": [
        "evm.bytecode",
        "evm.deployedBytecode",
        "devdoc",
        "userdoc",
        "metadata",
        "abi"
      ]
    }
  },
  "libraries": {}
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"uint256","name":"_consensusRatio","type":"uint256"},{"internalType":"uint8","name":"_minLimitForConsensus","type":"uint8"},{"components":[{"internalType":"address","name":"addr","type":"address"},{"internalType":"enum OmnuumWallet.OwnerVotes","name":"vote","type":"uint8"}],"internalType":"struct OmnuumWallet.OwnerAccount[]","name":"_initialOwnerAccounts","type":"tuple[]"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"uint256","name":"requestId","type":"uint256"},{"indexed":false,"internalType":"enum OmnuumWallet.OwnerVotes","name":"votes","type":"uint8"}],"name":"Approved","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"uint256","name":"requestId","type":"uint256"}],"name":"Canceled","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"sender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"EtherReceived","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"uint256","name":"requestId","type":"uint256"},{"indexed":true,"internalType":"enum OmnuumWallet.RequestTypes","name":"requestType","type":"uint8"}],"name":"Executed","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"nftContract","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"MintFeeReceived","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"sender","type":"address"},{"indexed":true,"internalType":"address","name":"target","type":"address"},{"indexed":false,"internalType":"string","name":"topic","type":"string"},{"indexed":false,"internalType":"string","name":"description","type":"string"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"PaymentReceived","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"uint256","name":"requestId","type":"uint256"},{"indexed":true,"internalType":"enum OmnuumWallet.RequestTypes","name":"requestType","type":"uint8"}],"name":"Requested","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"uint256","name":"requestId","type":"uint256"},{"indexed":false,"internalType":"enum OmnuumWallet.OwnerVotes","name":"votes","type":"uint8"}],"name":"Revoked","type":"event"},{"inputs":[{"internalType":"uint256","name":"_reqId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_reqId","type":"uint256"}],"name":"cancel","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"consensusRatio","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_reqId","type":"uint256"}],"name":"execute","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"getLastRequestNo","outputs":[{"internalType":"uint256","name":"requestNo","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bool","name":"_isExecuted","type":"bool"},{"internalType":"uint256","name":"_cursorIndex","type":"uint256"},{"internalType":"uint256","name":"_length","type":"uint256"}],"name":"getRequestIdsByExecution","outputs":[{"internalType":"uint256[]","name":"requestIds","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"},{"internalType":"bool","name":"_isExecuted","type":"bool"},{"internalType":"uint256","name":"_cursorIndex","type":"uint256"},{"internalType":"uint256","name":"_length","type":"uint256"}],"name":"getRequestIdsByOwner","outputs":[{"internalType":"uint256[]","name":"requestIds","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"enum OmnuumWallet.RequestTypes","name":"_requestType","type":"uint8"},{"internalType":"bool","name":"_isExecuted","type":"bool"},{"internalType":"uint256","name":"_cursorIndex","type":"uint256"},{"internalType":"uint256","name":"_length","type":"uint256"}],"name":"getRequestIdsByType","outputs":[{"internalType":"uint256[]","name":"requestIds","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"}],"name":"isOwner","outputs":[{"internalType":"bool","name":"isVerified","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"},{"internalType":"uint256","name":"_reqId","type":"uint256"}],"name":"isOwnerVoted","outputs":[{"internalType":"bool","name":"isVoted","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_target","type":"address"},{"internalType":"string","name":"_topic","type":"string"},{"internalType":"string","name":"_description","type":"string"}],"name":"makePayment","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"minLimitForConsensus","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_nftContract","type":"address"}],"name":"mintFeePayment","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"enum OmnuumWallet.OwnerVotes","name":"","type":"uint8"}],"name":"ownerCounter","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"ownerVote","outputs":[{"internalType":"enum OmnuumWallet.OwnerVotes","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"enum OmnuumWallet.RequestTypes","name":"_requestType","type":"uint8"},{"components":[{"internalType":"address","name":"addr","type":"address"},{"internalType":"enum OmnuumWallet.OwnerVotes","name":"vote","type":"uint8"}],"internalType":"struct OmnuumWallet.OwnerAccount","name":"_currentAccount","type":"tuple"},{"components":[{"internalType":"address","name":"addr","type":"address"},{"internalType":"enum OmnuumWallet.OwnerVotes","name":"vote","type":"uint8"}],"internalType":"struct OmnuumWallet.OwnerAccount","name":"_newAccount","type":"tuple"}],"name":"requestOwnerManagement","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_withdrawalAmount","type":"uint256"}],"name":"requestWithdrawal","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"requests","outputs":[{"internalType":"address","name":"requester","type":"address"},{"internalType":"enum OmnuumWallet.RequestTypes","name":"requestType","type":"uint8"},{"components":[{"internalType":"address","name":"addr","type":"address"},{"internalType":"enum OmnuumWallet.OwnerVotes","name":"vote","type":"uint8"}],"internalType":"struct OmnuumWallet.OwnerAccount","name":"currentOwner","type":"tuple"},{"components":[{"internalType":"address","name":"addr","type":"address"},{"internalType":"enum OmnuumWallet.OwnerVotes","name":"vote","type":"uint8"}],"internalType":"struct OmnuumWallet.OwnerAccount","name":"newOwner","type":"tuple"},{"internalType":"uint256","name":"withdrawalAmount","type":"uint256"},{"internalType":"uint256","name":"votes","type":"uint256"},{"internalType":"bool","name":"isExecute","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"requiredVotesForConsensus","outputs":[{"internalType":"uint256","name":"votesForConsensus","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_reqId","type":"uint256"}],"name":"revoke","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"totalVotes","outputs":[{"internalType":"uint256","name":"votes","type":"uint256"}],"stateMutability":"view","type":"function"},{"stateMutability":"payable","type":"receive"}]

60c06040523480156200001157600080fd5b5060405162004c1b38038062004c1b833981810160405281019062000037919062000639565b82608081815250508160ff1660a08160ff168152505060005b815181101562000197576000828281518110620000725762000071620006b4565b5b602002602001015160200151905080600260008585815181106200009b576200009a620006b4565b5b60200260200101516000015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690836002811115620001065762000105620006e3565b5b021790555060016000826002811115620001255762000124620006e3565b5b60028111156200013a5762000139620006e3565b5b8152602001908152602001600020600081819054906101000a900460ff1680929190620001679062000741565b91906101000a81548160ff021916908360ff160217905550505080806200018e9062000770565b91505062000050565b50620001a8620001b160201b60201c565b50505062000a1e565b60a05160ff16620001c76200020d60201b60201c565b10156200020b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040162000202906200081f565b60405180910390fd5b565b600062000245608051620002266200024a60201b60201c565b62000232919062000841565b60646200030560201b6200274d1760201c565b905090565b600060016000600280811115620002665762000265620006e3565b5b60028111156200027b576200027a620006e3565b5b815260200190815260200160002060009054906101000a900460ff166002620002a59190620008a2565b6001600060016002811115620002c057620002bf620006e3565b5b6002811115620002d557620002d4620006e3565b5b815260200190815260200160002060009054906101000a900460ff16620002fd9190620008e4565b60ff16905090565b600080828462000316919062000951565b146200032457600162000327565b60005b60ff16828462000338919062000989565b620003449190620009c1565b905092915050565b6000604051905090565b600080fd5b600080fd5b6000819050919050565b620003758162000360565b81146200038157600080fd5b50565b60008151905062000395816200036a565b92915050565b600060ff82169050919050565b620003b3816200039b565b8114620003bf57600080fd5b50565b600081519050620003d381620003a8565b92915050565b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6200042982620003de565b810181811067ffffffffffffffff821117156200044b576200044a620003ef565b5b80604052505050565b6000620004606200034c565b90506200046e82826200041e565b919050565b600067ffffffffffffffff821115620004915762000490620003ef565b5b602082029050602081019050919050565b600080fd5b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000620004d982620004ac565b9050919050565b620004eb81620004cc565b8114620004f757600080fd5b50565b6000815190506200050b81620004e0565b92915050565b600381106200051f57600080fd5b50565b600081519050620005338162000511565b92915050565b600060408284031215620005525762000551620004a7565b5b6200055e604062000454565b905060006200057084828501620004fa565b6000830152506020620005868482850162000522565b60208301525092915050565b6000620005a9620005a38462000473565b62000454565b90508083825260208201905060408402830185811115620005cf57620005ce620004a2565b5b835b81811015620005fc5780620005e7888262000539565b845260208401935050604081019050620005d1565b5050509392505050565b600082601f8301126200061e576200061d620003d9565b5b81516200063084826020860162000592565b91505092915050565b60008060006060848603121562000655576200065462000356565b5b6000620006658682870162000384565b93505060206200067886828701620003c2565b925050604084015167ffffffffffffffff8111156200069c576200069b6200035b565b5b620006aa8682870162000606565b9150509250925092565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006200074e826200039b565b915060ff82141562000765576200076462000712565b5b600182019050919050565b60006200077d8262000360565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415620007b357620007b262000712565b5b600182019050919050565b600082825260208201905092915050565b7f4e45350000000000000000000000000000000000000000000000000000000000600082015250565b600062000807600383620007be565b91506200081482620007cf565b602082019050919050565b600060208201905081810360008301526200083a81620007f8565b9050919050565b60006200084e8262000360565b91506200085b8362000360565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161562000897576200089662000712565b5b828202905092915050565b6000620008af826200039b565b9150620008bc836200039b565b92508160ff0483118215151615620008d957620008d862000712565b5b828202905092915050565b6000620008f1826200039b565b9150620008fe836200039b565b92508260ff0382111562000917576200091662000712565b5b828201905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b60006200095e8262000360565b91506200096b8362000360565b9250826200097e576200097d62000922565b5b828206905092915050565b6000620009968262000360565b9150620009a38362000360565b925082620009b657620009b562000922565b5b828204905092915050565b6000620009ce8262000360565b9150620009db8362000360565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111562000a135762000a1262000712565b5b828201905092915050565b60805160a0516141c962000a52600039600081816120760152612edd015260008181610e7c015261115c01526141c96000f3fe60806040526004361061012e5760003560e01c806397fc84c6116100ab578063cd700f6c1161006f578063cd700f6c14610466578063ddb9fde1146104a3578063e597c510146104e0578063f14cf2b11461050b578063f27a2e4d14610527578063fe0d94c11461055257610183565b806397fc84c61461035d5780639ee679e81461039a578063a48d938d146103c3578063b759f95414610400578063c5a66c1c1461042957610183565b80632f54bf6e116100f25780632f54bf6e1461025e57806333e6e13d1461029b57806340e58ee5146102c65780634c83f9e4146102ef57806381d12c581461031a57610183565b806307dac117146101885780630d15fd77146101b157806318e43345146101dc57806320c5429b146101f857806323d29b731461022157610183565b36610183573373ffffffffffffffffffffffffffffffffffffffff167f1e57e3bb474320be3d2c77138f75b7c3941292d647f5f9634e33a8e94e0e069b346040516101799190612f63565b60405180910390a2005b600080fd5b34801561019457600080fd5b506101af60048036038101906101aa9190612fd1565b61057b565b005b3480156101bd57600080fd5b506101c661094d565b6040516101d39190612f63565b60405180910390f35b6101f660048036038101906101f191906130e7565b6109f8565b005b34801561020457600080fd5b5061021f600480360381019061021a91906131a8565b610aaf565b005b34801561022d57600080fd5b50610248600480360381019061024391906131fa565b610de8565b6040516102559190613243565b60405180910390f35b34801561026a57600080fd5b506102856004803603810190610280919061325e565b610e08565b60405161029291906132a6565b60405180910390f35b3480156102a757600080fd5b506102b0610e75565b6040516102bd9190612f63565b60405180910390f35b3480156102d257600080fd5b506102ed60048036038101906102e891906131a8565b610eb9565b005b3480156102fb57600080fd5b5061030461115a565b6040516103119190612f63565b60405180910390f35b34801561032657600080fd5b50610341600480360381019061033c91906131a8565b61117e565b60405161035497969594939291906133cd565b60405180910390f35b34801561036957600080fd5b50610384600480360381019061037f919061343e565b611340565b60405161039191906132a6565b60405180910390f35b3480156103a657600080fd5b506103c160048036038101906103bc91906131a8565b6113b9565b005b3480156103cf57600080fd5b506103ea60048036038101906103e5919061325e565b6115d6565b6040516103f7919061348d565b60405180910390f35b34801561040c57600080fd5b50610427600480360381019061042291906131a8565b6115f6565b005b34801561043557600080fd5b50610450600480360381019061044b91906134d4565b611939565b60405161045d91906135f9565b60405180910390f35b34801561047257600080fd5b5061048d6004803603810190610488919061361b565b611b98565b60405161049a91906135f9565b60405180910390f35b3480156104af57600080fd5b506104ca60048036038101906104c59190613682565b611e2d565b6040516104d791906135f9565b60405180910390f35b3480156104ec57600080fd5b506104f5611fc7565b6040516105029190612f63565b60405180910390f35b6105256004803603810190610520919061325e565b611fe0565b005b34801561053357600080fd5b5061053c612074565b6040516105499190613243565b60405180910390f35b34801561055e57600080fd5b50610579600480360381019061057491906131a8565b612098565b005b3361058581610e08565b6105c4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016105bb90613732565b60405180910390fd5b60003390506000806001816001815401808255809150500390600052602060002090600702019050818160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550858160000160146101000a81548160ff02191690836004811115610656576106556132d0565b5b02179055506040518060400160405280866000016020810190610679919061325e565b73ffffffffffffffffffffffffffffffffffffffff1681526020018660200160208101906106a791906131fa565b60028111156106b9576106b86132d0565b5b8152508160010160008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160000160146101000a81548160ff02191690836002811115610732576107316132d0565b5b02179055509050506040518060400160405280856000016020810190610758919061325e565b73ffffffffffffffffffffffffffffffffffffffff16815260200185602001602081019061078691906131fa565b6002811115610798576107976132d0565b5b8152508160020160008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160000160146101000a81548160ff02191690836002811115610811576108106132d0565b5b021790555090505060018160040160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550600260008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1660028111156108d2576108d16132d0565b5b60ff1681600501819055508560048111156108f0576108ef6132d0565b5b60016000805490506109029190613781565b3373ffffffffffffffffffffffffffffffffffffffff167fe385fdb04af0282a704a6c5d5ec8414a7b883dfcc11a5fa082db2ae46125398160405160405180910390a4505050505050565b600060016000600280811115610966576109656132d0565b5b6002811115610978576109776132d0565b5b815260200190815260200160002060009054906101000a900460ff1660026109a091906137b5565b60016000600160028111156109b8576109b76132d0565b5b60028111156109ca576109c96132d0565b5b815260200190815260200160002060009054906101000a900460ff166109f091906137f0565b60ff16905090565b60003411610a3b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a3290613873565b60405180910390fd5b8473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8c69ba65ac630960f1d90c9a12eb143096fa71019450181b7fb5c299f03a63578686868634604051610aa09594939291906138e0565b60405180910390a35050505050565b33610ab981610e08565b610af8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610aef90613732565b60405180910390fd5b816000805490508110610b40576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b3790613975565b60405180910390fd5b8260008181548110610b5557610b54613995565b5b906000526020600020906007020160060160009054906101000a900460ff1615610bb4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bab90613a10565b60405180910390fd5b600480811115610bc757610bc66132d0565b5b60008281548110610bdb57610bda613995565b5b906000526020600020906007020160000160149054906101000a900460ff166004811115610c0c57610c0b6132d0565b5b1415610c4d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c4490613a7c565b60405180910390fd5b3384610c598282611340565b610c98576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c8f90613ae8565b60405180910390fd5b6000600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1690506000808881548110610cfe57610cfd613995565b5b906000526020600020906007020190508060040160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81549060ff0219169055816002811115610d7257610d716132d0565b5b60ff16816005016000828254610d889190613781565b92505081905550873373ffffffffffffffffffffffffffffffffffffffff167f8ed50e04800878b4f45dbcced5ce55bfbde633af37ddd2a2f837479dd7f5ca3584604051610dd6919061348d565b60405180910390a35050505050505050565b60016020528060005260406000206000915054906101000a900460ff1681565b600080600260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff166002811115610e6a57610e696132d0565b5b60ff16119050919050565b6000610eb47f0000000000000000000000000000000000000000000000000000000000000000610ea361094d565b610ead9190613b08565b606461274d565b905090565b806000805490508110610f01576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ef890613975565b60405180910390fd5b8160008181548110610f1657610f15613995565b5b906000526020600020906007020160060160009054906101000a900460ff1615610f75576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f6c90613a10565b60405180910390fd5b600480811115610f8857610f876132d0565b5b60008281548110610f9c57610f9b613995565b5b906000526020600020906007020160000160149054906101000a900460ff166004811115610fcd57610fcc6132d0565b5b141561100e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161100590613a7c565b60405180910390fd5b823373ffffffffffffffffffffffffffffffffffffffff166000828154811061103a57611039613995565b5b906000526020600020906007020160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146110c2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110b990613bae565b60405180910390fd5b6004600085815481106110d8576110d7613995565b5b906000526020600020906007020160000160146101000a81548160ff0219169083600481111561110b5761110a6132d0565b5b0217905550833373ffffffffffffffffffffffffffffffffffffffff167ff3a6ef5718c05d9183af076f5753197b68b04552a763c34796637d6134bdd0f260405160405180910390a350505050565b7f000000000000000000000000000000000000000000000000000000000000000081565b6000818154811061118e57600080fd5b90600052602060002090600702016000915090508060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16908060000160149054906101000a900460ff1690806001016040518060400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900460ff166002811115611265576112646132d0565b5b6002811115611277576112766132d0565b5b8152505090806002016040518060400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900460ff166002811115611306576113056132d0565b5b6002811115611318576113176132d0565b5b81525050908060030154908060050154908060060160009054906101000a900460ff16905087565b600080828154811061135557611354613995565b5b906000526020600020906007020160040160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b336113c381610e08565b611402576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113f990613732565b60405180910390fd5b60003390506000806001816001815401808255809150500390600052602060002090600702019050838160030181905550818160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060008160000160146101000a81548160ff0219169083600481111561149e5761149d6132d0565b5b021790555060018160040160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550600260008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16600281111561155c5761155b6132d0565b5b60ff1681600501819055506000600481111561157b5761157a6132d0565b5b600160008054905061158d9190613781565b3373ffffffffffffffffffffffffffffffffffffffff167fe385fdb04af0282a704a6c5d5ec8414a7b883dfcc11a5fa082db2ae46125398160405160405180910390a450505050565b60026020528060005260406000206000915054906101000a900460ff1681565b3361160081610e08565b61163f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161163690613732565b60405180910390fd5b816000805490508110611687576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161167e90613975565b60405180910390fd5b826000818154811061169c5761169b613995565b5b906000526020600020906007020160060160009054906101000a900460ff16156116fb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116f290613a10565b60405180910390fd5b60048081111561170e5761170d6132d0565b5b6000828154811061172257611721613995565b5b906000526020600020906007020160000160149054906101000a900460ff166004811115611753576117526132d0565b5b1415611794576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161178b90613a7c565b60405180910390fd5b33846117a08282611340565b156117e0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117d790613c1a565b60405180910390fd5b6000600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff169050600080888154811061184657611845613995565b5b9060005260206000209060070201905060018160040160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508160028111156118c3576118c26132d0565b5b60ff168160050160008282546118d99190613c3a565b92505081905550873373ffffffffffffffffffffffffffffffffffffffff167fb70d97bfb81912068fbb0d3ef0e849a0b5b5e822ddc9cd0d56e52b6b09ab11a784604051611927919061348d565b60405180910390a35050505050505050565b60606000808054905067ffffffffffffffff81111561195b5761195a613c90565b5b6040519080825280602002602001820160405280156119895781602001602082028036833780820191505090505b509050600080611997611fc7565b905060006119a5878361278c565b90505b6119c986886119b79190613c3a565b6001846119c49190613c3a565b61278c565b811015611b80578715611aa3578860048111156119e9576119e86132d0565b5b600082815481106119fd576119fc613995565b5b906000526020600020906007020160000160149054906101000a900460ff166004811115611a2e57611a2d6132d0565b5b148015611a6a575060008181548110611a4a57611a49613995565b5b906000526020600020906007020160060160009054906101000a900460ff165b15611a9e5780848481518110611a8357611a82613995565b5b6020026020010181815250508280611a9a90613cbf565b9350505b611b6d565b886004811115611ab657611ab56132d0565b5b60008281548110611aca57611ac9613995565b5b906000526020600020906007020160000160149054906101000a900460ff166004811115611afb57611afa6132d0565b5b148015611b38575060008181548110611b1757611b16613995565b5b906000526020600020906007020160060160009054906101000a900460ff16155b15611b6c5780848481518110611b5157611b50613995565b5b6020026020010181815250508280611b6890613cbf565b9350505b5b8080611b7890613cbf565b9150506119a8565b50611b8b83836127a5565b9350505050949350505050565b60606000808054905067ffffffffffffffff811115611bba57611bb9613c90565b5b604051908082528060200260200182016040528015611be85781602001602082028036833780820191505090505b509050600080611bf6611fc7565b90506000611c04878361278c565b90505b611c288688611c169190613c3a565b600184611c239190613c3a565b61278c565b811015611e15578715611d1d578873ffffffffffffffffffffffffffffffffffffffff1660008281548110611c6057611c5f613995565b5b906000526020600020906007020160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16148015611ce4575060008181548110611cc457611cc3613995565b5b906000526020600020906007020160060160009054906101000a900460ff165b15611d185780848481518110611cfd57611cfc613995565b5b6020026020010181815250508280611d1490613cbf565b9350505b611e02565b8873ffffffffffffffffffffffffffffffffffffffff1660008281548110611d4857611d47613995565b5b906000526020600020906007020160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16148015611dcd575060008181548110611dac57611dab613995565b5b906000526020600020906007020160060160009054906101000a900460ff16155b15611e015780848481518110611de657611de5613995565b5b6020026020010181815250508280611dfd90613cbf565b9350505b5b8080611e0d90613cbf565b915050611c07565b50611e2083836127a5565b9350505050949350505050565b60606000808054905067ffffffffffffffff811115611e4f57611e4e613c90565b5b604051908082528060200260200182016040528015611e7d5781602001602082028036833780820191505090505b509050600080611e8b611fc7565b90506000611e99878361278c565b90505b611ebd8688611eab9190613c3a565b600184611eb89190613c3a565b61278c565b811015611fb0578715611f365760008181548110611ede57611edd613995565b5b906000526020600020906007020160060160009054906101000a900460ff1615611f315780848481518110611f1657611f15613995565b5b6020026020010181815250508280611f2d90613cbf565b9350505b611f9d565b60008181548110611f4a57611f49613995565b5b906000526020600020906007020160060160009054906101000a900460ff16611f9c5780848481518110611f8157611f80613995565b5b6020026020010181815250508280611f9890613cbf565b9350505b5b8080611fa890613cbf565b915050611e9c565b50611fbb83836127a5565b93505050509392505050565b60006001600080549050611fdb9190613781565b905090565b60003411612023576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161201a90613873565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff167fa9bf9e71178d4c9a31c71731d67f63b087430417881b55bda1db42bc22f700ee346040516120699190612f63565b60405180910390a250565b7f000000000000000000000000000000000000000000000000000000000000000081565b8060008054905081106120e0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120d790613975565b60405180910390fd5b81600081815481106120f5576120f4613995565b5b906000526020600020906007020160060160009054906101000a900460ff1615612154576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161214b90613a10565b60405180910390fd5b600480811115612167576121666132d0565b5b6000828154811061217b5761217a613995565b5b906000526020600020906007020160000160149054906101000a900460ff1660048111156121ac576121ab6132d0565b5b14156121ed576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121e490613a7c565b60405180910390fd5b823373ffffffffffffffffffffffffffffffffffffffff166000828154811061221957612218613995565b5b906000526020600020906007020160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146122a1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161229890613bae565b60405180910390fd5b836122aa610e75565b600082815481106122be576122bd613995565b5b9060005260206000209060070201600501541015612311576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161230890613d54565b60405180910390fd5b600080868154811061232657612325613995565b5b9060005260206000209060070201905060008160000160149054906101000a900460ff16600481111561235c5761235b6132d0565b5b905060018260060160006101000a81548160ff0219169083151502179055506000600481111561238f5761238e6132d0565b5b60ff168160ff1614156123d3576123ce82600301548360000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16612857565b6126dc565b600160048111156123e7576123e66132d0565b5b60ff168160ff1614156124a15761249c826002016040518060400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900460ff166002811115612481576124806132d0565b5b6002811115612493576124926132d0565b5b8152505061294b565b6126db565b600260048111156124b5576124b46132d0565b5b60ff168160ff16141561256f5761256a826001016040518060400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900460ff16600281111561254f5761254e6132d0565b5b6002811115612561576125606132d0565b5b81525050612b3f565b6126da565b60036004811115612583576125826132d0565b5b60ff168160ff1614156126d9576126d8826001016040518060400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900460ff16600281111561261d5761261c6132d0565b5b600281111561262f5761262e6132d0565b5b81525050836002016040518060400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900460ff1660028111156126bd576126bc6132d0565b5b60028111156126cf576126ce6132d0565b5b81525050612ce7565b5b5b5b5b8160000160149054906101000a900460ff166004811115612700576126ff6132d0565b5b873373ffffffffffffffffffffffffffffffffffffffff167f5732b45b4bf13341d749e465ed724d2b147b95fee2e3578c2d62865a8d417bf760405160405180910390a450505050505050565b600080828461275c9190613da3565b1461276857600161276b565b60005b60ff16828461277a9190613dd4565b6127849190613c3a565b905092915050565b600081831061279b578161279d565b825b905092915050565b606060008267ffffffffffffffff8111156127c3576127c2613c90565b5b6040519080825280602002602001820160405280156127f15781602001602082028036833780820191505090505b50905060005b8381101561284c5784818151811061281257612811613995565b5b602002602001015182828151811061282d5761282c613995565b5b602002602001018181525050808061284490613cbf565b9150506127f7565b508091505092915050565b4782111561289a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161289190613e51565b60405180910390fd5b60008173ffffffffffffffffffffffffffffffffffffffff16836040516128c090613ea2565b60006040518083038185875af1925050503d80600081146128fd576040519150601f19603f3d011682016040523d82523d6000602084013e612902565b606091505b5050905080612946576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161293d90613f03565b60405180910390fd5b505050565b806000015161295981610e08565b15612999576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161299090613f6f565b60405180910390fd5b8160000151600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415612a0e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a0590613fdb565b60405180910390fd5b6000813b905060008114612a57576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a4e90614047565b60405180910390fd5b6000846020015190508060026000876000015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690836002811115612ac657612ac56132d0565b5b021790555060016000826002811115612ae257612ae16132d0565b5b6002811115612af457612af36132d0565b5b8152602001908152602001600020600081819054906101000a900460ff1680929190612b1f90614067565b91906101000a81548160ff021916908360ff160217905550505050505050565b80600081600001519050612b5281610e08565b8015612bd7575081602001516002811115612b7057612b6f6132d0565b5b60ff16600260008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff166002811115612bd257612bd16132d0565b5b60ff16145b612c16576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c0d906140dd565b60405180910390fd5b6001600084602001516002811115612c3157612c306132d0565b5b6002811115612c4357612c426132d0565b5b8152602001908152602001600020600081819054906101000a900460ff1680929190612c6e906140fd565b91906101000a81548160ff021916908360ff16021790555050612c8f612edb565b60026000846000015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81549060ff0219169055505050565b60008260200151905060008260200151905060016000836002811115612d1057612d0f6132d0565b5b6002811115612d2257612d216132d0565b5b8152602001908152602001600020600081819054906101000a900460ff1680929190612d4d906140fd565b91906101000a81548160ff021916908360ff1602179055505060016000826002811115612d7d57612d7c6132d0565b5b6002811115612d8f57612d8e6132d0565b5b8152602001908152602001600020600081819054906101000a900460ff1680929190612dba90614067565b91906101000a81548160ff021916908360ff16021790555050612ddb612edb565b826000015173ffffffffffffffffffffffffffffffffffffffff16846000015173ffffffffffffffffffffffffffffffffffffffff1614612e6a5760026000856000015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81549060ff02191690555b8060026000856000015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690836002811115612ed057612ecf6132d0565b5b021790555050505050565b7f000000000000000000000000000000000000000000000000000000000000000060ff16612f07610e75565b1015612f48576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612f3f90614173565b60405180910390fd5b565b6000819050919050565b612f5d81612f4a565b82525050565b6000602082019050612f786000830184612f54565b92915050565b600080fd5b600080fd5b60058110612f9557600080fd5b50565b600081359050612fa781612f88565b92915050565b600080fd5b600060408284031215612fc857612fc7612fad565b5b81905092915050565b600080600060a08486031215612fea57612fe9612f7e565b5b6000612ff886828701612f98565b935050602061300986828701612fb2565b925050606061301a86828701612fb2565b9150509250925092565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600061304f82613024565b9050919050565b61305f81613044565b811461306a57600080fd5b50565b60008135905061307c81613056565b92915050565b600080fd5b600080fd5b600080fd5b60008083601f8401126130a7576130a6613082565b5b8235905067ffffffffffffffff8111156130c4576130c3613087565b5b6020830191508360018202830111156130e0576130df61308c565b5b9250929050565b60008060008060006060868803121561310357613102612f7e565b5b60006131118882890161306d565b955050602086013567ffffffffffffffff81111561313257613131612f83565b5b61313e88828901613091565b9450945050604086013567ffffffffffffffff81111561316157613160612f83565b5b61316d88828901613091565b92509250509295509295909350565b61318581612f4a565b811461319057600080fd5b50565b6000813590506131a28161317c565b92915050565b6000602082840312156131be576131bd612f7e565b5b60006131cc84828501613193565b91505092915050565b600381106131e257600080fd5b50565b6000813590506131f4816131d5565b92915050565b6000602082840312156132105761320f612f7e565b5b600061321e848285016131e5565b91505092915050565b600060ff82169050919050565b61323d81613227565b82525050565b60006020820190506132586000830184613234565b92915050565b60006020828403121561327457613273612f7e565b5b60006132828482850161306d565b91505092915050565b60008115159050919050565b6132a08161328b565b82525050565b60006020820190506132bb6000830184613297565b92915050565b6132ca81613044565b82525050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b600581106133105761330f6132d0565b5b50565b6000819050613321826132ff565b919050565b600061333182613313565b9050919050565b61334181613326565b82525050565b61335081613044565b82525050565b60038110613367576133666132d0565b5b50565b600081905061337882613356565b919050565b60006133888261336a565b9050919050565b6133988161337d565b82525050565b6040820160008201516133b46000850182613347565b5060208201516133c7602085018261338f565b50505050565b6000610120820190506133e3600083018a6132c1565b6133f06020830189613338565b6133fd604083018861339e565b61340a608083018761339e565b61341760c0830186612f54565b61342460e0830185612f54565b613432610100830184613297565b98975050505050505050565b6000806040838503121561345557613454612f7e565b5b60006134638582860161306d565b925050602061347485828601613193565b9150509250929050565b6134878161337d565b82525050565b60006020820190506134a2600083018461347e565b92915050565b6134b18161328b565b81146134bc57600080fd5b50565b6000813590506134ce816134a8565b92915050565b600080600080608085870312156134ee576134ed612f7e565b5b60006134fc87828801612f98565b945050602061350d878288016134bf565b935050604061351e87828801613193565b925050606061352f87828801613193565b91505092959194509250565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b61357081612f4a565b82525050565b60006135828383613567565b60208301905092915050565b6000602082019050919050565b60006135a68261353b565b6135b08185613546565b93506135bb83613557565b8060005b838110156135ec5781516135d38882613576565b97506135de8361358e565b9250506001810190506135bf565b5085935050505092915050565b60006020820190508181036000830152613613818461359b565b905092915050565b6000806000806080858703121561363557613634612f7e565b5b60006136438782880161306d565b9450506020613654878288016134bf565b935050604061366587828801613193565b925050606061367687828801613193565b91505092959194509250565b60008060006060848603121561369b5761369a612f7e565b5b60006136a9868287016134bf565b93505060206136ba86828701613193565b92505060406136cb86828701613193565b9150509250925092565b600082825260208201905092915050565b7f4f4f340000000000000000000000000000000000000000000000000000000000600082015250565b600061371c6003836136d5565b9150613727826136e6565b602082019050919050565b6000602082019050818103600083015261374b8161370f565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061378c82612f4a565b915061379783612f4a565b9250828210156137aa576137a9613752565b5b828203905092915050565b60006137c082613227565b91506137cb83613227565b92508160ff04831182151516156137e5576137e4613752565b5b828202905092915050565b60006137fb82613227565b915061380683613227565b92508260ff0382111561381c5761381b613752565b5b828201905092915050565b7f4e45330000000000000000000000000000000000000000000000000000000000600082015250565b600061385d6003836136d5565b915061386882613827565b602082019050919050565b6000602082019050818103600083015261388c81613850565b9050919050565b82818337600083830152505050565b6000601f19601f8301169050919050565b60006138bf83856136d5565b93506138cc838584613893565b6138d5836138a2565b840190509392505050565b600060608201905081810360008301526138fb8187896138b3565b905081810360208301526139108185876138b3565b905061391f6040830184612f54565b9695505050505050565b7f4e58330000000000000000000000000000000000000000000000000000000000600082015250565b600061395f6003836136d5565b915061396a82613929565b602082019050919050565b6000602082019050818103600083015261398e81613952565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f5345310000000000000000000000000000000000000000000000000000000000600082015250565b60006139fa6003836136d5565b9150613a05826139c4565b602082019050919050565b60006020820190508181036000830152613a29816139ed565b9050919050565b7f5345320000000000000000000000000000000000000000000000000000000000600082015250565b6000613a666003836136d5565b9150613a7182613a30565b602082019050919050565b60006020820190508181036000830152613a9581613a59565b9050919050565b7f5345340000000000000000000000000000000000000000000000000000000000600082015250565b6000613ad26003836136d5565b9150613add82613a9c565b602082019050919050565b60006020820190508181036000830152613b0181613ac5565b9050919050565b6000613b1382612f4a565b9150613b1e83612f4a565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615613b5757613b56613752565b5b828202905092915050565b7f4f4f360000000000000000000000000000000000000000000000000000000000600082015250565b6000613b986003836136d5565b9150613ba382613b62565b602082019050919050565b60006020820190508181036000830152613bc781613b8b565b9050919050565b7f5345330000000000000000000000000000000000000000000000000000000000600082015250565b6000613c046003836136d5565b9150613c0f82613bce565b602082019050919050565b60006020820190508181036000830152613c3381613bf7565b9050919050565b6000613c4582612f4a565b9150613c5083612f4a565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115613c8557613c84613752565b5b828201905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000613cca82612f4a565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415613cfd57613cfc613752565b5b600182019050919050565b7f4e45320000000000000000000000000000000000000000000000000000000000600082015250565b6000613d3e6003836136d5565b9150613d4982613d08565b602082019050919050565b60006020820190508181036000830152613d6d81613d31565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000613dae82612f4a565b9150613db983612f4a565b925082613dc957613dc8613d74565b5b828206905092915050565b6000613ddf82612f4a565b9150613dea83612f4a565b925082613dfa57613df9613d74565b5b828204905092915050565b7f4e45340000000000000000000000000000000000000000000000000000000000600082015250565b6000613e3b6003836136d5565b9150613e4682613e05565b602082019050919050565b60006020820190508181036000830152613e6a81613e2e565b9050919050565b600081905092915050565b50565b6000613e8c600083613e71565b9150613e9782613e7c565b600082019050919050565b6000613ead82613e7f565b9150819050919050565b7f5345350000000000000000000000000000000000000000000000000000000000600082015250565b6000613eed6003836136d5565b9150613ef882613eb7565b602082019050919050565b60006020820190508181036000830152613f1c81613ee0565b9050919050565b7f4f4f350000000000000000000000000000000000000000000000000000000000600082015250565b6000613f596003836136d5565b9150613f6482613f23565b602082019050919050565b60006020820190508181036000830152613f8881613f4c565b9050919050565b7f4145310000000000000000000000000000000000000000000000000000000000600082015250565b6000613fc56003836136d5565b9150613fd082613f8f565b602082019050919050565b60006020820190508181036000830152613ff481613fb8565b9050919050565b7f4145320000000000000000000000000000000000000000000000000000000000600082015250565b60006140316003836136d5565b915061403c82613ffb565b602082019050919050565b6000602082019050818103600083015261406081614024565b9050919050565b600061407282613227565b915060ff82141561408657614085613752565b5b600182019050919050565b7f4e58320000000000000000000000000000000000000000000000000000000000600082015250565b60006140c76003836136d5565b91506140d282614091565b602082019050919050565b600060208201905081810360008301526140f6816140ba565b9050919050565b600061410882613227565b9150600082141561411c5761411b613752565b5b600182039050919050565b7f4e45350000000000000000000000000000000000000000000000000000000000600082015250565b600061415d6003836136d5565b915061416882614127565b602082019050919050565b6000602082019050818103600083015261418c81614150565b905091905056fea264697066735822122095fffb4290e6ea681eae660cd58b76e3b7def6848fde8766220a13252625696f64736f6c634300080a0033000000000000000000000000000000000000000000000000000000000000003700000000000000000000000000000000000000000000000000000000000000030000000000000000000000000000000000000000000000000000000000000060000000000000000000000000000000000000000000000000000000000000000500000000000000000000000095254b0f9efc20295ae423373cd105ee8b5a717f00000000000000000000000000000000000000000000000000000000000000020000000000000000000000000bb5708c4f71439db00027f85d87f0232acdeefa0000000000000000000000000000000000000000000000000000000000000002000000000000000000000000734724b6baaf3c407298d24d98ece1e0fa077ffd0000000000000000000000000000000000000000000000000000000000000001000000000000000000000000dfe2efa72e86397728c885d91a8786aa9fde7a2400000000000000000000000000000000000000000000000000000000000000010000000000000000000000004e2d208c5f7db881ee871f5df4a23dfdb0e77b580000000000000000000000000000000000000000000000000000000000000001

Deployed Bytecode

0x60806040526004361061012e5760003560e01c806397fc84c6116100ab578063cd700f6c1161006f578063cd700f6c14610466578063ddb9fde1146104a3578063e597c510146104e0578063f14cf2b11461050b578063f27a2e4d14610527578063fe0d94c11461055257610183565b806397fc84c61461035d5780639ee679e81461039a578063a48d938d146103c3578063b759f95414610400578063c5a66c1c1461042957610183565b80632f54bf6e116100f25780632f54bf6e1461025e57806333e6e13d1461029b57806340e58ee5146102c65780634c83f9e4146102ef57806381d12c581461031a57610183565b806307dac117146101885780630d15fd77146101b157806318e43345146101dc57806320c5429b146101f857806323d29b731461022157610183565b36610183573373ffffffffffffffffffffffffffffffffffffffff167f1e57e3bb474320be3d2c77138f75b7c3941292d647f5f9634e33a8e94e0e069b346040516101799190612f63565b60405180910390a2005b600080fd5b34801561019457600080fd5b506101af60048036038101906101aa9190612fd1565b61057b565b005b3480156101bd57600080fd5b506101c661094d565b6040516101d39190612f63565b60405180910390f35b6101f660048036038101906101f191906130e7565b6109f8565b005b34801561020457600080fd5b5061021f600480360381019061021a91906131a8565b610aaf565b005b34801561022d57600080fd5b50610248600480360381019061024391906131fa565b610de8565b6040516102559190613243565b60405180910390f35b34801561026a57600080fd5b506102856004803603810190610280919061325e565b610e08565b60405161029291906132a6565b60405180910390f35b3480156102a757600080fd5b506102b0610e75565b6040516102bd9190612f63565b60405180910390f35b3480156102d257600080fd5b506102ed60048036038101906102e891906131a8565b610eb9565b005b3480156102fb57600080fd5b5061030461115a565b6040516103119190612f63565b60405180910390f35b34801561032657600080fd5b50610341600480360381019061033c91906131a8565b61117e565b60405161035497969594939291906133cd565b60405180910390f35b34801561036957600080fd5b50610384600480360381019061037f919061343e565b611340565b60405161039191906132a6565b60405180910390f35b3480156103a657600080fd5b506103c160048036038101906103bc91906131a8565b6113b9565b005b3480156103cf57600080fd5b506103ea60048036038101906103e5919061325e565b6115d6565b6040516103f7919061348d565b60405180910390f35b34801561040c57600080fd5b50610427600480360381019061042291906131a8565b6115f6565b005b34801561043557600080fd5b50610450600480360381019061044b91906134d4565b611939565b60405161045d91906135f9565b60405180910390f35b34801561047257600080fd5b5061048d6004803603810190610488919061361b565b611b98565b60405161049a91906135f9565b60405180910390f35b3480156104af57600080fd5b506104ca60048036038101906104c59190613682565b611e2d565b6040516104d791906135f9565b60405180910390f35b3480156104ec57600080fd5b506104f5611fc7565b6040516105029190612f63565b60405180910390f35b6105256004803603810190610520919061325e565b611fe0565b005b34801561053357600080fd5b5061053c612074565b6040516105499190613243565b60405180910390f35b34801561055e57600080fd5b50610579600480360381019061057491906131a8565b612098565b005b3361058581610e08565b6105c4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016105bb90613732565b60405180910390fd5b60003390506000806001816001815401808255809150500390600052602060002090600702019050818160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550858160000160146101000a81548160ff02191690836004811115610656576106556132d0565b5b02179055506040518060400160405280866000016020810190610679919061325e565b73ffffffffffffffffffffffffffffffffffffffff1681526020018660200160208101906106a791906131fa565b60028111156106b9576106b86132d0565b5b8152508160010160008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160000160146101000a81548160ff02191690836002811115610732576107316132d0565b5b02179055509050506040518060400160405280856000016020810190610758919061325e565b73ffffffffffffffffffffffffffffffffffffffff16815260200185602001602081019061078691906131fa565b6002811115610798576107976132d0565b5b8152508160020160008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160000160146101000a81548160ff02191690836002811115610811576108106132d0565b5b021790555090505060018160040160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550600260008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1660028111156108d2576108d16132d0565b5b60ff1681600501819055508560048111156108f0576108ef6132d0565b5b60016000805490506109029190613781565b3373ffffffffffffffffffffffffffffffffffffffff167fe385fdb04af0282a704a6c5d5ec8414a7b883dfcc11a5fa082db2ae46125398160405160405180910390a4505050505050565b600060016000600280811115610966576109656132d0565b5b6002811115610978576109776132d0565b5b815260200190815260200160002060009054906101000a900460ff1660026109a091906137b5565b60016000600160028111156109b8576109b76132d0565b5b60028111156109ca576109c96132d0565b5b815260200190815260200160002060009054906101000a900460ff166109f091906137f0565b60ff16905090565b60003411610a3b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a3290613873565b60405180910390fd5b8473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8c69ba65ac630960f1d90c9a12eb143096fa71019450181b7fb5c299f03a63578686868634604051610aa09594939291906138e0565b60405180910390a35050505050565b33610ab981610e08565b610af8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610aef90613732565b60405180910390fd5b816000805490508110610b40576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b3790613975565b60405180910390fd5b8260008181548110610b5557610b54613995565b5b906000526020600020906007020160060160009054906101000a900460ff1615610bb4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bab90613a10565b60405180910390fd5b600480811115610bc757610bc66132d0565b5b60008281548110610bdb57610bda613995565b5b906000526020600020906007020160000160149054906101000a900460ff166004811115610c0c57610c0b6132d0565b5b1415610c4d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c4490613a7c565b60405180910390fd5b3384610c598282611340565b610c98576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c8f90613ae8565b60405180910390fd5b6000600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1690506000808881548110610cfe57610cfd613995565b5b906000526020600020906007020190508060040160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81549060ff0219169055816002811115610d7257610d716132d0565b5b60ff16816005016000828254610d889190613781565b92505081905550873373ffffffffffffffffffffffffffffffffffffffff167f8ed50e04800878b4f45dbcced5ce55bfbde633af37ddd2a2f837479dd7f5ca3584604051610dd6919061348d565b60405180910390a35050505050505050565b60016020528060005260406000206000915054906101000a900460ff1681565b600080600260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff166002811115610e6a57610e696132d0565b5b60ff16119050919050565b6000610eb47f0000000000000000000000000000000000000000000000000000000000000037610ea361094d565b610ead9190613b08565b606461274d565b905090565b806000805490508110610f01576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ef890613975565b60405180910390fd5b8160008181548110610f1657610f15613995565b5b906000526020600020906007020160060160009054906101000a900460ff1615610f75576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f6c90613a10565b60405180910390fd5b600480811115610f8857610f876132d0565b5b60008281548110610f9c57610f9b613995565b5b906000526020600020906007020160000160149054906101000a900460ff166004811115610fcd57610fcc6132d0565b5b141561100e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161100590613a7c565b60405180910390fd5b823373ffffffffffffffffffffffffffffffffffffffff166000828154811061103a57611039613995565b5b906000526020600020906007020160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146110c2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110b990613bae565b60405180910390fd5b6004600085815481106110d8576110d7613995565b5b906000526020600020906007020160000160146101000a81548160ff0219169083600481111561110b5761110a6132d0565b5b0217905550833373ffffffffffffffffffffffffffffffffffffffff167ff3a6ef5718c05d9183af076f5753197b68b04552a763c34796637d6134bdd0f260405160405180910390a350505050565b7f000000000000000000000000000000000000000000000000000000000000003781565b6000818154811061118e57600080fd5b90600052602060002090600702016000915090508060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16908060000160149054906101000a900460ff1690806001016040518060400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900460ff166002811115611265576112646132d0565b5b6002811115611277576112766132d0565b5b8152505090806002016040518060400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900460ff166002811115611306576113056132d0565b5b6002811115611318576113176132d0565b5b81525050908060030154908060050154908060060160009054906101000a900460ff16905087565b600080828154811061135557611354613995565b5b906000526020600020906007020160040160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b336113c381610e08565b611402576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113f990613732565b60405180910390fd5b60003390506000806001816001815401808255809150500390600052602060002090600702019050838160030181905550818160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060008160000160146101000a81548160ff0219169083600481111561149e5761149d6132d0565b5b021790555060018160040160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550600260008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16600281111561155c5761155b6132d0565b5b60ff1681600501819055506000600481111561157b5761157a6132d0565b5b600160008054905061158d9190613781565b3373ffffffffffffffffffffffffffffffffffffffff167fe385fdb04af0282a704a6c5d5ec8414a7b883dfcc11a5fa082db2ae46125398160405160405180910390a450505050565b60026020528060005260406000206000915054906101000a900460ff1681565b3361160081610e08565b61163f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161163690613732565b60405180910390fd5b816000805490508110611687576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161167e90613975565b60405180910390fd5b826000818154811061169c5761169b613995565b5b906000526020600020906007020160060160009054906101000a900460ff16156116fb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116f290613a10565b60405180910390fd5b60048081111561170e5761170d6132d0565b5b6000828154811061172257611721613995565b5b906000526020600020906007020160000160149054906101000a900460ff166004811115611753576117526132d0565b5b1415611794576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161178b90613a7c565b60405180910390fd5b33846117a08282611340565b156117e0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117d790613c1a565b60405180910390fd5b6000600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff169050600080888154811061184657611845613995565b5b9060005260206000209060070201905060018160040160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508160028111156118c3576118c26132d0565b5b60ff168160050160008282546118d99190613c3a565b92505081905550873373ffffffffffffffffffffffffffffffffffffffff167fb70d97bfb81912068fbb0d3ef0e849a0b5b5e822ddc9cd0d56e52b6b09ab11a784604051611927919061348d565b60405180910390a35050505050505050565b60606000808054905067ffffffffffffffff81111561195b5761195a613c90565b5b6040519080825280602002602001820160405280156119895781602001602082028036833780820191505090505b509050600080611997611fc7565b905060006119a5878361278c565b90505b6119c986886119b79190613c3a565b6001846119c49190613c3a565b61278c565b811015611b80578715611aa3578860048111156119e9576119e86132d0565b5b600082815481106119fd576119fc613995565b5b906000526020600020906007020160000160149054906101000a900460ff166004811115611a2e57611a2d6132d0565b5b148015611a6a575060008181548110611a4a57611a49613995565b5b906000526020600020906007020160060160009054906101000a900460ff165b15611a9e5780848481518110611a8357611a82613995565b5b6020026020010181815250508280611a9a90613cbf565b9350505b611b6d565b886004811115611ab657611ab56132d0565b5b60008281548110611aca57611ac9613995565b5b906000526020600020906007020160000160149054906101000a900460ff166004811115611afb57611afa6132d0565b5b148015611b38575060008181548110611b1757611b16613995565b5b906000526020600020906007020160060160009054906101000a900460ff16155b15611b6c5780848481518110611b5157611b50613995565b5b6020026020010181815250508280611b6890613cbf565b9350505b5b8080611b7890613cbf565b9150506119a8565b50611b8b83836127a5565b9350505050949350505050565b60606000808054905067ffffffffffffffff811115611bba57611bb9613c90565b5b604051908082528060200260200182016040528015611be85781602001602082028036833780820191505090505b509050600080611bf6611fc7565b90506000611c04878361278c565b90505b611c288688611c169190613c3a565b600184611c239190613c3a565b61278c565b811015611e15578715611d1d578873ffffffffffffffffffffffffffffffffffffffff1660008281548110611c6057611c5f613995565b5b906000526020600020906007020160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16148015611ce4575060008181548110611cc457611cc3613995565b5b906000526020600020906007020160060160009054906101000a900460ff165b15611d185780848481518110611cfd57611cfc613995565b5b6020026020010181815250508280611d1490613cbf565b9350505b611e02565b8873ffffffffffffffffffffffffffffffffffffffff1660008281548110611d4857611d47613995565b5b906000526020600020906007020160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16148015611dcd575060008181548110611dac57611dab613995565b5b906000526020600020906007020160060160009054906101000a900460ff16155b15611e015780848481518110611de657611de5613995565b5b6020026020010181815250508280611dfd90613cbf565b9350505b5b8080611e0d90613cbf565b915050611c07565b50611e2083836127a5565b9350505050949350505050565b60606000808054905067ffffffffffffffff811115611e4f57611e4e613c90565b5b604051908082528060200260200182016040528015611e7d5781602001602082028036833780820191505090505b509050600080611e8b611fc7565b90506000611e99878361278c565b90505b611ebd8688611eab9190613c3a565b600184611eb89190613c3a565b61278c565b811015611fb0578715611f365760008181548110611ede57611edd613995565b5b906000526020600020906007020160060160009054906101000a900460ff1615611f315780848481518110611f1657611f15613995565b5b6020026020010181815250508280611f2d90613cbf565b9350505b611f9d565b60008181548110611f4a57611f49613995565b5b906000526020600020906007020160060160009054906101000a900460ff16611f9c5780848481518110611f8157611f80613995565b5b6020026020010181815250508280611f9890613cbf565b9350505b5b8080611fa890613cbf565b915050611e9c565b50611fbb83836127a5565b93505050509392505050565b60006001600080549050611fdb9190613781565b905090565b60003411612023576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161201a90613873565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff167fa9bf9e71178d4c9a31c71731d67f63b087430417881b55bda1db42bc22f700ee346040516120699190612f63565b60405180910390a250565b7f000000000000000000000000000000000000000000000000000000000000000381565b8060008054905081106120e0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120d790613975565b60405180910390fd5b81600081815481106120f5576120f4613995565b5b906000526020600020906007020160060160009054906101000a900460ff1615612154576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161214b90613a10565b60405180910390fd5b600480811115612167576121666132d0565b5b6000828154811061217b5761217a613995565b5b906000526020600020906007020160000160149054906101000a900460ff1660048111156121ac576121ab6132d0565b5b14156121ed576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121e490613a7c565b60405180910390fd5b823373ffffffffffffffffffffffffffffffffffffffff166000828154811061221957612218613995565b5b906000526020600020906007020160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146122a1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161229890613bae565b60405180910390fd5b836122aa610e75565b600082815481106122be576122bd613995565b5b9060005260206000209060070201600501541015612311576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161230890613d54565b60405180910390fd5b600080868154811061232657612325613995565b5b9060005260206000209060070201905060008160000160149054906101000a900460ff16600481111561235c5761235b6132d0565b5b905060018260060160006101000a81548160ff0219169083151502179055506000600481111561238f5761238e6132d0565b5b60ff168160ff1614156123d3576123ce82600301548360000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16612857565b6126dc565b600160048111156123e7576123e66132d0565b5b60ff168160ff1614156124a15761249c826002016040518060400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900460ff166002811115612481576124806132d0565b5b6002811115612493576124926132d0565b5b8152505061294b565b6126db565b600260048111156124b5576124b46132d0565b5b60ff168160ff16141561256f5761256a826001016040518060400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900460ff16600281111561254f5761254e6132d0565b5b6002811115612561576125606132d0565b5b81525050612b3f565b6126da565b60036004811115612583576125826132d0565b5b60ff168160ff1614156126d9576126d8826001016040518060400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900460ff16600281111561261d5761261c6132d0565b5b600281111561262f5761262e6132d0565b5b81525050836002016040518060400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900460ff1660028111156126bd576126bc6132d0565b5b60028111156126cf576126ce6132d0565b5b81525050612ce7565b5b5b5b5b8160000160149054906101000a900460ff166004811115612700576126ff6132d0565b5b873373ffffffffffffffffffffffffffffffffffffffff167f5732b45b4bf13341d749e465ed724d2b147b95fee2e3578c2d62865a8d417bf760405160405180910390a450505050505050565b600080828461275c9190613da3565b1461276857600161276b565b60005b60ff16828461277a9190613dd4565b6127849190613c3a565b905092915050565b600081831061279b578161279d565b825b905092915050565b606060008267ffffffffffffffff8111156127c3576127c2613c90565b5b6040519080825280602002602001820160405280156127f15781602001602082028036833780820191505090505b50905060005b8381101561284c5784818151811061281257612811613995565b5b602002602001015182828151811061282d5761282c613995565b5b602002602001018181525050808061284490613cbf565b9150506127f7565b508091505092915050565b4782111561289a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161289190613e51565b60405180910390fd5b60008173ffffffffffffffffffffffffffffffffffffffff16836040516128c090613ea2565b60006040518083038185875af1925050503d80600081146128fd576040519150601f19603f3d011682016040523d82523d6000602084013e612902565b606091505b5050905080612946576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161293d90613f03565b60405180910390fd5b505050565b806000015161295981610e08565b15612999576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161299090613f6f565b60405180910390fd5b8160000151600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415612a0e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a0590613fdb565b60405180910390fd5b6000813b905060008114612a57576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a4e90614047565b60405180910390fd5b6000846020015190508060026000876000015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690836002811115612ac657612ac56132d0565b5b021790555060016000826002811115612ae257612ae16132d0565b5b6002811115612af457612af36132d0565b5b8152602001908152602001600020600081819054906101000a900460ff1680929190612b1f90614067565b91906101000a81548160ff021916908360ff160217905550505050505050565b80600081600001519050612b5281610e08565b8015612bd7575081602001516002811115612b7057612b6f6132d0565b5b60ff16600260008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff166002811115612bd257612bd16132d0565b5b60ff16145b612c16576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c0d906140dd565b60405180910390fd5b6001600084602001516002811115612c3157612c306132d0565b5b6002811115612c4357612c426132d0565b5b8152602001908152602001600020600081819054906101000a900460ff1680929190612c6e906140fd565b91906101000a81548160ff021916908360ff16021790555050612c8f612edb565b60026000846000015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81549060ff0219169055505050565b60008260200151905060008260200151905060016000836002811115612d1057612d0f6132d0565b5b6002811115612d2257612d216132d0565b5b8152602001908152602001600020600081819054906101000a900460ff1680929190612d4d906140fd565b91906101000a81548160ff021916908360ff1602179055505060016000826002811115612d7d57612d7c6132d0565b5b6002811115612d8f57612d8e6132d0565b5b8152602001908152602001600020600081819054906101000a900460ff1680929190612dba90614067565b91906101000a81548160ff021916908360ff16021790555050612ddb612edb565b826000015173ffffffffffffffffffffffffffffffffffffffff16846000015173ffffffffffffffffffffffffffffffffffffffff1614612e6a5760026000856000015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81549060ff02191690555b8060026000856000015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690836002811115612ed057612ecf6132d0565b5b021790555050505050565b7f000000000000000000000000000000000000000000000000000000000000000360ff16612f07610e75565b1015612f48576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612f3f90614173565b60405180910390fd5b565b6000819050919050565b612f5d81612f4a565b82525050565b6000602082019050612f786000830184612f54565b92915050565b600080fd5b600080fd5b60058110612f9557600080fd5b50565b600081359050612fa781612f88565b92915050565b600080fd5b600060408284031215612fc857612fc7612fad565b5b81905092915050565b600080600060a08486031215612fea57612fe9612f7e565b5b6000612ff886828701612f98565b935050602061300986828701612fb2565b925050606061301a86828701612fb2565b9150509250925092565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600061304f82613024565b9050919050565b61305f81613044565b811461306a57600080fd5b50565b60008135905061307c81613056565b92915050565b600080fd5b600080fd5b600080fd5b60008083601f8401126130a7576130a6613082565b5b8235905067ffffffffffffffff8111156130c4576130c3613087565b5b6020830191508360018202830111156130e0576130df61308c565b5b9250929050565b60008060008060006060868803121561310357613102612f7e565b5b60006131118882890161306d565b955050602086013567ffffffffffffffff81111561313257613131612f83565b5b61313e88828901613091565b9450945050604086013567ffffffffffffffff81111561316157613160612f83565b5b61316d88828901613091565b92509250509295509295909350565b61318581612f4a565b811461319057600080fd5b50565b6000813590506131a28161317c565b92915050565b6000602082840312156131be576131bd612f7e565b5b60006131cc84828501613193565b91505092915050565b600381106131e257600080fd5b50565b6000813590506131f4816131d5565b92915050565b6000602082840312156132105761320f612f7e565b5b600061321e848285016131e5565b91505092915050565b600060ff82169050919050565b61323d81613227565b82525050565b60006020820190506132586000830184613234565b92915050565b60006020828403121561327457613273612f7e565b5b60006132828482850161306d565b91505092915050565b60008115159050919050565b6132a08161328b565b82525050565b60006020820190506132bb6000830184613297565b92915050565b6132ca81613044565b82525050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b600581106133105761330f6132d0565b5b50565b6000819050613321826132ff565b919050565b600061333182613313565b9050919050565b61334181613326565b82525050565b61335081613044565b82525050565b60038110613367576133666132d0565b5b50565b600081905061337882613356565b919050565b60006133888261336a565b9050919050565b6133988161337d565b82525050565b6040820160008201516133b46000850182613347565b5060208201516133c7602085018261338f565b50505050565b6000610120820190506133e3600083018a6132c1565b6133f06020830189613338565b6133fd604083018861339e565b61340a608083018761339e565b61341760c0830186612f54565b61342460e0830185612f54565b613432610100830184613297565b98975050505050505050565b6000806040838503121561345557613454612f7e565b5b60006134638582860161306d565b925050602061347485828601613193565b9150509250929050565b6134878161337d565b82525050565b60006020820190506134a2600083018461347e565b92915050565b6134b18161328b565b81146134bc57600080fd5b50565b6000813590506134ce816134a8565b92915050565b600080600080608085870312156134ee576134ed612f7e565b5b60006134fc87828801612f98565b945050602061350d878288016134bf565b935050604061351e87828801613193565b925050606061352f87828801613193565b91505092959194509250565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b61357081612f4a565b82525050565b60006135828383613567565b60208301905092915050565b6000602082019050919050565b60006135a68261353b565b6135b08185613546565b93506135bb83613557565b8060005b838110156135ec5781516135d38882613576565b97506135de8361358e565b9250506001810190506135bf565b5085935050505092915050565b60006020820190508181036000830152613613818461359b565b905092915050565b6000806000806080858703121561363557613634612f7e565b5b60006136438782880161306d565b9450506020613654878288016134bf565b935050604061366587828801613193565b925050606061367687828801613193565b91505092959194509250565b60008060006060848603121561369b5761369a612f7e565b5b60006136a9868287016134bf565b93505060206136ba86828701613193565b92505060406136cb86828701613193565b9150509250925092565b600082825260208201905092915050565b7f4f4f340000000000000000000000000000000000000000000000000000000000600082015250565b600061371c6003836136d5565b9150613727826136e6565b602082019050919050565b6000602082019050818103600083015261374b8161370f565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061378c82612f4a565b915061379783612f4a565b9250828210156137aa576137a9613752565b5b828203905092915050565b60006137c082613227565b91506137cb83613227565b92508160ff04831182151516156137e5576137e4613752565b5b828202905092915050565b60006137fb82613227565b915061380683613227565b92508260ff0382111561381c5761381b613752565b5b828201905092915050565b7f4e45330000000000000000000000000000000000000000000000000000000000600082015250565b600061385d6003836136d5565b915061386882613827565b602082019050919050565b6000602082019050818103600083015261388c81613850565b9050919050565b82818337600083830152505050565b6000601f19601f8301169050919050565b60006138bf83856136d5565b93506138cc838584613893565b6138d5836138a2565b840190509392505050565b600060608201905081810360008301526138fb8187896138b3565b905081810360208301526139108185876138b3565b905061391f6040830184612f54565b9695505050505050565b7f4e58330000000000000000000000000000000000000000000000000000000000600082015250565b600061395f6003836136d5565b915061396a82613929565b602082019050919050565b6000602082019050818103600083015261398e81613952565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f5345310000000000000000000000000000000000000000000000000000000000600082015250565b60006139fa6003836136d5565b9150613a05826139c4565b602082019050919050565b60006020820190508181036000830152613a29816139ed565b9050919050565b7f5345320000000000000000000000000000000000000000000000000000000000600082015250565b6000613a666003836136d5565b9150613a7182613a30565b602082019050919050565b60006020820190508181036000830152613a9581613a59565b9050919050565b7f5345340000000000000000000000000000000000000000000000000000000000600082015250565b6000613ad26003836136d5565b9150613add82613a9c565b602082019050919050565b60006020820190508181036000830152613b0181613ac5565b9050919050565b6000613b1382612f4a565b9150613b1e83612f4a565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615613b5757613b56613752565b5b828202905092915050565b7f4f4f360000000000000000000000000000000000000000000000000000000000600082015250565b6000613b986003836136d5565b9150613ba382613b62565b602082019050919050565b60006020820190508181036000830152613bc781613b8b565b9050919050565b7f5345330000000000000000000000000000000000000000000000000000000000600082015250565b6000613c046003836136d5565b9150613c0f82613bce565b602082019050919050565b60006020820190508181036000830152613c3381613bf7565b9050919050565b6000613c4582612f4a565b9150613c5083612f4a565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115613c8557613c84613752565b5b828201905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000613cca82612f4a565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415613cfd57613cfc613752565b5b600182019050919050565b7f4e45320000000000000000000000000000000000000000000000000000000000600082015250565b6000613d3e6003836136d5565b9150613d4982613d08565b602082019050919050565b60006020820190508181036000830152613d6d81613d31565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000613dae82612f4a565b9150613db983612f4a565b925082613dc957613dc8613d74565b5b828206905092915050565b6000613ddf82612f4a565b9150613dea83612f4a565b925082613dfa57613df9613d74565b5b828204905092915050565b7f4e45340000000000000000000000000000000000000000000000000000000000600082015250565b6000613e3b6003836136d5565b9150613e4682613e05565b602082019050919050565b60006020820190508181036000830152613e6a81613e2e565b9050919050565b600081905092915050565b50565b6000613e8c600083613e71565b9150613e9782613e7c565b600082019050919050565b6000613ead82613e7f565b9150819050919050565b7f5345350000000000000000000000000000000000000000000000000000000000600082015250565b6000613eed6003836136d5565b9150613ef882613eb7565b602082019050919050565b60006020820190508181036000830152613f1c81613ee0565b9050919050565b7f4f4f350000000000000000000000000000000000000000000000000000000000600082015250565b6000613f596003836136d5565b9150613f6482613f23565b602082019050919050565b60006020820190508181036000830152613f8881613f4c565b9050919050565b7f4145310000000000000000000000000000000000000000000000000000000000600082015250565b6000613fc56003836136d5565b9150613fd082613f8f565b602082019050919050565b60006020820190508181036000830152613ff481613fb8565b9050919050565b7f4145320000000000000000000000000000000000000000000000000000000000600082015250565b60006140316003836136d5565b915061403c82613ffb565b602082019050919050565b6000602082019050818103600083015261406081614024565b9050919050565b600061407282613227565b915060ff82141561408657614085613752565b5b600182019050919050565b7f4e58320000000000000000000000000000000000000000000000000000000000600082015250565b60006140c76003836136d5565b91506140d282614091565b602082019050919050565b600060208201905081810360008301526140f6816140ba565b9050919050565b600061410882613227565b9150600082141561411c5761411b613752565b5b600182039050919050565b7f4e45350000000000000000000000000000000000000000000000000000000000600082015250565b600061415d6003836136d5565b915061416882614127565b602082019050919050565b6000602082019050818103600083015261418c81614150565b905091905056fea264697066735822122095fffb4290e6ea681eae660cd58b76e3b7def6848fde8766220a13252625696f64736f6c634300080a0033

Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)

000000000000000000000000000000000000000000000000000000000000003700000000000000000000000000000000000000000000000000000000000000030000000000000000000000000000000000000000000000000000000000000060000000000000000000000000000000000000000000000000000000000000000500000000000000000000000095254b0f9efc20295ae423373cd105ee8b5a717f00000000000000000000000000000000000000000000000000000000000000020000000000000000000000000bb5708c4f71439db00027f85d87f0232acdeefa0000000000000000000000000000000000000000000000000000000000000002000000000000000000000000734724b6baaf3c407298d24d98ece1e0fa077ffd0000000000000000000000000000000000000000000000000000000000000001000000000000000000000000dfe2efa72e86397728c885d91a8786aa9fde7a2400000000000000000000000000000000000000000000000000000000000000010000000000000000000000004e2d208c5f7db881ee871f5df4a23dfdb0e77b580000000000000000000000000000000000000000000000000000000000000001

-----Decoded View---------------
Arg [0] : _consensusRatio (uint256): 55
Arg [1] : _minLimitForConsensus (uint8): 3
Arg [2] : _initialOwnerAccounts (tuple[]): System.Collections.Generic.List`1[Nethereum.ABI.FunctionEncoding.ParameterOutput],System.Collections.Generic.List`1[Nethereum.ABI.FunctionEncoding.ParameterOutput],System.Collections.Generic.List`1[Nethereum.ABI.FunctionEncoding.ParameterOutput],System.Collections.Generic.List`1[Nethereum.ABI.FunctionEncoding.ParameterOutput],System.Collections.Generic.List`1[Nethereum.ABI.FunctionEncoding.ParameterOutput]

-----Encoded View---------------
14 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000037
Arg [1] : 0000000000000000000000000000000000000000000000000000000000000003
Arg [2] : 0000000000000000000000000000000000000000000000000000000000000060
Arg [3] : 0000000000000000000000000000000000000000000000000000000000000005
Arg [4] : 00000000000000000000000095254b0f9efc20295ae423373cd105ee8b5a717f
Arg [5] : 0000000000000000000000000000000000000000000000000000000000000002
Arg [6] : 0000000000000000000000000bb5708c4f71439db00027f85d87f0232acdeefa
Arg [7] : 0000000000000000000000000000000000000000000000000000000000000002
Arg [8] : 000000000000000000000000734724b6baaf3c407298d24d98ece1e0fa077ffd
Arg [9] : 0000000000000000000000000000000000000000000000000000000000000001
Arg [10] : 000000000000000000000000dfe2efa72e86397728c885d91a8786aa9fde7a24
Arg [11] : 0000000000000000000000000000000000000000000000000000000000000001
Arg [12] : 0000000000000000000000004e2d208c5f7db881ee871f5df4a23dfdb0e77b58
Arg [13] : 0000000000000000000000000000000000000000000000000000000000000001


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.