Contract 0x4200000000000000000000000000000000000011 1

 

Contract Overview

Balance:
102.990803545392337661 Ether

EtherValue:
$118,033.64 (@ $1,146.06/ETH)
Txn Hash Method
Index
From
To
Value
0x27131a00e40d520a612077e9fe351d2009f694769853274d9e0a040daa80a65eWithdraw133526862022-06-28 1:47:596 days 21 hrs ago0xb2644085922cd777b7f31698a4a7c4e83cd1a8a8 IN 0x42000000000000000000000000000000000000110 Ether0.0001619467610.001
0xbaee4e216818933cf0b526eca9827d19cc436b580cc7ea0102f38e700ffa8967Withdraw125094432022-06-20 22:28:3014 days 1 hr ago0xb2644085922cd777b7f31698a4a7c4e83cd1a8a8 IN 0x42000000000000000000000000000000000000110 Ether0.0000814412030.001
0x5d0b59c0d85996ce76a9b90f8297b6a11f1640cf9dedf29debfb2b951ac50659Withdraw119654722022-06-15 23:20:0119 days 14 mins ago0xb2644085922cd777b7f31698a4a7c4e83cd1a8a8 IN 0x42000000000000000000000000000000000000110 Ether0.0001605766310.001
0x94d43783885e40fc53ab97bdf7fea42947e1a24e102e3bf176c7839b307955bfWithdraw116084562022-06-13 17:04:2321 days 6 hrs ago0xb2644085922cd777b7f31698a4a7c4e83cd1a8a8 IN 0x42000000000000000000000000000000000000110 Ether0.0003302108350.001
0x3c127927dfa962b83a6d4f95468a3615198ab37e44980ae1be710bd3d3cc4864Withdraw107794512022-06-06 22:47:0128 days 47 mins ago0xb2644085922cd777b7f31698a4a7c4e83cd1a8a8 IN 0x42000000000000000000000000000000000000110 Ether0.0001474988560.001
0x20912659aaa00402ea0476de99c6e6725db92d708263186b75f5a3485ad9d193Withdraw103468162022-06-02 22:27:2832 days 1 hr ago0xb2644085922cd777b7f31698a4a7c4e83cd1a8a8 IN 0x42000000000000000000000000000000000000110 Ether0.0004123184330.001
0x9e5d28b7a514363e1fb6fc430d76b85e2a09d4f143aa504f2e752b5db82abda3Withdraw100965542022-06-01 22:18:2833 days 1 hr ago0xb2644085922cd777b7f31698a4a7c4e83cd1a8a8 IN 0x42000000000000000000000000000000000000110 Ether0.0002701197830.001
0x28ae7df12edc185db5c9cbac2d2a7792033b6fd2ef24314ebf7cfd1a526d9f77Withdraw97282732022-06-01 2:47:3733 days 20 hrs ago0xb2644085922cd777b7f31698a4a7c4e83cd1a8a8 IN 0x42000000000000000000000000000000000000110 Ether0.0001902519490.001
0xf1b2cc2590293e415b44dad08bed07393ef2661e1c8c61899ab87f4caaeb941aWithdraw87027032022-05-21 2:45:1244 days 20 hrs ago0xb2644085922cd777b7f31698a4a7c4e83cd1a8a8 IN 0x42000000000000000000000000000000000000110 Ether0.0000858205210.001
0xcf11197d3b959c44a0ec20e564fa6a47219835af42b53143d781251a1d493f9bWithdraw82084702022-05-14 1:44:0051 days 21 hrs ago0xb2644085922cd777b7f31698a4a7c4e83cd1a8a8 IN 0x42000000000000000000000000000000000000110 Ether0.0001321277340.001
0xbb078b57dfe9a70ab671464293655786aeee4c21921eb969ee2f2390b82730fdWithdraw73309372022-05-08 0:19:1357 days 23 hrs ago0xb2644085922cd777b7f31698a4a7c4e83cd1a8a8 IN 0x42000000000000000000000000000000000000110 Ether0.000079536880.001
0x20b949b4c5d74de822cd0b1b66e48d3ebddf06d1dc3f162bd4eef9d522077bf2Withdraw68031412022-04-30 13:54:4265 days 9 hrs ago0xb2644085922cd777b7f31698a4a7c4e83cd1a8a8 IN 0x42000000000000000000000000000000000000110 Ether0.0002798049080.001
0x2141c3552ab6db28295fa084fa5cd6d28365d04ecd63a8b95f42276d37a8116aWithdraw63275312022-04-23 23:14:0072 days 20 mins ago0xb2644085922cd777b7f31698a4a7c4e83cd1a8a8 IN 0x42000000000000000000000000000000000000110 Ether0.0000571618960.001
0x2b16acc3d5f848e31d80fb9825e1439999a2f636e1f9f73ae9a604cc107b3688Withdraw55382412022-04-08 16:45:5287 days 6 hrs ago0xb2644085922cd777b7f31698a4a7c4e83cd1a8a8 IN 0x42000000000000000000000000000000000000110 Ether0.0002106804950.001
0x7c9313d0be32d724be6fdef6bbde8ffebd3d6ba3a4d9953b3974c0847dc65475Withdraw48684582022-03-26 7:38:56100 days 15 hrs ago0xb2644085922cd777b7f31698a4a7c4e83cd1a8a8 IN 0x42000000000000000000000000000000000000110 Ether0.0002774077090.001
0x76539ee5237db2a654eb409f5dce084a1da3b6b259fd9f9913808f79beafea08Withdraw44793642022-03-15 23:35:47110 days 23 hrs ago0xb2644085922cd777b7f31698a4a7c4e83cd1a8a8 IN 0x42000000000000000000000000000000000000110 Ether0.0002107842640.001
0x876a12512c3f12fa36373311770b0d1c0a6e67546c39a17614fff3aa0c76933bWithdraw37530512022-02-22 8:50:12132 days 14 hrs ago0x3cb3dd22128ec657a52dcc9a347838b4f26b142e IN 0x42000000000000000000000000000000000000110 Ether0.0002186541410.001
0x49b2652864007c218bfc5d358367b25ec6316994fb93de6630fbae0b886de6dcWithdraw35362222022-02-14 9:18:47140 days 14 hrs ago0x3cb3dd22128ec657a52dcc9a347838b4f26b142e IN 0x42000000000000000000000000000000000000110 Ether0.0002198086540.001
0xa758916a8b773235d2c17c964948ee5117631e5e08ed0075f5c070aa2ff39e16Withdraw30408022022-01-31 8:37:14154 days 14 hrs ago0x3cb3dd22128ec657a52dcc9a347838b4f26b142e IN 0x42000000000000000000000000000000000000110 Ether0.0003036971760.001
0x50270f19b2e79b3b38a52d071512d4bebc4424cb81491fd2afd8f77dad2b13d0Withdraw28420452022-01-26 11:19:03159 days 12 hrs ago0x3cb3dd22128ec657a52dcc9a347838b4f26b142e IN 0x42000000000000000000000000000000000000110 Ether0.000318052930.001
0x6e270ddc58a862d0de4fb311cf440e2ee97c4ec0476b9a8107b89d6def026d5dWithdraw27067902022-01-24 6:16:48161 days 17 hrs ago0x3cb3dd22128ec657a52dcc9a347838b4f26b142e IN 0x42000000000000000000000000000000000000110 Ether0.0004262532350.001
0x6ea3d6a2cda2b70ac5c4a95f9cf16b4e869a8fdc257218b109cb46d86ea7fea8Withdraw23680252022-01-17 9:43:09168 days 13 hrs ago0x3cb3dd22128ec657a52dcc9a347838b4f26b142e IN 0x42000000000000000000000000000000000000110 Ether0.0003683513120.001
0x463f3d4da431763113325f7dab0049892a47839406af1942f59d56f17c862311Withdraw22663582022-01-13 7:22:46172 days 16 hrs ago0x3cb3dd22128ec657a52dcc9a347838b4f26b142e IN 0x42000000000000000000000000000000000000110 Ether0.0006783752380.001
0x3d048befa428a6beebd0cc55bd0428dbc15c393152b9293efa55d64398baf8edWithdraw22068472022-01-11 6:41:04174 days 16 hrs ago0x3cb3dd22128ec657a52dcc9a347838b4f26b142e IN 0x42000000000000000000000000000000000000110 Ether0.0005790638080.001
0x77661985010e128332b0c7d335d06018ecd9e1d1684e6e3edd2885d4a0e182d6Withdraw21666292022-01-10 6:45:50175 days 16 hrs ago0x3cb3dd22128ec657a52dcc9a347838b4f26b142e IN 0x42000000000000000000000000000000000000110 Ether0.0007686794380.001
[ Download CSV Export 
Latest 15 internal transactions
Parent Txn Hash Block From To Value
0x27131a00e40d520a612077e9fe351d2009f694769853274d9e0a040daa80a65e133526862022-06-28 1:47:596 days 21 hrs ago 0x4200000000000000000000000000000000000011Optimism Bridge0 Ether
0xbaee4e216818933cf0b526eca9827d19cc436b580cc7ea0102f38e700ffa8967125094432022-06-20 22:28:3014 days 1 hr ago 0x4200000000000000000000000000000000000011Optimism Bridge0 Ether
0x5d0b59c0d85996ce76a9b90f8297b6a11f1640cf9dedf29debfb2b951ac50659119654722022-06-15 23:20:0119 days 14 mins ago 0x4200000000000000000000000000000000000011Optimism Bridge0 Ether
0x94d43783885e40fc53ab97bdf7fea42947e1a24e102e3bf176c7839b307955bf116084562022-06-13 17:04:2321 days 6 hrs ago 0x4200000000000000000000000000000000000011Optimism Bridge0 Ether
0x3c127927dfa962b83a6d4f95468a3615198ab37e44980ae1be710bd3d3cc4864107794512022-06-06 22:47:0128 days 47 mins ago 0x4200000000000000000000000000000000000011Optimism Bridge0 Ether
0x20912659aaa00402ea0476de99c6e6725db92d708263186b75f5a3485ad9d193103468162022-06-02 22:27:2832 days 1 hr ago 0x4200000000000000000000000000000000000011Optimism Bridge0 Ether
0x9e5d28b7a514363e1fb6fc430d76b85e2a09d4f143aa504f2e752b5db82abda3100965542022-06-01 22:18:2833 days 1 hr ago 0x4200000000000000000000000000000000000011Optimism Bridge0 Ether
0x28ae7df12edc185db5c9cbac2d2a7792033b6fd2ef24314ebf7cfd1a526d9f7797282732022-06-01 2:47:3733 days 20 hrs ago 0x4200000000000000000000000000000000000011Optimism Bridge0 Ether
0xf1b2cc2590293e415b44dad08bed07393ef2661e1c8c61899ab87f4caaeb941a87027032022-05-21 2:45:1244 days 20 hrs ago 0x4200000000000000000000000000000000000011Optimism Bridge0 Ether
0xcf11197d3b959c44a0ec20e564fa6a47219835af42b53143d781251a1d493f9b82084702022-05-14 1:44:0051 days 21 hrs ago 0x4200000000000000000000000000000000000011Optimism Bridge0 Ether
0xbb078b57dfe9a70ab671464293655786aeee4c21921eb969ee2f2390b82730fd73309372022-05-08 0:19:1357 days 23 hrs ago 0x4200000000000000000000000000000000000011Optimism Bridge0 Ether
0x20b949b4c5d74de822cd0b1b66e48d3ebddf06d1dc3f162bd4eef9d522077bf268031412022-04-30 13:54:4265 days 9 hrs ago 0x4200000000000000000000000000000000000011Optimism Bridge0 Ether
0x2141c3552ab6db28295fa084fa5cd6d28365d04ecd63a8b95f42276d37a8116a63275312022-04-23 23:14:0072 days 20 mins ago 0x4200000000000000000000000000000000000011Optimism Bridge0 Ether
0x2b16acc3d5f848e31d80fb9825e1439999a2f636e1f9f73ae9a604cc107b368855382412022-04-08 16:45:5287 days 6 hrs ago 0x4200000000000000000000000000000000000011Optimism Bridge0 Ether
0x7c9313d0be32d724be6fdef6bbde8ffebd3d6ba3a4d9953b3974c0847dc6547548684582022-03-26 7:38:56100 days 15 hrs ago 0x4200000000000000000000000000000000000011Optimism Bridge0 Ether
[ Download CSV Export 
Latest 25 Withdrawals
L2 Txn Hash Value Token Status L1 Withdrawal Txn
0x27131a00e40d520a612077e9fe351d2009f694769853274d9e0a040daa80a65e2022-06-28 1:47:596 days 21 hrs ago210.036257585011953568 Ether (ETH)Waitingn/a
0xbaee4e216818933cf0b526eca9827d19cc436b580cc7ea0102f38e700ffa89672022-06-20 22:28:3014 days 1 hr ago131.198811764830346851 Ether (ETH)Relayed0x75df22ae9e8c0848d511ad62d595561d2c7711bd0fc2361d5a6d241a6ccb3ca6
0x5d0b59c0d85996ce76a9b90f8297b6a11f1640cf9dedf29debfb2b951ac506592022-06-15 23:20:0119 days 14 mins ago152.446250920841202537 Ether (ETH)Relayed0xc220a904e1af93b299741b0bd741fce609b65b2cf699a58f161285bff6788afe
0x94d43783885e40fc53ab97bdf7fea42947e1a24e102e3bf176c7839b307955bf2022-06-13 17:04:2321 days 6 hrs ago326.10715994774979285 Ether (ETH)Relayed0x9812da816691f96ba8f5cfc4baffdb8e6626e8214eccfd59125476f4e8b72b53
0x3c127927dfa962b83a6d4f95468a3615198ab37e44980ae1be710bd3d3cc48642022-06-06 22:47:0128 days 47 mins ago151.439535915869417798 Ether (ETH)Relayed0xecbdd94c9c05eb1b51992ab43e36153dce549318346dbb21e37cbdabe5386534
0x20912659aaa00402ea0476de99c6e6725db92d708263186b75f5a3485ad9d1932022-06-02 22:27:2832 days 1 hr ago100.222252706986158184 Ether (ETH)Relayed0x220d1117b8074012b577ccc2c0f8f5101651605c720081ddb621ae46de5c4c2f
0x9e5d28b7a514363e1fb6fc430d76b85e2a09d4f143aa504f2e752b5db82abda32022-06-01 22:18:2833 days 1 hr ago135.696508611454961457 Ether (ETH)Relayed0x4b72d2395ad488e7f2a936d81b26c47d963c22e55b913944fc56ccc995c5f89e
0x28ae7df12edc185db5c9cbac2d2a7792033b6fd2ef24314ebf7cfd1a526d9f772022-06-01 2:47:3733 days 20 hrs ago302.431180516199953958 Ether (ETH)Relayed0x3ca6de211fecf3227bca9ee12df4c95c7bd2e79a9e382a1cd67087b9c3de19ae
0xf1b2cc2590293e415b44dad08bed07393ef2661e1c8c61899ab87f4caaeb941a2022-05-21 2:45:1244 days 20 hrs ago94.280357093456097237 Ether (ETH)Relayed0x1ac39361fea6d3474aa8841eb3322e7bee8b130d0645ca0520502ef4b097a4b6
0xcf11197d3b959c44a0ec20e564fa6a47219835af42b53143d781251a1d493f9b2022-05-14 1:44:0051 days 21 hrs ago656.635756637473724002 Ether (ETH)Relayed0xdd9a4ade78f57f1dff9ec6f00bf50e027ceb7015e5b4e386958aabdb6df30fda
0xbb078b57dfe9a70ab671464293655786aeee4c21921eb969ee2f2390b82730fd2022-05-08 0:19:1357 days 23 hrs ago270.83646589140325806 Ether (ETH)Relayed0x867c819cc80ac8a514de5a3e7ac0b021b6bdba7ee284434b5f9103b41f87d890
0x20b949b4c5d74de822cd0b1b66e48d3ebddf06d1dc3f162bd4eef9d522077bf22022-04-30 13:54:4265 days 9 hrs ago128.940076744518619533 Ether (ETH)Relayed0xb2fa4f89a1de85466880f8f03faaaa46200c85d631b668c3dae3f202c319a479
0x2141c3552ab6db28295fa084fa5cd6d28365d04ecd63a8b95f42276d37a8116a2022-04-23 23:14:0072 days 20 mins ago209.824155468307071833 Ether (ETH)Relayed0x70f098303a9fa422b8a08e2ef014fa5d7523e5e1c0f34ed4c5858ebfba4afb8b
0x2b16acc3d5f848e31d80fb9825e1439999a2f636e1f9f73ae9a604cc107b36882022-04-08 16:45:5287 days 6 hrs ago271.479922499268039219 Ether (ETH)Relayed0xee18181ee4384f0735eb23aa86fdcf4bd2a7b7a5d6a63549bd91f397b685e0c7
0x7c9313d0be32d724be6fdef6bbde8ffebd3d6ba3a4d9953b3974c0847dc654752022-03-26 7:38:56100 days 15 hrs ago121.057121065915721132 Ether (ETH)Relayed0x1d728dfdf7c39723e99bfd06ac0944694a82ac444c885f5c44d24b3c148eb5aa
0x76539ee5237db2a654eb409f5dce084a1da3b6b259fd9f9913808f79beafea082022-03-15 23:35:47110 days 23 hrs ago266.328852559934069902 Ether (ETH)Relayed0xd2ddd4d5715daa074cd866b119424d190bdaed22f9e27da02074cb7cfc4dff31
0x876a12512c3f12fa36373311770b0d1c0a6e67546c39a17614fff3aa0c76933b2022-02-22 8:50:12132 days 14 hrs ago113.400235808902515902 Ether (ETH)Relayed0xbd830536b94774d39cca7285180cba1daa9346f16109f1f2f99dffb8afeef458
0x49b2652864007c218bfc5d358367b25ec6316994fb93de6630fbae0b886de6dc2022-02-14 9:18:47140 days 14 hrs ago298.630620770832515914 Ether (ETH)Relayed0xe6e3b31d58f29f86d687d441f1b8094aacb2eaada0b819f4db80c7900ed9f63c
0xa758916a8b773235d2c17c964948ee5117631e5e08ed0075f5c070aa2ff39e162022-01-31 8:37:14154 days 14 hrs ago163.718347280845835654 Ether (ETH)Relayed0xc7217ccbcb0ca3c1760abae41f1adcdef48452fc64a4e151e58f455cb8c40b20
0x50270f19b2e79b3b38a52d071512d4bebc4424cb81491fd2afd8f77dad2b13d02022-01-26 11:19:03159 days 12 hrs ago109.432363936257611607 Ether (ETH)Relayed0x63b6e5b4ee5662c8a35c2ff1db7d6fab521bdac1bbf25f0c147425b5a53de139
0x6e270ddc58a862d0de4fb311cf440e2ee97c4ec0476b9a8107b89d6def026d5d2022-01-24 6:16:48161 days 17 hrs ago298.97828074331317793 Ether (ETH)Relayed0x2748255dd7c1c44ac3d62cc6f039e583aef3547aa5271b47cc8908cc4441d92c
0x6ea3d6a2cda2b70ac5c4a95f9cf16b4e869a8fdc257218b109cb46d86ea7fea82022-01-17 9:43:09168 days 13 hrs ago93.406764907789686153 Ether (ETH)Relayed0x56e6741a077bf5683fc687ca6371d12849aa8ab22b08ea3a28b042d8f229a59d
0x463f3d4da431763113325f7dab0049892a47839406af1942f59d56f17c8623112022-01-13 7:22:46172 days 16 hrs ago59.995013903157655615 Ether (ETH)Relayed0xd8270d5a70e362b1aa370fd487175bc3d6f93055177224abf72064f600a62864
0x3d048befa428a6beebd0cc55bd0428dbc15c393152b9293efa55d64398baf8ed2022-01-11 6:41:04174 days 16 hrs ago56.183471276114296588 Ether (ETH)Relayed0xf37454f90d85a073a8ac86ff9e7fb2048c977ce0c14612707c7b1aaae5a3d88c
0x77661985010e128332b0c7d335d06018ecd9e1d1684e6e3edd2885d4a0e182d62022-01-10 6:45:50175 days 16 hrs ago153.73435989215252822 Ether (ETH)Relayed0xb22d41a94c9c04ccfd0daada9df54545b2dc94c0f78694ded832218b56b80404
[ Download CSV Export 
Loading

Contract Source Code Verified (Genesis Bytecode Match Only)

Contract Name:
OVM_SequencerFeeVault

Compiler Version
v0.8.9+commit.e5eed63a

Optimization Enabled:
Yes with 10000 runs

Other Settings:
default evmVersion
File 1 of 12 : OVM_SequencerFeeVault.sol
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.9;

/* Library Imports */
import { Lib_PredeployAddresses } from "../../libraries/constants/Lib_PredeployAddresses.sol";

/* Contract Imports */
import { L2StandardBridge } from "../messaging/L2StandardBridge.sol";

/**
 * @title OVM_SequencerFeeVault
 * @dev Simple holding contract for fees paid to the Sequencer. Likely to be replaced in the future
 * but "good enough for now".
 */
contract OVM_SequencerFeeVault {
    /*************
     * Constants *
     *************/

    // Minimum ETH balance that can be withdrawn in a single withdrawal.
    uint256 public constant MIN_WITHDRAWAL_AMOUNT = 15 ether;

    /*************
     * Variables *
     *************/

    // Address on L1 that will hold the fees once withdrawn. Dynamically initialized within l2geth.
    address public l1FeeWallet;

    /***************
     * Constructor *
     ***************/

    /**
     * @param _l1FeeWallet Initial address for the L1 wallet that will hold fees once withdrawn.
     * Currently HAS NO EFFECT in production because l2geth will mutate this storage slot during
     * the genesis block. This is ONLY for testing purposes.
     */
    constructor(address _l1FeeWallet) {
        l1FeeWallet = _l1FeeWallet;
    }

    /************
     * Fallback *
     ************/

    receive() external payable {}

    /********************
     * Public Functions *
     ********************/

    function withdraw() public {
        require(
            address(this).balance >= MIN_WITHDRAWAL_AMOUNT,
            // solhint-disable-next-line max-line-length
            "OVM_SequencerFeeVault: withdrawal amount must be greater than minimum withdrawal amount"
        );

        L2StandardBridge(Lib_PredeployAddresses.L2_STANDARD_BRIDGE).withdrawTo(
            Lib_PredeployAddresses.OVM_ETH,
            l1FeeWallet,
            address(this).balance,
            0,
            bytes("")
        );
    }
}

File 2 of 12 : Lib_PredeployAddresses.sol
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.9;

/**
 * @title Lib_PredeployAddresses
 */
library Lib_PredeployAddresses {
    address internal constant L2_TO_L1_MESSAGE_PASSER = 0x4200000000000000000000000000000000000000;
    address internal constant L1_MESSAGE_SENDER = 0x4200000000000000000000000000000000000001;
    address internal constant DEPLOYER_WHITELIST = 0x4200000000000000000000000000000000000002;
    address payable internal constant OVM_ETH = payable(0xDeadDeAddeAddEAddeadDEaDDEAdDeaDDeAD0000);
    address internal constant L2_CROSS_DOMAIN_MESSENGER =
        0x4200000000000000000000000000000000000007;
    address internal constant LIB_ADDRESS_MANAGER = 0x4200000000000000000000000000000000000008;
    address internal constant PROXY_EOA = 0x4200000000000000000000000000000000000009;
    address internal constant L2_STANDARD_BRIDGE = 0x4200000000000000000000000000000000000010;
    address internal constant SEQUENCER_FEE_WALLET = 0x4200000000000000000000000000000000000011;
    address internal constant L2_STANDARD_TOKEN_FACTORY =
        0x4200000000000000000000000000000000000012;
    address internal constant L1_BLOCK_NUMBER = 0x4200000000000000000000000000000000000013;
}

File 3 of 12 : L2StandardBridge.sol
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.9;

/* Interface Imports */
import { IL1StandardBridge } from "../../L1/messaging/IL1StandardBridge.sol";
import { IL1ERC20Bridge } from "../../L1/messaging/IL1ERC20Bridge.sol";
import { IL2ERC20Bridge } from "./IL2ERC20Bridge.sol";

/* Library Imports */
import { ERC165Checker } from "@openzeppelin/contracts/utils/introspection/ERC165Checker.sol";
import { CrossDomainEnabled } from "../../libraries/bridge/CrossDomainEnabled.sol";
import { Lib_PredeployAddresses } from "../../libraries/constants/Lib_PredeployAddresses.sol";

/* Contract Imports */
import { IL2StandardERC20 } from "../../standards/IL2StandardERC20.sol";

/**
 * @title L2StandardBridge
 * @dev The L2 Standard bridge is a contract which works together with the L1 Standard bridge to
 * enable ETH and ERC20 transitions between L1 and L2.
 * This contract acts as a minter for new tokens when it hears about deposits into the L1 Standard
 * bridge.
 * This contract also acts as a burner of the tokens intended for withdrawal, informing the L1
 * bridge to release L1 funds.
 */
contract L2StandardBridge is IL2ERC20Bridge, CrossDomainEnabled {
    /********************************
     * External Contract References *
     ********************************/

    address public l1TokenBridge;

    /***************
     * Constructor *
     ***************/

    /**
     * @param _l2CrossDomainMessenger Cross-domain messenger used by this contract.
     * @param _l1TokenBridge Address of the L1 bridge deployed to the main chain.
     */
    constructor(address _l2CrossDomainMessenger, address _l1TokenBridge)
        CrossDomainEnabled(_l2CrossDomainMessenger)
    {
        l1TokenBridge = _l1TokenBridge;
    }

    /***************
     * Withdrawing *
     ***************/

    /**
     * @inheritdoc IL2ERC20Bridge
     */
    function withdraw(
        address _l2Token,
        uint256 _amount,
        uint32 _l1Gas,
        bytes calldata _data
    ) external virtual {
        _initiateWithdrawal(_l2Token, msg.sender, msg.sender, _amount, _l1Gas, _data);
    }

    /**
     * @inheritdoc IL2ERC20Bridge
     */
    function withdrawTo(
        address _l2Token,
        address _to,
        uint256 _amount,
        uint32 _l1Gas,
        bytes calldata _data
    ) external virtual {
        _initiateWithdrawal(_l2Token, msg.sender, _to, _amount, _l1Gas, _data);
    }

    /**
     * @dev Performs the logic for deposits by storing the token and informing the L2 token Gateway
     * of the deposit.
     * @param _l2Token Address of L2 token where withdrawal was initiated.
     * @param _from Account to pull the deposit from on L2.
     * @param _to Account to give the withdrawal to on L1.
     * @param _amount Amount of the token to withdraw.
     * param _l1Gas Unused, but included for potential forward compatibility considerations.
     * @param _data Optional data to forward to L1. This data is provided
     *        solely as a convenience for external contracts. Aside from enforcing a maximum
     *        length, these contracts provide no guarantees about its content.
     */
    function _initiateWithdrawal(
        address _l2Token,
        address _from,
        address _to,
        uint256 _amount,
        uint32 _l1Gas,
        bytes calldata _data
    ) internal {
        // When a withdrawal is initiated, we burn the withdrawer's funds to prevent subsequent L2
        // usage
        IL2StandardERC20(_l2Token).burn(msg.sender, _amount);

        // Construct calldata for l1TokenBridge.finalizeERC20Withdrawal(_to, _amount)
        address l1Token = IL2StandardERC20(_l2Token).l1Token();
        bytes memory message;

        if (_l2Token == Lib_PredeployAddresses.OVM_ETH) {
            message = abi.encodeWithSelector(
                IL1StandardBridge.finalizeETHWithdrawal.selector,
                _from,
                _to,
                _amount,
                _data
            );
        } else {
            message = abi.encodeWithSelector(
                IL1ERC20Bridge.finalizeERC20Withdrawal.selector,
                l1Token,
                _l2Token,
                _from,
                _to,
                _amount,
                _data
            );
        }

        // Send message up to L1 bridge
        sendCrossDomainMessage(l1TokenBridge, _l1Gas, message);

        emit WithdrawalInitiated(l1Token, _l2Token, msg.sender, _to, _amount, _data);
    }

    /************************************
     * Cross-chain Function: Depositing *
     ************************************/

    /**
     * @inheritdoc IL2ERC20Bridge
     */
    function finalizeDeposit(
        address _l1Token,
        address _l2Token,
        address _from,
        address _to,
        uint256 _amount,
        bytes calldata _data
    ) external virtual onlyFromCrossDomainAccount(l1TokenBridge) {
        // Check the target token is compliant and
        // verify the deposited token on L1 matches the L2 deposited token representation here
        if (
            ERC165Checker.supportsInterface(_l2Token, 0x1d1d8b63) &&
            _l1Token == IL2StandardERC20(_l2Token).l1Token()
        ) {
            // When a deposit is finalized, we credit the account on L2 with the same amount of
            // tokens.
            IL2StandardERC20(_l2Token).mint(_to, _amount);
            emit DepositFinalized(_l1Token, _l2Token, _from, _to, _amount, _data);
        } else {
            // Either the L2 token which is being deposited-into disagrees about the correct address
            // of its L1 token, or does not support the correct interface.
            // This should only happen if there is a  malicious L2 token, or if a user somehow
            // specified the wrong L2 token address to deposit into.
            // In either case, we stop the process here and construct a withdrawal
            // message so that users can get their funds out in some cases.
            // There is no way to prevent malicious token contracts altogether, but this does limit
            // user error and mitigate some forms of malicious contract behavior.
            bytes memory message = abi.encodeWithSelector(
                IL1ERC20Bridge.finalizeERC20Withdrawal.selector,
                _l1Token,
                _l2Token,
                _to, // switched the _to and _from here to bounce back the deposit to the sender
                _from,
                _amount,
                _data
            );

            // Send message up to L1 bridge
            sendCrossDomainMessage(l1TokenBridge, 0, message);
            emit DepositFailed(_l1Token, _l2Token, _from, _to, _amount, _data);
        }
    }
}

File 4 of 12 : IL1StandardBridge.sol
// SPDX-License-Identifier: MIT
pragma solidity >0.5.0 <0.9.0;

import "./IL1ERC20Bridge.sol";

/**
 * @title IL1StandardBridge
 */
interface IL1StandardBridge is IL1ERC20Bridge {
    /**********
     * Events *
     **********/
    event ETHDepositInitiated(
        address indexed _from,
        address indexed _to,
        uint256 _amount,
        bytes _data
    );

    event ETHWithdrawalFinalized(
        address indexed _from,
        address indexed _to,
        uint256 _amount,
        bytes _data
    );

    /********************
     * Public Functions *
     ********************/

    /**
     * @dev Deposit an amount of the ETH to the caller's balance on L2.
     * @param _l2Gas Gas limit required to complete the deposit on L2.
     * @param _data Optional data to forward to L2. This data is provided
     *        solely as a convenience for external contracts. Aside from enforcing a maximum
     *        length, these contracts provide no guarantees about its content.
     */
    function depositETH(uint32 _l2Gas, bytes calldata _data) external payable;

    /**
     * @dev Deposit an amount of ETH to a recipient's balance on L2.
     * @param _to L2 address to credit the withdrawal to.
     * @param _l2Gas Gas limit required to complete the deposit on L2.
     * @param _data Optional data to forward to L2. This data is provided
     *        solely as a convenience for external contracts. Aside from enforcing a maximum
     *        length, these contracts provide no guarantees about its content.
     */
    function depositETHTo(
        address _to,
        uint32 _l2Gas,
        bytes calldata _data
    ) external payable;

    /*************************
     * Cross-chain Functions *
     *************************/

    /**
     * @dev Complete a withdrawal from L2 to L1, and credit funds to the recipient's balance of the
     * L1 ETH token. Since only the xDomainMessenger can call this function, it will never be called
     * before the withdrawal is finalized.
     * @param _from L2 address initiating the transfer.
     * @param _to L1 address to credit the withdrawal to.
     * @param _amount Amount of the ERC20 to deposit.
     * @param _data Optional data to forward to L2. This data is provided
     *        solely as a convenience for external contracts. Aside from enforcing a maximum
     *        length, these contracts provide no guarantees about its content.
     */
    function finalizeETHWithdrawal(
        address _from,
        address _to,
        uint256 _amount,
        bytes calldata _data
    ) external;
}

File 5 of 12 : IL1ERC20Bridge.sol
// SPDX-License-Identifier: MIT
pragma solidity >0.5.0 <0.9.0;

/**
 * @title IL1ERC20Bridge
 */
interface IL1ERC20Bridge {
    /**********
     * Events *
     **********/

    event ERC20DepositInitiated(
        address indexed _l1Token,
        address indexed _l2Token,
        address indexed _from,
        address _to,
        uint256 _amount,
        bytes _data
    );

    event ERC20WithdrawalFinalized(
        address indexed _l1Token,
        address indexed _l2Token,
        address indexed _from,
        address _to,
        uint256 _amount,
        bytes _data
    );

    /********************
     * Public Functions *
     ********************/

    /**
     * @dev get the address of the corresponding L2 bridge contract.
     * @return Address of the corresponding L2 bridge contract.
     */
    function l2TokenBridge() external returns (address);

    /**
     * @dev deposit an amount of the ERC20 to the caller's balance on L2.
     * @param _l1Token Address of the L1 ERC20 we are depositing
     * @param _l2Token Address of the L1 respective L2 ERC20
     * @param _amount Amount of the ERC20 to deposit
     * @param _l2Gas Gas limit required to complete the deposit on L2.
     * @param _data Optional data to forward to L2. This data is provided
     *        solely as a convenience for external contracts. Aside from enforcing a maximum
     *        length, these contracts provide no guarantees about its content.
     */
    function depositERC20(
        address _l1Token,
        address _l2Token,
        uint256 _amount,
        uint32 _l2Gas,
        bytes calldata _data
    ) external;

    /**
     * @dev deposit an amount of ERC20 to a recipient's balance on L2.
     * @param _l1Token Address of the L1 ERC20 we are depositing
     * @param _l2Token Address of the L1 respective L2 ERC20
     * @param _to L2 address to credit the withdrawal to.
     * @param _amount Amount of the ERC20 to deposit.
     * @param _l2Gas Gas limit required to complete the deposit on L2.
     * @param _data Optional data to forward to L2. This data is provided
     *        solely as a convenience for external contracts. Aside from enforcing a maximum
     *        length, these contracts provide no guarantees about its content.
     */
    function depositERC20To(
        address _l1Token,
        address _l2Token,
        address _to,
        uint256 _amount,
        uint32 _l2Gas,
        bytes calldata _data
    ) external;

    /*************************
     * Cross-chain Functions *
     *************************/

    /**
     * @dev Complete a withdrawal from L2 to L1, and credit funds to the recipient's balance of the
     * L1 ERC20 token.
     * This call will fail if the initialized withdrawal from L2 has not been finalized.
     *
     * @param _l1Token Address of L1 token to finalizeWithdrawal for.
     * @param _l2Token Address of L2 token where withdrawal was initiated.
     * @param _from L2 address initiating the transfer.
     * @param _to L1 address to credit the withdrawal to.
     * @param _amount Amount of the ERC20 to deposit.
     * @param _data Data provided by the sender on L2. This data is provided
     *   solely as a convenience for external contracts. Aside from enforcing a maximum
     *   length, these contracts provide no guarantees about its content.
     */
    function finalizeERC20Withdrawal(
        address _l1Token,
        address _l2Token,
        address _from,
        address _to,
        uint256 _amount,
        bytes calldata _data
    ) external;
}

File 6 of 12 : IL2ERC20Bridge.sol
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.9;

/**
 * @title IL2ERC20Bridge
 */
interface IL2ERC20Bridge {
    /**********
     * Events *
     **********/

    event WithdrawalInitiated(
        address indexed _l1Token,
        address indexed _l2Token,
        address indexed _from,
        address _to,
        uint256 _amount,
        bytes _data
    );

    event DepositFinalized(
        address indexed _l1Token,
        address indexed _l2Token,
        address indexed _from,
        address _to,
        uint256 _amount,
        bytes _data
    );

    event DepositFailed(
        address indexed _l1Token,
        address indexed _l2Token,
        address indexed _from,
        address _to,
        uint256 _amount,
        bytes _data
    );

    /********************
     * Public Functions *
     ********************/

    /**
     * @dev get the address of the corresponding L1 bridge contract.
     * @return Address of the corresponding L1 bridge contract.
     */
    function l1TokenBridge() external returns (address);

    /**
     * @dev initiate a withdraw of some tokens to the caller's account on L1
     * @param _l2Token Address of L2 token where withdrawal was initiated.
     * @param _amount Amount of the token to withdraw.
     * param _l1Gas Unused, but included for potential forward compatibility considerations.
     * @param _data Optional data to forward to L1. This data is provided
     *        solely as a convenience for external contracts. Aside from enforcing a maximum
     *        length, these contracts provide no guarantees about its content.
     */
    function withdraw(
        address _l2Token,
        uint256 _amount,
        uint32 _l1Gas,
        bytes calldata _data
    ) external;

    /**
     * @dev initiate a withdraw of some token to a recipient's account on L1.
     * @param _l2Token Address of L2 token where withdrawal is initiated.
     * @param _to L1 adress to credit the withdrawal to.
     * @param _amount Amount of the token to withdraw.
     * param _l1Gas Unused, but included for potential forward compatibility considerations.
     * @param _data Optional data to forward to L1. This data is provided
     *        solely as a convenience for external contracts. Aside from enforcing a maximum
     *        length, these contracts provide no guarantees about its content.
     */
    function withdrawTo(
        address _l2Token,
        address _to,
        uint256 _amount,
        uint32 _l1Gas,
        bytes calldata _data
    ) external;

    /*************************
     * Cross-chain Functions *
     *************************/

    /**
     * @dev Complete a deposit from L1 to L2, and credits funds to the recipient's balance of this
     * L2 token. This call will fail if it did not originate from a corresponding deposit in
     * L1StandardTokenBridge.
     * @param _l1Token Address for the l1 token this is called with
     * @param _l2Token Address for the l2 token this is called with
     * @param _from Account to pull the deposit from on L2.
     * @param _to Address to receive the withdrawal at
     * @param _amount Amount of the token to withdraw
     * @param _data Data provider by the sender on L1. This data is provided
     *        solely as a convenience for external contracts. Aside from enforcing a maximum
     *        length, these contracts provide no guarantees about its content.
     */
    function finalizeDeposit(
        address _l1Token,
        address _l2Token,
        address _from,
        address _to,
        uint256 _amount,
        bytes calldata _data
    ) external;
}

File 7 of 12 : ERC165Checker.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

import "./IERC165.sol";

/**
 * @dev Library used to query support of an interface declared via {IERC165}.
 *
 * Note that these functions return the actual result of the query: they do not
 * `revert` if an interface is not supported. It is up to the caller to decide
 * what to do in these cases.
 */
library ERC165Checker {
    // As per the EIP-165 spec, no interface should ever match 0xffffffff
    bytes4 private constant _INTERFACE_ID_INVALID = 0xffffffff;

    /**
     * @dev Returns true if `account` supports the {IERC165} interface,
     */
    function supportsERC165(address account) internal view returns (bool) {
        // Any contract that implements ERC165 must explicitly indicate support of
        // InterfaceId_ERC165 and explicitly indicate non-support of InterfaceId_Invalid
        return
            _supportsERC165Interface(account, type(IERC165).interfaceId) &&
            !_supportsERC165Interface(account, _INTERFACE_ID_INVALID);
    }

    /**
     * @dev Returns true if `account` supports the interface defined by
     * `interfaceId`. Support for {IERC165} itself is queried automatically.
     *
     * See {IERC165-supportsInterface}.
     */
    function supportsInterface(address account, bytes4 interfaceId) internal view returns (bool) {
        // query support of both ERC165 as per the spec and support of _interfaceId
        return supportsERC165(account) && _supportsERC165Interface(account, interfaceId);
    }

    /**
     * @dev Returns a boolean array where each value corresponds to the
     * interfaces passed in and whether they're supported or not. This allows
     * you to batch check interfaces for a contract where your expectation
     * is that some interfaces may not be supported.
     *
     * See {IERC165-supportsInterface}.
     *
     * _Available since v3.4._
     */
    function getSupportedInterfaces(address account, bytes4[] memory interfaceIds)
        internal
        view
        returns (bool[] memory)
    {
        // an array of booleans corresponding to interfaceIds and whether they're supported or not
        bool[] memory interfaceIdsSupported = new bool[](interfaceIds.length);

        // query support of ERC165 itself
        if (supportsERC165(account)) {
            // query support of each interface in interfaceIds
            for (uint256 i = 0; i < interfaceIds.length; i++) {
                interfaceIdsSupported[i] = _supportsERC165Interface(account, interfaceIds[i]);
            }
        }

        return interfaceIdsSupported;
    }

    /**
     * @dev Returns true if `account` supports all the interfaces defined in
     * `interfaceIds`. Support for {IERC165} itself is queried automatically.
     *
     * Batch-querying can lead to gas savings by skipping repeated checks for
     * {IERC165} support.
     *
     * See {IERC165-supportsInterface}.
     */
    function supportsAllInterfaces(address account, bytes4[] memory interfaceIds) internal view returns (bool) {
        // query support of ERC165 itself
        if (!supportsERC165(account)) {
            return false;
        }

        // query support of each interface in _interfaceIds
        for (uint256 i = 0; i < interfaceIds.length; i++) {
            if (!_supportsERC165Interface(account, interfaceIds[i])) {
                return false;
            }
        }

        // all interfaces supported
        return true;
    }

    /**
     * @notice Query if a contract implements an interface, does not check ERC165 support
     * @param account The address of the contract to query for support of an interface
     * @param interfaceId The interface identifier, as specified in ERC-165
     * @return true if the contract at account indicates support of the interface with
     * identifier interfaceId, false otherwise
     * @dev Assumes that account contains a contract that supports ERC165, otherwise
     * the behavior of this method is undefined. This precondition can be checked
     * with {supportsERC165}.
     * Interface identification is specified in ERC-165.
     */
    function _supportsERC165Interface(address account, bytes4 interfaceId) private view returns (bool) {
        bytes memory encodedParams = abi.encodeWithSelector(IERC165.supportsInterface.selector, interfaceId);
        (bool success, bytes memory result) = account.staticcall{gas: 30000}(encodedParams);
        if (result.length < 32) return false;
        return success && abi.decode(result, (bool));
    }
}

File 8 of 12 : CrossDomainEnabled.sol
// SPDX-License-Identifier: MIT
pragma solidity >0.5.0 <0.9.0;

/* Interface Imports */
import { ICrossDomainMessenger } from "./ICrossDomainMessenger.sol";

/**
 * @title CrossDomainEnabled
 * @dev Helper contract for contracts performing cross-domain communications
 *
 * Compiler used: defined by inheriting contract
 * Runtime target: defined by inheriting contract
 */
contract CrossDomainEnabled {
    /*************
     * Variables *
     *************/

    // Messenger contract used to send and recieve messages from the other domain.
    address public messenger;

    /***************
     * Constructor *
     ***************/

    /**
     * @param _messenger Address of the CrossDomainMessenger on the current layer.
     */
    constructor(address _messenger) {
        messenger = _messenger;
    }

    /**********************
     * Function Modifiers *
     **********************/

    /**
     * Enforces that the modified function is only callable by a specific cross-domain account.
     * @param _sourceDomainAccount The only account on the originating domain which is
     *  authenticated to call this function.
     */
    modifier onlyFromCrossDomainAccount(address _sourceDomainAccount) {
        require(
            msg.sender == address(getCrossDomainMessenger()),
            "OVM_XCHAIN: messenger contract unauthenticated"
        );

        require(
            getCrossDomainMessenger().xDomainMessageSender() == _sourceDomainAccount,
            "OVM_XCHAIN: wrong sender of cross-domain message"
        );

        _;
    }

    /**********************
     * Internal Functions *
     **********************/

    /**
     * Gets the messenger, usually from storage. This function is exposed in case a child contract
     * needs to override.
     * @return The address of the cross-domain messenger contract which should be used.
     */
    function getCrossDomainMessenger() internal virtual returns (ICrossDomainMessenger) {
        return ICrossDomainMessenger(messenger);
    }

    /**q
     * Sends a message to an account on another domain
     * @param _crossDomainTarget The intended recipient on the destination domain
     * @param _message The data to send to the target (usually calldata to a function with
     *  `onlyFromCrossDomainAccount()`)
     * @param _gasLimit The gasLimit for the receipt of the message on the target domain.
     */
    function sendCrossDomainMessage(
        address _crossDomainTarget,
        uint32 _gasLimit,
        bytes memory _message
    ) internal {
        getCrossDomainMessenger().sendMessage(_crossDomainTarget, _message, _gasLimit);
    }
}

File 9 of 12 : IL2StandardERC20.sol
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.9;

import { IERC20 } from "@openzeppelin/contracts/token/ERC20/IERC20.sol";
import { IERC165 } from "@openzeppelin/contracts/utils/introspection/IERC165.sol";

interface IL2StandardERC20 is IERC20, IERC165 {
    function l1Token() external returns (address);

    function mint(address _to, uint256 _amount) external;

    function burn(address _from, uint256 _amount) external;

    event Mint(address indexed _account, uint256 _amount);
    event Burn(address indexed _account, uint256 _amount);
}

File 10 of 12 : IERC165.sol
// SPDX-License-Identifier: MIT

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 11 of 12 : ICrossDomainMessenger.sol
// SPDX-License-Identifier: MIT
pragma solidity >0.5.0 <0.9.0;

/**
 * @title ICrossDomainMessenger
 */
interface ICrossDomainMessenger {
    /**********
     * Events *
     **********/

    event SentMessage(
        address indexed target,
        address sender,
        bytes message,
        uint256 messageNonce,
        uint256 gasLimit
    );
    event RelayedMessage(bytes32 indexed msgHash);
    event FailedRelayedMessage(bytes32 indexed msgHash);

    /*************
     * Variables *
     *************/

    function xDomainMessageSender() external view returns (address);

    /********************
     * Public Functions *
     ********************/

    /**
     * Sends a cross domain message to the target messenger.
     * @param _target Target contract address.
     * @param _message Message to send to the target.
     * @param _gasLimit Gas limit for the provided message.
     */
    function sendMessage(
        address _target,
        bytes calldata _message,
        uint32 _gasLimit
    ) external;
}

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

pragma solidity ^0.8.0;

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

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

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

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

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

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

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

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

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

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"address","name":"_l1FeeWallet","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"MIN_WITHDRAWAL_AMOUNT","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"l1FeeWallet","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]

6080604052600436106100385760003560e01c80633ccfd60b14610044578063d3e5792b1461005b578063d4ff92181461008a57600080fd5b3661003f57005b600080fd5b34801561005057600080fd5b506100596100dc565b005b34801561006757600080fd5b5061007767d02ab486cedc000081565b6040519081526020015b60405180910390f35b34801561009657600080fd5b506000546100b79073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610081565b67d02ab486cedc000047101561019e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152605760248201527f4f564d5f53657175656e6365724665655661756c743a2077697468647261776160448201527f6c20616d6f756e74206d7573742062652067726561746572207468616e206d6960648201527f6e696d756d207769746864726177616c20616d6f756e74000000000000000000608482015260a40160405180910390fd5b600080546040805160208101825283815290517fa3a795480000000000000000000000000000000000000000000000000000000081527342000000000000000000000000000000000000109363a3a79548936102309373deaddeaddeaddeaddeaddeaddeaddeaddead00009373ffffffffffffffffffffffffffffffffffffffff909216924792909190600401610264565b600060405180830381600087803b15801561024a57600080fd5b505af115801561025e573d6000803e3d6000fd5b50505050565b600073ffffffffffffffffffffffffffffffffffffffff808816835260208188168185015286604085015263ffffffff8616606085015260a06080850152845191508160a085015260005b828110156102cb5785810182015185820160c0015281016102af565b828111156102dd57600060c084870101525b5050601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169190910160c001969550505050505056fea2646970667358221220aecafbfe76c35f4ebf21d8036fc117bf6b5491720acb7128e5d4a2a340bff17964736f6c63430008090033

Block Transaction Difficulty Gas Used Reward
Block Uncle Number Difficulty Gas Used Reward
Loading
Loading
Make sure to use the "Vote Down" button for any spammy posts, and the "Vote Up" for interesting conversations.