ETH Price: $2,698.72 (-2.53%)

Contract

0xe49DEe5353bea74CaF65089237005198a14F7C83
Transaction Hash
Method
Block
From
To
Deposit ETH To A...1316407572025-02-06 22:18:111 hr ago1738880291IN
0xe49DEe53...8a14F7C83
1.000192231824018 ETH0.0000000401540.00010295
Deposit ETH To A...1316300702025-02-06 16:21:577 hrs ago1738858917IN
0xe49DEe53...8a14F7C83
0.030193525859677 ETH0.0000034397040.00053215
Deposit To App C...1316288592025-02-06 15:41:358 hrs ago1738856495IN
0xe49DEe53...8a14F7C83
0.000192570592035 ETH0.0000044203930.00010359
Deposit To App C...1316284532025-02-06 15:28:038 hrs ago1738855683IN
0xe49DEe53...8a14F7C83
0.000192570592035 ETH0.0000032237240.00100299
Deposit To App C...1316269272025-02-06 14:37:119 hrs ago1738852631IN
0xe49DEe53...8a14F7C83
0.000192363554185 ETH0.000000973470.00060172
Deposit To App C...1316249652025-02-06 13:31:4710 hrs ago1738848707IN
0xe49DEe53...8a14F7C83
0.000192174880627 ETH0.000000500750.00101564
Deposit To App C...1316233052025-02-06 12:36:2711 hrs ago1738845387IN
0xe49DEe53...8a14F7C83
0.000192174880627 ETH0.0000008570420.00010073
Deposit ETH To A...1316232632025-02-06 12:35:0311 hrs ago1738845303IN
0xe49DEe53...8a14F7C83
0.036692174880627 ETH0.000000604170.00010073
Deposit To App C...1316232242025-02-06 12:33:4511 hrs ago1738845225IN
0xe49DEe53...8a14F7C83
0.000192174880627 ETH0.0000006741560.00010069
Deposit To App C...1316230992025-02-06 12:29:3511 hrs ago1738844975IN
0xe49DEe53...8a14F7C83
0.000192174880627 ETH0.0000009453620.00010076
Deposit To App C...1316224652025-02-06 12:08:2711 hrs ago1738843707IN
0xe49DEe53...8a14F7C83
0.000192174880627 ETH0.0000002482860.00010079
Deposit To App C...1316212662025-02-06 11:28:2912 hrs ago1738841309IN
0xe49DEe53...8a14F7C83
0.000192174880627 ETH0.0000003908640.00100072
Deposit To App C...1316200812025-02-06 10:48:5913 hrs ago1738838939IN
0xe49DEe53...8a14F7C83
0.000192174880627 ETH0.0000002387420.00010132
Deposit To App C...1316199202025-02-06 10:43:3713 hrs ago1738838617IN
0xe49DEe53...8a14F7C83
0.000192174880627 ETH0.0000001607430.00010133
Deposit To App C...1316198042025-02-06 10:39:4513 hrs ago1738838385IN
0xe49DEe53...8a14F7C83
0.000192174880627 ETH0.0000003214580.0010015
Deposit To App C...1316192872025-02-06 10:22:3113 hrs ago1738837351IN
0xe49DEe53...8a14F7C83
0.000192174880627 ETH0.0000001016090.00012772
Deposit To App C...1316190742025-02-06 10:15:2513 hrs ago1738836925IN
0xe49DEe53...8a14F7C83
0.000192174880627 ETH0.0000001238920.00010092
Deposit To App C...1316189172025-02-06 10:10:1113 hrs ago1738836611IN
0xe49DEe53...8a14F7C83
0.000192174880627 ETH0.0000003365050.00100088
Deposit To App C...1316187442025-02-06 10:04:2513 hrs ago1738836265IN
0xe49DEe53...8a14F7C83
0.000192174880627 ETH0.0000001594260.00010083
Deposit To App C...1316162392025-02-06 8:40:5515 hrs ago1738831255IN
0xe49DEe53...8a14F7C83
0.000192174880627 ETH0.0000000605850.00010113
Deposit ETH To A...1316132402025-02-06 7:00:5717 hrs ago1738825257IN
0xe49DEe53...8a14F7C83
0.040192174880627 ETH0.0000000327170.00010086
Deposit To App C...1316130942025-02-06 6:56:0517 hrs ago1738824965IN
0xe49DEe53...8a14F7C83
0.000192118192299 ETH0.0000000994640.00040087
Deposit To App C...1316130732025-02-06 6:55:2317 hrs ago1738824923IN
0xe49DEe53...8a14F7C83
0.000192118192299 ETH0.0000000141020.00000347
Deposit To App C...1316080392025-02-06 4:07:3519 hrs ago1738814855IN
0xe49DEe53...8a14F7C83
0.000192118192299 ETH0.0000000323050.00010081
Deposit To App C...1316008402025-02-06 0:07:3723 hrs ago1738800457IN
0xe49DEe53...8a14F7C83
0.000192208194521 ETH0.0000002410980.0010018
View all transactions

Latest 25 internal transactions (View All)

Advanced mode:
Parent Transaction Hash Block From To
1316407572025-02-06 22:18:111 hr ago1738880291
0xe49DEe53...8a14F7C83
0.000192231824018 ETH
1316407572025-02-06 22:18:111 hr ago1738880291
0xe49DEe53...8a14F7C83
1 ETH
1316300702025-02-06 16:21:577 hrs ago1738858917
0xe49DEe53...8a14F7C83
0.000193525859677 ETH
1316300702025-02-06 16:21:577 hrs ago1738858917
0xe49DEe53...8a14F7C83
0.03 ETH
1316288592025-02-06 15:41:358 hrs ago1738856495
0xe49DEe53...8a14F7C83
0.000192570592035 ETH
1316284532025-02-06 15:28:038 hrs ago1738855683
0xe49DEe53...8a14F7C83
0.000192570592035 ETH
1316269272025-02-06 14:37:119 hrs ago1738852631
0xe49DEe53...8a14F7C83
0.000192363554185 ETH
1316249652025-02-06 13:31:4710 hrs ago1738848707
0xe49DEe53...8a14F7C83
0.000192174880627 ETH
1316233052025-02-06 12:36:2711 hrs ago1738845387
0xe49DEe53...8a14F7C83
0.000192174880627 ETH
1316232632025-02-06 12:35:0311 hrs ago1738845303
0xe49DEe53...8a14F7C83
0.000192174880627 ETH
1316232632025-02-06 12:35:0311 hrs ago1738845303
0xe49DEe53...8a14F7C83
0.0365 ETH
1316232242025-02-06 12:33:4511 hrs ago1738845225
0xe49DEe53...8a14F7C83
0.000192174880627 ETH
1316230992025-02-06 12:29:3511 hrs ago1738844975
0xe49DEe53...8a14F7C83
0.000192174880627 ETH
1316224652025-02-06 12:08:2711 hrs ago1738843707
0xe49DEe53...8a14F7C83
0.000192174880627 ETH
1316212662025-02-06 11:28:2912 hrs ago1738841309
0xe49DEe53...8a14F7C83
0.000192174880627 ETH
1316200812025-02-06 10:48:5913 hrs ago1738838939
0xe49DEe53...8a14F7C83
0.000192174880627 ETH
1316199202025-02-06 10:43:3713 hrs ago1738838617
0xe49DEe53...8a14F7C83
0.000192174880627 ETH
1316198042025-02-06 10:39:4513 hrs ago1738838385
0xe49DEe53...8a14F7C83
0.000192174880627 ETH
1316192872025-02-06 10:22:3113 hrs ago1738837351
0xe49DEe53...8a14F7C83
0.000192174880627 ETH
1316190742025-02-06 10:15:2513 hrs ago1738836925
0xe49DEe53...8a14F7C83
0.000192174880627 ETH
1316189172025-02-06 10:10:1113 hrs ago1738836611
0xe49DEe53...8a14F7C83
0.000192174880627 ETH
1316187442025-02-06 10:04:2513 hrs ago1738836265
0xe49DEe53...8a14F7C83
0.000192174880627 ETH
1316162392025-02-06 8:40:5515 hrs ago1738831255
0xe49DEe53...8a14F7C83
0.000192174880627 ETH
1316132402025-02-06 7:00:5717 hrs ago1738825257
0xe49DEe53...8a14F7C83
0.000192174880627 ETH
1316132402025-02-06 7:00:5717 hrs ago1738825257
0xe49DEe53...8a14F7C83
0.04 ETH
View All Internal Transactions

Loading...
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
L1SocketDepositHelper

Compiler Version
v0.8.15+commit.e14f2714

Optimization Enabled:
Yes with 200 runs

Other Settings:
london EvmVersion
File 1 of 6 : L1SocketDepositHelper.sol
// SPDX-License-Identifier: UNLICENSED
pragma solidity 0.8.15;

import {Owned} from "solmate/auth/Owned.sol";
import {VaultInterface} from "./interfaces/VaultInterface.sol";
import {ERC20} from "solmate/tokens/ERC20.sol";
import {SafeTransferLib} from "solmate/utils/SafeTransferLib.sol";
import {WETHInterface} from "../interfaces/WETHInterface.sol";

/// @title L1SocketDepositHelper
/// @notice The L1 deposit helper for handling cross-chain yield vault deposits and usdc permit
contract L1SocketDepositHelper is Owned {
    using SafeTransferLib for ERC20;

    /*//////////////////////////////////////////////////////////////
                               IMMUTABLES
    //////////////////////////////////////////////////////////////*/

    /// @notice The arb / op vault contract
    mapping(address => VaultInterface) public vaults;

    /// @notice The WETH address
    address public immutable weth;

    /*//////////////////////////////////////////////////////////////
                                 EVENTS
    //////////////////////////////////////////////////////////////*/

    event TokensDeposited(
        address indexed connector,
        address indexed depositor,
        address indexed receiver,
        uint256 depositAmount,
        bytes data
    );
    event VaultUpdated(address indexed collateral, address indexed vault);

    /*//////////////////////////////////////////////////////////////
                               CONSTRUCTOR
    //////////////////////////////////////////////////////////////*/

    /// @notice Constructor
    /// @param _weth The WETH address
    constructor(address _weth, address _owner) Owned(_owner) {
        weth = _weth;
    }

    /*//////////////////////////////////////////////////////////////
                            OWNER OPERATIONS
    //////////////////////////////////////////////////////////////*/

    /// @notice Updates the Socket vault for a collateral
    /// @dev Only callable by the owner
    /// @param _collateral The collateral address
    /// @param _vault The Socket vault address
    function updateVault(address _collateral, address _vault) external onlyOwner {
        vaults[_collateral] = VaultInterface(_vault);

        emit VaultUpdated(_collateral, _vault);
    }

    /// @notice Deposit an amount of the ERC20 to the senders balance on L2
    /// @param _receiver Receiver on the L2
    /// @param _amount Amount of to deposit
    /// @param _msgGasLimit Gas limit required to complete the deposit on L2
    /// @param _connector Socket connector
    /// @param _data Optional data to forward to L2
    function depositETHToAppChain(
        address _receiver,
        uint256 _amount,
        uint256 _msgGasLimit,
        address _connector,
        bytes calldata _data
    ) external payable {
        // Mint WETH
        WETHInterface(weth).deposit{value: _amount}();
        // Approve the tokens from this contract to the L1 bridge
        ERC20(weth).safeApprove(address(vaults[weth]), _amount);
        vaults[weth].depositToAppChain{value: msg.value - _amount}(_receiver, _amount, _msgGasLimit, _connector);
        emit TokensDeposited(_connector, msg.sender, _receiver, _amount, _data);
    }

    /// @notice Deposit an amount of the ERC20 to the senders balance on L2 using an EIP-2612 permit signature
    /// @param _receiver Receiver on the L2
    /// @param _asset Asset of the ERC20
    /// @param _amount Amount of the ERC20 to deposit
    /// @param _msgGasLimit Gas limit required to complete the deposit on L2
    /// @param _connector Socket connector
    /// @param _data Optional data to forward to L2
    /// @param _deadline A timestamp, the current blocktime must be less than or equal to this timestamp
    /// @param _v Must produce valid secp256k1 signature from the holder along with r and s
    /// @param _r Must produce valid secp256k1 signature from the holder along with v and s
    /// @param _s Must produce valid secp256k1 signature from the holder along with r and v
    function depositToAppChainWithPermit(
        address _receiver,
        address _asset,
        uint256 _amount,
        uint256 _msgGasLimit,
        address _connector,
        bytes calldata _data,
        uint256 _deadline,
        uint8 _v,
        bytes32 _r,
        bytes32 _s
    ) external payable {
        // Approve the tokens from the sender to this contract
        ERC20(_asset).permit(msg.sender, address(this), _amount, _deadline, _v, _r, _s);
        _depositToAppChain(_receiver, _asset, _amount, _msgGasLimit, _connector, _data);
    }

    /// @notice Deposit an amount of the ERC20 to the senders balance on L2
    /// @param _receiver Receiver on the L2
    /// @param _asset Asset of the ERC20
    /// @param _amount Amount of the ERC20 to deposit
    /// @param _msgGasLimit Gas limit required to complete the deposit on L2
    /// @param _connector Socket connector
    /// @param _data Optional data to forward to L2
    function depositToAppChain(
        address _receiver,
        address _asset,
        uint256 _amount,
        uint256 _msgGasLimit,
        address _connector,
        bytes calldata _data
    ) external payable {
        _depositToAppChain(_receiver, _asset, _amount, _msgGasLimit, _connector, _data);
    }

    function _depositToAppChain(
        address _receiver,
        address _asset,
        uint256 _amount,
        uint256 _msgGasLimit,
        address _connector,
        bytes calldata _data
    ) internal {
        // Transfer the tokens from the sender to this contract
        ERC20(_asset).safeTransferFrom(msg.sender, address(this), _amount);

        // Approve the tokens from this contract to the L1 bridge
        ERC20(_asset).safeApprove(address(vaults[_asset]), _amount);

        vaults[_asset].depositToAppChain{value: msg.value}(_receiver, _amount, _msgGasLimit, _connector);
        emit TokensDeposited(_connector, msg.sender, _receiver, _amount, _data);
    }
}

File 2 of 6 : Owned.sol
// SPDX-License-Identifier: AGPL-3.0-only
pragma solidity >=0.8.0;

/// @notice Simple single owner authorization mixin.
/// @author Solmate (https://github.com/transmissions11/solmate/blob/main/src/auth/Owned.sol)
abstract contract Owned {
    /*//////////////////////////////////////////////////////////////
                                 EVENTS
    //////////////////////////////////////////////////////////////*/

    event OwnerUpdated(address indexed user, address indexed newOwner);

    /*//////////////////////////////////////////////////////////////
                            OWNERSHIP STORAGE
    //////////////////////////////////////////////////////////////*/

    address public owner;

    modifier onlyOwner() virtual {
        require(msg.sender == owner, "UNAUTHORIZED");

        _;
    }

    /*//////////////////////////////////////////////////////////////
                               CONSTRUCTOR
    //////////////////////////////////////////////////////////////*/

    constructor(address _owner) {
        owner = _owner;

        emit OwnerUpdated(address(0), _owner);
    }

    /*//////////////////////////////////////////////////////////////
                             OWNERSHIP LOGIC
    //////////////////////////////////////////////////////////////*/

    function setOwner(address newOwner) public virtual onlyOwner {
        owner = newOwner;

        emit OwnerUpdated(msg.sender, newOwner);
    }
}

File 3 of 6 : VaultInterface.sol
// SPDX-License-Identifier: UNLICENSED
// !! THIS FILE WAS AUTOGENERATED BY abi-to-sol v0.8.0. SEE SOURCE BELOW. !!
pragma solidity ^0.8.9;

interface VaultInterface {
    error AmountOutsideLimit();
    error ConnectorUnavailable();

    event LimitParamsUpdated(Vault.UpdateLimitParams[] updates);
    event OwnershipTransferStarted(address indexed previousOwner, address indexed newOwner);
    event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);
    event PendingTokensTransferred(address connector, address receiver, uint256 unlockedAmount, uint256 pendingAmount);
    event TokensDeposited(address connector, address depositor, address receiver, uint256 depositAmount);
    event TokensPending(address connector, address receiver, uint256 pendingAmount, uint256 totalPendingAmount);
    event TokensUnlocked(address connector, address receiver, uint256 unlockedAmount);

    function acceptOwnership() external;

    function connectorPendingUnlocks(address) external view returns (uint256);

    function depositToAppChain(address receiver_, uint256 amount_, uint256 msgGasLimit_, address connector_)
        external
        payable;

    function getCurrentLockLimit(address connector_) external view returns (uint256);

    function getCurrentUnlockLimit(address connector_) external view returns (uint256);

    function getLockLimitParams(address connector_) external view returns (Gauge.LimitParams memory);

    function getMinFees(address connector_, uint256 msgGasLimit_) external view returns (uint256 totalFees);

    function getUnlockLimitParams(address connector_) external view returns (Gauge.LimitParams memory);

    function owner() external view returns (address);

    function pendingOwner() external view returns (address);

    function pendingUnlocks(address, address) external view returns (uint256);

    function receiveInbound(bytes memory payload_) external;

    function renounceOwnership() external;

    function token__() external view returns (address);

    function transferOwnership(address newOwner) external;

    function unlockPendingFor(address receiver_, address connector_) external;

    function updateLimitParams(Vault.UpdateLimitParams[] memory updates_) external;
}

interface Vault {
    struct UpdateLimitParams {
        bool isLock;
        address connector;
        uint256 maxLimit;
        uint256 ratePerSecond;
    }
}

interface Gauge {
    struct LimitParams {
        uint256 lastUpdateTimestamp;
        uint256 ratePerSecond;
        uint256 maxLimit;
        uint256 lastUpdateLimit;
    }
}

// THIS FILE WAS AUTOGENERATED FROM THE FOLLOWING ABI JSON:
/*
[{"inputs":[{"internalType":"address","name":"token_","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"AmountOutsideLimit","type":"error"},{"inputs":[],"name":"ConnectorUnavailable","type":"error"},{"anonymous":false,"inputs":[{"components":[{"internalType":"bool","name":"isLock","type":"bool"},{"internalType":"address","name":"connector","type":"address"},{"internalType":"uint256","name":"maxLimit","type":"uint256"},{"internalType":"uint256","name":"ratePerSecond","type":"uint256"}],"indexed":false,"internalType":"struct Vault.UpdateLimitParams[]","name":"updates","type":"tuple[]"}],"name":"LimitParamsUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferStarted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"connector","type":"address"},{"indexed":false,"internalType":"address","name":"receiver","type":"address"},{"indexed":false,"internalType":"uint256","name":"unlockedAmount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"pendingAmount","type":"uint256"}],"name":"PendingTokensTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"connector","type":"address"},{"indexed":false,"internalType":"address","name":"depositor","type":"address"},{"indexed":false,"internalType":"address","name":"receiver","type":"address"},{"indexed":false,"internalType":"uint256","name":"depositAmount","type":"uint256"}],"name":"TokensDeposited","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"connector","type":"address"},{"indexed":false,"internalType":"address","name":"receiver","type":"address"},{"indexed":false,"internalType":"uint256","name":"pendingAmount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"totalPendingAmount","type":"uint256"}],"name":"TokensPending","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"connector","type":"address"},{"indexed":false,"internalType":"address","name":"receiver","type":"address"},{"indexed":false,"internalType":"uint256","name":"unlockedAmount","type":"uint256"}],"name":"TokensUnlocked","type":"event"},{"inputs":[],"name":"acceptOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"connectorPendingUnlocks","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"receiver_","type":"address"},{"internalType":"uint256","name":"amount_","type":"uint256"},{"internalType":"uint256","name":"msgGasLimit_","type":"uint256"},{"internalType":"address","name":"connector_","type":"address"}],"name":"depositToAppChain","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"connector_","type":"address"}],"name":"getCurrentLockLimit","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"connector_","type":"address"}],"name":"getCurrentUnlockLimit","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"connector_","type":"address"}],"name":"getLockLimitParams","outputs":[{"components":[{"internalType":"uint256","name":"lastUpdateTimestamp","type":"uint256"},{"internalType":"uint256","name":"ratePerSecond","type":"uint256"},{"internalType":"uint256","name":"maxLimit","type":"uint256"},{"internalType":"uint256","name":"lastUpdateLimit","type":"uint256"}],"internalType":"struct Gauge.LimitParams","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"connector_","type":"address"},{"internalType":"uint256","name":"msgGasLimit_","type":"uint256"}],"name":"getMinFees","outputs":[{"internalType":"uint256","name":"totalFees","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"connector_","type":"address"}],"name":"getUnlockLimitParams","outputs":[{"components":[{"internalType":"uint256","name":"lastUpdateTimestamp","type":"uint256"},{"internalType":"uint256","name":"ratePerSecond","type":"uint256"},{"internalType":"uint256","name":"maxLimit","type":"uint256"},{"internalType":"uint256","name":"lastUpdateLimit","type":"uint256"}],"internalType":"struct Gauge.LimitParams","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pendingOwner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"}],"name":"pendingUnlocks","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes","name":"payload_","type":"bytes"}],"name":"receiveInbound","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"token__","outputs":[{"internalType":"contract ERC20","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"receiver_","type":"address"},{"internalType":"address","name":"connector_","type":"address"}],"name":"unlockPendingFor","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"components":[{"internalType":"bool","name":"isLock","type":"bool"},{"internalType":"address","name":"connector","type":"address"},{"internalType":"uint256","name":"maxLimit","type":"uint256"},{"internalType":"uint256","name":"ratePerSecond","type":"uint256"}],"internalType":"struct Vault.UpdateLimitParams[]","name":"updates_","type":"tuple[]"}],"name":"updateLimitParams","outputs":[],"stateMutability":"nonpayable","type":"function"}]
*/

File 4 of 6 : ERC20.sol
// SPDX-License-Identifier: AGPL-3.0-only
pragma solidity >=0.8.0;

/// @notice Modern and gas efficient ERC20 + EIP-2612 implementation.
/// @author Solmate (https://github.com/transmissions11/solmate/blob/main/src/tokens/ERC20.sol)
/// @author Modified from Uniswap (https://github.com/Uniswap/uniswap-v2-core/blob/master/contracts/UniswapV2ERC20.sol)
/// @dev Do not manually set balances without updating totalSupply, as the sum of all user balances must not exceed it.
abstract contract ERC20 {
    /*//////////////////////////////////////////////////////////////
                                 EVENTS
    //////////////////////////////////////////////////////////////*/

    event Transfer(address indexed from, address indexed to, uint256 amount);

    event Approval(address indexed owner, address indexed spender, uint256 amount);

    /*//////////////////////////////////////////////////////////////
                            METADATA STORAGE
    //////////////////////////////////////////////////////////////*/

    string public name;

    string public symbol;

    uint8 public immutable decimals;

    /*//////////////////////////////////////////////////////////////
                              ERC20 STORAGE
    //////////////////////////////////////////////////////////////*/

    uint256 public totalSupply;

    mapping(address => uint256) public balanceOf;

    mapping(address => mapping(address => uint256)) public allowance;

    /*//////////////////////////////////////////////////////////////
                            EIP-2612 STORAGE
    //////////////////////////////////////////////////////////////*/

    uint256 internal immutable INITIAL_CHAIN_ID;

    bytes32 internal immutable INITIAL_DOMAIN_SEPARATOR;

    mapping(address => uint256) public nonces;

    /*//////////////////////////////////////////////////////////////
                               CONSTRUCTOR
    //////////////////////////////////////////////////////////////*/

    constructor(
        string memory _name,
        string memory _symbol,
        uint8 _decimals
    ) {
        name = _name;
        symbol = _symbol;
        decimals = _decimals;

        INITIAL_CHAIN_ID = block.chainid;
        INITIAL_DOMAIN_SEPARATOR = computeDomainSeparator();
    }

    /*//////////////////////////////////////////////////////////////
                               ERC20 LOGIC
    //////////////////////////////////////////////////////////////*/

    function approve(address spender, uint256 amount) public virtual returns (bool) {
        allowance[msg.sender][spender] = amount;

        emit Approval(msg.sender, spender, amount);

        return true;
    }

    function transfer(address to, uint256 amount) public virtual returns (bool) {
        balanceOf[msg.sender] -= amount;

        // Cannot overflow because the sum of all user
        // balances can't exceed the max uint256 value.
        unchecked {
            balanceOf[to] += amount;
        }

        emit Transfer(msg.sender, to, amount);

        return true;
    }

    function transferFrom(
        address from,
        address to,
        uint256 amount
    ) public virtual returns (bool) {
        uint256 allowed = allowance[from][msg.sender]; // Saves gas for limited approvals.

        if (allowed != type(uint256).max) allowance[from][msg.sender] = allowed - amount;

        balanceOf[from] -= amount;

        // Cannot overflow because the sum of all user
        // balances can't exceed the max uint256 value.
        unchecked {
            balanceOf[to] += amount;
        }

        emit Transfer(from, to, amount);

        return true;
    }

    /*//////////////////////////////////////////////////////////////
                             EIP-2612 LOGIC
    //////////////////////////////////////////////////////////////*/

    function permit(
        address owner,
        address spender,
        uint256 value,
        uint256 deadline,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) public virtual {
        require(deadline >= block.timestamp, "PERMIT_DEADLINE_EXPIRED");

        // Unchecked because the only math done is incrementing
        // the owner's nonce which cannot realistically overflow.
        unchecked {
            address recoveredAddress = ecrecover(
                keccak256(
                    abi.encodePacked(
                        "\x19\x01",
                        DOMAIN_SEPARATOR(),
                        keccak256(
                            abi.encode(
                                keccak256(
                                    "Permit(address owner,address spender,uint256 value,uint256 nonce,uint256 deadline)"
                                ),
                                owner,
                                spender,
                                value,
                                nonces[owner]++,
                                deadline
                            )
                        )
                    )
                ),
                v,
                r,
                s
            );

            require(recoveredAddress != address(0) && recoveredAddress == owner, "INVALID_SIGNER");

            allowance[recoveredAddress][spender] = value;
        }

        emit Approval(owner, spender, value);
    }

    function DOMAIN_SEPARATOR() public view virtual returns (bytes32) {
        return block.chainid == INITIAL_CHAIN_ID ? INITIAL_DOMAIN_SEPARATOR : computeDomainSeparator();
    }

    function computeDomainSeparator() internal view virtual returns (bytes32) {
        return
            keccak256(
                abi.encode(
                    keccak256("EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)"),
                    keccak256(bytes(name)),
                    keccak256("1"),
                    block.chainid,
                    address(this)
                )
            );
    }

    /*//////////////////////////////////////////////////////////////
                        INTERNAL MINT/BURN LOGIC
    //////////////////////////////////////////////////////////////*/

    function _mint(address to, uint256 amount) internal virtual {
        totalSupply += amount;

        // Cannot overflow because the sum of all user
        // balances can't exceed the max uint256 value.
        unchecked {
            balanceOf[to] += amount;
        }

        emit Transfer(address(0), to, amount);
    }

    function _burn(address from, uint256 amount) internal virtual {
        balanceOf[from] -= amount;

        // Cannot underflow because a user's balance
        // will never be larger than the total supply.
        unchecked {
            totalSupply -= amount;
        }

        emit Transfer(from, address(0), amount);
    }
}

File 5 of 6 : SafeTransferLib.sol
// SPDX-License-Identifier: AGPL-3.0-only
pragma solidity >=0.8.0;

import {ERC20} from "../tokens/ERC20.sol";

/// @notice Safe ETH and ERC20 transfer library that gracefully handles missing return values.
/// @author Solmate (https://github.com/transmissions11/solmate/blob/main/src/utils/SafeTransferLib.sol)
/// @dev Use with caution! Some functions in this library knowingly create dirty bits at the destination of the free memory pointer.
/// @dev Note that none of the functions in this library check that a token has code at all! That responsibility is delegated to the caller.
library SafeTransferLib {
    /*//////////////////////////////////////////////////////////////
                             ETH OPERATIONS
    //////////////////////////////////////////////////////////////*/

    function safeTransferETH(address to, uint256 amount) internal {
        bool success;

        assembly {
            // Transfer the ETH and store if it succeeded or not.
            success := call(gas(), to, amount, 0, 0, 0, 0)
        }

        require(success, "ETH_TRANSFER_FAILED");
    }

    /*//////////////////////////////////////////////////////////////
                            ERC20 OPERATIONS
    //////////////////////////////////////////////////////////////*/

    function safeTransferFrom(
        ERC20 token,
        address from,
        address to,
        uint256 amount
    ) internal {
        bool success;

        assembly {
            // Get a pointer to some free memory.
            let freeMemoryPointer := mload(0x40)

            // Write the abi-encoded calldata into memory, beginning with the function selector.
            mstore(freeMemoryPointer, 0x23b872dd00000000000000000000000000000000000000000000000000000000)
            mstore(add(freeMemoryPointer, 4), from) // Append the "from" argument.
            mstore(add(freeMemoryPointer, 36), to) // Append the "to" argument.
            mstore(add(freeMemoryPointer, 68), amount) // Append the "amount" argument.

            success := and(
                // Set success to whether the call reverted, if not we check it either
                // returned exactly 1 (can't just be non-zero data), or had no return data.
                or(and(eq(mload(0), 1), gt(returndatasize(), 31)), iszero(returndatasize())),
                // We use 100 because the length of our calldata totals up like so: 4 + 32 * 3.
                // We use 0 and 32 to copy up to 32 bytes of return data into the scratch space.
                // Counterintuitively, this call must be positioned second to the or() call in the
                // surrounding and() call or else returndatasize() will be zero during the computation.
                call(gas(), token, 0, freeMemoryPointer, 100, 0, 32)
            )
        }

        require(success, "TRANSFER_FROM_FAILED");
    }

    function safeTransfer(
        ERC20 token,
        address to,
        uint256 amount
    ) internal {
        bool success;

        assembly {
            // Get a pointer to some free memory.
            let freeMemoryPointer := mload(0x40)

            // Write the abi-encoded calldata into memory, beginning with the function selector.
            mstore(freeMemoryPointer, 0xa9059cbb00000000000000000000000000000000000000000000000000000000)
            mstore(add(freeMemoryPointer, 4), to) // Append the "to" argument.
            mstore(add(freeMemoryPointer, 36), amount) // Append the "amount" argument.

            success := and(
                // Set success to whether the call reverted, if not we check it either
                // returned exactly 1 (can't just be non-zero data), or had no return data.
                or(and(eq(mload(0), 1), gt(returndatasize(), 31)), iszero(returndatasize())),
                // We use 68 because the length of our calldata totals up like so: 4 + 32 * 2.
                // We use 0 and 32 to copy up to 32 bytes of return data into the scratch space.
                // Counterintuitively, this call must be positioned second to the or() call in the
                // surrounding and() call or else returndatasize() will be zero during the computation.
                call(gas(), token, 0, freeMemoryPointer, 68, 0, 32)
            )
        }

        require(success, "TRANSFER_FAILED");
    }

    function safeApprove(
        ERC20 token,
        address to,
        uint256 amount
    ) internal {
        bool success;

        assembly {
            // Get a pointer to some free memory.
            let freeMemoryPointer := mload(0x40)

            // Write the abi-encoded calldata into memory, beginning with the function selector.
            mstore(freeMemoryPointer, 0x095ea7b300000000000000000000000000000000000000000000000000000000)
            mstore(add(freeMemoryPointer, 4), to) // Append the "to" argument.
            mstore(add(freeMemoryPointer, 36), amount) // Append the "amount" argument.

            success := and(
                // Set success to whether the call reverted, if not we check it either
                // returned exactly 1 (can't just be non-zero data), or had no return data.
                or(and(eq(mload(0), 1), gt(returndatasize(), 31)), iszero(returndatasize())),
                // We use 68 because the length of our calldata totals up like so: 4 + 32 * 2.
                // We use 0 and 32 to copy up to 32 bytes of return data into the scratch space.
                // Counterintuitively, this call must be positioned second to the or() call in the
                // surrounding and() call or else returndatasize() will be zero during the computation.
                call(gas(), token, 0, freeMemoryPointer, 68, 0, 32)
            )
        }

        require(success, "APPROVE_FAILED");
    }
}

File 6 of 6 : WETHInterface.sol
// SPDX-License-Identifier: UNLICENSED
pragma solidity 0.8.15;

/// @title Interface for WETH9
interface WETHInterface {
    /// @notice Deposit ether to get wrapped ether
    function deposit() external payable;

    /// @notice Withdraw wrapped ether to get ether
    function withdraw(uint256) external;
}

Settings
{
  "remappings": [
    "openzeppelin-contracts-upgradeable/=lib/openzeppelin-contracts-upgradeable/contracts/",
    "openzeppelin-contracts/=lib/openzeppelin-contracts/contracts/",
    "ds-test/=lib/forge-std/lib/ds-test/src/",
    "forge-std/=lib/forge-std/src/",
    "solmate/=lib/solmate/src/"
  ],
  "optimizer": {
    "enabled": true,
    "runs": 200
  },
  "metadata": {
    "useLiteralContent": false,
    "bytecodeHash": "none"
  },
  "outputSelection": {
    "*": {
      "*": [
        "evm.bytecode",
        "evm.deployedBytecode",
        "devdoc",
        "userdoc",
        "metadata",
        "abi"
      ]
    }
  },
  "evmVersion": "london",
  "libraries": {}
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"address","name":"_weth","type":"address"},{"internalType":"address","name":"_owner","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnerUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"connector","type":"address"},{"indexed":true,"internalType":"address","name":"depositor","type":"address"},{"indexed":true,"internalType":"address","name":"receiver","type":"address"},{"indexed":false,"internalType":"uint256","name":"depositAmount","type":"uint256"},{"indexed":false,"internalType":"bytes","name":"data","type":"bytes"}],"name":"TokensDeposited","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"collateral","type":"address"},{"indexed":true,"internalType":"address","name":"vault","type":"address"}],"name":"VaultUpdated","type":"event"},{"inputs":[{"internalType":"address","name":"_receiver","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"},{"internalType":"uint256","name":"_msgGasLimit","type":"uint256"},{"internalType":"address","name":"_connector","type":"address"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"depositETHToAppChain","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"_receiver","type":"address"},{"internalType":"address","name":"_asset","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"},{"internalType":"uint256","name":"_msgGasLimit","type":"uint256"},{"internalType":"address","name":"_connector","type":"address"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"depositToAppChain","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"_receiver","type":"address"},{"internalType":"address","name":"_asset","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"},{"internalType":"uint256","name":"_msgGasLimit","type":"uint256"},{"internalType":"address","name":"_connector","type":"address"},{"internalType":"bytes","name":"_data","type":"bytes"},{"internalType":"uint256","name":"_deadline","type":"uint256"},{"internalType":"uint8","name":"_v","type":"uint8"},{"internalType":"bytes32","name":"_r","type":"bytes32"},{"internalType":"bytes32","name":"_s","type":"bytes32"}],"name":"depositToAppChainWithPermit","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"setOwner","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_collateral","type":"address"},{"internalType":"address","name":"_vault","type":"address"}],"name":"updateVault","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"vaults","outputs":[{"internalType":"contract VaultInterface","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"weth","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"}]

60a060405234801561001057600080fd5b50604051610b7c380380610b7c83398101604081905261002f916100a6565b600080546001600160a01b0319166001600160a01b03831690811782556040518392907f8292fce18fa69edf4db7b94ea2e58241df0ae57f97e0a6c9b29067028bf92d76908290a350506001600160a01b03166080526100d9565b80516001600160a01b03811681146100a157600080fd5b919050565b600080604083850312156100b957600080fd5b6100c28361008a565b91506100d06020840161008a565b90509250929050565b608051610a746101086000396000818160fa0152818161037c015281816103f6015261043f0152610a746000f3fe60806040526004361061007b5760003560e01c80633fc8cef31161004e5780633fc8cef3146100e85780638da5cb5b14610138578063a622ee7c14610158578063ac16c7cb1461018e57600080fd5b806311f990551461008057806313af4035146100955780631b451d28146100b55780633927ef8a146100d5575b600080fd5b61009361008e3660046107f4565b6101a1565b005b3480156100a157600080fd5b506100936100b03660046108b6565b610241565b3480156100c157600080fd5b506100936100d03660046108d8565b6102da565b6100936100e336600461090b565b61037a565b3480156100f457600080fd5b5061011c7f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b03909116815260200160405180910390f35b34801561014457600080fd5b5060005461011c906001600160a01b031681565b34801561016457600080fd5b5061011c6101733660046108b6565b6001602052600090815260409020546001600160a01b031681565b61009361019c366004610983565b61054e565b60405163d505accf60e01b8152336004820152306024820152604481018a90526064810185905260ff8416608482015260a4810183905260c481018290526001600160a01b038b169063d505accf9060e401600060405180830381600087803b15801561020d57600080fd5b505af1158015610221573d6000803e3d6000fd5b505050506102348b8b8b8b8b8b8b610566565b5050505050505050505050565b6000546001600160a01b0316331461028f5760405162461bcd60e51b815260206004820152600c60248201526b15539055551213d49256915160a21b60448201526064015b60405180910390fd5b600080546001600160a01b0319166001600160a01b0383169081178255604051909133917f8292fce18fa69edf4db7b94ea2e58241df0ae57f97e0a6c9b29067028bf92d769190a350565b6000546001600160a01b031633146103235760405162461bcd60e51b815260206004820152600c60248201526b15539055551213d49256915160a21b6044820152606401610286565b6001600160a01b0382811660008181526001602052604080822080546001600160a01b0319169486169485179055517f483bdedaaf23706a9800ac1af0d852b34927780d79f9d6ba60a80c7cad75ea399190a35050565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663d0e30db0866040518263ffffffff1660e01b81526004016000604051808303818588803b1580156103d557600080fd5b505af11580156103e9573d6000803e3d6000fd5b5050506001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000811660008181526001602052604090205461043594509092501687610688565b6001600160a01b037f000000000000000000000000000000000000000000000000000000000000000081166000908152600160205260409020541663864f6a7a61047f8734610a0c565b6040516001600160e01b031960e084901b1681526001600160a01b03808b166004830152602482018a905260448201899052871660648201526084016000604051808303818588803b1580156104d457600080fd5b505af11580156104e8573d6000803e3d6000fd5b5050505050856001600160a01b0316336001600160a01b0316846001600160a01b03167f57f5d3655813c82b2a26f55a21f0108a37e609796c6123a213a45f2deab0b06b88868660405161053e93929190610a31565b60405180910390a4505050505050565b61055d87878787878787610566565b50505050505050565b61057b6001600160a01b038716333088610705565b6001600160a01b038087166000818152600160205260409020546105a0921687610688565b6001600160a01b0386811660009081526001602052604090819020549051634327b53d60e11b815289831660048201526024810188905260448101879052858316606482015291169063864f6a7a9034906084016000604051808303818588803b15801561060d57600080fd5b505af1158015610621573d6000803e3d6000fd5b5050505050866001600160a01b0316336001600160a01b0316846001600160a01b03167f57f5d3655813c82b2a26f55a21f0108a37e609796c6123a213a45f2deab0b06b88868660405161067793929190610a31565b60405180910390a450505050505050565b600060405163095ea7b360e01b8152836004820152826024820152602060006044836000895af13d15601f3d11600160005114161716915050806106ff5760405162461bcd60e51b815260206004820152600e60248201526d1054141493d59157d1905253115160921b6044820152606401610286565b50505050565b60006040516323b872dd60e01b81528460048201528360248201528260448201526020600060648360008a5af13d15601f3d11600160005114161716915050806107885760405162461bcd60e51b81526020600482015260146024820152731514905394d1915497d19493d357d1905253115160621b6044820152606401610286565b5050505050565b80356001600160a01b03811681146107a657600080fd5b919050565b60008083601f8401126107bd57600080fd5b50813567ffffffffffffffff8111156107d557600080fd5b6020830191508360208285010111156107ed57600080fd5b9250929050565b60008060008060008060008060008060006101408c8e03121561081657600080fd5b61081f8c61078f565b9a5061082d60208d0161078f565b995060408c0135985060608c0135975061084960808d0161078f565b965060a08c013567ffffffffffffffff81111561086557600080fd5b6108718e828f016107ab565b90975095505060c08c0135935060e08c013560ff8116811461089257600080fd5b809350506101008c013591506101208c013590509295989b509295989b9093969950565b6000602082840312156108c857600080fd5b6108d18261078f565b9392505050565b600080604083850312156108eb57600080fd5b6108f48361078f565b91506109026020840161078f565b90509250929050565b60008060008060008060a0878903121561092457600080fd5b61092d8761078f565b955060208701359450604087013593506109496060880161078f565b9250608087013567ffffffffffffffff81111561096557600080fd5b61097189828a016107ab565b979a9699509497509295939492505050565b600080600080600080600060c0888a03121561099e57600080fd5b6109a78861078f565b96506109b56020890161078f565b955060408801359450606088013593506109d16080890161078f565b925060a088013567ffffffffffffffff8111156109ed57600080fd5b6109f98a828b016107ab565b989b979a50959850939692959293505050565b600082821015610a2c57634e487b7160e01b600052601160045260246000fd5b500390565b83815260406020820152816040820152818360608301376000818301606090810191909152601f909201601f191601019291505056fea164736f6c634300080f000a00000000000000000000000042000000000000000000000000000000000000060000000000000000000000000a888bb1cb72f2ba9279574a6d83744d052d95fd

Deployed Bytecode

0x60806040526004361061007b5760003560e01c80633fc8cef31161004e5780633fc8cef3146100e85780638da5cb5b14610138578063a622ee7c14610158578063ac16c7cb1461018e57600080fd5b806311f990551461008057806313af4035146100955780631b451d28146100b55780633927ef8a146100d5575b600080fd5b61009361008e3660046107f4565b6101a1565b005b3480156100a157600080fd5b506100936100b03660046108b6565b610241565b3480156100c157600080fd5b506100936100d03660046108d8565b6102da565b6100936100e336600461090b565b61037a565b3480156100f457600080fd5b5061011c7f000000000000000000000000420000000000000000000000000000000000000681565b6040516001600160a01b03909116815260200160405180910390f35b34801561014457600080fd5b5060005461011c906001600160a01b031681565b34801561016457600080fd5b5061011c6101733660046108b6565b6001602052600090815260409020546001600160a01b031681565b61009361019c366004610983565b61054e565b60405163d505accf60e01b8152336004820152306024820152604481018a90526064810185905260ff8416608482015260a4810183905260c481018290526001600160a01b038b169063d505accf9060e401600060405180830381600087803b15801561020d57600080fd5b505af1158015610221573d6000803e3d6000fd5b505050506102348b8b8b8b8b8b8b610566565b5050505050505050505050565b6000546001600160a01b0316331461028f5760405162461bcd60e51b815260206004820152600c60248201526b15539055551213d49256915160a21b60448201526064015b60405180910390fd5b600080546001600160a01b0319166001600160a01b0383169081178255604051909133917f8292fce18fa69edf4db7b94ea2e58241df0ae57f97e0a6c9b29067028bf92d769190a350565b6000546001600160a01b031633146103235760405162461bcd60e51b815260206004820152600c60248201526b15539055551213d49256915160a21b6044820152606401610286565b6001600160a01b0382811660008181526001602052604080822080546001600160a01b0319169486169485179055517f483bdedaaf23706a9800ac1af0d852b34927780d79f9d6ba60a80c7cad75ea399190a35050565b7f00000000000000000000000042000000000000000000000000000000000000066001600160a01b031663d0e30db0866040518263ffffffff1660e01b81526004016000604051808303818588803b1580156103d557600080fd5b505af11580156103e9573d6000803e3d6000fd5b5050506001600160a01b037f0000000000000000000000004200000000000000000000000000000000000006811660008181526001602052604090205461043594509092501687610688565b6001600160a01b037f000000000000000000000000420000000000000000000000000000000000000681166000908152600160205260409020541663864f6a7a61047f8734610a0c565b6040516001600160e01b031960e084901b1681526001600160a01b03808b166004830152602482018a905260448201899052871660648201526084016000604051808303818588803b1580156104d457600080fd5b505af11580156104e8573d6000803e3d6000fd5b5050505050856001600160a01b0316336001600160a01b0316846001600160a01b03167f57f5d3655813c82b2a26f55a21f0108a37e609796c6123a213a45f2deab0b06b88868660405161053e93929190610a31565b60405180910390a4505050505050565b61055d87878787878787610566565b50505050505050565b61057b6001600160a01b038716333088610705565b6001600160a01b038087166000818152600160205260409020546105a0921687610688565b6001600160a01b0386811660009081526001602052604090819020549051634327b53d60e11b815289831660048201526024810188905260448101879052858316606482015291169063864f6a7a9034906084016000604051808303818588803b15801561060d57600080fd5b505af1158015610621573d6000803e3d6000fd5b5050505050866001600160a01b0316336001600160a01b0316846001600160a01b03167f57f5d3655813c82b2a26f55a21f0108a37e609796c6123a213a45f2deab0b06b88868660405161067793929190610a31565b60405180910390a450505050505050565b600060405163095ea7b360e01b8152836004820152826024820152602060006044836000895af13d15601f3d11600160005114161716915050806106ff5760405162461bcd60e51b815260206004820152600e60248201526d1054141493d59157d1905253115160921b6044820152606401610286565b50505050565b60006040516323b872dd60e01b81528460048201528360248201528260448201526020600060648360008a5af13d15601f3d11600160005114161716915050806107885760405162461bcd60e51b81526020600482015260146024820152731514905394d1915497d19493d357d1905253115160621b6044820152606401610286565b5050505050565b80356001600160a01b03811681146107a657600080fd5b919050565b60008083601f8401126107bd57600080fd5b50813567ffffffffffffffff8111156107d557600080fd5b6020830191508360208285010111156107ed57600080fd5b9250929050565b60008060008060008060008060008060006101408c8e03121561081657600080fd5b61081f8c61078f565b9a5061082d60208d0161078f565b995060408c0135985060608c0135975061084960808d0161078f565b965060a08c013567ffffffffffffffff81111561086557600080fd5b6108718e828f016107ab565b90975095505060c08c0135935060e08c013560ff8116811461089257600080fd5b809350506101008c013591506101208c013590509295989b509295989b9093969950565b6000602082840312156108c857600080fd5b6108d18261078f565b9392505050565b600080604083850312156108eb57600080fd5b6108f48361078f565b91506109026020840161078f565b90509250929050565b60008060008060008060a0878903121561092457600080fd5b61092d8761078f565b955060208701359450604087013593506109496060880161078f565b9250608087013567ffffffffffffffff81111561096557600080fd5b61097189828a016107ab565b979a9699509497509295939492505050565b600080600080600080600060c0888a03121561099e57600080fd5b6109a78861078f565b96506109b56020890161078f565b955060408801359450606088013593506109d16080890161078f565b925060a088013567ffffffffffffffff8111156109ed57600080fd5b6109f98a828b016107ab565b989b979a50959850939692959293505050565b600082821015610a2c57634e487b7160e01b600052601160045260246000fd5b500390565b83815260406020820152816040820152818360608301376000818301606090810191909152601f909201601f191601019291505056fea164736f6c634300080f000a

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

00000000000000000000000042000000000000000000000000000000000000060000000000000000000000000a888bb1cb72f2ba9279574a6d83744d052d95fd

-----Decoded View---------------
Arg [0] : _weth (address): 0x4200000000000000000000000000000000000006
Arg [1] : _owner (address): 0x0A888Bb1Cb72F2bA9279574a6d83744D052D95Fd

-----Encoded View---------------
2 Constructor Arguments found :
Arg [0] : 0000000000000000000000004200000000000000000000000000000000000006
Arg [1] : 0000000000000000000000000a888bb1cb72f2ba9279574a6d83744d052d95fd


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
[ 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.