Contract 0x81067f5faF09b98A8513AE45e764a07e609197ea 1

 

Contract Overview

Balance:
0 BNB

BNB Value:
$0.00

Token:
 
Txn Hash Method
Block
From
To
Value [Txn Fee]
0xf8082a7cb93ef80198371dd1dba138c76ce8cfc4c0d8daf52eca88a1a48ebb86Execute Transact...105684382021-09-02 16:06:3718 days 21 hrs ago0x52807640263bca90986fb61928b25e4f3ad2a545 IN  0x81067f5faf09b98a8513ae45e764a07e609197ea0 BNB0.00138882
0xc03b670e68c32347cb7c032b730bf5f89ae15bc53b15fc4891699492099b6f76Confirm Transact...105682762021-09-02 15:58:3118 days 21 hrs ago0x6d082196ee5124ea665df8bec76a328419fa9489 IN  0x81067f5faf09b98a8513ae45e764a07e609197ea0 BNB0.00027604
0x953fed6356bd0c8c1e17d4ee6f6bec60fbbe9c548a2693b04bb229809775f826Confirm Transact...105672162021-09-02 15:02:2818 days 22 hrs ago0xe804388641803e474443559236c0ddc436b16ffe IN  0x81067f5faf09b98a8513ae45e764a07e609197ea0 BNB0.00027604
0x7db91adb93c7e97487254e1dedb1db6d13682b97500726b93e94a47b41aa8292Confirm Transact...105672062021-09-02 15:01:5818 days 22 hrs ago0x52807640263bca90986fb61928b25e4f3ad2a545 IN  0x81067f5faf09b98a8513ae45e764a07e609197ea0 BNB0.00035104
0xd674b7d9ac77af99f27194f678302f409f311752dadc39352b1ddb900a0f454eSubmit Transacti...105671132021-09-02 14:57:1918 days 22 hrs ago0x52807640263bca90986fb61928b25e4f3ad2a545 IN  0x81067f5faf09b98a8513ae45e764a07e609197ea0 BNB0.000488785
0x5452d977bb1adcf7f3d8138eb3c0ef3c4fb32bede0a2fb0c15f91edd6b42f5faConfirm Transact...95533162021-07-28 17:56:2054 days 19 hrs ago0x6d082196ee5124ea665df8bec76a328419fa9489 IN  0x81067f5faf09b98a8513ae45e764a07e609197ea0 BNB0.00013037523
0x269f1764a19cfb1bddf71bd30010dae241ddf70e89adbc750a000abc0f55a984Execute Transact...95531952021-07-28 17:49:1754 days 19 hrs ago0x52807640263bca90986fb61928b25e4f3ad2a545 IN  0x81067f5faf09b98a8513ae45e764a07e609197ea0 BNB0.00078347382
0xa042b755fa49a5cd4936012d1a0107b039149375914bfc6db92e244c0c105849Execute Transact...95531262021-07-28 17:44:5354 days 19 hrs ago0x52807640263bca90986fb61928b25e4f3ad2a545 IN  0x81067f5faf09b98a8513ae45e764a07e609197ea0 BNB0.00050082966
0xfa9f87d418b728734c27d87259f5e4753acc8ce9be8d3ab4a6e2f9e7ee327ef9Confirm Transact...95530942021-07-28 17:42:5754 days 19 hrs ago0x6d082196ee5124ea665df8bec76a328419fa9489 IN  0x81067f5faf09b98a8513ae45e764a07e609197ea0 BNB0.00027659208
0x7000b39027f1cd8f5728c6593abc0b5789cdc3a52f29b8338e0ebbf41d92ed1cExecute Transact...95528522021-07-28 17:26:4254 days 19 hrs ago0x52807640263bca90986fb61928b25e4f3ad2a545 IN  0x81067f5faf09b98a8513ae45e764a07e609197ea0 BNB0.00027587
0xe5add228c245e5592629aa2fc894aa6a4f40d3bdd14cbc7f578cee1d1dbbf567Execute Transact...95527442021-07-28 17:20:1954 days 19 hrs ago0x52807640263bca90986fb61928b25e4f3ad2a545 IN  0x81067f5faf09b98a8513ae45e764a07e609197ea0 BNB0.00027587
0x57f4e2b4664024b3cc765eaf758f943712fc3fabba9f9a0f518b770213776d20Confirm Transact...95526812021-07-28 17:16:5854 days 20 hrs ago0xe804388641803e474443559236c0ddc436b16ffe IN  0x81067f5faf09b98a8513ae45e764a07e609197ea0 BNB0.00027659208
0xbb610edb28fc017a84a4c16b65c1d2f97c08f1900938569ea493dfd68790d331Confirm Transact...95524122021-07-28 17:02:5654 days 20 hrs ago0x52807640263bca90986fb61928b25e4f3ad2a545 IN  0x81067f5faf09b98a8513ae45e764a07e609197ea0 BNB0.00035174208
0x3518d031d2b0e4fa64248a30a27ea5a3b9dae4a2232a028e602d0a4b7209d0faSubmit Transacti...95523732021-07-28 17:00:5954 days 20 hrs ago0x52807640263bca90986fb61928b25e4f3ad2a545 IN  0x81067f5faf09b98a8513ae45e764a07e609197ea0 BNB0.00097769
0xc5c627d96a06e9f10df089e5a69666431f083117450331b3bac1c356428af255Execute Transact...95522752021-07-28 16:56:0254 days 20 hrs ago0x52807640263bca90986fb61928b25e4f3ad2a545 IN  0x81067f5faf09b98a8513ae45e764a07e609197ea0 BNB0.00156382
0x59c5bfc840a1a525bc4b585702c124a4647d7f5ab844ebdf620b2f309deff5bbExecute Transact...95478352021-07-28 12:38:5455 days 38 mins ago0x52807640263bca90986fb61928b25e4f3ad2a545 IN  0x81067f5faf09b98a8513ae45e764a07e609197ea0 BNB0.00078191
0x70db050f03d6c9dbed404159c20cc4fad2ce532148979b8c7752afc6d174b566Confirm Transact...95475782021-07-28 12:25:2855 days 52 mins ago0x6d082196ee5124ea665df8bec76a328419fa9489 IN  0x81067f5faf09b98a8513ae45e764a07e609197ea0 BNB0.00027604
0x5af86ef557ae617ede007c52fa278a0ef5d30bd9e00acc36bf1ec9675c0bcf81Confirm Transact...95471542021-07-28 12:01:5155 days 1 hr ago0xe804388641803e474443559236c0ddc436b16ffe IN  0x81067f5faf09b98a8513ae45e764a07e609197ea0 BNB0.00027604
0xf9c79e7693740ef31c813654280547056eb872417484f6cb7161f6c9bd7aaaa3Confirm Transact...95467732021-07-28 11:41:0455 days 1 hr ago0x52807640263bca90986fb61928b25e4f3ad2a545 IN  0x81067f5faf09b98a8513ae45e764a07e609197ea0 BNB0.000491456
0xb8cc0a4c9c06715fb7b56469bcb525d7121df9166ed938b225e9c778ff8fe21dSubmit Transacti...95467432021-07-28 11:39:3055 days 1 hr ago0x52807640263bca90986fb61928b25e4f3ad2a545 IN  0x81067f5faf09b98a8513ae45e764a07e609197ea0 BNB0.000488905
0x8648a3ca75257de16e4f7b458610160f92e51937fa0684efc0ff315d5e3d1072Execute Transact...95466622021-07-28 11:35:1855 days 1 hr ago0x52807640263bca90986fb61928b25e4f3ad2a545 IN  0x81067f5faf09b98a8513ae45e764a07e609197ea0 BNB0.00121174
0x1da7e4251f880f8ffe7383984c89091eff4ffc2455d6ec9fa807993dc1da1320Confirm Transact...94737302021-07-25 19:31:5157 days 17 hrs ago0xe804388641803e474443559236c0ddc436b16ffe IN  0x81067f5faf09b98a8513ae45e764a07e609197ea0 BNB0.00027604
0x1be27bfe22165cf80b5e53e666789f04c86b3e9d57f0fb5b4dcfebc2a3ced4ddConfirm Transact...94735302021-07-25 19:21:5157 days 17 hrs ago0x6d082196ee5124ea665df8bec76a328419fa9489 IN  0x81067f5faf09b98a8513ae45e764a07e609197ea0 BNB0.00027604
0xaa8053815dac60a38afc09389a58e7b5eee34864e44dd0ef04a7e2b81715ac75Confirm Transact...94733892021-07-25 19:14:4857 days 18 hrs ago0x52807640263bca90986fb61928b25e4f3ad2a545 IN  0x81067f5faf09b98a8513ae45e764a07e609197ea0 BNB0.00035104
0x95cfd9c7eec911eb870308d1b0c9bfd79a342572b7679bdd4fe858bff6857d31Submit Transacti...94733312021-07-25 19:11:5357 days 18 hrs ago0x52807640263bca90986fb61928b25e4f3ad2a545 IN  0x81067f5faf09b98a8513ae45e764a07e609197ea0 BNB0.000489145
[ Download CSV Export 
Parent Txn Hash Block From To Value
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
MultiSigWallet

Compiler Version
v0.8.4+commit.c7e474f2

Optimization Enabled:
Yes with 800 runs

Other Settings:
default evmVersion

Contract Source Code (Solidity Standard Json-Input format)

File 1 of 4 : MultiSigWallet.sol
// SPDX-License-Identifier: UNLICENSED
pragma solidity ^0.8.4;

import '@openzeppelin/contracts/token/ERC20/IERC20.sol';
import '@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol';

contract MultiSigWallet {
    using SafeERC20 for IERC20;

    // ERC20 basic token contract being held
    IERC20 immutable private _token;

    uint8 decimals;

    event Deposit(address indexed sender, uint amount, uint balance);
    event SubmitTransaction(
        address indexed owner,
        uint indexed txIndex,
        address indexed to,
        uint value,
        bytes data
    );
    event ConfirmTransaction(address indexed owner, uint indexed txIndex);
    event RevokeConfirmation(address indexed owner, uint indexed txIndex);
    event ExecuteTransaction(address indexed owner, uint indexed txIndex);

    address[] public owners;
    mapping(address => bool) public isOwner;
    uint public numConfirmationsRequired;

    struct Transaction {
        address to;
        uint value;
        bytes data;
        bool executed;
        uint numConfirmations;
    }

    // mapping from tx index => owner => bool
    mapping(uint => mapping(address => bool)) public isConfirmed;

    Transaction[] public transactions;

    modifier onlyOwner() {
        require(isOwner[msg.sender], "not owner");
        _;
    }

    modifier txExists(uint _txIndex) {
        require(_txIndex < transactions.length, "tx does not exist");
        _;
    }

    modifier notExecuted(uint _txIndex) {
        require(!transactions[_txIndex].executed, "tx already executed");
        _;
    }

    modifier notConfirmed(uint _txIndex) {
        require(!isConfirmed[_txIndex][msg.sender], "tx already confirmed");
        _;
    }

    constructor(IERC20 token_, uint8 decimals_, address[] memory _owners, uint _numConfirmationsRequired) {
        require(_owners.length > 0, "owners required");
        require(
            _numConfirmationsRequired > 0 && _numConfirmationsRequired <= _owners.length,
            "invalid number of required confirmations"
        );

        for (uint i = 0; i < _owners.length; i++) {
            address owner = _owners[i];

            require(owner != address(0), "invalid owner");
            require(!isOwner[owner], "owner not unique");

            isOwner[owner] = true;
            owners.push(owner);
        }

        _token = token_;
        decimals = decimals_;
        numConfirmationsRequired = _numConfirmationsRequired;
    }

    receive() payable external {
        emit Deposit(msg.sender, msg.value, address(this).balance);
    }

    function submitTransaction(address _to, uint _value, bytes memory _data)
    public
    onlyOwner
    {
        uint txIndex = transactions.length;

        transactions.push(Transaction({
        to: _to,
        value: _value,
        data: _data,
        executed: false,
        numConfirmations: 0
        }));

        emit SubmitTransaction(msg.sender, txIndex, _to, _value, _data);
    }

    function confirmTransaction(uint _txIndex)
    public
    onlyOwner
    txExists(_txIndex)
    notExecuted(_txIndex)
    notConfirmed(_txIndex)
    {
        Transaction storage transaction = transactions[_txIndex];
        transaction.numConfirmations += 1;
        isConfirmed[_txIndex][msg.sender] = true;

        emit ConfirmTransaction(msg.sender, _txIndex);
    }

    function token() public view virtual returns (IERC20) {
        return _token;
    }

    function executeTransaction(uint _txIndex)
    public
    onlyOwner
    txExists(_txIndex)
    notExecuted(_txIndex)
    {
        Transaction storage transaction = transactions[_txIndex];

        require(
            transaction.numConfirmations >= numConfirmationsRequired,
            "cannot execute tx"
        );

        uint256 amount = token().balanceOf(address(this));
        require(amount >= transaction.value, "Not enough token in contract");

        token().safeTransfer(transaction.to, transaction.value * (10 ** decimals));
        transaction.executed = true;

        emit ExecuteTransaction(msg.sender, _txIndex);
    }

    function revokeConfirmation(uint _txIndex)
    public
    onlyOwner
    txExists(_txIndex)
    notExecuted(_txIndex)
    {
        Transaction storage transaction = transactions[_txIndex];

        require(isConfirmed[_txIndex][msg.sender], "tx not confirmed");

        transaction.numConfirmations -= 1;
        isConfirmed[_txIndex][msg.sender] = false;

        emit RevokeConfirmation(msg.sender, _txIndex);
    }

    function getOwners() public view returns (address[] memory) {
        return owners;
    }

    function getTransactionCount() public view returns (uint) {
        return transactions.length;
    }

    function getTransaction(uint _txIndex)
    public
    view
    returns (address to, uint value, bytes memory data, bool executed, uint numConfirmations)
    {
        Transaction storage transaction = transactions[_txIndex];

        return (
        transaction.to,
        transaction.value,
        transaction.data,
        transaction.executed,
        transaction.numConfirmations
        );
    }
}

File 2 of 4 : IERC20.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

/**
 * @dev Interface of the ERC20 standard as defined in the EIP.
 */
interface IERC20 {
    /**
     * @dev Returns the amount of tokens in existence.
     */
    function totalSupply() external view returns (uint256);

    /**
     * @dev Returns the amount of tokens owned by `account`.
     */
    function balanceOf(address account) external view returns (uint256);

    /**
     * @dev Moves `amount` tokens from the caller's account to `recipient`.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * Emits a {Transfer} event.
     */
    function transfer(address recipient, uint256 amount) external returns (bool);

    /**
     * @dev Returns the remaining number of tokens that `spender` will be
     * allowed to spend on behalf of `owner` through {transferFrom}. This is
     * zero by default.
     *
     * This value changes when {approve} or {transferFrom} are called.
     */
    function allowance(address owner, address spender) external view returns (uint256);

    /**
     * @dev Sets `amount` as the allowance of `spender` over the caller's tokens.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * IMPORTANT: Beware that changing an allowance with this method brings the risk
     * that someone may use both the old and the new allowance by unfortunate
     * transaction ordering. One possible solution to mitigate this race
     * condition is to first reduce the spender's allowance to 0 and set the
     * desired value afterwards:
     * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729
     *
     * Emits an {Approval} event.
     */
    function approve(address spender, uint256 amount) external returns (bool);

    /**
     * @dev Moves `amount` tokens from `sender` to `recipient` using the
     * allowance mechanism. `amount` is then deducted from the caller's
     * allowance.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * Emits a {Transfer} event.
     */
    function transferFrom(address sender, address recipient, uint256 amount) external returns (bool);

    /**
     * @dev Emitted when `value` tokens are moved from one account (`from`) to
     * another (`to`).
     *
     * Note that `value` may be zero.
     */
    event Transfer(address indexed from, address indexed to, uint256 value);

    /**
     * @dev Emitted when the allowance of a `spender` for an `owner` is set by
     * a call to {approve}. `value` is the new allowance.
     */
    event Approval(address indexed owner, address indexed spender, uint256 value);
}

File 3 of 4 : SafeERC20.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

import "../IERC20.sol";
import "../../../utils/Address.sol";

/**
 * @title SafeERC20
 * @dev Wrappers around ERC20 operations that throw on failure (when the token
 * contract returns false). Tokens that return no value (and instead revert or
 * throw on failure) are also supported, non-reverting calls are assumed to be
 * successful.
 * To use this library you can add a `using SafeERC20 for IERC20;` statement to your contract,
 * which allows you to call the safe operations as `token.safeTransfer(...)`, etc.
 */
library SafeERC20 {
    using Address for address;

    function safeTransfer(IERC20 token, address to, uint256 value) internal {
        _callOptionalReturn(token, abi.encodeWithSelector(token.transfer.selector, to, value));
    }

    function safeTransferFrom(IERC20 token, address from, address to, uint256 value) internal {
        _callOptionalReturn(token, abi.encodeWithSelector(token.transferFrom.selector, from, to, value));
    }

    /**
     * @dev Deprecated. This function has issues similar to the ones found in
     * {IERC20-approve}, and its usage is discouraged.
     *
     * Whenever possible, use {safeIncreaseAllowance} and
     * {safeDecreaseAllowance} instead.
     */
    function safeApprove(IERC20 token, address spender, uint256 value) internal {
        // safeApprove should only be called when setting an initial allowance,
        // or when resetting it to zero. To increase and decrease it, use
        // 'safeIncreaseAllowance' and 'safeDecreaseAllowance'
        // solhint-disable-next-line max-line-length
        require((value == 0) || (token.allowance(address(this), spender) == 0),
            "SafeERC20: approve from non-zero to non-zero allowance"
        );
        _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, value));
    }

    function safeIncreaseAllowance(IERC20 token, address spender, uint256 value) internal {
        uint256 newAllowance = token.allowance(address(this), spender) + value;
        _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance));
    }

    function safeDecreaseAllowance(IERC20 token, address spender, uint256 value) internal {
        unchecked {
            uint256 oldAllowance = token.allowance(address(this), spender);
            require(oldAllowance >= value, "SafeERC20: decreased allowance below zero");
            uint256 newAllowance = oldAllowance - value;
            _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance));
        }
    }

    /**
     * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement
     * on the return value: the return value is optional (but if data is returned, it must not be false).
     * @param token The token targeted by the call.
     * @param data The call data (encoded using abi.encode or one of its variants).
     */
    function _callOptionalReturn(IERC20 token, bytes memory data) private {
        // We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since
        // we're implementing it ourselves. We use {Address.functionCall} to perform this call, which verifies that
        // the target address contains contract code and also asserts for success in the low-level call.

        bytes memory returndata = address(token).functionCall(data, "SafeERC20: low-level call failed");
        if (returndata.length > 0) { // Return data is optional
            // solhint-disable-next-line max-line-length
            require(abi.decode(returndata, (bool)), "SafeERC20: ERC20 operation did not succeed");
        }
    }
}

File 4 of 4 : Address.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

/**
 * @dev Collection of functions related to the address type
 */
library Address {
    /**
     * @dev Returns true if `account` is a contract.
     *
     * [IMPORTANT]
     * ====
     * It is unsafe to assume that an address for which this function returns
     * false is an externally-owned account (EOA) and not a contract.
     *
     * Among others, `isContract` will return false for the following
     * types of addresses:
     *
     *  - an externally-owned account
     *  - a contract in construction
     *  - an address where a contract will be created
     *  - an address where a contract lived, but was destroyed
     * ====
     */
    function isContract(address account) internal view returns (bool) {
        // This method relies on extcodesize, which returns 0 for contracts in
        // construction, since the code is only stored at the end of the
        // constructor execution.

        uint256 size;
        // solhint-disable-next-line no-inline-assembly
        assembly { size := extcodesize(account) }
        return size > 0;
    }

    /**
     * @dev Replacement for Solidity's `transfer`: sends `amount` wei to
     * `recipient`, forwarding all available gas and reverting on errors.
     *
     * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost
     * of certain opcodes, possibly making contracts go over the 2300 gas limit
     * imposed by `transfer`, making them unable to receive funds via
     * `transfer`. {sendValue} removes this limitation.
     *
     * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more].
     *
     * IMPORTANT: because control is transferred to `recipient`, care must be
     * taken to not create reentrancy vulnerabilities. Consider using
     * {ReentrancyGuard} or the
     * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].
     */
    function sendValue(address payable recipient, uint256 amount) internal {
        require(address(this).balance >= amount, "Address: insufficient balance");

        // solhint-disable-next-line avoid-low-level-calls, avoid-call-value
        (bool success, ) = recipient.call{ value: amount }("");
        require(success, "Address: unable to send value, recipient may have reverted");
    }

    /**
     * @dev Performs a Solidity function call using a low level `call`. A
     * plain`call` is an unsafe replacement for a function call: use this
     * function instead.
     *
     * If `target` reverts with a revert reason, it is bubbled up by this
     * function (like regular Solidity function calls).
     *
     * Returns the raw returned data. To convert to the expected return value,
     * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`].
     *
     * Requirements:
     *
     * - `target` must be a contract.
     * - calling `target` with `data` must not revert.
     *
     * _Available since v3.1._
     */
    function functionCall(address target, bytes memory data) internal returns (bytes memory) {
      return functionCall(target, data, "Address: low-level call failed");
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with
     * `errorMessage` as a fallback revert reason when `target` reverts.
     *
     * _Available since v3.1._
     */
    function functionCall(address target, bytes memory data, string memory errorMessage) internal returns (bytes memory) {
        return functionCallWithValue(target, data, 0, errorMessage);
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
     * but also transferring `value` wei to `target`.
     *
     * Requirements:
     *
     * - the calling contract must have an ETH balance of at least `value`.
     * - the called Solidity function must be `payable`.
     *
     * _Available since v3.1._
     */
    function functionCallWithValue(address target, bytes memory data, uint256 value) internal returns (bytes memory) {
        return functionCallWithValue(target, data, value, "Address: low-level call with value failed");
    }

    /**
     * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but
     * with `errorMessage` as a fallback revert reason when `target` reverts.
     *
     * _Available since v3.1._
     */
    function functionCallWithValue(address target, bytes memory data, uint256 value, string memory errorMessage) internal returns (bytes memory) {
        require(address(this).balance >= value, "Address: insufficient balance for call");
        require(isContract(target), "Address: call to non-contract");

        // solhint-disable-next-line avoid-low-level-calls
        (bool success, bytes memory returndata) = target.call{ value: value }(data);
        return _verifyCallResult(success, returndata, errorMessage);
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
     * but performing a static call.
     *
     * _Available since v3.3._
     */
    function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {
        return functionStaticCall(target, data, "Address: low-level static call failed");
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
     * but performing a static call.
     *
     * _Available since v3.3._
     */
    function functionStaticCall(address target, bytes memory data, string memory errorMessage) internal view returns (bytes memory) {
        require(isContract(target), "Address: static call to non-contract");

        // solhint-disable-next-line avoid-low-level-calls
        (bool success, bytes memory returndata) = target.staticcall(data);
        return _verifyCallResult(success, returndata, errorMessage);
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
     * but performing a delegate call.
     *
     * _Available since v3.4._
     */
    function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) {
        return functionDelegateCall(target, data, "Address: low-level delegate call failed");
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
     * but performing a delegate call.
     *
     * _Available since v3.4._
     */
    function functionDelegateCall(address target, bytes memory data, string memory errorMessage) internal returns (bytes memory) {
        require(isContract(target), "Address: delegate call to non-contract");

        // solhint-disable-next-line avoid-low-level-calls
        (bool success, bytes memory returndata) = target.delegatecall(data);
        return _verifyCallResult(success, returndata, errorMessage);
    }

    function _verifyCallResult(bool success, bytes memory returndata, string memory errorMessage) private pure returns(bytes memory) {
        if (success) {
            return returndata;
        } else {
            // Look for revert reason and bubble it up if present
            if (returndata.length > 0) {
                // The easiest way to bubble the revert reason is using memory via assembly

                // solhint-disable-next-line no-inline-assembly
                assembly {
                    let returndata_size := mload(returndata)
                    revert(add(32, returndata), returndata_size)
                }
            } else {
                revert(errorMessage);
            }
        }
    }
}

Settings
{
  "optimizer": {
    "enabled": true,
    "runs": 800
  },
  "outputSelection": {
    "*": {
      "*": [
        "evm.bytecode",
        "evm.deployedBytecode",
        "abi"
      ]
    }
  },
  "libraries": {}
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"contract IERC20","name":"token_","type":"address"},{"internalType":"uint8","name":"decimals_","type":"uint8"},{"internalType":"address[]","name":"_owners","type":"address[]"},{"internalType":"uint256","name":"_numConfirmationsRequired","type":"uint256"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"uint256","name":"txIndex","type":"uint256"}],"name":"ConfirmTransaction","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"sender","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"balance","type":"uint256"}],"name":"Deposit","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"uint256","name":"txIndex","type":"uint256"}],"name":"ExecuteTransaction","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"uint256","name":"txIndex","type":"uint256"}],"name":"RevokeConfirmation","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"uint256","name":"txIndex","type":"uint256"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"},{"indexed":false,"internalType":"bytes","name":"data","type":"bytes"}],"name":"SubmitTransaction","type":"event"},{"inputs":[{"internalType":"uint256","name":"_txIndex","type":"uint256"}],"name":"confirmTransaction","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_txIndex","type":"uint256"}],"name":"executeTransaction","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"getOwners","outputs":[{"internalType":"address[]","name":"","type":"address[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_txIndex","type":"uint256"}],"name":"getTransaction","outputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"},{"internalType":"bool","name":"executed","type":"bool"},{"internalType":"uint256","name":"numConfirmations","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getTransactionCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"address","name":"","type":"address"}],"name":"isConfirmed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"isOwner","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"numConfirmationsRequired","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"owners","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_txIndex","type":"uint256"}],"name":"revokeConfirmation","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_value","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"submitTransaction","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"token","outputs":[{"internalType":"contract IERC20","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"transactions","outputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"},{"internalType":"bool","name":"executed","type":"bool"},{"internalType":"uint256","name":"numConfirmations","type":"uint256"}],"stateMutability":"view","type":"function"},{"stateMutability":"payable","type":"receive"}]

60a06040523480156200001157600080fd5b5060405162001ace38038062001ace833981016040819052620000349162000295565b60008251116200007d5760405162461bcd60e51b815260206004820152600f60248201526e1bdddb995c9cc81c995c5d5a5c9959608a1b60448201526064015b60405180910390fd5b6000811180156200008f575081518111155b620000ee5760405162461bcd60e51b815260206004820152602860248201527f696e76616c6964206e756d626572206f6620726571756972656420636f6e6669604482015267726d6174696f6e7360c01b606482015260840162000074565b60005b8251811015620002515760008382815181106200011e57634e487b7160e01b600052603260045260246000fd5b6020026020010151905060006001600160a01b0316816001600160a01b031614156200017d5760405162461bcd60e51b815260206004820152600d60248201526c34b73b30b634b21037bbb732b960991b604482015260640162000074565b6001600160a01b03811660009081526002602052604090205460ff1615620001db5760405162461bcd60e51b815260206004820152601060248201526f6f776e6572206e6f7420756e6971756560801b604482015260640162000074565b6001600160a01b03166000818152600260205260408120805460ff191660019081179091558054808201825591527fb10e2d527612073b26eecdfd717e6a320cf44b4afac2b0732d9fcbe2b7fa0cf60180546001600160a01b0319169091179055806200024881620003a1565b915050620000f1565b5060609390931b6001600160601b031916608052506000805460ff191660ff92909216919091179055600355620003f8565b80516200029081620003df565b919050565b60008060008060808587031215620002ab578384fd5b8451620002b881620003df565b8094505060208086015160ff81168114620002d1578485fd5b60408701519094506001600160401b0380821115620002ee578485fd5b818801915088601f83011262000302578485fd5b815181811115620003175762000317620003c9565b8060051b604051601f19603f830116810181811085821117156200033f576200033f620003c9565b604052828152858101935084860182860187018d10156200035e578889fd5b8895505b838610156200038b57620003768162000283565b85526001959095019493860193860162000362565b5060609a909a0151989b979a5050505050505050565b6000600019821415620003c257634e487b7160e01b81526011600452602481fd5b5060010190565b634e487b7160e01b600052604160045260246000fd5b6001600160a01b0381168114620003f557600080fd5b50565b60805160601c6116a9620004256000396000818161030d01528181610d1d0152610e3d01526116a96000f3fe6080604052600436106100d65760003560e01c80639ace38c21161007f578063c642747411610059578063c6427474146102a8578063d0549b85146102c8578063ee22610b146102de578063fc0c546a146102fe57600080fd5b80639ace38c214610246578063a0e67e2b14610266578063c01a8c841461028857600080fd5b80632f54bf6e116100b05780632f54bf6e1461019a57806333ea3dc8146101da57806380f59a651461020b57600080fd5b8063025e7c271461011c57806320ea8d86146101595780632e7700f01461017b57600080fd5b36610117576040805134815247602082015233917f90890809c654f11d6e72a28fa60149770a0d11ec6c92319d6ceb2bb0a4ea1a15910160405180910390a2005b600080fd5b34801561012857600080fd5b5061013c610137366004611346565b610331565b6040516001600160a01b0390911681526020015b60405180910390f35b34801561016557600080fd5b50610179610174366004611346565b61035b565b005b34801561018757600080fd5b506005545b604051908152602001610150565b3480156101a657600080fd5b506101ca6101b5366004611246565b60026020526000908152604090205460ff1681565b6040519015158152602001610150565b3480156101e657600080fd5b506101fa6101f5366004611346565b610571565b6040516101509594939291906113e9565b34801561021757600080fd5b506101ca610226366004611376565b600460209081526000928352604080842090915290825290205460ff1681565b34801561025257600080fd5b506101fa610261366004611346565b61067a565b34801561027257600080fd5b5061027b610753565b6040516101509190611425565b34801561029457600080fd5b506101796102a3366004611346565b6107b5565b3480156102b457600080fd5b506101796102c3366004611260565b6109ce565b3480156102d457600080fd5b5061018c60035481565b3480156102ea57600080fd5b506101796102f9366004611346565b610b82565b34801561030a57600080fd5b507f000000000000000000000000000000000000000000000000000000000000000061013c565b6001818154811061034157600080fd5b6000918252602090912001546001600160a01b0316905081565b3360009081526002602052604090205460ff166103ab5760405162461bcd60e51b81526020600482015260096024820152683737ba1037bbb732b960b91b60448201526064015b60405180910390fd5b600554819081106103f25760405162461bcd60e51b81526020600482015260116024820152701d1e08191bd95cc81b9bdd08195e1a5cdd607a1b60448201526064016103a2565b816005818154811061041457634e487b7160e01b600052603260045260246000fd5b600091825260209091206003600590920201015460ff161561046e5760405162461bcd60e51b81526020600482015260136024820152721d1e08185b1c9958591e48195e1958dd5d1959606a1b60448201526064016103a2565b60006005848154811061049157634e487b7160e01b600052603260045260246000fd5b600091825260208083208784526004825260408085203386529092529220546005909102909101915060ff166105095760405162461bcd60e51b815260206004820152601060248201527f7478206e6f7420636f6e6669726d65640000000000000000000000000000000060448201526064016103a2565b600181600401600082825461051e91906115c5565b90915550506000848152600460209081526040808320338085529252808320805460ff191690555186927ff0dca620e2e81f7841d07bcc105e1704fb01475b278a9d4c236e1c62945edd5591a350505050565b600080606060008060006005878154811061059c57634e487b7160e01b600052603260045260246000fd5b6000918252602090912060059091020180546001820154600383015460048401546002850180549596506001600160a01b039094169492939260ff9092169183906105e69061160c565b80601f01602080910402602001604051908101604052809291908181526020018280546106129061160c565b801561065f5780601f106106345761010080835404028352916020019161065f565b820191906000526020600020905b81548152906001019060200180831161064257829003601f168201915b50505050509250955095509550955095505091939590929450565b6005818154811061068a57600080fd5b60009182526020909120600590910201805460018201546002830180546001600160a01b0390931694509092916106c09061160c565b80601f01602080910402602001604051908101604052809291908181526020018280546106ec9061160c565b80156107395780601f1061070e57610100808354040283529160200191610739565b820191906000526020600020905b81548152906001019060200180831161071c57829003601f168201915b505050506003830154600490930154919260ff1691905085565b606060018054806020026020016040519081016040528092919081815260200182805480156107ab57602002820191906000526020600020905b81546001600160a01b0316815260019091019060200180831161078d575b5050505050905090565b3360009081526002602052604090205460ff166108005760405162461bcd60e51b81526020600482015260096024820152683737ba1037bbb732b960b91b60448201526064016103a2565b600554819081106108475760405162461bcd60e51b81526020600482015260116024820152701d1e08191bd95cc81b9bdd08195e1a5cdd607a1b60448201526064016103a2565b816005818154811061086957634e487b7160e01b600052603260045260246000fd5b600091825260209091206003600590920201015460ff16156108c35760405162461bcd60e51b81526020600482015260136024820152721d1e08185b1c9958591e48195e1958dd5d1959606a1b60448201526064016103a2565b6000838152600460209081526040808320338452909152902054839060ff161561092f5760405162461bcd60e51b815260206004820152601460248201527f747820616c726561647920636f6e6669726d656400000000000000000000000060448201526064016103a2565b60006005858154811061095257634e487b7160e01b600052603260045260246000fd5b906000526020600020906005020190506001816004016000828254610977919061149e565b90915550506000858152600460209081526040808320338085529252808320805460ff191660011790555187927f5cbe105e36805f7820e291f799d5794ff948af2a5f664e580382defb6339004191a35050505050565b3360009081526002602052604090205460ff16610a195760405162461bcd60e51b81526020600482015260096024820152683737ba1037bbb732b960b91b60448201526064016103a2565b600580546040805160a0810182526001600160a01b03878116825260208083018881529383018781526000606085018190526080850181905260018701885587905283517f036b6384b5eca791c62761152d0c79bb0604c104a5fb6f4eb0703f3154bb3db097870297880180547fffffffffffffffffffffffff0000000000000000000000000000000000000000169190941617835593517f036b6384b5eca791c62761152d0c79bb0604c104a5fb6f4eb0703f3154bb3db187015592518051949592949193610b0e937f036b6384b5eca791c62761152d0c79bb0604c104a5fb6f4eb0703f3154bb3db20192910190611191565b50606082015160038201805460ff19169115159190911790556080909101516004909101556040516001600160a01b03851690829033907fd5a05bf70715ad82a09a756320284a1b54c9ff74cd0f8cce6219e79b563fe59d90610b749088908890611485565b60405180910390a450505050565b3360009081526002602052604090205460ff16610bcd5760405162461bcd60e51b81526020600482015260096024820152683737ba1037bbb732b960b91b60448201526064016103a2565b60055481908110610c145760405162461bcd60e51b81526020600482015260116024820152701d1e08191bd95cc81b9bdd08195e1a5cdd607a1b60448201526064016103a2565b8160058181548110610c3657634e487b7160e01b600052603260045260246000fd5b600091825260209091206003600590920201015460ff1615610c905760405162461bcd60e51b81526020600482015260136024820152721d1e08185b1c9958591e48195e1958dd5d1959606a1b60448201526064016103a2565b600060058481548110610cb357634e487b7160e01b600052603260045260246000fd5b9060005260206000209060050201905060035481600401541015610d195760405162461bcd60e51b815260206004820152601160248201527f63616e6e6f74206578656375746520747800000000000000000000000000000060448201526064016103a2565b60007f00000000000000000000000000000000000000000000000000000000000000006040516370a0823160e01b81523060048201526001600160a01b0391909116906370a082319060240160206040518083038186803b158015610d7d57600080fd5b505afa158015610d91573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610db5919061135e565b90508160010154811015610e0b5760405162461bcd60e51b815260206004820152601c60248201527f4e6f7420656e6f75676820746f6b656e20696e20636f6e74726163740000000060448201526064016103a2565b8154600054610e6c916001600160a01b031690610e2c9060ff16600a6114f9565b8460010154610e3b91906115a6565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169190610eaf565b60038201805460ff19166001179055604051859033907f5445f318f4f5fcfb66592e68e0cc5822aa15664039bd5f0ffde24c5a8142b1ac90600090a35050505050565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1663a9059cbb60e01b179052610f16908490610f1b565b505050565b6000610f70826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b03166110009092919063ffffffff16565b805190915015610f165780806020019051810190610f8e9190611326565b610f165760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f7420737563636565640000000000000000000000000000000000000000000060648201526084016103a2565b606061100f8484600085611019565b90505b9392505050565b6060824710156110915760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f60448201527f722063616c6c000000000000000000000000000000000000000000000000000060648201526084016103a2565b843b6110df5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e747261637400000060448201526064016103a2565b600080866001600160a01b031685876040516110fb91906113cd565b60006040518083038185875af1925050503d8060008114611138576040519150601f19603f3d011682016040523d82523d6000602084013e61113d565b606091505b509150915061114d828286611158565b979650505050505050565b60608315611167575081611012565b8251156111775782518084602001fd5b8160405162461bcd60e51b81526004016103a29190611472565b82805461119d9061160c565b90600052602060002090601f0160209004810192826111bf5760008555611205565b82601f106111d857805160ff1916838001178555611205565b82800160010185558215611205579182015b828111156112055782518255916020019190600101906111ea565b50611211929150611215565b5090565b5b808211156112115760008155600101611216565b80356001600160a01b038116811461124157600080fd5b919050565b600060208284031215611257578081fd5b6110128261122a565b600080600060608486031215611274578182fd5b61127d8461122a565b925060208401359150604084013567ffffffffffffffff808211156112a0578283fd5b818601915086601f8301126112b3578283fd5b8135818111156112c5576112c561165d565b604051601f8201601f19908116603f011681019083821181831017156112ed576112ed61165d565b81604052828152896020848701011115611305578586fd5b82602086016020830137856020848301015280955050505050509250925092565b600060208284031215611337578081fd5b81518015158114611012578182fd5b600060208284031215611357578081fd5b5035919050565b60006020828403121561136f578081fd5b5051919050565b60008060408385031215611388578182fd5b823591506113986020840161122a565b90509250929050565b600081518084526113b98160208601602086016115dc565b601f01601f19169290920160200192915050565b600082516113df8184602087016115dc565b9190910192915050565b6001600160a01b038616815284602082015260a06040820152600061141160a08301866113a1565b931515606083015250608001529392505050565b6020808252825182820181905260009190848201906040850190845b818110156114665783516001600160a01b031683529284019291840191600101611441565b50909695505050505050565b60208152600061101260208301846113a1565b82815260406020820152600061100f60408301846113a1565b600082198211156114b1576114b1611647565b500190565b600181815b808511156114f15781600019048211156114d7576114d7611647565b808516156114e457918102915b93841c93908002906114bb565b509250929050565b600061101260ff841683600082611512575060016115a0565b8161151f575060006115a0565b8160018114611535576002811461153f5761155b565b60019150506115a0565b60ff84111561155057611550611647565b50506001821b6115a0565b5060208310610133831016604e8410600b841016171561157e575081810a6115a0565b61158883836114b6565b806000190482111561159c5761159c611647565b0290505b92915050565b60008160001904831182151516156115c0576115c0611647565b500290565b6000828210156115d7576115d7611647565b500390565b60005b838110156115f75781810151838201526020016115df565b83811115611606576000848401525b50505050565b600181811c9082168061162057607f821691505b6020821081141561164157634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052604160045260246000fdfea264697066735822122016931295be42305c51b9f2e5121cc41b3293c27f755b20e9549c41d3abf4d45064736f6c63430008040033000000000000000000000000bbd1fbccba8038bb2f3ae15a5ed301bb89a64291000000000000000000000000000000000000000000000000000000000000000900000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000003000000000000000000000000000000000000000000000000000000000000000300000000000000000000000052807640263bca90986fb61928b25e4f3ad2a545000000000000000000000000e804388641803e474443559236c0ddc436b16ffe0000000000000000000000006d082196ee5124ea665df8bec76a328419fa9489

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

000000000000000000000000bbd1fbccba8038bb2f3ae15a5ed301bb89a64291000000000000000000000000000000000000000000000000000000000000000900000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000003000000000000000000000000000000000000000000000000000000000000000300000000000000000000000052807640263bca90986fb61928b25e4f3ad2a545000000000000000000000000e804388641803e474443559236c0ddc436b16ffe0000000000000000000000006d082196ee5124ea665df8bec76a328419fa9489

-----Decoded View---------------
Arg [0] : token_ (address): 0xbbd1fbccba8038bb2f3ae15a5ed301bb89a64291
Arg [1] : decimals_ (uint8): 9
Arg [2] : _owners (address[]): 0x52807640263bca90986fb61928b25e4f3ad2a545,0xe804388641803e474443559236c0ddc436b16ffe,0x6d082196ee5124ea665df8bec76a328419fa9489
Arg [3] : _numConfirmationsRequired (uint256): 3

-----Encoded View---------------
8 Constructor Arguments found :
Arg [0] : 000000000000000000000000bbd1fbccba8038bb2f3ae15a5ed301bb89a64291
Arg [1] : 0000000000000000000000000000000000000000000000000000000000000009
Arg [2] : 0000000000000000000000000000000000000000000000000000000000000080
Arg [3] : 0000000000000000000000000000000000000000000000000000000000000003
Arg [4] : 0000000000000000000000000000000000000000000000000000000000000003
Arg [5] : 00000000000000000000000052807640263bca90986fb61928b25e4f3ad2a545
Arg [6] : 000000000000000000000000e804388641803e474443559236c0ddc436b16ffe
Arg [7] : 0000000000000000000000006d082196ee5124ea665df8bec76a328419fa9489


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.