ETH Price: $3,106.85 (+1.70%)

Contract

0x0E58736907261C379198783B1E42541Da4D14fB7

Overview

ETH Balance

0.014717434576863479 ETH

ETH Value

$45.72 (@ $3,106.85/ETH)

More Info

Private Name Tags

Multichain Info

No addresses found
Transaction Hash
Method
Block
From
To
Send166255742025-11-17 8:33:0520 days ago1763368385IN
0x0E587369...Da4D14fB7
0.00003232 ETH0.000001350.00000026
Send164982552025-11-15 21:11:0622 days ago1763241066IN
0x0E587369...Da4D14fB7
0.00003228 ETH0.000001350.00000026
Send160827592025-11-11 1:46:1027 days ago1762825570IN
0x0E587369...Da4D14fB7
0.00033484 ETH0.000001880.00219926
Send158218432025-11-08 1:17:3430 days ago1762564654IN
0x0E587369...Da4D14fB7
0.00004511 ETH0.000001640.0012
Send155986242025-11-05 11:17:1532 days ago1762341435IN
0x0E587369...Da4D14fB7
0.00045071 ETH0.000001350.00000026
Send154783762025-11-04 1:53:0734 days ago1762221187IN
0x0E587369...Da4D14fB7
0.00002923 ETH0.000001590.001
Send151850852025-10-31 16:24:5637 days ago1761927896IN
0x0E587369...Da4D14fB7
0.00002748 ETH0.000001590.001
Send151648202025-10-31 10:47:1137 days ago1761907631IN
0x0E587369...Da4D14fB7
0.00002759 ETH0.000001590.001
Send148852312025-10-28 5:07:2240 days ago1761628042IN
0x0E587369...Da4D14fB7
0.00002619 ETH0.000001350.00000784
Send143436712025-10-21 22:41:2247 days ago1761086482IN
0x0E587369...Da4D14fB7
0.00003064 ETH0.000001880.002199
Send142666612025-10-21 1:17:5248 days ago1761009472IN
0x0E587369...Da4D14fB7
0.00003096 ETH0.000001640.00119926
Send142623292025-10-21 0:05:4048 days ago1761005140IN
0x0E587369...Da4D14fB7
0.00017924 ETH0.000001350.00000026
Send142034232025-10-20 7:43:5448 days ago1760946234IN
0x0E587369...Da4D14fB7
0.0000257 ETH0.000001590.001
Send141529302025-10-19 17:42:2149 days ago1760895741IN
0x0E587369...Da4D14fB7
0.00002608 ETH0.000001590.001
Send140415332025-10-18 10:45:4450 days ago1760784344IN
0x0E587369...Da4D14fB7
0.00023862 ETH0.000001590.00099996
Send139591682025-10-17 11:52:5951 days ago1760701979IN
0x0E587369...Da4D14fB7
0.0019305 ETH0.00000160.001
Send138820312025-10-16 14:27:2252 days ago1760624842IN
0x0E587369...Da4D14fB7
0.00004073 ETH0.000001590.001
Send138658572025-10-16 9:57:4852 days ago1760608668IN
0x0E587369...Da4D14fB7
0.00003636 ETH0.00000160.00101126
Send138640952025-10-16 9:28:2652 days ago1760606906IN
0x0E587369...Da4D14fB7
0.00002703 ETH0.000001610.0011
Send138487102025-10-16 5:12:0152 days ago1760591521IN
0x0E587369...Da4D14fB7
0.00002688 ETH0.000001590.001
Send138335092025-10-16 0:58:4053 days ago1760576320IN
0x0E587369...Da4D14fB7
0.00028772 ETH0.000001590.001
Send137955272025-10-15 14:25:3853 days ago1760538338IN
0x0E587369...Da4D14fB7
0.00006282 ETH0.000001590.001
Send137909932025-10-15 13:10:0453 days ago1760533804IN
0x0E587369...Da4D14fB7
0.0006115 ETH0.000001590.001
Send137661742025-10-15 6:16:2553 days ago1760508985IN
0x0E587369...Da4D14fB7
0.00003138 ETH0.000001590.001
Send137555672025-10-15 3:19:3853 days ago1760498378IN
0x0E587369...Da4D14fB7
0.00002893 ETH0.000001440.00037106
View all transactions

Latest 25 internal transactions (View All)

Advanced mode:
Parent Transaction Hash Block From To
166255742025-11-17 8:33:0520 days ago1763368385
0x0E587369...Da4D14fB7
0.00003232 ETH
164982552025-11-15 21:11:0622 days ago1763241066
0x0E587369...Da4D14fB7
0.00003228 ETH
160827592025-11-11 1:46:1027 days ago1762825570
0x0E587369...Da4D14fB7
0.00033484 ETH
158218432025-11-08 1:17:3430 days ago1762564654
0x0E587369...Da4D14fB7
0.00004511 ETH
155986242025-11-05 11:17:1532 days ago1762341435
0x0E587369...Da4D14fB7
0.00045071 ETH
154783762025-11-04 1:53:0734 days ago1762221187
0x0E587369...Da4D14fB7
0.00002923 ETH
151850852025-10-31 16:24:5637 days ago1761927896
0x0E587369...Da4D14fB7
0.00002748 ETH
151648202025-10-31 10:47:1137 days ago1761907631
0x0E587369...Da4D14fB7
0.00002759 ETH
148852312025-10-28 5:07:2240 days ago1761628042
0x0E587369...Da4D14fB7
0.00002619 ETH
143436712025-10-21 22:41:2247 days ago1761086482
0x0E587369...Da4D14fB7
0.00003064 ETH
142666612025-10-21 1:17:5248 days ago1761009472
0x0E587369...Da4D14fB7
0.00003096 ETH
142623292025-10-21 0:05:4048 days ago1761005140
0x0E587369...Da4D14fB7
0.00017924 ETH
142034232025-10-20 7:43:5448 days ago1760946234
0x0E587369...Da4D14fB7
0.0000257 ETH
141529302025-10-19 17:42:2149 days ago1760895741
0x0E587369...Da4D14fB7
0.00002608 ETH
140415332025-10-18 10:45:4450 days ago1760784344
0x0E587369...Da4D14fB7
0.00023862 ETH
139591682025-10-17 11:52:5951 days ago1760701979
0x0E587369...Da4D14fB7
0.0019305 ETH
138820312025-10-16 14:27:2252 days ago1760624842
0x0E587369...Da4D14fB7
0.00004073 ETH
138658572025-10-16 9:57:4852 days ago1760608668
0x0E587369...Da4D14fB7
0.00003636 ETH
138640952025-10-16 9:28:2652 days ago1760606906
0x0E587369...Da4D14fB7
0.00002703 ETH
138487102025-10-16 5:12:0152 days ago1760591521
0x0E587369...Da4D14fB7
0.00002688 ETH
138335092025-10-16 0:58:4053 days ago1760576320
0x0E587369...Da4D14fB7
0.00028772 ETH
137955272025-10-15 14:25:3853 days ago1760538338
0x0E587369...Da4D14fB7
0.00006282 ETH
137909932025-10-15 13:10:0453 days ago1760533804
0x0E587369...Da4D14fB7
0.0006115 ETH
137661742025-10-15 6:16:2553 days ago1760508985
0x0E587369...Da4D14fB7
0.00003138 ETH
137555672025-10-15 3:19:3853 days ago1760498378
0x0E587369...Da4D14fB7
0.00002893 ETH
View All Internal Transactions

Cross-Chain Transactions
Loading...
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
BridgeCCIP

Compiler Version
v0.8.26+commit.8a97fa7a

Optimization Enabled:
Yes with 200 runs

Other Settings:
cancun EvmVersion, GNU GPLv2 license
// SPDX-License-Identifier: GPL-2.0
pragma solidity ^0.8.20;

import { Codec, BridgeSendPayload } from "../../libs/Codec.sol";
import { Common } from "../../libs/Common.sol";
import { Constants } from "../../libs/Constants.sol";

import { Client } from "@chainlink/contracts-ccip/src/v0.8/ccip/libraries/Client.sol";
import { CCIPReceiver } from "@chainlink/contracts-ccip/src/v0.8/ccip/applications/CCIPReceiver.sol";
import { IRouterClient } from "@chainlink/contracts-ccip/src/v0.8/ccip/interfaces/IRouterClient.sol";
import { LinkTokenInterface } from "@chainlink/contracts/src/v0.8/shared/interfaces/LinkTokenInterface.sol";

import { IBlackList } from "../../administrator/interface/IBlackList.sol";
import { IERC20 } from "@openzeppelin/contracts/token/ERC20/IERC20.sol";
import { ILockBox } from "../../core/interface/ILockBox.sol";
import { IManager, ManageAssetAndShares } from "../../core/interface/IManager.sol";
import { IRole } from "../../administrator/interface/IRole.sol";
import { IPausable } from "../../administrator/interface/IPausable.sol";

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

import { SafeERC20 } from "@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol";

event SetLockbox(address indexed caller, address indexed token, address indexed lockbox);
event SetAdministrator(address indexed caller, address indexed administrator);
event SetToken(address indexed caller, uint64 indexed dstId, address indexed token);
event MessageReceived(bytes32 indexed messageId, uint64 indexed sourceChainSelector, address sender, bytes data);
event MessageSent(bytes32 indexed messageId);
event ManagerSet(address indexed caller, address indexed manager);

contract BridgeCCIP is CCIPReceiver, Ownable {
    bool public immutable isL1;
    address public immutable link;
    address public administrator;
    mapping(bytes32 => bool) public processedMessages;
    mapping(address => address) public lockboxes;
    mapping(address => mapping(uint64 => address)) public tokens;
    address public manager;
    mapping(uint64 peerChainId => mapping(address peer => bool allowed)) public allowedPeers;
    enum PayFeesIn {
        Native,
        LINK
    }
    using SafeERC20 for IERC20;

    constructor(address _router, bool _isL1, address _administrator, address _link) CCIPReceiver(_router) Ownable(msg.sender) {
        isL1 = _isL1;
        administrator = _administrator;
        link = _link;
    }

    modifier onlyAdmin() {
        require(IRole(administrator).hasRole(Constants.ADMIN_ROLE, msg.sender), "!admin");
        _;
    }

    modifier notBlacklisted(address user) {
        require(!IBlackList(administrator).isBlackListed(user), "blacklisted");
        _;
    }

    modifier notPaused() {
        require(!IPausable(administrator).isPaused(address(this)), "paused");
        _;
    }

    function setAdministrator(address _administrator) external onlyOwner {
        require(Common.isContract(_administrator), "!address");
        administrator = _administrator;
        emit SetAdministrator(msg.sender, _administrator);
    }

    function setLockbox(address _ytoken, address _lockbox) external onlyAdmin {
        require(Common.isContract(_ytoken), "!token");
        require(Common.isContract(_lockbox), "!lockbox");
        lockboxes[_ytoken] = _lockbox;
        emit SetLockbox(msg.sender, _ytoken, _lockbox);
    }

    function setManager(address _manager) external onlyAdmin {
        require(Common.isContract(_manager), "!manager");
        manager = _manager;
        emit ManagerSet(msg.sender, _manager);
    }

    function setTokens(address _srcToken, uint64[] calldata _dstIds, address[] calldata _tokens) external onlyAdmin {
        require(_srcToken != address(0), "!src token");
        require(_dstIds.length == _tokens.length, "!length");
        for (uint256 i = 0; i < _dstIds.length; ) {
            require(_tokens[i] != address(0), "!token");
            tokens[_srcToken][_dstIds[i]] = _tokens[i];
            emit SetToken(msg.sender, _dstIds[i], _tokens[i]);

            unchecked {
                ++i;
            }
        }
    }

    /**
     * @notice Set allowed peers for a source chain
     * @param _peerChainId The peer chain id
     * @param _peer The peer
     * @param _allowed Whether the peer is allowed
     * @dev To ensure that messages can only be sent to allowed peers and received from allowed peers
     */
    function setAllowedPeers(uint64 _peerChainId, address _peer, bool _allowed) external onlyAdmin {
        allowedPeers[_peerChainId][_peer] = _allowed;
    }

    function quote(uint64 _dstChainId, address _receiver, bytes calldata _payload, Client.GenericExtraArgsV2 memory _extraArgs, PayFeesIn _payFeesIn) public view returns (uint256) {
        // setting allowOutOfOrderExecution to true to ensure that funds are not locked on chains which require it to be true
        _extraArgs.allowOutOfOrderExecution = true;
        // Sends the message to the destination endpoint
        Client.EVM2AnyMessage memory evm2AnyMessage = Client.EVM2AnyMessage({
            receiver: abi.encode(_receiver), // ABI-encoded receiver address
            data: abi.encode(_payload), // ABI-encoded string
            tokenAmounts: new Client.EVMTokenAmount[](0), // Empty array indicating no tokens are being sent
            extraArgs: Client._argsToBytes(_extraArgs),
            feeToken: _payFeesIn == PayFeesIn.LINK ? link : address(0) // For msg.value
        });

        // Get the fee required to send the message
        uint256 fees = IRouterClient(i_ccipRouter).getFee(_dstChainId, evm2AnyMessage);

        return fees;
    }

    function send(address _yToken, uint64 _dstChain, address _to, uint256 _amount, address _receiver, Client.GenericExtraArgsV2 memory _extraArgs, PayFeesIn _payFeesIn) external payable notBlacklisted(msg.sender) notBlacklisted(_to) notPaused {
        require(_amount > 0, "!amount");
        require(lockboxes[_yToken] != address(0), "!token !lockbox");
        require(IERC20(_yToken).balanceOf(msg.sender) >= _amount, "!balance");
        require(_to != address(0), "!receiver");
        require(tokens[_yToken][_dstChain] != address(0), "!destination");
        require(allowedPeers[_dstChain][_receiver], "!allowed");
        bytes memory _encodedMessage = abi.encode(_dstChain, _to, tokens[_yToken][_dstChain], _amount, Constants.BRIDGE_SEND_HASH);
        // setting allowOutOfOrderExecution to true to ensure that funds are not locked on chains which require it to be true
        _extraArgs.allowOutOfOrderExecution = true;

        // Sends the message to the destination endpoint
        Client.EVM2AnyMessage memory evm2AnyMessage = Client.EVM2AnyMessage({
            receiver: abi.encode(_receiver), // ABI-encoded receiver address
            data: abi.encode(_encodedMessage), // ABI-encoded string
            tokenAmounts: new Client.EVMTokenAmount[](0), // Empty array indicating no tokens are being sent
            extraArgs: Client._argsToBytes(_extraArgs),
            feeToken: _payFeesIn == PayFeesIn.LINK ? link : address(0) // For msg.value
        });

        // Get the fee required to send the message
        uint256 fees = IRouterClient(i_ccipRouter).getFee(_dstChain, evm2AnyMessage);


        // Transfer or burn tokens
        if (isL1) {
            // Lock the tokens in lockbox
            IERC20(_yToken).safeTransferFrom(msg.sender, lockboxes[_yToken], _amount);
            emit ILockBox.Lock(msg.sender, _yToken, msg.sender, _amount);
        } else {
            // Create manageAssetAndShares struct with isMint = false and updateAsset = false
            // as bridging does not need to update asset amount on L2
            ManageAssetAndShares memory manageAssetAndShares = ManageAssetAndShares({ yToken: _yToken, shares: _amount, assetAmount: 0, updateAsset: false, isMint: false, isNewYToken: false });
            // call manageAssetAndShares
            IManager(manager).manageAssetAndShares(msg.sender, manageAssetAndShares);
        }

        bytes32 messageId;
        if (_payFeesIn == PayFeesIn.LINK) {
            // transfer from msg.sender to this contract
            LinkTokenInterface(link).transferFrom(msg.sender,address(this),fees);
            // approve the router to spend the link
            LinkTokenInterface(link).approve(i_ccipRouter, fees);
            messageId = IRouterClient(i_ccipRouter).ccipSend(_dstChain, evm2AnyMessage);
        } else {
            messageId = IRouterClient(i_ccipRouter).ccipSend{value: fees}(_dstChain, evm2AnyMessage);
        }
        emit MessageSent(messageId);
    }

    /// handle a received message
    function _ccipReceive(Client.Any2EVMMessage memory any2EvmMessage) internal override {
        bytes memory message = abi.decode(any2EvmMessage.data, (bytes)); // abi-decoding of the sent text
        BridgeSendPayload memory payload = Codec.decodeBridgeSendPayload(message);
        bytes32 _hash = keccak256(abi.encode(message, any2EvmMessage.messageId));
        require(!processedMessages[_hash], "processed");
        address sender = abi.decode(any2EvmMessage.sender, (address));
        require(allowedPeers[any2EvmMessage.sourceChainSelector][sender], "!allowed");

        processedMessages[_hash] = true;

        require(payload.amount > 0, "!amount");

        if (isL1) {
            require(lockboxes[payload.token] != address(0), "!token !lockbox");
            ILockBox(lockboxes[payload.token]).unlock(payload.token, payload.to, payload.amount);
        } else {
            // Create manageAssetAndShares struct with isMint = true and updateAsset = false
            // as bridging does not need to update asset amount on L2
            ManageAssetAndShares memory manageAssetAndShares = ManageAssetAndShares({ yToken: payload.token, shares: payload.amount, assetAmount: 0, updateAsset: false, isMint: true, isNewYToken: false });
            // call manageAssetAndShares
            IManager(manager).manageAssetAndShares(payload.to, manageAssetAndShares);
        }
    }
}

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.4;

import {IAny2EVMMessageReceiver} from "../interfaces/IAny2EVMMessageReceiver.sol";

import {Client} from "../libraries/Client.sol";

import {IERC165} from "../../vendor/openzeppelin-solidity/v5.0.2/contracts/utils/introspection/IERC165.sol";

/// @title CCIPReceiver - Base contract for CCIP applications that can receive messages.
abstract contract CCIPReceiver is IAny2EVMMessageReceiver, IERC165 {
  address internal immutable i_ccipRouter;

  constructor(
    address router
  ) {
    if (router == address(0)) revert InvalidRouter(address(0));
    i_ccipRouter = router;
  }

  /// @notice IERC165 supports an interfaceId.
  /// @param interfaceId The interfaceId to check.
  /// @return true if the interfaceId is supported.
  /// @dev Should indicate whether the contract implements IAny2EVMMessageReceiver.
  /// e.g. return interfaceId == type(IAny2EVMMessageReceiver).interfaceId || interfaceId == type(IERC165).interfaceId
  /// This allows CCIP to check if ccipReceive is available before calling it.
  /// - If this returns false or reverts, only tokens are transferred to the receiver.
  /// - If this returns true, tokens are transferred and ccipReceive is called atomically.
  /// Additionally, if the receiver address does not have code associated with it at the time of
  /// execution (EXTCODESIZE returns 0), only tokens will be transferred.
  function supportsInterface(
    bytes4 interfaceId
  ) public view virtual override returns (bool) {
    return interfaceId == type(IAny2EVMMessageReceiver).interfaceId || interfaceId == type(IERC165).interfaceId;
  }

  /// @inheritdoc IAny2EVMMessageReceiver
  function ccipReceive(
    Client.Any2EVMMessage calldata message
  ) external virtual override onlyRouter {
    _ccipReceive(message);
  }

  /// @notice Override this function in your implementation.
  /// @param message Any2EVMMessage.
  function _ccipReceive(
    Client.Any2EVMMessage memory message
  ) internal virtual;

  /// @notice Return the current router
  /// @return CCIP router address
  function getRouter() public view virtual returns (address) {
    return address(i_ccipRouter);
  }

  error InvalidRouter(address router);

  /// @dev only calls from the set router are accepted.
  modifier onlyRouter() {
    if (msg.sender != getRouter()) revert InvalidRouter(msg.sender);
    _;
  }
}

File 3 of 23 : IAny2EVMMessageReceiver.sol
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;

import {Client} from "../libraries/Client.sol";

/// @notice Application contracts that intend to receive messages from  the router should implement this interface.
interface IAny2EVMMessageReceiver {
  /// @notice Called by the Router to deliver a message. If this reverts, any token transfers also revert.
  /// The message will move to a FAILED state and become available for manual execution.
  /// @param message CCIP Message.
  /// @dev Note ensure you check the msg.sender is the OffRampRouter.
  function ccipReceive(
    Client.Any2EVMMessage calldata message
  ) external;
}

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.4;

import {Client} from "../libraries/Client.sol";

interface IRouterClient {
  error UnsupportedDestinationChain(uint64 destChainSelector);
  error InsufficientFeeTokenAmount();
  error InvalidMsgValue();

  /// @notice Checks if the given chain ID is supported for sending/receiving.
  /// @param destChainSelector The chain to check.
  /// @return supported is true if it is supported, false if not.
  function isChainSupported(
    uint64 destChainSelector
  ) external view returns (bool supported);

  /// @param destinationChainSelector The destination chainSelector.
  /// @param message The cross-chain CCIP message including data and/or tokens.
  /// @return fee returns execution fee for the message.
  /// delivery to destination chain, denominated in the feeToken specified in the message.
  /// @dev Reverts with appropriate reason upon invalid message.
  function getFee(
    uint64 destinationChainSelector,
    Client.EVM2AnyMessage memory message
  ) external view returns (uint256 fee);

  /// @notice Request a message to be sent to the destination chain.
  /// @param destinationChainSelector The destination chain ID.
  /// @param message The cross-chain CCIP message including data and/or tokens.
  /// @return messageId The message ID.
  /// @dev Note if msg.value is larger than the required fee (from getFee) we accept.
  /// the overpayment with no refund.
  /// @dev Reverts with appropriate reason upon invalid message.
  function ccipSend(
    uint64 destinationChainSelector,
    Client.EVM2AnyMessage calldata message
  ) external payable returns (bytes32);
}

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;

// End consumer library.
library Client {
  struct EVMTokenAmount {
    address token; // token address on the local chain.
    uint256 amount; // Amount of tokens.
  }

  struct Any2EVMMessage {
    bytes32 messageId; // MessageId corresponding to ccipSend on source.
    uint64 sourceChainSelector; // Source chain selector.
    bytes sender; // abi.decode(sender) if coming from an EVM chain.
    bytes data; // payload sent in original message.
    EVMTokenAmount[] destTokenAmounts; // Tokens and their amounts in their destination chain representation.
  }

  // If extraArgs is empty bytes, the default is 200k gas limit.
  struct EVM2AnyMessage {
    bytes receiver; // abi.encode(receiver address) for dest EVM chains.
    bytes data; // Data payload.
    EVMTokenAmount[] tokenAmounts; // Token transfers.
    address feeToken; // Address of feeToken. address(0) means you will send msg.value.
    bytes extraArgs; // Populate this with _argsToBytes(EVMExtraArgsV2).
  }

  // Tag to indicate only a gas limit. Only usable for EVM as destination chain.
  bytes4 public constant EVM_EXTRA_ARGS_V1_TAG = 0x97a657c9;

  struct EVMExtraArgsV1 {
    uint256 gasLimit;
  }

  function _argsToBytes(
    EVMExtraArgsV1 memory extraArgs
  ) internal pure returns (bytes memory bts) {
    return abi.encodeWithSelector(EVM_EXTRA_ARGS_V1_TAG, extraArgs);
  }

  // Tag to indicate a gas limit (or dest chain equivalent processing units) and Out Of Order Execution. This tag is
  // available for multiple chain families. If there is no chain family specific tag, this is the default available
  // for a chain.
  // Note: not available for Solana VM based chains.
  bytes4 public constant GENERIC_EXTRA_ARGS_V2_TAG = 0x181dcf10;

  /// @param gasLimit: gas limit for the callback on the destination chain.
  /// @param allowOutOfOrderExecution: if true, it indicates that the message can be executed in any order relative to
  /// other messages from the same sender. This value's default varies by chain. On some chains, a particular value is
  /// enforced, meaning if the expected value is not set, the message request will revert.
  /// @dev Fully compatible with the previously existing EVMExtraArgsV2.
  struct GenericExtraArgsV2 {
    uint256 gasLimit;
    bool allowOutOfOrderExecution;
  }

  // Extra args tag for chains that use the Solana VM.
  bytes4 public constant SVM_EXTRA_ARGS_V1_TAG = 0x1f3b3aba;

  struct SVMExtraArgsV1 {
    uint32 computeUnits;
    uint64 accountIsWritableBitmap;
    bool allowOutOfOrderExecution;
    bytes32 tokenReceiver;
    bytes32[] accounts;
  }

  /// @dev The maximum number of accounts that can be passed in SVMExtraArgs.
  uint256 public constant SVM_EXTRA_ARGS_MAX_ACCOUNTS = 64;

  function _argsToBytes(
    GenericExtraArgsV2 memory extraArgs
  ) internal pure returns (bytes memory bts) {
    return abi.encodeWithSelector(GENERIC_EXTRA_ARGS_V2_TAG, extraArgs);
  }

  function _svmArgsToBytes(
    SVMExtraArgsV1 memory extraArgs
  ) internal pure returns (bytes memory bts) {
    return abi.encodeWithSelector(SVM_EXTRA_ARGS_V1_TAG, extraArgs);
  }
}

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;

// solhint-disable-next-line interface-starts-with-i
interface LinkTokenInterface {
  function allowance(address owner, address spender) external view returns (uint256 remaining);

  function approve(address spender, uint256 value) external returns (bool success);

  function balanceOf(address owner) external view returns (uint256 balance);

  function decimals() external view returns (uint8 decimalPlaces);

  function decreaseApproval(address spender, uint256 addedValue) external returns (bool success);

  function increaseApproval(address spender, uint256 subtractedValue) external;

  function name() external view returns (string memory tokenName);

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

  function totalSupply() external view returns (uint256 totalTokensIssued);

  function transfer(address to, uint256 value) external returns (bool success);

  function transferAndCall(address to, uint256 value, bytes calldata data) external returns (bool success);

  function transferFrom(address from, address to, uint256 value) external returns (bool success);
}

// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v5.0.0) (utils/introspection/IERC165.sol)

pragma solidity ^0.8.20;

/**
 * @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);
}

// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v5.0.0) (access/Ownable.sol)

pragma solidity ^0.8.20;

import {Context} from "../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.
 *
 * The initial owner is set to the address provided by the deployer. 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;

    /**
     * @dev The caller account is not authorized to perform an operation.
     */
    error OwnableUnauthorizedAccount(address account);

    /**
     * @dev The owner is not a valid owner account. (eg. `address(0)`)
     */
    error OwnableInvalidOwner(address owner);

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

    /**
     * @dev Initializes the contract setting the address provided by the deployer as the initial owner.
     */
    constructor(address initialOwner) {
        if (initialOwner == address(0)) {
            revert OwnableInvalidOwner(address(0));
        }
        _transferOwnership(initialOwner);
    }

    /**
     * @dev Throws if called by any account other than the owner.
     */
    modifier onlyOwner() {
        _checkOwner();
        _;
    }

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

    /**
     * @dev Throws if the sender is not the owner.
     */
    function _checkOwner() internal view virtual {
        if (owner() != _msgSender()) {
            revert OwnableUnauthorizedAccount(_msgSender());
        }
    }

    /**
     * @dev Leaves the contract without owner. It will not be possible to call
     * `onlyOwner` functions. Can only be called by the current owner.
     *
     * NOTE: Renouncing ownership will leave the contract without an owner,
     * thereby disabling any functionality that is only available to the owner.
     */
    function renounceOwnership() public virtual onlyOwner {
        _transferOwnership(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 {
        if (newOwner == address(0)) {
            revert OwnableInvalidOwner(address(0));
        }
        _transferOwnership(newOwner);
    }

    /**
     * @dev Transfers ownership of the contract to a new account (`newOwner`).
     * Internal function without access restriction.
     */
    function _transferOwnership(address newOwner) internal virtual {
        address oldOwner = _owner;
        _owner = newOwner;
        emit OwnershipTransferred(oldOwner, newOwner);
    }
}

// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v5.1.0) (interfaces/IERC1363.sol)

pragma solidity ^0.8.20;

import {IERC20} from "./IERC20.sol";
import {IERC165} from "./IERC165.sol";

/**
 * @title IERC1363
 * @dev Interface of the ERC-1363 standard as defined in the https://eips.ethereum.org/EIPS/eip-1363[ERC-1363].
 *
 * Defines an extension interface for ERC-20 tokens that supports executing code on a recipient contract
 * after `transfer` or `transferFrom`, or code on a spender contract after `approve`, in a single transaction.
 */
interface IERC1363 is IERC20, IERC165 {
    /*
     * Note: the ERC-165 identifier for this interface is 0xb0202a11.
     * 0xb0202a11 ===
     *   bytes4(keccak256('transferAndCall(address,uint256)')) ^
     *   bytes4(keccak256('transferAndCall(address,uint256,bytes)')) ^
     *   bytes4(keccak256('transferFromAndCall(address,address,uint256)')) ^
     *   bytes4(keccak256('transferFromAndCall(address,address,uint256,bytes)')) ^
     *   bytes4(keccak256('approveAndCall(address,uint256)')) ^
     *   bytes4(keccak256('approveAndCall(address,uint256,bytes)'))
     */

    /**
     * @dev Moves a `value` amount of tokens from the caller's account to `to`
     * and then calls {IERC1363Receiver-onTransferReceived} on `to`.
     * @param to The address which you want to transfer to.
     * @param value The amount of tokens to be transferred.
     * @return A boolean value indicating whether the operation succeeded unless throwing.
     */
    function transferAndCall(address to, uint256 value) external returns (bool);

    /**
     * @dev Moves a `value` amount of tokens from the caller's account to `to`
     * and then calls {IERC1363Receiver-onTransferReceived} on `to`.
     * @param to The address which you want to transfer to.
     * @param value The amount of tokens to be transferred.
     * @param data Additional data with no specified format, sent in call to `to`.
     * @return A boolean value indicating whether the operation succeeded unless throwing.
     */
    function transferAndCall(address to, uint256 value, bytes calldata data) external returns (bool);

    /**
     * @dev Moves a `value` amount of tokens from `from` to `to` using the allowance mechanism
     * and then calls {IERC1363Receiver-onTransferReceived} on `to`.
     * @param from The address which you want to send tokens from.
     * @param to The address which you want to transfer to.
     * @param value The amount of tokens to be transferred.
     * @return A boolean value indicating whether the operation succeeded unless throwing.
     */
    function transferFromAndCall(address from, address to, uint256 value) external returns (bool);

    /**
     * @dev Moves a `value` amount of tokens from `from` to `to` using the allowance mechanism
     * and then calls {IERC1363Receiver-onTransferReceived} on `to`.
     * @param from The address which you want to send tokens from.
     * @param to The address which you want to transfer to.
     * @param value The amount of tokens to be transferred.
     * @param data Additional data with no specified format, sent in call to `to`.
     * @return A boolean value indicating whether the operation succeeded unless throwing.
     */
    function transferFromAndCall(address from, address to, uint256 value, bytes calldata data) external returns (bool);

    /**
     * @dev Sets a `value` amount of tokens as the allowance of `spender` over the
     * caller's tokens and then calls {IERC1363Spender-onApprovalReceived} on `spender`.
     * @param spender The address which will spend the funds.
     * @param value The amount of tokens to be spent.
     * @return A boolean value indicating whether the operation succeeded unless throwing.
     */
    function approveAndCall(address spender, uint256 value) external returns (bool);

    /**
     * @dev Sets a `value` amount of tokens as the allowance of `spender` over the
     * caller's tokens and then calls {IERC1363Spender-onApprovalReceived} on `spender`.
     * @param spender The address which will spend the funds.
     * @param value The amount of tokens to be spent.
     * @param data Additional data with no specified format, sent in call to `spender`.
     * @return A boolean value indicating whether the operation succeeded unless throwing.
     */
    function approveAndCall(address spender, uint256 value, bytes calldata data) external returns (bool);
}

File 10 of 23 : IERC165.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v5.0.0) (interfaces/IERC165.sol)

pragma solidity ^0.8.20;

import {IERC165} from "../utils/introspection/IERC165.sol";

File 11 of 23 : IERC20.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v5.0.0) (interfaces/IERC20.sol)

pragma solidity ^0.8.20;

import {IERC20} from "../token/ERC20/IERC20.sol";

// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v5.1.0) (token/ERC20/IERC20.sol)

pragma solidity ^0.8.20;

/**
 * @dev Interface of the ERC-20 standard as defined in the ERC.
 */
interface IERC20 {
    /**
     * @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);

    /**
     * @dev Returns the value of tokens in existence.
     */
    function totalSupply() external view returns (uint256);

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

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

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

// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v5.3.0) (token/ERC20/utils/SafeERC20.sol)

pragma solidity ^0.8.20;

import {IERC20} from "../IERC20.sol";
import {IERC1363} from "../../../interfaces/IERC1363.sol";

/**
 * @title SafeERC20
 * @dev Wrappers around ERC-20 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 {
    /**
     * @dev An operation with an ERC-20 token failed.
     */
    error SafeERC20FailedOperation(address token);

    /**
     * @dev Indicates a failed `decreaseAllowance` request.
     */
    error SafeERC20FailedDecreaseAllowance(address spender, uint256 currentAllowance, uint256 requestedDecrease);

    /**
     * @dev Transfer `value` amount of `token` from the calling contract to `to`. If `token` returns no value,
     * non-reverting calls are assumed to be successful.
     */
    function safeTransfer(IERC20 token, address to, uint256 value) internal {
        _callOptionalReturn(token, abi.encodeCall(token.transfer, (to, value)));
    }

    /**
     * @dev Transfer `value` amount of `token` from `from` to `to`, spending the approval given by `from` to the
     * calling contract. If `token` returns no value, non-reverting calls are assumed to be successful.
     */
    function safeTransferFrom(IERC20 token, address from, address to, uint256 value) internal {
        _callOptionalReturn(token, abi.encodeCall(token.transferFrom, (from, to, value)));
    }

    /**
     * @dev Variant of {safeTransfer} that returns a bool instead of reverting if the operation is not successful.
     */
    function trySafeTransfer(IERC20 token, address to, uint256 value) internal returns (bool) {
        return _callOptionalReturnBool(token, abi.encodeCall(token.transfer, (to, value)));
    }

    /**
     * @dev Variant of {safeTransferFrom} that returns a bool instead of reverting if the operation is not successful.
     */
    function trySafeTransferFrom(IERC20 token, address from, address to, uint256 value) internal returns (bool) {
        return _callOptionalReturnBool(token, abi.encodeCall(token.transferFrom, (from, to, value)));
    }

    /**
     * @dev Increase the calling contract's allowance toward `spender` by `value`. If `token` returns no value,
     * non-reverting calls are assumed to be successful.
     *
     * IMPORTANT: If the token implements ERC-7674 (ERC-20 with temporary allowance), and if the "client"
     * smart contract uses ERC-7674 to set temporary allowances, then the "client" smart contract should avoid using
     * this function. Performing a {safeIncreaseAllowance} or {safeDecreaseAllowance} operation on a token contract
     * that has a non-zero temporary allowance (for that particular owner-spender) will result in unexpected behavior.
     */
    function safeIncreaseAllowance(IERC20 token, address spender, uint256 value) internal {
        uint256 oldAllowance = token.allowance(address(this), spender);
        forceApprove(token, spender, oldAllowance + value);
    }

    /**
     * @dev Decrease the calling contract's allowance toward `spender` by `requestedDecrease`. If `token` returns no
     * value, non-reverting calls are assumed to be successful.
     *
     * IMPORTANT: If the token implements ERC-7674 (ERC-20 with temporary allowance), and if the "client"
     * smart contract uses ERC-7674 to set temporary allowances, then the "client" smart contract should avoid using
     * this function. Performing a {safeIncreaseAllowance} or {safeDecreaseAllowance} operation on a token contract
     * that has a non-zero temporary allowance (for that particular owner-spender) will result in unexpected behavior.
     */
    function safeDecreaseAllowance(IERC20 token, address spender, uint256 requestedDecrease) internal {
        unchecked {
            uint256 currentAllowance = token.allowance(address(this), spender);
            if (currentAllowance < requestedDecrease) {
                revert SafeERC20FailedDecreaseAllowance(spender, currentAllowance, requestedDecrease);
            }
            forceApprove(token, spender, currentAllowance - requestedDecrease);
        }
    }

    /**
     * @dev Set the calling contract's allowance toward `spender` to `value`. If `token` returns no value,
     * non-reverting calls are assumed to be successful. Meant to be used with tokens that require the approval
     * to be set to zero before setting it to a non-zero value, such as USDT.
     *
     * NOTE: If the token implements ERC-7674, this function will not modify any temporary allowance. This function
     * only sets the "standard" allowance. Any temporary allowance will remain active, in addition to the value being
     * set here.
     */
    function forceApprove(IERC20 token, address spender, uint256 value) internal {
        bytes memory approvalCall = abi.encodeCall(token.approve, (spender, value));

        if (!_callOptionalReturnBool(token, approvalCall)) {
            _callOptionalReturn(token, abi.encodeCall(token.approve, (spender, 0)));
            _callOptionalReturn(token, approvalCall);
        }
    }

    /**
     * @dev Performs an {ERC1363} transferAndCall, with a fallback to the simple {ERC20} transfer if the target has no
     * code. This can be used to implement an {ERC721}-like safe transfer that rely on {ERC1363} checks when
     * targeting contracts.
     *
     * Reverts if the returned value is other than `true`.
     */
    function transferAndCallRelaxed(IERC1363 token, address to, uint256 value, bytes memory data) internal {
        if (to.code.length == 0) {
            safeTransfer(token, to, value);
        } else if (!token.transferAndCall(to, value, data)) {
            revert SafeERC20FailedOperation(address(token));
        }
    }

    /**
     * @dev Performs an {ERC1363} transferFromAndCall, with a fallback to the simple {ERC20} transferFrom if the target
     * has no code. This can be used to implement an {ERC721}-like safe transfer that rely on {ERC1363} checks when
     * targeting contracts.
     *
     * Reverts if the returned value is other than `true`.
     */
    function transferFromAndCallRelaxed(
        IERC1363 token,
        address from,
        address to,
        uint256 value,
        bytes memory data
    ) internal {
        if (to.code.length == 0) {
            safeTransferFrom(token, from, to, value);
        } else if (!token.transferFromAndCall(from, to, value, data)) {
            revert SafeERC20FailedOperation(address(token));
        }
    }

    /**
     * @dev Performs an {ERC1363} approveAndCall, with a fallback to the simple {ERC20} approve if the target has no
     * code. This can be used to implement an {ERC721}-like safe transfer that rely on {ERC1363} checks when
     * targeting contracts.
     *
     * NOTE: When the recipient address (`to`) has no code (i.e. is an EOA), this function behaves as {forceApprove}.
     * Opposedly, when the recipient address (`to`) has code, this function only attempts to call {ERC1363-approveAndCall}
     * once without retrying, and relies on the returned value to be true.
     *
     * Reverts if the returned value is other than `true`.
     */
    function approveAndCallRelaxed(IERC1363 token, address to, uint256 value, bytes memory data) internal {
        if (to.code.length == 0) {
            forceApprove(token, to, value);
        } else if (!token.approveAndCall(to, value, data)) {
            revert SafeERC20FailedOperation(address(token));
        }
    }

    /**
     * @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).
     *
     * This is a variant of {_callOptionalReturnBool} that reverts if call fails to meet the requirements.
     */
    function _callOptionalReturn(IERC20 token, bytes memory data) private {
        uint256 returnSize;
        uint256 returnValue;
        assembly ("memory-safe") {
            let success := call(gas(), token, 0, add(data, 0x20), mload(data), 0, 0x20)
            // bubble errors
            if iszero(success) {
                let ptr := mload(0x40)
                returndatacopy(ptr, 0, returndatasize())
                revert(ptr, returndatasize())
            }
            returnSize := returndatasize()
            returnValue := mload(0)
        }

        if (returnSize == 0 ? address(token).code.length == 0 : returnValue != 1) {
            revert SafeERC20FailedOperation(address(token));
        }
    }

    /**
     * @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).
     *
     * This is a variant of {_callOptionalReturn} that silently catches all reverts and returns a bool instead.
     */
    function _callOptionalReturnBool(IERC20 token, bytes memory data) private returns (bool) {
        bool success;
        uint256 returnSize;
        uint256 returnValue;
        assembly ("memory-safe") {
            success := call(gas(), token, 0, add(data, 0x20), mload(data), 0, 0x20)
            returnSize := returndatasize()
            returnValue := mload(0)
        }
        return success && (returnSize == 0 ? address(token).code.length > 0 : returnValue == 1);
    }
}

// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v5.0.1) (utils/Context.sol)

pragma solidity ^0.8.20;

/**
 * @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;
    }

    function _contextSuffixLength() internal view virtual returns (uint256) {
        return 0;
    }
}

// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v5.1.0) (utils/introspection/IERC165.sol)

pragma solidity ^0.8.20;

/**
 * @dev Interface of the ERC-165 standard, as defined in the
 * https://eips.ethereum.org/EIPS/eip-165[ERC].
 *
 * 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[ERC 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);
}

// SPDX-License-Identifier: GPL-2.0
pragma solidity ^0.8.20;

interface IBlackList {
    //functions
    function blackListUsers(address[] calldata _users) external;
    function removeBlackListUsers(address[] calldata _clearedUsers) external;
    function isBlackListed(address _user) external view returns (bool);

    //events
    event BlackListed(address indexed _sender, address indexed _user);
    event BlackListCleared(address indexed _sender, address indexed _user);
}

// SPDX-License-Identifier: GPL-2.0
pragma solidity ^0.8.20;

interface IPausable {
    function pause() external;
    function unpause() external;
    function pauseSC(address _sc) external;
    function unpauseSC(address _sc) external;
    function isPaused(address _sc) external view returns (bool);

    //events
    event Paused(address indexed _sender);
    event Unpaused(address indexed _sender);
    event Paused(address indexed _sender, address indexed _sc);
    event Unpaused(address indexed _sender, address indexed _sc);
}

// SPDX-License-Identifier: GPL-2.0
pragma solidity ^0.8.20;

interface IRole {
    //functions
    function grantRoles(bytes32 _role, address[] calldata _accounts) external;
    function revokeRoles(bytes32 _role, address[] calldata _accounts) external;
    function hasRole(bytes32 _role, address _account) external view returns (bool);
    function hasRoles(bytes32[] calldata _role, address[] calldata _accounts) external view returns (bool[] memory);

    //events
    event RoleGranted(bytes32 indexed _role, address indexed _sender, address indexed _account);
    event RoleRevoked(bytes32 indexed _role, address indexed _sender, address indexed _account);
}

// SPDX-License-Identifier: GPL-2.0
pragma solidity ^0.8.20;

interface ILockBox {
    // functions
    function unlock(address token, address to, uint256 amount) external;

    // events
    event Sync(address indexed caller, address indexed token, uint256 shares, uint256 sAmount, bool syncType);
    event Unlock(address indexed caller, address indexed token, address indexed to, uint256 amount);
    event Lock(address indexed caller, address indexed token, address indexed from, uint256 amount);
    event ManagerSet(address indexed caller, address indexed manager);
}

// SPDX-License-Identifier: GPL-2.0
pragma solidity ^0.8.20;

/**
 * @notice ManageAssetAndShares is used to manage the asset and shares of the yToken
 * @param yToken The address of the yToken
 * @param shares The number of shares to manage
 * @param assetAmount The amount of asset to manage
 * @param updateAsset Whether to update the asset
 * @param isMint Whether to mint or burn the yToken
 * @param isNewYToken Whether the yToken is new, only utilised in vyToken and vyTokenL2 whenever asset from outside of 
        YieldFi is deposited into the protocol (i.e during deposits and yield distribution)
  */
struct ManageAssetAndShares {
    address yToken;
    uint256 shares;
    uint256 assetAmount;
    bool updateAsset;
    bool isMint;
    bool isNewYToken;
}
interface IManager {
    event Deposit(address indexed caller, address indexed asset, uint256 amount, address indexed receiver, address yToken, uint256 shares, uint256 feeShare, uint256 gasFeeShare);
    event Withdraw(address indexed caller, address indexed asset, uint256 amount, address indexed receiver, address yToken, uint256 shares, uint256 feeShare, uint256 gasFeeShare);
    event Rescue(address indexed caller, address indexed token, address indexed to, uint256 amount);
    event AssetStatus(bool indexed orderType, address indexed yToken, address indexed asset, bool status);
    event OrderRequest(address caller, address indexed yToken, address indexed asset, address indexed receiver, uint256 amount, bool orderType, uint256 exchangeRateInUnderlying, uint256 receiptId, bytes32 referralCode);
    event YieldFeesTransferred(address indexed treasury, address indexed yToken, uint256 shares);
    event AssetAndShareManaged(address indexed caller, address indexed yToken, uint256 shares, uint256 assetAmount, bool updateAsset, bool isMint, bool isNewYToken);
    event TreasurySet(address indexed caller, address indexed treasury);
    event ReceiptSet(address indexed caller, address indexed receipt);
    event CustodyWalletSet(address indexed caller, address indexed wallet, bool status);
    event MinSharesInYTokenSet(address indexed caller, address indexed yToken, uint256 minShares);
    event MaxRedeemCapSet(address indexed caller, address indexed yToken, uint256 maxRedeemCap);
    event InstantRedeem(address caller, address indexed yToken, address indexed asset, address indexed receiver, uint256 amount);

    function deposit(address _yToken, address _asset, uint256 _amount, address _receiver, address _callback, bytes calldata _callbackData, bytes32 _referralCode) external;
    function redeem(address caller, address _yToken, address _asset, uint256 _shares, address _receiver, address _callback, bytes calldata _callbackData) external;
    function executeOrder(uint256 _receiptId, uint256 _amount, uint256 _fee, uint256 _gas) external;
    function transferToCustodyWallet(address _token, address _receiver, uint256 _amount) external;
    function treasury() external view returns (address);
    function manageAssetAndShares(address _to, ManageAssetAndShares memory _manageAssetAndShares) external;
    function minSharesInYToken(address _yToken) external view returns (uint256);
}

// SPDX-License-Identifier: GPL-2.0
pragma solidity ^0.8.20;

import { Common } from "./Common.sol";
import { Constants } from "./Constants.sol";

struct BridgeSendPayload {
    uint64 dstId;
    address to;
    address token;
    uint256 amount;
    bytes32 trxnType;
}

error WrongDataLength();
error WrongAddressEncoding();
error WrongData();

library Codec {
    uint256 internal constant DATA_LENGTH = 32 * 5;
    
    /**
     * @notice Decode a bridge send payload from bytes
     * @param _data encoded payload data
     * @return Decoded BridgeSendPayload struct
     */
    function decodeBridgeSendPayload(bytes memory _data) internal view returns (BridgeSendPayload memory) {
        if (_data.length != DATA_LENGTH) {
            revert WrongDataLength();
        }

        (uint64 dstId, address to, address token, uint256 amount, bytes32 trxnType) = abi.decode(_data, (uint64, address, address, uint256, bytes32));

        if (trxnType != Constants.BRIDGE_SEND_HASH) {
            revert WrongData();
        }
        if (dstId == 0) {
            revert WrongData();
        }
        if (to == address(0)) {
            revert WrongAddressEncoding();
        }
        if (token == address(0) || !Common.isContract(token)) {
            revert WrongAddressEncoding();
        }
        if (amount == 0) {
            revert WrongData();
        }

        return BridgeSendPayload(dstId, to, token, amount, trxnType);
    }
}

// SPDX-License-Identifier: GPL-2.0
pragma solidity ^0.8.20;

library Common {
    /**
     * @notice Check if an address is a contract
     * @param _addr address to check
     * @return true if the address is a contract, false otherwise
     */
    function isContract(address _addr) internal view returns (bool) {
        return _addr != address(0) && _addr.code.length != 0;
    }
}

File 23 of 23 : Constants.sol
// SPDX-License-Identifier: GPL-2.0
pragma solidity ^0.8.20;

library Constants {
    // admin role
    bytes32 public constant ADMIN_ROLE = keccak256("ADMIN");

    // role for minting and redeeming tokens
    bytes32 public constant MINTER_AND_REDEEMER_ROLE = keccak256("MINTER_AND_REDEEMER");

    // role for collateral manager who can transfer collateral
    bytes32 public constant COLLATERAL_MANAGER_ROLE = keccak256("COLLATERAL_MANAGER");

    // role for rewarder who can transfer reward
    bytes32 public constant REWARDER_ROLE = keccak256("REWARDER");

    // role for managing blacklist addresses
    bytes32 public constant MANAGER_ROLE = keccak256("MANAGER");

    // role assigned to bridges
    bytes32 public constant BRIDGE_ROLE = keccak256("BRIDGE");

    // role for perpetual bond
    bytes32 public constant BOND_ROLE = keccak256("BOND");

    // role for lockbox
    bytes32 public constant LOCKBOX_ROLE = keccak256("LOCKBOX");

    // role for yield
    bytes32 public constant YIELD_ROLE = keccak256("YIELD");

    uint256 constant PINT = 1e18;
    uint256 constant HUNDRED_PERCENT = 100e18;
    uint256 constant ONE_PERCENT = 1e18;
    uint256 constant HUNDRED = 100;

    // Period for vesting strategy rewards
    uint256 constant VESTING_PERIOD = 24 hours;


    // Bridge transaction types
    bytes32 public constant BRIDGE_SEND_HASH = keccak256("BRIDGE_SEND");
}

Settings
{
  "evmVersion": "cancun",
  "metadata": {
    "appendCBOR": true,
    "bytecodeHash": "ipfs",
    "useLiteralContent": false
  },
  "optimizer": {
    "enabled": true,
    "runs": 200
  },
  "outputSelection": {
    "*": {
      "*": [
        "evm.bytecode",
        "evm.deployedBytecode",
        "abi"
      ]
    }
  },
  "remappings": [
    "@layerzerolabs/oft-evm/=lib/devtools/packages/oft-evm/",
    "@layerzerolabs/oapp-evm/=lib/devtools/packages/oapp-evm/",
    "@layerzerolabs/lz-evm-protocol-v2/=lib/layerzero-v2/packages/layerzero-v2/evm/protocol/",
    "@layerzerolabs/lz-evm-messagelib-v2/=lib/layerzero-v2/packages/layerzero-v2/evm/messagelib/",
    "@openzeppelin/contracts/=lib/openzeppelin-contracts/contracts/",
    "@openzeppelin-upgradeable/contracts/=lib/openzeppelin-contracts-upgradeable/contracts/",
    "@chainlink/contracts-ccip/=lib/chainlink/contracts/",
    "@chainlink/contracts/=lib/chainlink/contracts/",
    "solidity-bytes-utils/=lib/solidity-bytes-utils/",
    "@openzeppelin/contracts-upgradeable/=lib/openzeppelin-contracts-upgradeable/contracts/",
    "chainlink/=lib/chainlink/",
    "devtools/=lib/devtools/packages/toolbox-foundry/src/",
    "ds-test/=lib/layerzero-v2/lib/forge-std/lib/ds-test/src/",
    "erc4626-tests/=lib/openzeppelin-contracts-upgradeable/lib/erc4626-tests/",
    "forge-std/=lib/forge-std/src/",
    "halmos-cheatcodes/=lib/openzeppelin-contracts-upgradeable/lib/halmos-cheatcodes/src/",
    "layerzero-v2/=lib/layerzero-v2/",
    "openzeppelin-contracts-upgradeable/=lib/openzeppelin-contracts-upgradeable/",
    "openzeppelin-contracts/=lib/openzeppelin-contracts/"
  ],
  "viaIR": true
}

Contract Security Audit

Contract ABI

API
[{"inputs":[{"internalType":"address","name":"_router","type":"address"},{"internalType":"bool","name":"_isL1","type":"bool"},{"internalType":"address","name":"_administrator","type":"address"},{"internalType":"address","name":"_link","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[{"internalType":"address","name":"router","type":"address"}],"name":"InvalidRouter","type":"error"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"OwnableInvalidOwner","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"OwnableUnauthorizedAccount","type":"error"},{"inputs":[{"internalType":"address","name":"token","type":"address"}],"name":"SafeERC20FailedOperation","type":"error"},{"inputs":[],"name":"WrongAddressEncoding","type":"error"},{"inputs":[],"name":"WrongData","type":"error"},{"inputs":[],"name":"WrongDataLength","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"caller","type":"address"},{"indexed":true,"internalType":"address","name":"token","type":"address"},{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Lock","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"caller","type":"address"},{"indexed":true,"internalType":"address","name":"manager","type":"address"}],"name":"ManagerSet","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"messageId","type":"bytes32"}],"name":"MessageSent","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"caller","type":"address"},{"indexed":true,"internalType":"address","name":"administrator","type":"address"}],"name":"SetAdministrator","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"caller","type":"address"},{"indexed":true,"internalType":"address","name":"token","type":"address"},{"indexed":true,"internalType":"address","name":"lockbox","type":"address"}],"name":"SetLockbox","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"caller","type":"address"},{"indexed":true,"internalType":"uint64","name":"dstId","type":"uint64"},{"indexed":true,"internalType":"address","name":"token","type":"address"}],"name":"SetToken","type":"event"},{"inputs":[],"name":"administrator","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint64","name":"peerChainId","type":"uint64"},{"internalType":"address","name":"peer","type":"address"}],"name":"allowedPeers","outputs":[{"internalType":"bool","name":"allowed","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"components":[{"internalType":"bytes32","name":"messageId","type":"bytes32"},{"internalType":"uint64","name":"sourceChainSelector","type":"uint64"},{"internalType":"bytes","name":"sender","type":"bytes"},{"internalType":"bytes","name":"data","type":"bytes"},{"components":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"internalType":"struct Client.EVMTokenAmount[]","name":"destTokenAmounts","type":"tuple[]"}],"internalType":"struct Client.Any2EVMMessage","name":"message","type":"tuple"}],"name":"ccipReceive","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"getRouter","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isL1","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"link","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"lockboxes","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"manager","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":"bytes32","name":"","type":"bytes32"}],"name":"processedMessages","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint64","name":"_dstChainId","type":"uint64"},{"internalType":"address","name":"_receiver","type":"address"},{"internalType":"bytes","name":"_payload","type":"bytes"},{"components":[{"internalType":"uint256","name":"gasLimit","type":"uint256"},{"internalType":"bool","name":"allowOutOfOrderExecution","type":"bool"}],"internalType":"struct Client.GenericExtraArgsV2","name":"_extraArgs","type":"tuple"},{"internalType":"enum BridgeCCIP.PayFeesIn","name":"_payFeesIn","type":"uint8"}],"name":"quote","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_yToken","type":"address"},{"internalType":"uint64","name":"_dstChain","type":"uint64"},{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"},{"internalType":"address","name":"_receiver","type":"address"},{"components":[{"internalType":"uint256","name":"gasLimit","type":"uint256"},{"internalType":"bool","name":"allowOutOfOrderExecution","type":"bool"}],"internalType":"struct Client.GenericExtraArgsV2","name":"_extraArgs","type":"tuple"},{"internalType":"enum BridgeCCIP.PayFeesIn","name":"_payFeesIn","type":"uint8"}],"name":"send","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"_administrator","type":"address"}],"name":"setAdministrator","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint64","name":"_peerChainId","type":"uint64"},{"internalType":"address","name":"_peer","type":"address"},{"internalType":"bool","name":"_allowed","type":"bool"}],"name":"setAllowedPeers","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_ytoken","type":"address"},{"internalType":"address","name":"_lockbox","type":"address"}],"name":"setLockbox","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_manager","type":"address"}],"name":"setManager","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_srcToken","type":"address"},{"internalType":"uint64[]","name":"_dstIds","type":"uint64[]"},{"internalType":"address[]","name":"_tokens","type":"address[]"}],"name":"setTokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint64","name":"","type":"uint64"}],"name":"tokens","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"}]

60e03461017a57601f61223438819003918201601f19168301916001600160401b0383118484101761017e5780849260809460405283398101031261017a5761004781610192565b602082015191821515830361017a5761006e606061006760408401610192565b9201610192565b916001600160a01b03811615610167576080523315610154575f8054336001600160a01b0319821681178355604051959290916001600160a01b0316907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09080a360a052600180546001600160a01b0319166001600160a01b039290921691909117905560c05261208d90816101a782396080518181816103a2015281816105b8015281816106dd0152611477015260a051818181610a290152818161112a01526114ce015260c05181818161054e015281816110e30152818161142201526115bb0152f35b631e4fbdf760e01b5f525f60045260245ffd5b6335fdcccd60e21b5f525f60045260245ffd5b5f80fd5b634e487b7160e01b5f52604160045260245ffd5b51906001600160a01b038216820361017a5756fe6080806040526004361015610012575f80fd5b5f905f3560e01c90816301ffc9a714611a94575080630b3f78b3146119b75780630e1c2f4e1461114f5780631974932b146111125780631c4695f4146110cd578063477db86e14611070578063481c6a75146110475780636d4e24c314610f1e578063715018a614610ec457806378ab175014610ca257806379e1ccec14610c6157806385572ffb146106aa57806388ba16ab1461067b5780638da5cb5b146106545780639726f9c41461042a578063a16032cc146103d1578063b0f479a11461038c578063d0ebdbe71461025d578063df8089ef146101b6578063f2fde38b146101305763f53d0a8e14610105575f80fd5b3461012d578060031936011261012d576001546040516001600160a01b039091168152602090f35b80fd5b503461012d57602036600319011261012d5761014a611b29565b610152611ffd565b6001600160a01b031680156101a25781546001600160a01b03198116821783556001600160a01b03167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08380a380f35b631e4fbdf760e01b82526004829052602482fd5b503461012d57602036600319011261012d576101d0611b29565b6101d8611ffd565b6101e181611fdf565b1561022d57600180546001600160a01b0319166001600160a01b03929092169182179055337f525117b0c654ea4d9950e296eca92b77aa3c6fdeba6217801c6f32a0ed7a09228380a380f35b60405162461bcd60e51b8152602060048201526008602482015267216164647265737360c01b6044820152606490fd5b503461012d57602036600319011261012d57610277611b29565b600154604051632474521560e21b81525f80516020612038833981519152600482015233602482015290602090829060449082906001600160a01b03165afa8015610381576102cd918491610352575b50611c0d565b6102d681611fdf565b1561032257600580546001600160a01b0319166001600160a01b03929092169182179055337fc64707e618a83637fc41ad1e3aa4242bd5fdd353f3d60bc0faf40db0d7d860788380a380f35b60405162461bcd60e51b815260206004820152600860248201526710b6b0b730b3b2b960c11b6044820152606490fd5b610374915060203d60201161037a575b61036c8183611ba4565b810190611bf5565b5f6102c7565b503d610362565b6040513d85823e3d90fd5b503461012d578060031936011261012d576040517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b503461012d57604036600319011261012d5760406103ed611ae7565b916001600160401b036103fe611b13565b931681526006602052209060018060a01b03165f52602052602060ff60405f2054166040519015158152f35b503461012d5760c036600319011261012d57610444611ae7565b61044c611b13565b906044356001600160401b0381116106505736602382011215610650578060040135906001600160401b03821161064c57366024838301011161064c57604036606319011261064c57604051906104a282611b89565b6064358252608435928315158403610648576020830193845260a435936002851015610644579261053360606105b499989694602494600160209a98526040519860018060a01b03168a8a01528989526104fd60408a611ba4565b806040519687938c8086015282604086015201848401378a838284010152601f801991011681010301601f198101845283611ba4565b6001610546610540611d62565b92611fae565b930361063d577f0000000000000000000000000000000000000000000000000000000000000000915b6040519561057c87611b3f565b865286860152604085015260018060a01b03166060840152608083015260405194859283926320487ded60e01b845260048401611da7565b03817f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03165afa90811561063157906105fa575b602090604051908152f35b506020813d602011610629575b8161061460209383611ba4565b8101031261062557602090516105ef565b5f80fd5b3d9150610607565b604051903d90823e3d90fd5b869161056f565b8780fd5b8680fd5b8480fd5b8380fd5b503461012d578060031936011261012d57546040516001600160a01b039091168152602090f35b503461012d57602036600319011261012d5760ff60406020926004358152600284522054166040519015158152f35b503461012d57602036600319011261012d576004356001600160401b038111610c5d5760a06003198236030112610c5d577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03163303610c4a5760405161071781611b3f565b816004013581526024820135906001600160401b0382168203610650576020810191825260448301356001600160401b03811161064c5761075e9060043691860101611f68565b926040820193845260648101356001600160401b038111610be6576107899060043691840101611f68565b90606083019182526084810135906001600160401b038211610648570136602382011215610be65760048101356107bf81611d4b565b916107cd6040519384611ba4565b818352602060048185019360061b8301010190368211610c4657602401915b818310610bfd57505050608083015251918251830192602081818601950312610be6576020810151906001600160401b03821161064857019280603f85011215610be6578560208501519461084086611f4d565b9561084e6040519788611ba4565b808752602087019360408383010111610bf95780604060209301855e8601015285608060405161087d81611b3f565b828152826020820152826040820152826060820152015260a0845103610bea5760a084805181010312610be65751906001600160401b038216809203610be6576108c960408501612023565b936108d660608201612023565b608082015160a083015190966001600160a01b03908116969216947fedc6e67b7f382e06fc55950940693789ec865cf44b786836c295e1a7ff6694858201610bb8578015610bb8578615610bc75785158015610bd6575b610bc7578715610bb85760405160809161094682611b3f565b8152602081019788526040810196875260608101988952015251610992604051809261097e6020830195604087526060840190611d27565b90604083015203601f198101835282611ba4565b51902090818752600260205260ff604088205416610b8757869551602081805181010312610648576001600160401b03906001600160a01b03906109d890602001612023565b1691511686526006602052604086209060018060a01b03165f52602052610a0560ff60405f205416611cf0565b8452600260205260408420600160ff19825416179055610a2783511515611c7c565b7f000000000000000000000000000000000000000000000000000000000000000015610b085780516001600160a01b03908116855260036020526040852054610a7291161515611cb2565b80516001600160a01b0390811685526003602052604085205491519251935193811693928116929116803b1561064c576040516359508f8f60e01b81526001600160a01b039384166004820152939092166024840152604483015282908290818381606481015b03925af18015610afd57610aec57505080f35b81610af691611ba4565b61012d5780f35b6040513d84823e3d90fd5b51915160405191926001600160a01b0316610b2283611b6e565b8252602082015260408101839052606081018390526001608082015260a0810183905260055491516001600160a01b03928316921690823b15610b8257610ad992849283604051809681958294636defd45560e01b845260048401611e74565b505050fd5b60405162461bcd60e51b81526020600482015260096024820152681c1c9bd8d95cdcd95960ba1b6044820152606490fd5b6301b44b5f60e11b8a5260048afd5b63209e29c560e21b8a5260048afd5b50610be086611fdf565b1561092d565b8580fd5b6366289e3960e11b8652600486fd5b8280fd5b604083360312610c465760405190610c1482611b89565b8335906001600160a01b0382168203610c4257826020926040945282860135838201528152019201916107ec565b8a80fd5b8880fd5b6335fdcccd60e21b825233600452602482fd5b5080fd5b503461012d57602036600319011261012d576020906001600160a01b03610c86611b29565b16815260038252604060018060a01b0391205416604051908152f35b503461012d57606036600319011261012d57610cbc611b29565b6024356001600160401b038111610bf957610cdb903690600401611bc5565b90916044356001600160401b03811161064c57610cfc903690600401611bc5565b600154604051632474521560e21b81525f805160206120388339815191526004820152336024820152919492939190602090829060449082906001600160a01b03165afa8015610eb957610d569188916103525750611c0d565b6001600160a01b0316938415610e8757838203610e5857855b828110610d7a578680f35b600190610da36001600160a01b03610d9b610d96848a8a611f01565b611f25565b161515611ecc565b610db1610d96828888611f01565b8789526004602052604089206001600160401b03610dd8610dd3858989611f01565b611f39565b165f5260205260405f2090838060a01b03166bffffffffffffffffffffffff60a01b825416179055610e0e610dd3828686611f01565b6001600160401b03838060a01b03610e2a610d96858b8b611f01565b169116337fffc69ac19640cba1401d95c27b77e155ce08c0a70946fb435fbd7e0bc7b0c65c8b80a401610d6f565b60405162461bcd60e51b8152602060048201526007602482015266042d8cadccee8d60cb1b6044820152606490fd5b60405162461bcd60e51b815260206004820152600a60248201526910b9b931903a37b5b2b760b11b6044820152606490fd5b6040513d89823e3d90fd5b503461012d578060031936011261012d57610edd611ffd565b80546001600160a01b03198116825581906001600160a01b03167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08280a380f35b503461012d57604036600319011261012d57610f38611b29565b610f40611b13565b600154604051632474521560e21b81525f80516020612038833981519152600482015233602482015291929190602090829060449082906001600160a01b03165afa801561103c57610f989185916103525750611c0d565b610fa9610fa482611fdf565b611ecc565b610fb282611fdf565b1561100c576001600160a01b0390811680845260036020526040842080546001600160a01b03191693909216928317909155337fc2677273938f50fd26297a86f7c15963e77c4ec9141bbf83f2a7f33cfc2ca1638480a480f35b60405162461bcd60e51b8152602060048201526008602482015267042d8dec6d6c4def60c31b6044820152606490fd5b6040513d86823e3d90fd5b503461012d578060031936011261012d576005546040516001600160a01b039091168152602090f35b503461012d57604036600319011261012d576001600160401b036040611094611b29565b9261109d611afd565b9360018060a01b0316815260046020522091165f52602052602060405f2060018060a01b03905416604051908152f35b503461012d578060031936011261012d576040517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b503461012d578060031936011261012d5760206040517f000000000000000000000000000000000000000000000000000000000000000015158152f35b5061010036600319011261062557611165611b29565b9061116e611afd565b6044356001600160a01b0381169390849003610625576084356001600160a01b0381169190606435908390036106255760403660a319011261062557604051916111b783611b89565b60a435835260c435968715158803610625576020840197885260e43591600283101561062557600154604051630723eb0360e51b81523360048201526001600160a01b0390911690602081602481855afa801561182457611220915f9161199e575b5015611c42565b604051630723eb0360e51b81526004810184905290602082602481845afa9081156118245761125b6020926024945f91611981575015611c42565b604051635b14f18360e01b815230600482015292839182905afa908115611824575f91611962575b5061193457611293841515611c7c565b6001600160a01b039081165f818152600360205260409020549099916112bb91161515611cb2565b6040516370a0823160e01b81523360048201526020816024818d5afa80156118245785915f916118ff575b50106118cf57811561189e575f8981526004602090815260408083206001600160401b038b1684529091529020546001600160a01b03161561186a576113f6916001611404926001600160401b038a1692835f52600660205260405f208a5f5260205261135960ff60405f205416611cf0565b8c5f52600460205260405f20845f5260205260405f20838060a01b0390541690604051946020860152604085015260608401528660808401527f1239198480c7d1f903aa6af6bf96c8761379a30bb48797c93d6a1e5800996b7b60a084015260a083526113c760c084611ba4565b52604051966020880152602087526113e0604088611ba4565b6040519283916020808401526040830190611d27565b03601f198101835282611ba4565b6001611417611411611d62565b95611fae565b9214938415611863577f0000000000000000000000000000000000000000000000000000000000000000915b6040519661145088611b3f565b87526020870152604086015260018060a01b03166060850152608084015260018060a01b037f00000000000000000000000000000000000000000000000000000000000000001691604051916320487ded60e01b8352602083806114b8888a60048401611da7565b0381875afa928315611824575f9361182f575b507f00000000000000000000000000000000000000000000000000000000000000001561178f578787526003602090815260408089205490516323b872dd60e01b8184019081523360248301526001600160a01b0390921660448201526064810184905289919061153f81608481016113f6565b5190828c5af1156117845786513d61177b5750873b155b61176757869760405191825233917fd6aba49fa5adb7dbc18ab12d057e77c75e5d4b345cf473c7514afbbd6f5fc62660203392a45b156116f7576040516323b872dd60e01b815233600482015230602482015260448101829052906001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016906020836064818a865af1908115610eb9576020936044926116dc575b50604051978893849263095ea7b360e01b845287600485015260248401525af19283156116d157611649946020946116b6575b50856040518096819582946396f4e9f960e01b845260048401611da7565b03925af1908115610afd578291611684575b505b7f54791b38f3859327992a1ca0590ad3c0f08feba98d1a4f56ab0dca74d203392a8280a280f35b90506020813d6020116116ae575b8161169f60209383611ba4565b8101031261062557515f61165b565b3d9150611692565b6116cc90853d871161037a5761036c8183611ba4565b61162b565b6040513d87823e3d90fd5b6116f290853d871161037a5761036c8183611ba4565b6115f8565b6040516396f4e9f960e01b815294506020938593849291839161171d9160048401611da7565b03925af1908115610afd578291611735575b5061165d565b90506020813d60201161175f575b8161175060209383611ba4565b8101031261062557515f61172f565b3d9150611743565b635274afe760e01b87526004889052602487fd5b60011415611556565b6040513d88823e3d90fd5b6040519761179c89611b6e565b885260208801525f60408801819052606088018190526080880181905260a08801526005546001600160a01b0316803b1561062557604051636defd45560e01b8152975f9189918290849082906117f7903360048401611e74565b03925af180156118245761180e575b85965061158b565b9450945f61181b91611ba4565b5f938590611806565b6040513d5f823e3d90fd5b9092506020813d60201161185b575b8161184b60209383611ba4565b810103126106255751915f6114cb565b3d915061183e565b5f91611443565b60405162461bcd60e51b815260206004820152600c60248201526b10b232b9ba34b730ba34b7b760a11b6044820152606490fd5b60405162461bcd60e51b815260206004820152600960248201526810b932b1b2b4bb32b960b91b6044820152606490fd5b60405162461bcd60e51b81526020600482015260086024820152672162616c616e636560c01b6044820152606490fd5b9150506020813d60201161192c575b8161191b60209383611ba4565b81010312610625578490515f6112e6565b3d915061190e565b60405162461bcd60e51b81526020600482015260066024820152651c185d5cd95960d21b6044820152606490fd5b61197b915060203d60201161037a5761036c8183611ba4565b5f611283565b6119989150843d861161037a5761036c8183611ba4565b5f611219565b611998915060203d60201161037a5761036c8183611ba4565b34610625576060366003190112610625576119d0611ae7565b6119d8611b13565b6044359182151580930361062557600154604051632474521560e21b81525f8051602061203883398151915260048201523360248201529190602090839060449082906001600160a01b03165afa918215611824576001600160401b0392611a46915f91611a755750611c0d565b165f52600660205260405f209060018060a01b03165f5260205260405f209060ff801983541691161790555f80f35b611a8e915060203d60201161037a5761036c8183611ba4565b866102c7565b34610625576020366003190112610625576004359063ffffffff60e01b8216809203610625576020916385572ffb60e01b8114908115611ad6575b5015158152f35b6301ffc9a760e01b14905083611acf565b600435906001600160401b038216820361062557565b602435906001600160401b038216820361062557565b602435906001600160a01b038216820361062557565b600435906001600160a01b038216820361062557565b60a081019081106001600160401b03821117611b5a57604052565b634e487b7160e01b5f52604160045260245ffd5b60c081019081106001600160401b03821117611b5a57604052565b604081019081106001600160401b03821117611b5a57604052565b90601f801991011681019081106001600160401b03821117611b5a57604052565b9181601f84011215610625578235916001600160401b038311610625576020808501948460051b01011161062557565b90816020910312610625575180151581036106255790565b15611c1457565b60405162461bcd60e51b815260206004820152600660248201526510b0b236b4b760d11b6044820152606490fd5b15611c4957565b60405162461bcd60e51b815260206004820152600b60248201526a189b1858dadb1a5cdd195960aa1b6044820152606490fd5b15611c8357565b60405162461bcd60e51b815260206004820152600760248201526608585b5bdd5b9d60ca1b6044820152606490fd5b15611cb957565b60405162461bcd60e51b815260206004820152600f60248201526e042e8ded6cadc4042d8dec6d6c4def608b1b6044820152606490fd5b15611cf757565b60405162461bcd60e51b815260206004820152600860248201526708585b1b1bddd95960c21b6044820152606490fd5b805180835260209291819084018484015e5f828201840152601f01601f1916010190565b6001600160401b038111611b5a5760051b60200190565b60405190611d71602083611ba4565b5f80835282815b828110611d8457505050565b602090604051611d9381611b89565b5f81525f8382015282828501015201611d78565b906001600160401b039093929316815260406020820152611ded611dd7845160a0604085015260e0840190611d27565b6020850151838203603f19016060850152611d27565b90604084015191603f19828203016080830152602080845192838152019301905f5b818110611e49575050506080611e46939460018060a01b0360608201511660a084015201519060c0603f1982850301910152611d27565b90565b825180516001600160a01b031686526020908101518187015260409095019490920191600101611e0f565b90929160a060c09160e0840195600180841b03168452600180831b0381511660208501526020810151604085015260408101516060850152606081015115156080850152608081015115158285015201511515910152565b15611ed357565b60405162461bcd60e51b815260206004820152600660248201526510ba37b5b2b760d11b6044820152606490fd5b9190811015611f115760051b0190565b634e487b7160e01b5f52603260045260245ffd5b356001600160a01b03811681036106255790565b356001600160401b03811681036106255790565b6001600160401b038111611b5a57601f01601f191660200190565b81601f8201121561062557803590611f7f82611f4d565b92611f8d6040519485611ba4565b8284526020838301011161062557815f926020809301838601378301015290565b602060405191630181dcf160e41b828401528051602484015201511515604482015260448152611e46606482611ba4565b6001600160a01b03811615159081611ff5575090565b90503b151590565b5f546001600160a01b0316330361201057565b63118cdaa760e01b5f523360045260245ffd5b51906001600160a01b03821682036106255756fedf8b4c520ffe197c5343c6f5aec59570151ef9a492f2c624fd45ddde6135ec42a2646970667358221220d0444452ebe809b512177136b2f157ed3d7a36b805a508937e326e22623f291864736f6c634300081a00330000000000000000000000007c19b79d2a054114ab36ad758a36e92376e267da000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010472f91f67c49260bdd65f016ea0757bb1fc91e000000000000000000000000c2c447b04e0ed3476ddbdae8e9e39be7159d27b6

Deployed Bytecode

0x6080806040526004361015610012575f80fd5b5f905f3560e01c90816301ffc9a714611a94575080630b3f78b3146119b75780630e1c2f4e1461114f5780631974932b146111125780631c4695f4146110cd578063477db86e14611070578063481c6a75146110475780636d4e24c314610f1e578063715018a614610ec457806378ab175014610ca257806379e1ccec14610c6157806385572ffb146106aa57806388ba16ab1461067b5780638da5cb5b146106545780639726f9c41461042a578063a16032cc146103d1578063b0f479a11461038c578063d0ebdbe71461025d578063df8089ef146101b6578063f2fde38b146101305763f53d0a8e14610105575f80fd5b3461012d578060031936011261012d576001546040516001600160a01b039091168152602090f35b80fd5b503461012d57602036600319011261012d5761014a611b29565b610152611ffd565b6001600160a01b031680156101a25781546001600160a01b03198116821783556001600160a01b03167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08380a380f35b631e4fbdf760e01b82526004829052602482fd5b503461012d57602036600319011261012d576101d0611b29565b6101d8611ffd565b6101e181611fdf565b1561022d57600180546001600160a01b0319166001600160a01b03929092169182179055337f525117b0c654ea4d9950e296eca92b77aa3c6fdeba6217801c6f32a0ed7a09228380a380f35b60405162461bcd60e51b8152602060048201526008602482015267216164647265737360c01b6044820152606490fd5b503461012d57602036600319011261012d57610277611b29565b600154604051632474521560e21b81525f80516020612038833981519152600482015233602482015290602090829060449082906001600160a01b03165afa8015610381576102cd918491610352575b50611c0d565b6102d681611fdf565b1561032257600580546001600160a01b0319166001600160a01b03929092169182179055337fc64707e618a83637fc41ad1e3aa4242bd5fdd353f3d60bc0faf40db0d7d860788380a380f35b60405162461bcd60e51b815260206004820152600860248201526710b6b0b730b3b2b960c11b6044820152606490fd5b610374915060203d60201161037a575b61036c8183611ba4565b810190611bf5565b5f6102c7565b503d610362565b6040513d85823e3d90fd5b503461012d578060031936011261012d576040517f0000000000000000000000007c19b79d2a054114ab36ad758a36e92376e267da6001600160a01b03168152602090f35b503461012d57604036600319011261012d5760406103ed611ae7565b916001600160401b036103fe611b13565b931681526006602052209060018060a01b03165f52602052602060ff60405f2054166040519015158152f35b503461012d5760c036600319011261012d57610444611ae7565b61044c611b13565b906044356001600160401b0381116106505736602382011215610650578060040135906001600160401b03821161064c57366024838301011161064c57604036606319011261064c57604051906104a282611b89565b6064358252608435928315158403610648576020830193845260a435936002851015610644579261053360606105b499989694602494600160209a98526040519860018060a01b03168a8a01528989526104fd60408a611ba4565b806040519687938c8086015282604086015201848401378a838284010152601f801991011681010301601f198101845283611ba4565b6001610546610540611d62565b92611fae565b930361063d577f000000000000000000000000c2c447b04e0ed3476ddbdae8e9e39be7159d27b6915b6040519561057c87611b3f565b865286860152604085015260018060a01b03166060840152608083015260405194859283926320487ded60e01b845260048401611da7565b03817f0000000000000000000000007c19b79d2a054114ab36ad758a36e92376e267da6001600160a01b03165afa90811561063157906105fa575b602090604051908152f35b506020813d602011610629575b8161061460209383611ba4565b8101031261062557602090516105ef565b5f80fd5b3d9150610607565b604051903d90823e3d90fd5b869161056f565b8780fd5b8680fd5b8480fd5b8380fd5b503461012d578060031936011261012d57546040516001600160a01b039091168152602090f35b503461012d57602036600319011261012d5760ff60406020926004358152600284522054166040519015158152f35b503461012d57602036600319011261012d576004356001600160401b038111610c5d5760a06003198236030112610c5d577f0000000000000000000000007c19b79d2a054114ab36ad758a36e92376e267da6001600160a01b03163303610c4a5760405161071781611b3f565b816004013581526024820135906001600160401b0382168203610650576020810191825260448301356001600160401b03811161064c5761075e9060043691860101611f68565b926040820193845260648101356001600160401b038111610be6576107899060043691840101611f68565b90606083019182526084810135906001600160401b038211610648570136602382011215610be65760048101356107bf81611d4b565b916107cd6040519384611ba4565b818352602060048185019360061b8301010190368211610c4657602401915b818310610bfd57505050608083015251918251830192602081818601950312610be6576020810151906001600160401b03821161064857019280603f85011215610be6578560208501519461084086611f4d565b9561084e6040519788611ba4565b808752602087019360408383010111610bf95780604060209301855e8601015285608060405161087d81611b3f565b828152826020820152826040820152826060820152015260a0845103610bea5760a084805181010312610be65751906001600160401b038216809203610be6576108c960408501612023565b936108d660608201612023565b608082015160a083015190966001600160a01b03908116969216947fedc6e67b7f382e06fc55950940693789ec865cf44b786836c295e1a7ff6694858201610bb8578015610bb8578615610bc75785158015610bd6575b610bc7578715610bb85760405160809161094682611b3f565b8152602081019788526040810196875260608101988952015251610992604051809261097e6020830195604087526060840190611d27565b90604083015203601f198101835282611ba4565b51902090818752600260205260ff604088205416610b8757869551602081805181010312610648576001600160401b03906001600160a01b03906109d890602001612023565b1691511686526006602052604086209060018060a01b03165f52602052610a0560ff60405f205416611cf0565b8452600260205260408420600160ff19825416179055610a2783511515611c7c565b7f000000000000000000000000000000000000000000000000000000000000000015610b085780516001600160a01b03908116855260036020526040852054610a7291161515611cb2565b80516001600160a01b0390811685526003602052604085205491519251935193811693928116929116803b1561064c576040516359508f8f60e01b81526001600160a01b039384166004820152939092166024840152604483015282908290818381606481015b03925af18015610afd57610aec57505080f35b81610af691611ba4565b61012d5780f35b6040513d84823e3d90fd5b51915160405191926001600160a01b0316610b2283611b6e565b8252602082015260408101839052606081018390526001608082015260a0810183905260055491516001600160a01b03928316921690823b15610b8257610ad992849283604051809681958294636defd45560e01b845260048401611e74565b505050fd5b60405162461bcd60e51b81526020600482015260096024820152681c1c9bd8d95cdcd95960ba1b6044820152606490fd5b6301b44b5f60e11b8a5260048afd5b63209e29c560e21b8a5260048afd5b50610be086611fdf565b1561092d565b8580fd5b6366289e3960e11b8652600486fd5b8280fd5b604083360312610c465760405190610c1482611b89565b8335906001600160a01b0382168203610c4257826020926040945282860135838201528152019201916107ec565b8a80fd5b8880fd5b6335fdcccd60e21b825233600452602482fd5b5080fd5b503461012d57602036600319011261012d576020906001600160a01b03610c86611b29565b16815260038252604060018060a01b0391205416604051908152f35b503461012d57606036600319011261012d57610cbc611b29565b6024356001600160401b038111610bf957610cdb903690600401611bc5565b90916044356001600160401b03811161064c57610cfc903690600401611bc5565b600154604051632474521560e21b81525f805160206120388339815191526004820152336024820152919492939190602090829060449082906001600160a01b03165afa8015610eb957610d569188916103525750611c0d565b6001600160a01b0316938415610e8757838203610e5857855b828110610d7a578680f35b600190610da36001600160a01b03610d9b610d96848a8a611f01565b611f25565b161515611ecc565b610db1610d96828888611f01565b8789526004602052604089206001600160401b03610dd8610dd3858989611f01565b611f39565b165f5260205260405f2090838060a01b03166bffffffffffffffffffffffff60a01b825416179055610e0e610dd3828686611f01565b6001600160401b03838060a01b03610e2a610d96858b8b611f01565b169116337fffc69ac19640cba1401d95c27b77e155ce08c0a70946fb435fbd7e0bc7b0c65c8b80a401610d6f565b60405162461bcd60e51b8152602060048201526007602482015266042d8cadccee8d60cb1b6044820152606490fd5b60405162461bcd60e51b815260206004820152600a60248201526910b9b931903a37b5b2b760b11b6044820152606490fd5b6040513d89823e3d90fd5b503461012d578060031936011261012d57610edd611ffd565b80546001600160a01b03198116825581906001600160a01b03167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08280a380f35b503461012d57604036600319011261012d57610f38611b29565b610f40611b13565b600154604051632474521560e21b81525f80516020612038833981519152600482015233602482015291929190602090829060449082906001600160a01b03165afa801561103c57610f989185916103525750611c0d565b610fa9610fa482611fdf565b611ecc565b610fb282611fdf565b1561100c576001600160a01b0390811680845260036020526040842080546001600160a01b03191693909216928317909155337fc2677273938f50fd26297a86f7c15963e77c4ec9141bbf83f2a7f33cfc2ca1638480a480f35b60405162461bcd60e51b8152602060048201526008602482015267042d8dec6d6c4def60c31b6044820152606490fd5b6040513d86823e3d90fd5b503461012d578060031936011261012d576005546040516001600160a01b039091168152602090f35b503461012d57604036600319011261012d576001600160401b036040611094611b29565b9261109d611afd565b9360018060a01b0316815260046020522091165f52602052602060405f2060018060a01b03905416604051908152f35b503461012d578060031936011261012d576040517f000000000000000000000000c2c447b04e0ed3476ddbdae8e9e39be7159d27b66001600160a01b03168152602090f35b503461012d578060031936011261012d5760206040517f000000000000000000000000000000000000000000000000000000000000000015158152f35b5061010036600319011261062557611165611b29565b9061116e611afd565b6044356001600160a01b0381169390849003610625576084356001600160a01b0381169190606435908390036106255760403660a319011261062557604051916111b783611b89565b60a435835260c435968715158803610625576020840197885260e43591600283101561062557600154604051630723eb0360e51b81523360048201526001600160a01b0390911690602081602481855afa801561182457611220915f9161199e575b5015611c42565b604051630723eb0360e51b81526004810184905290602082602481845afa9081156118245761125b6020926024945f91611981575015611c42565b604051635b14f18360e01b815230600482015292839182905afa908115611824575f91611962575b5061193457611293841515611c7c565b6001600160a01b039081165f818152600360205260409020549099916112bb91161515611cb2565b6040516370a0823160e01b81523360048201526020816024818d5afa80156118245785915f916118ff575b50106118cf57811561189e575f8981526004602090815260408083206001600160401b038b1684529091529020546001600160a01b03161561186a576113f6916001611404926001600160401b038a1692835f52600660205260405f208a5f5260205261135960ff60405f205416611cf0565b8c5f52600460205260405f20845f5260205260405f20838060a01b0390541690604051946020860152604085015260608401528660808401527f1239198480c7d1f903aa6af6bf96c8761379a30bb48797c93d6a1e5800996b7b60a084015260a083526113c760c084611ba4565b52604051966020880152602087526113e0604088611ba4565b6040519283916020808401526040830190611d27565b03601f198101835282611ba4565b6001611417611411611d62565b95611fae565b9214938415611863577f000000000000000000000000c2c447b04e0ed3476ddbdae8e9e39be7159d27b6915b6040519661145088611b3f565b87526020870152604086015260018060a01b03166060850152608084015260018060a01b037f0000000000000000000000007c19b79d2a054114ab36ad758a36e92376e267da1691604051916320487ded60e01b8352602083806114b8888a60048401611da7565b0381875afa928315611824575f9361182f575b507f00000000000000000000000000000000000000000000000000000000000000001561178f578787526003602090815260408089205490516323b872dd60e01b8184019081523360248301526001600160a01b0390921660448201526064810184905289919061153f81608481016113f6565b5190828c5af1156117845786513d61177b5750873b155b61176757869760405191825233917fd6aba49fa5adb7dbc18ab12d057e77c75e5d4b345cf473c7514afbbd6f5fc62660203392a45b156116f7576040516323b872dd60e01b815233600482015230602482015260448101829052906001600160a01b037f000000000000000000000000c2c447b04e0ed3476ddbdae8e9e39be7159d27b616906020836064818a865af1908115610eb9576020936044926116dc575b50604051978893849263095ea7b360e01b845287600485015260248401525af19283156116d157611649946020946116b6575b50856040518096819582946396f4e9f960e01b845260048401611da7565b03925af1908115610afd578291611684575b505b7f54791b38f3859327992a1ca0590ad3c0f08feba98d1a4f56ab0dca74d203392a8280a280f35b90506020813d6020116116ae575b8161169f60209383611ba4565b8101031261062557515f61165b565b3d9150611692565b6116cc90853d871161037a5761036c8183611ba4565b61162b565b6040513d87823e3d90fd5b6116f290853d871161037a5761036c8183611ba4565b6115f8565b6040516396f4e9f960e01b815294506020938593849291839161171d9160048401611da7565b03925af1908115610afd578291611735575b5061165d565b90506020813d60201161175f575b8161175060209383611ba4565b8101031261062557515f61172f565b3d9150611743565b635274afe760e01b87526004889052602487fd5b60011415611556565b6040513d88823e3d90fd5b6040519761179c89611b6e565b885260208801525f60408801819052606088018190526080880181905260a08801526005546001600160a01b0316803b1561062557604051636defd45560e01b8152975f9189918290849082906117f7903360048401611e74565b03925af180156118245761180e575b85965061158b565b9450945f61181b91611ba4565b5f938590611806565b6040513d5f823e3d90fd5b9092506020813d60201161185b575b8161184b60209383611ba4565b810103126106255751915f6114cb565b3d915061183e565b5f91611443565b60405162461bcd60e51b815260206004820152600c60248201526b10b232b9ba34b730ba34b7b760a11b6044820152606490fd5b60405162461bcd60e51b815260206004820152600960248201526810b932b1b2b4bb32b960b91b6044820152606490fd5b60405162461bcd60e51b81526020600482015260086024820152672162616c616e636560c01b6044820152606490fd5b9150506020813d60201161192c575b8161191b60209383611ba4565b81010312610625578490515f6112e6565b3d915061190e565b60405162461bcd60e51b81526020600482015260066024820152651c185d5cd95960d21b6044820152606490fd5b61197b915060203d60201161037a5761036c8183611ba4565b5f611283565b6119989150843d861161037a5761036c8183611ba4565b5f611219565b611998915060203d60201161037a5761036c8183611ba4565b34610625576060366003190112610625576119d0611ae7565b6119d8611b13565b6044359182151580930361062557600154604051632474521560e21b81525f8051602061203883398151915260048201523360248201529190602090839060449082906001600160a01b03165afa918215611824576001600160401b0392611a46915f91611a755750611c0d565b165f52600660205260405f209060018060a01b03165f5260205260405f209060ff801983541691161790555f80f35b611a8e915060203d60201161037a5761036c8183611ba4565b866102c7565b34610625576020366003190112610625576004359063ffffffff60e01b8216809203610625576020916385572ffb60e01b8114908115611ad6575b5015158152f35b6301ffc9a760e01b14905083611acf565b600435906001600160401b038216820361062557565b602435906001600160401b038216820361062557565b602435906001600160a01b038216820361062557565b600435906001600160a01b038216820361062557565b60a081019081106001600160401b03821117611b5a57604052565b634e487b7160e01b5f52604160045260245ffd5b60c081019081106001600160401b03821117611b5a57604052565b604081019081106001600160401b03821117611b5a57604052565b90601f801991011681019081106001600160401b03821117611b5a57604052565b9181601f84011215610625578235916001600160401b038311610625576020808501948460051b01011161062557565b90816020910312610625575180151581036106255790565b15611c1457565b60405162461bcd60e51b815260206004820152600660248201526510b0b236b4b760d11b6044820152606490fd5b15611c4957565b60405162461bcd60e51b815260206004820152600b60248201526a189b1858dadb1a5cdd195960aa1b6044820152606490fd5b15611c8357565b60405162461bcd60e51b815260206004820152600760248201526608585b5bdd5b9d60ca1b6044820152606490fd5b15611cb957565b60405162461bcd60e51b815260206004820152600f60248201526e042e8ded6cadc4042d8dec6d6c4def608b1b6044820152606490fd5b15611cf757565b60405162461bcd60e51b815260206004820152600860248201526708585b1b1bddd95960c21b6044820152606490fd5b805180835260209291819084018484015e5f828201840152601f01601f1916010190565b6001600160401b038111611b5a5760051b60200190565b60405190611d71602083611ba4565b5f80835282815b828110611d8457505050565b602090604051611d9381611b89565b5f81525f8382015282828501015201611d78565b906001600160401b039093929316815260406020820152611ded611dd7845160a0604085015260e0840190611d27565b6020850151838203603f19016060850152611d27565b90604084015191603f19828203016080830152602080845192838152019301905f5b818110611e49575050506080611e46939460018060a01b0360608201511660a084015201519060c0603f1982850301910152611d27565b90565b825180516001600160a01b031686526020908101518187015260409095019490920191600101611e0f565b90929160a060c09160e0840195600180841b03168452600180831b0381511660208501526020810151604085015260408101516060850152606081015115156080850152608081015115158285015201511515910152565b15611ed357565b60405162461bcd60e51b815260206004820152600660248201526510ba37b5b2b760d11b6044820152606490fd5b9190811015611f115760051b0190565b634e487b7160e01b5f52603260045260245ffd5b356001600160a01b03811681036106255790565b356001600160401b03811681036106255790565b6001600160401b038111611b5a57601f01601f191660200190565b81601f8201121561062557803590611f7f82611f4d565b92611f8d6040519485611ba4565b8284526020838301011161062557815f926020809301838601378301015290565b602060405191630181dcf160e41b828401528051602484015201511515604482015260448152611e46606482611ba4565b6001600160a01b03811615159081611ff5575090565b90503b151590565b5f546001600160a01b0316330361201057565b63118cdaa760e01b5f523360045260245ffd5b51906001600160a01b03821682036106255756fedf8b4c520ffe197c5343c6f5aec59570151ef9a492f2c624fd45ddde6135ec42a2646970667358221220d0444452ebe809b512177136b2f157ed3d7a36b805a508937e326e22623f291864736f6c634300081a0033

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

0000000000000000000000007c19b79d2a054114ab36ad758a36e92376e267da000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010472f91f67c49260bdd65f016ea0757bb1fc91e000000000000000000000000c2c447b04e0ed3476ddbdae8e9e39be7159d27b6

-----Decoded View---------------
Arg [0] : _router (address): 0x7c19b79D2a054114Ab36ad758A36e92376e267DA
Arg [1] : _isL1 (bool): False
Arg [2] : _administrator (address): 0x10472f91f67C49260BDD65F016ea0757bb1Fc91e
Arg [3] : _link (address): 0xc2C447b04e0ED3476DdbDae8E9E39bE7159d27b6

-----Encoded View---------------
4 Constructor Arguments found :
Arg [0] : 0000000000000000000000007c19b79d2a054114ab36ad758a36e92376e267da
Arg [1] : 0000000000000000000000000000000000000000000000000000000000000000
Arg [2] : 00000000000000000000000010472f91f67c49260bdd65f016ea0757bb1fc91e
Arg [3] : 000000000000000000000000c2c447b04e0ed3476ddbdae8e9e39be7159d27b6


Deployed Bytecode Sourcemap

1703:8374:17:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;1703:8374:17;;;;;;;;;;;;;;;;;;-1:-1:-1;;1703:8374:17;;;;;;:::i;:::-;1500:62:6;;:::i;:::-;-1:-1:-1;;;;;1703:8374:17;2627:22:6;;2623:91;;1703:8374:17;;-1:-1:-1;;;;;;1703:8374:17;;;;;;-1:-1:-1;;;;;1703:8374:17;3052:40:6;1703:8374:17;;3052:40:6;1703:8374:17;;2623:91:6;-1:-1:-1;;;2672:31:6;;1703:8374:17;;;;;2672:31:6;;1703:8374:17;;;;;;;-1:-1:-1;;1703:8374:17;;;;;;:::i;:::-;1500:62:6;;:::i;:::-;2944:33:17;;;:::i;:::-;1703:8374;;;;;;-1:-1:-1;;;;;;1703:8374:17;-1:-1:-1;;;;;1703:8374:17;;;;;;;;;3062:10;3045:44;;;;1703:8374;;;;;-1:-1:-1;;;1703:8374:17;;;;;;;;;;;141:18:22;-1:-1:-1;;;141:18:22;;;1703:8374:17;;;;;;;;;;;-1:-1:-1;;1703:8374:17;;;;;;:::i;:::-;;;;;-1:-1:-1;;;2495:62:17;;-1:-1:-1;;;;;;;;;;;1703:8374:17;2495:62;;1703:8374;2546:10;141:18:22;;;1703:8374:17;;;;;;2495:62;;1703:8374;;-1:-1:-1;;;;;1703:8374:17;2495:62;;;;;;2487:81;2495:62;;;;;1703:8374;2487:81;;:::i;:::-;3472:27;;;:::i;:::-;1703:8374;;;3522:18;1703:8374;;-1:-1:-1;;;;;;1703:8374:17;-1:-1:-1;;;;;1703:8374:17;;;;;;;;;2546:10;3555:32;;;;1703:8374;;;;;-1:-1:-1;;;1703:8374:17;;;;;;;;141:18:22;1703:8374:17;;141:18:22;-1:-1:-1;;;2495:62:17;141:18:22;;1703:8374:17;;;;2495:62;;;;1703:8374;2495:62;1703:8374;2495:62;;;;;;;;:::i;:::-;;;;;:::i;:::-;;;;;;;;;;1703:8374;;141:18:22;1703:8374:17;;141:18:22;;;;1703:8374:17;;;;;;;;;;;;;;;2167:12:0;-1:-1:-1;;;;;1703:8374:17;;;;;;;;;;;;;-1:-1:-1;;1703:8374:17;;;;;;;:::i;:::-;;-1:-1:-1;;;;;1703:8374:17;;:::i;:::-;;;;;2054:88;1703:8374;;;2054:88;1703:8374;;;;;;-1:-1:-1;1703:8374:17;;;;;;-1:-1:-1;1703:8374:17;;;;;;;;;;;;;;;;;;-1:-1:-1;;1703:8374:17;;;;;;:::i;:::-;;;:::i;:::-;;;;-1:-1:-1;;;;;1703:8374:17;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;1703:8374:17;;;;;;;;;;;;;;;-1:-1:-1;;1703:8374:17;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1368:24:22;5184:20:17;1703:8374;5569:63;1368:24:22;;;;1703:8374:17;1368:24:22;4948:4:17;1703:8374;1368:24:22;;;1703:8374:17;;;;;;;;;5111:21;;;1703:8374;5111:21;;;;1703:8374;5111:21;;:::i;:::-;1703:8374;;;5184:20;;;;;;;1703:8374;;;;;141:18:22;1703:8374:17;141:18:22;;;1703:8374:17;;;;;;;;;6326:91;;1703:8374;;;;;5184:20;;6326:91;;5184:20;;;;;;:::i;:::-;4948:4;5360:31;5254:30;;:::i;:::-;5360:31;;:::i;:::-;1368:24:22;5415:28:17;4948:4;;5446;5415:48;;1703:8374;;;;;;:::i;:::-;1368:24:22;;5065:426:17;;;1368:24:22;1703:8374:17;5065:426;;1368:24:22;1703:8374:17;;;;;;;5065:426;;1368:24:22;5065:426:17;;;1368:24:22;1703:8374:17;;141:18:22;;;;;;;;5569:63:17;;1703:8374;5569:63;;;:::i;:::-;;1703:8374;5583:12;-1:-1:-1;;;;;1703:8374:17;5569:63;;;;;;;;;;5415:48;1703:8374;;;;;;;;5569:63;;1703:8374;5569:63;;1703:8374;5569:63;;;;;;1703:8374;5569:63;;;:::i;:::-;;;1703:8374;;;;;;;5569:63;;1703:8374;-1:-1:-1;1703:8374:17;;5569:63;;;-1:-1:-1;5569:63:17;;;1703:8374;;141:18:22;;;;;;;;5415:48:17;;;;;1703:8374;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;1703:8374:17;;;;;;;;;;;;;;;-1:-1:-1;;1703:8374:17;;;;;;;;;;;;1855:49;1703:8374;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;1703:8374:17;;;;;;-1:-1:-1;;;;;1703:8374:17;;;;;;;;;;;;;;2167:12:0;-1:-1:-1;;;;;1703:8374:17;2317:10:0;:25;2313:63;;1703:8374:17;;;;;:::i;:::-;;;;;;;;;;;;-1:-1:-1;;;;;1703:8374:17;;;;;;;;;;;;;;;;-1:-1:-1;;;;;1703:8374:17;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;-1:-1:-1;;;;;1703:8374:17;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;-1:-1:-1;;;;;1703:8374:17;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8813:19;1368:24:22;;;8802:40:17;;;1703:8374;8802:40;;;;1703:8374;;;;;;8802:40;;1703:8374;;-1:-1:-1;;;;;1703:8374:17;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;1368:24:22;;;;;;1703:8374:17;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;1368:24:22;;700:27:20;696:82;;1703:8374:17;1368:24:22;;;866:63:20;;407:6;;;;;1703:8374:17;-1:-1:-1;;;;;1703:8374:17;;;;;;;;;407:6:20;;1703:8374:17;:::i;:::-;407:6:20;1703:8374:17;;407:6:20;;1703:8374:17;:::i;:::-;;407:6:20;;1703:8374:17;;407:6:20;;1368:24:22;1703:8374:17;;-1:-1:-1;;;;;1703:8374:17;;;;;;;944:38:20;;;940:87;;1040:10;;1036:59;;1108:16;;1104:76;;1193:19;;:48;;;;1703:8374:17;1189:108:20;;1310:11;;1306:60;;1703:8374:17;;;;;;;:::i;:::-;407:6:20;;1703:8374:17;1383:53:20;;1368:24:22;;;1703:8374:17;1383:53:20;;1368:24:22;;;1703:8374:17;1383:53:20;;1368:24:22;;;1383:53:20;1368:24:22;1703:8374:17;8994:45;1703:8374;;8994:45;;1703:8374;;8994:45;;1703:8374;;;;;;;;;:::i;:::-;;;;;;8994:45;6326:91;;8994:45;;;;;;:::i;:::-;1368:24:22;8984:56:17;;1703:8374;;;;9059:17;1703:8374;;;;;;;;;;9135:21;;;1703:8374;1368:24:22;;;9124:44:17;;1703:8374;;;;-1:-1:-1;;;;;1703:8374:17;-1:-1:-1;;;;;1703:8374:17;;;;9124:44;1703:8374;:::i;:::-;;;;;;;;;;;;;9186:56;1703:8374;;;;;;-1:-1:-1;1703:8374:17;;;9178:77;1703:8374;;-1:-1:-1;1703:8374:17;;;9178:77;:::i;:::-;1703:8374;;9059:17;1703:8374;;;;;;;;;;;;;;9308:38;1703:8374;;9316:18;;9308:38;:::i;:::-;9361:4;;;;1703:8374;;-1:-1:-1;;;;;1703:8374:17;;;;;9389:9;1703:8374;;;;;;9381:66;;1703:8374;9389:38;;9381:66;:::i;:::-;1703:8374;;-1:-1:-1;;;;;1703:8374:17;;;;;9389:9;1703:8374;;;;;;;;;;;;;;;;;;;;;;9461:84;;;;;1703:8374;;-1:-1:-1;;;9461:84:17;;-1:-1:-1;;;;;1703:8374:17;;;;9461:84;;1703:8374;;;;;1368:24:22;;;1703:8374:17;1368:24:22;;;1703:8374:17;;;;;;;;1368:24:22;;;9461:84:17;;;;;;;;;;;9357:712;;1703:8374;;9461:84;;;;;:::i;:::-;1703:8374;;;;9461:84;1703:8374;;141:18:22;1703:8374:17;;141:18:22;;;;9357:712:17;1703:8374;;;;;;;-1:-1:-1;;;;;1703:8374:17;;;;:::i;:::-;1368:24:22;;1703:8374:17;9790:141;;1368:24:22;1703:8374:17;9790:141;;1368:24:22;;;1703:8374:17;9790:141;;1368:24:22;;;1703:8374:17;;9790:141;;1368:24:22;1703:8374:17;9790:141;;1368:24:22;;;9995:7:17;1703:8374;;;-1:-1:-1;;;;;1703:8374:17;;;;;;9986:72;;;;;;1703:8374;;;;;;141:18:22;;;;;;;;;9986:72:17;;1703:8374;9986:72;;;:::i;:::-;1703:8374;;;;;;;-1:-1:-1;;;1703:8374:17;;;;;;;;;;;141:18:22;-1:-1:-1;;;1703:8374:17;141:18:22;;1703:8374:17;;;;1306:60:20;-1:-1:-1;;;1344:11:20;;1703:8374:17;1005:11:20;1344;1189:108;-1:-1:-1;;;1264:22:20;;1703:8374:17;1147:22:20;1264;1193:48;1217:24;;;;:::i;:::-;1216:25;1193:48;;1703:8374:17;;;;696:82:20;-1:-1:-1;;;750:17:20;;1703:8374:17;750:17:20;;1703:8374:17;;;;;;;;;;;;;;;;;;:::i;:::-;;;;-1:-1:-1;;;;;1703:8374:17;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2313:63:0;-1:-1:-1;;;2351:25:0;;2317:10;1703:8374:17;;;2351:25:0;;1703:8374:17;;;;;;;;;;;-1:-1:-1;;1703:8374:17;;;;;;-1:-1:-1;;;;;1703:8374:17;;:::i;:::-;;;;1910:44;1703:8374;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;1703:8374:17;;;;;;:::i;:::-;;;-1:-1:-1;;;;;1703:8374:17;;;;;;;;;;;:::i;:::-;;;;;-1:-1:-1;;;;;1703:8374:17;;;;;;;;;;;:::i;:::-;;;;;-1:-1:-1;;;2495:62:17;;-1:-1:-1;;;;;;;;;;;1703:8374:17;2495:62;;1703:8374;2546:10;1703:8374;141:18:22;;1703:8374:17;;;;;;;;;;;;;;;-1:-1:-1;;;;;1703:8374:17;2495:62;;;;;;2487:81;2495:62;;;;;2487:81;;:::i;:::-;-1:-1:-1;;;;;1703:8374:17;;3730:23;;1703:8374;;3786:32;;;1703:8374;;3845:13;3860:18;;;;;;1703:8374;;;3845:13;2501;;3896:43;-1:-1:-1;;;;;3904:10:17;;1703:8374;3904:10;;;:::i;:::-;;:::i;:::-;1703:8374;3904:24;;3896:43;:::i;:::-;3985:10;;;;;;:::i;:::-;1703:8374;;;;;;;;;-1:-1:-1;;;;;3971:10:17;;;;;;:::i;:::-;;:::i;:::-;1703:8374;-1:-1:-1;1703:8374:17;;;;-1:-1:-1;1703:8374:17;;;;;;;;;;;;;;;;;4035:10;;;;;;:::i;:::-;-1:-1:-1;;;;;1703:8374:17;;;;;4047:10;;;;;;:::i;:::-;1703:8374;;;2546:10;4014:44;;;;1703:8374;3845:13;;1703:8374;;;-1:-1:-1;;;1703:8374:17;;;;;;;;;;;141:18:22;-1:-1:-1;;;1703:8374:17;141:18:22;;1703:8374:17;;;;;;;-1:-1:-1;;;1703:8374:17;;;;;;;;;;;141:18:22;-1:-1:-1;;;1703:8374:17;141:18:22;;1703:8374:17;;;;2495:62;1703:8374;;141:18:22;1703:8374:17;;141:18:22;;;;1703:8374:17;;;;;;;;;;;;;1500:62:6;;:::i;:::-;1703:8374:17;;-1:-1:-1;;;;;;1703:8374:17;;;;;;-1:-1:-1;;;;;1703:8374:17;3052:40:6;1703:8374:17;;3052:40:6;1703:8374:17;;;;;;;;;-1:-1:-1;;1703:8374:17;;;;;;:::i;:::-;;;:::i;:::-;;;;;-1:-1:-1;;;2495:62:17;;-1:-1:-1;;;;;;;;;;;1703:8374:17;2495:62;;1703:8374;2546:10;1703:8374;141:18:22;;1703:8374:17;;;;;;;;;2495:62;;1703:8374;;-1:-1:-1;;;;;1703:8374:17;2495:62;;;;;;2487:81;2495:62;;;;;2487:81;;:::i;:::-;3186:45;3194:26;;;:::i;:::-;3186:45;:::i;:::-;3249:27;;;:::i;:::-;1703:8374;;;-1:-1:-1;;;;;1703:8374:17;;;;;;3299:9;1703:8374;;;;;;;-1:-1:-1;;;;;;1703:8374:17;;;;;;;;;;;2546:10;3343:41;1703:8374;;3343:41;1703:8374;;;;;-1:-1:-1;;;1703:8374:17;;;;;;;;;;;141:18:22;-1:-1:-1;;;2495:62:17;141:18:22;;1703:8374:17;;;;2495:62;1703:8374;;141:18:22;1703:8374:17;;141:18:22;;;;1703:8374:17;;;;;;;;;;;;;2026:22;1703:8374;;;-1:-1:-1;;;;;1703:8374:17;;;;;;;;;;;;;;;-1:-1:-1;;1703:8374:17;;;;-1:-1:-1;;;;;1703:8374:17;;;:::i;:::-;;;;:::i;:::-;;;;;;;;;;;;;;1960:60;1703:8374;-1:-1:-1;1703:8374:17;;;;;-1:-1:-1;1703:8374:17;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1786:29;-1:-1:-1;;;;;1703:8374:17;;;;;;;;;;;;;;;;;;;;;;1754:26;1703:8374;;;;;;-1:-1:-1;1703:8374:17;;-1:-1:-1;;1703:8374:17;;;;;;:::i;:::-;;;;:::i;:::-;;;-1:-1:-1;;;;;1703:8374:17;;;;;;;;;;;-1:-1:-1;;;;;1703:8374:17;;;;;;;;;;;;;;-1:-1:-1;;1703:8374:17;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;2649:45:17;;5864:10;1703:8374;2649:45;;1703:8374;-1:-1:-1;;;;;1703:8374:17;;;;;;;;;2649:45;;;;;;2640:70;2649:45;1703:8374;2649:45;;;1703:8374;2648:46;;2640:70;:::i;:::-;1703:8374;;-1:-1:-1;;;2649:45:17;;1703:8374;2649:45;;1703:8374;;;;;;;;141:18:22;2649:45:17;;;;;;;2640:70;1703:8374;2649:45;1703:8374;2649:45;1703:8374;2649:45;;;2648:46;;2640:70;:::i;:::-;1703:8374;;-1:-1:-1;;;2774:48:17;;2816:4;1703:8374;2774:48;;1703:8374;;;;;;2774:48;;;;;;;1703:8374;2774:48;;;1703:8374;2773:49;1703:8374;;5916:31;5924:11;;;5916:31;:::i;:::-;-1:-1:-1;;;;;1703:8374:17;;;;;;;5965:9;1703:8374;;;;;;;;;5957:60;;1703:8374;5965:32;;5957:60;:::i;:::-;1703:8374;;-1:-1:-1;;;6035:37:17;;5864:10;1703:8374;6035:37;;1703:8374;;;;;6035:37;;;;;;;;;1703:8374;6035:37;;;1703:8374;6035:48;;1703:8374;;6114:17;;1703:8374;;;;;;;;;;;;;;;-1:-1:-1;;;;;1703:8374:17;;;;;;;;;;-1:-1:-1;;;;;1703:8374:17;6163:40;1703:8374;;1368:24:22;1703:8374:17;;6828:27;1703:8374;-1:-1:-1;;;;;1703:8374:17;;;;;;6238:12;1703:8374;;;;;;;;;;6230:55;1703:8374;;;;;;6230:55;:::i;:::-;1703:8374;;;;;;;;;;;;;;;;;;;;;;;;;;;;6326:91;1703:8374;6326:91;;1368:24:22;1703:8374:17;1368:24:22;;1703:8374:17;;1368:24:22;;1703:8374:17;1368:24:22;1703:8374:17;1368:24:22;;1703:8374:17;1368:24:22;1703:8374:17;1368:24:22;;1703:8374:17;;6326:91;;;;;;:::i;:::-;1368:24:22;1703:8374:17;;6755:21;1703:8374;6755:21;;1703:8374;;6755:21;;;1703:8374;6755:21;;:::i;:::-;1703:8374;;6828:27;;;1703:8374;6828:27;;;1368:24:22;1703:8374:17;1368:24:22;;;;:::i;:::-;6828:27:17;6326:91;;6828:27;;;;;;:::i;:::-;1703:8374;7011:31;6905:30;;:::i;:::-;7011:31;;:::i;:::-;7066:28;;;:48;;;;7097:4;7066:48;;1703:8374;;;;;;:::i;:::-;1368:24:22;;1703:8374:17;6709:433;;1368:24:22;1703:8374:17;6709:433;;1368:24:22;1703:8374:17;;;;;;;6709:433;;1368:24:22;1703:8374:17;6709:433;;1368:24:22;1703:8374:17;;;;;7234:12;1703:8374;;;;141:18:22;;;;7220:61:17;;1703:8374;7220:61;;;;;1703:8374;7220:61;;;:::i;:::-;;;;;;;;;;;1703:8374;7220:61;;;7066:48;-1:-1:-1;7332:4:17;;;;1703:8374;;;5965:9;1703:8374;;;;;;;;;;;-1:-1:-1;;;1745:53:11;;;;;;5864:10:17;1703:8374;1745:53:11;;1703:8374:17;-1:-1:-1;;;;;1703:8374:17;;;1368:24:22;;;1703:8374:17;1368:24:22;;;1703:8374:17;;;;;1745:53:11;;1703:8374:17;1368:24:22;;;1745:53:11;1368:24:22;1745:53:11;8507:421;;;;;;;;;;;;8942:15;;8960:26;;;:31;8942:68;8938:146;;1703:8374:17;;;;;;;5864:10;;7486:55;1703:8374;5864:10;7486:55;;7328:726;8095:28;;;1703:8374;;-1:-1:-1;;;8196:68:17;;5864:10;1703:8374;8196:68;;1703:8374;2816:4;1368:24:22;;;1703:8374:17;1368:24:22;;;1703:8374:17;;;;-1:-1:-1;;;;;8215:4:17;1703:8374;;;;1368:24:22;1703:8374:17;8196:68;1703:8374;8196:68;;;;;;;1703:8374;8196:68;1703:8374;8196:68;;;8091:510;1703:8374;;;141:18:22;;;;;;;;8330:52:17;;;1703:8374;8330:52;;1703:8374;;1368:24:22;;1703:8374:17;8330:52;;;;;;;8408:63;8330:52;1703:8374;8330:52;;;8091:510;1703:8374;;;;141:18:22;;;;;;;;;8408:63:17;;1703:8374;8408:63;;;:::i;:::-;;;;;;;;;;;;;;8091:510;8396:75;8091:510;8615:22;;;;1703:8374;;8408:63;;;1703:8374;8408:63;;1703:8374;8408:63;;;;;;1703:8374;8408:63;;;:::i;:::-;;;1703:8374;;;;;8408:63;;;;;;-1:-1:-1;8408:63:17;;8330:52;;;;;;;;;;;;;:::i;:::-;;;;1703:8374;;141:18:22;1703:8374:17;;141:18:22;;;;8196:68:17;;;;;;;;;;;;;:::i;:::-;;;8091:510;1703:8374;;-1:-1:-1;;;8514:76:17;;1703:8374;-1:-1:-1;1703:8374:17;;;;;;;;;8514:76;;1703:8374;8514:76;;;:::i;:::-;;;;;;;;;;;;;;8091:510;8502:88;8091:510;;8514:76;;;1703:8374;8514:76;;1703:8374;8514:76;;;;;;1703:8374;8514:76;;;:::i;:::-;;;1703:8374;;;;;8514:76;;;;;;-1:-1:-1;8514:76:17;;8938:146:11;-1:-1:-1;;;9033:40:11;;1703:8374:17;;;;;9033:40:11;;8942:68;1703:8374:17;8994:16:11;;8942:68;;8507:421;1703:8374:17;8507:421:11;;;;;;;;7328:726:17;1703:8374;;;;;;:::i;:::-;1368:24:22;;1703:8374:17;7787:129;;1368:24:22;-1:-1:-1;1703:8374:17;7787:129;;1368:24:22;;;1703:8374:17;7787:129;;1368:24:22;;;1703:8374:17;7787:129;;1368:24:22;;;1703:8374:17;7787:129;;1368:24:22;7980:7:17;1703:8374;-1:-1:-1;;;;;1703:8374:17;7971:72;;;;;1703:8374;;-1:-1:-1;;;7971:72:17;;1703:8374;;;;;;;;;;;7971:72;;5864:10;1703:8374;7971:72;;;:::i;:::-;;;;;;;;;;;7328:726;;;;;;7971:72;;;;1703:8374;7971:72;;;:::i;:::-;1703:8374;7971:72;;;;;;1703:8374;;141:18:22;1703:8374:17;141:18:22;;;;;7220:61:17;;;;1703:8374;7220:61;;1703:8374;7220:61;;;;;;1703:8374;7220:61;;;:::i;:::-;;;1703:8374;;;;;7220:61;;;;;;;-1:-1:-1;7220:61:17;;7066:48;1703:8374;7066:48;;;1703:8374;;;-1:-1:-1;;;1703:8374:17;;;;;;;;;;;141:18:22;-1:-1:-1;;;1703:8374:17;141:18:22;;1703:8374:17;;;;;;;-1:-1:-1;;;1703:8374:17;;;;;;;;;;;141:18:22;-1:-1:-1;;;1703:8374:17;141:18:22;;1703:8374:17;;;;;;;-1:-1:-1;;;1703:8374:17;;;;;;;;;;;141:18:22;-1:-1:-1;;;1703:8374:17;141:18:22;;1703:8374:17;;;;6035:37;;;;1703:8374;6035:37;;1703:8374;6035:37;;;;;;1703:8374;6035:37;;;:::i;:::-;;;1703:8374;;;;;;;6035:37;;;;;;-1:-1:-1;6035:37:17;;1703:8374;;;-1:-1:-1;;;1703:8374:17;;;;;;;;;;;141:18:22;-1:-1:-1;;;1703:8374:17;141:18:22;;1703:8374:17;;;;2774:48;;;;1703:8374;2774:48;1703:8374;2774:48;;;;;;;:::i;:::-;;;;2649:45;;;;;;;;;;;;;;:::i;:::-;;;;;;;;1703:8374;2649:45;1703:8374;2649:45;;;;;;;:::i;1703:8374::-;;;;;;-1:-1:-1;;1703:8374:17;;;;;;:::i;:::-;;;:::i;:::-;;;;;;;;;;;;;;;;-1:-1:-1;;;2495:62:17;;-1:-1:-1;;;;;;;;;;;1703:8374:17;2495:62;;1703:8374;2546:10;1703:8374;141:18:22;;1703:8374:17;;;;;;;;;;;-1:-1:-1;;;;;1703:8374:17;2495:62;;;;;;;-1:-1:-1;;;;;2495:62:17;2487:81;2495:62;1703:8374;2495:62;;;2487:81;;:::i;:::-;1703:8374;;;4541:12;1703:8374;;;;;4541:33;1703:8374;;;;;;;;;;;;;;;;;;;;;;;;;;;;2495:62;;;;1703:8374;2495:62;1703:8374;2495:62;;;;;;;:::i;:::-;;;;1703:8374;;;;;;-1:-1:-1;;1703:8374:17;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;1533:56:0;;;:100;;;;1703:8374:17;;;;;;;1533:100:0;-1:-1:-1;;;1593:40:0;;-1:-1:-1;1533:100:0;;;1703:8374:17;;;;-1:-1:-1;;;;;1703:8374:17;;;;;;:::o;:::-;;;;-1:-1:-1;;;;;1703:8374:17;;;;;;:::o;:::-;;;;-1:-1:-1;;;;;1703:8374:17;;;;;;:::o;:::-;;;;-1:-1:-1;;;;;1703:8374:17;;;;;;:::o;:::-;;;;;;;-1:-1:-1;;;;;1703:8374:17;;;;;;;:::o;:::-;;;;-1:-1:-1;1703:8374:17;;;;;-1:-1:-1;1703:8374:17;;1368:24:22;1703:8374:17;;;;;-1:-1:-1;;;;;1703:8374:17;;;;;;;:::o;:::-;;;;;;;-1:-1:-1;;;;;1703:8374:17;;;;;;;:::o;:::-;;;6326:91;;1703:8374;;;;;;;;-1:-1:-1;;;;;1703:8374:17;;;;;;;:::o;:::-;;;;;;;;;;;;;-1:-1:-1;;;;;1703:8374:17;;;;;;;;;;;;;;;;;:::o;141:18:22:-;;;;;;;;;;1703:8374:17;;;;;;;141:18:22;:::o;:::-;;;;:::o;:::-;1703:8374:17;;-1:-1:-1;;;141:18:22;;;;;;;;;;;;-1:-1:-1;;;141:18:22;;;;;;;1703:8374:17;;;;:::o;:::-;;;-1:-1:-1;;;1703:8374:17;;;;;;;;;;;141:18:22;-1:-1:-1;;;141:18:22;;;1703:8374:17;;;;;;;;:::o;:::-;;;-1:-1:-1;;;1703:8374:17;;;;;;;;;;;141:18:22;-1:-1:-1;;;141:18:22;;;1703:8374:17;;;;;;;;:::o;:::-;;;-1:-1:-1;;;1703:8374:17;;;;;;;;;;;141:18:22;-1:-1:-1;;;141:18:22;;;1703:8374:17;;;;;;;;:::o;:::-;;;-1:-1:-1;;;1703:8374:17;;;;;;;;;;;141:18:22;-1:-1:-1;;;141:18:22;;;1703:8374:17;;;;1368:24:22;;;141:18;;;;;1368:24;;;;;141:18;;;1368:24;-1:-1:-1;1368:24:22;;;;;;1703:8374:17;;-1:-1:-1;;1703:8374:17;1368:24:22;;;:::o;:::-;-1:-1:-1;;;;;1368:24:22;;;;;;;;;:::o;:::-;1703:8374:17;;;;1368:24:22;1703:8374:17;;:::i;:::-;;1368:24:22;;;;1703:8374:17;1368:24:22;;;;;;;;;:::o;:::-;;1703:8374:17;;;;;;:::i;:::-;;1368:24:22;;1703:8374:17;1368:24:22;;;;;;;;;;;;;;;-1:-1:-1;;;;;1368:24:22;;;;1703:8374:17;1368:24:22;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;-1:-1:-1;;1368:24:22;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;141:18;;;;;1368:24;;;;;;;;;;1703:8374:17;;;1368:24:22;;1703:8374:17;;;;;;;1368:24:22;;;;1703:8374:17;1368:24:22;;;1703:8374:17;1368:24:22;;;;;;;;;;;;;;:::i;:::-;;:::o;:::-;;;;;-1:-1:-1;;;;;1703:8374:17;;;1368:24:22;;;;;;;;1703:8374:17;1368:24:22;;;;;;;;;;;;;;;;;;;;;;;1703:8374:17;;;;;;;;;;;;;;1368:24:22;;1703:8374:17;1368:24:22;;;1703:8374:17;1368:24:22;;;;;;;1703:8374:17;1368:24:22;;;;;;;1703:8374:17;1368:24:22;;;;1703:8374:17;;1368:24:22;;;1703:8374:17;1368:24:22;;;;1703:8374:17;;1368:24:22;;;1703:8374:17;1368:24:22;;1703:8374:17;;1368:24:22;;1703:8374:17;1368:24:22:o;1703:8374:17:-;;;;:::o;:::-;;;-1:-1:-1;;;1703:8374:17;;;;;;;;;;;141:18:22;-1:-1:-1;;;141:18:22;;;1703:8374:17;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;-1:-1:-1;;;;;1703:8374:17;;;;;;;:::o;:::-;;-1:-1:-1;;;;;1703:8374:17;;;;;;;:::o;:::-;-1:-1:-1;;;;;1703:8374:17;;;;;;-1:-1:-1;;1703:8374:17;;;;:::o;:::-;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;;;;;;-1:-1:-1;1703:8374:17;;;;;;;;;;;;;;:::o;2793:186:3:-;2914:60;1703:8374:17;;141:18:22;;;;2914:60:3;;;;1774:10;;2914:60;;;1703:8374:17;1774:10:3;;1703:8374:17;;1774:10:3;;;1703:8374:17;1774:10:3;2914:60;;;;;;:::i;251:133:21:-;-1:-1:-1;;;;;1703:8374:17;;332:19:21;;;;:45;;325:52;251:133;:::o;332:45::-;355:17;;;:22;;251:133;:::o;1796:162:6:-;1710:6;1703:8374:17;-1:-1:-1;;;;;1703:8374:17;735:10:12;1855:23:6;1851:101;;1796:162::o;1851:101::-;1901:40;;;1710:6;1901:40;735:10:12;1901:40:6;1703:8374:17;;1710:6:6;1901:40;1703:8374:17;;;-1:-1:-1;;;;;1703:8374:17;;;;;;:::o

Swarm Source

ipfs://d0444452ebe809b512177136b2f157ed3d7a36b805a508937e326e22623f2918

Block Transaction Difficulty Gas Used Reward
View All Blocks Produced

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

Validator Index Block Amount
View All Withdrawals

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

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