Contract 0x2b2180a92a686cfc03599b9e5027e35b9448e9f3

 

Contract Overview

Balance:
0 MATIC

MATIC Value:
$0.00

Token:
 
Txn Hash
Method
Block
From
To
Value [Txn Fee]
0x4ee4654047d3f6cc607916a708a296f35561da657a068b77655b1c1bc5fc0b52Commit Record99479232021-01-23 11:21:36797 days 14 hrs ago0x8a8c076ad2e974b12223fa5a09f62275cfa0c2c0 IN  0x2b2180a92a686cfc03599b9e5027e35b9448e9f30 MATIC0.000131371
0x967f4ffcde1ce24f425af830cb6188f8c44961ebf98db1a55baab2d45f91a7e8Commit Record98010282021-01-19 20:09:23801 days 5 hrs ago0x281048bf4d3bbbbd38abe184f6b306216b2e06ae IN  0x2b2180a92a686cfc03599b9e5027e35b9448e9f30 MATIC0.0001313581
0xdf3af614eb3907042efab411e13de9483d9a5d1da68f6adfb466e989e45764b2Commit Record97959782021-01-19 17:15:47801 days 8 hrs ago0x8a8c076ad2e974b12223fa5a09f62275cfa0c2c0 IN  0x2b2180a92a686cfc03599b9e5027e35b9448e9f30 MATIC0.000131371
0x4b634bfab9c1f5393821c1522e98fa22486e28a8f3ef0dde8bf6123d4d170c97Commit Record97959292021-01-19 17:14:05801 days 8 hrs ago0x281048bf4d3bbbbd38abe184f6b306216b2e06ae IN  0x2b2180a92a686cfc03599b9e5027e35b9448e9f30 MATIC0.000131371
0xa1f49dc060fc7928e72b5ea00c52ebd425cd2d9c06628f5384db8bc7bf0055eeCommit Record97958842021-01-19 17:12:31801 days 8 hrs ago0x8a8c076ad2e974b12223fa5a09f62275cfa0c2c0 IN  0x2b2180a92a686cfc03599b9e5027e35b9448e9f30 MATIC0.0001313581
0x6ae95c51eb4c6ef036216ea1dc58caf9a03e3cafdab14ac14e90263985798d2cCommit Record97958312021-01-19 17:10:41801 days 8 hrs ago0xa3f36a33e66adeb98e08fe1bd96b4c58517c64c4 IN  0x2b2180a92a686cfc03599b9e5027e35b9448e9f30 MATIC0.000131371
0x4212b3434f0b85ca9528844492213a7930363a3a45df9121bc7cf1f0db3a5f3aCommit Record97957832021-01-19 17:09:05801 days 8 hrs ago0x8a8c076ad2e974b12223fa5a09f62275cfa0c2c0 IN  0x2b2180a92a686cfc03599b9e5027e35b9448e9f30 MATIC0.000131371
0x47ee5ac6430edf67c9190a748524f5a560bc3543b952bfd694faa93152395ca4Commit Record97957362021-01-19 17:07:27801 days 8 hrs ago0xa3f36a33e66adeb98e08fe1bd96b4c58517c64c4 IN  0x2b2180a92a686cfc03599b9e5027e35b9448e9f30 MATIC0.000131371
0x0e2245ebd9c7e4173c88fb09c0638ea222fa232a945da862acc21205facb6c39Commit Record97956842021-01-19 17:05:39801 days 8 hrs ago0x281048bf4d3bbbbd38abe184f6b306216b2e06ae IN  0x2b2180a92a686cfc03599b9e5027e35b9448e9f30 MATIC0.000131371
0x180c0d13278ad63de21fef5332b5b68a943642b47b705442454a7c955ef520f7Commit Record97951652021-01-19 16:47:49801 days 9 hrs ago0xa3f36a33e66adeb98e08fe1bd96b4c58517c64c4 IN  0x2b2180a92a686cfc03599b9e5027e35b9448e9f30 MATIC0.000131371
0xbd7d38c62b826f43d627a2429f6d2a1b0f87e5f300ab67eac74745337f925474Commit Record97948752021-01-19 16:37:49801 days 9 hrs ago0x281048bf4d3bbbbd38abe184f6b306216b2e06ae IN  0x2b2180a92a686cfc03599b9e5027e35b9448e9f30 MATIC0.000131371
0xd86b800c13cef671cbddd09bbafda90c73bb2cb50ec39e52a267776d099349faCommit Record97948712021-01-19 16:37:41801 days 9 hrs ago0xa3f36a33e66adeb98e08fe1bd96b4c58517c64c4 IN  0x2b2180a92a686cfc03599b9e5027e35b9448e9f30 MATIC0.000131371
0x4691c640e22189a2338df3e006c8aec225dad7fdb1d9b3caf1cd846f69a9039aCommit Record97948082021-01-19 16:35:31801 days 9 hrs ago0x8a8c076ad2e974b12223fa5a09f62275cfa0c2c0 IN  0x2b2180a92a686cfc03599b9e5027e35b9448e9f30 MATIC0.000131371
0xb18b56db7abe7737ef532212a9c03bd72b24dc7069b0470965bbf0779074d2f6Commit Record97948032021-01-19 16:35:21801 days 9 hrs ago0x8a8c076ad2e974b12223fa5a09f62275cfa0c2c0 IN  0x2b2180a92a686cfc03599b9e5027e35b9448e9f30 MATIC0.000131371
0x3cfec834f0f7368125b71378a9b5cab7527be4ea8cc4ed03706cb772aaa8d366Commit Record97946122021-01-19 16:28:47801 days 9 hrs ago0x8a8c076ad2e974b12223fa5a09f62275cfa0c2c0 IN  0x2b2180a92a686cfc03599b9e5027e35b9448e9f30 MATIC0.000131371
0x9cd52c6e4b57d259a06e02c1c7b26989f2b65ceb5075785dc3f2d4611227a9ffCommit Record97946032021-01-19 16:28:29801 days 9 hrs ago0x281048bf4d3bbbbd38abe184f6b306216b2e06ae IN  0x2b2180a92a686cfc03599b9e5027e35b9448e9f30 MATIC0.000131371
0x7c6bae5c2440c796b9aa8e3740cd27036e50bd68a863df5a59af3c503f00bd97Commit Record97945912021-01-19 16:28:05801 days 9 hrs ago0xa3f36a33e66adeb98e08fe1bd96b4c58517c64c4 IN  0x2b2180a92a686cfc03599b9e5027e35b9448e9f30 MATIC0.000131371
0x43a07c798db1367a973404f6fb00152f9fa9e15dafaab1e51c102957bfca1ba5Commit Record97945842021-01-19 16:27:51801 days 9 hrs ago0x8a8c076ad2e974b12223fa5a09f62275cfa0c2c0 IN  0x2b2180a92a686cfc03599b9e5027e35b9448e9f30 MATIC0.000131371
0xa7eb5853e2ec83033ffeb26dd442e64a3d75b4547f79f5ed39163928c438ce61Commit Record97945822021-01-19 16:27:47801 days 9 hrs ago0x281048bf4d3bbbbd38abe184f6b306216b2e06ae IN  0x2b2180a92a686cfc03599b9e5027e35b9448e9f30 MATIC0.000131371
0xadf2ff5cb05cb86979da99643a12541481cd2b66d55814c67d4444d29f40f6a6Commit Record97944762021-01-19 16:24:07801 days 9 hrs ago0x281048bf4d3bbbbd38abe184f6b306216b2e06ae IN  0x2b2180a92a686cfc03599b9e5027e35b9448e9f30 MATIC0.000131371
0xb93fd0f448dd05f2cf26f4e9dccb79c313f3f000e4932f82191e31e24f752bf6Commit Record97944362021-01-19 16:22:47801 days 9 hrs ago0xa3f36a33e66adeb98e08fe1bd96b4c58517c64c4 IN  0x2b2180a92a686cfc03599b9e5027e35b9448e9f30 MATIC0.000131371
0x40414653ebad1a195c42a250b9cc54c56d2d7daec25661724669c1ae174f95f2Commit Record97944322021-01-19 16:22:39801 days 9 hrs ago0x8a8c076ad2e974b12223fa5a09f62275cfa0c2c0 IN  0x2b2180a92a686cfc03599b9e5027e35b9448e9f30 MATIC0.000131371
0x5faccc83a59128826789cab12bbfdc0220c838c1a1f18d6a4b1cb4602ed3c071Commit Record97944312021-01-19 16:22:33801 days 9 hrs ago0x281048bf4d3bbbbd38abe184f6b306216b2e06ae IN  0x2b2180a92a686cfc03599b9e5027e35b9448e9f30 MATIC0.000131371
0xfe66d9772f25ff1399a231819d61eb8f1ce31ab4f47ae27df8d04663b1c4d580Commit Record97944302021-01-19 16:22:31801 days 9 hrs ago0xa3f36a33e66adeb98e08fe1bd96b4c58517c64c4 IN  0x2b2180a92a686cfc03599b9e5027e35b9448e9f30 MATIC0.000131371
0x93b77d9df2b63219cde6c8fe7750fa2aed9f9d231e899130fe8aa748bcdd5ac5Commit Record97944262021-01-19 16:22:23801 days 9 hrs ago0x8a8c076ad2e974b12223fa5a09f62275cfa0c2c0 IN  0x2b2180a92a686cfc03599b9e5027e35b9448e9f30 MATIC0.000131371
[ Download CSV Export 
Latest 2 internal transactions
Parent Txn Hash Block From To Value
0x8dde4b352ce05855342883319c24b05726ae2beddd28c1fbd3c4e2262fff784e92383422021-01-06 8:42:30814 days 17 hrs ago 0x2b2180a92a686cfc03599b9e5027e35b9448e9f3  Contract Creation0 MATIC
0x8b93e13814d1b66424f7f30862e32f0aba83b12a2102d327052b3dc1285c29dd74635202020-11-24 21:37:13857 days 4 hrs ago 0x2b2180a92a686cfc03599b9e5027e35b9448e9f3  Contract Creation0 MATIC
[ Download CSV Export 
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
EVSignerControl

Compiler Version
v0.5.17+commit.d19bba13

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, None license
/**
 *Submitted for verification at polygonscan.com on 2021-06-30
*/

/* Copyright BlockVigil, Inc. 2019 */

pragma solidity ^0.5.7;

contract SignerControlBase {
    event PrimaryOwnerAddition(address indexed owner);
    event SecondaryOwnerAddition(address indexed owner);
    event PrimaryOwnerRemoval(address indexed owner);
    event SecondaryOwnerRemoval(address indexed owner);
    event RequirementChange(uint required);
    ///events related to transactions agreed through this contract
    event TransactionSubmission(uint transactionId);
    event TransactionConfirmation(address indexed sender, uint indexed transactionId);
    event TransactionRevocation(address indexed sender, uint indexed transactionId);
    event TransactionExecution(uint transactionId);
    event TransactionExecutionFailure(uint transactionId);

    uint constant MAX_OWNER_COUNT = 50;
    mapping (address => bool) public isPrimaryOwner;
    mapping (address => bool) public isSecondaryOwner;

    mapping (uint => mapping (address => bool)) public confirmations;
    mapping (uint => Transaction) public transactions;
    mapping (uint => mapping (address => bool)) public transactionConfirmations;
    address[] public primaryOwners;
    address[] public secondaryOwners;
    uint public required_confirmations; // required for signer address modifications and secondary ownership modifications
    uint public requestCount;
    uint public transactionCount;



    ///holds information on transactions to enable safe execution of ownership functions
    struct Transaction {
        address destination;
        uint value;
        bytes data;
        bool executed;
    }


    modifier valid_requirements(uint ownerCount, uint _required) {
        if (   ownerCount > MAX_OWNER_COUNT
        || _required > ownerCount
        || _required == 0
        || ownerCount == 0)
            revert();
        _;
    }

    modifier primaryOwnerDoesNotExist(address owner) {
        if (isPrimaryOwner[owner])
            revert("Primary Owner already exists");
        _;
    }

    modifier primaryOwnerExists(address owner) {
        if (!isPrimaryOwner[owner])
            revert();
        _;
    }

    modifier PrimaryOrSecondaryOwnerExists(address owner) {
        if(!isPrimaryOwner[owner] && !isSecondaryOwner[owner])
            revert('Not an owner');
        _;
    }

    modifier PrimaryOrSecondaryOwnerDoesNotExist(address owner) {
        if(isPrimaryOwner[owner] || isSecondaryOwner[owner])
            revert('Already an owner');
        _;
    }


    modifier onlySignerControl() {
        if (msg.sender != address(this))
            revert("Only SignerControl contract can perform this task");
        _;
    }

    modifier notNull(address _address) {
        if (_address == address(0))
            revert("Null address specified");
        _;
    }


    modifier transactionExists(uint _transactionid) {
        if (transactions[_transactionid].destination == address(0))
            revert("Transaction ID does not exist");
        _;
    }


    modifier transactionNotConfirmed(uint transactionId, address _sender) {
        if (transactionConfirmations[transactionId][_sender])
            revert("Transaction already confirmed");
        _;
    }

    modifier confirmed(uint request_id, address _sender) {
        if (!confirmations[request_id][_sender])
            revert("Request was never confirmed to be revoked");
        _;
    }



    modifier transactionNotExecuted(uint transactionId) {
        if (transactions[transactionId].executed)
            revert("Transaction has already been executed");
        _;
    }


    constructor (address[] memory _primaryOwners, address[] memory _secondaryOwners, uint _required_confirmations)
    public
    valid_requirements(_primaryOwners.length+_secondaryOwners.length, _required_confirmations)
    {
        uint i;
        for (i=0; i<_primaryOwners.length; i++) {
            if (isPrimaryOwner[_primaryOwners[i]] || _primaryOwners[i] == address(0))
                revert();
            isPrimaryOwner[_primaryOwners[i]] = true;
        }

        for (i=0; i<_secondaryOwners.length; i++) {
            if (isSecondaryOwner[_secondaryOwners[i]] || _secondaryOwners[i] == address(0))
                revert();
            isSecondaryOwner[_secondaryOwners[i]] = true;
        }
        primaryOwners = _primaryOwners;
        secondaryOwners = _secondaryOwners;
        required_confirmations = _required_confirmations;

    }


    /// @dev Allows to add a new primary owner. Transaction has to be sent by prepopulated primary accounts supplied during contract instantiation.
    /// @param newPrimaryOwner Address of new primary owner.
    function addPrimaryOwner(address newPrimaryOwner)
    public
    primaryOwnerExists(msg.sender)
    primaryOwnerDoesNotExist(newPrimaryOwner)
    notNull(newPrimaryOwner)
    valid_requirements(primaryOwners.length + secondaryOwners.length + 1, required_confirmations)
    {
        isPrimaryOwner[newPrimaryOwner] = true;
        primaryOwners.push(newPrimaryOwner);
        emit PrimaryOwnerAddition(newPrimaryOwner);
    }

    /// @dev Allows to remove a primary owner. Transaction has to be sent by an existing primary owner
    /// @param owner Address of owner to be removed
    function removePrimaryOwner(address owner)
    public
    primaryOwnerExists(msg.sender)
    primaryOwnerExists(owner)
    valid_requirements(primaryOwners.length + secondaryOwners.length -1, required_confirmations)
    {
        isPrimaryOwner[owner] = false;
        for (uint i=0; i<primaryOwners.length - 1; i++)
            if (primaryOwners[i] == owner) {
                primaryOwners[i] = primaryOwners[primaryOwners.length - 1];
                break;
            }
        primaryOwners.length -= 1; // this depends on the fact that primaryOwnerExists()
        if (required_confirmations > primaryOwners.length + secondaryOwners.length)
            changeRequirement(primaryOwners.length + secondaryOwners.length);
        emit PrimaryOwnerRemoval(owner);
    }

    /// @dev Allows to change the number of required confirmations. Transaction has to be sent by a primary owner
    /// @param _required Number of required confirmations.
    function changeRequirement(uint _required)
    public
    valid_requirements(primaryOwners.length + secondaryOwners.length, _required)
    {
        if (!isPrimaryOwner[msg.sender])
            revert();
        required_confirmations = _required;
        emit RequirementChange(_required);
    }

    /// @dev Allows to replace a primary  owner with a new owner. Only allowed to be executed by an existing primary owner.
    /// @param owner Address of owner to be replaced.
    /// @param newOwner Address of new owner.
    function replacePrimaryOwner(address owner, address newOwner)
    public
    primaryOwnerExists(msg.sender)
    {
        for (uint i=0; i<primaryOwners.length; i++)
            if (primaryOwners[i] == owner) {
                primaryOwners[i] = newOwner;
                break;
            }
        isPrimaryOwner[owner] = false;
        isPrimaryOwner[newOwner] = true;
        emit PrimaryOwnerRemoval(owner);
        emit PrimaryOwnerAddition(newOwner);
    }

     /// @dev Allows to add a new second owner. Transaction has to be sent only the current instance of SignerControl contract.
    /// @param newSecondaryOwner Address of new secondary owner.
    function addSecondaryOwner(address newSecondaryOwner)
    public
    onlySignerControl
    notNull(newSecondaryOwner)
    valid_requirements(primaryOwners.length + secondaryOwners.length + 1, required_confirmations)
    {
        isSecondaryOwner[newSecondaryOwner] = true;
        secondaryOwners.push(newSecondaryOwner);
        emit SecondaryOwnerAddition(newSecondaryOwner);
    }

    function removeSecondaryOwner(address owner)
    public
    onlySignerControl
    notNull(owner)
    valid_requirements(primaryOwners.length + secondaryOwners.length - 1, required_confirmations)
    {
        isSecondaryOwner[owner] = false;
        for (uint i=0; i<secondaryOwners.length - 1; i++)
            if (secondaryOwners[i] == owner) {
                secondaryOwners[i] = secondaryOwners[secondaryOwners.length - 1];
                break;
            }
        secondaryOwners.length -= 1; // this depends on the fact that primaryOwnerExists()
        if (required_confirmations > primaryOwners.length + secondaryOwners.length)
            changeRequirement(primaryOwners.length + secondaryOwners.length);
        emit SecondaryOwnerRemoval(owner);
    }

    /*
    MultiSig Wallet Transaction submission and confirmation logic begins here
    These enable the safe execution of ownership functions over the contract
    */

    /// @dev Allows an owner to submit and confirm a transaction.
    /// @param destination Transaction target address.
    /// @param value Transaction ether value.
    /// @param data Transaction data payload.
    /// @return Returns transaction ID.
    function submitTransaction(address destination, uint value, bytes memory data)
        public
        returns (uint transactionId)
    {
        transactionId = addTransaction(destination, value, data);
        confirmTransaction(transactionId);
    }

    /// @dev Allows an owner to confirm a transaction.
    /// @param transactionId Transaction ID.
    function confirmTransaction(uint transactionId)
        public
        PrimaryOrSecondaryOwnerExists(msg.sender)
        transactionExists(transactionId)
        transactionNotConfirmed(transactionId, msg.sender)
    {
        transactionConfirmations[transactionId][msg.sender] = true;
        emit TransactionConfirmation(msg.sender, transactionId);
        executeTransaction(transactionId);
    }

    /// @dev Allows anyone to execute a confirmed transaction.
    /// @param transactionId Transaction ID.
    function executeTransaction(uint transactionId)
        public
        transactionNotExecuted(transactionId)
    {
        if (isConfirmedTransaction(transactionId)) {
            Transaction storage temptx = transactions[transactionId];
            temptx.executed = true;
            (bool success, bytes memory data) = temptx.destination.call.value(temptx.value)(temptx.data);
            if (success)
                emit TransactionExecution(transactionId);
            else {
                emit TransactionExecutionFailure(transactionId);
                temptx.executed = false;
            }
        }
    }

    /// @dev Returns the confirmation status of a transaction.
    /// @param transactionId Transaction ID.
    /// @return Confirmation status.
    function isConfirmedTransaction(uint transactionId)
        public
        view
        returns (bool)
    {
        uint count = 0;
        uint i = 0;
        for (i=0; i<secondaryOwners.length; i++) {
            if (transactionConfirmations[transactionId][secondaryOwners[i]])
                count += 1;
            if (count == required_confirmations)
                return true;
        }
        // if secondary owners havent done their bit yet
        for (i=0; i<primaryOwners.length; i++) {
            if (transactionConfirmations[transactionId][primaryOwners[i]])
                count += 1;
            if (count == required_confirmations)
                return true;
        }
    }

    /*
     * Internal functions
     */
    /// @dev Adds a new transaction to the transaction mapping, if transaction does not exist yet.
    /// @param destination Transaction target address.
    /// @param value Transaction ether value.
    /// @param data Transaction data payload.
    /// @return Returns transaction ID.
    function addTransaction(address destination, uint value, bytes memory data)
        internal
        notNull(destination)
        returns (uint transactionId)
    {
        transactionId = transactionCount;
        transactions[transactionId] = Transaction({
            destination: destination,
            value: value,
            data: data,
            executed: false
        });
        transactionCount += 1;
        emit TransactionSubmission(transactionId);
    }

    /*
    Utility public functions
    */

    /// @dev Get primary owners.
    /// @return List of primary owner addresses.
    function getPrimaryOwners()
        public
        view
        returns (address[] memory)
    {
        return primaryOwners;
    }

    /// @dev Get secondary owners.
    /// @return List of secondary owner addresses.
    function getSecondaryOwners()
        public
        view
        returns (address[] memory)
    {
        return secondaryOwners;
    }

    /*
    Transaction features
    */

    /// @dev Returns number of confirmations of a transaction.
    /// @param transactionId Transaction ID.
    /// @return Number of confirmations.
    function getTransactionConfirmationCount(uint transactionId)
        public
        view
        returns (uint count)
    {
        uint i = 0;
        for (i=0; i<primaryOwners.length; i++)
            if (transactionConfirmations[transactionId][primaryOwners[i]])
                count += 1;

        for (i=0; i<secondaryOwners.length; i++)
            if (transactionConfirmations[transactionId][secondaryOwners[i]])
                count += 1;
    }

    /// @dev Returns total number of transactions after filers are applied.
    /// @param pending Include pending transactions.
    /// @param executed Include executed transactions.
    /// @return Total number of transactions after filters are applied.
    function getTransactionCount(bool pending, bool executed)
        public
        view
        returns (uint count)
    {
        for (uint i=0; i<transactionCount; i++)
            if (   pending && !transactions[i].executed
                || executed && transactions[i].executed)
                count += 1;
    }

    /// @dev Returns array with owner addresses, which confirmed transaction.
    /// @param transactionId Transaction ID.
    /// @return Returns array of owner addresses.
    function getTransactionConfirmations(uint transactionId)
        public
        view
        returns (address[] memory _confirmations )
    {
        address[] memory confirmationsTemp = new address[](primaryOwners.length + secondaryOwners.length);
        uint count = 0;
        uint i;
        // go through secondaryOwners
        for (i=0; i<secondaryOwners.length; i++)
            if (transactionConfirmations[transactionId][secondaryOwners[i]]) {
                confirmationsTemp[count] = secondaryOwners[i];
                count += 1;
            }
        // go through primaryOwners
        for (i=0; i<primaryOwners.length; i++)
            if (transactionConfirmations[transactionId][primaryOwners[i]]) {
                confirmationsTemp[count] = primaryOwners[i];
                count += 1;
            }
        _confirmations = new address[](count);
        for (i=0; i<count; i++)
            _confirmations[i] = confirmationsTemp[i];
    }

    /// @dev Returns list of transaction IDs in defined range.
    /// @param from Index start position of transaction array.
    /// @param to Index end position of transaction array.
    /// @param pending Include pending transactions.
    /// @param executed Include executed transactions.
    /// @return Returns array of transaction IDs.
    function getTransactionIds(uint from, uint to, bool pending, bool executed)
        public
        view
        returns (uint[] memory _transactionIds)
    {
        uint[] memory transactionIdsTemp = new uint[](transactionCount);
        uint count = 0;
        uint i;
        for (i=0; i<transactionCount; i++)
            if (   pending && !transactions[i].executed
                || executed && transactions[i].executed)
            {
                transactionIdsTemp[count] = i;
                count += 1;
            }
        _transactionIds = new uint[](to - from);
        for (i=from; i<to; i++)
            _transactionIds[i - from] = transactionIdsTemp[i];
    }

}


contract EVSignerControl is SignerControlBase{
    event SignerAddition(address indexed signer);
    event SignerRemoval(address indexed signer);
    address[] public signers;
    mapping(address => bool) public isSigner;

    modifier signerExists(address signer) {
        if (!isSigner[signer])
            revert();
        _;
    }

    modifier signerDoesNotExist(address signer) {
        if (isSigner[signer])
            revert("Signer already exists");
        _;
    }

    constructor (address[] memory _primaryOwners, address[] memory _secondaryOwners, address[] memory _signers, uint _required_confirmations)
    SignerControlBase(_primaryOwners, _secondaryOwners, _required_confirmations)
    public
    {
        for (uint i=0; i<_signers.length; i++) {
            if (isSigner[_signers[i]] || _signers[i] == address(0))
                revert();
            isSigner[_signers[i]] = true;
        }
        signers = _signers;
    }

    /// @dev Reset allowed secondary owners and signers
    function takeOver()
    public
    {
        require (isPrimaryOwner[msg.sender] == true);
        uint i;

        for(i=0; i<secondaryOwners.length; i++) {
            isSecondaryOwner[secondaryOwners[i]] = false;
            secondaryOwners[i] = address(0); // overwrite all secondary owners
        }
        secondaryOwners.length = 0;

        for(i=0; i<signers.length; i++) {
            signers[i] = address(0); // overwrite all signer addresses
        }
        signers.length = 0;
    }

    /// @dev Allows to add a signer. Transaction has to be sent by a Owner.
    /// @param signer Address of signer.
    function addSigner(address signer) signerDoesNotExist (signer) public {
        require(isPrimaryOwner[msg.sender] || isSecondaryOwner[msg.sender]);
        isSigner[signer] = true;
        signers.push(signer);
        emit SignerAddition(signer);
    }

    /// @dev Returns list of signers.
    /// @return List of signer addresses.
    function getSigners()
        public
        view
        returns (address[] memory)
    {
        return signers;
    }

    /// @dev Allows to remove a signer. Transaction has to be sent by an Owner.
    /// @param signer Address of signer.
    function removeSigner(address signer) signerExists(signer) public {
        require(isPrimaryOwner[msg.sender] || isSecondaryOwner[msg.sender]);
        isSigner[signer] = false;
        for (uint i=0; i<signers.length - 1; i++)
            if (signers[i] == signer) {
                signers[i] = signers[signers.length - 1];
                break;
            }
        signers.length -= 1; // this depends on the fact that signerExists()
        emit SignerRemoval(signer);
    }

     /*
    *Proxy logic
    */
    function () payable external {
        require(isSigner[msg.sender]);
        address contractAddr;
        uint begin_index = msg.data.length - 32;
        assembly {
             let ptr := mload(0x40)
             calldatacopy(ptr, begin_index, 32)
             contractAddr := mload(ptr)
        }
        require(contractAddr != address(0));

        assembly {
          let ptr := mload(0x40)
          let actualcalldatasize := sub(calldatasize, 32)
          calldatacopy(ptr, 0, actualcalldatasize)
          let result := call(gas, contractAddr, callvalue, ptr, actualcalldatasize, 0, 0)
          let size := returndatasize
          returndatacopy(ptr, 0, size)

          switch result
          case 0 { revert(ptr, size) }
          default { return(ptr, size) }
        }
    }

    function deployContract(uint value, bytes memory bytecode)
    signerExists(msg.sender)
    public
    returns (address contractAddress)
    {
        assembly
            {
              /// the first slot of a dynamic type like bytes always holds the length of the array
              /// advance it by 32 bytes to access teh actual contents
              contractAddress := create(value, add(bytecode, 0x20), mload(bytecode))

            }
    }

}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"address[]","name":"_primaryOwners","type":"address[]"},{"internalType":"address[]","name":"_secondaryOwners","type":"address[]"},{"internalType":"address[]","name":"_signers","type":"address[]"},{"internalType":"uint256","name":"_required_confirmations","type":"uint256"}],"payable":false,"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"}],"name":"PrimaryOwnerAddition","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"}],"name":"PrimaryOwnerRemoval","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"required","type":"uint256"}],"name":"RequirementChange","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"}],"name":"SecondaryOwnerAddition","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"}],"name":"SecondaryOwnerRemoval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"signer","type":"address"}],"name":"SignerAddition","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"signer","type":"address"}],"name":"SignerRemoval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"sender","type":"address"},{"indexed":true,"internalType":"uint256","name":"transactionId","type":"uint256"}],"name":"TransactionConfirmation","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"transactionId","type":"uint256"}],"name":"TransactionExecution","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"transactionId","type":"uint256"}],"name":"TransactionExecutionFailure","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"sender","type":"address"},{"indexed":true,"internalType":"uint256","name":"transactionId","type":"uint256"}],"name":"TransactionRevocation","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"transactionId","type":"uint256"}],"name":"TransactionSubmission","type":"event"},{"payable":true,"stateMutability":"payable","type":"fallback"},{"constant":false,"inputs":[{"internalType":"address","name":"newPrimaryOwner","type":"address"}],"name":"addPrimaryOwner","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"newSecondaryOwner","type":"address"}],"name":"addSecondaryOwner","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"signer","type":"address"}],"name":"addSigner","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"_required","type":"uint256"}],"name":"changeRequirement","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"transactionId","type":"uint256"}],"name":"confirmTransaction","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"address","name":"","type":"address"}],"name":"confirmations","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"value","type":"uint256"},{"internalType":"bytes","name":"bytecode","type":"bytes"}],"name":"deployContract","outputs":[{"internalType":"address","name":"contractAddress","type":"address"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"transactionId","type":"uint256"}],"name":"executeTransaction","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"getPrimaryOwners","outputs":[{"internalType":"address[]","name":"","type":"address[]"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"getSecondaryOwners","outputs":[{"internalType":"address[]","name":"","type":"address[]"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"getSigners","outputs":[{"internalType":"address[]","name":"","type":"address[]"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"uint256","name":"transactionId","type":"uint256"}],"name":"getTransactionConfirmationCount","outputs":[{"internalType":"uint256","name":"count","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"uint256","name":"transactionId","type":"uint256"}],"name":"getTransactionConfirmations","outputs":[{"internalType":"address[]","name":"_confirmations","type":"address[]"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"bool","name":"pending","type":"bool"},{"internalType":"bool","name":"executed","type":"bool"}],"name":"getTransactionCount","outputs":[{"internalType":"uint256","name":"count","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"uint256","name":"from","type":"uint256"},{"internalType":"uint256","name":"to","type":"uint256"},{"internalType":"bool","name":"pending","type":"bool"},{"internalType":"bool","name":"executed","type":"bool"}],"name":"getTransactionIds","outputs":[{"internalType":"uint256[]","name":"_transactionIds","type":"uint256[]"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"uint256","name":"transactionId","type":"uint256"}],"name":"isConfirmedTransaction","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"isPrimaryOwner","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"isSecondaryOwner","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"isSigner","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"primaryOwners","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"removePrimaryOwner","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"removeSecondaryOwner","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"signer","type":"address"}],"name":"removeSigner","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"newOwner","type":"address"}],"name":"replacePrimaryOwner","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"requestCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"required_confirmations","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"secondaryOwners","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"signers","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"destination","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"submitTransaction","outputs":[{"internalType":"uint256","name":"transactionId","type":"uint256"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[],"name":"takeOver","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"address","name":"","type":"address"}],"name":"transactionConfirmations","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"transactionCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"transactions","outputs":[{"internalType":"address","name":"destination","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"},{"internalType":"bool","name":"executed","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"}]

60806040523480156200001157600080fd5b5060405162002ae338038062002ae3833981810160405260808110156200003757600080fd5b81019080805160405193929190846401000000008211156200005857600080fd5b9083019060208201858111156200006e57600080fd5b82518660208202830111640100000000821117156200008c57600080fd5b82525081516020918201928201910280838360005b83811015620000bb578181015183820152602001620000a1565b5050505090500160405260200180516040519392919084640100000000821115620000e557600080fd5b908301906020820185811115620000fb57600080fd5b82518660208202830111640100000000821117156200011957600080fd5b82525081516020918201928201910280838360005b83811015620001485781810151838201526020016200012e565b50505050905001604052602001805160405193929190846401000000008211156200017257600080fd5b9083019060208201858111156200018857600080fd5b8251866020820283011164010000000082111715620001a657600080fd5b82525081516020918201928201910280838360005b83811015620001d5578181015183820152602001620001bb565b505050509190910160405250602001518451865191935086925085918491018160328211806200020457508181115b806200020e575080155b8062000218575081155b156200022357600080fd5b60005b8551811015620002f1576000808783815181106200024057fe5b6020908102919091018101516001600160a01b031682528101919091526040016000205460ff168062000299575060006001600160a01b03168682815181106200028657fe5b60200260200101516001600160a01b0316145b15620002a457600080fd5b6001600080888481518110620002b657fe5b6020908102919091018101516001600160a01b03168252810191909152604001600020805460ff191691151591909117905560010162000226565b5060005b8451811015620003c157600160008683815181106200031057fe5b6020908102919091018101516001600160a01b031682528101919091526040016000205460ff168062000369575060006001600160a01b03168582815181106200035657fe5b60200260200101516001600160a01b0316145b156200037457600080fd5b60018060008784815181106200038657fe5b6020908102919091018101516001600160a01b03168252810191909152604001600020805460ff1916911515919091179055600101620002f5565b8551620003d6906005906020890190620004ea565b508451620003ec906006906020880190620004ea565b5050506007919091555060009150505b8251811015620004c957600b60008483815181106200041757fe5b6020908102919091018101516001600160a01b031682528101919091526040016000205460ff168062000470575060006001600160a01b03168382815181106200045d57fe5b60200260200101516001600160a01b0316145b156200047b57600080fd5b6001600b60008584815181106200048e57fe5b6020908102919091018101516001600160a01b03168252810191909152604001600020805460ff1916911515919091179055600101620003fc565b508151620004df90600a906020850190620004ea565b50505050506200057e565b82805482825590600052602060002090810192821562000542579160200282015b828111156200054257825182546001600160a01b0319166001600160a01b039091161782556020909201916001909101906200050b565b506200055092915062000554565b5090565b6200057b91905b80821115620005505780546001600160a01b03191681556001016200055b565b90565b612555806200058e6000396000f3fe6080604052600436106101ee5760003560e01c806394cf795e1161010d578063bbc2dbe3116100a0578063e27c105f1161006f578063e27c105f146108d2578063e39383a41461098c578063eb12d61e146109c5578063ed14b6a5146109f8578063ee22610b14610a0d576101ee565b8063bbc2dbe314610798578063c01a8c84146107ad578063c6427474146107d7578063cbb831c11461089f576101ee565b8063a8abe69a116100dc578063a8abe69a146106ef578063ae5799dc1461072f578063b77bf60014610759578063ba51a6df1461076e576101ee565b806394cf795e146105c55780639ace38c2146105da578063a48c3969146106a7578063a85a5e4a146106bc576101ee565b80635015f5f1116101855780635badbe4c116101545780635badbe4c14610520578063739cc0dc1461053557806377a1b2301461055f5780637df73e2714610592576101ee565b80635015f5f11461044257806350b7e9421461047557806354741525146104b057806359227d61146104f6576101ee565b80632ff11be1116101c15780632ff11be1146103475780633411c81c1461037157806340dc3a41146103aa5780634dec40591461040f576101ee565b80630e0538b51461025b5780630e316ab7146102a25780632079fb9a146102d7578063229075441461031d575b336000908152600b602052604090205460ff1661020a57600080fd5b604051600090601f1936019060208282375191506001600160a01b03821661023157600080fd5b604051602036038060008337600080828434885af13d806000853e818015610257578185f35b8185fd5b34801561026757600080fd5b5061028e6004803603602081101561027e57600080fd5b50356001600160a01b0316610a37565b604080519115158252519081900360200190f35b3480156102ae57600080fd5b506102d5600480360360208110156102c557600080fd5b50356001600160a01b0316610a4c565b005b3480156102e357600080fd5b50610301600480360360208110156102fa57600080fd5b5035610bca565b604080516001600160a01b039092168252519081900360200190f35b34801561032957600080fd5b506103016004803603602081101561034057600080fd5b5035610bf1565b34801561035357600080fd5b506103016004803603602081101561036a57600080fd5b5035610bfe565b34801561037d57600080fd5b5061028e6004803603604081101561039457600080fd5b50803590602001356001600160a01b0316610c0b565b3480156103b657600080fd5b506103bf610c2b565b60408051602080825283518183015283519192839290830191858101910280838360005b838110156103fb5781810151838201526020016103e3565b505050509050019250505060405180910390f35b34801561041b57600080fd5b5061028e6004803603602081101561043257600080fd5b50356001600160a01b0316610c8e565b34801561044e57600080fd5b506102d56004803603602081101561046557600080fd5b50356001600160a01b0316610ca3565b34801561048157600080fd5b506102d56004803603604081101561049857600080fd5b506001600160a01b0381358116916020013516610eb4565b3480156104bc57600080fd5b506104e4600480360360408110156104d357600080fd5b508035151590602001351515610ff1565b60408051918252519081900360200190f35b34801561050257600080fd5b5061028e6004803603602081101561051957600080fd5b503561105f565b34801561052c57600080fd5b506104e4611164565b34801561054157600080fd5b506103bf6004803603602081101561055857600080fd5b503561116a565b34801561056b57600080fd5b506102d56004803603602081101561058257600080fd5b50356001600160a01b03166113a8565b34801561059e57600080fd5b5061028e600480360360208110156105b557600080fd5b50356001600160a01b031661156a565b3480156105d157600080fd5b506103bf61157f565b3480156105e657600080fd5b50610604600480360360208110156105fd57600080fd5b50356115df565b60405180856001600160a01b03166001600160a01b031681526020018481526020018060200183151515158152602001828103825284818151815260200191508051906020019080838360005b83811015610669578181015183820152602001610651565b50505050905090810190601f1680156106965780820380516001836020036101000a031916815260200191505b509550505050505060405180910390f35b3480156106b357600080fd5b506104e461169e565b3480156106c857600080fd5b506102d5600480360360208110156106df57600080fd5b50356001600160a01b03166116a4565b3480156106fb57600080fd5b506103bf6004803603608081101561071257600080fd5b50803590602081013590604081013515159060600135151561184f565b34801561073b57600080fd5b506104e46004803603602081101561075257600080fd5b503561197c565b34801561076557600080fd5b506104e4611a54565b34801561077a57600080fd5b506102d56004803603602081101561079157600080fd5b5035611a5a565b3480156107a457600080fd5b506103bf611ae5565b3480156107b957600080fd5b506102d5600480360360208110156107d057600080fd5b5035611b45565b3480156107e357600080fd5b506104e4600480360360608110156107fa57600080fd5b6001600160a01b038235169160208101359181019060608101604082013564010000000081111561082a57600080fd5b82018360208201111561083c57600080fd5b8035906020019184600183028401116401000000008311171561085e57600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929550611cf8945050505050565b3480156108ab57600080fd5b506102d5600480360360208110156108c257600080fd5b50356001600160a01b0316611d17565b3480156108de57600080fd5b50610301600480360360408110156108f557600080fd5b8135919081019060408101602082013564010000000081111561091757600080fd5b82018360208201111561092957600080fd5b8035906020019184600183028401116401000000008311171561094b57600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929550611e72945050505050565b34801561099857600080fd5b5061028e600480360360408110156109af57600080fd5b50803590602001356001600160a01b0316611ea1565b3480156109d157600080fd5b506102d5600480360360208110156109e857600080fd5b50356001600160a01b0316611ec1565b348015610a0457600080fd5b506102d5611fec565b348015610a1957600080fd5b506102d560048036036020811015610a3057600080fd5b503561210f565b60016020526000908152604090205460ff1681565b6001600160a01b0381166000908152600b6020526040902054819060ff16610a7357600080fd5b3360009081526020819052604090205460ff1680610aa057503360009081526001602052604090205460ff165b610aa957600080fd5b6001600160a01b0382166000908152600b60205260408120805460ff191690555b600a5460001901811015610b7d57826001600160a01b0316600a8281548110610aef57fe5b6000918252602090912001546001600160a01b03161415610b7557600a80546000198101908110610b1c57fe5b600091825260209091200154600a80546001600160a01b039092169183908110610b4257fe5b9060005260206000200160006101000a8154816001600160a01b0302191690836001600160a01b03160217905550610b7d565b600101610aca565b50600a80546000190190610b919082612409565b506040516001600160a01b038316907fa2a6e2b8f0cf0f627456034557b0149227a355af53f5bc8ce7e496bfbe73c0a990600090a25050565b600a8181548110610bd757fe5b6000918252602090912001546001600160a01b0316905081565b60058181548110610bd757fe5b60068181548110610bd757fe5b600260209081526000928352604080842090915290825290205460ff1681565b60606006805480602002602001604051908101604052809291908181526020018280548015610c8357602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311610c65575b505050505090505b90565b60006020819052908152604090205460ff1681565b333014610ce15760405162461bcd60e51b81526004018080602001828103825260318152602001806124cb6031913960400191505060405180910390fd5b806001600160a01b038116610d36576040805162461bcd60e51b8152602060048201526016602482015275139d5b1b081859191c995cdcc81cdc1958da599a595960521b604482015290519081900360640190fd5b600654600554600754910160001901906032821180610d5457508181115b80610d5d575080155b80610d66575081155b15610d7057600080fd5b6001600160a01b0384166000908152600160205260408120805460ff191690555b60065460001901811015610e4457846001600160a01b031660068281548110610db657fe5b6000918252602090912001546001600160a01b03161415610e3c57600680546000198101908110610de357fe5b600091825260209091200154600680546001600160a01b039092169183908110610e0957fe5b9060005260206000200160006101000a8154816001600160a01b0302191690836001600160a01b03160217905550610e44565b600101610d91565b50600680546000190190610e589082612409565b5060065460055460075491011015610e7a57600654600554610e7a9101611a5a565b6040516001600160a01b038516907f5e6ce049a1882a95d9fb59d67984f095fd6668e5758ebe5acb47f3c802a4a7ae90600090a250505050565b3360008181526020819052604090205460ff16610ed057600080fd5b60005b600554811015610f5857836001600160a01b031660058281548110610ef457fe5b6000918252602090912001546001600160a01b03161415610f50578260058281548110610f1d57fe5b9060005260206000200160006101000a8154816001600160a01b0302191690836001600160a01b03160217905550610f58565b600101610ed3565b506001600160a01b03808416600081815260208190526040808220805460ff1990811690915593861682528082208054909416600117909355915190917ffa6e7df21e5db24c7e7e699b06f831640a634130e24c61000cf69d668eefc7e491a26040516001600160a01b038316907f44f4c9f70ded83f0bb52b6130247618ba2ac00c72755a648e4a7df94f92799be90600090a2505050565b6000805b6009548110156110585783801561101f57506000818152600360208190526040909120015460ff16155b80611044575082801561104457506000818152600360208190526040909120015460ff165b15611050576001820191505b600101610ff5565b5092915050565b600080805b6006548110156110de576000848152600460205260408120600680549192918490811061108d57fe5b60009182526020808320909101546001600160a01b0316835282019290925260400190205460ff16156110c1576001820191505b6007548214156110d65760019250505061115f565b600101611064565b5060005b60055481101561115c576000848152600460205260408120600580549192918490811061110b57fe5b60009182526020808320909101546001600160a01b0316835282019290925260400190205460ff161561113f576001820191505b6007548214156111545760019250505061115f565b6001016110e2565b50505b919050565b60085481565b606080600680549050600580549050016040519080825280602002602001820160405280156111a3578160200160208202803883390190505b5090506000805b60065481101561126657600085815260046020526040812060068054919291849081106111d357fe5b60009182526020808320909101546001600160a01b0316835282019290925260400190205460ff161561125e576006818154811061120d57fe5b9060005260206000200160009054906101000a90046001600160a01b031683838151811061123757fe5b60200260200101906001600160a01b031690816001600160a01b0316815250506001820191505b6001016111aa565b5060005b600554811015611326576000858152600460205260408120600580549192918490811061129357fe5b60009182526020808320909101546001600160a01b0316835282019290925260400190205460ff161561131e57600581815481106112cd57fe5b9060005260206000200160009054906101000a90046001600160a01b03168383815181106112f757fe5b60200260200101906001600160a01b031690816001600160a01b0316815250506001820191505b60010161126a565b81604051908082528060200260200182016040528015611350578160200160208202803883390190505b509350600090505b818110156113a05782818151811061136c57fe5b602002602001015184828151811061138057fe5b6001600160a01b0390921660209283029190910190910152600101611358565b505050919050565b3360008181526020819052604090205460ff166113c457600080fd5b6001600160a01b038216600090815260208190526040902054829060ff166113eb57600080fd5b60065460055460075491016000190190603282118061140957508181115b80611412575080155b8061141b575081155b1561142557600080fd5b6001600160a01b0385166000908152602081905260408120805460ff191690555b600554600019018110156114f957856001600160a01b03166005828154811061146b57fe5b6000918252602090912001546001600160a01b031614156114f15760058054600019810190811061149857fe5b600091825260209091200154600580546001600160a01b0390921691839081106114be57fe5b9060005260206000200160006101000a8154816001600160a01b0302191690836001600160a01b031602179055506114f9565b600101611446565b5060058054600019019061150d9082612409565b506006546005546007549101101561152f5760065460055461152f9101611a5a565b6040516001600160a01b038616907ffa6e7df21e5db24c7e7e699b06f831640a634130e24c61000cf69d668eefc7e490600090a25050505050565b600b6020526000908152604090205460ff1681565b6060600a805480602002602001604051908101604052809291908181526020018280548015610c83576020028201919060005260206000209081546001600160a01b03168152600190910190602001808311610c65575050505050905090565b60036020908152600091825260409182902080546001808301546002808501805488516101009582161595909502600019011691909104601f81018790048702840187019097528683526001600160a01b0390931695909491929183018282801561168b5780601f106116605761010080835404028352916020019161168b565b820191906000526020600020905b81548152906001019060200180831161166e57829003601f168201915b5050506003909301549192505060ff1684565b60075481565b3360008181526020819052604090205460ff166116c057600080fd5b6001600160a01b038216600090815260208190526040902054829060ff1615611730576040805162461bcd60e51b815260206004820152601c60248201527f5072696d617279204f776e657220616c72656164792065786973747300000000604482015290519081900360640190fd5b826001600160a01b038116611785576040805162461bcd60e51b8152602060048201526016602482015275139d5b1b081859191c995cdcc81cdc1958da599a595960521b604482015290519081900360640190fd5b60065460055460075491016001019060328211806117a257508181115b806117ab575080155b806117b4575081155b156117be57600080fd5b6001600160a01b038616600081815260208190526040808220805460ff1916600190811790915560058054918201815583527f036b6384b5eca791c62761152d0c79bb0604c104a5fb6f4eb0703f3154bb3db00180546001600160a01b03191684179055517f44f4c9f70ded83f0bb52b6130247618ba2ac00c72755a648e4a7df94f92799be9190a2505050505050565b60608060095460405190808252806020026020018201604052801561187e578160200160208202803883390190505b5090506000805b600954811015611901578580156118af57506000818152600360208190526040909120015460ff16155b806118d457508480156118d457506000818152600360208190526040909120015460ff165b156118f957808383815181106118e657fe5b6020026020010181815250506001820191505b600101611885565b87870360405190808252806020026020018201604052801561192d578160200160208202803883390190505b5093508790505b868110156119715782818151811061194857fe5b6020026020010151848983038151811061195e57fe5b6020908102919091010152600101611934565b505050949350505050565b6000805b6005548110156119e557600083815260046020526040812060058054919291849081106119a957fe5b60009182526020808320909101546001600160a01b0316835282019290925260400190205460ff16156119dd576001820191505b600101611980565b5060005b600654811015611a4e5760008381526004602052604081206006805491929184908110611a1257fe5b60009182526020808320909101546001600160a01b0316835282019290925260400190205460ff1615611a46576001820191505b6001016119e9565b50919050565b60095481565b60065460055401816032821180611a7057508181115b80611a79575080155b80611a82575081155b15611a8c57600080fd5b3360009081526020819052604090205460ff16611aa857600080fd5b60078390556040805184815290517fa3f1ee9126a074d9326c682f561767f710e927faa811f7a99829d49dc421797a9181900360200190a1505050565b60606005805480602002602001604051908101604052809291908181526020018280548015610c83576020028201919060005260206000209081546001600160a01b03168152600190910190602001808311610c65575050505050905090565b3360008181526020819052604090205460ff16158015611b7e57506001600160a01b03811660009081526001602052604090205460ff16155b15611bbf576040805162461bcd60e51b815260206004820152600c60248201526b2737ba1030b71037bbb732b960a11b604482015290519081900360640190fd5b60008281526003602052604090205482906001600160a01b0316611c2a576040805162461bcd60e51b815260206004820152601d60248201527f5472616e73616374696f6e20494420646f6573206e6f74206578697374000000604482015290519081900360640190fd5b60008381526004602090815260408083203380855292529091205484919060ff1615611c9d576040805162461bcd60e51b815260206004820152601d60248201527f5472616e73616374696f6e20616c726561647920636f6e6669726d6564000000604482015290519081900360640190fd5b6000858152600460209081526040808320338085529252808320805460ff191660011790555187927f3d185bf73d86ca21df4e92a671e0bab99ab7d42404531bafda489fefb443474a91a3611cf18561210f565b5050505050565b6000611d058484846122dd565b9050611d1081611b45565b9392505050565b333014611d555760405162461bcd60e51b81526004018080602001828103825260318152602001806124cb6031913960400191505060405180910390fd5b806001600160a01b038116611daa576040805162461bcd60e51b8152602060048201526016602482015275139d5b1b081859191c995cdcc81cdc1958da599a595960521b604482015290519081900360640190fd5b6006546005546007549101600101906032821180611dc757508181115b80611dd0575080155b80611dd9575081155b15611de357600080fd5b6001600160a01b0384166000818152600160208190526040808320805460ff19168317905560068054928301815583527ff652222313e28459528d920b65115c16c04f3efc82aaedc97be59f3f377c0d3f90910180546001600160a01b03191684179055517f37b40e790fc0665f103d9dfd19ef4f10f3905bebda246957fa1cce8d90300e979190a250505050565b336000818152600b602052604081205490919060ff16611e9157600080fd5b82516020840185f0949350505050565b600460209081526000928352604080842090915290825290205460ff1681565b6001600160a01b0381166000908152600b6020526040902054819060ff1615611f29576040805162461bcd60e51b81526020600482015260156024820152745369676e657220616c72656164792065786973747360581b604482015290519081900360640190fd5b3360009081526020819052604090205460ff1680611f5657503360009081526001602052604090205460ff165b611f5f57600080fd5b6001600160a01b0382166000818152600b6020526040808220805460ff19166001908117909155600a8054918201815583527fc65a7bb8d6351c1cf70c95a316cc6a92839c986682d98bc35f958f4883f9d2a80180546001600160a01b03191684179055517f8191ca9d665b824fc53160f3727e7ec3a5330e4a67e1db6c4a86678956dfef199190a25050565b3360009081526020819052604090205460ff16151560011461200d57600080fd5b60005b6006548110156120a1576000600160006006848154811061202d57fe5b6000918252602080832091909101546001600160a01b031683528201929092526040018120805460ff191692151592909217909155600680548390811061207057fe5b600091825260209091200180546001600160a01b0319166001600160a01b0392909216919091179055600101612010565b60006120ae600682612409565b50600090505b600a548110156120fe576000600a82815481106120cd57fe5b600091825260209091200180546001600160a01b0319166001600160a01b03929092169190911790556001016120b4565b600061210b600a82612409565b5050565b60008181526003602081905260409091200154819060ff16156121635760405162461bcd60e51b81526004018080602001828103825260258152602001806124fc6025913960400191505060405180910390fd5b61216c8261105f565b1561210b576000828152600360208190526040808320918201805460ff191660019081179091558254818401549251600280860180549697966060966001600160a01b0390951695919392839285926000199181161561010002919091011604801561220f5780601f106121ed57610100808354040283529182019161220f565b820191906000526020600020905b8154815290600101906020018083116121fb575b505091505060006040518083038185875af1925050503d8060008114612251576040519150601f19603f3d011682016040523d82523d6000602084013e612256565b606091505b50915091508115612299576040805186815290517fa04152e2017fefaf7d75b86e3c491d40f690e6936155ca58eacae210f5655e609181900360200190a1611cf1565b6040805186815290517f507a14a7a7f368a6a287e15565b7d56dfe09018c750d5059985077d7a9e584a19181900360200190a15050600301805460ff191690555050565b6000836001600160a01b038116612334576040805162461bcd60e51b8152602060048201526016602482015275139d5b1b081859191c995cdcc81cdc1958da599a595960521b604482015290519081900360640190fd5b600954604080516080810182526001600160a01b03888116825260208083018981528385018981526000606086018190528781526003845295909520845181546001600160a01b031916941693909317835551600183015592518051949650919390926123a8926002850192910190612432565b50606091909101516003909101805460ff19169115159190911790556009805460010190556040805183815290517f49f9b5aa8dbe34efd913cf40354bcd20d1e2ac420da5b766c55801a8bc8daa73916020908290030190a1509392505050565b81548183558181111561242d5760008381526020902061242d9181019083016124b0565b505050565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f1061247357805160ff19168380011785556124a0565b828001600101855582156124a0579182015b828111156124a0578251825591602001919060010190612485565b506124ac9291506124b0565b5090565b610c8b91905b808211156124ac57600081556001016124b656fe4f6e6c79205369676e6572436f6e74726f6c20636f6e74726163742063616e20706572666f726d2074686973207461736b5472616e73616374696f6e2068617320616c7265616479206265656e206578656375746564a265627a7a723158200c57687840d2882587cf840c49ac1f6d9683a926204bab602ee06a7d65801f9364736f6c63430005110032000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000c0000000000000000000000000000000000000000000000000000000000000012000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000001000000000000000000000000a62336f410d2ce40d4fd6b23663a7a80164d2af10000000000000000000000000000000000000000000000000000000000000002000000000000000000000000a62336f410d2ce40d4fd6b23663a7a80164d2af1000000000000000000000000007b003c4d0145b512286494d5ae123aeef29d9e0000000000000000000000000000000000000000000000000000000000000004000000000000000000000000a62336f410d2ce40d4fd6b23663a7a80164d2af1000000000000000000000000281048bf4d3bbbbd38abe184f6b306216b2e06ae000000000000000000000000a3f36a33e66adeb98e08fe1bd96b4c58517c64c40000000000000000000000008a8c076ad2e974b12223fa5a09f62275cfa0c2c0

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

000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000c0000000000000000000000000000000000000000000000000000000000000012000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000001000000000000000000000000a62336f410d2ce40d4fd6b23663a7a80164d2af10000000000000000000000000000000000000000000000000000000000000002000000000000000000000000a62336f410d2ce40d4fd6b23663a7a80164d2af1000000000000000000000000007b003c4d0145b512286494d5ae123aeef29d9e0000000000000000000000000000000000000000000000000000000000000004000000000000000000000000a62336f410d2ce40d4fd6b23663a7a80164d2af1000000000000000000000000281048bf4d3bbbbd38abe184f6b306216b2e06ae000000000000000000000000a3f36a33e66adeb98e08fe1bd96b4c58517c64c40000000000000000000000008a8c076ad2e974b12223fa5a09f62275cfa0c2c0

-----Decoded View---------------
Arg [0] : _primaryOwners (address[]): 0xa62336f410d2ce40d4fd6b23663a7a80164d2af1
Arg [1] : _secondaryOwners (address[]): 0xa62336f410d2ce40d4fd6b23663a7a80164d2af1,0x007b003c4d0145b512286494d5ae123aeef29d9e
Arg [2] : _signers (address[]): 0xa62336f410d2ce40d4fd6b23663a7a80164d2af1,0x281048bf4d3bbbbd38abe184f6b306216b2e06ae,0xa3f36a33e66adeb98e08fe1bd96b4c58517c64c4,0x8a8c076ad2e974b12223fa5a09f62275cfa0c2c0
Arg [3] : _required_confirmations (uint256): 1

-----Encoded View---------------
14 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000080
Arg [1] : 00000000000000000000000000000000000000000000000000000000000000c0
Arg [2] : 0000000000000000000000000000000000000000000000000000000000000120
Arg [3] : 0000000000000000000000000000000000000000000000000000000000000001
Arg [4] : 0000000000000000000000000000000000000000000000000000000000000001
Arg [5] : 000000000000000000000000a62336f410d2ce40d4fd6b23663a7a80164d2af1
Arg [6] : 0000000000000000000000000000000000000000000000000000000000000002
Arg [7] : 000000000000000000000000a62336f410d2ce40d4fd6b23663a7a80164d2af1
Arg [8] : 000000000000000000000000007b003c4d0145b512286494d5ae123aeef29d9e
Arg [9] : 0000000000000000000000000000000000000000000000000000000000000004
Arg [10] : 000000000000000000000000a62336f410d2ce40d4fd6b23663a7a80164d2af1
Arg [11] : 000000000000000000000000281048bf4d3bbbbd38abe184f6b306216b2e06ae
Arg [12] : 000000000000000000000000a3f36a33e66adeb98e08fe1bd96b4c58517c64c4
Arg [13] : 0000000000000000000000008a8c076ad2e974b12223fa5a09f62275cfa0c2c0


Block Transaction Gas Used Reward
Age Block Fee Address BC Fee Address Voting Power Jailed Incoming
Block Uncle Number Difficulty Gas Used Reward
Loading
Loading
Make sure to use the "Vote Down" button for any spammy posts, and the "Vote Up" for interesting conversations.