Contract 0x9B36f165baB9ebe611d491180418d8De4b8f3a1f 6

 
Txn Hash Method
Block
From
To
Value [Txn Fee]
0xa9a86a70680ca55d1fdb948207482254ec7855985d254cad38508faf59d7be270x5fdb3d8d45939422022-01-12 19:51:1915 days 16 hrs ago0xdb26b95bfbd77e2842fe31ac2ab3f3434b3f608a IN  0x9b36f165bab9ebe611d491180418d8de4b8f3a1f0.05 ETH0.002284559742 ETH
0x87c65d0340d9a64b4880c53f88d34e97b65a329fa1ecc6f42a90e4f2da7c4dfb0x5fdb3d8d45937002022-01-12 19:34:5315 days 16 hrs ago0xdb26b95bfbd77e2842fe31ac2ab3f3434b3f608a IN  0x9b36f165bab9ebe611d491180418d8de4b8f3a1f0.05 ETH0.002282449858 ETH
0x8e0c9c8e9fbff3e72667a62126556527e81228196b5e9567c313b0ffc6ad71a50x5fdb3d8d45799992022-01-12 7:05:3116 days 5 hrs ago0xdb26b95bfbd77e2842fe31ac2ab3f3434b3f608a IN  0x9b36f165bab9ebe611d491180418d8de4b8f3a1f0.05 ETH0.002394321027 ETH
0xf46ee26af9457cfe9b7c31cf04fe9842691a5442a1e4c442bb622d473b3b6fca0x5fdb3d8d45798452022-01-12 6:54:1916 days 5 hrs ago0xdb26b95bfbd77e2842fe31ac2ab3f3434b3f608a IN  0x9b36f165bab9ebe611d491180418d8de4b8f3a1f0.05 ETH0.002394319373 ETH
0xe0b54162e1488875b9cc59b5c6ea778bc05fa6aaa8d7dadefc68001d3e2fc9320x5fdb3d8d45797082022-01-12 6:43:2716 days 5 hrs ago0xdb26b95bfbd77e2842fe31ac2ab3f3434b3f608a IN  0x9b36f165bab9ebe611d491180418d8de4b8f3a1f0.05 ETH0.002396602174 ETH
0x98512355ce4ffcdf4fc2c80ce1017ce78bbc5c86880778e2822d49a201c441eb0x5fdb3d8d45754192022-01-12 1:39:0616 days 10 hrs ago0xdb26b95bfbd77e2842fe31ac2ab3f3434b3f608a IN  0x9b36f165bab9ebe611d491180418d8de4b8f3a1f0.05 ETH0.002423802758 ETH
0x19b6ead1478e1be306b5dcdaea90a9347e7e6bad04c8651d7d84dd48b795e6620x5fdb3d8d45694502022-01-11 20:05:1516 days 16 hrs ago0xdfe4f07d1f36b8d559b25082460a4f6a72531de2 IN  0x9b36f165bab9ebe611d491180418d8de4b8f3a1f0.05 ETH0.002384327919 ETH
0x7039b12c42062eefa49597d484520af84070aa65a6d9a41467ecf3c5836613fe0x5fdb3d8d45691432022-01-11 19:48:1516 days 16 hrs ago0xdfe4f07d1f36b8d559b25082460a4f6a72531de2 IN  0x9b36f165bab9ebe611d491180418d8de4b8f3a1f0.05 ETH0.002382068188 ETH
0x361a0a9787023c75acc9d74a6778936851f7e0e96a1620d465ec2203e7a069a30x5fdb3d8d45596592022-01-11 13:05:2816 days 23 hrs ago0x27ee985d1e446ec71c277c89cd877ec4eeaa236c IN  0x9b36f165bab9ebe611d491180418d8de4b8f3a1f0.05 ETH0.002410492938 ETH
0xe3fc8d76a2b8b35b266d3bb44a2d039b527a3c2fa90ff3fcd72671915dfa4d1a0x5fdb3d8d45587382022-01-11 12:09:1017 days 25 mins ago0x27ee985d1e446ec71c277c89cd877ec4eeaa236c IN  0x9b36f165bab9ebe611d491180418d8de4b8f3a1f0.15 ETH0.002451739154 ETH
0x1a40fd9f668b3754a492e86d06f59995060aeb5e19e0561524259a366824912e0x6080604045580652022-01-11 11:22:0217 days 1 hr ago0x58b529f9084d7eaa598eb3477fe36064c5b7bbc1 IN  Create: TransferSwap0 ETH0.095258567514 ETH
[ Download CSV Export 
Parent Txn Hash Block From To Value
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
TransferSwap

Compiler Version
v0.8.9+commit.e5eed63a

Optimization Enabled:
Yes with 800 runs

Other Settings:
default evmVersion, GNU GPLv3 license

Contract Source Code (Solidity Standard Json-Input format)

File 1 of 16 : TransferSwap.sol
// SPDX-License-Identifier: GPL-3.0-only

pragma solidity >=0.8.9;

import "@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol";
import "@openzeppelin/contracts/token/ERC20/IERC20.sol";
import "../framework/MsgSenderApp.sol";
import "../framework/MsgReceiverApp.sol";
import "../../interfaces/IWETH.sol";
import "../../interfaces/IUniswapV2.sol";

contract TransferSwap is MsgSenderApp, MsgReceiverApp {
    using SafeERC20 for IERC20;

    modifier onlyEOA() {
        require(msg.sender == tx.origin, "Not EOA");
        _;
    }

    struct SwapInfo {
        // if this array has only one element, it means no need to swap
        address[] path;
        // only needed if path.length > 1
        address dex;
        uint256 deadline;
        uint256 minRecvAmt;
    }

    struct SwapRequest {
        SwapInfo swap;
        address receiver;
        uint64 nonce;
        bool nativeOut;
    }

    enum SwapStatus {
        Null,
        Succeeded,
        Failed,
        Fallback
    }

    // emitted when requested dstChainId == srcChainId, no bridging
    event DirectSwap(
        bytes32 id,
        uint64 srcChainId,
        uint256 amountIn,
        address tokenIn,
        uint256 amountOut,
        address tokenOut
    );
    event SwapRequestSent(bytes32 id, uint64 dstChainId, uint256 srcAmount, address srcToken, address dstToken);
    event SwapRequestDone(bytes32 id, uint256 dstAmount, SwapStatus status);

    mapping(address => uint256) public minSwapAmounts;
    mapping(address => bool) supportedDex;

    // erc20 wrap of gas token of this chain, eg. WETH
    address public nativeWrap;

    constructor(
        address _msgbus,
        address _supportedDex,
        address _bridge,
        address _bridgeToken,
        address _nativeWrap
    ) {
        msgBus = _msgbus;
        supportedDex[_supportedDex] = true;
        liquidityBridge = _bridge;
        tokenBridgeTypes[_bridgeToken] = BridgeType.Liquidity;
        nativeWrap = _nativeWrap;
    }

    function transferWithSwapNative(
        address _receiver,
        uint256 _amountIn,
        uint64 _dstChainId,
        SwapInfo calldata _srcSwap,
        SwapInfo calldata _dstSwap,
        uint32 _maxBridgeSlippage,
        uint64 _nonce,
        bool _nativeOut
    ) external payable onlyEOA {
        require(msg.value == _amountIn, "Amount mismatch");
        require(_srcSwap.path[0] == nativeWrap, "token mismatch");
        IWETH(nativeWrap).deposit{value: _amountIn}();
        _transferWithSwap(
            _receiver,
            _amountIn,
            _dstChainId,
            _srcSwap,
            _dstSwap,
            _maxBridgeSlippage,
            _nonce,
            _nativeOut
        );
    }

    function transferWithSwap(
        address _receiver,
        uint256 _amountIn,
        uint64 _dstChainId,
        SwapInfo calldata _srcSwap,
        SwapInfo calldata _dstSwap,
        uint32 _maxBridgeSlippage,
        uint64 _nonce
    ) external onlyEOA {
        IERC20(_srcSwap.path[0]).safeTransferFrom(msg.sender, address(this), _amountIn);
        _transferWithSwap(_receiver, _amountIn, _dstChainId, _srcSwap, _dstSwap, _maxBridgeSlippage, _nonce, false);
    }

    /**
     * @notice Sends a cross-chain transfer via the liquidity pool-based bridge and sends a message specifying a wanted swap action on the 
               destination chain via the message bus
     * @param _receiver the app contract that implements the MessageReceiver abstract contract
     * @param _amountIn the input amount that the user wants to swap and/or bridge
     * @param _dstChainId destination chain ID
     * @param _srcSwap a struct containing swap related requirements
     * @param _dstSwap a struct containing swap related requirements
     * @param _maxBridgeSlippage the max acceptable slippage at bridge, given as percentage in point (pip). Eg. 5000 means 0.5%.
     *        Must be greater than minimalMaxSlippage. Receiver is guaranteed to receive at least (100% - max slippage percentage) * amount or the
     *        transfer can be refunded.
     */
    function _transferWithSwap(
        address _receiver,
        uint256 _amountIn,
        uint64 _dstChainId,
        SwapInfo memory _srcSwap,
        SwapInfo memory _dstSwap,
        uint32 _maxBridgeSlippage,
        uint64 _nonce,
        bool _nativeOut
    ) private {
        require(_srcSwap.path.length > 0, "empty src swap path");
        address srcTokenOut = _srcSwap.path[_srcSwap.path.length - 1];

        require(_amountIn > minSwapAmounts[_srcSwap.path[0]], "amount must be greateer than min swap amount");
        uint64 chainId = uint64(block.chainid);
        require(_srcSwap.path.length > 1 || _dstChainId != chainId, "noop is not allowed"); // revert early to save gas

        uint256 srcAmtOut = _amountIn;

        // swap source token for intermediate token on the source DEX
        if (_srcSwap.path.length > 1) {
            bool ok = true;
            (ok, srcAmtOut) = _trySwap(_srcSwap, _amountIn);
            if (!ok) revert("src swap failed");
        }

        bytes32 id; // id is only a means for history tracking
        if (_dstChainId == chainId) {
            // no need to bridge, directly send the tokens to user
            IERC20(srcTokenOut).safeTransfer(_receiver, srcAmtOut);
            // use uint64 for chainid to be consistent with other components in the system
            id = keccak256(abi.encode(msg.sender, chainId, _receiver, _nonce, _srcSwap));
            emit DirectSwap(id, chainId, _amountIn, _srcSwap.path[0], srcAmtOut, srcTokenOut);
        } else {
            require(_dstSwap.path.length > 0, "empty dst swap path");
            bytes memory message = abi.encode(
                SwapRequest({swap: _dstSwap, receiver: msg.sender, nonce: _nonce, nativeOut: _nativeOut})
            );
            id = _computeSwapRequestId(msg.sender, chainId, _dstChainId, message);
            // bridge the intermediate token to destination chain along with the message
            // TODO calculate nonce
            sendMessageWithTransfer(
                _receiver,
                srcTokenOut,
                srcAmtOut,
                _dstChainId,
                _nonce,
                _maxBridgeSlippage,
                message
            );
            emit SwapRequestSent(id, _dstChainId, _amountIn, _srcSwap.path[0], _dstSwap.path[_dstSwap.path.length - 1]);
        }
    }

    /**
     * @notice called by MessageBus when the tokens are checked to be arrived at this contract's address.
               sends the amount received to the receiver. swaps beforehand if swap behavior is defined in message
     * NOTE: if the swap fails, it sends the tokens received directly to the receiver as fallback behavior
     * @param _token the address of the token sent through the bridge
     * @param _amount the amount of tokens received at this contract through the cross-chain bridge
     * @param _srcChainId source chain ID
     * @param _message SwapRequest message that defines the swap behavior on this destination chain
     */
    function executeMessageWithTransfer(
        address, // _sender
        address _token,
        uint256 _amount,
        uint64 _srcChainId,
        bytes memory _message
    ) external override onlyMessageBus {
        SwapRequest memory m = abi.decode((_message), (SwapRequest));
        require(_token == m.swap.path[0], "bridged token must be the same as the first token in destination swap path");
        bytes32 id = _computeSwapRequestId(m.receiver, _srcChainId, uint64(block.chainid), _message);
        uint256 dstAmount;
        SwapStatus status = SwapStatus.Succeeded;

        if (m.swap.path.length > 1) {
            bool ok = true;
            (ok, dstAmount) = _trySwap(m.swap, _amount);
            if (ok) {
                _sendToken(m.swap.path[m.swap.path.length - 1], dstAmount, m.receiver, m.nativeOut);
                status = SwapStatus.Succeeded;
            } else {
                // handle swap failure, send the received token directly to receivr
                _sendToken(_token, _amount, m.receiver, false);
                dstAmount = _amount;
                status = SwapStatus.Fallback;
            }
        } else {
            // no need to swap, directly send the bridged token to user
            _sendToken(m.swap.path[0], _amount, m.receiver, m.nativeOut);
            dstAmount = _amount;
            status = SwapStatus.Succeeded;
        }
        emit SwapRequestDone(id, dstAmount, status);
    }

    function _sendToken(
        address _token,
        uint256 _amount,
        address _receiver,
        bool _nativeOut
    ) private {
        if (_nativeOut) {
            require(_token == nativeWrap, "token mismatch");
            IWETH(nativeWrap).withdraw(_amount);
            (bool sent, ) = _receiver.call{value: _amount, gas: 50000}("");
            require(sent, "failed to send native");
        } else {
            IERC20(_token).safeTransfer(_receiver, _amount);
        }
    }

    /**
     * @notice called by MessageBus when the executeMessageWithTransfer call fails. does nothing but emitting a "fail" event
     * @param _srcChainId source chain ID
     * @param _message SwapRequest message that defines the swap behavior on this destination chain
     */
    function executeMessageWithTransferFallback(
        address, // _sender
        address, // _token
        uint256, // _amount
        uint64 _srcChainId,
        bytes memory _message
    ) external override onlyMessageBus {
        SwapRequest memory m = abi.decode((_message), (SwapRequest));
        bytes32 id = _computeSwapRequestId(m.receiver, _srcChainId, uint64(block.chainid), _message);
        emit SwapRequestDone(id, 0, SwapStatus.Failed);
    }

    function _trySwap(SwapInfo memory _swap, uint256 _amount) private returns (bool ok, uint256 amountOut) {
        uint256 zero;
        if (!supportedDex[_swap.dex]) {
            return (false, zero);
        }
        IERC20(_swap.path[0]).safeIncreaseAllowance(_swap.dex, _amount);
        try
            IUniswapV2(_swap.dex).swapExactTokensForTokens(
                _amount,
                _swap.minRecvAmt,
                _swap.path,
                address(this),
                _swap.deadline
            )
        returns (uint256[] memory amounts) {
            return (true, amounts[amounts.length - 1]);
        } catch {
            return (false, zero);
        }
    }

    function _computeSwapRequestId(
        address _sender,
        uint64 _srcChainId,
        uint64 _dstChainId,
        bytes memory _message
    ) private pure returns (bytes32) {
        return keccak256(abi.encodePacked(_sender, _srcChainId, _dstChainId, _message));
    }

    function setMinSwapAmount(address _token, uint256 _minSwapAmount) external onlyOwner {
        minSwapAmounts[_token] = _minSwapAmount;
    }

    function setSupportedDex(address _dex, bool _enabled) external onlyOwner {
        supportedDex[_dex] = _enabled;
    }

    function setNativeWrap(address _nativeWrap) external onlyOwner {
        nativeWrap = _nativeWrap;
    }

    // This is needed to receive ETH when calling `IWETH.withdraw`
    receive() external payable {}
}

File 2 of 16 : MsgSenderApp.sol
// SPDX-License-Identifier: GPL-3.0-only

pragma solidity 0.8.9;

import "@openzeppelin/contracts/token/ERC20/IERC20.sol";
import "@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol";
import "./IBridge.sol";
import "./MsgBusAddr.sol";
import "../messagebus/MessageBus.sol";

abstract contract MsgSenderApp is MsgBusAddr {
    using SafeERC20 for IERC20;

    address public liquidityBridge; // liquidity bridge address
    address public pegBridge; // peg bridge address
    address public pegVault; // peg original vault address

    enum BridgeType {
        Null,
        Liquidity,
        PegDeposit,
        PegBurn
    }
    mapping(address => BridgeType) public tokenBridgeTypes;

    // ============== functions called by apps ==============

    function sendMessage(
        address _receiver,
        uint64 _dstChainId,
        bytes memory _message
    ) internal {
        MessageBus(msgBus).sendMessage(_receiver, _dstChainId, _message);
    }

    function sendMessageWithTransfer(
        address _receiver,
        address _token,
        uint256 _amount,
        uint64 _dstChainId,
        uint64 _nonce,
        uint32 _maxSlippage,
        bytes memory _message
    ) internal {
        BridgeType bt = tokenBridgeTypes[_token];
        address bridge;
        bytes32 transferId;
        if (bt == BridgeType.Liquidity) {
            bridge = liquidityBridge;
            IERC20(_token).safeIncreaseAllowance(liquidityBridge, _amount);
            IBridge(liquidityBridge).send(_receiver, _token, _amount, _dstChainId, _nonce, _maxSlippage);
            transferId = keccak256(
                abi.encodePacked(address(this), _receiver, _token, _amount, _dstChainId, _nonce, uint64(block.chainid))
            );
        } else if (bt == BridgeType.PegDeposit) {
            bridge = pegVault;
            IBridge(pegVault).deposit(_token, _amount, _dstChainId, _receiver, _nonce);
            transferId = keccak256(
                abi.encodePacked(address(this), _token, _amount, _dstChainId, _receiver, _nonce, uint64(block.chainid))
            );
        } else if (bt == BridgeType.PegBurn) {
            bridge = pegBridge;
            IBridge(pegBridge).burn(_token, _amount, _receiver, _nonce);
            transferId = keccak256(
                abi.encodePacked(address(this), _token, _amount, _receiver, _nonce, uint64(block.chainid))
            );
        } else {
            revert("bridge token not supported");
        }
        MessageBus(msgBus).sendMessageWithTransfer(_receiver, _dstChainId, bridge, transferId, _message);
    }

    function sendTokenTransfer(
        address _receiver,
        address _token,
        uint256 _amount,
        uint64 _dstChainId,
        uint64 _nonce,
        uint32 _maxSlippage
    ) internal {
        BridgeType bt = tokenBridgeTypes[_token];
        if (bt == BridgeType.Liquidity) {
            IERC20(_token).safeIncreaseAllowance(liquidityBridge, _amount);
            IBridge(liquidityBridge).send(_receiver, _token, _amount, _dstChainId, _nonce, _maxSlippage);
        } else if (bt == BridgeType.PegDeposit) {
            IBridge(pegVault).deposit(_token, _amount, _dstChainId, _receiver, _nonce);
        } else if (bt == BridgeType.PegBurn) {
            IBridge(pegBridge).burn(_token, _amount, _receiver, _nonce);
        } else {
            revert("bridge token not supported");
        }
    }

    function setLiquidityBridge(address _addr) public onlyOwner {
        liquidityBridge = _addr;
    }

    function setPegBridge(address _addr) public onlyOwner {
        pegBridge = _addr;
    }

    function setPegVault(address _addr) public onlyOwner {
        pegVault = _addr;
    }

    function setTokenBridgeType(address _token, BridgeType bt) public onlyOwner {
        tokenBridgeTypes[_token] = bt;
    }
}

File 3 of 16 : IBridge.sol
// SPDX-License-Identifier: GPL-3.0-only

pragma solidity 0.8.9;

interface IBridge {
    function send(
        address _receiver,
        address _token,
        uint256 _amount,
        uint64 _dstChainId,
        uint64 _nonce,
        uint32 _maxSlippage
    ) external;

    function relay(
        bytes calldata _relayRequest,
        bytes[] calldata _sigs,
        address[] calldata _signers,
        uint256[] calldata _powers
    ) external;

    function transfers(bytes32 transferId) external view returns (bool);

    function withdraws(bytes32 withdrawId) external view returns (bool);

    /**
     * @notice Verifies that a message is signed by a quorum among the signers.
     * @param _msg signed message
     * @param _sigs list of signatures sorted by signer addresses in ascending order
     * @param _signers sorted list of current signers
     * @param _powers powers of current signers
     */
    function verifySigs(
        bytes memory _msg,
        bytes[] calldata _sigs,
        address[] calldata _signers,
        uint256[] calldata _powers
    ) external view;

    // ================= peg related =================

    /**
     * @notice Lock original tokens to trigger mint at a remote chain's PeggedTokenBridge
     * @param _token local token address
     * @param _amount locked token amount
     * @param _mintChainId destination chainId to mint tokens
     * @param _mintAccount destination account to receive minted tokens
     * @param _nonce user input to guarantee unique depositId
     */
    function deposit(
        address _token,
        uint256 _amount,
        uint64 _mintChainId,
        address _mintAccount,
        uint64 _nonce
    ) external;

    /**
     * @notice Burn tokens to trigger withdrawal at a remote chain's OriginalTokenVault
     * @param _token local token address
     * @param _amount locked token amount
     * @param _withdrawAccount account who withdraw original tokens on the remote chain
     * @param _nonce user input to guarantee unique depositId
     */
    function burn(
        address _token,
        uint256 _amount,
        address _withdrawAccount,
        uint64 _nonce
    ) external;

    function records(bytes32 recordId) external view returns (bool);
}

File 4 of 16 : MsgBusAddr.sol
// SPDX-License-Identifier: GPL-3.0-only

pragma solidity 0.8.9;

import "@openzeppelin/contracts/access/Ownable.sol";

abstract contract MsgBusAddr is Ownable {
    address public msgBus;

    function setMsgBus(address _addr) public onlyOwner {
        msgBus = _addr;
    }
}

File 5 of 16 : MessageBus.sol
// SPDX-License-Identifier: GPL-3.0-only

pragma solidity 0.8.9;

import "./MessageSender.sol";
import "./MessageReceiver.sol";

contract MessageBus is MessageSender, MessageReceiver {
    constructor(ISigsVerifier _sigsVerifier) MessageSender(_sigsVerifier) {}
}

File 6 of 16 : MessageSender.sol
// SPDX-License-Identifier: GPL-3.0-only

pragma solidity 0.8.9;

import "@openzeppelin/contracts/access/Ownable.sol";
import "../../interfaces/ISigsVerifier.sol";

contract MessageSender is Ownable {
    ISigsVerifier public immutable sigsVerifier;

    uint256 public feeBase;
    uint256 public feePerByte;
    mapping(address => uint256) public withdrawnFees;

    event Message(address indexed sender, address receiver, uint256 dstChainId, bytes message);

    event MessageWithTransfer(
        address indexed sender,
        address receiver,
        uint256 dstChainId,
        address bridge,
        bytes32 srcTransferId,
        bytes message
    );

    constructor(ISigsVerifier _sigsVerifier) {
        sigsVerifier = _sigsVerifier;
    }

    function sendMessage(
        address _receiver,
        uint256 _dstChainId,
        bytes calldata _message
    ) external payable {
        require(msg.value >= feeBase + _message.length * feePerByte, "Insufficient fee");
        emit Message(msg.sender, _receiver, _dstChainId, _message);
    }

    function sendMessageWithTransfer(
        address _receiver,
        uint256 _dstChainId,
        address _srcBridge,
        bytes32 _srcTransferId,
        bytes calldata _message
    ) external payable {
        require(msg.value >= feeBase + _message.length * feePerByte, "Insufficient fee");
        // SGN needs to verify
        // 1. msg.sender matches sender of the src transfer
        // 2. dstChainId matches dstChainId of the src transfer
        // 3. bridge is either liquidity bridge, peg src vault, or peg dst bridge
        emit MessageWithTransfer(msg.sender, _receiver, _dstChainId, _srcBridge, _srcTransferId, _message);
    }

    function withdrawFee(
        address _account,
        uint256 _cumulativeFee,
        bytes[] calldata _sigs,
        address[] calldata _signers,
        uint256[] calldata _powers
    ) external {
        bytes32 domain = keccak256(abi.encodePacked(block.chainid, address(this), "withdrawFee"));
        sigsVerifier.verifySigs(abi.encodePacked(domain, _account, _cumulativeFee), _sigs, _signers, _powers);
        uint256 amount = _cumulativeFee - withdrawnFees[_account];
        require(amount > 0, "No new amount to withdraw");
        (bool sent, ) = _account.call{value: amount, gas: 50000}("");
        require(sent, "failed to withdraw fee");
    }

    function setFeePerByte(uint256 _fee) external onlyOwner {
        feePerByte = _fee;
    }

    function setFeeBase(uint256 _fee) external onlyOwner {
        feeBase = _fee;
    }
}

File 7 of 16 : ISigsVerifier.sol
// SPDX-License-Identifier: GPL-3.0-only

pragma solidity 0.8.9;

interface ISigsVerifier {
    /**
     * @notice Verifies that a message is signed by a quorum among the signers.
     * @param _msg signed message
     * @param _sigs list of signatures sorted by signer addresses in ascending order
     * @param _signers sorted list of current signers
     * @param _powers powers of current signers
     */
    function verifySigs(
        bytes memory _msg,
        bytes[] calldata _sigs,
        address[] calldata _signers,
        uint256[] calldata _powers
    ) external view;
}

File 8 of 16 : MessageReceiver.sol
// SPDX-License-Identifier: GPL-3.0-only

pragma solidity 0.8.9;

import "@openzeppelin/contracts/access/Ownable.sol";
import "../framework/IBridge.sol";
import "../framework/MsgReceiverApp.sol";

contract MessageReceiver is Ownable {
    enum TransferType {
        Null,
        LqSend, // send through liquidity bridge
        LqWithdraw, // withdraw from liquidity bridge
        PegMint, // mint through pegged token bridge
        PegWithdraw // withdraw from original token vault
    }

    struct TransferInfo {
        TransferType t;
        address sender;
        address receiver;
        address token;
        uint256 amount;
        uint64 seqnum;
        uint64 srcChainId;
        bytes32 refId;
    }

    struct RouteInfo {
        address sender;
        address receiver;
        uint64 srcChainId;
    }

    enum TxStatus {
        Null,
        Success,
        Fail,
        Fallback
    }
    mapping(bytes32 => TxStatus) public executedTransfers; // messages with associated transfer
    mapping(bytes32 => TxStatus) public executedMessages; // messages without associated transfer

    address public liquidityBridge; // liquidity bridge address
    address public pegBridge; // peg bridge address
    address public pegVault; // peg original vault address

    enum MsgType {
        MessageWithTransfer,
        Message
    }
    event Executed(MsgType msgType, bytes32 id, TxStatus status);

    // ============== functions called by executor ==============

    function executeMessageWithTransfer(
        bytes calldata _message,
        TransferInfo calldata _transfer,
        bytes[] calldata _sigs,
        address[] calldata _signers,
        uint256[] calldata _powers
    ) external {
        bytes32 transferId = verifyTransfer(_transfer);
        require(executedTransfers[transferId] == TxStatus.Null, "transfer already executed");

        bytes32 domain = keccak256(abi.encodePacked(block.chainid, address(this), "MessageWithTransfer"));
        IBridge(liquidityBridge).verifySigs(abi.encodePacked(domain, transferId, _message), _sigs, _signers, _powers);
        TxStatus status;
        bool ok = executeMessageWithTransfer(_transfer, _message);
        if (ok) {
            status = TxStatus.Success;
        } else {
            ok = executeMessageWithTransferFallback(_transfer, _message);
            if (ok) {
                status = TxStatus.Fallback;
            } else {
                status = TxStatus.Fail;
            }
        }
        executedTransfers[transferId] = status;
        emit Executed(MsgType.MessageWithTransfer, transferId, status);
    }

    function executeMessage(
        bytes calldata _message,
        RouteInfo calldata _route,
        bytes[] calldata _sigs,
        address[] calldata _signers,
        uint256[] calldata _powers
    ) external {
        bytes32 messageId = ComputeMessageId(_route, _message);
        require(executedMessages[messageId] == TxStatus.Null, "message already executed");

        bytes32 domain = keccak256(abi.encodePacked(block.chainid, address(this), "Message"));
        IBridge(liquidityBridge).verifySigs(abi.encodePacked(domain, messageId), _sigs, _signers, _powers);
        TxStatus status;
        bool ok = executeMessage(_route, _message);
        if (ok) {
            status = TxStatus.Success;
        } else {
            status = TxStatus.Fail;
        }
        executedTransfers[messageId] = status;
        emit Executed(MsgType.Message, messageId, status);
    }

    // ================= utils (to avoid stack too deep) =================

    function executeMessageWithTransfer(TransferInfo calldata _transfer, bytes calldata _message)
        private
        returns (bool)
    {
        (bool ok, ) = address(_transfer.receiver).call(
            abi.encodeWithSelector(
                MsgReceiverApp.executeMessageWithTransfer.selector,
                _transfer.sender,
                _transfer.token,
                _transfer.amount,
                _transfer.srcChainId,
                _message
            )
        );
        return ok;
    }

    function executeMessageWithTransferFallback(TransferInfo calldata _transfer, bytes calldata _message)
        private
        returns (bool)
    {
        (bool ok, ) = address(_transfer.receiver).call(
            abi.encodeWithSelector(
                MsgReceiverApp.executeMessageWithTransferFallback.selector,
                _transfer.sender,
                _transfer.token,
                _transfer.amount,
                _transfer.srcChainId,
                _message
            )
        );
        return ok;
    }

    function verifyTransfer(TransferInfo calldata _transfer) private view returns (bytes32) {
        bytes32 transferId;
        address bridgeAddr;
        if (_transfer.t == TransferType.LqSend) {
            transferId = keccak256(
                abi.encodePacked(
                    _transfer.sender,
                    _transfer.receiver,
                    _transfer.token,
                    _transfer.amount,
                    _transfer.srcChainId,
                    uint64(block.chainid),
                    _transfer.refId
                )
            );
            bridgeAddr = liquidityBridge;
            require(IBridge(bridgeAddr).transfers(transferId) == true, "bridge relay not exist");
        } else if (_transfer.t == TransferType.LqWithdraw) {
            transferId = keccak256(
                abi.encodePacked(
                    uint64(block.chainid),
                    _transfer.seqnum,
                    _transfer.receiver,
                    _transfer.token,
                    _transfer.amount
                )
            );
            bridgeAddr = liquidityBridge;
            require(IBridge(bridgeAddr).withdraws(transferId) == true, "bridge withdraw not exist");
        } else if (_transfer.t == TransferType.PegMint || _transfer.t == TransferType.PegWithdraw) {
            transferId = keccak256(
                abi.encodePacked(
                    _transfer.receiver,
                    _transfer.token,
                    _transfer.amount,
                    _transfer.sender,
                    _transfer.srcChainId,
                    _transfer.refId
                )
            );
            if (_transfer.t == TransferType.PegMint) {
                bridgeAddr = pegBridge;
            } else {
                bridgeAddr = pegVault;
            }
            require(IBridge(bridgeAddr).records(transferId) == true, "peg record not exist");
        }
        transferId = keccak256(abi.encodePacked(bridgeAddr, transferId));
        return transferId;
    }

    function ComputeMessageId(RouteInfo calldata _route, bytes calldata _message) private pure returns (bytes32) {
        return keccak256(abi.encodePacked(_route.sender, _route.receiver, _route.srcChainId, _message));
    }

    function executeMessage(RouteInfo calldata _route, bytes calldata _message) private returns (bool) {
        (bool ok, ) = address(_route.receiver).call(
            abi.encodeWithSelector(MsgReceiverApp.executeMessage.selector, _route.sender, _route.srcChainId, _message)
        );
        return ok;
    }

    // ================= contract addr config =================

    function setLiquidityBridge(address _addr) public onlyOwner {
        liquidityBridge = _addr;
    }

    function setPegBridge(address _addr) public onlyOwner {
        pegBridge = _addr;
    }

    function setPegVault(address _addr) public onlyOwner {
        pegVault = _addr;
    }
}

File 9 of 16 : MsgReceiverApp.sol
// SPDX-License-Identifier: GPL-3.0-only

pragma solidity 0.8.9;

import "./MsgBusAddr.sol";

abstract contract MsgReceiverApp is MsgBusAddr {
    modifier onlyMessageBus() {
        require(msg.sender == msgBus, "caller is not message bus");
        _;
    }

    // ============== functions called by the MessageBus contract ==============

    function executeMessageWithTransfer(
        address _sender,
        address _token,
        uint256 _amount,
        uint64 _srcChainId,
        bytes calldata _message
    ) external virtual onlyMessageBus {}

    // only called if executeMessageWithTransfer was reverted
    // app needs to decide what to do with the received tokens
    function executeMessageWithTransferFallback(
        address _sender,
        address _token,
        uint256 _amount,
        uint64 _srcChainId,
        bytes calldata _message
    ) external virtual onlyMessageBus {}

    function executeMessage(
        address _sender,
        uint64 _srcChainId,
        bytes calldata _message
    ) external virtual onlyMessageBus {}
}

File 10 of 16 : IWETH.sol
// SPDX-License-Identifier: GPL-3.0-only

pragma solidity 0.8.9;

interface IWETH {
    function deposit() external payable;

    function withdraw(uint256) external;
}

File 11 of 16 : IUniswapV2.sol
// SPDX-License-Identifier: GPL-3.0-only

pragma solidity >=0.8.9;

interface IUniswapV2 {
    function swapTokensForExactTokens(
        uint256 amountOut,
        uint256 amountInMax,
        address[] calldata path,
        address to,
        uint256 deadline
    ) external returns (uint256[] memory amounts);

    function swapExactTokensForTokens(
        uint256 amountIn,
        uint256 amountOutMin,
        address[] calldata path,
        address to,
        uint256 deadline
    ) external returns (uint256[] memory amounts);
}

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

pragma solidity ^0.8.0;

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

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

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

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

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

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

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

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

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

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

pragma solidity ^0.8.0;

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

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

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

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

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

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

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

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

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

pragma solidity ^0.8.0;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    function _verifyCallResult(
        bool success,
        bytes memory returndata,
        string memory errorMessage
    ) private pure returns (bytes memory) {
        if (success) {
            return returndata;
        } else {
            // Look for revert reason and bubble it up if present
            if (returndata.length > 0) {
                // The easiest way to bubble the revert reason is using memory via assembly

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

File 15 of 16 : Ownable.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

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

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

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

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

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

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

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

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

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

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

pragma solidity ^0.8.0;

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

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

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

Contract ABI

[{"inputs":[{"internalType":"address","name":"_msgbus","type":"address"},{"internalType":"address","name":"_supportedDex","type":"address"},{"internalType":"address","name":"_bridge","type":"address"},{"internalType":"address","name":"_bridgeToken","type":"address"},{"internalType":"address","name":"_nativeWrap","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bytes32","name":"id","type":"bytes32"},{"indexed":false,"internalType":"uint64","name":"srcChainId","type":"uint64"},{"indexed":false,"internalType":"uint256","name":"amountIn","type":"uint256"},{"indexed":false,"internalType":"address","name":"tokenIn","type":"address"},{"indexed":false,"internalType":"uint256","name":"amountOut","type":"uint256"},{"indexed":false,"internalType":"address","name":"tokenOut","type":"address"}],"name":"DirectSwap","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bytes32","name":"id","type":"bytes32"},{"indexed":false,"internalType":"uint256","name":"dstAmount","type":"uint256"},{"indexed":false,"internalType":"enum TransferSwap.SwapStatus","name":"status","type":"uint8"}],"name":"SwapRequestDone","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bytes32","name":"id","type":"bytes32"},{"indexed":false,"internalType":"uint64","name":"dstChainId","type":"uint64"},{"indexed":false,"internalType":"uint256","name":"srcAmount","type":"uint256"},{"indexed":false,"internalType":"address","name":"srcToken","type":"address"},{"indexed":false,"internalType":"address","name":"dstToken","type":"address"}],"name":"SwapRequestSent","type":"event"},{"inputs":[{"internalType":"address","name":"_sender","type":"address"},{"internalType":"uint64","name":"_srcChainId","type":"uint64"},{"internalType":"bytes","name":"_message","type":"bytes"}],"name":"executeMessage","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"_token","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"},{"internalType":"uint64","name":"_srcChainId","type":"uint64"},{"internalType":"bytes","name":"_message","type":"bytes"}],"name":"executeMessageWithTransfer","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint64","name":"_srcChainId","type":"uint64"},{"internalType":"bytes","name":"_message","type":"bytes"}],"name":"executeMessageWithTransferFallback","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"liquidityBridge","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"minSwapAmounts","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"msgBus","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"nativeWrap","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pegBridge","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pegVault","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_addr","type":"address"}],"name":"setLiquidityBridge","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_token","type":"address"},{"internalType":"uint256","name":"_minSwapAmount","type":"uint256"}],"name":"setMinSwapAmount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_addr","type":"address"}],"name":"setMsgBus","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_nativeWrap","type":"address"}],"name":"setNativeWrap","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_addr","type":"address"}],"name":"setPegBridge","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_addr","type":"address"}],"name":"setPegVault","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_dex","type":"address"},{"internalType":"bool","name":"_enabled","type":"bool"}],"name":"setSupportedDex","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_token","type":"address"},{"internalType":"enum MsgSenderApp.BridgeType","name":"bt","type":"uint8"}],"name":"setTokenBridgeType","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"tokenBridgeTypes","outputs":[{"internalType":"enum MsgSenderApp.BridgeType","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_receiver","type":"address"},{"internalType":"uint256","name":"_amountIn","type":"uint256"},{"internalType":"uint64","name":"_dstChainId","type":"uint64"},{"components":[{"internalType":"address[]","name":"path","type":"address[]"},{"internalType":"address","name":"dex","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"},{"internalType":"uint256","name":"minRecvAmt","type":"uint256"}],"internalType":"struct TransferSwap.SwapInfo","name":"_srcSwap","type":"tuple"},{"components":[{"internalType":"address[]","name":"path","type":"address[]"},{"internalType":"address","name":"dex","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"},{"internalType":"uint256","name":"minRecvAmt","type":"uint256"}],"internalType":"struct TransferSwap.SwapInfo","name":"_dstSwap","type":"tuple"},{"internalType":"uint32","name":"_maxBridgeSlippage","type":"uint32"},{"internalType":"uint64","name":"_nonce","type":"uint64"}],"name":"transferWithSwap","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_receiver","type":"address"},{"internalType":"uint256","name":"_amountIn","type":"uint256"},{"internalType":"uint64","name":"_dstChainId","type":"uint64"},{"components":[{"internalType":"address[]","name":"path","type":"address[]"},{"internalType":"address","name":"dex","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"},{"internalType":"uint256","name":"minRecvAmt","type":"uint256"}],"internalType":"struct TransferSwap.SwapInfo","name":"_srcSwap","type":"tuple"},{"components":[{"internalType":"address[]","name":"path","type":"address[]"},{"internalType":"address","name":"dex","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"},{"internalType":"uint256","name":"minRecvAmt","type":"uint256"}],"internalType":"struct TransferSwap.SwapInfo","name":"_dstSwap","type":"tuple"},{"internalType":"uint32","name":"_maxBridgeSlippage","type":"uint32"},{"internalType":"uint64","name":"_nonce","type":"uint64"},{"internalType":"bool","name":"_nativeOut","type":"bool"}],"name":"transferWithSwapNative","outputs":[],"stateMutability":"payable","type":"function"},{"stateMutability":"payable","type":"receive"}]

60806040523480156200001157600080fd5b5060405162002ca538038062002ca5833981016040819052620000349162000126565b6200003f33620000b9565b600180546001600160a01b03199081166001600160a01b039788161782559486166000908152600760209081526040808320805460ff199081168617909155600280548a16988b16989098179097559488168252600590529290922080549093169091179091556008805491909316911617905562000196565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b80516001600160a01b03811681146200012157600080fd5b919050565b600080600080600060a086880312156200013f57600080fd5b6200014a8662000109565b94506200015a6020870162000109565b93506200016a6040870162000109565b92506200017a6060870162000109565b91506200018a6080870162000109565b90509295509295909350565b612aff80620001a66000396000f3fe6080604052600436106101845760003560e01c8063715018a6116100d6578063ce35dd9a1161007f578063dfa2dbaf11610059578063dfa2dbaf14610451578063f00f39ce14610471578063f2fde38b1461049157600080fd5b8063ce35dd9a146103f1578063d8257d1714610411578063d9b796de1461043157600080fd5b80638da5cb5b116100b05780638da5cb5b146103935780639b05a775146103b1578063a8a7e29c146103d157600080fd5b8063715018a61461033e5780637de805881461035357806382980dc41461037357600080fd5b806344f653eb11610138578063588be02b11610112578063588be02b146102eb5780635b5a66a71461030b5780635fdb3d8d1461032b57600080fd5b806344f653eb14610273578063457bfa2f14610293578063496dbfd9146102cb57600080fd5b806328c9c35e1161016957806328c9c35e146101d257806334e18125146102185780633f0bbc4c1461025357600080fd5b806303cbfe66146101905780631599d265146101b257600080fd5b3661018b57005b600080fd5b34801561019c57600080fd5b506101b06101ab366004611f70565b6104b1565b005b3480156101be57600080fd5b506101b06101cd366004611fa3565b610520565b3480156101de57600080fd5b506102026101ed366004611f70565b60056020526000908152604090205460ff1681565b60405161020f9190612069565b60405180910390f35b34801561022457600080fd5b50610245610233366004611f70565b60066020526000908152604090205481565b60405190815260200161020f565b34801561025f57600080fd5b506101b061026e36600461207c565b610580565b34801561027f57600080fd5b506101b061028e366004611f70565b610606565b34801561029f57600080fd5b506008546102b3906001600160a01b031681565b6040516001600160a01b03909116815260200161020f565b3480156102d757600080fd5b506101b06102e63660046120b9565b610670565b3480156102f757600080fd5b506101b0610306366004611f70565b6106d4565b34801561031757600080fd5b506101b0610326366004611f70565b61073e565b6101b061033936600461211f565b6107a8565b34801561034a57600080fd5b506101b0610947565b34801561035f57600080fd5b506001546102b3906001600160a01b031681565b34801561037f57600080fd5b506002546102b3906001600160a01b031681565b34801561039f57600080fd5b506000546001600160a01b03166102b3565b3480156103bd57600080fd5b506101b06103cc366004611f70565b61099b565b3480156103dd57600080fd5b506101b06103ec3660046121ea565b610a05565b3480156103fd57600080fd5b506101b061040c366004612312565b610aaf565b34801561041d57600080fd5b506004546102b3906001600160a01b031681565b34801561043d57600080fd5b506101b061044c3660046123e9565b610d0e565b34801561045d57600080fd5b506003546102b3906001600160a01b031681565b34801561047d57600080fd5b506101b061048c366004612312565b610d81565b34801561049d57600080fd5b506101b06104ac366004611f70565b610e4d565b6000546001600160a01b031633146104fe5760405162461bcd60e51b81526020600482018190526024820152600080516020612aaa83398151915260448201526064015b60405180910390fd5b600380546001600160a01b0319166001600160a01b0392909216919091179055565b6001546001600160a01b0316331461057a5760405162461bcd60e51b815260206004820152601960248201527f63616c6c6572206973206e6f74206d657373616765206275730000000000000060448201526064016104f5565b50505050565b6000546001600160a01b031633146105c85760405162461bcd60e51b81526020600482018190526024820152600080516020612aaa83398151915260448201526064016104f5565b6001600160a01b0382166000908152600560205260409020805482919060ff191660018360038111156105fd576105fd612035565b02179055505050565b6000546001600160a01b0316331461064e5760405162461bcd60e51b81526020600482018190526024820152600080516020612aaa83398151915260448201526064016104f5565b600180546001600160a01b0319166001600160a01b0392909216919091179055565b6000546001600160a01b031633146106b85760405162461bcd60e51b81526020600482018190526024820152600080516020612aaa83398151915260448201526064016104f5565b6001600160a01b03909116600090815260066020526040902055565b6000546001600160a01b0316331461071c5760405162461bcd60e51b81526020600482018190526024820152600080516020612aaa83398151915260448201526064016104f5565b600280546001600160a01b0319166001600160a01b0392909216919091179055565b6000546001600160a01b031633146107865760405162461bcd60e51b81526020600482018190526024820152600080516020612aaa83398151915260448201526064016104f5565b600880546001600160a01b0319166001600160a01b0392909216919091179055565b3332146107e15760405162461bcd60e51b81526020600482015260076024820152664e6f7420454f4160c81b60448201526064016104f5565b8634146108305760405162461bcd60e51b815260206004820152600f60248201527f416d6f756e74206d69736d61746368000000000000000000000000000000000060448201526064016104f5565b6008546001600160a01b03166108468680612417565b600081811061085757610857612461565b905060200201602081019061086c9190611f70565b6001600160a01b0316146108b35760405162461bcd60e51b815260206004820152600e60248201526d0e8ded6cadc40dad2e6dac2e8c6d60931b60448201526064016104f5565b600860009054906101000a90046001600160a01b03166001600160a01b031663d0e30db0886040518263ffffffff1660e01b81526004016000604051808303818588803b15801561090357600080fd5b505af1158015610917573d6000803e3d6000fd5b505050505061093d8888888861092c9061249b565b6109358961249b565b888888610f1d565b5050505050505050565b6000546001600160a01b0316331461098f5760405162461bcd60e51b81526020600482018190526024820152600080516020612aaa83398151915260448201526064016104f5565b61099960006113b7565b565b6000546001600160a01b031633146109e35760405162461bcd60e51b81526020600482018190526024820152600080516020612aaa83398151915260448201526064016104f5565b600480546001600160a01b0319166001600160a01b0392909216919091179055565b333214610a3e5760405162461bcd60e51b81526020600482015260076024820152664e6f7420454f4160c81b60448201526064016104f5565b610a85333088610a4e8880612417565b6000818110610a5f57610a5f612461565b9050602002016020810190610a749190611f70565b6001600160a01b0316929190611407565b610aa6878787610a948861249b565b610a9d8861249b565b87876000610f1d565b50505050505050565b6001546001600160a01b03163314610b095760405162461bcd60e51b815260206004820152601960248201527f63616c6c6572206973206e6f74206d657373616765206275730000000000000060448201526064016104f5565b600081806020019051810190610b1f9190612588565b805151805191925090600090610b3757610b37612461565b60200260200101516001600160a01b0316856001600160a01b031614610beb5760405162461bcd60e51b815260206004820152604a60248201527f6272696467656420746f6b656e206d757374206265207468652073616d65206160448201527f732074686520666972737420746f6b656e20696e2064657374696e6174696f6e60648201527f2073776170207061746800000000000000000000000000000000000000000000608482015260a4016104f5565b6000610bfd826020015185468661149f565b82515151909150600090600190811015610c90578351600190610c2090896114d8565b935090508015610c71578451518051610c689190610c40906001906126ec565b81518110610c5057610c50612461565b60200260200101518487602001518860600151611625565b60019150610c8a565b610c82898987602001516000611625565b879250600391505b50610cc8565b8351518051610cc19190600090610ca957610ca9612461565b60200260200101518886602001518760600151611625565b5085905060015b7fccbb695db2dfb79e3f69bcf724d11b850c79b0ae358e62d60ed94044f38a2b9c838383604051610cfb93929190612703565b60405180910390a1505050505050505050565b6000546001600160a01b03163314610d565760405162461bcd60e51b81526020600482018190526024820152600080516020612aaa83398151915260448201526064016104f5565b6001600160a01b03919091166000908152600760205260409020805460ff1916911515919091179055565b6001546001600160a01b03163314610ddb5760405162461bcd60e51b815260206004820152601960248201527f63616c6c6572206973206e6f74206d657373616765206275730000000000000060448201526064016104f5565b600081806020019051810190610df19190612588565b90506000610e05826020015185468661149f565b90507fccbb695db2dfb79e3f69bcf724d11b850c79b0ae358e62d60ed94044f38a2b9c8160006002604051610e3c93929190612703565b60405180910390a150505050505050565b6000546001600160a01b03163314610e955760405162461bcd60e51b81526020600482018190526024820152600080516020612aaa83398151915260448201526064016104f5565b6001600160a01b038116610f115760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f646472657373000000000000000000000000000000000000000000000000000060648201526084016104f5565b610f1a816113b7565b50565b845151610f6c5760405162461bcd60e51b815260206004820152601360248201527f656d70747920737263207377617020706174680000000000000000000000000060448201526064016104f5565b8451805160009190610f80906001906126ec565b81518110610f9057610f90612461565b60200260200101519050600660008760000151600081518110610fb557610fb5612461565b60200260200101516001600160a01b03166001600160a01b031681526020019081526020016000205488116110525760405162461bcd60e51b815260206004820152602c60248201527f616d6f756e74206d757374206265206772656174656572207468616e206d696e60448201527f207377617020616d6f756e74000000000000000000000000000000000000000060648201526084016104f5565b85515146906001108061107957508067ffffffffffffffff168867ffffffffffffffff1614155b6110c55760405162461bcd60e51b815260206004820152601360248201527f6e6f6f70206973206e6f7420616c6c6f7765640000000000000000000000000060448201526064016104f5565b8651518990600110156111315760016110de898c6114d8565b925090508061112f5760405162461bcd60e51b815260206004820152600f60248201527f7372632073776170206661696c6564000000000000000000000000000000000060448201526064016104f5565b505b60008267ffffffffffffffff168a67ffffffffffffffff161415611227576111636001600160a01b0385168d84611795565b33838d888c60405160200161117c9594939291906127a0565b6040516020818303038152906040528051906020012090507fdbd876e57420a75850bd1ce36de349d111ab4ff35e2c2379af8acc750376917481848d8c600001516000815181106111cf576111cf612461565b6020908102919091018101516040805195865267ffffffffffffffff90941691850191909152918301526001600160a01b03908116606083015260808201859052861660a082015260c00160405180910390a16113a9565b8751516112765760405162461bcd60e51b815260206004820152601360248201527f656d70747920647374207377617020706174680000000000000000000000000060448201526064016104f5565b600060405180608001604052808a8152602001336001600160a01b031681526020018867ffffffffffffffff1681526020018715158152506040516020016112be91906127e6565b60405160208183030381529060405290506112db33858d8461149f565b91506112ec8d86858e8b8d876117ca565b7f600b63623f19b18f8f0e7825ec78b3d9779d8124c76ad75b58aac7167f04f8d2828c8e8d6000015160008151811061132757611327612461565b60209081029190910101518d518051611342906001906126ec565b8151811061135257611352612461565b602002602001015160405161139f95949392919094855267ffffffffffffffff93909316602085015260408401919091526001600160a01b03908116606084015216608082015260a00190565b60405180910390a1505b505050505050505050505050565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6040516001600160a01b038085166024830152831660448201526064810182905261057a9085906323b872dd60e01b906084015b60408051601f198184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090931692909217909152611c14565b6000848484846040516020016114b8949392919061286d565b604051602081830303815290604052805190602001209050949350505050565b6020808301516001600160a01b03166000908152600790915260408120548190819060ff1661150c5760009250905061161e565b61154c856020015185876000015160008151811061152c5761152c612461565b60200260200101516001600160a01b0316611cf99092919063ffffffff16565b84602001516001600160a01b03166338ed17398587606001518860000151308a604001516040518663ffffffff1660e01b81526004016115909594939291906128c7565b600060405180830381600087803b1580156115aa57600080fd5b505af19250505080156115df57506040513d6000823e601f3d908101601f191682016040526115dc9190810190612938565b60015b6115ee5760009250905061161e565b600181600183516115ff91906126ec565b8151811061160f5761160f612461565b60200260200101519350935050505b9250929050565b8015611785576008546001600160a01b038581169116146116795760405162461bcd60e51b815260206004820152600e60248201526d0e8ded6cadc40dad2e6dac2e8c6d60931b60448201526064016104f5565b600854604051632e1a7d4d60e01b8152600481018590526001600160a01b0390911690632e1a7d4d90602401600060405180830381600087803b1580156116bf57600080fd5b505af11580156116d3573d6000803e3d6000fd5b505050506000826001600160a01b03168461c35090604051600060405180830381858888f193505050503d8060008114611729576040519150601f19603f3d011682016040523d82523d6000602084013e61172e565b606091505b505090508061177f5760405162461bcd60e51b815260206004820152601560248201527f6661696c656420746f2073656e64206e6174697665000000000000000000000060448201526064016104f5565b5061057a565b61057a6001600160a01b03851683855b6040516001600160a01b0383166024820152604481018290526117c590849063a9059cbb60e01b9060640161143b565b505050565b6001600160a01b03861660009081526005602052604081205460ff16908060018360038111156117fc576117fc612035565b1415611938576002546001600160a01b03908116925061181f908a16838a611cf9565b60025460405163a5977fbb60e01b81526001600160a01b038c811660048301528b81166024830152604482018b905267ffffffffffffffff808b1660648401528916608483015263ffffffff881660a48301529091169063a5977fbb9060c401600060405180830381600087803b15801561189957600080fd5b505af11580156118ad573d6000803e3d6000fd5b50506040516bffffffffffffffffffffffff1930606090811b821660208401528e811b821660348401528d901b166048820152605c81018b90526001600160c01b031960c08b811b8216607c8401528a811b8216608484015246901b16608c820152609401915061191b9050565b604051602081830303815290604052805190602001209050611b9e565b600283600381111561194c5761194c612035565b1415611a5b57600480546040516308d18d8960e21b81526001600160a01b038c811693820193909352602481018b905267ffffffffffffffff808b1660448301528d841660648301528916608482015291169250829063234636249060a401600060405180830381600087803b1580156119c557600080fd5b505af11580156119d9573d6000803e3d6000fd5b50505050308989898d8a4660405160200161191b9796959493929190606097881b6bffffffffffffffffffffffff19908116825296881b87166014820152602881019590955260c093841b6001600160c01b031990811660488701529290961b909416605084015292811b831660648301529290921b16606c82015260740190565b6003836003811115611a6f57611a6f612035565b1415611b5657600354604051636f3c863f60e11b81526001600160a01b038b81166004830152602482018b90528c8116604483015267ffffffffffffffff891660648301529091169250829063de790c7e90608401600060405180830381600087803b158015611ade57600080fd5b505af1158015611af2573d6000803e3d6000fd5b50506040516bffffffffffffffffffffffff1930606090811b821660208401528d811b82166034840152604883018d90528e901b1660688201526001600160c01b031960c08a811b8216607c84015246901b166084820152608c01915061191b9050565b60405162461bcd60e51b815260206004820152601a60248201527f62726964676520746f6b656e206e6f7420737570706f7274656400000000000060448201526064016104f5565b600154604051634289fbb360e01b81526001600160a01b0390911690634289fbb390611bd6908d908b90879087908b906004016129ea565b600060405180830381600087803b158015611bf057600080fd5b505af1158015611c04573d6000803e3d6000fd5b5050505050505050505050505050565b6000611c69826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b0316611dba9092919063ffffffff16565b8051909150156117c55780806020019051810190611c879190612a2c565b6117c55760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f7420737563636565640000000000000000000000000000000000000000000060648201526084016104f5565b604051636eb1769f60e11b81523060048201526001600160a01b038381166024830152600091839186169063dd62ed3e9060440160206040518083038186803b158015611d4557600080fd5b505afa158015611d59573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611d7d9190612a49565b611d879190612a62565b6040516001600160a01b03851660248201526044810182905290915061057a90859063095ea7b360e01b9060640161143b565b6060611dc98484600085611dd3565b90505b9392505050565b606082471015611e4b5760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f60448201527f722063616c6c000000000000000000000000000000000000000000000000000060648201526084016104f5565b843b611e995760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e747261637400000060448201526064016104f5565b600080866001600160a01b03168587604051611eb59190612a7a565b60006040518083038185875af1925050503d8060008114611ef2576040519150601f19603f3d011682016040523d82523d6000602084013e611ef7565b606091505b5091509150611f07828286611f12565b979650505050505050565b60608315611f21575081611dcc565b825115611f315782518084602001fd5b8160405162461bcd60e51b81526004016104f59190612a96565b6001600160a01b0381168114610f1a57600080fd5b8035611f6b81611f4b565b919050565b600060208284031215611f8257600080fd5b8135611dcc81611f4b565b67ffffffffffffffff81168114610f1a57600080fd5b60008060008060608587031215611fb957600080fd5b8435611fc481611f4b565b93506020850135611fd481611f8d565b9250604085013567ffffffffffffffff80821115611ff157600080fd5b818701915087601f83011261200557600080fd5b81358181111561201457600080fd5b88602082850101111561202657600080fd5b95989497505060200194505050565b634e487b7160e01b600052602160045260246000fd5b60048110610f1a57634e487b7160e01b600052602160045260246000fd5b602081016120768361204b565b91905290565b6000806040838503121561208f57600080fd5b823561209a81611f4b565b91506020830135600481106120ae57600080fd5b809150509250929050565b600080604083850312156120cc57600080fd5b82356120d781611f4b565b946020939093013593505050565b6000608082840312156120f757600080fd5b50919050565b803563ffffffff81168114611f6b57600080fd5b8015158114610f1a57600080fd5b600080600080600080600080610100898b03121561213c57600080fd5b883561214781611f4b565b975060208901359650604089013561215e81611f8d565b9550606089013567ffffffffffffffff8082111561217b57600080fd5b6121878c838d016120e5565b965060808b013591508082111561219d57600080fd5b506121aa8b828c016120e5565b9450506121b960a08a016120fd565b925060c08901356121c981611f8d565b915060e08901356121d981612111565b809150509295985092959890939650565b600080600080600080600060e0888a03121561220557600080fd5b873561221081611f4b565b965060208801359550604088013561222781611f8d565b9450606088013567ffffffffffffffff8082111561224457600080fd5b6122508b838c016120e5565b955060808a013591508082111561226657600080fd5b506122738a828b016120e5565b93505061228260a089016120fd565b915060c088013561229281611f8d565b8091505092959891949750929550565b634e487b7160e01b600052604160045260246000fd5b6040516080810167ffffffffffffffff811182821017156122db576122db6122a2565b60405290565b604051601f8201601f1916810167ffffffffffffffff8111828210171561230a5761230a6122a2565b604052919050565b600080600080600060a0868803121561232a57600080fd5b853561233581611f4b565b945060208681013561234681611f4b565b945060408701359350606087013561235d81611f8d565b9250608087013567ffffffffffffffff8082111561237a57600080fd5b818901915089601f83011261238e57600080fd5b8135818111156123a0576123a06122a2565b6123b2601f8201601f191685016122e1565b91508082528a848285010111156123c857600080fd5b80848401858401376000848284010152508093505050509295509295909350565b600080604083850312156123fc57600080fd5b823561240781611f4b565b915060208301356120ae81612111565b6000808335601e1984360301811261242e57600080fd5b83018035915067ffffffffffffffff82111561244957600080fd5b6020019150600581901b360382131561161e57600080fd5b634e487b7160e01b600052603260045260246000fd5b600067ffffffffffffffff821115612491576124916122a2565b5060051b60200190565b6000608082360312156124ad57600080fd5b6124b56122b8565b823567ffffffffffffffff8111156124cc57600080fd5b830136601f8201126124dd57600080fd5b803560206124f26124ed83612477565b6122e1565b82815260059290921b8301810191818101903684111561251157600080fd5b938201935b8385101561253857843561252981611f4b565b82529382019390820190612516565b855250612546868201611f60565b90840152505060408381013590820152606092830135928101929092525090565b8051611f6b81611f4b565b8051611f6b81611f8d565b8051611f6b81612111565b6000602080838503121561259b57600080fd5b825167ffffffffffffffff808211156125b357600080fd5b90840190608082870312156125c757600080fd5b6125cf6122b8565b8251828111156125de57600080fd5b8301608081890312156125f057600080fd5b6125f86122b8565b81518481111561260757600080fd5b82019350601f8401891361261a57600080fd5b83516126286124ed82612477565b81815260059190911b8501870190878101908b83111561264757600080fd5b958801955b8287101561266e57865161265f81611f4b565b8252958801959088019061264c565b83525061267e9050828701612567565b86820152604082015160408201526060820151606082015280835250506126a6848401612567565b848201526126b660408401612572565b60408201526126c76060840161257d565b60608201529695505050505050565b634e487b7160e01b600052601160045260246000fd5b6000828210156126fe576126fe6126d6565b500390565b838152602081018390526060810161271a8361204b565b826040830152949350505050565b8051608080845281519084018190526000916020919082019060a0860190845b8181101561276d5783516001600160a01b031683529284019291840191600101612748565b50506001600160a01b03838601511683870152604085015160408701526060850151606087015280935050505092915050565b60006001600160a01b03808816835267ffffffffffffffff808816602085015281871660408501528086166060850152505060a06080830152611f0760a0830184612728565b60208152600082516080602084015261280260a0840182612728565b90506001600160a01b03602085015116604084015267ffffffffffffffff60408501511660608401526060840151151560808401528091505092915050565b60005b8381101561285c578181015183820152602001612844565b8381111561057a5750506000910152565b6bffffffffffffffffffffffff198560601b16815260006001600160c01b0319808660c01b166014840152808560c01b16601c8401525082516128b7816024850160208701612841565b9190910160240195945050505050565b600060a082018783526020878185015260a0604085015281875180845260c086019150828901935060005b818110156129175784516001600160a01b0316835293830193918301916001016128f2565b50506001600160a01b03969096166060850152505050608001529392505050565b6000602080838503121561294b57600080fd5b825167ffffffffffffffff81111561296257600080fd5b8301601f8101851361297357600080fd5b80516129816124ed82612477565b81815260059190911b820183019083810190878311156129a057600080fd5b928401925b82841015611f07578351825292840192908401906129a5565b600081518084526129d6816020860160208601612841565b601f01601f19169290920160200192915050565b60006001600160a01b03808816835267ffffffffffffffff8716602084015280861660408401525083606083015260a06080830152611f0760a08301846129be565b600060208284031215612a3e57600080fd5b8151611dcc81612111565b600060208284031215612a5b57600080fd5b5051919050565b60008219821115612a7557612a756126d6565b500190565b60008251612a8c818460208701612841565b9190910192915050565b602081526000611dcc60208301846129be56fe4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572a2646970667358221220dba0503cd651e6b0d0fb57d7f096e04a66a537ca0da2bce7c3d86523d4d3cc4264736f6c6343000809003300000000000000000000000095b3e0f38e949789a4c7c85c7bc16ddc0167dd9e0000000000000000000000001b02da8cb0d097eb8d57a175b88c7d8b479975060000000000000000000000002a98d03d1a593f0f3e0aa7c17b24fca68302051e000000000000000000000000fd086bc7cd5c481dcc9c85ebe478a1c0b69fcbb900000000000000000000000082af49447d8a07e3bd95bd0d56f35241523fbab1

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

00000000000000000000000095b3e0f38e949789a4c7c85c7bc16ddc0167dd9e0000000000000000000000001b02da8cb0d097eb8d57a175b88c7d8b479975060000000000000000000000002a98d03d1a593f0f3e0aa7c17b24fca68302051e000000000000000000000000fd086bc7cd5c481dcc9c85ebe478a1c0b69fcbb900000000000000000000000082af49447d8a07e3bd95bd0d56f35241523fbab1

-----Decoded View---------------
Arg [0] : _msgbus (address): 0x95b3e0f38e949789a4c7c85c7bc16ddc0167dd9e
Arg [1] : _supportedDex (address): 0x1b02da8cb0d097eb8d57a175b88c7d8b47997506
Arg [2] : _bridge (address): 0x2a98d03d1a593f0f3e0aa7c17b24fca68302051e
Arg [3] : _bridgeToken (address): 0xfd086bc7cd5c481dcc9c85ebe478a1c0b69fcbb9
Arg [4] : _nativeWrap (address): 0x82af49447d8a07e3bd95bd0d56f35241523fbab1

-----Encoded View---------------
5 Constructor Arguments found :
Arg [0] : 00000000000000000000000095b3e0f38e949789a4c7c85c7bc16ddc0167dd9e
Arg [1] : 0000000000000000000000001b02da8cb0d097eb8d57a175b88c7d8b47997506
Arg [2] : 0000000000000000000000002a98d03d1a593f0f3e0aa7c17b24fca68302051e
Arg [3] : 000000000000000000000000fd086bc7cd5c481dcc9c85ebe478a1c0b69fcbb9
Arg [4] : 00000000000000000000000082af49447d8a07e3bd95bd0d56f35241523fbab1


Deployed ByteCode Sourcemap

353:10913:3:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3512:88:7;;;;;;;;;;-1:-1:-1;3512:88:7;;;;;:::i;:::-;;:::i;:::-;;914:150:6;;;;;;;;;;-1:-1:-1;914:150:6;;;;;:::i;:::-;;:::i;637:54:7:-;;;;;;;;;;-1:-1:-1;637:54:7;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;1444:49:3;;;;;;;;;;-1:-1:-1;1444:49:3;;;;;:::i;:::-;;;;;;;;;;;;;;;;;2307:25:16;;;2295:2;2280:18;1444:49:3;2161:177:16;3698:122:7;;;;;;;;;;-1:-1:-1;3698:122:7;;;;;:::i;:::-;;:::i;194:82:5:-;;;;;;;;;;-1:-1:-1;194:82:5;;;;;:::i;:::-;;:::i;1598:25:3:-;;;;;;;;;;-1:-1:-1;1598:25:3;;;;-1:-1:-1;;;;;1598:25:3;;;;;;-1:-1:-1;;;;;2924:55:16;;;2906:74;;2894:2;2879:18;1598:25:3;2760:226:16;10786:141:3;;;;;;;;;;-1:-1:-1;10786:141:3;;;;;:::i;:::-;;:::i;3406:100:7:-;;;;;;;;;;-1:-1:-1;3406:100:7;;;;;:::i;:::-;;:::i;11058:104:3:-;;;;;;;;;;-1:-1:-1;11058:104:3;;;;;:::i;:::-;;:::i;2003:717::-;;;;;;:::i;:::-;;:::i;1605:92:11:-;;;;;;;;;;;;;:::i;166:21:5:-;;;;;;;;;;-1:-1:-1;166:21:5;;;;-1:-1:-1;;;;;166:21:5;;;364:30:7;;;;;;;;;;-1:-1:-1;364:30:7;;;;-1:-1:-1;;;;;364:30:7;;;973:85:11;;;;;;;;;;-1:-1:-1;1019:7:11;1045:6;-1:-1:-1;;;;;1045:6:11;973:85;;3606:86:7;;;;;;;;;;-1:-1:-1;3606:86:7;;;;;:::i;:::-;;:::i;2726:474:3:-;;;;;;;;;;-1:-1:-1;2726:474:3;;;;;:::i;:::-;;:::i;7106:1450::-;;;;;;;;;;-1:-1:-1;7106:1450:3;;;;;:::i;:::-;;:::i;480:23:7:-;;;;;;;;;;-1:-1:-1;480:23:7;;;;-1:-1:-1;;;;;480:23:7;;;10933:119:3;;;;;;;;;;-1:-1:-1;10933:119:3;;;;;:::i;:::-;;:::i;428:24:7:-;;;;;;;;;;-1:-1:-1;428:24:7;;;;-1:-1:-1;;;;;428:24:7;;;9345:460:3;;;;;;;;;;-1:-1:-1;9345:460:3;;;;;:::i;:::-;;:::i;1846:189:11:-;;;;;;;;;;-1:-1:-1;1846:189:11;;;;;:::i;:::-;;:::i;3512:88:7:-;1019:7:11;1045:6;-1:-1:-1;;;;;1045:6:11;665:10:15;1185:23:11;1177:68;;;;-1:-1:-1;;;1177:68:11;;8762:2:16;1177:68:11;;;8744:21:16;;;8781:18;;;8774:30;-1:-1:-1;;;;;;;;;;;8820:18:16;;;8813:62;8892:18;;1177:68:11;;;;;;;;;3576:9:7::1;:17:::0;;-1:-1:-1;;;;;;3576:17:7::1;-1:-1:-1::0;;;;;3576:17:7;;;::::1;::::0;;;::::1;::::0;;3512:88::o;914:150:6:-;205:6;;-1:-1:-1;;;;;205:6:6;191:10;:20;183:58;;;;-1:-1:-1;;;183:58:6;;9123:2:16;183:58:6;;;9105:21:16;9162:2;9142:18;;;9135:30;9201:27;9181:18;;;9174:55;9246:18;;183:58:6;8921:349:16;183:58:6;914:150;;;;:::o;3698:122:7:-;1019:7:11;1045:6;-1:-1:-1;;;;;1045:6:11;665:10:15;1185:23:11;1177:68;;;;-1:-1:-1;;;1177:68:11;;8762:2:16;1177:68:11;;;8744:21:16;;;8781:18;;;8774:30;-1:-1:-1;;;;;;;;;;;8820:18:16;;;8813:62;8892:18;;1177:68:11;8560:356:16;1177:68:11;-1:-1:-1;;;;;3784:24:7;::::1;;::::0;;;:16:::1;:24;::::0;;;;:29;;3811:2;;3784:24;-1:-1:-1;;3784:29:7::1;::::0;3811:2;3784:29:::1;::::0;::::1;;;;;;:::i;:::-;;;;;;3698:122:::0;;:::o;194:82:5:-;1019:7:11;1045:6;-1:-1:-1;;;;;1045:6:11;665:10:15;1185:23:11;1177:68;;;;-1:-1:-1;;;1177:68:11;;8762:2:16;1177:68:11;;;8744:21:16;;;8781:18;;;8774:30;-1:-1:-1;;;;;;;;;;;8820:18:16;;;8813:62;8892:18;;1177:68:11;8560:356:16;1177:68:11;255:6:5::1;:14:::0;;-1:-1:-1;;;;;;255:14:5::1;-1:-1:-1::0;;;;;255:14:5;;;::::1;::::0;;;::::1;::::0;;194:82::o;10786:141:3:-;1019:7:11;1045:6;-1:-1:-1;;;;;1045:6:11;665:10:15;1185:23:11;1177:68;;;;-1:-1:-1;;;1177:68:11;;8762:2:16;1177:68:11;;;8744:21:16;;;8781:18;;;8774:30;-1:-1:-1;;;;;;;;;;;8820:18:16;;;8813:62;8892:18;;1177:68:11;8560:356:16;1177:68:11;-1:-1:-1;;;;;10881:22:3;;::::1;;::::0;;;:14:::1;:22;::::0;;;;:39;10786:141::o;3406:100:7:-;1019:7:11;1045:6;-1:-1:-1;;;;;1045:6:11;665:10:15;1185:23:11;1177:68;;;;-1:-1:-1;;;1177:68:11;;8762:2:16;1177:68:11;;;8744:21:16;;;8781:18;;;8774:30;-1:-1:-1;;;;;;;;;;;8820:18:16;;;8813:62;8892:18;;1177:68:11;8560:356:16;1177:68:11;3476:15:7::1;:23:::0;;-1:-1:-1;;;;;;3476:23:7::1;-1:-1:-1::0;;;;;3476:23:7;;;::::1;::::0;;;::::1;::::0;;3406:100::o;11058:104:3:-;1019:7:11;1045:6;-1:-1:-1;;;;;1045:6:11;665:10:15;1185:23:11;1177:68;;;;-1:-1:-1;;;1177:68:11;;8762:2:16;1177:68:11;;;8744:21:16;;;8781:18;;;8774:30;-1:-1:-1;;;;;;;;;;;8820:18:16;;;8813:62;8892:18;;1177:68:11;8560:356:16;1177:68:11;11131:10:3::1;:24:::0;;-1:-1:-1;;;;;;11131:24:3::1;-1:-1:-1::0;;;;;11131:24:3;;;::::1;::::0;;;::::1;::::0;;11058:104::o;2003:717::-;483:10;497:9;483:23;475:43;;;;-1:-1:-1;;;475:43:3;;9477:2:16;475:43:3;;;9459:21:16;9516:1;9496:18;;;9489:29;-1:-1:-1;;;9534:18:16;;;9527:37;9581:18;;475:43:3;9275:330:16;475:43:3;2334:9:::1;2321;:22;2313:50;;;::::0;-1:-1:-1;;;2313:50:3;;9812:2:16;2313:50:3::1;::::0;::::1;9794:21:16::0;9851:2;9831:18;;;9824:30;9890:17;9870:18;;;9863:45;9925:18;;2313:50:3::1;9610:339:16::0;2313:50:3::1;2401:10;::::0;-1:-1:-1;;;;;2401:10:3::1;2381:13;:8:::0;;:13:::1;:::i;:::-;2395:1;2381:16;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;2381:30:3::1;;2373:57;;;::::0;-1:-1:-1;;;2373:57:3;;10838:2:16;2373:57:3::1;::::0;::::1;10820:21:16::0;10877:2;10857:18;;;10850:30;-1:-1:-1;;;10896:18:16;;;10889:44;10950:18;;2373:57:3::1;10636:338:16::0;2373:57:3::1;2446:10;;;;;;;;;-1:-1:-1::0;;;;;2446:10:3::1;-1:-1:-1::0;;;;;2440:25:3::1;;2473:9;2440:45;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;2495:218;2526:9;2549;2572:11;2597:8;2495:218;;;:::i;:::-;;2619:8:::0;2495:218:::1;:::i;:::-;2641:18;2673:6;2693:10;2495:17;:218::i;:::-;2003:717:::0;;;;;;;;:::o;1605:92:11:-;1019:7;1045:6;-1:-1:-1;;;;;1045:6:11;665:10:15;1185:23:11;1177:68;;;;-1:-1:-1;;;1177:68:11;;8762:2:16;1177:68:11;;;8744:21:16;;;8781:18;;;8774:30;-1:-1:-1;;;;;;;;;;;8820:18:16;;;8813:62;8892:18;;1177:68:11;8560:356:16;1177:68:11;1669:21:::1;1687:1;1669:9;:21::i;:::-;1605:92::o:0;3606:86:7:-;1019:7:11;1045:6;-1:-1:-1;;;;;1045:6:11;665:10:15;1185:23:11;1177:68;;;;-1:-1:-1;;;1177:68:11;;8762:2:16;1177:68:11;;;8744:21:16;;;8781:18;;;8774:30;-1:-1:-1;;;;;;;;;;;8820:18:16;;;8813:62;8892:18;;1177:68:11;8560:356:16;1177:68:11;3669:8:7::1;:16:::0;;-1:-1:-1;;;;;;3669:16:7::1;-1:-1:-1::0;;;;;3669:16:7;;;::::1;::::0;;;::::1;::::0;;3606:86::o;2726:474:3:-;483:10;497:9;483:23;475:43;;;;-1:-1:-1;;;475:43:3;;9477:2:16;475:43:3;;;9459:21:16;9516:1;9496:18;;;9489:29;-1:-1:-1;;;9534:18:16;;;9527:37;9581:18;;475:43:3;9275:330:16;475:43:3;2997:79:::1;3039:10;3059:4;3066:9:::0;3004:13:::1;:8:::0;;:13:::1;:::i;:::-;3018:1;3004:16;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;2997:41:3::1;::::0;:79;;:41:::1;:79::i;:::-;3086:107;3104:9:::0;3115;3126:11;3086:107:::1;3139:8:::0;3086:107:::1;:::i;:::-;;3149:8:::0;3086:107:::1;:::i;:::-;3159:18;3179:6;3187:5;3086:17;:107::i;:::-;2726:474:::0;;;;;;;:::o;7106:1450::-;205:6:6;;-1:-1:-1;;;;;205:6:6;191:10;:20;183:58;;;;-1:-1:-1;;;183:58:6;;9123:2:16;183:58:6;;;9105:21:16;9162:2;9142:18;;;9135:30;9201:27;9181:18;;;9174:55;9246:18;;183:58:6;8921:349:16;183:58:6;7327:20:3::1;7362:8;7350:37;;;;;;;;;;;;:::i;:::-;7415:6:::0;;:11;:14;;7327:60;;-1:-1:-1;7415:11:3;:6:::1;::::0;:14:::1;;;;:::i;:::-;;;;;;;-1:-1:-1::0;;;;;7405:24:3::1;:6;-1:-1:-1::0;;;;;7405:24:3::1;;7397:111;;;::::0;-1:-1:-1;;;7397:111:3;;14967:2:16;7397:111:3::1;::::0;::::1;14949:21:16::0;15006:2;14986:18;;;14979:30;15045:34;15025:18;;;15018:62;15116:34;15096:18;;;15089:62;15188:12;15167:19;;;15160:41;15218:19;;7397:111:3::1;14765:478:16::0;7397:111:3::1;7518:10;7531:79;7553:1;:10;;;7565:11;7585:13;7601:8;7531:21;:79::i;:::-;7702:6:::0;;:11;:18;7518:92;;-1:-1:-1;7620:17:3::1;::::0;7667:20:::1;::::0;7702:22;-1:-1:-1;7698:799:3::1;;;7795:6:::0;;7750:4:::1;::::0;7786:25:::1;::::0;7803:7;7786:8:::1;:25::i;:::-;7768:43:::0;-1:-1:-1;7768:43:3;-1:-1:-1;7825:423:3;::::1;;;7862:6:::0;;:11;7874:18;;7851:83:::1;::::0;7862:11;7874:22:::1;::::0;7895:1:::1;::::0;7874:22:::1;:::i;:::-;7862:35;;;;;;;;:::i;:::-;;;;;;;7899:9;7910:1;:10;;;7922:1;:11;;;7851:10;:83::i;:::-;7961:20;7952:29;;7825:423;;;8104:46;8115:6;8123:7;8132:1;:10;;;8144:5;8104:10;:46::i;:::-;8180:7;8168:19;;8214;8205:28;;7825:423;7726:532;7698:799;;;8361:6:::0;;:11;:14;;8350:60:::1;::::0;8361:11;:6:::1;::::0;:14:::1;;;;:::i;:::-;;;;;;;8377:7;8386:1;:10;;;8398:1;:11;;;8350:10;:60::i;:::-;-1:-1:-1::0;8436:7:3;;-1:-1:-1;8466:20:3::1;7698:799;8511:38;8527:2;8531:9;8542:6;8511:38;;;;;;;;:::i;:::-;;;;;;;;7317:1239;;;;7106:1450:::0;;;;;:::o;10933:119::-;1019:7:11;1045:6;-1:-1:-1;;;;;1045:6:11;665:10:15;1185:23:11;1177:68;;;;-1:-1:-1;;;1177:68:11;;8762:2:16;1177:68:11;;;8744:21:16;;;8781:18;;;8774:30;-1:-1:-1;;;;;;;;;;;8820:18:16;;;8813:62;8892:18;;1177:68:11;8560:356:16;1177:68:11;-1:-1:-1;;;;;11016:18:3;;;::::1;;::::0;;;:12:::1;:18;::::0;;;;:29;;-1:-1:-1;;11016:29:3::1;::::0;::::1;;::::0;;;::::1;::::0;;10933:119::o;9345:460::-;205:6:6;;-1:-1:-1;;;;;205:6:6;191:10;:20;183:58;;;;-1:-1:-1;;;183:58:6;;9123:2:16;183:58:6;;;9105:21:16;9162:2;9142:18;;;9135:30;9201:27;9181:18;;;9174:55;9246:18;;183:58:6;8921:349:16;183:58:6;9580:20:3::1;9615:8;9603:37;;;;;;;;;;;;:::i;:::-;9580:60;;9650:10;9663:79;9685:1;:10;;;9697:11;9717:13;9733:8;9663:21;:79::i;:::-;9650:92;;9757:41;9773:2;9777:1;9780:17;9757:41;;;;;;;;:::i;:::-;;;;;;;;9570:235;;9345:460:::0;;;;;:::o;1846:189:11:-;1019:7;1045:6;-1:-1:-1;;;;;1045:6:11;665:10:15;1185:23:11;1177:68;;;;-1:-1:-1;;;1177:68:11;;8762:2:16;1177:68:11;;;8744:21:16;;;8781:18;;;8774:30;-1:-1:-1;;;;;;;;;;;8820:18:16;;;8813:62;8892:18;;1177:68:11;8560:356:16;1177:68:11;-1:-1:-1;;;;;1934:22:11;::::1;1926:73;;;::::0;-1:-1:-1;;;1926:73:11;;16490:2:16;1926:73:11::1;::::0;::::1;16472:21:16::0;16529:2;16509:18;;;16502:30;16568:34;16548:18;;;16541:62;16639:8;16619:18;;;16612:36;16665:19;;1926:73:11::1;16288:402:16::0;1926:73:11::1;2009:19;2019:8;2009:9;:19::i;:::-;1846:189:::0;:::o;4094:2351:3:-;4386:13;;:20;4378:56;;;;-1:-1:-1;;;4378:56:3;;16897:2:16;4378:56:3;;;16879:21:16;16936:2;16916:18;;;16909:30;16975:21;16955:18;;;16948:49;17014:18;;4378:56:3;16695:343:16;4378:56:3;4466:13;;4480:20;;4444:19;;4466:13;4480:24;;4503:1;;4480:24;:::i;:::-;4466:39;;;;;;;;:::i;:::-;;;;;;;4444:61;;4536:14;:32;4551:8;:13;;;4565:1;4551:16;;;;;;;;:::i;:::-;;;;;;;-1:-1:-1;;;;;4536:32:3;-1:-1:-1;;;;;4536:32:3;;;;;;;;;;;;;4524:9;:44;4516:101;;;;-1:-1:-1;;;4516:101:3;;17245:2:16;4516:101:3;;;17227:21:16;17284:2;17264:18;;;17257:30;17323:34;17303:18;;;17296:62;17394:14;17374:18;;;17367:42;17426:19;;4516:101:3;17043:408:16;4516:101:3;4683:13;;:20;4651:13;;4706:1;-1:-1:-1;4683:24:3;:50;;;4726:7;4711:22;;:11;:22;;;;4683:50;4675:82;;;;-1:-1:-1;;;4675:82:3;;17658:2:16;4675:82:3;;;17640:21:16;17697:2;17677:18;;;17670:30;17736:21;17716:18;;;17709:49;17775:18;;4675:82:3;17456:343:16;4675:82:3;4910:13;;:20;4816:9;;4933:1;-1:-1:-1;4906:178:3;;;4960:4;4996:29;5005:8;5015:9;4996:8;:29::i;:::-;4978:47;-1:-1:-1;4978:47:3;-1:-1:-1;4978:47:3;5039:34;;5048:25;;-1:-1:-1;;;5048:25:3;;18006:2:16;5048:25:3;;;17988:21:16;18045:2;18025:18;;;18018:30;18084:17;18064:18;;;18057:45;18119:18;;5048:25:3;17804:339:16;5039:34:3;4936:148;4906:178;5094:10;5176:7;5161:22;;:11;:22;;;5157:1282;;;5266:54;-1:-1:-1;;;;;5266:32:3;;5299:9;5310;5266:32;:54::i;:::-;5451:10;5463:7;5472:9;5483:6;5491:8;5440:60;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;5430:71;;;;;;5425:76;;5520;5531:2;5535:7;5544:9;5555:8;:13;;;5569:1;5555:16;;;;;;;;:::i;:::-;;;;;;;;;;;;5520:76;;;19968:25:16;;;20041:18;20029:31;;;20009:18;;;20002:59;;;;20077:18;;;20070:34;-1:-1:-1;;;;;20201:15:16;;;20196:2;20181:18;;20174:43;20248:3;20233:19;;20226:35;;;20298:15;;20292:3;20277:19;;20270:44;19955:3;19940:19;5520:76:3;;;;;;;5157:1282;;;5635:13;;:20;5627:56;;;;-1:-1:-1;;;5627:56:3;;20527:2:16;5627:56:3;;;20509:21:16;20566:2;20546:18;;;20539:30;20605:21;20585:18;;;20578:49;20644:18;;5627:56:3;20325:343:16;5627:56:3;5697:20;5748:89;;;;;;;;5767:8;5748:89;;;;5787:10;-1:-1:-1;;;;;5748:89:3;;;;;5806:6;5748:89;;;;;;5825:10;5748:89;;;;;5720:131;;;;;;;;:::i;:::-;;;;;;;;;;;;;5697:154;;5870:64;5892:10;5904:7;5913:11;5926:7;5870:21;:64::i;:::-;5865:69;;6073:234;6114:9;6141:11;6170:9;6197:11;6226:6;6250:18;6286:7;6073:23;:234::i;:::-;6326:102;6342:2;6346:11;6359:9;6370:8;:13;;;6384:1;6370:16;;;;;;;;:::i;:::-;;;;;;;;;;;6388:13;;6402:20;;:24;;6425:1;;6402:24;:::i;:::-;6388:39;;;;;;;;:::i;:::-;;;;;;;6326:102;;;;;;;;;21588:25:16;;;21661:18;21649:31;;;;21644:2;21629:18;;21622:59;21712:2;21697:18;;21690:34;;;;-1:-1:-1;;;;;21821:15:16;;;21816:2;21801:18;;21794:43;21874:15;21868:3;21853:19;;21846:44;21575:3;21560:19;;21331:565;6326:102:3;;;;;;;;5613:826;5157:1282;4368:2077;;;;4094:2351;;;;;;;;:::o;2041:169:11:-;2096:16;2115:6;;-1:-1:-1;;;;;2131:17:11;;;-1:-1:-1;;;;;;2131:17:11;;;;;;2163:40;;2115:6;;;;;;;2163:40;;2096:16;2163:40;2086:124;2041:169;:::o;845:241:13:-;1010:68;;-1:-1:-1;;;;;22182:15:16;;;1010:68:13;;;22164:34:16;22234:15;;22214:18;;;22207:43;22266:18;;;22259:34;;;983:96:13;;1003:5;;-1:-1:-1;;;1033:27:13;22076:18:16;;1010:68:13;;;;-1:-1:-1;;1010:68:13;;;;;;;;;;;;;;;;;;;;;;;;;;;983:19;:96::i;10504:276:3:-;10675:7;10728;10737:11;10750;10763:8;10711:61;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;10701:72;;;;;;10694:79;;10504:276;;;;;;:::o;9811:687::-;9964:9;;;;;-1:-1:-1;;;;;9951:23:3;9886:7;9951:23;;;:12;:23;;;;;;;9886:7;;;;9951:23;;9946:75;;9998:5;;-1:-1:-1;10005:4:3;-1:-1:-1;9990:20:3;;9946:75;10030:63;10074:5;:9;;;10085:7;10037:5;:10;;;10048:1;10037:13;;;;;;;;:::i;:::-;;;;;;;-1:-1:-1;;;;;10030:43:3;;;:63;;;;;:::i;:::-;10130:5;:9;;;-1:-1:-1;;;;;10119:46:3;;10183:7;10208:5;:16;;;10242:5;:10;;;10278:4;10301:5;:14;;;10119:210;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;10119:210:3;;;;;;;;;;;;:::i;:::-;;;10103:389;;10469:5;;-1:-1:-1;10476:4:3;-1:-1:-1;10461:20:3;;10103:389;10395:4;10401:7;10426:1;10409:7;:14;:18;;;;:::i;:::-;10401:27;;;;;;;;:::i;:::-;;;;;;;10387:42;;;;;;9811:687;;;;;;:::o;8562:494::-;8711:10;8707:343;;;8755:10;;-1:-1:-1;;;;;8745:20:3;;;8755:10;;8745:20;8737:47;;;;-1:-1:-1;;;8737:47:3;;10838:2:16;8737:47:3;;;10820:21:16;10877:2;10857:18;;;10850:30;-1:-1:-1;;;10896:18:16;;;10889:44;10950:18;;8737:47:3;10636:338:16;8737:47:3;8804:10;;8798:35;;-1:-1:-1;;;8798:35:3;;;;;2307:25:16;;;-1:-1:-1;;;;;8804:10:3;;;;8798:26;;2280:18:16;;8798:35:3;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8848:9;8863;-1:-1:-1;;;;;8863:14:3;8885:7;8899:5;8863:46;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8847:62;;;8931:4;8923:38;;;;-1:-1:-1;;;8923:38:3;;25537:2:16;8923:38:3;;;25519:21:16;25576:2;25556:18;;;25549:30;25615:23;25595:18;;;25588:51;25656:18;;8923:38:3;25335:345:16;8923:38:3;8723:249;8707:343;;;8992:47;-1:-1:-1;;;;;8992:27:3;;9020:9;9031:7;634:205:13;773:58;;-1:-1:-1;;;;;25877:55:16;;773:58:13;;;25859:74:16;25949:18;;;25942:34;;;746:86:13;;766:5;;-1:-1:-1;;;796:23:13;25832:18:16;;773:58:13;25685:297:16;746:86:13;634:205;;;:::o;970:1610:7:-;-1:-1:-1;;;;;1231:24:7;;1215:13;1231:24;;;:16;:24;;;;;;;;;1215:13;1231:24;1321:2;:26;;;;;;;;:::i;:::-;;1317:1151;;;1372:15;;-1:-1:-1;;;;;1372:15:7;;;;-1:-1:-1;1401:62:7;;:36;;1372:15;1455:7;1401:36;:62::i;:::-;1485:15;;1477:92;;-1:-1:-1;;;1477:92:7;;-1:-1:-1;;;;;26347:15:16;;;1477:92:7;;;26329:34:16;26399:15;;;26379:18;;;26372:43;26431:18;;;26424:34;;;26477:18;26531:15;;;26511:18;;;26504:43;26584:15;;26563:19;;;26556:44;26649:10;26637:23;;26616:19;;;26609:52;1485:15:7;;;;1477:29;;26240:19:16;;1477:92:7;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;1623:103:7;;-1:-1:-1;;1648:4:7;27033:2:16;27029:15;;;27025:24;;1623:103:7;;;27013:37:16;27084:15;;;27080:24;;27066:12;;;27059:46;27139:15;;;27135:24;27121:12;;;27114:46;27176:12;;;27169:28;;;-1:-1:-1;;;;;;27320:3:16;27316:16;;;27312:25;;27298:12;;;27291:47;27373:16;;;27369:25;;27354:13;;;27347:48;1711:13:7;27430:16:16;;27426:25;27411:13;;;27404:48;27468:13;;;-1:-1:-1;1623:103:7;;-1:-1:-1;26672:815:16;1623:103:7;;;;;;;;;;;;;1596:144;;;;;;1583:157;;1317:1151;;;1767:21;1761:2;:27;;;;;;;;:::i;:::-;;1757:711;;;1813:8;;;1835:74;;-1:-1:-1;;;1835:74:7;;-1:-1:-1;;;;;27826:15:16;;;1835:74:7;;;27808:34:16;;;;27858:18;;;27851:34;;;27904:18;27958:15;;;27938:18;;;27931:43;28010:15;;;27990:18;;;27983:43;28063:15;;28042:19;;;28035:44;1813:8:7;;;-1:-1:-1;1813:8:7;;1835:25;;27719:19:16;;1835:74:7;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1988:4;1995:6;2003:7;2012:11;2025:9;2036:6;2051:13;1963:103;;;;;;;;;;;;;28451:2:16;28447:15;;;-1:-1:-1;;28443:24:16;;;28431:37;;28502:15;;;28498:24;;28493:2;28484:12;;28477:46;28548:2;28539:12;;28532:28;;;;28683:3;28679:16;;;-1:-1:-1;;;;;;28675:25:16;;;28670:2;28661:12;;28654:47;28735:15;;;;28731:24;;;28726:2;28717:12;;28710:46;28791:16;;;28787:25;;28781:3;28772:13;;28765:48;28848:16;;;;28844:25;28838:3;28829:13;;28822:48;28895:3;28886:13;;28090:815;1757:711:7;2107:18;2101:2;:24;;;;;;;;:::i;:::-;;2097:371;;;2150:9;;2173:59;;-1:-1:-1;;;2173:59:7;;-1:-1:-1;;;;;29218:15:16;;;2173:59:7;;;29200:34:16;29250:18;;;29243:34;;;29313:15;;;29293:18;;;29286:43;29377:18;29365:31;;29345:18;;;29338:59;2150:9:7;;;;-1:-1:-1;2150:9:7;;2173:23;;29111:19:16;;2173:59:7;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;2286:90:7;;-1:-1:-1;;2311:4:7;29743:2:16;29739:15;;;29735:24;;2286:90:7;;;29723:37:16;29794:15;;;29790:24;;29776:12;;;29769:46;29831:12;;;29824:28;;;29886:15;;;29882:24;29868:12;;;29861:46;-1:-1:-1;;;;;;30030:3:16;30026:16;;;30022:25;;30008:12;;;30001:47;2361:13:7;30083:16:16;;30079:25;30064:13;;;30057:48;30121:13;;;-1:-1:-1;2286:90:7;;-1:-1:-1;29408:732:16;2097:371:7;2421:36;;-1:-1:-1;;;2421:36:7;;30347:2:16;2421:36:7;;;30329:21:16;30386:2;30366:18;;;30359:30;30425:28;30405:18;;;30398:56;30471:18;;2421:36:7;30145:350:16;2097:371:7;2488:6;;2477:96;;-1:-1:-1;;;2477:96:7;;-1:-1:-1;;;;;2488:6:7;;;;2477:42;;:96;;2520:9;;2531:11;;2544:6;;2552:10;;2564:8;;2477:96;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1205:1375;;;970:1610;;;;;;;:::o;3140:706:13:-;3559:23;3585:69;3613:4;3585:69;;;;;;;;;;;;;;;;;3593:5;-1:-1:-1;;;;;3585:27:13;;;:69;;;;;:::i;:::-;3668:17;;3559:95;;-1:-1:-1;3668:21:13;3664:176;;3763:10;3752:30;;;;;;;;;;;;:::i;:::-;3744:85;;;;-1:-1:-1;;;3744:85:13;;31826:2:16;3744:85:13;;;31808:21:16;31865:2;31845:18;;;31838:30;31904:34;31884:18;;;31877:62;31975:12;31955:18;;;31948:40;32005:19;;3744:85:13;31624:406:16;1955:310:13;2104:39;;-1:-1:-1;;;2104:39:13;;2128:4;2104:39;;;32270:34:16;-1:-1:-1;;;;;32340:15:16;;;32320:18;;;32313:43;2081:20:13;;2146:5;;2104:15;;;;;32182:18:16;;2104:39:13;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:47;;;;:::i;:::-;2188:69;;-1:-1:-1;;;;;25877:55:16;;2188:69:13;;;25859:74:16;25949:18;;;25942:34;;;2081:70:13;;-1:-1:-1;2161:97:13;;2181:5;;-1:-1:-1;;;2211:22:13;25832:18:16;;2188:69:13;25685:297:16;3461:223:14;3594:12;3625:52;3647:6;3655:4;3661:1;3664:12;3625:21;:52::i;:::-;3618:59;;3461:223;;;;;;:::o;4548:500::-;4713:12;4770:5;4745:21;:30;;4737:81;;;;-1:-1:-1;;;4737:81:14;;32891:2:16;4737:81:14;;;32873:21:16;32930:2;32910:18;;;32903:30;32969:34;32949:18;;;32942:62;33040:8;33020:18;;;33013:36;33066:19;;4737:81:14;32689:402:16;4737:81:14;1034:20;;4828:60;;;;-1:-1:-1;;;4828:60:14;;33298:2:16;4828:60:14;;;33280:21:16;33337:2;33317:18;;;33310:30;33376:31;33356:18;;;33349:59;33425:18;;4828:60:14;33096:353:16;4828:60:14;4900:12;4914:23;4941:6;-1:-1:-1;;;;;4941:11:14;4960:5;4967:4;4941:31;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4899:73;;;;4989:52;5007:7;5016:10;5028:12;4989:17;:52::i;:::-;4982:59;4548:500;-1:-1:-1;;;;;;;4548:500:14:o;6950:692::-;7096:12;7124:7;7120:516;;;-1:-1:-1;7154:10:14;7147:17;;7120:516;7265:17;;:21;7261:365;;7459:10;7453:17;7519:15;7506:10;7502:2;7498:19;7491:44;7261:365;7598:12;7591:20;;-1:-1:-1;;;7591:20:14;;;;;;;;:::i;14:154:16:-;-1:-1:-1;;;;;93:5:16;89:54;82:5;79:65;69:93;;158:1;155;148:12;173:134;241:20;;270:31;241:20;270:31;:::i;:::-;173:134;;;:::o;312:247::-;371:6;424:2;412:9;403:7;399:23;395:32;392:52;;;440:1;437;430:12;392:52;479:9;466:23;498:31;523:5;498:31;:::i;564:129::-;649:18;642:5;638:30;631:5;628:41;618:69;;683:1;680;673:12;698:865;785:6;793;801;809;862:2;850:9;841:7;837:23;833:32;830:52;;;878:1;875;868:12;830:52;917:9;904:23;936:31;961:5;936:31;:::i;:::-;986:5;-1:-1:-1;1043:2:16;1028:18;;1015:32;1056;1015;1056;:::i;:::-;1107:7;-1:-1:-1;1165:2:16;1150:18;;1137:32;1188:18;1218:14;;;1215:34;;;1245:1;1242;1235:12;1215:34;1283:6;1272:9;1268:22;1258:32;;1328:7;1321:4;1317:2;1313:13;1309:27;1299:55;;1350:1;1347;1340:12;1299:55;1390:2;1377:16;1416:2;1408:6;1405:14;1402:34;;;1432:1;1429;1422:12;1402:34;1477:7;1472:2;1463:6;1459:2;1455:15;1451:24;1448:37;1445:57;;;1498:1;1495;1488:12;1445:57;698:865;;;;-1:-1:-1;;1529:2:16;1521:11;;-1:-1:-1;;;698:865:16:o;1568:127::-;1629:10;1624:3;1620:20;1617:1;1610:31;1660:4;1657:1;1650:15;1684:4;1681:1;1674:15;1700:212;1783:1;1776:5;1773:12;1763:143;;1828:10;1823:3;1819:20;1816:1;1809:31;1863:4;1860:1;1853:15;1891:4;1888:1;1881:15;1917:239;2064:2;2049:18;;2076:40;2109:6;2076:40;:::i;:::-;2125:25;;;1917:239;:::o;2343:412::-;2426:6;2434;2487:2;2475:9;2466:7;2462:23;2458:32;2455:52;;;2503:1;2500;2493:12;2455:52;2542:9;2529:23;2561:31;2586:5;2561:31;:::i;:::-;2611:5;-1:-1:-1;2668:2:16;2653:18;;2640:32;2703:1;2691:14;;2681:42;;2719:1;2716;2709:12;2681:42;2742:7;2732:17;;;2343:412;;;;;:::o;2991:315::-;3059:6;3067;3120:2;3108:9;3099:7;3095:23;3091:32;3088:52;;;3136:1;3133;3126:12;3088:52;3175:9;3162:23;3194:31;3219:5;3194:31;:::i;:::-;3244:5;3296:2;3281:18;;;;3268:32;;-1:-1:-1;;;2991:315:16:o;3311:157::-;3372:5;3417:3;3408:6;3403:3;3399:16;3395:26;3392:46;;;3434:1;3431;3424:12;3392:46;-1:-1:-1;3456:6:16;3311:157;-1:-1:-1;3311:157:16:o;3473:163::-;3540:20;;3600:10;3589:22;;3579:33;;3569:61;;3626:1;3623;3616:12;3641:118;3727:5;3720:13;3713:21;3706:5;3703:32;3693:60;;3749:1;3746;3739:12;3764:1306;3934:6;3942;3950;3958;3966;3974;3982;3990;4043:3;4031:9;4022:7;4018:23;4014:33;4011:53;;;4060:1;4057;4050:12;4011:53;4099:9;4086:23;4118:31;4143:5;4118:31;:::i;:::-;4168:5;-1:-1:-1;4220:2:16;4205:18;;4192:32;;-1:-1:-1;4276:2:16;4261:18;;4248:32;4289;4248;4289;:::i;:::-;4340:7;-1:-1:-1;4398:2:16;4383:18;;4370:32;4421:18;4451:14;;;4448:34;;;4478:1;4475;4468:12;4448:34;4501:68;4561:7;4552:6;4541:9;4537:22;4501:68;:::i;:::-;4491:78;;4622:3;4611:9;4607:19;4594:33;4578:49;;4652:2;4642:8;4639:16;4636:36;;;4668:1;4665;4658:12;4636:36;;4691:70;4753:7;4742:8;4731:9;4727:24;4691:70;:::i;:::-;4681:80;;;4780:38;4813:3;4802:9;4798:19;4780:38;:::i;:::-;4770:48;;4870:3;4859:9;4855:19;4842:33;4884:32;4908:7;4884:32;:::i;:::-;4935:7;-1:-1:-1;4994:3:16;4979:19;;4966:33;5008:30;4966:33;5008:30;:::i;:::-;5057:7;5047:17;;;3764:1306;;;;;;;;;;;:::o;5075:1170::-;5239:6;5247;5255;5263;5271;5279;5287;5340:3;5328:9;5319:7;5315:23;5311:33;5308:53;;;5357:1;5354;5347:12;5308:53;5396:9;5383:23;5415:31;5440:5;5415:31;:::i;:::-;5465:5;-1:-1:-1;5517:2:16;5502:18;;5489:32;;-1:-1:-1;5573:2:16;5558:18;;5545:32;5586;5545;5586;:::i;:::-;5637:7;-1:-1:-1;5695:2:16;5680:18;;5667:32;5718:18;5748:14;;;5745:34;;;5775:1;5772;5765:12;5745:34;5798:68;5858:7;5849:6;5838:9;5834:22;5798:68;:::i;:::-;5788:78;;5919:3;5908:9;5904:19;5891:33;5875:49;;5949:2;5939:8;5936:16;5933:36;;;5965:1;5962;5955:12;5933:36;;5988:70;6050:7;6039:8;6028:9;6024:24;5988:70;:::i;:::-;5978:80;;;6077:38;6110:3;6099:9;6095:19;6077:38;:::i;:::-;6067:48;;6167:3;6156:9;6152:19;6139:33;6181:32;6205:7;6181:32;:::i;:::-;6232:7;6222:17;;;5075:1170;;;;;;;;;;:::o;6250:127::-;6311:10;6306:3;6302:20;6299:1;6292:31;6342:4;6339:1;6332:15;6366:4;6363:1;6356:15;6382:253;6454:2;6448:9;6496:4;6484:17;;6531:18;6516:34;;6552:22;;;6513:62;6510:88;;;6578:18;;:::i;:::-;6614:2;6607:22;6382:253;:::o;6640:275::-;6711:2;6705:9;6776:2;6757:13;;-1:-1:-1;;6753:27:16;6741:40;;6811:18;6796:34;;6832:22;;;6793:62;6790:88;;;6858:18;;:::i;:::-;6894:2;6887:22;6640:275;;-1:-1:-1;6640:275:16:o;6920:1248::-;7023:6;7031;7039;7047;7055;7108:3;7096:9;7087:7;7083:23;7079:33;7076:53;;;7125:1;7122;7115:12;7076:53;7164:9;7151:23;7183:31;7208:5;7183:31;:::i;:::-;7233:5;-1:-1:-1;7257:2:16;7296:18;;;7283:32;7324:33;7283:32;7324:33;:::i;:::-;7376:7;-1:-1:-1;7430:2:16;7415:18;;7402:32;;-1:-1:-1;7486:2:16;7471:18;;7458:32;7499;7458;7499;:::i;:::-;7550:7;-1:-1:-1;7608:3:16;7593:19;;7580:33;7632:18;7662:14;;;7659:34;;;7689:1;7686;7679:12;7659:34;7727:6;7716:9;7712:22;7702:32;;7772:7;7765:4;7761:2;7757:13;7753:27;7743:55;;7794:1;7791;7784:12;7743:55;7830:2;7817:16;7852:2;7848;7845:10;7842:36;;;7858:18;;:::i;:::-;7900:53;7943:2;7924:13;;-1:-1:-1;;7920:27:16;7916:36;;7900:53;:::i;:::-;7887:66;;7976:2;7969:5;7962:17;8016:7;8011:2;8006;8002;7998:11;7994:20;7991:33;7988:53;;;8037:1;8034;8027:12;7988:53;8092:2;8087;8083;8079:11;8074:2;8067:5;8063:14;8050:45;8136:1;8131:2;8126;8119:5;8115:14;8111:23;8104:34;;8157:5;8147:15;;;;;6920:1248;;;;;;;;:::o;8173:382::-;8238:6;8246;8299:2;8287:9;8278:7;8274:23;8270:32;8267:52;;;8315:1;8312;8305:12;8267:52;8354:9;8341:23;8373:31;8398:5;8373:31;:::i;:::-;8423:5;-1:-1:-1;8480:2:16;8465:18;;8452:32;8493:30;8452:32;8493:30;:::i;9954:545::-;10047:4;10053:6;10113:11;10100:25;10207:2;10203:7;10192:8;10176:14;10172:29;10168:43;10148:18;10144:68;10134:96;;10226:1;10223;10216:12;10134:96;10253:33;;10305:20;;;-1:-1:-1;10348:18:16;10337:30;;10334:50;;;10380:1;10377;10370:12;10334:50;10413:4;10401:17;;-1:-1:-1;10464:1:16;10460:14;;;10444;10440:35;10430:46;;10427:66;;;10489:1;10486;10479:12;10504:127;10565:10;10560:3;10556:20;10553:1;10546:31;10596:4;10593:1;10586:15;10620:4;10617:1;10610:15;10979:183;11039:4;11072:18;11064:6;11061:30;11058:56;;;11094:18;;:::i;:::-;-1:-1:-1;11139:1:16;11135:14;11151:4;11131:25;;10979:183::o;11167:1283::-;11269:9;11328:4;11320:5;11304:14;11300:26;11296:37;11293:57;;;11346:1;11343;11336:12;11293:57;11374:22;;:::i;:::-;11432:5;11419:19;11461:18;11453:6;11450:30;11447:50;;;11493:1;11490;11483:12;11447:50;11516:18;;11572:14;11565:4;11557:13;;11553:34;11543:62;;11601:1;11598;11591:12;11543:62;11637:2;11624:16;11659:4;11683:60;11699:43;11739:2;11699:43;:::i;:::-;11683:60;:::i;:::-;11777:15;;;11859:1;11855:10;;;;11847:19;;11843:28;;;11808:12;;;;11894:14;11883:26;;11880:46;;;11922:1;11919;11912:12;11880:46;11946:11;;;;11966:223;11982:6;11977:3;11974:15;11966:223;;;12064:3;12051:17;12081:33;12106:7;12081:33;:::i;:::-;12127:20;;11999:12;;;;12167;;;;11966:223;;;12198:22;;-1:-1:-1;12254:34:16;12273:14;;;12254:34;:::i;:::-;12236:16;;;12229:60;-1:-1:-1;;12347:2:16;12336:14;;;12323:28;12305:16;;;12298:54;12410:2;12399:14;;;12386:28;12368:16;;;12361:54;;;;-1:-1:-1;12240:7:16;11167:1283::o;12455:138::-;12534:13;;12556:31;12534:13;12556:31;:::i;12598:136::-;12676:13;;12698:30;12676:13;12698:30;:::i;12739:132::-;12815:13;;12837:28;12815:13;12837:28;:::i;12876:1884::-;12974:6;13005:2;13048;13036:9;13027:7;13023:23;13019:32;13016:52;;;13064:1;13061;13054:12;13016:52;13097:9;13091:16;13126:18;13167:2;13159:6;13156:14;13153:34;;;13183:1;13180;13173:12;13153:34;13206:22;;;;13262:4;13244:16;;;13240:27;13237:47;;;13280:1;13277;13270:12;13237:47;13306:22;;:::i;:::-;13359:2;13353:9;13387:2;13377:8;13374:16;13371:36;;;13403:1;13400;13393:12;13371:36;13426:17;;13477:4;13459:16;;;13455:27;13452:47;;;13495:1;13492;13485:12;13452:47;13523:22;;:::i;:::-;13576:2;13570:9;13604:2;13594:8;13591:16;13588:36;;;13620:1;13617;13610:12;13588:36;13643:17;;;-1:-1:-1;13691:4:16;13683:13;;13679:27;-1:-1:-1;13669:55:16;;13720:1;13717;13710:12;13669:55;13749:2;13743:9;13772:60;13788:43;13828:2;13788:43;:::i;13772:60::-;13866:15;;;13948:1;13944:10;;;;13936:19;;13932:28;;;13897:12;;;;13972:19;;;13969:39;;;14004:1;14001;13994:12;13969:39;14028:11;;;;14048:216;14064:6;14059:3;14056:15;14048:216;;;14139:3;14133:10;14156:33;14181:7;14156:33;:::i;:::-;14202:20;;14081:12;;;;14242;;;;14048:216;;;14273:22;;-1:-1:-1;14329:42:16;;-1:-1:-1;14359:11:16;;;14329:42;:::i;:::-;14324:2;14315:7;14311:16;14304:68;14420:2;14416;14412:11;14406:18;14401:2;14392:7;14388:16;14381:44;14473:2;14469;14465:11;14459:18;14454:2;14445:7;14441:16;14434:44;14501:7;14494:5;14487:22;;;14541:42;14579:2;14575;14571:11;14541:42;:::i;:::-;14536:2;14529:5;14525:14;14518:66;14616:41;14653:2;14649;14645:11;14616:41;:::i;:::-;14611:2;14604:5;14600:14;14593:65;14690:39;14725:2;14721;14717:11;14690:39;:::i;:::-;14685:2;14674:14;;14667:63;14678:5;12876:1884;-1:-1:-1;;;;;;12876:1884:16:o;15248:127::-;15309:10;15304:3;15300:20;15297:1;15290:31;15340:4;15337:1;15330:15;15364:4;15361:1;15354:15;15380:125;15420:4;15448:1;15445;15442:8;15439:34;;;15453:18;;:::i;:::-;-1:-1:-1;15490:9:16;;15380:125::o;15510:380::-;15724:25;;;15780:2;15765:18;;15758:34;;;15712:2;15697:18;;15801:40;15834:6;15801:40;:::i;:::-;15877:6;15872:2;15861:9;15857:18;15850:34;15510:380;;;;;;:::o;18148:849::-;18272:12;;18238:4;18293:17;;;18359:19;;18229:14;;;18387:20;;;18199:3;;18457:4;;18484:21;;;;18434:3;18425:13;;;18199:3;18533:224;18547:6;18544:1;18541:13;18533:224;;;18614:13;;-1:-1:-1;;;;;18610:62:16;18596:77;;18732:15;;;;18695:14;;;;18569:1;18562:9;18533:224;;;18537:3;;-1:-1:-1;;;;;18808:2:16;18801:5;18797:14;18791:21;18787:70;18782:2;18777:3;18773:12;18766:92;18907:4;18900:5;18896:16;18890:23;18883:4;18878:3;18874:14;18867:47;18963:4;18956:5;18952:16;18946:23;18939:4;18934:3;18930:14;18923:47;18986:5;18979:12;;;;;18148:849;;;;:::o;19002:676::-;19252:4;-1:-1:-1;;;;;19362:2:16;19354:6;19350:15;19339:9;19332:34;19385:18;19451:2;19443:6;19439:15;19434:2;19423:9;19419:18;19412:43;19503:2;19495:6;19491:15;19486:2;19475:9;19471:18;19464:43;19555:2;19547:6;19543:15;19538:2;19527:9;19523:18;19516:43;;;19596:3;19590;19579:9;19575:19;19568:32;19617:55;19667:3;19656:9;19652:19;19644:6;19617:55;:::i;20673:653::-;20858:2;20847:9;20840:21;20821:4;20896:6;20890:13;20939:4;20934:2;20923:9;20919:18;20912:32;20967:61;21023:3;21012:9;21008:19;20994:12;20967:61;:::i;:::-;20953:75;;-1:-1:-1;;;;;21086:2:16;21078:6;21074:15;21068:22;21064:71;21059:2;21048:9;21044:18;21037:99;21200:18;21194:2;21186:6;21182:15;21176:22;21172:47;21167:2;21156:9;21152:18;21145:75;21290:2;21282:6;21278:15;21272:22;21265:30;21258:38;21251:4;21240:9;21236:20;21229:68;21314:6;21306:14;;;20673:653;;;;:::o;22304:258::-;22376:1;22386:113;22400:6;22397:1;22394:13;22386:113;;;22476:11;;;22470:18;22457:11;;;22450:39;22422:2;22415:10;22386:113;;;22517:6;22514:1;22511:13;22508:48;;;-1:-1:-1;;22552:1:16;22534:16;;22527:27;22304:258::o;22567:644::-;22831:26;22827:31;22818:6;22814:2;22810:15;22806:53;22801:3;22794:66;22776:3;-1:-1:-1;;;;;;22997:2:16;22988:6;22983:3;22979:16;22975:25;22970:2;22965:3;22961:12;22954:47;23053:2;23044:6;23039:3;23035:16;23031:25;23026:2;23021:3;23017:12;23010:47;;23086:6;23080:13;23102:62;23157:6;23152:2;23147:3;23143:12;23136:4;23128:6;23124:17;23102:62;:::i;:::-;23184:16;;;;23202:2;23180:25;;22567:644;-1:-1:-1;;;;;22567:644:16:o;23216:1018::-;23470:4;23518:3;23507:9;23503:19;23549:6;23538:9;23531:25;23575:2;23613:6;23608:2;23597:9;23593:18;23586:34;23656:3;23651:2;23640:9;23636:18;23629:31;23680:6;23715;23709:13;23746:6;23738;23731:22;23784:3;23773:9;23769:19;23762:26;;23823:2;23815:6;23811:15;23797:29;;23844:1;23854:218;23868:6;23865:1;23862:13;23854:218;;;23933:13;;-1:-1:-1;;;;;23929:62:16;23917:75;;24047:15;;;;24012:12;;;;23890:1;23883:9;23854:218;;;-1:-1:-1;;;;;;;24128:55:16;;;;24123:2;24108:18;;24101:83;-1:-1:-1;;;24215:3:16;24200:19;24193:35;24089:3;23216:1018;-1:-1:-1;;;23216:1018:16:o;24239:881::-;24334:6;24365:2;24408;24396:9;24387:7;24383:23;24379:32;24376:52;;;24424:1;24421;24414:12;24376:52;24457:9;24451:16;24490:18;24482:6;24479:30;24476:50;;;24522:1;24519;24512:12;24476:50;24545:22;;24598:4;24590:13;;24586:27;-1:-1:-1;24576:55:16;;24627:1;24624;24617:12;24576:55;24656:2;24650:9;24679:60;24695:43;24735:2;24695:43;:::i;24679:60::-;24773:15;;;24855:1;24851:10;;;;24843:19;;24839:28;;;24804:12;;;;24879:19;;;24876:39;;;24911:1;24908;24901:12;24876:39;24935:11;;;;24955:135;24971:6;24966:3;24963:15;24955:135;;;25037:10;;25025:23;;24988:12;;;;25068;;;;24955:135;;30500:257;30541:3;30579:5;30573:12;30606:6;30601:3;30594:19;30622:63;30678:6;30671:4;30666:3;30662:14;30655:4;30648:5;30644:16;30622:63;:::i;:::-;30739:2;30718:15;-1:-1:-1;;30714:29:16;30705:39;;;;30746:4;30701:50;;30500:257;-1:-1:-1;;30500:257:16:o;30762:607::-;30983:4;-1:-1:-1;;;;;31093:2:16;31085:6;31081:15;31070:9;31063:34;31145:18;31137:6;31133:31;31128:2;31117:9;31113:18;31106:59;31213:2;31205:6;31201:15;31196:2;31185:9;31181:18;31174:43;;31253:6;31248:2;31237:9;31233:18;31226:34;31297:3;31291;31280:9;31276:19;31269:32;31318:45;31358:3;31347:9;31343:19;31335:6;31318:45;:::i;31374:245::-;31441:6;31494:2;31482:9;31473:7;31469:23;31465:32;31462:52;;;31510:1;31507;31500:12;31462:52;31542:9;31536:16;31561:28;31583:5;31561:28;:::i;32367:184::-;32437:6;32490:2;32478:9;32469:7;32465:23;32461:32;32458:52;;;32506:1;32503;32496:12;32458:52;-1:-1:-1;32529:16:16;;32367:184;-1:-1:-1;32367:184:16:o;32556:128::-;32596:3;32627:1;32623:6;32620:1;32617:13;32614:39;;;32633:18;;:::i;:::-;-1:-1:-1;32669:9:16;;32556:128::o;33454:274::-;33583:3;33621:6;33615:13;33637:53;33683:6;33678:3;33671:4;33663:6;33659:17;33637:53;:::i;:::-;33706:16;;;;;33454:274;-1:-1:-1;;33454:274:16:o;33733:219::-;33882:2;33871:9;33864:21;33845:4;33902:44;33942:2;33931:9;33927:18;33919:6;33902:44;:::i

Swarm Source

ipfs://dba0503cd651e6b0d0fb57d7f096e04a66a537ca0da2bce7c3d86523d4d3cc42
Block Transaction Gas Used Reward
Age Block Fee Address BC Fee Address Voting Power Jailed Incoming
Block Uncle Number Difficulty Gas Used Reward
Loading
Loading
Make sure to use the "Vote Down" button for any spammy posts, and the "Vote Up" for interesting conversations.