ETH Price: $2,696.94 (-0.00%)

Contract

0xF02e86D9E0eFd57aD034FaF52201B79917fE0713
 

Overview

ETH Balance

20,779.189613513620561062 ETH

Eth Value

$56,040,324.92 (@ $2,696.94/ETH)

Token Holdings

Transaction Hash
Method
Block
From
To
Send Multi Sig T...216902242025-01-23 22:36:3524 days ago1737671795IN
0xF02e86D9...917fE0713
0 ETH0.0012134210.56659463
Send Multi Sig T...216818702025-01-22 18:38:2325 days ago1737571103IN
0xF02e86D9...917fE0713
0 ETH0.000956419.23542598
Send Multi Sig T...216812242025-01-22 16:28:1125 days ago1737563291IN
0xF02e86D9...917fE0713
0 ETH0.001123211.49599243
Send Multi Sig T...216812242025-01-22 16:28:1125 days ago1737563291IN
0xF02e86D9...917fE0713
0 ETH0.0013126511.49599243
Send Multi Sig T...216812242025-01-22 16:28:1125 days ago1737563291IN
0xF02e86D9...917fE0713
0 ETH0.0013196911.49599243
Transfer216466692025-01-17 20:41:4730 days ago1737146507IN
0xF02e86D9...917fE0713
10.61743279 ETH0.0003941615.14280361
Transfer216381432025-01-16 16:08:5931 days ago1737043739IN
0xF02e86D9...917fE0713
0.015 ETH0.0005294820.34124507
Transfer215842932025-01-09 3:38:5939 days ago1736393939IN
0xF02e86D9...917fE0713
999.972 ETH0.000182567.01348541
Transfer215830212025-01-08 23:23:2339 days ago1736378603IN
0xF02e86D9...917fE0713
5,943.49525801 ETH0.00019577.51830477
Transfer215734672025-01-07 15:23:5940 days ago1736263439IN
0xF02e86D9...917fE0713
0.01 ETH0.0007766629.83738275
Transfer215734212025-01-07 15:14:4740 days ago1736262887IN
0xF02e86D9...917fE0713
239.95771523 ETH0.0007498128.80562973
Transfer215666612025-01-06 16:37:3541 days ago1736181455IN
0xF02e86D9...917fE0713
2,600 ETH0.0007762829.82277538
Transfer215453712025-01-03 17:12:3544 days ago1735924355IN
0xF02e86D9...917fE0713
2,700 ETH0.0007709129.61651895
Send Multi Sig215395242025-01-02 21:38:1145 days ago1735853891IN
0xF02e86D9...917fE0713
0 ETH0.000823719.6830056
Transfer215376112025-01-02 15:13:5945 days ago1735830839IN
0xF02e86D9...917fE0713
2,865 ETH0.0004013515.41905197
Send Multi Sig215248202024-12-31 20:24:5947 days ago1735676699IN
0xF02e86D9...917fE0713
0 ETH0.000560776.59428907
Transfer215227352024-12-31 13:24:4747 days ago1735651487IN
0xF02e86D9...917fE0713
2,900 ETH0.0002693310.34716577
Send Multi Sig215183232024-12-30 22:37:3548 days ago1735598255IN
0xF02e86D9...917fE0713
0 ETH0.000676667.95706282
Transfer214874952024-12-26 15:20:2352 days ago1735226423IN
0xF02e86D9...917fE0713
222.969 ETH0.0002604810.0071955
Transfer214669202024-12-23 18:17:4755 days ago1734977867IN
0xF02e86D9...917fE0713
19 ETH0.0003533213.5739233
Transfer214452642024-12-20 17:36:3558 days ago1734716195IN
0xF02e86D9...917fE0713
760 ETH0.0005575421.41945421
Transfer214451782024-12-20 17:19:2358 days ago1734715163IN
0xF02e86D9...917fE0713
1,400 ETH0.000577122.17077149
Transfer214448042024-12-20 16:04:2358 days ago1734710663IN
0xF02e86D9...917fE0713
0.025 ETH0.0009903838.04799248
Transfer214447492024-12-20 15:53:1158 days ago1734709991IN
0xF02e86D9...917fE0713
0.025 ETH0.0009324835.82353122
Transfer214444122024-12-20 14:45:2358 days ago1734705923IN
0xF02e86D9...917fE0713
0.025 ETH0.0008792833.77976107
View all transactions

Latest 25 internal transactions (View All)

Advanced mode:
Parent Transaction Hash Block
From
To
215395242025-01-02 21:38:1145 days ago1735853891
0xF02e86D9...917fE0713
882 ETH
215248202024-12-31 20:24:5947 days ago1735676699
0xF02e86D9...917fE0713
0.05 ETH
215183232024-12-30 22:37:3548 days ago1735598255
0xF02e86D9...917fE0713
0.05 ETH
207931492024-09-20 16:59:11149 days ago1726851551
0xF02e86D9...917fE0713
126.78 ETH
207922762024-09-20 14:03:59149 days ago1726841039
0xF02e86D9...917fE0713
0.0004 ETH
207442442024-09-13 21:01:35156 days ago1726261295
0xF02e86D9...917fE0713
50 ETH
206940952024-09-06 20:59:23163 days ago1725656363
0xF02e86D9...917fE0713
721.21 ETH
206797852024-09-04 21:04:11165 days ago1725483851
0xF02e86D9...917fE0713
0.00403663 ETH
203216612024-07-16 21:08:11215 days ago1721164091
0xF02e86D9...917fE0713
380.48149069 ETH
198778892024-05-15 20:52:23277 days ago1715806343
0xF02e86D9...917fE0713
750 ETH
198636372024-05-13 20:59:35279 days ago1715633975
0xF02e86D9...917fE0713
761.86671722 ETH
198268472024-05-08 17:32:23284 days ago1715189543
0xF02e86D9...917fE0713
1,000 ETH
198136722024-05-06 21:17:47286 days ago1715030267
0xF02e86D9...917fE0713
357.94407115 ETH
197926512024-05-03 22:45:23289 days ago1714776323
0xF02e86D9...917fE0713
27.70558175 ETH
197926512024-05-03 22:45:23289 days ago1714776323
0xF02e86D9...917fE0713
2,000 ETH
197768422024-05-01 17:42:11291 days ago1714585331
0xF02e86D9...917fE0713
0.0035 ETH
197694482024-04-30 16:54:23292 days ago1714496063
0xF02e86D9...917fE0713
2,000 ETH
197425132024-04-26 22:30:59296 days ago1714170659
0xF02e86D9...917fE0713
2,000 ETH
197277642024-04-24 20:58:35298 days ago1713992315
0xF02e86D9...917fE0713
2,000 ETH
197226472024-04-24 3:45:59299 days ago1713930359
0xF02e86D9...917fE0713
1,500 ETH
197145622024-04-23 0:38:23300 days ago1713832703
0xF02e86D9...917fE0713
2,500 ETH
197123362024-04-22 17:10:11300 days ago1713805811
0xF02e86D9...917fE0713
2,000 ETH
196407942024-04-12 16:43:11310 days ago1712940191
0xF02e86D9...917fE0713
2,500 ETH
196136112024-04-08 21:25:47314 days ago1712611547
0xF02e86D9...917fE0713
4,000 ETH
195851412024-04-04 21:41:35318 days ago1712266895
0xF02e86D9...917fE0713
1,000 ETH
View All Internal Transactions
Loading...
Loading

Minimal Proxy Contract for 0xe5dcdc13b628c2df813db1080367e929c1507ca0

Similar Match Source Code
This contract matches the deployed Bytecode of the Source Code for Contract 0x63863008...CD1AB731D
The constructor portion of the code might be different and could alter the actual behaviour of the contract

Contract Name:
WalletSimple

Compiler Version
v0.8.10+commit.fc410830

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion

Contract Source Code (Solidity Standard Json-Input format)

File 1 of 10 : WalletSimple.sol
// SPDX-License-Identifier: Apache-2.0
pragma solidity 0.8.10;
import './TransferHelper.sol';
import './ERC20Interface.sol';
import './IForwarder.sol';

/** ERC721, ERC1155 imports */
import '@openzeppelin/contracts/token/ERC721/IERC721Receiver.sol';
import '@openzeppelin/contracts/token/ERC1155/utils/ERC1155Receiver.sol';

/**
 *
 * WalletSimple
 * ============
 *
 * Basic multi-signer wallet designed for use in a co-signing environment where 2 signatures are required to move funds.
 * Typically used in a 2-of-3 signing configuration. Uses ecrecover to allow for 2 signatures in a single transaction.
 *
 * The first signature is created on the operation hash (see Data Formats) and passed to sendMultiSig/sendMultiSigToken
 * The signer is determined by verifyMultiSig().
 *
 * The second signature is created by the submitter of the transaction and determined by msg.signer.
 *
 * Data Formats
 * ============
 *
 * The signature is created with ethereumjs-util.ecsign(operationHash).
 * Like the eth_sign RPC call, it packs the values as a 65-byte array of [r, s, v].
 * Unlike eth_sign, the message is not prefixed.
 *
 * The operationHash the result of keccak256(prefix, toAddress, value, data, expireTime).
 * For ether transactions, `prefix` is "ETHER".
 * For token transaction, `prefix` is "ERC20" and `data` is the tokenContractAddress.
 *
 *
 */
contract WalletSimple is IERC721Receiver, ERC1155Receiver {
  // Events
  event Deposited(address from, uint256 value, bytes data);
  event SafeModeActivated(address msgSender);
  event Transacted(
    address msgSender, // Address of the sender of the message initiating the transaction
    address otherSigner, // Address of the signer (second signature) used to initiate the transaction
    bytes32 operation, // Operation hash (see Data Formats)
    address toAddress, // The address the transaction was sent to
    uint256 value, // Amount of Wei sent to the address
    bytes data // Data sent when invoking the transaction
  );

  event BatchTransfer(address sender, address recipient, uint256 value);
  // this event shows the other signer and the operation hash that they signed
  // specific batch transfer events are emitted in Batcher
  event BatchTransacted(
    address msgSender, // Address of the sender of the message initiating the transaction
    address otherSigner, // Address of the signer (second signature) used to initiate the transaction
    bytes32 operation // Operation hash (see Data Formats)
  );

  // Public fields
  mapping(address => bool) public signers; // The addresses that can co-sign transactions on the wallet
  bool public safeMode = false; // When active, wallet may only send to signer addresses
  bool public initialized = false; // True if the contract has been initialized

  // Internal fields
  uint256 private constant MAX_SEQUENCE_ID_INCREASE = 10000;
  uint256 constant SEQUENCE_ID_WINDOW_SIZE = 10;
  uint256[SEQUENCE_ID_WINDOW_SIZE] recentSequenceIds;

  /**
   * Set up a simple multi-sig wallet by specifying the signers allowed to be used on this wallet.
   * 2 signers will be required to send a transaction from this wallet.
   * Note: The sender is NOT automatically added to the list of signers.
   * Signers CANNOT be changed once they are set
   *
   * @param allowedSigners An array of signers on the wallet
   */
  function init(address[] calldata allowedSigners) external onlyUninitialized {
    require(allowedSigners.length == 3, 'Invalid number of signers');

    for (uint8 i = 0; i < allowedSigners.length; i++) {
      require(allowedSigners[i] != address(0), 'Invalid signer');
      signers[allowedSigners[i]] = true;
    }

    initialized = true;
  }

  /**
   * Get the network identifier that signers must sign over
   * This provides protection signatures being replayed on other chains
   * This must be a virtual function because chain-specific contracts will need
   *    to override with their own network ids. It also can't be a field
   *    to allow this contract to be used by proxy with delegatecall, which will
   *    not pick up on state variables
   */
  function getNetworkId() internal virtual pure returns (string memory) {
    return 'ETHER';
  }

  /**
   * Get the network identifier that signers must sign over for token transfers
   * This provides protection signatures being replayed on other chains
   * This must be a virtual function because chain-specific contracts will need
   *    to override with their own network ids. It also can't be a field
   *    to allow this contract to be used by proxy with delegatecall, which will
   *    not pick up on state variables
   */
  function getTokenNetworkId() internal virtual pure returns (string memory) {
    return 'ERC20';
  }

  /**
   * Get the network identifier that signers must sign over for batch transfers
   * This provides protection signatures being replayed on other chains
   * This must be a virtual function because chain-specific contracts will need
   *    to override with their own network ids. It also can't be a field
   *    to allow this contract to be used by proxy with delegatecall, which will
   *    not pick up on state variables
   */
  function getBatchNetworkId() internal virtual pure returns (string memory) {
    return 'ETHER-Batch';
  }

  /**
   * Determine if an address is a signer on this wallet
   * @param signer address to check
   * returns boolean indicating whether address is signer or not
   */
  function isSigner(address signer) public view returns (bool) {
    return signers[signer];
  }

  /**
   * Modifier that will execute internal code block only if the sender is an authorized signer on this wallet
   */
  modifier onlySigner {
    require(isSigner(msg.sender), 'Non-signer in onlySigner method');
    _;
  }

  /**
   * Modifier that will execute internal code block only if the contract has not been initialized yet
   */
  modifier onlyUninitialized {
    require(!initialized, 'Contract already initialized');
    _;
  }

  /**
   * Gets called when a transaction is received with data that does not match any other method
   */
  fallback() external payable {
    if (msg.value > 0) {
      // Fire deposited event if we are receiving funds
      emit Deposited(msg.sender, msg.value, msg.data);
    }
  }

  /**
   * Gets called when a transaction is received with ether and no data
   */
  receive() external payable {
    if (msg.value > 0) {
      // Fire deposited event if we are receiving funds
      // message data is always empty for receive. If there is data it is sent to fallback function.
      emit Deposited(msg.sender, msg.value, '');
    }
  }

  /**
   * Execute a multi-signature transaction from this wallet using 2 signers: one from msg.sender and the other from ecrecover.
   * Sequence IDs are numbers starting from 1. They are used to prevent replay attacks and may not be repeated.
   *
   * @param toAddress the destination address to send an outgoing transaction
   * @param value the amount in Wei to be sent
   * @param data the data to send to the toAddress when invoking the transaction
   * @param expireTime the number of seconds since 1970 for which this transaction is valid
   * @param sequenceId the unique sequence id obtainable from getNextSequenceId
   * @param signature see Data Formats
   */
  function sendMultiSig(
    address toAddress,
    uint256 value,
    bytes calldata data,
    uint256 expireTime,
    uint256 sequenceId,
    bytes calldata signature
  ) external onlySigner {
    // Verify the other signer
    bytes32 operationHash = keccak256(
      abi.encodePacked(
        getNetworkId(),
        toAddress,
        value,
        data,
        expireTime,
        sequenceId
      )
    );

    address otherSigner = verifyMultiSig(
      toAddress,
      operationHash,
      signature,
      expireTime,
      sequenceId
    );

    // Success, send the transaction
    (bool success, ) = toAddress.call{ value: value }(data);
    require(success, 'Call execution failed');

    emit Transacted(
      msg.sender,
      otherSigner,
      operationHash,
      toAddress,
      value,
      data
    );
  }

  /**
   * Execute a batched multi-signature transaction from this wallet using 2 signers: one from msg.sender and the other from ecrecover.
   * Sequence IDs are numbers starting from 1. They are used to prevent replay attacks and may not be repeated.
   * The recipients and values to send are encoded in two arrays, where for index i, recipients[i] will be sent values[i].
   *
   * @param recipients The list of recipients to send to
   * @param values The list of values to send to
   * @param expireTime the number of seconds since 1970 for which this transaction is valid
   * @param sequenceId the unique sequence id obtainable from getNextSequenceId
   * @param signature see Data Formats
   */
  function sendMultiSigBatch(
    address[] calldata recipients,
    uint256[] calldata values,
    uint256 expireTime,
    uint256 sequenceId,
    bytes calldata signature
  ) external onlySigner {
    require(recipients.length != 0, 'Not enough recipients');
    require(
      recipients.length == values.length,
      'Unequal recipients and values'
    );
    require(recipients.length < 256, 'Too many recipients, max 255');

    // Verify the other signer
    bytes32 operationHash = keccak256(
      abi.encodePacked(
        getBatchNetworkId(),
        recipients,
        values,
        expireTime,
        sequenceId
      )
    );

    // the first parameter (toAddress) is used to ensure transactions in safe mode only go to a signer
    // if in safe mode, we should use normal sendMultiSig to recover, so this check will always fail if in safe mode
    require(!safeMode, 'Batch in safe mode');
    address otherSigner = verifyMultiSig(
      address(0x0),
      operationHash,
      signature,
      expireTime,
      sequenceId
    );

    batchTransfer(recipients, values);
    emit BatchTransacted(msg.sender, otherSigner, operationHash);
  }

  /**
   * Transfer funds in a batch to each of recipients
   * @param recipients The list of recipients to send to
   * @param values The list of values to send to recipients.
   *  The recipient with index i in recipients array will be sent values[i].
   *  Thus, recipients and values must be the same length
   */
  function batchTransfer(
    address[] calldata recipients,
    uint256[] calldata values
  ) internal {
    for (uint256 i = 0; i < recipients.length; i++) {
      require(address(this).balance >= values[i], 'Insufficient funds');

      (bool success, ) = recipients[i].call{ value: values[i] }('');
      require(success, 'Call failed');

      emit BatchTransfer(msg.sender, recipients[i], values[i]);
    }
  }

  /**
   * Execute a multi-signature token transfer from this wallet using 2 signers: one from msg.sender and the other from ecrecover.
   * Sequence IDs are numbers starting from 1. They are used to prevent replay attacks and may not be repeated.
   *
   * @param toAddress the destination address to send an outgoing transaction
   * @param value the amount in tokens to be sent
   * @param tokenContractAddress the address of the erc20 token contract
   * @param expireTime the number of seconds since 1970 for which this transaction is valid
   * @param sequenceId the unique sequence id obtainable from getNextSequenceId
   * @param signature see Data Formats
   */
  function sendMultiSigToken(
    address toAddress,
    uint256 value,
    address tokenContractAddress,
    uint256 expireTime,
    uint256 sequenceId,
    bytes calldata signature
  ) external onlySigner {
    // Verify the other signer
    bytes32 operationHash = keccak256(
      abi.encodePacked(
        getTokenNetworkId(),
        toAddress,
        value,
        tokenContractAddress,
        expireTime,
        sequenceId
      )
    );

    verifyMultiSig(toAddress, operationHash, signature, expireTime, sequenceId);

    TransferHelper.safeTransfer(tokenContractAddress, toAddress, value);
  }

  /**
   * Execute a token flush from one of the forwarder addresses. This transfer needs only a single signature and can be done by any signer
   *
   * @param forwarderAddress the address of the forwarder address to flush the tokens from
   * @param tokenContractAddress the address of the erc20 token contract
   */
  function flushForwarderTokens(
    address payable forwarderAddress,
    address tokenContractAddress
  ) external onlySigner {
    IForwarder forwarder = IForwarder(forwarderAddress);
    forwarder.flushTokens(tokenContractAddress);
  }

  /**
   * Execute a ERC721 token flush from one of the forwarder addresses. This transfer needs only a single signature and can be done by any signer
   *
   * @param forwarderAddress the address of the forwarder address to flush the tokens from
   * @param tokenContractAddress the address of the erc20 token contract
   */
  function flushERC721ForwarderTokens(
    address payable forwarderAddress,
    address tokenContractAddress,
    uint256 tokenId
  ) external onlySigner {
    IForwarder forwarder = IForwarder(forwarderAddress);
    forwarder.flushERC721Token(tokenContractAddress, tokenId);
  }

  /**
   * Execute a ERC1155 batch token flush from one of the forwarder addresses.
   * This transfer needs only a single signature and can be done by any signer.
   *
   * @param forwarderAddress the address of the forwarder address to flush the tokens from
   * @param tokenContractAddress the address of the erc1155 token contract
   */
  function batchFlushERC1155ForwarderTokens(
    address payable forwarderAddress,
    address tokenContractAddress,
    uint256[] calldata tokenIds
  ) external onlySigner {
    IForwarder forwarder = IForwarder(forwarderAddress);
    forwarder.batchFlushERC1155Tokens(tokenContractAddress, tokenIds);
  }

  /**
   * Execute a ERC1155 token flush from one of the forwarder addresses.
   * This transfer needs only a single signature and can be done by any signer.
   *
   * @param forwarderAddress the address of the forwarder address to flush the tokens from
   * @param tokenContractAddress the address of the erc1155 token contract
   * @param tokenId the token id associated with the ERC1155
   */
  function flushERC1155ForwarderTokens(
    address payable forwarderAddress,
    address tokenContractAddress,
    uint256 tokenId
  ) external onlySigner {
    IForwarder forwarder = IForwarder(forwarderAddress);
    forwarder.flushERC1155Tokens(tokenContractAddress, tokenId);
  }

  /**
   * Sets the autoflush 721 parameter on the forwarder.
   *
   * @param forwarderAddress the address of the forwarder to toggle.
   * @param autoFlush whether to autoflush erc721 tokens
   */
  function setAutoFlush721(address forwarderAddress, bool autoFlush)
    external
    onlySigner
  {
    IForwarder forwarder = IForwarder(forwarderAddress);
    forwarder.setAutoFlush721(autoFlush);
  }

  /**
   * Sets the autoflush 721 parameter on the forwarder.
   *
   * @param forwarderAddress the address of the forwarder to toggle.
   * @param autoFlush whether to autoflush erc1155 tokens
   */
  function setAutoFlush1155(address forwarderAddress, bool autoFlush)
    external
    onlySigner
  {
    IForwarder forwarder = IForwarder(forwarderAddress);
    forwarder.setAutoFlush1155(autoFlush);
  }

  /**
   * Do common multisig verification for both eth sends and erc20token transfers
   *
   * @param toAddress the destination address to send an outgoing transaction
   * @param operationHash see Data Formats
   * @param signature see Data Formats
   * @param expireTime the number of seconds since 1970 for which this transaction is valid
   * @param sequenceId the unique sequence id obtainable from getNextSequenceId
   * returns address that has created the signature
   */
  function verifyMultiSig(
    address toAddress,
    bytes32 operationHash,
    bytes calldata signature,
    uint256 expireTime,
    uint256 sequenceId
  ) private returns (address) {
    address otherSigner = recoverAddressFromSignature(operationHash, signature);

    // Verify if we are in safe mode. In safe mode, the wallet can only send to signers
    require(!safeMode || isSigner(toAddress), 'External transfer in safe mode');

    // Verify that the transaction has not expired
    require(expireTime >= block.timestamp, 'Transaction expired');

    // Try to insert the sequence ID. Will revert if the sequence id was invalid
    tryInsertSequenceId(sequenceId);

    require(isSigner(otherSigner), 'Invalid signer');

    require(otherSigner != msg.sender, 'Signers cannot be equal');

    return otherSigner;
  }

  /**
   * ERC721 standard callback function for when a ERC721 is transfered.
   *
   * @param _operator The address of the nft contract
   * @param _from The address of the sender
   * @param _tokenId The token id of the nft
   * @param _data Additional data with no specified format, sent in call to `_to`
   */
  function onERC721Received(
    address _operator,
    address _from,
    uint256 _tokenId,
    bytes memory _data
  ) external virtual override returns (bytes4) {
    return this.onERC721Received.selector;
  }

  /**
   * @inheritdoc IERC1155Receiver
   */
  function onERC1155Received(
    address _operator,
    address _from,
    uint256 id,
    uint256 value,
    bytes calldata data
  ) external virtual override returns (bytes4) {
    return this.onERC1155Received.selector;
  }

  /**
   * @inheritdoc IERC1155Receiver
   */
  function onERC1155BatchReceived(
    address _operator,
    address _from,
    uint256[] calldata ids,
    uint256[] calldata values,
    bytes calldata data
  ) external virtual override returns (bytes4) {
    return this.onERC1155BatchReceived.selector;
  }

  /**
   * Irrevocably puts contract into safe mode. When in this mode, transactions may only be sent to signing addresses.
   */
  function activateSafeMode() external onlySigner {
    safeMode = true;
    emit SafeModeActivated(msg.sender);
  }

  /**
   * Gets signer's address using ecrecover
   * @param operationHash see Data Formats
   * @param signature see Data Formats
   * returns address recovered from the signature
   */
  function recoverAddressFromSignature(
    bytes32 operationHash,
    bytes memory signature
  ) private pure returns (address) {
    require(signature.length == 65, 'Invalid signature - wrong length');

    // We need to unpack the signature, which is given as an array of 65 bytes (like eth.sign)
    bytes32 r;
    bytes32 s;
    uint8 v;

    // solhint-disable-next-line
    assembly {
      r := mload(add(signature, 32))
      s := mload(add(signature, 64))
      v := and(mload(add(signature, 65)), 255)
    }
    if (v < 27) {
      v += 27; // Ethereum versions are 27 or 28 as opposed to 0 or 1 which is submitted by some signing libs
    }

    // protect against signature malleability
    // S value must be in the lower half orader
    // reference: https://github.com/OpenZeppelin/openzeppelin-contracts/blob/051d340171a93a3d401aaaea46b4b62fa81e5d7c/contracts/cryptography/ECDSA.sol#L53
    require(
      uint256(s) <=
        0x7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5D576E7357A4501DDFE92F46681B20A0,
      "ECDSA: invalid signature 's' value"
    );

    // note that this returns 0 if the signature is invalid
    // Since 0x0 can never be a signer, when the recovered signer address
    // is checked against our signer list, that 0x0 will cause an invalid signer failure
    return ecrecover(operationHash, v, r, s);
  }

  /**
   * Verify that the sequence id has not been used before and inserts it. Throws if the sequence ID was not accepted.
   * We collect a window of up to 10 recent sequence ids, and allow any sequence id that is not in the window and
   * greater than the minimum element in the window.
   * @param sequenceId to insert into array of stored ids
   */
  function tryInsertSequenceId(uint256 sequenceId) private onlySigner {
    // Keep a pointer to the lowest value element in the window
    uint256 lowestValueIndex = 0;
    // fetch recentSequenceIds into memory for function context to avoid unnecessary sloads


      uint256[SEQUENCE_ID_WINDOW_SIZE] memory _recentSequenceIds
     = recentSequenceIds;
    for (uint256 i = 0; i < SEQUENCE_ID_WINDOW_SIZE; i++) {
      require(_recentSequenceIds[i] != sequenceId, 'Sequence ID already used');

      if (_recentSequenceIds[i] < _recentSequenceIds[lowestValueIndex]) {
        lowestValueIndex = i;
      }
    }

    // The sequence ID being used is lower than the lowest value in the window
    // so we cannot accept it as it may have been used before
    require(
      sequenceId > _recentSequenceIds[lowestValueIndex],
      'Sequence ID below window'
    );

    // Block sequence IDs which are much higher than the lowest value
    // This prevents people blocking the contract by using very large sequence IDs quickly
    require(
      sequenceId <=
        (_recentSequenceIds[lowestValueIndex] + MAX_SEQUENCE_ID_INCREASE),
      'Sequence ID above maximum'
    );

    recentSequenceIds[lowestValueIndex] = sequenceId;
  }

  /**
   * Gets the next available sequence ID for signing when using executeAndConfirm
   * returns the sequenceId one higher than the highest currently stored
   */
  function getNextSequenceId() external view returns (uint256) {
    uint256 highestSequenceId = 0;
    for (uint256 i = 0; i < SEQUENCE_ID_WINDOW_SIZE; i++) {
      if (recentSequenceIds[i] > highestSequenceId) {
        highestSequenceId = recentSequenceIds[i];
      }
    }
    return highestSequenceId + 1;
  }
}

File 2 of 10 : TransferHelper.sol
// SPDX-License-Identifier: GPL-3.0-or-later
// source: https://github.com/Uniswap/solidity-lib/blob/master/contracts/libraries/TransferHelper.sol
pragma solidity 0.8.10;

import '@openzeppelin/contracts/utils/Address.sol';

// helper methods for interacting with ERC20 tokens and sending ETH that do not consistently return true/false
library TransferHelper {
  function safeTransfer(
    address token,
    address to,
    uint256 value
  ) internal {
    // bytes4(keccak256(bytes('transfer(address,uint256)')));
    (bool success, bytes memory data) = token.call(
      abi.encodeWithSelector(0xa9059cbb, to, value)
    );
    require(
      success && (data.length == 0 || abi.decode(data, (bool))),
      'TransferHelper::safeTransfer: transfer failed'
    );
  }

  function safeTransferFrom(
    address token,
    address from,
    address to,
    uint256 value
  ) internal {
    // bytes4(keccak256(bytes('transferFrom(address,address,uint256)')));
    (bool success, bytes memory returndata) = token.call(
      abi.encodeWithSelector(0x23b872dd, from, to, value)
    );
    Address.verifyCallResult(
      success,
      returndata,
      'TransferHelper::transferFrom: transferFrom failed'
    );
  }
}

File 3 of 10 : ERC20Interface.sol
// SPDX-License-Identifier: UNLICENSED
pragma solidity 0.8.10;

/**
 * Contract that exposes the needed erc20 token functions
 */

abstract contract ERC20Interface {
  // Send _value amount of tokens to address _to
  function transfer(address _to, uint256 _value)
    public
    virtual
    returns (bool success);

  // Get the account balance of another account with address _owner
  function balanceOf(address _owner)
    public
    virtual
    view
    returns (uint256 balance);
}

File 4 of 10 : IForwarder.sol
pragma solidity ^0.8.0;

import '@openzeppelin/contracts/utils/introspection/IERC165.sol';

interface IForwarder is IERC165 {
  /**
   * Sets the autoflush721 parameter.
   *
   * @param autoFlush whether to autoflush erc721 tokens
   */
  function setAutoFlush721(bool autoFlush) external;

  /**
   * Sets the autoflush1155 parameter.
   *
   * @param autoFlush whether to autoflush erc1155 tokens
   */
  function setAutoFlush1155(bool autoFlush) external;

  /**
   * Execute a token transfer of the full balance from the forwarder token to the parent address
   *
   * @param tokenContractAddress the address of the erc20 token contract
   */
  function flushTokens(address tokenContractAddress) external;

  /**
   * Execute a nft transfer from the forwarder to the parent address
   *
   * @param tokenContractAddress the address of the ERC721 NFT contract
   * @param tokenId The token id of the nft
   */
  function flushERC721Token(address tokenContractAddress, uint256 tokenId)
    external;

  /**
   * Execute a nft transfer from the forwarder to the parent address.
   *
   * @param tokenContractAddress the address of the ERC1155 NFT contract
   * @param tokenId The token id of the nft
   */
  function flushERC1155Tokens(address tokenContractAddress, uint256 tokenId)
    external;

  /**
   * Execute a batch nft transfer from the forwarder to the parent address.
   *
   * @param tokenContractAddress the address of the ERC1155 NFT contract
   * @param tokenIds The token ids of the nfts
   */
  function batchFlushERC1155Tokens(
    address tokenContractAddress,
    uint256[] calldata tokenIds
  ) external;
}

File 5 of 10 : IERC721Receiver.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (token/ERC721/IERC721Receiver.sol)

pragma solidity ^0.8.0;

/**
 * @title ERC721 token receiver interface
 * @dev Interface for any contract that wants to support safeTransfers
 * from ERC721 asset contracts.
 */
interface IERC721Receiver {
    /**
     * @dev Whenever an {IERC721} `tokenId` token is transferred to this contract via {IERC721-safeTransferFrom}
     * by `operator` from `from`, this function is called.
     *
     * It must return its Solidity selector to confirm the token transfer.
     * If any other value is returned or the interface is not implemented by the recipient, the transfer will be reverted.
     *
     * The selector can be obtained in Solidity with `IERC721.onERC721Received.selector`.
     */
    function onERC721Received(
        address operator,
        address from,
        uint256 tokenId,
        bytes calldata data
    ) external returns (bytes4);
}

File 6 of 10 : ERC1155Receiver.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (token/ERC1155/utils/ERC1155Receiver.sol)

pragma solidity ^0.8.0;

import "../IERC1155Receiver.sol";
import "../../../utils/introspection/ERC165.sol";

/**
 * @dev _Available since v3.1._
 */
abstract contract ERC1155Receiver is ERC165, IERC1155Receiver {
    /**
     * @dev See {IERC165-supportsInterface}.
     */
    function supportsInterface(bytes4 interfaceId) public view virtual override(ERC165, IERC165) returns (bool) {
        return interfaceId == type(IERC1155Receiver).interfaceId || super.supportsInterface(interfaceId);
    }
}

File 7 of 10 : Address.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (utils/Address.sol)

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;
        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");

        (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");

        (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");

        (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");

        (bool success, bytes memory returndata) = target.delegatecall(data);
        return verifyCallResult(success, returndata, errorMessage);
    }

    /**
     * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the
     * revert reason using the provided one.
     *
     * _Available since v4.3._
     */
    function verifyCallResult(
        bool success,
        bytes memory returndata,
        string memory errorMessage
    ) internal 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

                assembly {
                    let returndata_size := mload(returndata)
                    revert(add(32, returndata), returndata_size)
                }
            } else {
                revert(errorMessage);
            }
        }
    }
}

File 8 of 10 : IERC165.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol)

pragma solidity ^0.8.0;

/**
 * @dev Interface of the ERC165 standard, as defined in the
 * https://eips.ethereum.org/EIPS/eip-165[EIP].
 *
 * Implementers can declare support of contract interfaces, which can then be
 * queried by others ({ERC165Checker}).
 *
 * For an implementation, see {ERC165}.
 */
interface IERC165 {
    /**
     * @dev Returns true if this contract implements the interface defined by
     * `interfaceId`. See the corresponding
     * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section]
     * to learn more about how these ids are created.
     *
     * This function call must use less than 30 000 gas.
     */
    function supportsInterface(bytes4 interfaceId) external view returns (bool);
}

File 9 of 10 : IERC1155Receiver.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (token/ERC1155/IERC1155Receiver.sol)

pragma solidity ^0.8.0;

import "../../utils/introspection/IERC165.sol";

/**
 * @dev _Available since v3.1._
 */
interface IERC1155Receiver is IERC165 {
    /**
        @dev Handles the receipt of a single ERC1155 token type. This function is
        called at the end of a `safeTransferFrom` after the balance has been updated.
        To accept the transfer, this must return
        `bytes4(keccak256("onERC1155Received(address,address,uint256,uint256,bytes)"))`
        (i.e. 0xf23a6e61, or its own function selector).
        @param operator The address which initiated the transfer (i.e. msg.sender)
        @param from The address which previously owned the token
        @param id The ID of the token being transferred
        @param value The amount of tokens being transferred
        @param data Additional data with no specified format
        @return `bytes4(keccak256("onERC1155Received(address,address,uint256,uint256,bytes)"))` if transfer is allowed
    */
    function onERC1155Received(
        address operator,
        address from,
        uint256 id,
        uint256 value,
        bytes calldata data
    ) external returns (bytes4);

    /**
        @dev Handles the receipt of a multiple ERC1155 token types. This function
        is called at the end of a `safeBatchTransferFrom` after the balances have
        been updated. To accept the transfer(s), this must return
        `bytes4(keccak256("onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)"))`
        (i.e. 0xbc197c81, or its own function selector).
        @param operator The address which initiated the batch transfer (i.e. msg.sender)
        @param from The address which previously owned the token
        @param ids An array containing ids of each token being transferred (order and length must match values array)
        @param values An array containing amounts of each token being transferred (order and length must match ids array)
        @param data Additional data with no specified format
        @return `bytes4(keccak256("onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)"))` if transfer is allowed
    */
    function onERC1155BatchReceived(
        address operator,
        address from,
        uint256[] calldata ids,
        uint256[] calldata values,
        bytes calldata data
    ) external returns (bytes4);
}

File 10 of 10 : ERC165.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (utils/introspection/ERC165.sol)

pragma solidity ^0.8.0;

import "./IERC165.sol";

/**
 * @dev Implementation of the {IERC165} interface.
 *
 * Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check
 * for the additional interface id that will be supported. For example:
 *
 * ```solidity
 * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
 *     return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId);
 * }
 * ```
 *
 * Alternatively, {ERC165Storage} provides an easier to use but more expensive implementation.
 */
abstract contract ERC165 is IERC165 {
    /**
     * @dev See {IERC165-supportsInterface}.
     */
    function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
        return interfaceId == type(IERC165).interfaceId;
    }
}

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

Contract ABI

[{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"msgSender","type":"address"},{"indexed":false,"internalType":"address","name":"otherSigner","type":"address"},{"indexed":false,"internalType":"bytes32","name":"operation","type":"bytes32"}],"name":"BatchTransacted","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"sender","type":"address"},{"indexed":false,"internalType":"address","name":"recipient","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"BatchTransfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"from","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"},{"indexed":false,"internalType":"bytes","name":"data","type":"bytes"}],"name":"Deposited","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"msgSender","type":"address"}],"name":"SafeModeActivated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"msgSender","type":"address"},{"indexed":false,"internalType":"address","name":"otherSigner","type":"address"},{"indexed":false,"internalType":"bytes32","name":"operation","type":"bytes32"},{"indexed":false,"internalType":"address","name":"toAddress","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"},{"indexed":false,"internalType":"bytes","name":"data","type":"bytes"}],"name":"Transacted","type":"event"},{"stateMutability":"payable","type":"fallback"},{"inputs":[],"name":"activateSafeMode","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address payable","name":"forwarderAddress","type":"address"},{"internalType":"address","name":"tokenContractAddress","type":"address"},{"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"}],"name":"batchFlushERC1155ForwarderTokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address payable","name":"forwarderAddress","type":"address"},{"internalType":"address","name":"tokenContractAddress","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"flushERC1155ForwarderTokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address payable","name":"forwarderAddress","type":"address"},{"internalType":"address","name":"tokenContractAddress","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"flushERC721ForwarderTokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address payable","name":"forwarderAddress","type":"address"},{"internalType":"address","name":"tokenContractAddress","type":"address"}],"name":"flushForwarderTokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"getNextSequenceId","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"allowedSigners","type":"address[]"}],"name":"init","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"initialized","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"signer","type":"address"}],"name":"isSigner","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_operator","type":"address"},{"internalType":"address","name":"_from","type":"address"},{"internalType":"uint256[]","name":"ids","type":"uint256[]"},{"internalType":"uint256[]","name":"values","type":"uint256[]"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"onERC1155BatchReceived","outputs":[{"internalType":"bytes4","name":"","type":"bytes4"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_operator","type":"address"},{"internalType":"address","name":"_from","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"uint256","name":"value","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"onERC1155Received","outputs":[{"internalType":"bytes4","name":"","type":"bytes4"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_operator","type":"address"},{"internalType":"address","name":"_from","type":"address"},{"internalType":"uint256","name":"_tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"onERC721Received","outputs":[{"internalType":"bytes4","name":"","type":"bytes4"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"safeMode","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"toAddress","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"},{"internalType":"uint256","name":"expireTime","type":"uint256"},{"internalType":"uint256","name":"sequenceId","type":"uint256"},{"internalType":"bytes","name":"signature","type":"bytes"}],"name":"sendMultiSig","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"recipients","type":"address[]"},{"internalType":"uint256[]","name":"values","type":"uint256[]"},{"internalType":"uint256","name":"expireTime","type":"uint256"},{"internalType":"uint256","name":"sequenceId","type":"uint256"},{"internalType":"bytes","name":"signature","type":"bytes"}],"name":"sendMultiSigBatch","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"toAddress","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"},{"internalType":"address","name":"tokenContractAddress","type":"address"},{"internalType":"uint256","name":"expireTime","type":"uint256"},{"internalType":"uint256","name":"sequenceId","type":"uint256"},{"internalType":"bytes","name":"signature","type":"bytes"}],"name":"sendMultiSigToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"forwarderAddress","type":"address"},{"internalType":"bool","name":"autoFlush","type":"bool"}],"name":"setAutoFlush1155","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"forwarderAddress","type":"address"},{"internalType":"bool","name":"autoFlush","type":"bool"}],"name":"setAutoFlush721","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"signers","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"stateMutability":"payable","type":"receive"}]

 Latest 25 blocks (From a total of 90 blocks with 5.60 Ether produced)

Block Transaction Difficulty Gas Used Reward
195617482024-04-01 15:03:23321 days ago17119838031380.00 TH14,567,392 (48.56%)
0.207834544253738191 ETH
195565272024-03-31 21:26:35322 days ago17119203952010.00 TH14,917,157 (49.72%)
0.024902862651554043 ETH
195491572024-03-30 20:32:11323 days ago17118307311740.00 TH16,480,796 (54.94%)
0.029430005641939905 ETH
195319712024-03-28 10:18:47325 days ago17116211271310.00 TH9,926,242 (33.09%)
0.010985925187125789 ETH
195202652024-03-26 18:04:47327 days ago17114762873140.00 TH24,228,789 (80.76%)
0.048481463560604282 ETH
194921202024-03-22 19:02:35331 days ago17111341552050.00 TH17,312,726 (57.71%)
0.028687072343786219 ETH
194888072024-03-22 7:54:35332 days ago17110940751600.00 TH12,202,146 (40.67%)
0.030404254703534618 ETH
194614762024-03-18 11:46:47335 days ago17107624074270.00 TH25,523,408 (85.08%)
0.012851735997312087 ETH
194553762024-03-17 15:13:23336 days ago17106884031430.00 TH14,868,207 (49.56%)
0.306329363303766759 ETH
194502472024-03-16 21:53:35337 days ago17106260151950.00 TH17,259,375 (57.53%)
0.048768937927453905 ETH
194440852024-03-16 1:04:35338 days ago17105510751280.00 TH7,748,413 (25.83%)
0.023735459711017654 ETH
194364572024-03-14 23:22:11339 days ago17104585311960.00 TH13,784,831 (45.95%)
0.051829404163544946 ETH
194155282024-03-12 0:49:23342 days ago17102045631640.00 TH15,139,245 (50.46%)
0.062740818411389362 ETH
194144672024-03-11 21:14:47342 days ago17101916871480.00 TH10,329,470 (34.43%)
0.212329026830446698 ETH
194118732024-03-11 12:31:35342 days ago17101602951370.00 TH9,707,986 (32.36%)
0.041868272020766091 ETH
193885272024-03-08 6:01:35346 days ago17098776951250.00 TH10,801,503 (36.01%)
0.049632966296845243 ETH
193814142024-03-07 6:10:47347 days ago17097918471240.00 TH9,427,952 (31.43%)
0.030769183340246891 ETH
193633272024-03-04 17:35:35349 days ago17095737351590.00 TH15,326,196 (51.09%)
0.099729911488581061 ETH
193573582024-03-03 21:35:35350 days ago17095017351500.00 TH14,439,989 (48.13%)
0.011026391939609951 ETH
193393652024-03-01 9:15:23352 days ago17092845231790.00 TH20,789,312 (69.30%)
0.024338817513068018 ETH
193338462024-02-29 14:44:47353 days ago17092178872940.00 TH24,506,090 (81.69%)
0.13194697572599704 ETH
193280022024-02-28 19:06:23354 days ago17091471831700.00 TH12,999,043 (43.33%)
0.104610329773720523 ETH
193279822024-02-28 19:02:23354 days ago17091469431620.00 TH12,894,480 (42.98%)
0.09476879078615286 ETH
193101842024-02-26 7:15:23357 days ago17089317231520.00 TH14,748,520 (49.16%)
0.063520251936728423 ETH
192767562024-02-21 14:54:35361 days ago17085272751400.00 TH10,794,206 (35.98%)
0.044985820128263254 ETH
View All Blocks Produced

Block Uncle Number Difficulty Gas Used Reward
View All Uncles
Loading...
Loading
Loading...
Loading

Latest 25 from a total of 18074 withdrawals (24,510.079374583 ETH withdrawn)

Validator Index Block Amount
974216198374732024-05-10 5:13:11283 days ago171531799132.010533024 ETH
974212198374732024-05-10 5:13:11283 days ago171531799132.010849844 ETH
974211198374722024-05-10 5:12:59283 days ago171531797932.010818341 ETH
974210198374722024-05-10 5:12:59283 days ago171531797932.010832607 ETH
974202198374722024-05-10 5:12:59283 days ago171531797932.010793561 ETH
974198198374722024-05-10 5:12:59283 days ago171531797932.010833039 ETH
974197198374722024-05-10 5:12:59283 days ago171531797932.010777194 ETH
974192198374722024-05-10 5:12:59283 days ago171531797932.010817431 ETH
974189198374722024-05-10 5:12:59283 days ago171531797932.010791536 ETH
974186198374722024-05-10 5:12:59283 days ago171531797932.010802288 ETH
974174198374722024-05-10 5:12:59283 days ago171531797932.01082341 ETH
974173198374722024-05-10 5:12:59283 days ago171531797932.010750726 ETH
974165198374722024-05-10 5:12:59283 days ago171531797932.010811881 ETH
974156198374722024-05-10 5:12:59283 days ago171531797932.010816992 ETH
974155198374722024-05-10 5:12:59283 days ago171531797932.010816145 ETH
974153198374722024-05-10 5:12:59283 days ago171531797932.010846752 ETH
974152198374722024-05-10 5:12:59283 days ago171531797932.010819652 ETH
974149198374722024-05-10 5:12:59283 days ago171531797932.010521499 ETH
974146198374712024-05-10 5:12:47283 days ago171531796732.010695603 ETH
974140198374712024-05-10 5:12:47283 days ago171531796732.01083301 ETH
974127198374712024-05-10 5:12:47283 days ago171531796732.010805306 ETH
974124198374712024-05-10 5:12:47283 days ago171531796732.01052566 ETH
974223197752992024-05-01 12:32:23291 days ago171456674332 ETH
974222197752992024-05-01 12:32:23291 days ago171456674332 ETH
974221197752992024-05-01 12:32:23291 days ago171456674332 ETH
View All Withdrawals

Transaction Hash Block Value Eth2 PubKey Valid
View All Deposits
Chain Token Portfolio % Price Amount Value
ETH
Ether (ETH)
46.47%$2,700.2220,779.1896$56,108,369
ETH17.53%$0.99998321,162,191.2765$21,161,831.52
ETH16.96%$2.249,140,495.7165$20,474,710.4
ETH6.43%$0.15516350,000,000$7,758,150
ETH3.42%$2,692.431,535.2884$4,133,656.62
ETH2.92%$1.023,443,828.8576$3,519,593.09
ETH1.71%$0.2863997,193,220.6579$2,060,131.2
ETH1.06%$0.9999821,283,361.8703$1,283,338.77
ETH0.61%$2,897.53253.5935$734,794.75
ETH0.37%$1.01450,000$452,250
ETH0.31%$0.99749375,872.4165$374,928.98
ETH0.26%$0.0597655,206,793.3381$311,184
ETH0.21%$26.549,707.6298$257,640.5
ETH0.21%$0.999767250,653.6491$250,595.25
ETH0.20%$0.0357696,894,275.0554$246,602.08
ETH0.16%$0.0219558,528,434.2272$187,239.04
ETH0.13%$0.39194404,326.2595$158,471.63
ETH0.13%$2,917.0353.5359$156,165.81
ETH0.12%$0.0192717,692,033.9889$148,233.69
ETH0.09%$0.021945,208,016.5822$114,263.75
ETH0.07%$260.5301.3403$78,499.14
ETH0.06%$1.3357,309.5477$76,426.79
ETH0.06%$1.9636,779.452$72,087.73
ETH0.06%$0.0205033,464,158.9466$71,026.34
ETH0.05%$3.6315,854.6761$57,552.47
ETH0.04%$0.0071226,704,772.09$47,748.84
ETH0.03%$4.359,335.7467$40,610.5
ETH0.03%$0.79474339,468.2447$31,367.11
ETH0.02%$0.00252811,140,457$28,158.62
ETH0.02%$0.51570653,366.0918$27,521.22
ETH0.02%$0.81854529,687.49$24,300.55
ETH0.02%$14.211,630.114$23,163.92
ETH0.02%$0.26184279,148.3557$20,724.36
ETH0.02%$0.092358208,333.02$19,241.22
ETH0.01%$0.17499299,527.0582$17,416.44
ETH0.01%$0.33439351,083.3524$17,081.92
ETH0.01%$0.024329672,882$16,370.26
ETH0.01%$3,027.454.8095$14,560.4
ETH0.01%$0.98342713,753.8267$13,525.88
ETH0.01%$0.064363189,719.3$12,210.9
ETH<0.01%$0.023069373,615.2397$8,618.96
ETH<0.01%$0.9167198,985.2836$8,236.98
ETH<0.01%$7.511,060.8366$7,966.88
ETH<0.01%$3.382,152$7,273.76
ETH<0.01%$260.526.6626$6,945.6
ETH<0.01%$0.042557150,019.9866$6,384.37
ETH<0.01%$0.6894329,217.4434$6,354.8
ETH<0.01%$0.020365283,390.2659$5,771.19
ETH<0.01%$0.021962254,665.165$5,592.96
ETH<0.01%$0.019234255,769.2336$4,919.39
ETH<0.01%$0.031661145,505.9136$4,606.81
ETH<0.01%$0.07877353,880.1637$4,244.3
ETH<0.01%$0.0006895,500,000$3,787.74
ETH<0.01%$0.006663562,800.6114$3,750.19
ETH<0.01%$0.0026731,337,501.4487$3,574.96
ETH<0.01%$0.0016092,088,317.7073$3,360.17
ETH<0.01%$5,882.460.5562$3,271.76
ETH<0.01%$0.03263384,974.8031$2,772.95
ETH<0.01%$0.012563210,907.5175$2,649.57
ETH<0.01%$0.13004719,626.8529$2,552.41
ETH<0.01%$0.272129,265.0928$2,521.22
ETH<0.01%$2.381,012.1285$2,410.99
ETH<0.01%$12.8184.6347$2,363.32
ETH<0.01%$9.72174$1,691.28
ETH<0.01%$0.5280752,667.2812$1,408.52
ETH<0.01%$0.6425181,989.5479$1,278.32
ETH<0.01%$0.03351535,923.9784$1,203.98
ETH<0.01%$0.5503982,154.5471$1,185.86
ETH<0.01%$0.7082881,601.6197$1,134.41
ETH<0.01%$0.5112382,160.3873$1,104.47
ETH<0.01%$0.05809318,573.3833$1,078.98
ETH<0.01%$0.1632856,292.7$1,027.5
ETH<0.01%<$0.0000014,875,789,702.4587$973.07
ETH<0.01%$1.02917.73$935.17
ETH<0.01%$0.01428559,335.8149$847.64
ETH<0.01%$981.660.6953$682.59
ETH<0.01%$2,700.220.2388$644.68
ETH<0.01%$2.41233.0758$561.71
ETH<0.01%$0.01160548,225.25$559.65
ETH<0.01%$95.785.5481$531.4
ETH<0.01%$0.3441491,487.7286$512
ETH<0.01%$0.03447712,884.1246$444.2
ETH<0.01%$0.000619712,745.6935$440.95
ETH<0.01%$0.647015671.3627$434.38
ETH<0.01%$0.0000587,333,333.3333$428.25
ETH<0.01%$0.001113346,050.9514$385.16
ETH<0.01%$0.001726217,236.9655$374.91
ETH<0.01%$1.19310.2658$367.82
ETH<0.01%$0.100893,509.3555$354.06
ETH<0.01%$0.999522300.1$299.96
ETH<0.01%$0.0425165,619.3892$238.91
ETH<0.01%$0.00470548,942$230.28
ETH<0.01%$18.99$170.1
ETH<0.01%$0.914149183.8769$168.09
ETH<0.01%$0.00729521,544.263$157.16
ETH<0.01%$2,874.730.05$143.66
ETH<0.01%$0.0012115,287.1773$138.34
ETH<0.01%$0.0206565,835.4705$120.54
ETH<0.01%$181.390.5$90.69
ETH<0.01%$0.101391872$88.41
ETH<0.01%$96,0440.00089735$86.19
ETH<0.01%$0.812129101$82.02
ETH<0.01%$0.98888180.3832$79.49
ETH<0.01%$0.0675691,140.6903$77.08
ETH<0.01%$0.0431961,520.5827$65.68
ETH<0.01%$0.00214130,000$64.22
ETH<0.01%$0.71410588.1236$62.93
ETH<0.01%$0.0196533,045.5407$59.86
ETH<0.01%$0.000159358,327.7846$56.87
ETH<0.01%$95,875.890.0005$47.94
ETH<0.01%$0.09114471.1521$42.94
ETH<0.01%$0.41803102.3036$42.77
ETH<0.01%$4.428.6756$38.35
ETH<0.01%$0.00294812,775.9525$37.67
ETH<0.01%$0.99972931.0852$31.08
ETH<0.01%$0.0053385,586.6585$29.82
ETH<0.01%$9.722.6694$25.95
ETH<0.01%$24.560.97$23.82
ETH<0.01%$0.47269941.8386$19.78
ETH<0.01%$0.33117457.1466$18.93
ETH<0.01%$0.018986956.6822$18.16
ETH<0.01%$0.041953400$16.78
ETH<0.01%$0.045467358.6759$16.31
ETH<0.01%$0.000033492,456.1071$16.15
ETH<0.01%$0.019914735.5754$14.65
ETH<0.01%$0.0077531,646.7512$12.77
ETH<0.01%$3.983.0579$12.17
ETH<0.01%$0.0016167,430.2853$12.01
ETH<0.01%$6.861.6431$11.27
ETH<0.01%$0.001367,530.9583$10.24
ETH<0.01%$0.0028113,269.1039$9.19
ETH<0.01%$0.0009569,499$9.08
ETH<0.01%$0.29450728.0899$8.27
ETH<0.01%$0.06312100$6.31
ETH<0.01%<$0.000001785,033,186.0822$5.44
ETH<0.01%$0.00025419,781.91$5.02
ETH<0.01%$0.0009825,053.5695$4.96
ETH<0.01%$1.62.8458$4.55
ETH<0.01%$0.0032621,332.1149$4.35
ETH<0.01%$0.3478110$3.48
ETH<0.01%$0.3216810$3.22
ETH<0.01%$0.994811.9661$1.96
ETH<0.01%$0.0007132,374.324$1.69
ETH<0.01%<$0.0000011,242,716,219.4949$1.52
ETH<0.01%$0.999890.8623$0.8622
ETH<0.01%$0.0006151,000$0.6154
ETH<0.01%$0.0001673,000$0.5009
ETH<0.01%$0.0905675$0.4528
ETH<0.01%$0.3226410.8628$0.2783
ETH<0.01%$0.00034442.7673$0.1504
BASE<0.01%$0.01559812,000$187.17
BASE<0.01%$0.00018720,000$3.73
BASE<0.01%$0.006113206.4$1.26
BASE<0.01%<$0.00000129,577,464$0.6891
BASE<0.01%$0.0003181,761.4937$0.5602
BSC<0.01%$0.03270810$0.327
POL<0.01%$0.3224720.0001$0.000032
Loading...
Loading
[ Download: CSV Export  ]
[ Download: CSV Export  ]
[ Download: CSV Export  ]

A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.