ETH Price: $2,164.16 (+0.43%)

Contract

0x0F191DD7f3bD19acE2d00cCc68d2B7da910Cfa80
 

Overview

ETH Balance

0 ETH

Eth Value

$0.00

More Info

Private Name Tags

Multichain Info

No addresses found
Transaction Hash
Method
Block
From
To
Transfer157033542022-10-08 12:24:351264 days ago1665231875IN
0x0F191DD7...a910Cfa80
0.05699883 ETH0.000240476.09748957
Transfer155361512022-09-15 1:31:041288 days ago1663205464IN
0x0F191DD7...a910Cfa80
0.04383711 ETH0.000483112.24954602
Transfer153706052022-08-19 9:54:581314 days ago1660902898IN
0x0F191DD7...a910Cfa80
0.20353967 ETH0.0003978410.08772355
Transfer151719812022-07-19 8:30:391345 days ago1658219439IN
0x0F191DD7...a910Cfa80
0.10023831 ETH0.000368899.35362397
Transfer150943332022-07-07 8:22:571357 days ago1657182177IN
0x0F191DD7...a910Cfa80
0.20295709 ETH0.0004884312.38455927
Transfer147979062022-05-18 8:54:281407 days ago1652864068IN
0x0F191DD7...a910Cfa80
0.20036666 ETH0.0006894417.48133435
Transfer144935092022-03-31 10:50:001455 days ago1648723800IN
0x0F191DD7...a910Cfa80
0.10077991 ETH0.0016982343.05972074
Transfer142484512022-02-21 8:54:471493 days ago1645433687IN
0x0F191DD7...a910Cfa80
0.10217901 ETH0.0015910140.34127382
Transfer140947682022-01-28 14:42:101517 days ago1643380930IN
0x0F191DD7...a910Cfa80
0.09176881 ETH0.0030218576.62110335
Transfer140218392022-01-17 8:07:501528 days ago1642406870IN
0x0F191DD7...a910Cfa80
0.10282145 ETH0.00537175136.20402608
Transfer138151442021-12-16 8:31:591560 days ago1639643519IN
0x0F191DD7...a910Cfa80
0.1020754 ETH0.0022242556.39747219
Transfer136569182021-11-21 7:49:401585 days ago1637480980IN
0x0F191DD7...a910Cfa80
0.10445572 ETH0.0034964488.65451112
Transfer135310292021-11-01 11:56:201605 days ago1635767780IN
0x0F191DD7...a910Cfa80
0.1012696 ETH0.00406421103.05074973
Transfer134026302021-10-12 8:43:351625 days ago1634028215IN
0x0F191DD7...a910Cfa80
0.10089937 ETH0.0030858978.24474033
Transfer132810032021-09-23 8:47:121644 days ago1632386832IN
0x0F191DD7...a910Cfa80
0.10178467 ETH0.0016486241.80198359
Transfer131646392021-09-05 8:24:211662 days ago1630830261IN
0x0F191DD7...a910Cfa80
0.10135105 ETH0.0031916380.92595061
Transfer130675192021-08-21 8:12:541677 days ago1629533574IN
0x0F191DD7...a910Cfa80
0.10055493 ETH0.0009037322.91480388
Transfer129767162021-08-07 7:57:251691 days ago1628323045IN
0x0F191DD7...a910Cfa80
0.10529045 ETH0.0014424836.57497531
Transfer129006192021-07-26 7:55:451703 days ago1627286145IN
0x0F191DD7...a910Cfa80
0.10539196 ETH0.000197195
Transfer128239052021-07-14 7:50:461715 days ago1626249046IN
0x0F191DD7...a910Cfa80
0.10842072 ETH0.000118313
Transfer127557252021-07-03 16:36:201726 days ago1625330180IN
0x0F191DD7...a910Cfa80
0.10000597 ETH0.000039431
Transfer126760602021-06-21 6:33:181738 days ago1624257198IN
0x0F191DD7...a910Cfa80
0.10000291 ETH0.000039431
Transfer125964842021-06-08 22:10:201751 days ago1623190220IN
0x0F191DD7...a910Cfa80
0.10006137 ETH0.000039431
Transfer125174822021-05-27 16:39:221763 days ago1622133562IN
0x0F191DD7...a910Cfa80
0.07439879 ETH0.000039431
Transfer124723512021-05-20 16:30:031770 days ago1621528203IN
0x0F191DD7...a910Cfa80
0.0944142 ETH0.000039431
View all transactions

Latest 25 internal transactions (View All)

Advanced mode:
Parent Transaction Hash Method Block
From
To
Transfer157033542022-10-08 12:24:351264 days ago1665231875
0x0F191DD7...a910Cfa80
0.05699883 ETH
Transfer155361512022-09-15 1:31:041288 days ago1663205464
0x0F191DD7...a910Cfa80
0.04383711 ETH
Transfer153706052022-08-19 9:54:581314 days ago1660902898
0x0F191DD7...a910Cfa80
0.20353967 ETH
Transfer151719812022-07-19 8:30:391345 days ago1658219439
0x0F191DD7...a910Cfa80
0.10023831 ETH
Transfer150943332022-07-07 8:22:571357 days ago1657182177
0x0F191DD7...a910Cfa80
0.20295709 ETH
-147979062022-05-18 8:54:281407 days ago1652864068
0x0F191DD7...a910Cfa80
0.20036666 ETH
-144935092022-03-31 10:50:001455 days ago1648723800
0x0F191DD7...a910Cfa80
0.10077991 ETH
-142484512022-02-21 8:54:471493 days ago1645433687
0x0F191DD7...a910Cfa80
0.10217901 ETH
-140947682022-01-28 14:42:101517 days ago1643380930
0x0F191DD7...a910Cfa80
0.09176881 ETH
-140218392022-01-17 8:07:501528 days ago1642406870
0x0F191DD7...a910Cfa80
0.10282145 ETH
-138151442021-12-16 8:31:591560 days ago1639643519
0x0F191DD7...a910Cfa80
0.1020754 ETH
-136569182021-11-21 7:49:401585 days ago1637480980
0x0F191DD7...a910Cfa80
0.10445572 ETH
-135310292021-11-01 11:56:201605 days ago1635767780
0x0F191DD7...a910Cfa80
0.1012696 ETH
-134026302021-10-12 8:43:351625 days ago1634028215
0x0F191DD7...a910Cfa80
0.10089937 ETH
-132810032021-09-23 8:47:121644 days ago1632386832
0x0F191DD7...a910Cfa80
0.10178467 ETH
-131646392021-09-05 8:24:211662 days ago1630830261
0x0F191DD7...a910Cfa80
0.10135105 ETH
-130675192021-08-21 8:12:541677 days ago1629533574
0x0F191DD7...a910Cfa80
0.10055493 ETH
-129767162021-08-07 7:57:251691 days ago1628323045
0x0F191DD7...a910Cfa80
0.10529045 ETH
-129006192021-07-26 7:55:451703 days ago1627286145
0x0F191DD7...a910Cfa80
0.10539196 ETH
-128239052021-07-14 7:50:461715 days ago1626249046
0x0F191DD7...a910Cfa80
0.10842072 ETH
-127557252021-07-03 16:36:201726 days ago1625330180
0x0F191DD7...a910Cfa80
0.10000597 ETH
-126760602021-06-21 6:33:181738 days ago1624257198
0x0F191DD7...a910Cfa80
0.10000291 ETH
-125964842021-06-08 22:10:201751 days ago1623190220
0x0F191DD7...a910Cfa80
0.10006137 ETH
-125174822021-05-27 16:39:221763 days ago1622133562
0x0F191DD7...a910Cfa80
0.07439879 ETH
-124723512021-05-20 16:30:031770 days ago1621528203
0x0F191DD7...a910Cfa80
0.0944142 ETH
View All Internal Transactions
Loading...
Loading
Loading...
Loading
Cross-Chain Transactions

Block Transaction Difficulty Gas Used Reward
View All Blocks Produced

Validator Index Block Amount
View All Withdrawals

Transaction Hash Block Value Eth2 PubKey Valid
View All Deposits
Loading...
Loading

Minimal Proxy Contract for 0x059ffafdc6ef594230de44f824e2bd0a51ca5ded

Contract Name:
Forwarder

Compiler Version
v0.7.5+commit.eb77ed08

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, Apache-2.0 license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2021-02-24
*/

pragma solidity 0.7.5;

/*
    The MIT License (MIT)
    Copyright (c) 2018 Murray Software, LLC.
    Permission is hereby granted, free of charge, to any person obtaining
    a copy of this software and associated documentation files (the
    "Software"), to deal in the Software without restriction, including
    without limitation the rights to use, copy, modify, merge, publish,
    distribute, sublicense, and/or sell copies of the Software, and to
    permit persons to whom the Software is furnished to do so, subject to
    the following conditions:
    The above copyright notice and this permission notice shall be included
    in all copies or substantial portions of the Software.
    THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
    OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
    MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
    IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
    CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
    TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
    SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
*/
//solhint-disable max-line-length
//solhint-disable no-inline-assembly

contract CloneFactory {
  function createClone(address target, bytes32 salt)
    internal
    returns (address payable result)
  {
    bytes20 targetBytes = bytes20(target);
    assembly {
      // load the next free memory slot as a place to store the clone contract data
      let clone := mload(0x40)

      // The bytecode block below is responsible for contract initialization
      // during deployment, it is worth noting the proxied contract constructor will not be called during
      // the cloning procedure and that is why an initialization function needs to be called after the
      // clone is created
      mstore(
        clone,
        0x3d602d80600a3d3981f3363d3d373d3d3d363d73000000000000000000000000
      )

      // This stores the address location of the implementation contract
      // so that the proxy knows where to delegate call logic to
      mstore(add(clone, 0x14), targetBytes)

      // The bytecode block is the actual code that is deployed for each clone created.
      // It forwards all calls to the already deployed implementation via a delegatecall
      mstore(
        add(clone, 0x28),
        0x5af43d82803e903d91602b57fd5bf30000000000000000000000000000000000
      )

      // deploy the contract using the CREATE2 opcode
      // this deploys the minimal proxy defined above, which will proxy all
      // calls to use the logic defined in the implementation contract `target`
      result := create2(0, clone, 0x37, salt)
    }
  }

  function isClone(address target, address query)
    internal
    view
    returns (bool result)
  {
    bytes20 targetBytes = bytes20(target);
    assembly {
      // load the next free memory slot as a place to store the comparison clone
      let clone := mload(0x40)

      // The next three lines store the expected bytecode for a miniml proxy
      // that targets `target` as its implementation contract
      mstore(
        clone,
        0x363d3d373d3d3d363d7300000000000000000000000000000000000000000000
      )
      mstore(add(clone, 0xa), targetBytes)
      mstore(
        add(clone, 0x1e),
        0x5af43d82803e903d91602b57fd5bf30000000000000000000000000000000000
      )

      // the next two lines store the bytecode of the contract that we are checking in memory
      let other := add(clone, 0x40)
      extcodecopy(query, other, 0, 0x2d)

      // Check if the expected bytecode equals the actual bytecode and return the result
      result := and(
        eq(mload(clone), mload(other)),
        eq(mload(add(clone, 0xd)), mload(add(other, 0xd)))
      )
    }
  }
}


/**
 * 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);
}

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

    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 data) = token.call(abi.encodeWithSelector(0x23b872dd, from, to, value));
        require(
            success && (data.length == 0 || abi.decode(data, (bool))),
            'TransferHelper::transferFrom: transferFrom failed'
        );
    }

    function safeTransferETH(address to, uint256 value) internal {
        (bool success, ) = to.call{value: value}(new bytes(0));
        require(success, 'TransferHelper::safeTransferETH: ETH transfer failed');
    }
}


/**
 * Contract that will forward any incoming Ether to the creator of the contract
 *
 */
contract Forwarder {
  // Address to which any funds sent to this contract will be forwarded
  address public parentAddress;
  event ForwarderDeposited(address from, uint256 value, bytes data);

  /**
   * Initialize the contract, and sets the destination address to that of the creator
   */
  function init(address _parentAddress) external onlyUninitialized {
    parentAddress = _parentAddress;
    uint256 value = address(this).balance;

    if (value == 0) {
      return;
    }

    (bool success, ) = parentAddress.call{ value: value }('');
    require(success, 'Flush failed');
    // NOTE: since we are forwarding on initialization,
    // we don't have the context of the original sender.
    // We still emit an event about the forwarding but set
    // the sender to the forwarder itself
    emit ForwarderDeposited(address(this), value, msg.data);
  }

  /**
   * Modifier that will execute internal code block only if the sender is the parent address
   */
  modifier onlyParent {
    require(msg.sender == parentAddress, 'Only Parent');
    _;
  }

  /**
   * Modifier that will execute internal code block only if the contract has not been initialized yet
   */
  modifier onlyUninitialized {
    require(parentAddress == address(0x0), 'Already initialized');
    _;
  }

  /**
   * Default function; Gets called when data is sent but does not match any other function
   */
  fallback() external payable {
    flush();
  }

  /**
   * Default function; Gets called when Ether is deposited with no data, and forwards it to the parent address
   */
  receive() external payable {
    flush();
  }

  /**
   * 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 onlyParent {
    ERC20Interface instance = ERC20Interface(tokenContractAddress);
    address forwarderAddress = address(this);
    uint256 forwarderBalance = instance.balanceOf(forwarderAddress);
    if (forwarderBalance == 0) {
      return;
    }

    TransferHelper.safeTransfer(
      tokenContractAddress,
      parentAddress,
      forwarderBalance
    );
  }

  /**
   * Flush the entire balance of the contract to the parent address.
   */
  function flush() public {
    uint256 value = address(this).balance;

    if (value == 0) {
      return;
    }

    (bool success, ) = parentAddress.call{ value: value }('');
    require(success, 'Flush failed');
    emit ForwarderDeposited(msg.sender, value, msg.data);
  }
}

contract ForwarderFactory is CloneFactory {
  address public implementationAddress;

  event ForwarderCreated(address newForwarderAddress, address parentAddress);

  constructor(address _implementationAddress) {
    implementationAddress = _implementationAddress;
  }

  function createForwarder(address parent, bytes32 salt) external {
    // include the signers in the salt so any contract deployed to a given address must have the same signers
    bytes32 finalSalt = keccak256(abi.encodePacked(parent, salt));

    address payable clone = createClone(implementationAddress, finalSalt);
    Forwarder(clone).init(parent);
    emit ForwarderCreated(clone, parent);
  }
}

Contract ABI

API
[{"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":"ForwarderDeposited","type":"event"},{"stateMutability":"payable","type":"fallback"},{"inputs":[],"name":"flush","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"tokenContractAddress","type":"address"}],"name":"flushTokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_parentAddress","type":"address"}],"name":"init","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"parentAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"stateMutability":"payable","type":"receive"}]

Block Uncle Number Difficulty Gas Used Reward
View All Uncles
Loading...
Loading
Loading...
Loading
Loading...
Loading
[ Download: CSV Export  ]
[ Download: CSV Export  ]

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