ETH Price: $1,886.21 (+5.61%)

Contract

0xBaF92C69354B6D92ee9f6eE6022E4BB13A7c4590
 

Overview

ETH Balance

0 ETH

Eth Value

$0.00

Multichain Info

No addresses found
Transaction Hash
Method
Block
From
To
Initialize145751382022-04-13 4:39:441084 days ago1649824784IN
0xBaF92C69...13A7c4590
0 ETH0.0019271843.80759476

Latest 25 internal transactions (View All)

Advanced mode:
Parent Transaction Hash Method Block
From
To
Transfer159699492022-11-14 18:04:35868 days ago1668449075
0xBaF92C69...13A7c4590
0.01179517 ETH
Transfer159699492022-11-14 18:04:35868 days ago1668449075
0xBaF92C69...13A7c4590
0.19 ETH
Transfer159699492022-11-14 18:04:35868 days ago1668449075
0xBaF92C69...13A7c4590
0.20179517 ETH
Deposit153699292022-08-19 7:07:52956 days ago1660892872
0xBaF92C69...13A7c4590
0.3 ETH
Uni V3Swap153699292022-08-19 7:07:52956 days ago1660892872
0xBaF92C69...13A7c4590
0.3 ETH
Transfer152678452022-08-03 6:18:02972 days ago1659507482
0xBaF92C69...13A7c4590
0.00385411 ETH
Transfer152678452022-08-03 6:18:02972 days ago1659507482
0xBaF92C69...13A7c4590
0.21339009 ETH
Transfer152678452022-08-03 6:18:02972 days ago1659507482
0xBaF92C69...13A7c4590
0.2172442 ETH
Transfer152367392022-07-29 10:12:27976 days ago1659089547
0xBaF92C69...13A7c4590
0.00538607 ETH
Transfer152367392022-07-29 10:12:27976 days ago1659089547
0xBaF92C69...13A7c4590
0.89691352 ETH
Transfer152367392022-07-29 10:12:27976 days ago1659089547
0xBaF92C69...13A7c4590
0.90229959 ETH
Deposit152250332022-07-27 14:18:07978 days ago1658931487
0xBaF92C69...13A7c4590
0.2 ETH
Uni V3Swap152250332022-07-27 14:18:07978 days ago1658931487
0xBaF92C69...13A7c4590
0.2 ETH
Deposit151698462022-07-19 0:31:50987 days ago1658190710
0xBaF92C69...13A7c4590
0.2 ETH
Uni V3Swap151698462022-07-19 0:31:50987 days ago1658190710
0xBaF92C69...13A7c4590
0.2 ETH
-149428652022-06-11 6:43:501025 days ago1654929830
0xBaF92C69...13A7c4590
0.00971447 ETH
-149428652022-06-11 6:43:501025 days ago1654929830
0xBaF92C69...13A7c4590
0.1278456 ETH
-149428652022-06-11 6:43:501025 days ago1654929830
0xBaF92C69...13A7c4590
0.13756008 ETH
-149318842022-06-09 9:33:581027 days ago1654767238
0xBaF92C69...13A7c4590
0.2 ETH
-149318842022-06-09 9:33:581027 days ago1654767238
0xBaF92C69...13A7c4590
0.2 ETH
-147637002022-05-12 22:25:271054 days ago1652394327
0xBaF92C69...13A7c4590
0.1 ETH
-147637002022-05-12 22:25:271054 days ago1652394327
0xBaF92C69...13A7c4590
0.1 ETH
-147519582022-05-11 1:28:001056 days ago1652232480
0xBaF92C69...13A7c4590
0.1 ETH
-147519582022-05-11 1:28:001056 days ago1652232480
0xBaF92C69...13A7c4590
0.1 ETH
-147274712022-05-07 3:30:281060 days ago1651894228
0xBaF92C69...13A7c4590
0.01030719 ETH
View All Internal Transactions
Loading...
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
UniV3Adapter02

Compiler Version
v0.8.10+commit.fc410830

Optimization Enabled:
Yes with 800 runs

Other Settings:
default evmVersion
File 1 of 3 : UniV3Adapter02.sol
// SPDX-License-Identifier: GPL-3.0-or-later
pragma solidity =0.8.10;
pragma abicoder v1;

import '../token/IERC20.sol';
import '../token/IWETH.sol';

/// @title Brink UniV3Adapter02
/// @notice Deployed once and used by Brink executors to fulfill swaps. Uses V3SwapRouter from Uniswap.
contract UniV3Adapter02 {
  IWETH public weth;
  bool public initialized;

  /// @dev Contract Address of the Uniswap V3SwapRouter
  address constant V3_SWAP_ROUTER_ADDRESS = 0x68b3465833fb72A70ecDF485E0e4C7bD8665Fc45;

  /// @dev Max uint
  uint256 MAX_INT = 0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff;

  /// @dev Adapter Owner
  address payable ADAPTER_OWNER = payable(0x71795b2d53Ffbe5b1805FE725538E4f8fBD29e26);

  /// @dev Ethereum address representations
  IERC20 private constant _ETH_ADDRESS = IERC20(0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE);
  IERC20 private constant _ZERO_ADDRESS = IERC20(0x0000000000000000000000000000000000000000);

  error NotEnoughETH();
  error NotEnoughTokenIn(uint amount);
  error NotEnoughTokenOut(uint amount);

  /// @dev initialize the contract with WETH address
  /// @param _weth Address of weth
  function initialize (IWETH _weth) external {
    require(!initialized, 'INITIALIZED');
    initialized = true;
    weth = _weth;
  }

  /// @dev Makes a call to the Uniswap V3SwapRouter with swap byte data
  /// @dev returns the requested tokenOutAmount to Account and keeps the rest
  /// @param data swap byte data for Uniswap V3SwapRouter
  /// @param tokenIn Address of the token to be swapped
  /// @param tokenOut Address of the token to be returned from the swap
  /// @param tokenOutAmount Amount of tokenOut to transfer to account
  /// @param account Address of the account to receive the tokenOut
  /// @param minTokenInArb Minimum amount of tokenIn arbitrage revenue remaining for ADAPTER_OWNER
  /// @param minTokenOutArb Minimum amount of tokenOut arbitrage revenue remaining for ADAPTER_OWNER
  function uniV3Swap(bytes memory data, IERC20 tokenIn, IERC20 tokenOut, uint tokenOutAmount, address payable account, uint minTokenInArb, uint minTokenOutArb) external payable {
    if (isETH(tokenIn)) {
      tokenIn = IERC20(address(weth));
      weth.deposit{ value: address(this).balance }();
    }
    _routerApproveMax(tokenIn);

    assembly {
      let result := call(gas(), V3_SWAP_ROUTER_ADDRESS, 0, add(data, 0x20), mload(data), 0, 0)
      if eq(result, 0) {
        returndatacopy(0, 0, returndatasize())
        revert(0, returndatasize())
      }
    }

    if (isETH(tokenOut)) {
      uint wethBal = weth.balanceOf(address(this));
      weth.withdraw(wethBal);
      if (wethBal < tokenOutAmount) {
        revert NotEnoughETH();
      }
      account.transfer(tokenOutAmount);
      uint ethBalRemaining = address(this).balance;
      if (ethBalRemaining < minTokenOutArb) {
        revert NotEnoughTokenOut(ethBalRemaining);
      }
      ADAPTER_OWNER.transfer(ethBalRemaining);
    } else {
      tokenOut.transfer(account, tokenOutAmount);
      uint tokenOutBalRemaining = tokenOut.balanceOf(address(this));
      if (tokenOutBalRemaining < minTokenOutArb) {
        revert NotEnoughTokenOut(tokenOutBalRemaining);
      }
      tokenOut.transfer(ADAPTER_OWNER, tokenOutBalRemaining);
    }

    uint tokenInBalRemaining = tokenIn.balanceOf(address(this));
    if (tokenInBalRemaining < minTokenInArb) {
      revert NotEnoughTokenIn(tokenInBalRemaining);
    } else if (tokenInBalRemaining > 0) {
      tokenIn.transfer(ADAPTER_OWNER, tokenInBalRemaining);
    }
  }

  function _routerApproveMax(IERC20 token) internal {
    if (token.allowance(address(this), V3_SWAP_ROUTER_ADDRESS) < MAX_INT) {
      token.approve(V3_SWAP_ROUTER_ADDRESS, MAX_INT);
    }
  }

  /// @dev Checks if IERC20 token address is an ETH representation
  /// @param token address of a token
  function isETH(IERC20 token) internal pure returns (bool) {
    return (token == _ZERO_ADDRESS || token == _ETH_ADDRESS);
  }

  receive() external payable { }
}

File 2 of 3 : IERC20.sol
// SPDX-License-Identifier: GPL-3.0-or-later
pragma solidity =0.8.10;

/**
 * @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 3 : IWETH.sol
// SPDX-License-Identifier: GPL-3.0-or-later
pragma solidity =0.8.10;

interface IWETH {
    function name() external view returns (string memory);

    function symbol() external view returns (string memory);

    function decimals() external view returns (uint8);

    function balanceOf(address) external view returns (uint);

    function allowance(address, address) external view returns (uint);

    receive() external payable;

    function deposit() external payable;

    function withdraw(uint wad) external;

    function totalSupply() external view returns (uint);

    function approve(address guy, uint wad) external returns (bool);

    function transfer(address dst, uint wad) external returns (bool);

    function transferFrom(address src, address dst, uint wad)
    external
    returns (bool);
}

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

Contract Security Audit

Contract ABI

API
[{"inputs":[],"name":"NotEnoughETH","type":"error"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"NotEnoughTokenIn","type":"error"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"NotEnoughTokenOut","type":"error"},{"inputs":[{"internalType":"contract IWETH","name":"_weth","type":"address"}],"name":"initialize","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"initialized","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes","name":"data","type":"bytes"},{"internalType":"contract IERC20","name":"tokenIn","type":"address"},{"internalType":"contract IERC20","name":"tokenOut","type":"address"},{"internalType":"uint256","name":"tokenOutAmount","type":"uint256"},{"internalType":"address payable","name":"account","type":"address"},{"internalType":"uint256","name":"minTokenInArb","type":"uint256"},{"internalType":"uint256","name":"minTokenOutArb","type":"uint256"}],"name":"uniV3Swap","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"weth","outputs":[{"internalType":"contract IWETH","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"stateMutability":"payable","type":"receive"}]

6080604052600019600155600280546001600160a01b0319167371795b2d53ffbe5b1805fe725538e4f8fbd29e2617905534801561003c57600080fd5b5061089d8061004c6000396000f3fe6080604052600436106100435760003560e01c8063158ef93e1461004f5780633fc8cef31461008457806392be7035146100c0578063c4d66de81461019457600080fd5b3661004a57005b600080fd5b34801561005b57600080fd5b5060005461007090600160a01b900460ff1681565b604080519115158252519081900360200190f35b34801561009057600080fd5b506000546100a4906001600160a01b031681565b604080516001600160a01b039092168252519081900360200190f35b610192600480360360e08110156100d657600080fd5b8101906020810181356401000000008111156100f157600080fd5b82018360208201111561010357600080fd5b8035906020019184600183028401116401000000008311171561012557600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929550506001600160a01b038335811694506020840135811693604081013593506060810135909116915060808101359060a001356101c7565b005b3480156101a057600080fd5b50610192600480360360208110156101b757600080fd5b50356001600160a01b03166106a9565b6101d086610749565b15610237576000805460408051630d0e30db60e41b815290516001600160a01b039092169850889263d0e30db0924792600480820193929182900301818588803b15801561021d57600080fd5b505af1158015610231573d6000803e3d6000fd5b50505050505b61024086610783565b600080885160208a0160007368b3465833fb72a70ecdf485e0e4c7bd8665fc455af180610271573d6000803e3d6000fd5b5061027b85610749565b156104135760008054604080516370a0823160e01b815230600482015290516001600160a01b03909216916370a08231916024808201926020929091908290030181865afa1580156102d1573d6000803e3d6000fd5b505050506040513d60208110156102e757600080fd5b50516000805460408051632e1a7d4d60e01b81526004810185905290519394506001600160a01b0390911692632e1a7d4d9260248084019391929182900301818387803b15801561033757600080fd5b505af115801561034b573d6000803e3d6000fd5b505050508481101561037057604051632c1d501360e11b815260040160405180910390fd5b6040516001600160a01b0385169086156108fc029087906000818181858888f193505050501580156103a6573d6000803e3d6000fd5b5047828110156103d1576040805163a1e01af560e01b81526004810183905290519081900360240190fd5b6002546040516001600160a01b039091169082156108fc029083906000818181858888f1935050505015801561040b573d6000803e3d6000fd5b50505061058e565b846001600160a01b031663a9059cbb84866040518363ffffffff1660e01b815260040180836001600160a01b03168152602001828152602001925050506020604051808303816000875af115801561046f573d6000803e3d6000fd5b505050506040513d602081101561048557600080fd5b5050604080516370a0823160e01b815230600482015290516000916001600160a01b038816916370a08231916024808201926020929091908290030181865afa1580156104d6573d6000803e3d6000fd5b505050506040513d60208110156104ec57600080fd5b5051905081811015610519576040805163a1e01af560e01b81526004810183905290519081900360240190fd5b6002546040805163a9059cbb60e01b81526001600160a01b0392831660048201526024810184905290519188169163a9059cbb9160448082019260209290919082900301816000875af1158015610574573d6000803e3d6000fd5b505050506040513d602081101561058a57600080fd5b5050505b6000866001600160a01b03166370a08231306040518263ffffffff1660e01b815260040180826001600160a01b03168152602001915050602060405180830381865afa1580156105e2573d6000803e3d6000fd5b505050506040513d60208110156105f857600080fd5b50519050828110156106255760408051632574f1c160e11b81526004810183905290519081900360240190fd5b801561069f576002546040805163a9059cbb60e01b81526001600160a01b0392831660048201526024810184905290519189169163a9059cbb9160448082019260209290919082900301816000875af1158015610686573d6000803e3d6000fd5b505050506040513d602081101561069c57600080fd5b50505b5050505050505050565b600054600160a01b900460ff1615610708576040805162461bcd60e51b815260206004820152600b60248201527f494e495449414c495a4544000000000000000000000000000000000000000000604482015290519081900360640190fd5b600080546001600160a01b039092167fffffffffffffffffffffff00000000000000000000000000000000000000000090921691909117600160a01b179055565b60006001600160a01b038216158061077d57506001600160a01b03821673eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee145b92915050565b60015460408051636eb1769f60e11b81523060048201527368b3465833fb72a70ecdf485e0e4c7bd8665fc45602482015290516001600160a01b0384169163dd62ed3e9160448083019260209291908290030181865afa1580156107eb573d6000803e3d6000fd5b505050506040513d602081101561080157600080fd5b5051101561088d576001546040805163095ea7b360e01b81527368b3465833fb72a70ecdf485e0e4c7bd8665fc4560048201526024810192909252516001600160a01b0383169163095ea7b391604480830192602092919082900301816000875af1158015610874573d6000803e3d6000fd5b505050506040513d602081101561088a57600080fd5b50505b5056fea164736f6c634300080a000a

Deployed Bytecode

0x6080604052600436106100435760003560e01c8063158ef93e1461004f5780633fc8cef31461008457806392be7035146100c0578063c4d66de81461019457600080fd5b3661004a57005b600080fd5b34801561005b57600080fd5b5060005461007090600160a01b900460ff1681565b604080519115158252519081900360200190f35b34801561009057600080fd5b506000546100a4906001600160a01b031681565b604080516001600160a01b039092168252519081900360200190f35b610192600480360360e08110156100d657600080fd5b8101906020810181356401000000008111156100f157600080fd5b82018360208201111561010357600080fd5b8035906020019184600183028401116401000000008311171561012557600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929550506001600160a01b038335811694506020840135811693604081013593506060810135909116915060808101359060a001356101c7565b005b3480156101a057600080fd5b50610192600480360360208110156101b757600080fd5b50356001600160a01b03166106a9565b6101d086610749565b15610237576000805460408051630d0e30db60e41b815290516001600160a01b039092169850889263d0e30db0924792600480820193929182900301818588803b15801561021d57600080fd5b505af1158015610231573d6000803e3d6000fd5b50505050505b61024086610783565b600080885160208a0160007368b3465833fb72a70ecdf485e0e4c7bd8665fc455af180610271573d6000803e3d6000fd5b5061027b85610749565b156104135760008054604080516370a0823160e01b815230600482015290516001600160a01b03909216916370a08231916024808201926020929091908290030181865afa1580156102d1573d6000803e3d6000fd5b505050506040513d60208110156102e757600080fd5b50516000805460408051632e1a7d4d60e01b81526004810185905290519394506001600160a01b0390911692632e1a7d4d9260248084019391929182900301818387803b15801561033757600080fd5b505af115801561034b573d6000803e3d6000fd5b505050508481101561037057604051632c1d501360e11b815260040160405180910390fd5b6040516001600160a01b0385169086156108fc029087906000818181858888f193505050501580156103a6573d6000803e3d6000fd5b5047828110156103d1576040805163a1e01af560e01b81526004810183905290519081900360240190fd5b6002546040516001600160a01b039091169082156108fc029083906000818181858888f1935050505015801561040b573d6000803e3d6000fd5b50505061058e565b846001600160a01b031663a9059cbb84866040518363ffffffff1660e01b815260040180836001600160a01b03168152602001828152602001925050506020604051808303816000875af115801561046f573d6000803e3d6000fd5b505050506040513d602081101561048557600080fd5b5050604080516370a0823160e01b815230600482015290516000916001600160a01b038816916370a08231916024808201926020929091908290030181865afa1580156104d6573d6000803e3d6000fd5b505050506040513d60208110156104ec57600080fd5b5051905081811015610519576040805163a1e01af560e01b81526004810183905290519081900360240190fd5b6002546040805163a9059cbb60e01b81526001600160a01b0392831660048201526024810184905290519188169163a9059cbb9160448082019260209290919082900301816000875af1158015610574573d6000803e3d6000fd5b505050506040513d602081101561058a57600080fd5b5050505b6000866001600160a01b03166370a08231306040518263ffffffff1660e01b815260040180826001600160a01b03168152602001915050602060405180830381865afa1580156105e2573d6000803e3d6000fd5b505050506040513d60208110156105f857600080fd5b50519050828110156106255760408051632574f1c160e11b81526004810183905290519081900360240190fd5b801561069f576002546040805163a9059cbb60e01b81526001600160a01b0392831660048201526024810184905290519189169163a9059cbb9160448082019260209290919082900301816000875af1158015610686573d6000803e3d6000fd5b505050506040513d602081101561069c57600080fd5b50505b5050505050505050565b600054600160a01b900460ff1615610708576040805162461bcd60e51b815260206004820152600b60248201527f494e495449414c495a4544000000000000000000000000000000000000000000604482015290519081900360640190fd5b600080546001600160a01b039092167fffffffffffffffffffffff00000000000000000000000000000000000000000090921691909117600160a01b179055565b60006001600160a01b038216158061077d57506001600160a01b03821673eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee145b92915050565b60015460408051636eb1769f60e11b81523060048201527368b3465833fb72a70ecdf485e0e4c7bd8665fc45602482015290516001600160a01b0384169163dd62ed3e9160448083019260209291908290030181865afa1580156107eb573d6000803e3d6000fd5b505050506040513d602081101561080157600080fd5b5051101561088d576001546040805163095ea7b360e01b81527368b3465833fb72a70ecdf485e0e4c7bd8665fc4560048201526024810192909252516001600160a01b0383169163095ea7b391604480830192602092919082900301816000875af1158015610874573d6000803e3d6000fd5b505050506040513d602081101561088a57600080fd5b50505b5056fea164736f6c634300080a000a

Block Transaction Difficulty Gas Used Reward
View All Blocks Produced

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

Validator Index Block Amount
View All Withdrawals

Transaction Hash Block Value Eth2 PubKey Valid
View All Deposits
Loading...
Loading
[ Download: CSV Export  ]
[ Download: CSV Export  ]

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