ETH Price: $2,863.54 (-2.71%)

Contract

0xA3372CD2178c52fdCB1f6e4c4E93014B4dB3B20d
 

Overview

ETH Balance

0 ETH

ETH Value

$0.00

More Info

Private Name Tags

Multichain Info

No addresses found
Transaction Hash
Block
From
To
Transfer Ownersh...7753042024-03-13 20:07:03683 days ago1710360423IN
0xA3372CD2...B4dB3B20d
0 ETH0.000108980.003
Transfer Ownersh...7753042024-03-13 20:07:03683 days ago1710360423IN
0xA3372CD2...B4dB3B20d
0 ETH0.000108430.004
Transfer Ownersh...7680602024-03-13 16:05:35683 days ago1710345935IN
0xA3372CD2...B4dB3B20d
0 ETH0.01153222400

Latest 3 internal transactions

Advanced mode:
Parent Transaction Hash Block From To
17171932024-04-04 15:23:21661 days ago1712244201
0xA3372CD2...B4dB3B20d
0.00050208 ETH
7801092024-03-13 22:47:13683 days ago1710370033
0xA3372CD2...B4dB3B20d
0.00025097 ETH
7639242024-03-13 13:47:43683 days ago1710337663
0xA3372CD2...B4dB3B20d
0.00025111 ETH

Cross-Chain Transactions
Loading...
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
BlastLzOFTV2FeeHandler

Compiler Version
v0.8.20+commit.a1b79de6

Optimization Enabled:
Yes with 400 runs

Other Settings:
paris EvmVersion
File 1 of 10 : BlastLzOFTV2FeeHandler.sol
// SPDX-License-Identifier: UNLICENSED
pragma solidity >=0.8.0;

import {LzOFTV2FeeHandler} from "periphery/LzOFTV2FeeHandler.sol";
import {BlastYields} from "/blast/libraries/BlastYields.sol";

/// @dev This contract holds ETH from fees and accumulates
/// ETH yields to claim.
contract BlastLzOFTV2FeeHandler is LzOFTV2FeeHandler {
    error ErrZeroAddress();

    constructor(
        address _owner,
        uint256 _fixedNativeFee,
        address _oft,
        address _aggregator,
        address _feeTo,
        uint8 _quoteType,
        address governor_
    ) LzOFTV2FeeHandler(_owner, _fixedNativeFee, _oft, _aggregator, _feeTo, _quoteType) {
        if (governor_ == address(0)) {
            revert ErrZeroAddress();
        }

        BlastYields.configureDefaultClaimables(governor_);
    }
}

// SPDX-License-Identifier: MIT
pragma solidity >=0.8.0;

import {OperatableV2} from "mixins/OperatableV2.sol";
import {ILzFeeHandler, ILzOFTV2} from "interfaces/ILayerZero.sol";
import {IAggregator} from "interfaces/IAggregator.sol";

contract LzOFTV2FeeHandler is OperatableV2, ILzFeeHandler {
    event LogFeeWithdrawn(address to, uint256 amount);
    event LogFixedNativeFeeChanged(uint256 previous, uint256 current);
    event LogOracleImplementationChange(IAggregator indexed previous, IAggregator indexed current);
    event LogQuoteTypeChanged(QuoteType previous, QuoteType current);
    event LogFeeToChanged(address indexed previous, address indexed current);
    event LogUsdFeeChanged(uint256 previous, uint256 current);
    event LogFeeCollected(uint256 amount);

    error ErrInvalidQuoteType(QuoteType);
    error ErrWithdrawFailed();
    error ErrValueTooLowToCoverFees(uint256);
    error ErrUnauthorizedSender();

    modifier onlyFromOFT() {
        if (msg.sender != address(oft)) {
            revert ErrUnauthorizedSender();
        }
        _;
    }

    uint256 public constant DEFAULT_USD_FEE = 1e18;

    ILzOFTV2 public immutable oft;

    address public feeTo;
    IAggregator public aggregator;
    uint256 public fixedNativeFee;
    uint256 public usdFee;
    QuoteType public quoteType = QuoteType.Oracle;

    constructor(
        address _owner,
        uint256 _fixedNativeFee,
        address _oft,
        address _aggregator,
        address _feeTo,
        uint8 _quoteType
    ) OperatableV2(_owner) {
        fixedNativeFee = _fixedNativeFee;
        oft = ILzOFTV2(_oft);
        aggregator = IAggregator(_aggregator);
        feeTo = _feeTo;
        quoteType = QuoteType(_quoteType);
        usdFee = DEFAULT_USD_FEE;
    }

    receive() external payable {
        emit LogFeeCollected(msg.value);
    }

    /************************************************************************
     * Public
     ************************************************************************/
    function withdrawFees() external {
        uint256 balance = address(this).balance;
        (bool success, ) = feeTo.call{value: balance}("");
        if (!success) revert ErrWithdrawFailed();
        emit LogFeeWithdrawn(feeTo, balance);
    }

    /************************************************************************
     * Operations
     ************************************************************************/
    function setFixedNativeFee(uint256 _fixedNativeFee) external onlyOperators {
        emit LogFixedNativeFeeChanged(fixedNativeFee, _fixedNativeFee);
        fixedNativeFee = _fixedNativeFee;
    }

    function setAggregator(IAggregator _aggregator) external onlyOperators {
        emit LogOracleImplementationChange(aggregator, _aggregator);
        aggregator = _aggregator;
    }

    function setUsdFee(uint256 _usdFee) external onlyOperators {
        emit LogUsdFeeChanged(usdFee, _usdFee);
        usdFee = _usdFee;
    }

    function setQuoteType(QuoteType _quoteType) external onlyOperators {
        if (_quoteType > QuoteType.Fixed) {
            revert ErrInvalidQuoteType(_quoteType);
        }

        emit LogQuoteTypeChanged(quoteType, _quoteType);
        quoteType = _quoteType;
    }

    /************************************************************************
     * Owners
     ************************************************************************/
    function setFeeTo(address _feeTo) external onlyOwner {
        emit LogFeeToChanged(feeTo, _feeTo);
        feeTo = _feeTo;
    }

    /************************************************************************
     * Views
     ************************************************************************/
    function getFee() public view override returns (uint256 nativeFee) {
        if (quoteType == QuoteType.Oracle) {
            nativeFee = ((10 ** aggregator.decimals()) * usdFee) / uint256(aggregator.latestAnswer());
        } else if (quoteType == QuoteType.Fixed) {
            nativeFee = fixedNativeFee;
        }
    }
}

// SPDX-License-Identifier: UNLICENSED
pragma solidity >=0.8.0;

import {IBlast, IERC20Rebasing, YieldMode, GasMode} from "interfaces/IBlast.sol";
import {Address} from "openzeppelin-contracts/utils/Address.sol";

library BlastYields {
    event LogBlastGasClaimed(address indexed recipient, uint256 amount);
    event LogBlastETHClaimed(address indexed recipient, uint256 amount);
    event LogBlastTokenClaimed(address indexed recipient, address indexed token, uint256 amount);
    event LogBlastTokenClaimableEnabled(address indexed contractAddress, address indexed token);
    event LogBlastNativeClaimableEnabled(address indexed contractAddress);

    IBlast constant BLAST_YIELD_PRECOMPILE = IBlast(0x4300000000000000000000000000000000000002);

    //////////////////////////////////////////////////////////////////////////////////////
    // CONFIGURATION
    //////////////////////////////////////////////////////////////////////////////////////

    function enableTokenClaimable(address token) internal {
        if (IERC20Rebasing(token).getConfiguration(address(this)) == YieldMode.CLAIMABLE) {
            return;
        }

        IERC20Rebasing(token).configure(YieldMode.CLAIMABLE);
        emit LogBlastTokenClaimableEnabled(address(this), token);
    }

    function configureDefaultClaimables(address governor_) internal {
        BLAST_YIELD_PRECOMPILE.configure(YieldMode.CLAIMABLE, GasMode.CLAIMABLE, governor_);
        emit LogBlastNativeClaimableEnabled(address(this));
    }

    //////////////////////////////////////////////////////////////////////////////////////
    // GAS CLAIMING
    //////////////////////////////////////////////////////////////////////////////////////
    
    function claimMaxGasYields(address recipient) internal returns (uint256) {
        return claimMaxGasYields(address(this), recipient);
    }

    function claimMaxGasYields(address contractAddress, address recipient) internal returns (uint256 amount) {
        amount = BLAST_YIELD_PRECOMPILE.claimMaxGas(contractAddress, recipient);
        emit LogBlastGasClaimed(recipient, amount);
    }

    //////////////////////////////////////////////////////////////////////////////////////
    // NATIVE CLAIMING
    //////////////////////////////////////////////////////////////////////////////////////<

    function claimAllNativeYields(address recipient) internal returns (uint256 amount) {
        return claimAllNativeYields(address(this), recipient);
    }

    function claimAllNativeYields(address contractAddress, address recipient) internal returns (uint256 amount) {
        amount = BLAST_YIELD_PRECOMPILE.claimAllYield(contractAddress, recipient);
        emit LogBlastETHClaimed(recipient, amount);
    }

    function claimNativeYields(address contractAddress, uint256 amount, address recipient) internal returns (uint256) {
        amount = BLAST_YIELD_PRECOMPILE.claimYield(contractAddress, recipient, amount);
        emit LogBlastETHClaimed(recipient, amount);
        return amount;
    }

    //////////////////////////////////////////////////////////////////////////////////////
    // TOKENS CLAIMING
    //////////////////////////////////////////////////////////////////////////////////////

    function claimAllTokenYields(address token, address recipient) internal returns (uint256 amount) {
        amount = IERC20Rebasing(token).claim(recipient, IERC20Rebasing(token).getClaimableAmount(address(this)));
        emit LogBlastTokenClaimed(recipient, address(token), amount);
    }

    function claimTokenYields(address token, uint256 amount, address recipient) internal returns (uint256) {
        amount = IERC20Rebasing(token).claim(recipient, amount);
        emit LogBlastTokenClaimed(recipient, address(token), amount);
        return amount;
    }

    //////////////////////////////////////////////////////////////////////////////////////
    // ARBITRARY PRECOMPILE CALLS
    // Meant to be used for any other calls to the precompile not covered by the above
    //////////////////////////////////////////////////////////////////////////////////////

    function callPrecompile(bytes calldata data) internal {
        Address.functionCall(address(BLAST_YIELD_PRECOMPILE), data);
    }
}

// SPDX-License-Identifier: MIT
pragma solidity >=0.8.0;

import {Owned} from "solmate/auth/Owned.sol";

/// @title OperatableV2
/// @notice OperatableV2 is a contract that allows operator management.
/// The difference with OperatableV1 apart from using solmate `Owned` vs `BoringOwnable` is that
/// the constructor is taking in the owner except of using msg.sender.
/// This allows ensuring that the owner is right one.
/// For example, when deploying from a CREATE2 factory, the msg.sender would the factory address
/// which is usually not what we want.
contract OperatableV2 is Owned {
    event OperatorChanged(address indexed, bool);
    error NotAllowedOperator();

    mapping(address => bool) public operators;

    constructor(address _owner) Owned(_owner) {}

    modifier onlyOperators() {
        if (!operators[msg.sender] && msg.sender != owner) {
            revert NotAllowedOperator();
        }
        _;
    }

    function setOperator(address operator, bool status) external onlyOwner {
        operators[operator] = status;
        emit OperatorChanged(operator, status);
    }
}

File 5 of 10 : ILayerZero.sol
// SPDX-License-Identifier: MIT
pragma solidity >=0.8.0;

import {IERC165} from "openzeppelin-contracts/utils/introspection/IERC165.sol";
import {IAggregator} from "interfaces/IAggregator.sol";

interface ILzCommonOFT is IERC165 {
    struct LzCallParams {
        address payable refundAddress;
        address zroPaymentAddress;
        bytes adapterParams;
    }

    function estimateSendFee(
        uint16 _dstChainId,
        bytes32 _toAddress,
        uint _amount,
        bool _useZro,
        bytes calldata _adapterParams
    ) external view returns (uint nativeFee, uint zroFee);

    function estimateSendAndCallFee(
        uint16 _dstChainId,
        bytes32 _toAddress,
        uint _amount,
        bytes calldata _payload,
        uint64 _dstGasForCall,
        bool _useZro,
        bytes calldata _adapterParams
    ) external view returns (uint nativeFee, uint zroFee);

    function circulatingSupply() external view returns (uint);

    function token() external view returns (address);
}

interface ILzUserApplicationConfig {
    function setConfig(uint16 _version, uint16 _chainId, uint _configType, bytes calldata _config) external;

    function setSendVersion(uint16 _version) external;

    function setReceiveVersion(uint16 _version) external;

    function forceResumeReceive(uint16 _srcChainId, bytes calldata _srcAddress) external;
}

interface ILzEndpoint is ILzUserApplicationConfig {
    function defaultSendLibrary() external view returns (address);

    function send(
        uint16 _dstChainId,
        bytes calldata _destination,
        bytes calldata _payload,
        address payable _refundAddress,
        address _zroPaymentAddress,
        bytes calldata _adapterParams
    ) external payable;

    function receivePayload(
        uint16 _srcChainId,
        bytes calldata _srcAddress,
        address _dstAddress,
        uint64 _nonce,
        uint _gasLimit,
        bytes calldata _payload
    ) external;

    function getInboundNonce(uint16 _srcChainId, bytes calldata _srcAddress) external view returns (uint64);

    function getOutboundNonce(uint16 _dstChainId, address _srcAddress) external view returns (uint64);

    function estimateFees(
        uint16 _dstChainId,
        address _userApplication,
        bytes calldata _payload,
        bool _payInZRO,
        bytes calldata _adapterParam
    ) external view returns (uint nativeFee, uint zroFee);

    function getChainId() external view returns (uint16);

    function retryPayload(uint16 _srcChainId, bytes calldata _srcAddress, bytes calldata _payload) external;

    function hasStoredPayload(uint16 _srcChainId, bytes calldata _srcAddress) external view returns (bool);

    function getSendLibraryAddress(address _userApplication) external view returns (address);

    function getReceiveLibraryAddress(address _userApplication) external view returns (address);

    function isSendingPayload() external view returns (bool);

    function isReceivingPayload() external view returns (bool);

    function getConfig(uint16 _version, uint16 _chainId, address _userApplication, uint _configType) external view returns (bytes memory);

    function getSendVersion(address _userApplication) external view returns (uint16);

    function getReceiveVersion(address _userApplication) external view returns (uint16);

    function defaultSendVersion() external view returns (uint16);

    function defaultReceiveVersion() external view returns (uint16);

    function defaultReceiveLibraryAddress() external view returns (address);

    function uaConfigLookup(
        address _address
    ) external view returns (uint16 sendVersion, uint16 receiveVersion, address receiveLibraryAddress, address sendLibrary);
}

interface ILzBaseOFTV2 {
    function sharedDecimals() external view returns (uint8);

    function innerToken() external view returns (address);
}

interface ILzApp {
    function lzReceive(uint16 _srcChainId, bytes calldata _srcAddress, uint64 _nonce, bytes calldata _payload) external;

    function minDstGasLookup(uint16 _srcChainId, uint16 _dstChainId) external view returns (uint);

    function setTrustedRemote(uint16 _remoteChainId, bytes calldata _path) external;

    function trustedRemoteLookup(uint16 _srcChainId) external view returns (bytes memory);

    function setConfig(uint16 _version, uint16 _chainId, uint _configType, bytes calldata _config) external;

    function lzEndpoint() external view returns (ILzEndpoint);
}

interface ILzFeeHandler {
    enum QuoteType {
        None,
        Oracle,
        Fixed
    }

    function getFee() external view returns (uint256);
}

interface ILzOFTV2 is ILzCommonOFT {
    function sendFrom(
        address _from,
        uint16 _dstChainId,
        bytes32 _toAddress,
        uint _amount,
        LzCallParams calldata _callParams
    ) external payable;

    function sendAndCall(
        address _from,
        uint16 _dstChainId,
        bytes32 _toAddress,
        uint _amount,
        bytes calldata _payload,
        uint64 _dstGasForCall,
        LzCallParams calldata _callParams
    ) external payable;
}

interface ILzOFTReceiverV2 {
    function onOFTReceived(
        uint16 _srcChainId,
        bytes calldata _srcAddress,
        uint64 _nonce,
        bytes32 _from,
        uint _amount,
        bytes calldata _payload
    ) external;
}

interface ILzUltraLightNodeV2 {
    function defaultAppConfig(
        uint16
    )
        external
        view
        returns (
            uint16 inboundProofLibraryVersion,
            uint64 inboundBlockConfirmations,
            address relayer,
            uint16 outboundProofType,
            uint64 outboundBlockConfirmations,
            address oracle
        );

    function appConfig(
        address,
        uint16
    )
        external
        view
        returns (
            uint16 inboundProofLibraryVersion,
            uint64 inboundBlockConfirmations,
            address relayer,
            uint16 outboundProofType,
            uint64 outboundBlockConfirmations,
            address oracle
        );
}

interface ILzReceiver {
    function lzReceive(uint16 _srcChainId, bytes calldata _srcAddress, uint64 _nonce, bytes calldata _payload) external;
}

interface IOFTV2View {
    function lzReceive(uint16 _srcChainId, bytes32 _scrAddress, bytes memory _payload, uint _totalSupply) external view returns (uint);

    function getInboundNonce(uint16 _srcChainId) external view returns (uint64);

    function getCurrentState() external view returns (uint);

    function isProxy() external view returns (bool);
}

interface IOFTWrapper {
    event LogWrapperFeeWithdrawn(address to, uint256 amount);
    event LogDefaultExchangeRateChanged(uint256 oldExchangeRate, uint256 newExchangeRate);
    event LogOracleImplementationChange(IAggregator indexed oldOracle, IAggregator indexed newOracle);
    event LogDefaultQuoteTypeChanged(QUOTE_TYPE oldValue, QUOTE_TYPE newValue);
    event LogFeeToChange(address indexed oldAddress, address indexed newAddress);

    enum QUOTE_TYPE {
        ORACLE,
        FIXED_EXCHANGE_RATE
    }

    function sendOFTV2(
        uint16 _dstChainId,
        bytes32 _toAddress,
        uint _amount,
        ILzCommonOFT.LzCallParams calldata _callParams
    ) external payable;

    function sendProxyOFTV2(
        uint16 _dstChainId,
        bytes32 _toAddress,
        uint _amount,
        ILzCommonOFT.LzCallParams calldata _callParams
    ) external payable;

    function estimateSendFeeV2(
        uint16 _dstChainId,
        bytes32 _toAddress,
        uint _amount,
        bytes calldata _adapterParams
    ) external view returns (uint nativeFee, uint zroFee);
}

interface IPreCrimeView {
    struct Packet {
        uint16 srcChainId;
        bytes32 srcAddress;
        uint64 nonce;
        bytes payload;
    }

    struct SimulationResult {
        uint chainTotalSupply;
        bool isProxy;
    }

    function getConfig(Packet[] calldata _packets) external view returns (bytes memory);

    function precrime(Packet[] calldata _packets, bytes[] calldata _simulation) external view returns (uint16 code, bytes memory reason);

    function version() external view returns (uint16);

    function simulate(Packet[] calldata _packets) external view returns (uint16 code, bytes memory result);
}

// SPDX-License-Identifier: MIT
pragma solidity >=0.8.0;

interface IAggregator {
    function decimals() external view returns (uint8);

    function latestAnswer() external view returns (int256 answer);

    function latestRoundData()
        external
        view
        returns (uint80 roundId, int256 answer, uint256 startedAt, uint256 updatedAt, uint80 answeredInRound);
}

// SPDX-License-Identifier: MIT
pragma solidity >=0.8.0;

enum YieldMode {
    AUTOMATIC,
    DISABLED,
    CLAIMABLE
}

enum GasMode {
    VOID,
    CLAIMABLE
}

interface IBlast {
    function governorMap(address) external view returns (address);

    // configure
    function configureContract(address contractAddress, YieldMode _yield, GasMode gasMode, address governor) external;

    function configure(YieldMode _yield, GasMode gasMode, address governor) external;

    // base configuration options
    function configureClaimableYield() external;

    function configureClaimableYieldOnBehalf(address contractAddress) external;

    function configureAutomaticYield() external;

    function configureAutomaticYieldOnBehalf(address contractAddress) external;

    function configureVoidYield() external;

    function configureVoidYieldOnBehalf(address contractAddress) external;

    function configureClaimableGas() external;

    function configureClaimableGasOnBehalf(address contractAddress) external;

    function configureVoidGas() external;

    function configureVoidGasOnBehalf(address contractAddress) external;

    function configureGovernor(address _governor) external;

    function configureGovernorOnBehalf(address _newGovernor, address contractAddress) external;

    // claim yield
    function claimYield(address contractAddress, address recipientOfYield, uint256 amount) external returns (uint256);

    function claimAllYield(address contractAddress, address recipientOfYield) external returns (uint256);

    // claim gas
    function claimAllGas(address contractAddress, address recipientOfGas) external returns (uint256);

    function claimGasAtMinClaimRate(address contractAddress, address recipientOfGas, uint256 minClaimRateBips) external returns (uint256);

    function claimMaxGas(address contractAddress, address recipientOfGas) external returns (uint256);

    function claimGas(
        address contractAddress,
        address recipientOfGas,
        uint256 gasToClaim,
        uint256 gasSecondsToConsume
    ) external returns (uint256);

    // read functions
    function readClaimableYield(address contractAddress) external view returns (uint256);

    function readYieldConfiguration(address contractAddress) external view returns (uint8);

    function readGasParams(
        address contractAddress
    ) external view returns (uint256 etherSeconds, uint256 etherBalance, uint256 lastUpdated, GasMode);
}

interface IERC20Rebasing {
    function getConfiguration(address account) external view returns (YieldMode);

    // changes the yield mode of the caller and update the balance
    // to reflect the configuration
    function configure(YieldMode) external returns (uint256);

    // "claimable" yield mode accounts can call this this claim their yield
    // to another address
    function claim(address recipient, uint256 amount) external returns (uint256);

    // read the claimable amount for an account
    function getClaimableAmount(address account) external view returns (uint256);
}

interface IBlastPoints {
    function configurePointsOperator(address operator) external;
}

// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.9.0) (utils/Address.sol)

pragma solidity ^0.8.1;

/**
 * @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
     *
     * Furthermore, `isContract` will also return true if the target contract within
     * the same transaction is already scheduled for destruction by `SELFDESTRUCT`,
     * which only has an effect at the end of a transaction.
     * ====
     *
     * [IMPORTANT]
     * ====
     * You shouldn't rely on `isContract` to protect against flash loan attacks!
     *
     * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets
     * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract
     * constructor.
     * ====
     */
    function isContract(address account) internal view returns (bool) {
        // This method relies on extcodesize/address.code.length, which returns 0
        // for contracts in construction, since the code is only stored at the end
        // of the constructor execution.

        return account.code.length > 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://consensys.net/diligence/blog/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.8.0/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 functionCallWithValue(target, data, 0, "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");
        (bool success, bytes memory returndata) = target.call{value: value}(data);
        return verifyCallResultFromTarget(target, 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) {
        (bool success, bytes memory returndata) = target.staticcall(data);
        return verifyCallResultFromTarget(target, 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) {
        (bool success, bytes memory returndata) = target.delegatecall(data);
        return verifyCallResultFromTarget(target, success, returndata, errorMessage);
    }

    /**
     * @dev Tool to verify that a low level call to smart-contract was successful, and revert (either by bubbling
     * the revert reason or using the provided one) in case of unsuccessful call or if target was not a contract.
     *
     * _Available since v4.8._
     */
    function verifyCallResultFromTarget(
        address target,
        bool success,
        bytes memory returndata,
        string memory errorMessage
    ) internal view returns (bytes memory) {
        if (success) {
            if (returndata.length == 0) {
                // only check isContract if the call was successful and the return data is empty
                // otherwise we already know that it was a contract
                require(isContract(target), "Address: call to non-contract");
            }
            return returndata;
        } else {
            _revert(returndata, errorMessage);
        }
    }

    /**
     * @dev Tool to verify that a low level call was successful, and revert if it wasn't, either by bubbling the
     * revert reason or 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 {
            _revert(returndata, errorMessage);
        }
    }

    function _revert(bytes memory returndata, string memory errorMessage) private pure {
        // 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
            /// @solidity memory-safe-assembly
            assembly {
                let returndata_size := mload(returndata)
                revert(add(32, returndata), returndata_size)
            }
        } else {
            revert(errorMessage);
        }
    }
}

// SPDX-License-Identifier: AGPL-3.0-only
pragma solidity >=0.8.0;

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

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

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

    address public owner;

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

        _;
    }

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

    constructor(address _owner) {
        owner = _owner;

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

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

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

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

// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol)

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

Settings
{
  "remappings": [
    "/=src/",
    "openzeppelin-contracts/=lib/openzeppelin-contracts/contracts/",
    "BoringSolidity/=lib/BoringSolidity/contracts/",
    "ds-test/=lib/forge-std/lib/ds-test/src/",
    "forge-std/=lib/forge-std/src/",
    "solmate/=lib/solmate/src/",
    "utils/=utils/",
    "libraries/=src/libraries/",
    "interfaces/=src/interfaces/",
    "cauldrons/=src/cauldrons/",
    "staking/=src/staking/",
    "swappers/=src/swappers/",
    "oracles/=src/oracles/",
    "strategies/=src/strategies/",
    "tokens/=src/tokens/",
    "periphery/=src/periphery/",
    "mixins/=src/mixins/",
    "lenses/=src/lenses/",
    "surl/=lib/surl/src/",
    "solady/=lib/solady/src/",
    "forge-deploy/=lib/forge-deploy/contracts/",
    "ExcessivelySafeCall/=lib/ExcessivelySafeCall/src/",
    "safe-contracts/=lib/safe-contracts/contracts/"
  ],
  "optimizer": {
    "enabled": true,
    "runs": 400
  },
  "metadata": {
    "useLiteralContent": false,
    "bytecodeHash": "ipfs",
    "appendCBOR": true
  },
  "outputSelection": {
    "*": {
      "*": [
        "evm.bytecode",
        "evm.deployedBytecode",
        "devdoc",
        "userdoc",
        "metadata",
        "abi"
      ]
    }
  },
  "evmVersion": "paris",
  "viaIR": false,
  "libraries": {}
}

Contract Security Audit

Contract ABI

API
[{"inputs":[{"internalType":"address","name":"_owner","type":"address"},{"internalType":"uint256","name":"_fixedNativeFee","type":"uint256"},{"internalType":"address","name":"_oft","type":"address"},{"internalType":"address","name":"_aggregator","type":"address"},{"internalType":"address","name":"_feeTo","type":"address"},{"internalType":"uint8","name":"_quoteType","type":"uint8"},{"internalType":"address","name":"governor_","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[{"internalType":"enum ILzFeeHandler.QuoteType","name":"","type":"uint8"}],"name":"ErrInvalidQuoteType","type":"error"},{"inputs":[],"name":"ErrUnauthorizedSender","type":"error"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"ErrValueTooLowToCoverFees","type":"error"},{"inputs":[],"name":"ErrWithdrawFailed","type":"error"},{"inputs":[],"name":"ErrZeroAddress","type":"error"},{"inputs":[],"name":"NotAllowedOperator","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"contractAddress","type":"address"}],"name":"LogBlastNativeClaimableEnabled","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"LogFeeCollected","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previous","type":"address"},{"indexed":true,"internalType":"address","name":"current","type":"address"}],"name":"LogFeeToChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"LogFeeWithdrawn","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"previous","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"current","type":"uint256"}],"name":"LogFixedNativeFeeChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"contract IAggregator","name":"previous","type":"address"},{"indexed":true,"internalType":"contract IAggregator","name":"current","type":"address"}],"name":"LogOracleImplementationChange","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"enum ILzFeeHandler.QuoteType","name":"previous","type":"uint8"},{"indexed":false,"internalType":"enum ILzFeeHandler.QuoteType","name":"current","type":"uint8"}],"name":"LogQuoteTypeChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"previous","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"current","type":"uint256"}],"name":"LogUsdFeeChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"","type":"address"},{"indexed":false,"internalType":"bool","name":"","type":"bool"}],"name":"OperatorChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"inputs":[],"name":"DEFAULT_USD_FEE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"aggregator","outputs":[{"internalType":"contract IAggregator","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"feeTo","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"fixedNativeFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getFee","outputs":[{"internalType":"uint256","name":"nativeFee","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"oft","outputs":[{"internalType":"contract ILzOFTV2","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"operators","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"quoteType","outputs":[{"internalType":"enum ILzFeeHandler.QuoteType","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"contract IAggregator","name":"_aggregator","type":"address"}],"name":"setAggregator","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_feeTo","type":"address"}],"name":"setFeeTo","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_fixedNativeFee","type":"uint256"}],"name":"setFixedNativeFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"status","type":"bool"}],"name":"setOperator","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"enum ILzFeeHandler.QuoteType","name":"_quoteType","type":"uint8"}],"name":"setQuoteType","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_usdFee","type":"uint256"}],"name":"setUsdFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"usdFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdrawFees","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]

60a06040526006805460ff191660011790553480156200001e57600080fd5b506040516200106838038062001068833981016040819052620000419162000236565b600080546001600160a01b0319166001600160a01b038916908117825560405189928992899289928992899288928392917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a3505060048590556001600160a01b03848116608052600380546001600160a01b0319908116868416179091556002805490911691841691909117815560ff821690811115620000ea57620000ea62000203565b6006805460ff1916600183600281111562000109576200010962000203565b021790555050670de0b6b3a76400006005555050506001600160a01b03831691506200014a905057604051630ecc6fdf60e41b815260040160405180910390fd5b620001558162000162565b5050505050505062000315565b60405163c8992e6160e01b81527343000000000000000000000000000000000000029063c8992e6190620001a1906002906001908690600401620002c9565b600060405180830381600087803b158015620001bc57600080fd5b505af1158015620001d1573d6000803e3d6000fd5b50506040513092507fd519de07dfc6a474caab5e77d5829a6ca71ad6a4aafc5cc253bafe0f0c772bf59150600090a250565b634e487b7160e01b600052602160045260246000fd5b80516001600160a01b03811681146200023157600080fd5b919050565b600080600080600080600060e0888a0312156200025257600080fd5b6200025d8862000219565b965060208801519550620002746040890162000219565b9450620002846060890162000219565b9350620002946080890162000219565b925060a088015160ff81168114620002ab57600080fd5b9150620002bb60c0890162000219565b905092959891949750929550565b6060810160038510620002e057620002e062000203565b84825260028410620002f657620002f662000203565b60208201939093526001600160a01b0391909116604090910152919050565b608051610d376200033160003960006102990152610d376000f3fe60806040526004361061010d5760003560e01c8063a28598d411610095578063ced72f8711610064578063ced72f8714610331578063dbdaad3a14610346578063f2fde38b14610366578063f46901ed14610386578063f9120af6146103a657600080fd5b8063a28598d4146102bb578063a626b852146102db578063bf01fb1c146102ff578063cbe95f8d1461031557600080fd5b8063558a7297116100dc578063558a72971461020057806355929b7e146102205780636d0f18c4146102475780638da5cb5b146102675780639b5215f61461028757600080fd5b8063017e7e581461014c57806313e7c9d814610189578063245a7bfc146101c9578063476343ee146101e957600080fd5b36610147576040513481527fd1ae1000117f80c29c2c0557e508821a94820657a8fdb7139c8f47e1eebcf19a9060200160405180910390a1005b600080fd5b34801561015857600080fd5b5060025461016c906001600160a01b031681565b6040516001600160a01b0390911681526020015b60405180910390f35b34801561019557600080fd5b506101b96101a4366004610a80565b60016020526000908152604090205460ff1681565b6040519015158152602001610180565b3480156101d557600080fd5b5060035461016c906001600160a01b031681565b3480156101f557600080fd5b506101fe6103c6565b005b34801561020c57600080fd5b506101fe61021b366004610aa4565b610488565b34801561022c57600080fd5b5060065461023a9060ff1681565b6040516101809190610b1a565b34801561025357600080fd5b506101fe610262366004610b2e565b610535565b34801561027357600080fd5b5060005461016c906001600160a01b031681565b34801561029357600080fd5b5061016c7f000000000000000000000000000000000000000000000000000000000000000081565b3480156102c757600080fd5b506101fe6102d6366004610b2e565b6105bf565b3480156102e757600080fd5b506102f160055481565b604051908152602001610180565b34801561030b57600080fd5b506102f160045481565b34801561032157600080fd5b506102f1670de0b6b3a764000081565b34801561033d57600080fd5b506102f1610649565b34801561035257600080fd5b506101fe610361366004610b47565b6107a4565b34801561037257600080fd5b506101fe610381366004610a80565b61088a565b34801561039257600080fd5b506101fe6103a1366004610a80565b61091e565b3480156103b257600080fd5b506101fe6103c1366004610a80565b6109c3565b60025460405147916000916001600160a01b039091169083908381818185875af1925050503d8060008114610417576040519150601f19603f3d011682016040523d82523d6000602084013e61041c565b606091505b505090508061043e5760405163f5ef1ce360e01b815260040160405180910390fd5b600254604080516001600160a01b039092168252602082018490527f418b0ccedb3670086d8041f37709e230d4b319026a713e8f5df213619e924721910160405180910390a15050565b6000546001600160a01b031633146104d65760405162461bcd60e51b815260206004820152600c60248201526b15539055551213d49256915160a21b60448201526064015b60405180910390fd5b6001600160a01b038216600081815260016020908152604091829020805460ff191685151590811790915591519182527f193de8d500b5cb7b720089b258a39e9c1d0b840019a73ae7c51c3f9101732b02910160405180910390a25050565b3360009081526001602052604090205460ff1615801561056057506000546001600160a01b03163314155b1561057e5760405163de19c8b360e01b815260040160405180910390fd5b60045460408051918252602082018390527fc5aa5bf8b75bafcc972927146f61c0c06e7bce1f5f2601a3210e0e34b8236987910160405180910390a1600455565b3360009081526001602052604090205460ff161580156105ea57506000546001600160a01b03163314155b156106085760405163de19c8b360e01b815260040160405180910390fd5b60055460408051918252602082018390527f89fa9f9ef52364f929ffacff949493aa1aefe10a8ec34107a313b8287fa65450910160405180910390a1600555565b6000600160065460ff16600281111561066457610664610ae2565b0361077e57600360009054906101000a90046001600160a01b03166001600160a01b03166350d25bcd6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156106bc573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106e09190610b68565b600554600360009054906101000a90046001600160a01b03166001600160a01b031663313ce5676040518163ffffffff1660e01b8152600401602060405180830381865afa158015610736573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061075a9190610b81565b61076590600a610c9e565b61076f9190610cad565b6107799190610cc4565b905090565b600260065460ff16600281111561079757610797610ae2565b036107a157506004545b90565b3360009081526001602052604090205460ff161580156107cf57506000546001600160a01b03163314155b156107ed5760405163de19c8b360e01b815260040160405180910390fd5b600281600281111561080157610801610ae2565b1115610822578060405163a25fcb3160e01b81526004016104cd9190610b1a565b6006546040517f5bfc534944e42c228c39e4d0b49815e328e5fb00a2f8902592db327b0d35b49d9161085b9160ff909116908490610ce6565b60405180910390a16006805482919060ff1916600183600281111561088257610882610ae2565b021790555050565b6000546001600160a01b031633146108d35760405162461bcd60e51b815260206004820152600c60248201526b15539055551213d49256915160a21b60448201526064016104cd565b600080546001600160a01b0319166001600160a01b0383169081178255604051909133917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a350565b6000546001600160a01b031633146109675760405162461bcd60e51b815260206004820152600c60248201526b15539055551213d49256915160a21b60448201526064016104cd565b6002546040516001600160a01b038084169216907f4d04c0a3649bb745c9de0ab085f8c69b31c001bdb16cd323f36b867a300d006290600090a3600280546001600160a01b0319166001600160a01b0392909216919091179055565b3360009081526001602052604090205460ff161580156109ee57506000546001600160a01b03163314155b15610a0c5760405163de19c8b360e01b815260040160405180910390fd5b6003546040516001600160a01b038084169216907f8e0352ee1de57032a7c8ddf4cb1daa3ff929d0a8534e42a124811b2fa033cccd90600090a3600380546001600160a01b0319166001600160a01b0392909216919091179055565b6001600160a01b0381168114610a7d57600080fd5b50565b600060208284031215610a9257600080fd5b8135610a9d81610a68565b9392505050565b60008060408385031215610ab757600080fd5b8235610ac281610a68565b915060208301358015158114610ad757600080fd5b809150509250929050565b634e487b7160e01b600052602160045260246000fd5b60038110610b1657634e487b7160e01b600052602160045260246000fd5b9052565b60208101610b288284610af8565b92915050565b600060208284031215610b4057600080fd5b5035919050565b600060208284031215610b5957600080fd5b813560038110610a9d57600080fd5b600060208284031215610b7a57600080fd5b5051919050565b600060208284031215610b9357600080fd5b815160ff81168114610a9d57600080fd5b634e487b7160e01b600052601160045260246000fd5b600181815b80851115610bf5578160001904821115610bdb57610bdb610ba4565b80851615610be857918102915b93841c9390800290610bbf565b509250929050565b600082610c0c57506001610b28565b81610c1957506000610b28565b8160018114610c2f5760028114610c3957610c55565b6001915050610b28565b60ff841115610c4a57610c4a610ba4565b50506001821b610b28565b5060208310610133831016604e8410600b8410161715610c78575081810a610b28565b610c828383610bba565b8060001904821115610c9657610c96610ba4565b029392505050565b6000610a9d60ff841683610bfd565b8082028115828204841417610b2857610b28610ba4565b600082610ce157634e487b7160e01b600052601260045260246000fd5b500490565b60408101610cf48285610af8565b610a9d6020830184610af856fea264697066735822122068e7b65e27a06efca78a75bb02f5de38af7acbcf4fc9129d853297e6840ae34264736f6c63430008140033000000000000000000000000fb3485c2e209a5cfbdc1447674256578f1a80ee300000000000000000000000000000000000000000000000000000000000000000000000000000000000000006e4358c889bb7871061904be31fe47c3b8b7f4420000000000000000000000000af23b08bcd8ad35d1e8e8f2d2b779024bd8d24a000000000000000000000000fb3485c2e209a5cfbdc1447674256578f1a80ee300000000000000000000000000000000000000000000000000000000000000010000000000000000000000007b9b66286c64ee3cf3ae4998bbd1474d2674ba99

Deployed Bytecode

0x60806040526004361061010d5760003560e01c8063a28598d411610095578063ced72f8711610064578063ced72f8714610331578063dbdaad3a14610346578063f2fde38b14610366578063f46901ed14610386578063f9120af6146103a657600080fd5b8063a28598d4146102bb578063a626b852146102db578063bf01fb1c146102ff578063cbe95f8d1461031557600080fd5b8063558a7297116100dc578063558a72971461020057806355929b7e146102205780636d0f18c4146102475780638da5cb5b146102675780639b5215f61461028757600080fd5b8063017e7e581461014c57806313e7c9d814610189578063245a7bfc146101c9578063476343ee146101e957600080fd5b36610147576040513481527fd1ae1000117f80c29c2c0557e508821a94820657a8fdb7139c8f47e1eebcf19a9060200160405180910390a1005b600080fd5b34801561015857600080fd5b5060025461016c906001600160a01b031681565b6040516001600160a01b0390911681526020015b60405180910390f35b34801561019557600080fd5b506101b96101a4366004610a80565b60016020526000908152604090205460ff1681565b6040519015158152602001610180565b3480156101d557600080fd5b5060035461016c906001600160a01b031681565b3480156101f557600080fd5b506101fe6103c6565b005b34801561020c57600080fd5b506101fe61021b366004610aa4565b610488565b34801561022c57600080fd5b5060065461023a9060ff1681565b6040516101809190610b1a565b34801561025357600080fd5b506101fe610262366004610b2e565b610535565b34801561027357600080fd5b5060005461016c906001600160a01b031681565b34801561029357600080fd5b5061016c7f0000000000000000000000006e4358c889bb7871061904be31fe47c3b8b7f44281565b3480156102c757600080fd5b506101fe6102d6366004610b2e565b6105bf565b3480156102e757600080fd5b506102f160055481565b604051908152602001610180565b34801561030b57600080fd5b506102f160045481565b34801561032157600080fd5b506102f1670de0b6b3a764000081565b34801561033d57600080fd5b506102f1610649565b34801561035257600080fd5b506101fe610361366004610b47565b6107a4565b34801561037257600080fd5b506101fe610381366004610a80565b61088a565b34801561039257600080fd5b506101fe6103a1366004610a80565b61091e565b3480156103b257600080fd5b506101fe6103c1366004610a80565b6109c3565b60025460405147916000916001600160a01b039091169083908381818185875af1925050503d8060008114610417576040519150601f19603f3d011682016040523d82523d6000602084013e61041c565b606091505b505090508061043e5760405163f5ef1ce360e01b815260040160405180910390fd5b600254604080516001600160a01b039092168252602082018490527f418b0ccedb3670086d8041f37709e230d4b319026a713e8f5df213619e924721910160405180910390a15050565b6000546001600160a01b031633146104d65760405162461bcd60e51b815260206004820152600c60248201526b15539055551213d49256915160a21b60448201526064015b60405180910390fd5b6001600160a01b038216600081815260016020908152604091829020805460ff191685151590811790915591519182527f193de8d500b5cb7b720089b258a39e9c1d0b840019a73ae7c51c3f9101732b02910160405180910390a25050565b3360009081526001602052604090205460ff1615801561056057506000546001600160a01b03163314155b1561057e5760405163de19c8b360e01b815260040160405180910390fd5b60045460408051918252602082018390527fc5aa5bf8b75bafcc972927146f61c0c06e7bce1f5f2601a3210e0e34b8236987910160405180910390a1600455565b3360009081526001602052604090205460ff161580156105ea57506000546001600160a01b03163314155b156106085760405163de19c8b360e01b815260040160405180910390fd5b60055460408051918252602082018390527f89fa9f9ef52364f929ffacff949493aa1aefe10a8ec34107a313b8287fa65450910160405180910390a1600555565b6000600160065460ff16600281111561066457610664610ae2565b0361077e57600360009054906101000a90046001600160a01b03166001600160a01b03166350d25bcd6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156106bc573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106e09190610b68565b600554600360009054906101000a90046001600160a01b03166001600160a01b031663313ce5676040518163ffffffff1660e01b8152600401602060405180830381865afa158015610736573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061075a9190610b81565b61076590600a610c9e565b61076f9190610cad565b6107799190610cc4565b905090565b600260065460ff16600281111561079757610797610ae2565b036107a157506004545b90565b3360009081526001602052604090205460ff161580156107cf57506000546001600160a01b03163314155b156107ed5760405163de19c8b360e01b815260040160405180910390fd5b600281600281111561080157610801610ae2565b1115610822578060405163a25fcb3160e01b81526004016104cd9190610b1a565b6006546040517f5bfc534944e42c228c39e4d0b49815e328e5fb00a2f8902592db327b0d35b49d9161085b9160ff909116908490610ce6565b60405180910390a16006805482919060ff1916600183600281111561088257610882610ae2565b021790555050565b6000546001600160a01b031633146108d35760405162461bcd60e51b815260206004820152600c60248201526b15539055551213d49256915160a21b60448201526064016104cd565b600080546001600160a01b0319166001600160a01b0383169081178255604051909133917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a350565b6000546001600160a01b031633146109675760405162461bcd60e51b815260206004820152600c60248201526b15539055551213d49256915160a21b60448201526064016104cd565b6002546040516001600160a01b038084169216907f4d04c0a3649bb745c9de0ab085f8c69b31c001bdb16cd323f36b867a300d006290600090a3600280546001600160a01b0319166001600160a01b0392909216919091179055565b3360009081526001602052604090205460ff161580156109ee57506000546001600160a01b03163314155b15610a0c5760405163de19c8b360e01b815260040160405180910390fd5b6003546040516001600160a01b038084169216907f8e0352ee1de57032a7c8ddf4cb1daa3ff929d0a8534e42a124811b2fa033cccd90600090a3600380546001600160a01b0319166001600160a01b0392909216919091179055565b6001600160a01b0381168114610a7d57600080fd5b50565b600060208284031215610a9257600080fd5b8135610a9d81610a68565b9392505050565b60008060408385031215610ab757600080fd5b8235610ac281610a68565b915060208301358015158114610ad757600080fd5b809150509250929050565b634e487b7160e01b600052602160045260246000fd5b60038110610b1657634e487b7160e01b600052602160045260246000fd5b9052565b60208101610b288284610af8565b92915050565b600060208284031215610b4057600080fd5b5035919050565b600060208284031215610b5957600080fd5b813560038110610a9d57600080fd5b600060208284031215610b7a57600080fd5b5051919050565b600060208284031215610b9357600080fd5b815160ff81168114610a9d57600080fd5b634e487b7160e01b600052601160045260246000fd5b600181815b80851115610bf5578160001904821115610bdb57610bdb610ba4565b80851615610be857918102915b93841c9390800290610bbf565b509250929050565b600082610c0c57506001610b28565b81610c1957506000610b28565b8160018114610c2f5760028114610c3957610c55565b6001915050610b28565b60ff841115610c4a57610c4a610ba4565b50506001821b610b28565b5060208310610133831016604e8410600b8410161715610c78575081810a610b28565b610c828383610bba565b8060001904821115610c9657610c96610ba4565b029392505050565b6000610a9d60ff841683610bfd565b8082028115828204841417610b2857610b28610ba4565b600082610ce157634e487b7160e01b600052601260045260246000fd5b500490565b60408101610cf48285610af8565b610a9d6020830184610af856fea264697066735822122068e7b65e27a06efca78a75bb02f5de38af7acbcf4fc9129d853297e6840ae34264736f6c63430008140033

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

000000000000000000000000fb3485c2e209a5cfbdc1447674256578f1a80ee300000000000000000000000000000000000000000000000000000000000000000000000000000000000000006e4358c889bb7871061904be31fe47c3b8b7f4420000000000000000000000000af23b08bcd8ad35d1e8e8f2d2b779024bd8d24a000000000000000000000000fb3485c2e209a5cfbdc1447674256578f1a80ee300000000000000000000000000000000000000000000000000000000000000010000000000000000000000007b9b66286c64ee3cf3ae4998bbd1474d2674ba99

-----Decoded View---------------
Arg [0] : _owner (address): 0xfB3485c2e209A5cfBDC1447674256578f1A80eE3
Arg [1] : _fixedNativeFee (uint256): 0
Arg [2] : _oft (address): 0x6E4358c889bb7871061904Be31Fe47C3B8b7F442
Arg [3] : _aggregator (address): 0x0af23B08bcd8AD35D1e8e8f2D2B779024Bd8D24A
Arg [4] : _feeTo (address): 0xfB3485c2e209A5cfBDC1447674256578f1A80eE3
Arg [5] : _quoteType (uint8): 1
Arg [6] : governor_ (address): 0x7b9b66286C64ee3cF3AE4998Bbd1474d2674bA99

-----Encoded View---------------
7 Constructor Arguments found :
Arg [0] : 000000000000000000000000fb3485c2e209a5cfbdc1447674256578f1a80ee3
Arg [1] : 0000000000000000000000000000000000000000000000000000000000000000
Arg [2] : 0000000000000000000000006e4358c889bb7871061904be31fe47c3b8b7f442
Arg [3] : 0000000000000000000000000af23b08bcd8ad35d1e8e8f2d2b779024bd8d24a
Arg [4] : 000000000000000000000000fb3485c2e209a5cfbdc1447674256578f1a80ee3
Arg [5] : 0000000000000000000000000000000000000000000000000000000000000001
Arg [6] : 0000000000000000000000007b9b66286c64ee3cf3ae4998bbd1474d2674ba99


Block Transaction Difficulty Gas Used Reward
View All Blocks Produced

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

Validator Index Block Amount
View All Withdrawals

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

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