Contract 0x1bd0a503ef149b188bfa31205028db0401186107

 

Contract Overview

Boba Network: Discretionary Exit Fee
Balance:
0 Ether

EtherValue:
$0.00
Txn Hash Method
Block
From
To
Value
0x317468f579dd510a261b41a24f4e89350880edea65abdd24f254fd261397e720Pay And Withdraw9935632023-03-30 10:54:014 hrs 18 mins ago0x9c42c4921b9320b76be0a4772061d88ed13373c0 IN  Boba Network: Discretionary Exit Fee0 Ether0.0002972921
0xc2890fbba36f5c3f3c162edd894a9aae5435d0bceb02fc3faaa907ad4246a992Pay And Withdraw9924552023-03-29 7:49:521 day 7 hrs ago0x4bf107d6d2b0b15f3f78f35600932df48509da2f IN  Boba Network: Discretionary Exit Fee0 Ether1.7826018211
0xb70a2abfbbe861c2cd3c4fa3f0261fe671d45800048f8f99f359dad2590bc083Pay And Withdraw9918802023-03-28 17:46:281 day 21 hrs ago0x98c89980d1eae247ada3636ae27648f78e66e121 IN  Boba Network: Discretionary Exit Fee0 Ether0.0002802431
0x12199318857855139c101ea399cb9ea64eeca54963210d7639c2e7e5de79e51fPay And Withdraw9914752023-03-28 9:53:592 days 5 hrs ago0x29687e2a2b38bbc1f4f9069f1f24f13a3c83d27d IN  Boba Network: Discretionary Exit Fee0.2274 Ether0.0002411811
0x457f75d303eea230039676af167737015dc7337941869a6d145856415dc73e46Pay And Withdraw9913612023-03-28 7:50:032 days 7 hrs ago0x27229c5c34c018e6a43d2a00f8f81e06f54a9a5d IN  Boba Network: Discretionary Exit Fee0 Ether0.0002682581
0xd1b9a44041f303058f6ea3898a916e364688ae9d536ea17de809d37a3276efa6Pay And Withdraw9903222023-03-27 18:17:552 days 20 hrs ago0x996267d7d1b7f5046543fede2c2db473ed4f65e9 IN  Boba Network: Discretionary Exit Fee0 Ether0.0003559551
0x442a3c753b107cd4b60f38c5be6474ccd6cb932d2be486af6d5aad1a61c4506cPay And Withdraw9902972023-03-27 17:53:182 days 21 hrs ago0x996267d7d1b7f5046543fede2c2db473ed4f65e9 IN  Boba Network: Discretionary Exit Fee0 Ether0.0003630811
0x32714b5894d5a48b98841483724d41ed6e7029435e2b80ab0deec700d821e4daPay And Withdraw9902952023-03-27 17:52:402 days 21 hrs ago0x996267d7d1b7f5046543fede2c2db473ed4f65e9 IN  Boba Network: Discretionary Exit Fee23.7 Ether0.000295121
0xae75905b8696e3acfb25e1e94d2fad72787c866acf9046c8905d1e58dc29beabPay And Withdraw9902922023-03-27 17:51:592 days 21 hrs ago0x996267d7d1b7f5046543fede2c2db473ed4f65e9 IN  Boba Network: Discretionary Exit Fee0 Ether0.0003247131
0x0f0a0d806156457d1b186a5d46e01cda7ec325ea4db465fca13aa98a1783935fPay And Withdraw9902882023-03-27 17:51:042 days 21 hrs ago0x996267d7d1b7f5046543fede2c2db473ed4f65e9 IN  Boba Network: Discretionary Exit Fee0 Ether0.0003244641
0x2a577df1b2fb254464a9be76459d00c4c1eb0cf9d2c8ec9276c596c4d023a704Pay And Withdraw9894462023-03-26 22:03:373 days 17 hrs ago0x240ce0f68395efa7dc93aaa2a3e4e87dd62dba2a IN  Boba Network: Discretionary Exit Fee0 Ether0.0002558031
0x0a15afa327593cdbb61711c237ffe85dfec97011e4491316b8457ce7b34dbae8Pay And Withdraw9893002023-03-26 19:05:083 days 20 hrs ago0x80c67432656d59144ceff962e8faf8926599bcf8 IN  Boba Network: Discretionary Exit Fee20.32 Ether0.0002301371
0x8933c2ed630d4765bb6e96ec8afdf7021c517a5b5840c8e55d66c894acd96f73Pay And Withdraw9890212023-03-26 12:56:364 days 2 hrs ago0x6670c18976c1b38b2ff05f8269b678b5dacb4525 IN  Boba Network: Discretionary Exit Fee0.167 Ether0.0002135761
0xcef5fbbfeb3bd2c39607c00acd7025dc816b7ee8551731327c11a116c234b9c6Pay And Withdraw9889662023-03-26 12:24:384 days 2 hrs ago0xc43cb639ebc547d380658d21d32a99b69f1eec8e IN  Boba Network: Discretionary Exit Fee0 Ether0.0002433551
0x99063189098b152c9043397313a7f65118e267d627dac16c413c892f25939d1fPay And Withdraw9885652023-03-26 7:41:374 days 7 hrs ago0x210d05790b774ea8e6d51583d23ec5f8ad338669 IN  Boba Network: Discretionary Exit Fee0.04 Ether0.0002016161
0xc6a846034f55abb4ab231561308c7c6ddc5923cbde08b35e4e5d603072044140Pay And Withdraw9883112023-03-26 2:25:244 days 12 hrs ago0x2931a503cd6b942219ac99464181e9ab87d1f630 IN  Boba Network: Discretionary Exit Fee0.075 Ether0.0001918511
0x79015d952388599f8dd678c6bb4633c0b643fb73ef0cdd1b369c112bf7df211cPay And Withdraw9879932023-03-25 17:44:124 days 21 hrs ago0x08cdcb02afea7fb4bbd9a33bd85b4a151362cec1 IN  Boba Network: Discretionary Exit Fee0.098 Ether0.0002830511
0xebdf145944956419cd6db0120bebb8c5b36a1e6d9fce5e15925a3e3501359a44Pay And Withdraw9876402023-03-25 9:24:435 days 5 hrs ago0x0436d45905fb55572472b7dd9037154dbb79a3ff IN  Boba Network: Discretionary Exit Fee0 Ether0.000230931
0xe20a6f43dc2e65d64be8ea414f009ecb8e160fa27debbcbd889e31e893a9a580Pay And Withdraw9871512023-03-24 13:53:126 days 1 hr ago0x2b8cd75d3e679531918feebb9f095a17c982baca IN  Boba Network: Discretionary Exit Fee0 Ether0.000325991
0x3ace2e8a0e3432702a9fcd30b4f758545f75884ae4bfd2d546f94db05b6b8c36Pay And Withdraw9869012023-03-24 7:48:226 days 7 hrs ago0xb04f4e2187a0a4da75a80d6e4572a54d4fa5a02a IN  Boba Network: Discretionary Exit Fee0.109 Ether0.0002207911
0x5bcc2131363b4adfb709aed471b34787d89bd2b4cb443024fc6190f5870f231ePay And Withdraw9868312023-03-24 5:30:546 days 9 hrs ago0xe31a5a2bad015d5128c19f4e6b2a5d647a5070cb IN  Boba Network: Discretionary Exit Fee0 Ether0.000237131
0x600150451afbe5b21efdf575bf47f5889989661d3803af1653779c5d196524a1Pay And Withdraw9867912023-03-24 4:19:546 days 10 hrs ago0x8676f92151771425c5a506a60105ee1a8e877456 IN  Boba Network: Discretionary Exit Fee0.122 Ether0.0001970811
0xdbac18fc82b9645876145425a61338ae956df5834ab2fa5385cbb25b38e0304bPay And Withdraw9865672023-03-23 22:15:276 days 16 hrs ago0x554b1bd47b7d180844175ca4635880da8a3c70b9 IN  Boba Network: Discretionary Exit Fee0.92667 Ether0.0002457131
0x575db6f8163498421ecba6184ca4255528105c7bb225d39bfa27ba94ad7e1576Pay And Withdraw9864992023-03-23 20:48:296 days 18 hrs ago0x56025c57c2621b08f5cf7f0d3acab5c2a818e5fa IN  Boba Network: Discretionary Exit Fee0.948 Ether0.0002683771
0xa1ed02459091e30f9160d99f8405be11235ab9aabef17b6060b4902300ab7a70Pay And Withdraw9857642023-03-22 18:42:307 days 20 hrs ago0x20e1427ab5f919ca0e066fe91f3c39ce4499a9c9 IN  Boba Network: Discretionary Exit Fee3.103 Ether0.0003138281
[ Download CSV Export 
Latest 25 internal transaction
Parent Txn Hash Block From To Value
0x317468f579dd510a261b41a24f4e89350880edea65abdd24f254fd261397e7209935632023-03-30 10:54:014 hrs 18 mins ago Boba Network: Discretionary Exit FeeBoba Network: L2 Standard Bridge0 Ether
0x317468f579dd510a261b41a24f4e89350880edea65abdd24f254fd261397e7209935632023-03-30 10:54:014 hrs 18 mins ago Boba Network: Discretionary Exit FeeBoba Network: USDC Token0 Ether
0x317468f579dd510a261b41a24f4e89350880edea65abdd24f254fd261397e7209935632023-03-30 10:54:014 hrs 18 mins ago Boba Network: Discretionary Exit FeeBoba Network: BOBA Token0 Ether
0x317468f579dd510a261b41a24f4e89350880edea65abdd24f254fd261397e7209935632023-03-30 10:54:014 hrs 18 mins ago Boba Network: Discretionary Exit Fee Boba Network: Proxy Boba Billing Contract0 Ether
0x317468f579dd510a261b41a24f4e89350880edea65abdd24f254fd261397e7209935632023-03-30 10:54:014 hrs 18 mins ago Boba Network: Discretionary Exit Fee Boba Network: Proxy Boba Billing Contract0 Ether
0xc2890fbba36f5c3f3c162edd894a9aae5435d0bceb02fc3faaa907ad4246a9929924552023-03-29 7:49:521 day 7 hrs ago Boba Network: Discretionary Exit FeeBoba Network: L2 Standard Bridge0 Ether
0xc2890fbba36f5c3f3c162edd894a9aae5435d0bceb02fc3faaa907ad4246a9929924552023-03-29 7:49:521 day 7 hrs ago Boba Network: Discretionary Exit FeeBoba Network: BOBA Token0 Ether
0xc2890fbba36f5c3f3c162edd894a9aae5435d0bceb02fc3faaa907ad4246a9929924552023-03-29 7:49:521 day 7 hrs ago Boba Network: Discretionary Exit FeeBoba Network: BOBA Token0 Ether
0xc2890fbba36f5c3f3c162edd894a9aae5435d0bceb02fc3faaa907ad4246a9929924552023-03-29 7:49:521 day 7 hrs ago Boba Network: Discretionary Exit Fee Boba Network: Proxy Boba Billing Contract0 Ether
0xc2890fbba36f5c3f3c162edd894a9aae5435d0bceb02fc3faaa907ad4246a9929924552023-03-29 7:49:521 day 7 hrs ago Boba Network: Discretionary Exit Fee Boba Network: Proxy Boba Billing Contract0 Ether
0xb70a2abfbbe861c2cd3c4fa3f0261fe671d45800048f8f99f359dad2590bc0839918802023-03-28 17:46:281 day 21 hrs ago Boba Network: Discretionary Exit FeeBoba Network: L2 Standard Bridge0 Ether
0xb70a2abfbbe861c2cd3c4fa3f0261fe671d45800048f8f99f359dad2590bc0839918802023-03-28 17:46:281 day 21 hrs ago Boba Network: Discretionary Exit Fee 0xf56b164efd3cfc02ba739b719b6526a6fa1ca32a0 Ether
0xb70a2abfbbe861c2cd3c4fa3f0261fe671d45800048f8f99f359dad2590bc0839918802023-03-28 17:46:281 day 21 hrs ago Boba Network: Discretionary Exit FeeBoba Network: BOBA Token0 Ether
0xb70a2abfbbe861c2cd3c4fa3f0261fe671d45800048f8f99f359dad2590bc0839918802023-03-28 17:46:281 day 21 hrs ago Boba Network: Discretionary Exit Fee Boba Network: Proxy Boba Billing Contract0 Ether
0xb70a2abfbbe861c2cd3c4fa3f0261fe671d45800048f8f99f359dad2590bc0839918802023-03-28 17:46:281 day 21 hrs ago Boba Network: Discretionary Exit Fee Boba Network: Proxy Boba Billing Contract0 Ether
0x12199318857855139c101ea399cb9ea64eeca54963210d7639c2e7e5de79e51f9914752023-03-28 9:53:592 days 5 hrs ago Boba Network: Discretionary Exit FeeBoba Network: L2 Standard Bridge0 Ether
0x12199318857855139c101ea399cb9ea64eeca54963210d7639c2e7e5de79e51f9914752023-03-28 9:53:592 days 5 hrs ago Boba Network: Discretionary Exit FeeBoba Network: BOBA Token0 Ether
0x12199318857855139c101ea399cb9ea64eeca54963210d7639c2e7e5de79e51f9914752023-03-28 9:53:592 days 5 hrs ago Boba Network: Discretionary Exit Fee Boba Network: Proxy Boba Billing Contract0 Ether
0x12199318857855139c101ea399cb9ea64eeca54963210d7639c2e7e5de79e51f9914752023-03-28 9:53:592 days 5 hrs ago Boba Network: Discretionary Exit Fee Boba Network: Proxy Boba Billing Contract0 Ether
0x457f75d303eea230039676af167737015dc7337941869a6d145856415dc73e469913612023-03-28 7:50:032 days 7 hrs ago Boba Network: Discretionary Exit FeeBoba Network: L2 Standard Bridge0 Ether
0x457f75d303eea230039676af167737015dc7337941869a6d145856415dc73e469913612023-03-28 7:50:032 days 7 hrs ago Boba Network: Discretionary Exit FeeBoba Network: USDC Token0 Ether
0x457f75d303eea230039676af167737015dc7337941869a6d145856415dc73e469913612023-03-28 7:50:032 days 7 hrs ago Boba Network: Discretionary Exit FeeBoba Network: BOBA Token0 Ether
0x457f75d303eea230039676af167737015dc7337941869a6d145856415dc73e469913612023-03-28 7:50:032 days 7 hrs ago Boba Network: Discretionary Exit Fee Boba Network: Proxy Boba Billing Contract0 Ether
0x457f75d303eea230039676af167737015dc7337941869a6d145856415dc73e469913612023-03-28 7:50:032 days 7 hrs ago Boba Network: Discretionary Exit Fee Boba Network: Proxy Boba Billing Contract0 Ether
0xd1b9a44041f303058f6ea3898a916e364688ae9d536ea17de809d37a3276efa69903222023-03-27 18:17:552 days 20 hrs ago Boba Network: Discretionary Exit FeeBoba Network: L2 Standard Bridge0 Ether
[ Download CSV Export 
Latest 25 Withdrawals
L2 Txn Hash Value Token Status L1 Withdrawal Txn
0x317468f579dd510a261b41a24f4e89350880edea65abdd24f254fd261397e7202023-03-30 10:54:014 hrs 18 mins ago50,866.486371 USD Coin (USDC)Waitingn/a
0xc2890fbba36f5c3f3c162edd894a9aae5435d0bceb02fc3faaa907ad4246a9922023-03-29 7:49:521 day 7 hrs ago14,650.6759 Boba Token (BOBA)Waitingn/a
0xb70a2abfbbe861c2cd3c4fa3f0261fe671d45800048f8f99f359dad2590bc0832023-03-28 17:46:281 day 21 hrs ago19,653 Curio Govern... (CGT)Waitingn/a
0x12199318857855139c101ea399cb9ea64eeca54963210d7639c2e7e5de79e51f2023-03-28 9:53:592 days 5 hrs ago0.2274 Ether (ETH)Waitingn/a
0x457f75d303eea230039676af167737015dc7337941869a6d145856415dc73e462023-03-28 7:50:032 days 7 hrs ago31,310.923343 USD Coin (USDC)Waitingn/a
0xd1b9a44041f303058f6ea3898a916e364688ae9d536ea17de809d37a3276efa62023-03-27 18:17:552 days 20 hrs ago19,069 Across Proto... (ACX)Waitingn/a
0x442a3c753b107cd4b60f38c5be6474ccd6cb932d2be486af6d5aad1a61c4506c2023-03-27 17:53:182 days 21 hrs ago69,514 Boba Token (BOBA)Waitingn/a
0x32714b5894d5a48b98841483724d41ed6e7029435e2b80ab0deec700d821e4da2023-03-27 17:52:402 days 21 hrs ago23.7 Ether (ETH)Waitingn/a
0xae75905b8696e3acfb25e1e94d2fad72787c866acf9046c8905d1e58dc29beab2023-03-27 17:51:592 days 21 hrs ago11,958 Dai Stableco... (DAI)Waitingn/a
0x0f0a0d806156457d1b186a5d46e01cda7ec325ea4db465fca13aa98a1783935f2023-03-27 17:51:042 days 21 hrs ago0.25685354 Wrapped BTC (WBTC)Waitingn/a
0x2a577df1b2fb254464a9be76459d00c4c1eb0cf9d2c8ec9276c596c4d023a7042023-03-26 22:03:373 days 17 hrs ago965,506.597938426977720254 Curio Govern... (CGT)Waitingn/a
0x0a15afa327593cdbb61711c237ffe85dfec97011e4491316b8457ce7b34dbae82023-03-26 19:05:083 days 20 hrs ago20.32 Ether (ETH)Waitingn/a
0x8933c2ed630d4765bb6e96ec8afdf7021c517a5b5840c8e55d66c894acd96f732023-03-26 12:56:364 days 2 hrs ago0.167 Ether (ETH)Waitingn/a
0xcef5fbbfeb3bd2c39607c00acd7025dc816b7ee8551731327c11a116c234b9c62023-03-26 12:24:384 days 2 hrs ago1,771.631214107396424174 OMGToken (OMG)Waitingn/a
0x99063189098b152c9043397313a7f65118e267d627dac16c413c892f25939d1f2023-03-26 7:41:374 days 7 hrs ago0.04 Ether (ETH)Waitingn/a
0xc6a846034f55abb4ab231561308c7c6ddc5923cbde08b35e4e5d6030720441402023-03-26 2:25:244 days 12 hrs ago0.075 Ether (ETH)Waitingn/a
0x79015d952388599f8dd678c6bb4633c0b643fb73ef0cdd1b369c112bf7df211c2023-03-25 17:44:124 days 21 hrs ago0.098 Ether (ETH)Waitingn/a
0xebdf145944956419cd6db0120bebb8c5b36a1e6d9fce5e15925a3e3501359a442023-03-25 9:24:435 days 5 hrs ago56,178.071652961417256804 Curio Govern... (CGT)Waitingn/a
0xe20a6f43dc2e65d64be8ea414f009ecb8e160fa27debbcbd889e31e893a9a5802023-03-24 13:53:126 days 1 hr ago5,426 OMGToken (OMG)Waitingn/a
0x3ace2e8a0e3432702a9fcd30b4f758545f75884ae4bfd2d546f94db05b6b8c362023-03-24 7:48:226 days 7 hrs ago0.109 Ether (ETH)Waitingn/a
0x5bcc2131363b4adfb709aed471b34787d89bd2b4cb443024fc6190f5870f231e2023-03-24 5:30:546 days 9 hrs ago408.550806 USD Coin (USDC)Waitingn/a
0x600150451afbe5b21efdf575bf47f5889989661d3803af1653779c5d196524a12023-03-24 4:19:546 days 10 hrs ago0.122 Ether (ETH)Waitingn/a
0xdbac18fc82b9645876145425a61338ae956df5834ab2fa5385cbb25b38e0304b2023-03-23 22:15:276 days 16 hrs ago0.92667 Ether (ETH)Waitingn/a
0x575db6f8163498421ecba6184ca4255528105c7bb225d39bfa27ba94ad7e15762023-03-23 20:48:296 days 18 hrs ago0.948 Ether (ETH)Waitingn/a
0xa1ed02459091e30f9160d99f8405be11235ab9aabef17b6060b4902300ab7a702023-03-22 18:42:307 days 20 hrs ago3.103 Ether (ETH)Waitingn/a
[ Download CSV Export 
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
DiscretionaryExitFee

Compiler Version
v0.8.9+commit.e5eed63a

Optimization Enabled:
Yes with 10000 runs

Other Settings:
default evmVersion
File 1 of 11 : DiscretionaryExitFee.sol
// SPDX-License-Identifier: MIT
pragma solidity >0.7.5;

import "@eth-optimism/contracts/contracts/libraries/constants/Lib_PredeployAddresses.sol";

import "@eth-optimism/contracts/contracts/L2/messaging/IL2ERC20Bridge.sol";
import "@eth-optimism/contracts/contracts/L2/predeploys/OVM_GasPriceOracle.sol";
import "@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol";
import "@openzeppelin/contracts/utils/math/SafeMath.sol";
import "@openzeppelin/contracts/access/Ownable.sol";

import "./L2BillingContract.sol";

contract DiscretionaryExitFee is Ownable {
    using SafeERC20 for IERC20;
    using SafeMath for uint256;

    address public l2Bridge;
    address public billingContractAddress;

    constructor(address _l2Bridge) {
        l2Bridge = _l2Bridge;
    }

    modifier onlyWithBillingContract() {
        require(billingContractAddress != address(0), "Billing contract address is not set");
        _;
    }

    function configureBillingContractAddress(
        address _billingContractAddress
    )
        public
        onlyOwner()
    {
        require(_billingContractAddress != address(0), "Billing contract address cannot be zero");
        billingContractAddress = _billingContractAddress;
    }

    function payAndWithdraw(
        address _l2Token,
        uint256 _amount,
        uint32 _l1Gas,
        bytes calldata _data
    ) external payable onlyWithBillingContract {
        // Collect the exit fee
        L2BillingContract billingContract = L2BillingContract(billingContractAddress);
        IERC20(billingContract.feeTokenAddress()).safeTransferFrom(msg.sender, billingContractAddress, billingContract.exitFee());

        require(!(msg.value != 0 && _l2Token != Lib_PredeployAddresses.OVM_ETH), "Amount Incorrect");

        if (msg.value != 0) {
            // override the _amount and token address
            _amount = msg.value;
            _l2Token = Lib_PredeployAddresses.OVM_ETH;
        }

        // transfer funds if users deposit ERC20
        if (_l2Token != Lib_PredeployAddresses.OVM_ETH) {
            IERC20(_l2Token).safeTransferFrom(msg.sender, address(this), _amount);
        }

        // call withdrawTo on the l2Bridge
        IL2ERC20Bridge(l2Bridge).withdrawTo(_l2Token, msg.sender, _amount, _l1Gas, _data);
    }
}

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

/**
 * @title Lib_PredeployAddresses
 */
library Lib_PredeployAddresses {
    // solhint-disable max-line-length
    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(0x4200000000000000000000000000000000000006);
    // solhint-disable-next-line max-line-length
    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;
    address internal constant OVM_GAS_PRICE_ORACLE = 0x420000000000000000000000000000000000000F;
    address internal constant PROXY__BOBA_TURING_PREPAY =
        0x4200000000000000000000000000000000000020;
    address internal constant BOBA_TURING_PREPAY = 0x4200000000000000000000000000000000000021;
    address internal constant BOBA_TURING_HELPER = 0x4200000000000000000000000000000000000022;
    address internal constant L2_BOBA = 0x4200000000000000000000000000000000000023;
    address internal constant PROXY__BOBA_GAS_PRICE_ORACLE =
        0x4200000000000000000000000000000000000024;
    address internal constant BOBA_GAS_PRICE_ORACLE = 0x4200000000000000000000000000000000000025;
}

File 3 of 11 : 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 4 of 11 : OVM_GasPriceOracle.sol
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.9;

/* External Imports */
import { Ownable } from "@openzeppelin/contracts/access/Ownable.sol";

/**
 * @title OVM_GasPriceOracle
 * @dev This contract exposes the current l2 gas price, a measure of how congested the network
 * currently is. This measure is used by the Sequencer to determine what fee to charge for
 * transactions. When the system is more congested, the l2 gas price will increase and fees
 * will also increase as a result.
 *
 * All public variables are set while generating the initial L2 state. The
 * constructor doesn't run in practice as the L2 state generation script uses
 * the deployed bytecode instead of running the initcode.
 */
contract OVM_GasPriceOracle is Ownable {
    /*************
     * Variables *
     *************/

    // Current L2 gas price
    uint256 public gasPrice;
    // Current L1 base fee
    uint256 public l1BaseFee;
    // Amortized cost of batch submission per transaction
    uint256 public overhead;
    // Value to scale the fee up by
    uint256 public scalar;
    // Number of decimals of the scalar
    uint256 public decimals;

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

    /**
     * @param _owner Address that will initially own this contract.
     */
    constructor(address _owner) Ownable() {
        transferOwnership(_owner);
    }

    /**********
     * Events *
     **********/

    event GasPriceUpdated(uint256);
    event L1BaseFeeUpdated(uint256);
    event OverheadUpdated(uint256);
    event ScalarUpdated(uint256);
    event DecimalsUpdated(uint256);

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

    /**
     * Allows the owner to modify the l2 gas price.
     * @param _gasPrice New l2 gas price.
     */
    function setGasPrice(uint256 _gasPrice) public onlyOwner {
        gasPrice = _gasPrice;
        emit GasPriceUpdated(_gasPrice);
    }

    /**
     * Allows the owner to modify the l1 base fee.
     * @param _baseFee New l1 base fee
     */
    function setL1BaseFee(uint256 _baseFee) public onlyOwner {
        l1BaseFee = _baseFee;
        emit L1BaseFeeUpdated(_baseFee);
    }

    /**
     * Allows the owner to modify the overhead.
     * @param _overhead New overhead
     */
    function setOverhead(uint256 _overhead) public onlyOwner {
        overhead = _overhead;
        emit OverheadUpdated(_overhead);
    }

    /**
     * Allows the owner to modify the scalar.
     * @param _scalar New scalar
     */
    function setScalar(uint256 _scalar) public onlyOwner {
        scalar = _scalar;
        emit ScalarUpdated(_scalar);
    }

    /**
     * Allows the owner to modify the decimals.
     * @param _decimals New decimals
     */
    function setDecimals(uint256 _decimals) public onlyOwner {
        decimals = _decimals;
        emit DecimalsUpdated(_decimals);
    }

    /**
     * Computes the L1 portion of the fee
     * based on the size of the RLP encoded tx
     * and the current l1BaseFee
     * @param _data Unsigned RLP encoded tx, 6 elements
     * @return L1 fee that should be paid for the tx
     */
    function getL1Fee(bytes memory _data) public view returns (uint256) {
        uint256 l1GasUsed = getL1GasUsed(_data);
        uint256 l1Fee = l1GasUsed * l1BaseFee;
        uint256 divisor = 10**decimals;
        uint256 unscaled = l1Fee * scalar;
        uint256 scaled = unscaled / divisor;
        return scaled;
    }

    /**
     * Computes the extra L2 gas to cover the
     * L1 security fee
     * @param _data Unsigned RLP encoded tx, 6 elements
     * @return L2 extra gas that should be included in the L2 gas
     */
    function getExtraL2Gas(bytes memory _data) public view returns (uint256) {
        return getL1Fee(_data) / gasPrice;
    }

    /**
     * Computes the amount of L1 gas used for a transaction
     * The overhead represents the per batch gas overhead of
     * posting both transaction and state roots to L1 given larger
     * batch sizes.
     * 4 gas for 0 byte
     * https://github.com/ethereum/go-ethereum/blob/
     *    9ada4a2e2c415e6b0b51c50e901336872e028872/params/protocol_params.go#L33
     * 16 gas for non zero byte
     * https://github.com/ethereum/go-ethereum/blob/
     *    9ada4a2e2c415e6b0b51c50e901336872e028872/params/protocol_params.go#L87
     * This will need to be updated if calldata gas prices change
     * Account for the transaction being unsigned
     * Padding is added to account for lack of signature on transaction
     * 1 byte for RLP V prefix
     * 1 byte for V
     * 1 byte for RLP R prefix
     * 32 bytes for R
     * 1 byte for RLP S prefix
     * 32 bytes for S
     * Total: 68 bytes of padding
     * @param _data Unsigned RLP encoded tx, 6 elements
     * @return Amount of L1 gas used for a transaction
     */
    function getL1GasUsed(bytes memory _data) public view returns (uint256) {
        uint256 total = 0;
        for (uint256 i = 0; i < _data.length; i++) {
            if (_data[i] == 0) {
                total += 4;
            } else {
                total += 16;
            }
        }
        uint256 unsigned = total + overhead;
        return unsigned + (68 * 16);
    }
}

File 5 of 11 : SafeERC20.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

import "../IERC20.sol";
import "../../../utils/Address.sol";

/**
 * @title SafeERC20
 * @dev Wrappers around ERC20 operations that throw on failure (when the token
 * contract returns false). Tokens that return no value (and instead revert or
 * throw on failure) are also supported, non-reverting calls are assumed to be
 * successful.
 * To use this library you can add a `using SafeERC20 for IERC20;` statement to your contract,
 * which allows you to call the safe operations as `token.safeTransfer(...)`, etc.
 */
library SafeERC20 {
    using Address for address;

    function safeTransfer(
        IERC20 token,
        address to,
        uint256 value
    ) internal {
        _callOptionalReturn(token, abi.encodeWithSelector(token.transfer.selector, to, value));
    }

    function safeTransferFrom(
        IERC20 token,
        address from,
        address to,
        uint256 value
    ) internal {
        _callOptionalReturn(token, abi.encodeWithSelector(token.transferFrom.selector, from, to, value));
    }

    /**
     * @dev Deprecated. This function has issues similar to the ones found in
     * {IERC20-approve}, and its usage is discouraged.
     *
     * Whenever possible, use {safeIncreaseAllowance} and
     * {safeDecreaseAllowance} instead.
     */
    function safeApprove(
        IERC20 token,
        address spender,
        uint256 value
    ) internal {
        // safeApprove should only be called when setting an initial allowance,
        // or when resetting it to zero. To increase and decrease it, use
        // 'safeIncreaseAllowance' and 'safeDecreaseAllowance'
        require(
            (value == 0) || (token.allowance(address(this), spender) == 0),
            "SafeERC20: approve from non-zero to non-zero allowance"
        );
        _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, value));
    }

    function safeIncreaseAllowance(
        IERC20 token,
        address spender,
        uint256 value
    ) internal {
        uint256 newAllowance = token.allowance(address(this), spender) + value;
        _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance));
    }

    function safeDecreaseAllowance(
        IERC20 token,
        address spender,
        uint256 value
    ) internal {
        unchecked {
            uint256 oldAllowance = token.allowance(address(this), spender);
            require(oldAllowance >= value, "SafeERC20: decreased allowance below zero");
            uint256 newAllowance = oldAllowance - value;
            _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance));
        }
    }

    /**
     * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement
     * on the return value: the return value is optional (but if data is returned, it must not be false).
     * @param token The token targeted by the call.
     * @param data The call data (encoded using abi.encode or one of its variants).
     */
    function _callOptionalReturn(IERC20 token, bytes memory data) private {
        // We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since
        // we're implementing it ourselves. We use {Address.functionCall} to perform this call, which verifies that
        // the target address contains contract code and also asserts for success in the low-level call.

        bytes memory returndata = address(token).functionCall(data, "SafeERC20: low-level call failed");
        if (returndata.length > 0) {
            // Return data is optional
            require(abi.decode(returndata, (bool)), "SafeERC20: ERC20 operation did not succeed");
        }
    }
}

File 6 of 11 : SafeMath.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

// CAUTION
// This version of SafeMath should only be used with Solidity 0.8 or later,
// because it relies on the compiler's built in overflow checks.

/**
 * @dev Wrappers over Solidity's arithmetic operations.
 *
 * NOTE: `SafeMath` is no longer needed starting with Solidity 0.8. The compiler
 * now has built in overflow checking.
 */
library SafeMath {
    /**
     * @dev Returns the addition of two unsigned integers, with an overflow flag.
     *
     * _Available since v3.4._
     */
    function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            uint256 c = a + b;
            if (c < a) return (false, 0);
            return (true, c);
        }
    }

    /**
     * @dev Returns the substraction of two unsigned integers, with an overflow flag.
     *
     * _Available since v3.4._
     */
    function trySub(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            if (b > a) return (false, 0);
            return (true, a - b);
        }
    }

    /**
     * @dev Returns the multiplication of two unsigned integers, with an overflow flag.
     *
     * _Available since v3.4._
     */
    function tryMul(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            // Gas optimization: this is cheaper than requiring 'a' not being zero, but the
            // benefit is lost if 'b' is also tested.
            // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522
            if (a == 0) return (true, 0);
            uint256 c = a * b;
            if (c / a != b) return (false, 0);
            return (true, c);
        }
    }

    /**
     * @dev Returns the division of two unsigned integers, with a division by zero flag.
     *
     * _Available since v3.4._
     */
    function tryDiv(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            if (b == 0) return (false, 0);
            return (true, a / b);
        }
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers, with a division by zero flag.
     *
     * _Available since v3.4._
     */
    function tryMod(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            if (b == 0) return (false, 0);
            return (true, a % b);
        }
    }

    /**
     * @dev Returns the addition of two unsigned integers, reverting on
     * overflow.
     *
     * Counterpart to Solidity's `+` operator.
     *
     * Requirements:
     *
     * - Addition cannot overflow.
     */
    function add(uint256 a, uint256 b) internal pure returns (uint256) {
        return a + b;
    }

    /**
     * @dev Returns the subtraction of two unsigned integers, reverting on
     * overflow (when the result is negative).
     *
     * Counterpart to Solidity's `-` operator.
     *
     * Requirements:
     *
     * - Subtraction cannot overflow.
     */
    function sub(uint256 a, uint256 b) internal pure returns (uint256) {
        return a - b;
    }

    /**
     * @dev Returns the multiplication of two unsigned integers, reverting on
     * overflow.
     *
     * Counterpart to Solidity's `*` operator.
     *
     * Requirements:
     *
     * - Multiplication cannot overflow.
     */
    function mul(uint256 a, uint256 b) internal pure returns (uint256) {
        return a * b;
    }

    /**
     * @dev Returns the integer division of two unsigned integers, reverting on
     * division by zero. The result is rounded towards zero.
     *
     * Counterpart to Solidity's `/` operator.
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function div(uint256 a, uint256 b) internal pure returns (uint256) {
        return a / b;
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
     * reverting when dividing by zero.
     *
     * Counterpart to Solidity's `%` operator. This function uses a `revert`
     * opcode (which leaves remaining gas untouched) while Solidity uses an
     * invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function mod(uint256 a, uint256 b) internal pure returns (uint256) {
        return a % b;
    }

    /**
     * @dev Returns the subtraction of two unsigned integers, reverting with custom message on
     * overflow (when the result is negative).
     *
     * CAUTION: This function is deprecated because it requires allocating memory for the error
     * message unnecessarily. For custom revert reasons use {trySub}.
     *
     * Counterpart to Solidity's `-` operator.
     *
     * Requirements:
     *
     * - Subtraction cannot overflow.
     */
    function sub(
        uint256 a,
        uint256 b,
        string memory errorMessage
    ) internal pure returns (uint256) {
        unchecked {
            require(b <= a, errorMessage);
            return a - b;
        }
    }

    /**
     * @dev Returns the integer division of two unsigned integers, reverting with custom message on
     * division by zero. The result is rounded towards zero.
     *
     * Counterpart to Solidity's `/` operator. Note: this function uses a
     * `revert` opcode (which leaves remaining gas untouched) while Solidity
     * uses an invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function div(
        uint256 a,
        uint256 b,
        string memory errorMessage
    ) internal pure returns (uint256) {
        unchecked {
            require(b > 0, errorMessage);
            return a / b;
        }
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
     * reverting with custom message when dividing by zero.
     *
     * CAUTION: This function is deprecated because it requires allocating memory for the error
     * message unnecessarily. For custom revert reasons use {tryMod}.
     *
     * Counterpart to Solidity's `%` operator. This function uses a `revert`
     * opcode (which leaves remaining gas untouched) while Solidity uses an
     * invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function mod(
        uint256 a,
        uint256 b,
        string memory errorMessage
    ) internal pure returns (uint256) {
        unchecked {
            require(b > 0, errorMessage);
            return a % b;
        }
    }
}

File 7 of 11 : Ownable.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

import "../utils/Context.sol";

/**
 * @dev Contract module which provides a basic access control mechanism, where
 * there is an account (an owner) that can be granted exclusive access to
 * specific functions.
 *
 * By default, the owner account will be the one that deploys the contract. This
 * can later be changed with {transferOwnership}.
 *
 * This module is used through inheritance. It will make available the modifier
 * `onlyOwner`, which can be applied to your functions to restrict their use to
 * the owner.
 */
abstract contract Ownable is Context {
    address private _owner;

    event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);

    /**
     * @dev Initializes the contract setting the deployer as the initial owner.
     */
    constructor() {
        _setOwner(_msgSender());
    }

    /**
     * @dev Returns the address of the current owner.
     */
    function owner() public view virtual returns (address) {
        return _owner;
    }

    /**
     * @dev Throws if called by any account other than the owner.
     */
    modifier onlyOwner() {
        require(owner() == _msgSender(), "Ownable: caller is not the owner");
        _;
    }

    /**
     * @dev Leaves the contract without owner. It will not be possible to call
     * `onlyOwner` functions anymore. Can only be called by the current owner.
     *
     * NOTE: Renouncing ownership will leave the contract without an owner,
     * thereby removing any functionality that is only available to the owner.
     */
    function renounceOwnership() public virtual onlyOwner {
        _setOwner(address(0));
    }

    /**
     * @dev Transfers ownership of the contract to a new account (`newOwner`).
     * Can only be called by the current owner.
     */
    function transferOwnership(address newOwner) public virtual onlyOwner {
        require(newOwner != address(0), "Ownable: new owner is the zero address");
        _setOwner(newOwner);
    }

    function _setOwner(address newOwner) private {
        address oldOwner = _owner;
        _owner = newOwner;
        emit OwnershipTransferred(oldOwner, newOwner);
    }
}

File 8 of 11 : L2BillingContract.sol
// SPDX-License-Identifier: MIT
pragma solidity >0.7.5;

import '@openzeppelin/contracts/token/ERC20/IERC20.sol';
import '@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol';

contract L2BillingContract {
    using SafeERC20 for IERC20;

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

    address public owner;
    address public feeTokenAddress;
    address public l2FeeWallet;
    uint256 public exitFee;

    /*************
     *   Events  *
     *************/

    event TransferOwnership(address, address);
    event UpdateExitFee(uint256);
    event CollectFee(address, uint256);
    event Withdraw(address, uint256);

    /*************
     * Modifiers *
     *************/

    modifier onlyNotInitialized() {
        require(feeTokenAddress == address(0), "Contract has been initialized");
        _;
    }

    modifier onlyInitialized() {
        require(feeTokenAddress != address(0), "Contract has not been initialized");
        _;
    }

    modifier onlyOwner() {
        require(owner == msg.sender, "Caller is not the owner");
        _;
    }

    /*************
     * Functions *
     *************/

    function initialize(address _feeTokenAddress, address _l2FeeWallet, uint256 _exitFee) public onlyNotInitialized {
        require(_feeTokenAddress != address(0), "Fee token address cannot be zero");
        require(_l2FeeWallet != address(0), "L2 fee wallet cannot be zero");
        require(_exitFee > 0, "exit fee cannot be zero");
        feeTokenAddress = _feeTokenAddress;
        l2FeeWallet = _l2FeeWallet;
        exitFee = _exitFee;
        owner = msg.sender;
    }

    function transferOwnership(address _newOwner) public onlyOwner {
        require(_newOwner != address(0), "Ownable: new owner is the zero address");
        address oldOwner = owner;
        owner = _newOwner;
        emit TransferOwnership(oldOwner, _newOwner);
    }

      function updateExitFee(uint256 _exitFee)
        public
        onlyOwner()
    {
        require(_exitFee > 0, "exit fee cannot be zero");
        exitFee = _exitFee;

        emit UpdateExitFee(_exitFee);
    }

    function collectFee() external onlyInitialized {
        IERC20(feeTokenAddress).safeTransferFrom(msg.sender, address(this), exitFee);

        emit CollectFee(msg.sender, exitFee);
    }

    function withdraw() external onlyInitialized {
        uint256 balance = IERC20(feeTokenAddress).balanceOf(address(this));
        require(balance >= 150e18, "Balance is too low");
        IERC20(feeTokenAddress).safeTransfer(l2FeeWallet, balance);

        emit Withdraw(l2FeeWallet, balance);
    }
}

File 9 of 11 : Context.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

/**
 * @dev Provides information about the current execution context, including the
 * sender of the transaction and its data. While these are generally available
 * via msg.sender and msg.data, they should not be accessed in such a direct
 * manner, since when dealing with meta-transactions the account sending and
 * paying for execution may not be the actual sender (as far as an application
 * is concerned).
 *
 * This contract is only required for intermediate, library-like contracts.
 */
abstract contract Context {
    function _msgSender() internal view virtual returns (address) {
        return msg.sender;
    }

    function _msgData() internal view virtual returns (bytes calldata) {
        return msg.data;
    }
}

File 10 of 11 : 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);
}

File 11 of 11 : Address.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

/**
 * @dev Collection of functions related to the address type
 */
library Address {
    /**
     * @dev Returns true if `account` is a contract.
     *
     * [IMPORTANT]
     * ====
     * It is unsafe to assume that an address for which this function returns
     * false is an externally-owned account (EOA) and not a contract.
     *
     * Among others, `isContract` will return false for the following
     * types of addresses:
     *
     *  - an externally-owned account
     *  - a contract in construction
     *  - an address where a contract will be created
     *  - an address where a contract lived, but was destroyed
     * ====
     */
    function isContract(address account) internal view returns (bool) {
        // This method relies on extcodesize, which returns 0 for contracts in
        // construction, since the code is only stored at the end of the
        // constructor execution.

        uint256 size;
        assembly {
            size := extcodesize(account)
        }
        return size > 0;
    }

    /**
     * @dev Replacement for Solidity's `transfer`: sends `amount` wei to
     * `recipient`, forwarding all available gas and reverting on errors.
     *
     * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost
     * of certain opcodes, possibly making contracts go over the 2300 gas limit
     * imposed by `transfer`, making them unable to receive funds via
     * `transfer`. {sendValue} removes this limitation.
     *
     * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more].
     *
     * IMPORTANT: because control is transferred to `recipient`, care must be
     * taken to not create reentrancy vulnerabilities. Consider using
     * {ReentrancyGuard} or the
     * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].
     */
    function sendValue(address payable recipient, uint256 amount) internal {
        require(address(this).balance >= amount, "Address: insufficient balance");

        (bool success, ) = recipient.call{value: amount}("");
        require(success, "Address: unable to send value, recipient may have reverted");
    }

    /**
     * @dev Performs a Solidity function call using a low level `call`. A
     * plain `call` is an unsafe replacement for a function call: use this
     * function instead.
     *
     * If `target` reverts with a revert reason, it is bubbled up by this
     * function (like regular Solidity function calls).
     *
     * Returns the raw returned data. To convert to the expected return value,
     * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`].
     *
     * Requirements:
     *
     * - `target` must be a contract.
     * - calling `target` with `data` must not revert.
     *
     * _Available since v3.1._
     */
    function functionCall(address target, bytes memory data) internal returns (bytes memory) {
        return functionCall(target, data, "Address: low-level call failed");
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with
     * `errorMessage` as a fallback revert reason when `target` reverts.
     *
     * _Available since v3.1._
     */
    function functionCall(
        address target,
        bytes memory data,
        string memory errorMessage
    ) internal returns (bytes memory) {
        return functionCallWithValue(target, data, 0, errorMessage);
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
     * but also transferring `value` wei to `target`.
     *
     * Requirements:
     *
     * - the calling contract must have an ETH balance of at least `value`.
     * - the called Solidity function must be `payable`.
     *
     * _Available since v3.1._
     */
    function functionCallWithValue(
        address target,
        bytes memory data,
        uint256 value
    ) internal returns (bytes memory) {
        return functionCallWithValue(target, data, value, "Address: low-level call with value failed");
    }

    /**
     * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but
     * with `errorMessage` as a fallback revert reason when `target` reverts.
     *
     * _Available since v3.1._
     */
    function functionCallWithValue(
        address target,
        bytes memory data,
        uint256 value,
        string memory errorMessage
    ) internal returns (bytes memory) {
        require(address(this).balance >= value, "Address: insufficient balance for call");
        require(isContract(target), "Address: call to non-contract");

        (bool success, bytes memory returndata) = target.call{value: value}(data);
        return verifyCallResult(success, returndata, errorMessage);
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
     * but performing a static call.
     *
     * _Available since v3.3._
     */
    function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {
        return functionStaticCall(target, data, "Address: low-level static call failed");
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
     * but performing a static call.
     *
     * _Available since v3.3._
     */
    function functionStaticCall(
        address target,
        bytes memory data,
        string memory errorMessage
    ) internal view returns (bytes memory) {
        require(isContract(target), "Address: static call to non-contract");

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

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
     * but performing a delegate call.
     *
     * _Available since v3.4._
     */
    function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) {
        return functionDelegateCall(target, data, "Address: low-level delegate call failed");
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
     * but performing a delegate call.
     *
     * _Available since v3.4._
     */
    function functionDelegateCall(
        address target,
        bytes memory data,
        string memory errorMessage
    ) internal returns (bytes memory) {
        require(isContract(target), "Address: delegate call to non-contract");

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

    /**
     * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the
     * revert reason using the provided one.
     *
     * _Available since v4.3._
     */
    function verifyCallResult(
        bool success,
        bytes memory returndata,
        string memory errorMessage
    ) internal pure returns (bytes memory) {
        if (success) {
            return returndata;
        } else {
            // Look for revert reason and bubble it up if present
            if (returndata.length > 0) {
                // The easiest way to bubble the revert reason is using memory via assembly

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

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

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"address","name":"_l2Bridge","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"inputs":[],"name":"billingContractAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_billingContractAddress","type":"address"}],"name":"configureBillingContractAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"l2Bridge","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_l2Token","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"},{"internalType":"uint32","name":"_l1Gas","type":"uint32"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"payAndWithdraw","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"}]

608060405234801561001057600080fd5b50604051610fc0380380610fc083398101604081905261002f916100ad565b6100383361005d565b600180546001600160a01b0319166001600160a01b03929092169190911790556100dd565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6000602082840312156100bf57600080fd5b81516001600160a01b03811681146100d657600080fd5b9392505050565b610ed4806100ec6000396000f3fe6080604052600436106100705760003560e01c80638da5cb5b1161004e5780638da5cb5b14610102578063ae1f6aaf1461012d578063f2fde38b1461015a578063f60ed84c1461017a57600080fd5b80633d93941b146100755780636af9f1c214610097578063715018a6146100ed575b600080fd5b34801561008157600080fd5b50610095610090366004610c85565b61018d565b005b3480156100a357600080fd5b506002546100c49073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200160405180910390f35b3480156100f957600080fd5b506100956102fd565b34801561010e57600080fd5b5060005473ffffffffffffffffffffffffffffffffffffffff166100c4565b34801561013957600080fd5b506001546100c49073ffffffffffffffffffffffffffffffffffffffff1681565b34801561016657600080fd5b50610095610175366004610c85565b61038a565b610095610188366004610ca2565b6104ba565b60005473ffffffffffffffffffffffffffffffffffffffff163314610213576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064015b60405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff81166102b6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602760248201527f42696c6c696e6720636f6e747261637420616464726573732063616e6e6f742060448201527f6265207a65726f00000000000000000000000000000000000000000000000000606482015260840161020a565b600280547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055565b60005473ffffffffffffffffffffffffffffffffffffffff16331461037e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161020a565b6103886000610856565b565b60005473ffffffffffffffffffffffffffffffffffffffff16331461040b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161020a565b73ffffffffffffffffffffffffffffffffffffffff81166104ae576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f6464726573730000000000000000000000000000000000000000000000000000606482015260840161020a565b6104b781610856565b50565b60025473ffffffffffffffffffffffffffffffffffffffff1661055f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602360248201527f42696c6c696e6720636f6e74726163742061646472657373206973206e6f742060448201527f7365740000000000000000000000000000000000000000000000000000000000606482015260840161020a565b600254604080517f6284ae41000000000000000000000000000000000000000000000000000000008152905173ffffffffffffffffffffffffffffffffffffffff909216916106a891339184918291636284ae4191600480820192602092909190829003018186803b1580156105d457600080fd5b505afa1580156105e8573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061060c9190610d4a565b8473ffffffffffffffffffffffffffffffffffffffff1663b8df0dea6040518163ffffffff1660e01b815260040160206040518083038186803b15801561065257600080fd5b505afa158015610666573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061068a9190610d63565b73ffffffffffffffffffffffffffffffffffffffff169291906108cb565b34158015906106e1575073ffffffffffffffffffffffffffffffffffffffff861673420000000000000000000000000000000000000614155b15610748576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601060248201527f416d6f756e7420496e636f727265637400000000000000000000000000000000604482015260640161020a565b34156107695734945073420000000000000000000000000000000000000695505b73ffffffffffffffffffffffffffffffffffffffff8616734200000000000000000000000000000000000006146107bc576107bc73ffffffffffffffffffffffffffffffffffffffff87163330886108cb565b6001546040517fa3a7954800000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff9091169063a3a795489061081c90899033908a908a908a908a90600401610d80565b600060405180830381600087803b15801561083657600080fd5b505af115801561084a573d6000803e3d6000fd5b50505050505050505050565b6000805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6040805173ffffffffffffffffffffffffffffffffffffffff85811660248301528416604482015260648082018490528251808303909101815260849091019091526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f23b872dd00000000000000000000000000000000000000000000000000000000179052610960908590610966565b50505050565b60006109c8826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff16610a779092919063ffffffff16565b805190915015610a7257808060200190518101906109e69190610e0c565b610a72576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f74207375636365656400000000000000000000000000000000000000000000606482015260840161020a565b505050565b6060610a868484600085610a90565b90505b9392505050565b606082471015610b22576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f60448201527f722063616c6c0000000000000000000000000000000000000000000000000000606482015260840161020a565b843b610b8a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015260640161020a565b6000808673ffffffffffffffffffffffffffffffffffffffff168587604051610bb39190610e5a565b60006040518083038185875af1925050503d8060008114610bf0576040519150601f19603f3d011682016040523d82523d6000602084013e610bf5565b606091505b5091509150610c05828286610c10565b979650505050505050565b60608315610c1f575081610a89565b825115610c2f5782518084602001fd5b816040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161020a9190610e76565b73ffffffffffffffffffffffffffffffffffffffff811681146104b757600080fd5b600060208284031215610c9757600080fd5b8135610a8981610c63565b600080600080600060808688031215610cba57600080fd5b8535610cc581610c63565b945060208601359350604086013563ffffffff81168114610ce557600080fd5b9250606086013567ffffffffffffffff80821115610d0257600080fd5b818801915088601f830112610d1657600080fd5b813581811115610d2557600080fd5b896020828501011115610d3757600080fd5b9699959850939650602001949392505050565b600060208284031215610d5c57600080fd5b5051919050565b600060208284031215610d7557600080fd5b8151610a8981610c63565b600073ffffffffffffffffffffffffffffffffffffffff808916835280881660208401525085604083015263ffffffff8516606083015260a060808301528260a0830152828460c0840137600060c0848401015260c07fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8501168301019050979650505050505050565b600060208284031215610e1e57600080fd5b81518015158114610a8957600080fd5b60005b83811015610e49578181015183820152602001610e31565b838111156109605750506000910152565b60008251610e6c818460208701610e2e565b9190910192915050565b6020815260008251806020840152610e95816040850160208701610e2e565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016919091016040019291505056fea164736f6c6343000809000a0000000000000000000000004200000000000000000000000000000000000010

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

0000000000000000000000004200000000000000000000000000000000000010

-----Decoded View---------------
Arg [0] : _l2Bridge (address): 0x4200000000000000000000000000000000000010

-----Encoded View---------------
1 Constructor Arguments found :
Arg [0] : 0000000000000000000000004200000000000000000000000000000000000010


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