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

Contract

0x5E2361cd711De7eFE2A85045b643271a64262d40
 

Overview

ETH Balance

0.193284307065684522 ETH

Eth Value

$671.95 (@ $3,476.49/ETH)

Token Holdings

Transaction Hash
Method
Block
From
To
Call Registry198369342024-05-10 3:23:59228 days ago1715311439IN
Socket: Fee Router
0.006312 ETH0.00035683
Claim Fee198343812024-05-09 18:49:11229 days ago1715280551IN
Socket: Fee Router
0 ETH0.00055095.96858249
Claim Fee198343802024-05-09 18:48:59229 days ago1715280539IN
Socket: Fee Router
0 ETH0.000542815.64827721
Claim Fee198343792024-05-09 18:48:47229 days ago1715280527IN
Socket: Fee Router
0 ETH0.000429436.16275132
Claim Fee198343782024-05-09 18:48:35229 days ago1715280515IN
Socket: Fee Router
0 ETH0.000393876.07094652
Call Registry187828722023-12-14 7:23:59376 days ago1702538639IN
Socket: Fee Router
0.009 ETH0.0055207955.02032126
Call Registry186360482023-11-23 17:53:59397 days ago1700762039IN
Socket: Fee Router
0.00970322 ETH0.0047610747.44324723
Call Registry183546272023-10-15 8:36:23436 days ago1697358983IN
Socket: Fee Router
0 ETH0.00207326.31187068
Call Registry183507692023-10-14 19:41:11437 days ago1697312471IN
Socket: Fee Router
0 ETH0.001375116.60125159
Call Registry183506902023-10-14 19:25:23437 days ago1697311523IN
Socket: Fee Router
0 ETH0.001193297.09452783
Call Registry181838382023-09-21 11:05:11460 days ago1695294311IN
Socket: Fee Router
0.1 ETH0.0017976910.31730961
Call Registry181833692023-09-21 9:30:35460 days ago1695288635IN
Socket: Fee Router
0 ETH0.0054168112.50638424
Call Registry181832292023-09-21 9:01:59460 days ago1695286919IN
Socket: Fee Router
0.05 ETH0.0019648711.27907254
Call Registry181831232023-09-21 8:40:23460 days ago1695285623IN
Socket: Fee Router
0.001 ETH0.0010453810.41960972
Call Registry181830802023-09-21 8:31:47460 days ago1695285107IN
Socket: Fee Router
1 ETH0.001851819.12178364
Call Registry181829192023-09-21 7:59:35460 days ago1695283175IN
Socket: Fee Router
0.01 ETH0.000902859
Call Registry181821832023-09-21 5:30:11460 days ago1695274211IN
Socket: Fee Router
0.02 ETH0.002677848.915971
Call Registry181818562023-09-21 4:23:59460 days ago1695270239IN
Socket: Fee Router
0.78 ETH0.001219488.48847711
Call Registry181817712023-09-21 4:06:59460 days ago1695269219IN
Socket: Fee Router
0.003 ETH0.000967029.63855639
Call Registry181809782023-09-21 1:27:35460 days ago1695259655IN
Socket: Fee Router
0 ETH0.002359119.52052591
Call Registry181809312023-09-21 1:17:59460 days ago1695259079IN
Socket: Fee Router
0.0045 ETH0.001892399.32279961
Call Registry181807992023-09-21 0:51:35460 days ago1695257495IN
Socket: Fee Router
0 ETH0.004211728.22624459
Call Registry181806042023-09-21 0:12:35460 days ago1695255155IN
Socket: Fee Router
0.077 ETH0.0022658211.8410961
Call Registry181805622023-09-21 0:04:11460 days ago1695254651IN
Socket: Fee Router
0 ETH0.0027827310.64254561
Claim Fee181688702023-09-19 8:48:47462 days ago1695113327IN
Socket: Fee Router
0 ETH0.0016140311.04424274
View all transactions

Latest 25 internal transactions (View All)

Advanced mode:
Parent Transaction Hash Block
From
To
198369342024-05-10 3:23:59228 days ago1715311439
Socket: Fee Router
0.00629622 ETH
198343782024-05-09 18:48:35229 days ago1715280515
Socket: Fee Router
0.00214709 ETH
198343782024-05-09 18:48:35229 days ago1715280515
Socket: Fee Router
0.04079482 ETH
187828722023-12-14 7:23:59376 days ago1702538639
Socket: Fee Router
0.0089775 ETH
186360482023-11-23 17:53:59397 days ago1700762039
Socket: Fee Router
0.00967896 ETH
181838382023-09-21 11:05:11460 days ago1695294311
Socket: Fee Router
0.0995 ETH
181832292023-09-21 9:01:59460 days ago1695286919
Socket: Fee Router
0.04975 ETH
181831232023-09-21 8:40:23460 days ago1695285623
Socket: Fee Router
0.000995 ETH
181830802023-09-21 8:31:47460 days ago1695285107
Socket: Fee Router
0.995 ETH
181829192023-09-21 7:59:35460 days ago1695283175
Socket: Fee Router
0.00995 ETH
181821832023-09-21 5:30:11460 days ago1695274211
Socket: Fee Router
0.0199 ETH
181818562023-09-21 4:23:59460 days ago1695270239
Socket: Fee Router
0.7761 ETH
181817712023-09-21 4:06:59460 days ago1695269219
Socket: Fee Router
0.002985 ETH
181809312023-09-21 1:17:59460 days ago1695259079
Socket: Fee Router
0.0044775 ETH
181806042023-09-21 0:12:35460 days ago1695255155
Socket: Fee Router
0.076615 ETH
181687802023-09-19 8:30:47462 days ago1695112247
Socket: Fee Router
0.12150879 ETH
181687802023-09-19 8:30:47462 days ago1695112247
Socket: Fee Router
0.68854982 ETH
181077952023-09-10 18:34:47471 days ago1694370887
Socket: Fee Router
0.15858554 ETH
180591432023-09-03 23:08:35477 days ago1693782515
Socket: Fee Router
0.5131225 ETH
180591432023-09-03 23:08:35477 days ago1693782515
Socket: Fee Router
0.517 ETH
180153992023-08-28 20:03:59484 days ago1693253039
Socket: Fee Router
0.009925 ETH
180153992023-08-28 20:03:59484 days ago1693253039
Socket: Fee Router
0.01 ETH
179971612023-08-26 6:48:59486 days ago1693032539
Socket: Fee Router
0.00024159 ETH
179786042023-08-23 16:28:35489 days ago1692808115
Socket: Fee Router
0.017955 ETH
179736302023-08-22 23:47:35489 days ago1692748055
Socket: Fee Router
0.347375 ETH
View All Internal Transactions
Loading...
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
FeeRouter

Compiler Version
v0.8.7+commit.e28d00a7

Optimization Enabled:
Yes with 1000000 runs

Other Settings:
default evmVersion, None license
File 1 of 8 : FeeRouter.sol
pragma solidity ^0.8.4;

import "./interfaces/ISocketRegistry.sol";
import "./utils/Ownable.sol";
import "lib/openzeppelin-contracts/contracts/security/ReentrancyGuard.sol";
import "lib/openzeppelin-contracts/contracts/token/ERC20/utils/SafeERC20.sol";

contract FeeRouter is Ownable,ReentrancyGuard {
    using SafeERC20 for IERC20;

    /**
     * @notice Address used to identify if it is a native token transfer or not
     */
    address private constant NATIVE_TOKEN_ADDRESS =
        0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE;

    /**
     * @notice variable for our registry contract, registry contract is responsible for redirecting to different bridges
     */
    ISocketRegistry public immutable socket;

    // Errors
    error IntegratorIdAlreadyRegistered();
    error TotalFeeAndPartsMismatch();
    error IntegratorIdNotRegistered();
    error FeeMisMatch();
    error NativeTransferFailed();
    error MsgValueMismatch();

    // MAX value of totalFeeInBps.
    uint32 immutable PRECISION = 1000000;

    constructor(address _socketRegistry, address owner_) Ownable(owner_) {
        socket = ISocketRegistry(_socketRegistry);
    }

    // Function to receive Ether. msg.data must be empty
    receive() external payable {}

    // Events ------------------------------------------------------------------------------------------------------->

    /**
     * @notice Event emitted when an integrator registers their fee config
     */
    event RegisterFee(
        uint16 integratorId,
        uint16 totalFeeInBps,
        uint16 part1,
        uint16 part2,
        uint16 part3,
        address feeTaker1,
        address feeTaker2,
        address feeTaker3
    );

    /**
     * @notice Event emitted when integrator fee config is updated
     */
    event UpdateFee(
        uint16 integratorId,
        uint16 totalFeeInBps,
        uint16 part1,
        uint16 part2,
        uint16 part3,
        address feeTaker1,
        address feeTaker2,
        address feeTaker3
    );

    /**
     * @notice Event emitted when fee in tokens are claimed
     */
    event ClaimFee(
        uint16 integratorId,
        address tokenAddress,
        uint256 amount,
        address feeTaker
    );

    /**
     * @notice Event emitted when call registry is successful
     */
    event BridgeSocket(
        uint16 integratorId,
        uint256 amount,
        address inputTokenAddress,
        uint256 toChainId,
        uint256 middlewareId,
        uint256 bridgeId,
        uint256 totalFee
    );

    /**
     * @notice Container for Fee Request
     * @member integratorId Id of the integrator registered in the fee config
     * @member inputAmount amount sent to the fee router.
     * @member UserRequest request that is passed on to the registry
     */
    struct FeeRequest {
        uint16 integratorId;
        uint256 inputAmount;
        ISocketRegistry.UserRequest userRequest;
    }

    /**
     * @notice Container for Fee Splits
     * @member feeTaker address of the entity who will claim the fee
     * @member partOfTotalFeesInBps part of total fees that the feeTaker can claim
     */
    struct FeeSplits {
        address feeTaker;
        uint16 partOfTotalFeesInBps;
    }

    /**
     * @notice Mapping of valid integrators
     */
    mapping(uint16 => bool) validIntegrators;

    /**
     * @notice Mapping of integrator Ids and the total fee that can be cut from the input amount
     */
    mapping(uint16 => uint16) totalFeeMap;
    /**
     * @notice Mapping of integrator Ids and FeeSplits. FeeSplits is an array with the max size of 3
     * The total fee can be at max split into 3 parts
     */
    mapping(uint16 => FeeSplits[3]) feeSplitMap;

    /**
     * @notice Mapping of integratorId and the earned fee per token
     */
    mapping(uint16 => mapping(address => uint256)) earnedTokenFeeMap;

    // CORE FUNCTIONS ------------------------------------------------------------------------------------------------------>

    /**
     * @notice Owner can register a fee config against an integratorId
     * @dev totalFeeInBps and the sum of feesplits should be exactly equal, feeSplits can have a max size of 3
     * @param integratorId id of the integrator
     * @param totalFeeInBps totalFeeInBps, the max value can be 10000
     * @param feeSplits array of FeeSplits
     */
    function registerFeeConfig(
        uint16 integratorId,
        uint16 totalFeeInBps,
        FeeSplits[3] calldata feeSplits
    ) external onlyOwner {
        // Not checking for total fee in bps to be 0 as the total fee can be set to 0.
        if (validIntegrators[integratorId]) {
            revert IntegratorIdAlreadyRegistered();
        }

        uint16 x = feeSplits[0].partOfTotalFeesInBps +
            feeSplits[1].partOfTotalFeesInBps +
            feeSplits[2].partOfTotalFeesInBps;

        if (x != totalFeeInBps) {
            revert TotalFeeAndPartsMismatch();
        }

        totalFeeMap[integratorId] = totalFeeInBps;
        feeSplitMap[integratorId][0] = feeSplits[0];
        feeSplitMap[integratorId][1] = feeSplits[1];
        feeSplitMap[integratorId][2] = feeSplits[2];
        validIntegrators[integratorId] = true;
        _emitRegisterFee(integratorId, totalFeeInBps, feeSplits);
    }

    /**
     * @notice Owner can update the fee config against an integratorId
     * @dev totalFeeInBps and the sum of feesplits should be exactly equal, feeSplits can have a max size of 3
     * @param integratorId id of the integrator
     * @param totalFeeInBps totalFeeInBps, the max value can be 10000
     * @param feeSplits array of FeeSplits
     */
    function updateFeeConfig(
        uint16 integratorId,
        uint16 totalFeeInBps,
        FeeSplits[3] calldata feeSplits
    ) external onlyOwner {
        if (!validIntegrators[integratorId]) {
            revert IntegratorIdNotRegistered();
        }

        uint16 x = feeSplits[0].partOfTotalFeesInBps +
            feeSplits[1].partOfTotalFeesInBps +
            feeSplits[2].partOfTotalFeesInBps;

        if (x != totalFeeInBps) {
            revert TotalFeeAndPartsMismatch();
        }

        totalFeeMap[integratorId] = totalFeeInBps;
        feeSplitMap[integratorId][0] = feeSplits[0];
        feeSplitMap[integratorId][1] = feeSplits[1];
        feeSplitMap[integratorId][2] = feeSplits[2];
        _emitUpdateFee(integratorId, totalFeeInBps, feeSplits);
    }

    /**
     * @notice Function that sends the claimed fee to the corresponding integrator config addresses
     * @dev native token address to be used to claim native token fee, if earned fee is 0, it will return
     * @param integratorId id of the integrator
     * @param tokenAddress address of the token to claim fee against
     */
    function claimFee(uint16 integratorId, address tokenAddress) external nonReentrant {
        uint256 earnedFee = earnedTokenFeeMap[integratorId][tokenAddress];
        FeeSplits[3] memory integratorFeeSplits = feeSplitMap[integratorId];
        earnedTokenFeeMap[integratorId][tokenAddress] = 0;

        if (earnedFee == 0) {
            return;
        }
        for (uint8 i = 0; i < 3; i++) {
            _calculateAndClaimFee(
                integratorId,
                earnedFee,
                integratorFeeSplits[i].partOfTotalFeesInBps,
                totalFeeMap[integratorId],
                integratorFeeSplits[i].feeTaker,
                tokenAddress
            );
        }
    }

    /**
     * @notice Function that calls the registry after verifying if the fee is correct
     * @dev userRequest amount should match the aount after deducting the fee from the input amount
     * @param _feeRequest feeRequest contains the integratorId, the input amount and the user request that is passed to socket registry
     */
    function callRegistry(FeeRequest calldata _feeRequest) external payable nonReentrant {
        if (!validIntegrators[_feeRequest.integratorId]) {
            revert IntegratorIdNotRegistered();
        }

        // Get approval and token addresses.
        (
            address approvalAddress,
            address inputTokenAddress
        ) = _getApprovalAndInputTokenAddress(_feeRequest.userRequest);

        // Calculate Amount to Send to Registry.
        uint256 amountToBridge = _getAmountForRegistry(
            _feeRequest.integratorId,
            _feeRequest.inputAmount
        );

        if (_feeRequest.userRequest.amount != amountToBridge) {
            revert FeeMisMatch();
        }

        // Call Registry
        if (inputTokenAddress == NATIVE_TOKEN_ADDRESS) {
            if (msg.value != _feeRequest.inputAmount) revert MsgValueMismatch();
            socket.outboundTransferTo{
                value: msg.value - (_feeRequest.inputAmount - amountToBridge)
            }(_feeRequest.userRequest);
        } else {
            _getUserFundsToFeeRouter(
                msg.sender,
                _feeRequest.inputAmount,
                inputTokenAddress
            );
            IERC20(inputTokenAddress).safeApprove(
                approvalAddress,
                amountToBridge
            );
            socket.outboundTransferTo{value: msg.value}(
                _feeRequest.userRequest
            );
        }

        // Update the earned fee for the token and integrator.
        _updateEarnedFee(
            _feeRequest.integratorId,
            inputTokenAddress,
            _feeRequest.inputAmount,
            amountToBridge
        );

        // Emit Bridge Event
        _emitBridgeSocket(_feeRequest, inputTokenAddress, amountToBridge);
    }

    // INTERNAL UTILITY FUNCTION ------------------------------------------------------------------------------------------------------>

    /**
     * @notice function that sends the earned fee depending on the inputs
     * @dev tokens will not be transferred to zero addresses, earned fee against an integrator id is divided into the splits configured
     * @param integratorId id of the integrator
     * @param earnedFee amount of tokens earned as fee
     * @param part part of the amount that needs to be claimed in bps
     * @param total totalfee in bps
     * @param feeTaker address that the earned fee will be sent to after calculation
     * @param tokenAddress address of the token for claiming fee
     */
    function _calculateAndClaimFee(
        uint16 integratorId,
        uint256 earnedFee,
        uint16 part,
        uint16 total,
        address feeTaker,
        address tokenAddress
    ) internal {
        if (feeTaker != address(0)) {
            uint256 amountToBeSent = (earnedFee * part) / total;
            emit ClaimFee(integratorId, tokenAddress, amountToBeSent, feeTaker);
            if (tokenAddress == NATIVE_TOKEN_ADDRESS) {
                (bool success, ) = payable(feeTaker).call{
                    value: amountToBeSent
                }("");
                if (!success) revert NativeTransferFailed();
                return;
            }
            IERC20(tokenAddress).safeTransfer(feeTaker, amountToBeSent);
        }
    }

    /**
     * @notice function that returns the approval address and the input token address
     * @dev approval address is needed to approve the bridge or middleware implementaton before calling socket registry
     * @dev input token address is needed to identify the token in which the fee is being deducted
     * @param userRequest socket registry's user request
     * @return (address, address) returns the approval address and the inputTokenAddress
     */
    function _getApprovalAndInputTokenAddress(
        ISocketRegistry.UserRequest calldata userRequest
    ) internal view returns (address, address) {
        if (userRequest.middlewareRequest.id == 0) {
            (address routeAddress, , ) = socket.routes(
                userRequest.bridgeRequest.id
            );
            return (routeAddress, userRequest.bridgeRequest.inputToken);
        } else {
            (address routeAddress, , ) = socket.routes(
                userRequest.middlewareRequest.id
            );
            return (routeAddress, userRequest.middlewareRequest.inputToken);
        }
    }

    /**
     * @notice function that transfers amount from the user to this contract.
     * @param user address of the user who holds the tokens
     * @param amount amount of tokens to transfer
     * @param tokenAddress address of the token being bridged
     */
    function _getUserFundsToFeeRouter(
        address user,
        uint256 amount,
        address tokenAddress
    ) internal {
        IERC20(tokenAddress).safeTransferFrom(user, address(this), amount);
    }

    /**
     * @notice function that returns an amount after deducting the fee
     * @param integratorId id of the integrator
     * @param amount input amount to this contract when calling the function callRegistry
     * @return uint256 returns the amount after deduciting the fee
     */
    function _getAmountForRegistry(uint16 integratorId, uint256 amount)
        internal
        view
        returns (uint256)
    {
        return amount - ((amount * totalFeeMap[integratorId]) / PRECISION);
    }

    /**
     * @notice function that updated the earned fee against the integrator Id
     * @param integratorId id of the integrator
     * @param inputTokenAddress address of the token being bridged
     * @param amount input amount to this contract when calling the function callRegistry
     * @param registryAmount amount in user request that is passed on to registry
     */
    function _updateEarnedFee(
        uint16 integratorId,
        address inputTokenAddress,
        uint256 amount,
        uint256 registryAmount
    ) internal {
        earnedTokenFeeMap[integratorId][inputTokenAddress] =
            earnedTokenFeeMap[integratorId][inputTokenAddress] +
            amount -
            registryAmount;
    }

    /**
     * @notice function that emits the event BridgeSocket
     */
    function _emitBridgeSocket(
        FeeRequest calldata _feeRequest,
        address tokenAddress,
        uint256 registryAmount
    ) internal {
        emit BridgeSocket(
            _feeRequest.integratorId,
            _feeRequest.inputAmount,
            tokenAddress,
            _feeRequest.userRequest.toChainId,
            _feeRequest.userRequest.middlewareRequest.id,
            _feeRequest.userRequest.bridgeRequest.id,
            _feeRequest.inputAmount - registryAmount
        );
    }

    /**
     * @notice function that emits the event UpdateFee
     */
    function _emitUpdateFee(
        uint16 integratorId,
        uint16 totalFeeInBps,
        FeeSplits[3] calldata feeSplits
    ) internal {
        emit UpdateFee(
            integratorId,
            totalFeeInBps,
            feeSplits[0].partOfTotalFeesInBps,
            feeSplits[1].partOfTotalFeesInBps,
            feeSplits[2].partOfTotalFeesInBps,
            feeSplits[0].feeTaker,
            feeSplits[1].feeTaker,
            feeSplits[2].feeTaker
        );
    }

    /**
     * @notice function that emits the event RegisterFee
     */
    function _emitRegisterFee(
        uint16 integratorId,
        uint16 totalFeeInBps,
        FeeSplits[3] calldata feeSplits
    ) internal {
        emit RegisterFee(
            integratorId,
            totalFeeInBps,
            feeSplits[0].partOfTotalFeesInBps,
            feeSplits[1].partOfTotalFeesInBps,
            feeSplits[2].partOfTotalFeesInBps,
            feeSplits[0].feeTaker,
            feeSplits[1].feeTaker,
            feeSplits[2].feeTaker
        );
    }

    // VIEW FUNCTIONS --------------------------------------------------------------------------------------------------------->

    /**
     * @notice function that returns the amount in earned fee
     * @param integratorId id of the integrator
     * @param tokenAddress address of the token
     * @return uin256
     */
    function getEarnedFee(uint16 integratorId, address tokenAddress)
        public
        view
        returns (uint256)
    {
        return earnedTokenFeeMap[integratorId][tokenAddress];
    }

    /**
     * @notice function that returns if the integrator id is valid or not
     * @param integratorId id of the integrator
     * @return bool
     */
    function getValidIntegrator(uint16 integratorId)
        public
        view
        returns (bool)
    {
        return validIntegrators[integratorId];
    }

    /**
     * @notice function that returns the total fee in bps registered against the integrator id
     * @param integratorId id of the integrator
     * @return uint16
     */
    function getTotalFeeInBps(uint16 integratorId)
        public
        view
        returns (uint16)
    {
        return totalFeeMap[integratorId];
    }

    /**
     * @notice function that returns the FeeSplit array registered agains the integrator id
     * @param integratorId id of the integrator
     * @return feeSplits FeeSplits[3] - array of FeeSplits of size 3
     */
    function getFeeSplits(uint16 integratorId)
        public
        view
        returns (FeeSplits[3] memory feeSplits)
    {
        return feeSplitMap[integratorId];
    }

    // RESCUE FUNCTIONS ------------------------------------------------------------------------------------------------------>

    /**
     * @notice rescue function for emeregencies
     * @dev can only be called by the owner, should only be called during emergencies only
     * @param userAddress address of the user receiving funds
     * @param token address of the token being rescued
     * @param amount amount to be sent to the user
     */
    function rescueFunds(
        address token,
        address userAddress,
        uint256 amount
    ) external onlyOwner {
        IERC20(token).safeTransfer(userAddress, amount);
    }

    /**
     * @notice rescue function for emeregencies
     * @dev can only be called by the owner, should only be called during emergencies only
     * @param userAddress address of the user receiving funds
     * @param amount amount to be sent to the user
     */
    function rescueNative(address payable userAddress, uint256 amount)
        external
        onlyOwner
    {
        userAddress.transfer(amount);
    }
}

File 2 of 8 : ISocketRegistry.sol
pragma solidity ^0.8.4;

abstract contract ISocketRegistry {
    /**
     * @notice Container for Bridge Request
     * @member id denotes the underlying bridge to be used
     * @member optionalNativeAmount native token amount if not to be included in the value.
     * @member inputToken token being bridged
     * @member data this can be decoded to get extra data needed for different bridges
     */
    struct BridgeRequest {
        uint256 id;
        uint256 optionalNativeAmount;
        address inputToken;
        bytes data;
    }


    /**
     * @notice Container for Middleware Request
     * @member id denotes the underlying middleware to be used
     * @member optionalNativeAmount native token amount if not to be included in the value.
     * @member inputToken token being sent to middleware, for example swaps
     * @member data this can be decoded to get extra data needed for different middlewares
     */
    struct MiddlewareRequest {
        uint256 id;
        uint256 optionalNativeAmount;
        address inputToken;
        bytes data;
    }


    /**
     * @notice Container for User Request
     * @member receiverAddress address of the user receiving the bridged amount
     * @member toChainId id of the chain being bridged to
     * @member amount amount being bridged through registry
     * @member middlewareRequest 
     * @member bridgeRequest 
     */
    struct UserRequest {
        address receiverAddress;
        uint256 toChainId;
        uint256 amount;
        MiddlewareRequest middlewareRequest;
        BridgeRequest bridgeRequest;
    }

    /**
     * @notice Container for Route Data
     * @dev middlwares and bridges are both added into the same routes
     * @member route address of the implementation contract fo a bride or middleware
     * @member isEnabled bool variable that denotes if the particular route is enabled or disabled
     * @member isMiddleware bool variable that denotes if the particular route is a middleware or not
     */
    struct RouteData {
        address route;
        bool isEnabled;
        bool isMiddleware;
    }

    /**
     * @notice Resgistered Routes on the socket registry
     * @dev middlwares and bridges are both added into the same routes
     */
    RouteData[] public routes;

    /**
     * @notice Function called in the socket registry for bridging
     */
    function outboundTransferTo(UserRequest calldata _userRequest)
        external
        payable
        virtual;
}

File 3 of 8 : Ownable.sol
// SPDX-License-Identifier: GPL-3.0-only
pragma solidity ^0.8.4;

abstract contract Ownable {
    address private _owner;
    address private _nominee;

    event OwnerNominated(address indexed nominee);
    event OwnerClaimed(address indexed claimer);

    error OnlyOwner();
    error OnlyNominee();

    constructor(address owner_) {
        _claimOwner(owner_);
    }

    modifier onlyOwner() {
        if (msg.sender != _owner) {
            revert OnlyOwner();
        }
        _;
    }

    function owner() public view returns (address) {
        return _owner;
    }

    function nominee() public view returns (address) {
        return _nominee;
    }

    function nominateOwner(address nominee_) external {
        if (msg.sender != _owner) {
            revert OnlyOwner();
        }
        _nominee = nominee_;
        emit OwnerNominated(_nominee);
    }

    function claimOwner() external {
        if (msg.sender != _nominee) {
            revert OnlyNominee();
        }
        _claimOwner(msg.sender);
    }

    function _claimOwner(address claimer_) internal {
        _owner = claimer_;
        _nominee = address(0);
    }
}

File 4 of 8 : ReentrancyGuard.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (security/ReentrancyGuard.sol)

pragma solidity ^0.8.0;

/**
 * @dev Contract module that helps prevent reentrant calls to a function.
 *
 * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier
 * available, which can be applied to functions to make sure there are no nested
 * (reentrant) calls to them.
 *
 * Note that because there is a single `nonReentrant` guard, functions marked as
 * `nonReentrant` may not call one another. This can be worked around by making
 * those functions `private`, and then adding `external` `nonReentrant` entry
 * points to them.
 *
 * TIP: If you would like to learn more about reentrancy and alternative ways
 * to protect against it, check out our blog post
 * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul].
 */
abstract contract ReentrancyGuard {
    // Booleans are more expensive than uint256 or any type that takes up a full
    // word because each write operation emits an extra SLOAD to first read the
    // slot's contents, replace the bits taken up by the boolean, and then write
    // back. This is the compiler's defense against contract upgrades and
    // pointer aliasing, and it cannot be disabled.

    // The values being non-zero value makes deployment a bit more expensive,
    // but in exchange the refund on every call to nonReentrant will be lower in
    // amount. Since refunds are capped to a percentage of the total
    // transaction's gas, it is best to keep them low in cases like this one, to
    // increase the likelihood of the full refund coming into effect.
    uint256 private constant _NOT_ENTERED = 1;
    uint256 private constant _ENTERED = 2;

    uint256 private _status;

    constructor() {
        _status = _NOT_ENTERED;
    }

    /**
     * @dev Prevents a contract from calling itself, directly or indirectly.
     * Calling a `nonReentrant` function from another `nonReentrant`
     * function is not supported. It is possible to prevent this from happening
     * by making the `nonReentrant` function external, and making it call a
     * `private` function that does the actual work.
     */
    modifier nonReentrant() {
        _nonReentrantBefore();
        _;
        _nonReentrantAfter();
    }

    function _nonReentrantBefore() private {
        // On the first call to nonReentrant, _notEntered will be true
        require(_status != _ENTERED, "ReentrancyGuard: reentrant call");

        // Any calls to nonReentrant after this point will fail
        _status = _ENTERED;
    }

    function _nonReentrantAfter() private {
        // By storing the original value once again, a refund is triggered (see
        // https://eips.ethereum.org/EIPS/eip-2200)
        _status = _NOT_ENTERED;
    }
}

File 5 of 8 : SafeERC20.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.7.0) (token/ERC20/utils/SafeERC20.sol)

pragma solidity ^0.8.0;

import "../IERC20.sol";
import "../extensions/draft-IERC20Permit.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));
        }
    }

    function safePermit(
        IERC20Permit token,
        address owner,
        address spender,
        uint256 value,
        uint256 deadline,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) internal {
        uint256 nonceBefore = token.nonces(owner);
        token.permit(owner, spender, value, deadline, v, r, s);
        uint256 nonceAfter = token.nonces(owner);
        require(nonceAfter == nonceBefore + 1, "SafeERC20: permit did not succeed");
    }

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

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

File 6 of 8 : IERC20.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.6.0) (token/ERC20/IERC20.sol)

pragma solidity ^0.8.0;

/**
 * @dev Interface of the ERC20 standard as defined in the EIP.
 */
interface IERC20 {
    /**
     * @dev Emitted when `value` tokens are moved from one account (`from`) to
     * another (`to`).
     *
     * Note that `value` may be zero.
     */
    event Transfer(address indexed from, address indexed to, uint256 value);

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

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

File 7 of 8 : Address.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.7.0) (utils/Address.sol)

pragma solidity ^0.8.1;

/**
 * @dev Collection of functions related to the address type
 */
library Address {
    /**
     * @dev Returns true if `account` is a contract.
     *
     * [IMPORTANT]
     * ====
     * It is unsafe to assume that an address for which this function returns
     * false is an externally-owned account (EOA) and not a contract.
     *
     * Among others, `isContract` will return false for the following
     * types of addresses:
     *
     *  - an externally-owned account
     *  - a contract in construction
     *  - an address where a contract will be created
     *  - an address where a contract lived, but was destroyed
     * ====
     *
     * [IMPORTANT]
     * ====
     * You shouldn't rely on `isContract` to protect against flash loan attacks!
     *
     * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets
     * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract
     * constructor.
     * ====
     */
    function isContract(address account) internal view returns (bool) {
        // This method relies on extcodesize/address.code.length, which returns 0
        // for contracts in construction, since the code is only stored at the end
        // of the constructor execution.

        return account.code.length > 0;
    }

    /**
     * @dev Replacement for Solidity's `transfer`: sends `amount` wei to
     * `recipient`, forwarding all available gas and reverting on errors.
     *
     * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost
     * of certain opcodes, possibly making contracts go over the 2300 gas limit
     * imposed by `transfer`, making them unable to receive funds via
     * `transfer`. {sendValue} removes this limitation.
     *
     * https://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 functionCallWithValue(target, data, 0, "Address: low-level call failed");
    }

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

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

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

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

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
     * but performing a static call.
     *
     * _Available since v3.3._
     */
    function functionStaticCall(
        address target,
        bytes memory data,
        string memory errorMessage
    ) internal view returns (bytes memory) {
        (bool success, bytes memory returndata) = target.staticcall(data);
        return verifyCallResultFromTarget(target, success, returndata, errorMessage);
    }

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

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
     * but performing a delegate call.
     *
     * _Available since v3.4._
     */
    function functionDelegateCall(
        address target,
        bytes memory data,
        string memory errorMessage
    ) internal returns (bytes memory) {
        (bool success, bytes memory returndata) = target.delegatecall(data);
        return verifyCallResultFromTarget(target, success, returndata, errorMessage);
    }

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

    /**
     * @dev Tool to verify that a low level call was successful, and revert if it wasn't, either by bubbling the
     * revert reason or using the provided one.
     *
     * _Available since v4.3._
     */
    function verifyCallResult(
        bool success,
        bytes memory returndata,
        string memory errorMessage
    ) internal pure returns (bytes memory) {
        if (success) {
            return returndata;
        } else {
            _revert(returndata, errorMessage);
        }
    }

    function _revert(bytes memory returndata, string memory errorMessage) private pure {
        // Look for revert reason and bubble it up if present
        if (returndata.length > 0) {
            // The easiest way to bubble the revert reason is using memory via assembly
            /// @solidity memory-safe-assembly
            assembly {
                let returndata_size := mload(returndata)
                revert(add(32, returndata), returndata_size)
            }
        } else {
            revert(errorMessage);
        }
    }
}

File 8 of 8 : draft-IERC20Permit.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (token/ERC20/extensions/draft-IERC20Permit.sol)

pragma solidity ^0.8.0;

/**
 * @dev Interface of the ERC20 Permit extension allowing approvals to be made via signatures, as defined in
 * https://eips.ethereum.org/EIPS/eip-2612[EIP-2612].
 *
 * Adds the {permit} method, which can be used to change an account's ERC20 allowance (see {IERC20-allowance}) by
 * presenting a message signed by the account. By not relying on {IERC20-approve}, the token holder account doesn't
 * need to send a transaction, and thus is not required to hold Ether at all.
 */
interface IERC20Permit {
    /**
     * @dev Sets `value` as the allowance of `spender` over ``owner``'s tokens,
     * given ``owner``'s signed approval.
     *
     * IMPORTANT: The same issues {IERC20-approve} has related to transaction
     * ordering also apply here.
     *
     * Emits an {Approval} event.
     *
     * Requirements:
     *
     * - `spender` cannot be the zero address.
     * - `deadline` must be a timestamp in the future.
     * - `v`, `r` and `s` must be a valid `secp256k1` signature from `owner`
     * over the EIP712-formatted function arguments.
     * - the signature must use ``owner``'s current nonce (see {nonces}).
     *
     * For more information on the signature format, see the
     * https://eips.ethereum.org/EIPS/eip-2612#specification[relevant EIP
     * section].
     */
    function permit(
        address owner,
        address spender,
        uint256 value,
        uint256 deadline,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) external;

    /**
     * @dev Returns the current nonce for `owner`. This value must be
     * included whenever a signature is generated for {permit}.
     *
     * Every successful call to {permit} increases ``owner``'s nonce by one. This
     * prevents a signature from being used multiple times.
     */
    function nonces(address owner) external view returns (uint256);

    /**
     * @dev Returns the domain separator used in the encoding of the signature for {permit}, as defined by {EIP712}.
     */
    // solhint-disable-next-line func-name-mixedcase
    function DOMAIN_SEPARATOR() external view returns (bytes32);
}

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

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"address","name":"_socketRegistry","type":"address"},{"internalType":"address","name":"owner_","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"FeeMisMatch","type":"error"},{"inputs":[],"name":"IntegratorIdAlreadyRegistered","type":"error"},{"inputs":[],"name":"IntegratorIdNotRegistered","type":"error"},{"inputs":[],"name":"MsgValueMismatch","type":"error"},{"inputs":[],"name":"NativeTransferFailed","type":"error"},{"inputs":[],"name":"OnlyNominee","type":"error"},{"inputs":[],"name":"OnlyOwner","type":"error"},{"inputs":[],"name":"TotalFeeAndPartsMismatch","type":"error"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint16","name":"integratorId","type":"uint16"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"address","name":"inputTokenAddress","type":"address"},{"indexed":false,"internalType":"uint256","name":"toChainId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"middlewareId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"bridgeId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"totalFee","type":"uint256"}],"name":"BridgeSocket","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint16","name":"integratorId","type":"uint16"},{"indexed":false,"internalType":"address","name":"tokenAddress","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"address","name":"feeTaker","type":"address"}],"name":"ClaimFee","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"claimer","type":"address"}],"name":"OwnerClaimed","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"nominee","type":"address"}],"name":"OwnerNominated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint16","name":"integratorId","type":"uint16"},{"indexed":false,"internalType":"uint16","name":"totalFeeInBps","type":"uint16"},{"indexed":false,"internalType":"uint16","name":"part1","type":"uint16"},{"indexed":false,"internalType":"uint16","name":"part2","type":"uint16"},{"indexed":false,"internalType":"uint16","name":"part3","type":"uint16"},{"indexed":false,"internalType":"address","name":"feeTaker1","type":"address"},{"indexed":false,"internalType":"address","name":"feeTaker2","type":"address"},{"indexed":false,"internalType":"address","name":"feeTaker3","type":"address"}],"name":"RegisterFee","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint16","name":"integratorId","type":"uint16"},{"indexed":false,"internalType":"uint16","name":"totalFeeInBps","type":"uint16"},{"indexed":false,"internalType":"uint16","name":"part1","type":"uint16"},{"indexed":false,"internalType":"uint16","name":"part2","type":"uint16"},{"indexed":false,"internalType":"uint16","name":"part3","type":"uint16"},{"indexed":false,"internalType":"address","name":"feeTaker1","type":"address"},{"indexed":false,"internalType":"address","name":"feeTaker2","type":"address"},{"indexed":false,"internalType":"address","name":"feeTaker3","type":"address"}],"name":"UpdateFee","type":"event"},{"inputs":[{"components":[{"internalType":"uint16","name":"integratorId","type":"uint16"},{"internalType":"uint256","name":"inputAmount","type":"uint256"},{"components":[{"internalType":"address","name":"receiverAddress","type":"address"},{"internalType":"uint256","name":"toChainId","type":"uint256"},{"internalType":"uint256","name":"amount","type":"uint256"},{"components":[{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"uint256","name":"optionalNativeAmount","type":"uint256"},{"internalType":"address","name":"inputToken","type":"address"},{"internalType":"bytes","name":"data","type":"bytes"}],"internalType":"struct ISocketRegistry.MiddlewareRequest","name":"middlewareRequest","type":"tuple"},{"components":[{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"uint256","name":"optionalNativeAmount","type":"uint256"},{"internalType":"address","name":"inputToken","type":"address"},{"internalType":"bytes","name":"data","type":"bytes"}],"internalType":"struct ISocketRegistry.BridgeRequest","name":"bridgeRequest","type":"tuple"}],"internalType":"struct ISocketRegistry.UserRequest","name":"userRequest","type":"tuple"}],"internalType":"struct FeeRouter.FeeRequest","name":"_feeRequest","type":"tuple"}],"name":"callRegistry","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint16","name":"integratorId","type":"uint16"},{"internalType":"address","name":"tokenAddress","type":"address"}],"name":"claimFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"claimOwner","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16","name":"integratorId","type":"uint16"},{"internalType":"address","name":"tokenAddress","type":"address"}],"name":"getEarnedFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint16","name":"integratorId","type":"uint16"}],"name":"getFeeSplits","outputs":[{"components":[{"internalType":"address","name":"feeTaker","type":"address"},{"internalType":"uint16","name":"partOfTotalFeesInBps","type":"uint16"}],"internalType":"struct FeeRouter.FeeSplits[3]","name":"feeSplits","type":"tuple[3]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint16","name":"integratorId","type":"uint16"}],"name":"getTotalFeeInBps","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint16","name":"integratorId","type":"uint16"}],"name":"getValidIntegrator","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"nominee_","type":"address"}],"name":"nominateOwner","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"nominee","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint16","name":"integratorId","type":"uint16"},{"internalType":"uint16","name":"totalFeeInBps","type":"uint16"},{"components":[{"internalType":"address","name":"feeTaker","type":"address"},{"internalType":"uint16","name":"partOfTotalFeesInBps","type":"uint16"}],"internalType":"struct FeeRouter.FeeSplits[3]","name":"feeSplits","type":"tuple[3]"}],"name":"registerFeeConfig","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"address","name":"userAddress","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"rescueFunds","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address payable","name":"userAddress","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"rescueNative","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"socket","outputs":[{"internalType":"contract ISocketRegistry","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint16","name":"integratorId","type":"uint16"},{"internalType":"uint16","name":"totalFeeInBps","type":"uint16"},{"components":[{"internalType":"address","name":"feeTaker","type":"address"},{"internalType":"uint16","name":"partOfTotalFeesInBps","type":"uint16"}],"internalType":"struct FeeRouter.FeeSplits[3]","name":"feeSplits","type":"tuple[3]"}],"name":"updateFeeConfig","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]

60c0604052613d0960e61b60a0523480156200001a57600080fd5b506040516200250e3803806200250e8339810160408190526200003d916200009d565b600080546001600160a01b03199081166001600160a01b0384161790915560018054909116905550600160025560601b6001600160601b031916608052620000d5565b80516001600160a01b03811681146200009857600080fd5b919050565b60008060408385031215620000b157600080fd5b620000bc8362000080565b9150620000cc6020840162000080565b90509250929050565b60805160601c60a05160e01c6123f16200011d60003960006115590152600081816101c101528181610d9701528181610e7b0152818161136f015261146f01526123f16000f3fe6080604052600436106100ec5760003560e01c80635b94db271161008a5780638da5cb5b116100595780638da5cb5b146102ec578063ad3bd95d14610317578063afe315ee14610337578063c94288a21461039b57600080fd5b80635b94db27146102455780636ccae0541461026557806377001f83146102855780637d6167e8146102a557600080fd5b806322c8f6cd116100c657806322c8f6cd146101af5780632a4f1fbb146101e357806331efdc96146102035780633bd1adec1461023057600080fd5b8063050e56ea146100f85780631291f79d1461014157806320f99c0a1461016357600080fd5b366100f357005b600080fd5b34801561010457600080fd5b5061012c610113366004611da8565b61ffff1660009081526003602052604090205460ff1690565b60405190151581526020015b60405180910390f35b34801561014d57600080fd5b5061016161015c366004611ca0565b6103ae565b005b34801561016f57600080fd5b5060015473ffffffffffffffffffffffffffffffffffffffff165b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610138565b3480156101bb57600080fd5b5061018a7f000000000000000000000000000000000000000000000000000000000000000081565b3480156101ef57600080fd5b506101616101fe366004611dc5565b610447565b34801561020f57600080fd5b5061022361021e366004611da8565b6105db565b6040516101389190611f70565b34801561023c57600080fd5b50610161610675565b34801561025157600080fd5b50610161610260366004611c83565b6106fe565b34801561027157600080fd5b50610161610280366004611ccc565b6107be565b34801561029157600080fd5b506101616102a0366004611dfe565b610830565b3480156102b157600080fd5b506102d96102c0366004611da8565b61ffff9081166000908152600460205260409020541690565b60405161ffff9091168152602001610138565b3480156102f857600080fd5b5060005473ffffffffffffffffffffffffffffffffffffffff1661018a565b34801561032357600080fd5b50610161610332366004611dfe565b610a4c565b34801561034357600080fd5b5061038d610352366004611dc5565b61ffff8216600090815260066020908152604080832073ffffffffffffffffffffffffffffffffffffffff8516845290915290205492915050565b604051908152602001610138565b6101616103a9366004611d6d565b610c26565b60005473ffffffffffffffffffffffffffffffffffffffff1633146103ff576040517f5fc483c500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60405173ffffffffffffffffffffffffffffffffffffffff83169082156108fc029083906000818181858888f19350505050158015610442573d6000803e3d6000fd5b505050565b61044f610f34565b61ffff8216600081815260066020908152604080832073ffffffffffffffffffffffffffffffffffffffff861684528252808320549383526005909152808220815160608101909252600383835b8282101561050057604080518082019091528483015473ffffffffffffffffffffffffffffffffffffffff8116825274010000000000000000000000000000000000000000900461ffff166020808301919091529082526001909201910161049d565b50505061ffff8616600090815260066020908152604080832073ffffffffffffffffffffffffffffffffffffffff89168452909152812055509050816105475750506105cd565b60005b60038160ff1610156105c9576105b78584848460ff1660038110610570576105706122b4565b6020908102919091015181015161ffff808b16600090815260049093526040909220549091168660ff8716600381106105ab576105ab6122b4565b60200201515189610fab565b806105c181612265565b91505061054a565b5050505b6105d76001600255565b5050565b6105e3611c35565b61ffff82166000908152600560205260408082208151606081019092529091600390835b8282101561066a57604080518082019091528483015473ffffffffffffffffffffffffffffffffffffffff8116825274010000000000000000000000000000000000000000900461ffff1660208083019190915290825260019092019101610607565b505050509050919050565b60015473ffffffffffffffffffffffffffffffffffffffff1633146106c6576040517f7c91ccdd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600080547fffffffffffffffffffffffff00000000000000000000000000000000000000009081163317909155600180549091169055565b60005473ffffffffffffffffffffffffffffffffffffffff16331461074f576040517f5fc483c500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83169081179091556040517f906a1c6bd7e3091ea86693dd029a831c19049ce77f1dce2ce0bab1cacbabce2290600090a250565b60005473ffffffffffffffffffffffffffffffffffffffff16331461080f576040517f5fc483c500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61044273ffffffffffffffffffffffffffffffffffffffff8416838361114c565b60005473ffffffffffffffffffffffffffffffffffffffff163314610881576040517f5fc483c500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61ffff831660009081526003602052604090205460ff16156108cf576040517f5771642500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60006108e160c0830160a08401611da8565b6108f16080840160608501611da8565b6109016040850160208601611da8565b61090b919061216c565b610915919061216c565b90508261ffff168161ffff1614610958576040517f2ea1270e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61ffff848116600090815260046020908152604080832080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00001694881694909417909355600590522082906109ae82826122e3565b505061ffff841660009081526005602052604090819020908301906001016109d682826122e3565b505061ffff8416600090815260056020526040902060808301906002016109fd82826122e3565b505061ffff8416600090815260036020526040902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055610a46848484611220565b50505050565b60005473ffffffffffffffffffffffffffffffffffffffff163314610a9d576040517f5fc483c500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61ffff831660009081526003602052604090205460ff16610aea576040517f2849ec2300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000610afc60c0830160a08401611da8565b610b0c6080840160608501611da8565b610b1c6040850160208601611da8565b610b26919061216c565b610b30919061216c565b90508261ffff168161ffff1614610b73576040517f2ea1270e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61ffff848116600090815260046020908152604080832080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000169488169490941790935560059052208290610bc982826122e3565b505061ffff84166000908152600560205260409081902090830190600101610bf182826122e3565b505061ffff841660009081526005602052604090206080830190600201610c1882826122e3565b905050610a46848484611316565b610c2e610f34565b60036000610c3f6020840184611da8565b61ffff16815260208101919091526040016000205460ff16610c8d576040517f2849ec2300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600080610ca5610ca060408501856120fb565b611341565b90925090506000610cc6610cbc6020860186611da8565b856020013561153b565b905080610cd660408601866120fb565b6040013514610d11576040517f3b05b64a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff821673eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee1415610e345783602001353414610d80576040517fbc6f88c500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001663a44bbb15610dca836020880135612222565b610dd49034612222565b610de160408801886120fb565b6040518363ffffffff1660e01b8152600401610dfd9190612018565b6000604051808303818588803b158015610e1657600080fd5b505af1158015610e2a573d6000803e3d6000fd5b5050505050610efd565b610e43338560200135846115a0565b610e6473ffffffffffffffffffffffffffffffffffffffff831684836115c2565b73ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001663a44bbb1534610eae60408801886120fb565b6040518363ffffffff1660e01b8152600401610eca9190612018565b6000604051808303818588803b158015610ee357600080fd5b505af1158015610ef7573d6000803e3d6000fd5b50505050505b610f19610f0d6020860186611da8565b83866020013584611753565b610f248483836117df565b505050610f316001600255565b50565b600280541415610fa5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c0060448201526064015b60405180910390fd5b60028055565b73ffffffffffffffffffffffffffffffffffffffff8216156111445760008361ffff168561ffff1687610fde91906121e5565b610fe891906121aa565b6040805161ffff8a16815273ffffffffffffffffffffffffffffffffffffffff808616602083015291810183905290851660608201529091507f2ca7e603774a345d2661009d097610daffb2d91a47e69541066ddfe9221c51e89060800160405180910390a173ffffffffffffffffffffffffffffffffffffffff821673eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee14156111215760008373ffffffffffffffffffffffffffffffffffffffff168260405160006040518083038185875af1925050503d80600081146110da576040519150601f19603f3d011682016040523d82523d6000602084013e6110df565b606091505b505090508061111a576040517ff4b3b1bc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5050611144565b61114273ffffffffffffffffffffffffffffffffffffffff8316848361114c565b505b505050505050565b60405173ffffffffffffffffffffffffffffffffffffffff83166024820152604481018290526104429084907fa9059cbb00000000000000000000000000000000000000000000000000000000906064015b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff00000000000000000000000000000000000000000000000000000000909316929092179091526118bf565b7f6f8233416969476afceb725c919fe424faf367ed0a76e020fdf53369c4f1da9583838360005b60400201602001602081019061125d9190611da8565b61126d6080860160608701611da8565b61127d60c0870160a08801611da8565b61128a6020880188611c83565b61129a6060890160408a01611c83565b6112aa60a08a0160808b01611c83565b6040805161ffff998a16815297891660208901529588169587019590955292861660608601529416608084015273ffffffffffffffffffffffffffffffffffffffff93841660a0840152831660c08301529190911660e0820152610100015b60405180910390a1505050565b7fe6099dd217e540f806797781b59e4e804f78bc18220943c78d4ea9b68316e27c8383836000611247565b60008061135160608401846120c7565b3561145657600073ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001663726f16d86113a160808701876120c7565b60405160e083901b7fffffffff000000000000000000000000000000000000000000000000000000001681529035600482015260240160606040518083038186803b1580156113ef57600080fd5b505afa158015611403573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114279190611d0d565b5090915081905061143b60808601866120c7565b61144c906060810190604001611c83565b9250925050915091565b600073ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001663726f16d86114a160608701876120c7565b60405160e083901b7fffffffff000000000000000000000000000000000000000000000000000000001681529035600482015260240160606040518083038186803b1580156114ef57600080fd5b505afa158015611503573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115279190611d0d565b5090915081905061143b60608601866120c7565b61ffff808316600090815260046020526040812054909163ffffffff7f000000000000000000000000000000000000000000000000000000000000000016916115859116846121e5565b61158f91906121aa565b6115999083612222565b9392505050565b61044273ffffffffffffffffffffffffffffffffffffffff82168430856119cb565b80158061167157506040517fdd62ed3e00000000000000000000000000000000000000000000000000000000815230600482015273ffffffffffffffffffffffffffffffffffffffff838116602483015284169063dd62ed3e9060440160206040518083038186803b15801561163757600080fd5b505afa15801561164b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061166f9190611e4f565b155b6116fd576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603660248201527f5361666545524332303a20617070726f76652066726f6d206e6f6e2d7a65726f60448201527f20746f206e6f6e2d7a65726f20616c6c6f77616e6365000000000000000000006064820152608401610f9c565b60405173ffffffffffffffffffffffffffffffffffffffff83166024820152604481018290526104429084907f095ea7b3000000000000000000000000000000000000000000000000000000009060640161119e565b61ffff8416600090815260066020908152604080832073ffffffffffffffffffffffffffffffffffffffff871684529091529020548190611795908490612192565b61179f9190612222565b61ffff909416600090815260066020908152604080832073ffffffffffffffffffffffffffffffffffffffff909616835294905292909220929092555050565b7f0881410a322342e6e09eb472c7ab91907d7a31436d5816b8f349c30518c9dc9761180d6020850185611da8565b60208501358461182060408801886120fb565b6020013561183160408901896120fb565b61183f9060608101906120c7565b3561184d60408a018a6120fb565b61185b9060808101906120c7565b3561186a8860208c0135612222565b6040805161ffff9098168852602088019690965273ffffffffffffffffffffffffffffffffffffffff909416948601949094526060850191909152608084015260a083019190915260c082015260e001611309565b6000611921826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff16611a299092919063ffffffff16565b805190915015610442578080602001905181019061193f9190611d52565b610442576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f742073756363656564000000000000000000000000000000000000000000006064820152608401610f9c565b60405173ffffffffffffffffffffffffffffffffffffffff80851660248301528316604482015260648101829052610a469085907f23b872dd000000000000000000000000000000000000000000000000000000009060840161119e565b6060611a388484600085611a40565b949350505050565b606082471015611ad2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f60448201527f722063616c6c00000000000000000000000000000000000000000000000000006064820152608401610f9c565b6000808673ffffffffffffffffffffffffffffffffffffffff168587604051611afb9190611f54565b60006040518083038185875af1925050503d8060008114611b38576040519150601f19603f3d011682016040523d82523d6000602084013e611b3d565b606091505b5091509150611b4e87838387611b59565b979650505050505050565b60608315611bec578251611be55773ffffffffffffffffffffffffffffffffffffffff85163b611be5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610f9c565b5081611a38565b611a388383815115611c015781518083602001fd5b806040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f9c9190611fc7565b60405180606001604052806003905b6040805180820190915260008082526020820152815260200190600190039081611c445790505090565b80518015158114611c7e57600080fd5b919050565b600060208284031215611c9557600080fd5b813561159981612389565b60008060408385031215611cb357600080fd5b8235611cbe81612389565b946020939093013593505050565b600080600060608486031215611ce157600080fd5b8335611cec81612389565b92506020840135611cfc81612389565b929592945050506040919091013590565b600080600060608486031215611d2257600080fd5b8351611d2d81612389565b9250611d3b60208501611c6e565b9150611d4960408501611c6e565b90509250925092565b600060208284031215611d6457600080fd5b61159982611c6e565b600060208284031215611d7f57600080fd5b813567ffffffffffffffff811115611d9657600080fd5b82016060818503121561159957600080fd5b600060208284031215611dba57600080fd5b8135611599816123ab565b60008060408385031215611dd857600080fd5b8235611de3816123ab565b91506020830135611df381612389565b809150509250929050565b6000806000610100808587031215611e1557600080fd5b8435611e20816123ab565b93506020850135611e30816123ab565b9250848101861015611e4157600080fd5b506040840190509250925092565b600060208284031215611e6157600080fd5b5051919050565b803582526020810135602083015260006040820135611e8681612389565b73ffffffffffffffffffffffffffffffffffffffff1660408401526060820135368390037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1018112611ed757600080fd5b8201803567ffffffffffffffff811115611ef057600080fd5b803603841315611eff57600080fd5b60806060860152806080860152806020830160a0870137600060a0828701015260a07fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8301168601019250505092915050565b60008251611f66818460208701612239565b9190910192915050565b60c08101818360005b6003811015611fbe578151805173ffffffffffffffffffffffffffffffffffffffff16845260209081015161ffff168185015260409093019290910190600101611f79565b50505092915050565b6020815260008251806020840152611fe6816040850160208701612239565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169190910160400192915050565b602081526000823561202981612389565b73ffffffffffffffffffffffffffffffffffffffff81166020840152506020830135604083015260408301356060830152612067606084018461212f565b60a0608084015261207b60c0840182611e68565b905061208a608085018561212f565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08483030160a08501526120be8282611e68565b95945050505050565b600082357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81833603018112611f6657600080fd5b600082357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff61833603018112611f6657600080fd5b600082357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8183360301811261216357600080fd5b90910192915050565b600061ffff80831681851680830382111561218957612189612285565b01949350505050565b600082198211156121a5576121a5612285565b500190565b6000826121e0577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b500490565b6000817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561221d5761221d612285565b500290565b60008282101561223457612234612285565b500390565b60005b8381101561225457818101518382015260200161223c565b83811115610a465750506000910152565b600060ff821660ff81141561227c5761227c612285565b60010192915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b81356122ee81612389565b73ffffffffffffffffffffffffffffffffffffffff811690508154817fffffffffffffffffffffffff00000000000000000000000000000000000000008216178355602084013561233e816123ab565b75ffff00000000000000000000000000000000000000008160a01b16837fffffffffffffffffffff000000000000000000000000000000000000000000008416171784555050505050565b73ffffffffffffffffffffffffffffffffffffffff81168114610f3157600080fd5b61ffff81168114610f3157600080fdfea2646970667358221220bb31059d7cb4c0283df9324939a67a9a88e9ff819c1b04e31a147b688714dc3464736f6c63430008070033000000000000000000000000c30141b657f4216252dc59af2e7cdb9d8792e1b00000000000000000000000005fd7d0d6b91cc4787bcb86ca47e0bd4ea0346d34

Deployed Bytecode

0x6080604052600436106100ec5760003560e01c80635b94db271161008a5780638da5cb5b116100595780638da5cb5b146102ec578063ad3bd95d14610317578063afe315ee14610337578063c94288a21461039b57600080fd5b80635b94db27146102455780636ccae0541461026557806377001f83146102855780637d6167e8146102a557600080fd5b806322c8f6cd116100c657806322c8f6cd146101af5780632a4f1fbb146101e357806331efdc96146102035780633bd1adec1461023057600080fd5b8063050e56ea146100f85780631291f79d1461014157806320f99c0a1461016357600080fd5b366100f357005b600080fd5b34801561010457600080fd5b5061012c610113366004611da8565b61ffff1660009081526003602052604090205460ff1690565b60405190151581526020015b60405180910390f35b34801561014d57600080fd5b5061016161015c366004611ca0565b6103ae565b005b34801561016f57600080fd5b5060015473ffffffffffffffffffffffffffffffffffffffff165b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610138565b3480156101bb57600080fd5b5061018a7f000000000000000000000000c30141b657f4216252dc59af2e7cdb9d8792e1b081565b3480156101ef57600080fd5b506101616101fe366004611dc5565b610447565b34801561020f57600080fd5b5061022361021e366004611da8565b6105db565b6040516101389190611f70565b34801561023c57600080fd5b50610161610675565b34801561025157600080fd5b50610161610260366004611c83565b6106fe565b34801561027157600080fd5b50610161610280366004611ccc565b6107be565b34801561029157600080fd5b506101616102a0366004611dfe565b610830565b3480156102b157600080fd5b506102d96102c0366004611da8565b61ffff9081166000908152600460205260409020541690565b60405161ffff9091168152602001610138565b3480156102f857600080fd5b5060005473ffffffffffffffffffffffffffffffffffffffff1661018a565b34801561032357600080fd5b50610161610332366004611dfe565b610a4c565b34801561034357600080fd5b5061038d610352366004611dc5565b61ffff8216600090815260066020908152604080832073ffffffffffffffffffffffffffffffffffffffff8516845290915290205492915050565b604051908152602001610138565b6101616103a9366004611d6d565b610c26565b60005473ffffffffffffffffffffffffffffffffffffffff1633146103ff576040517f5fc483c500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60405173ffffffffffffffffffffffffffffffffffffffff83169082156108fc029083906000818181858888f19350505050158015610442573d6000803e3d6000fd5b505050565b61044f610f34565b61ffff8216600081815260066020908152604080832073ffffffffffffffffffffffffffffffffffffffff861684528252808320549383526005909152808220815160608101909252600383835b8282101561050057604080518082019091528483015473ffffffffffffffffffffffffffffffffffffffff8116825274010000000000000000000000000000000000000000900461ffff166020808301919091529082526001909201910161049d565b50505061ffff8616600090815260066020908152604080832073ffffffffffffffffffffffffffffffffffffffff89168452909152812055509050816105475750506105cd565b60005b60038160ff1610156105c9576105b78584848460ff1660038110610570576105706122b4565b6020908102919091015181015161ffff808b16600090815260049093526040909220549091168660ff8716600381106105ab576105ab6122b4565b60200201515189610fab565b806105c181612265565b91505061054a565b5050505b6105d76001600255565b5050565b6105e3611c35565b61ffff82166000908152600560205260408082208151606081019092529091600390835b8282101561066a57604080518082019091528483015473ffffffffffffffffffffffffffffffffffffffff8116825274010000000000000000000000000000000000000000900461ffff1660208083019190915290825260019092019101610607565b505050509050919050565b60015473ffffffffffffffffffffffffffffffffffffffff1633146106c6576040517f7c91ccdd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600080547fffffffffffffffffffffffff00000000000000000000000000000000000000009081163317909155600180549091169055565b60005473ffffffffffffffffffffffffffffffffffffffff16331461074f576040517f5fc483c500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83169081179091556040517f906a1c6bd7e3091ea86693dd029a831c19049ce77f1dce2ce0bab1cacbabce2290600090a250565b60005473ffffffffffffffffffffffffffffffffffffffff16331461080f576040517f5fc483c500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61044273ffffffffffffffffffffffffffffffffffffffff8416838361114c565b60005473ffffffffffffffffffffffffffffffffffffffff163314610881576040517f5fc483c500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61ffff831660009081526003602052604090205460ff16156108cf576040517f5771642500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60006108e160c0830160a08401611da8565b6108f16080840160608501611da8565b6109016040850160208601611da8565b61090b919061216c565b610915919061216c565b90508261ffff168161ffff1614610958576040517f2ea1270e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61ffff848116600090815260046020908152604080832080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00001694881694909417909355600590522082906109ae82826122e3565b505061ffff841660009081526005602052604090819020908301906001016109d682826122e3565b505061ffff8416600090815260056020526040902060808301906002016109fd82826122e3565b505061ffff8416600090815260036020526040902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055610a46848484611220565b50505050565b60005473ffffffffffffffffffffffffffffffffffffffff163314610a9d576040517f5fc483c500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61ffff831660009081526003602052604090205460ff16610aea576040517f2849ec2300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000610afc60c0830160a08401611da8565b610b0c6080840160608501611da8565b610b1c6040850160208601611da8565b610b26919061216c565b610b30919061216c565b90508261ffff168161ffff1614610b73576040517f2ea1270e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61ffff848116600090815260046020908152604080832080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000169488169490941790935560059052208290610bc982826122e3565b505061ffff84166000908152600560205260409081902090830190600101610bf182826122e3565b505061ffff841660009081526005602052604090206080830190600201610c1882826122e3565b905050610a46848484611316565b610c2e610f34565b60036000610c3f6020840184611da8565b61ffff16815260208101919091526040016000205460ff16610c8d576040517f2849ec2300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600080610ca5610ca060408501856120fb565b611341565b90925090506000610cc6610cbc6020860186611da8565b856020013561153b565b905080610cd660408601866120fb565b6040013514610d11576040517f3b05b64a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff821673eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee1415610e345783602001353414610d80576040517fbc6f88c500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000c30141b657f4216252dc59af2e7cdb9d8792e1b01663a44bbb15610dca836020880135612222565b610dd49034612222565b610de160408801886120fb565b6040518363ffffffff1660e01b8152600401610dfd9190612018565b6000604051808303818588803b158015610e1657600080fd5b505af1158015610e2a573d6000803e3d6000fd5b5050505050610efd565b610e43338560200135846115a0565b610e6473ffffffffffffffffffffffffffffffffffffffff831684836115c2565b73ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000c30141b657f4216252dc59af2e7cdb9d8792e1b01663a44bbb1534610eae60408801886120fb565b6040518363ffffffff1660e01b8152600401610eca9190612018565b6000604051808303818588803b158015610ee357600080fd5b505af1158015610ef7573d6000803e3d6000fd5b50505050505b610f19610f0d6020860186611da8565b83866020013584611753565b610f248483836117df565b505050610f316001600255565b50565b600280541415610fa5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c0060448201526064015b60405180910390fd5b60028055565b73ffffffffffffffffffffffffffffffffffffffff8216156111445760008361ffff168561ffff1687610fde91906121e5565b610fe891906121aa565b6040805161ffff8a16815273ffffffffffffffffffffffffffffffffffffffff808616602083015291810183905290851660608201529091507f2ca7e603774a345d2661009d097610daffb2d91a47e69541066ddfe9221c51e89060800160405180910390a173ffffffffffffffffffffffffffffffffffffffff821673eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee14156111215760008373ffffffffffffffffffffffffffffffffffffffff168260405160006040518083038185875af1925050503d80600081146110da576040519150601f19603f3d011682016040523d82523d6000602084013e6110df565b606091505b505090508061111a576040517ff4b3b1bc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5050611144565b61114273ffffffffffffffffffffffffffffffffffffffff8316848361114c565b505b505050505050565b60405173ffffffffffffffffffffffffffffffffffffffff83166024820152604481018290526104429084907fa9059cbb00000000000000000000000000000000000000000000000000000000906064015b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff00000000000000000000000000000000000000000000000000000000909316929092179091526118bf565b7f6f8233416969476afceb725c919fe424faf367ed0a76e020fdf53369c4f1da9583838360005b60400201602001602081019061125d9190611da8565b61126d6080860160608701611da8565b61127d60c0870160a08801611da8565b61128a6020880188611c83565b61129a6060890160408a01611c83565b6112aa60a08a0160808b01611c83565b6040805161ffff998a16815297891660208901529588169587019590955292861660608601529416608084015273ffffffffffffffffffffffffffffffffffffffff93841660a0840152831660c08301529190911660e0820152610100015b60405180910390a1505050565b7fe6099dd217e540f806797781b59e4e804f78bc18220943c78d4ea9b68316e27c8383836000611247565b60008061135160608401846120c7565b3561145657600073ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000c30141b657f4216252dc59af2e7cdb9d8792e1b01663726f16d86113a160808701876120c7565b60405160e083901b7fffffffff000000000000000000000000000000000000000000000000000000001681529035600482015260240160606040518083038186803b1580156113ef57600080fd5b505afa158015611403573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114279190611d0d565b5090915081905061143b60808601866120c7565b61144c906060810190604001611c83565b9250925050915091565b600073ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000c30141b657f4216252dc59af2e7cdb9d8792e1b01663726f16d86114a160608701876120c7565b60405160e083901b7fffffffff000000000000000000000000000000000000000000000000000000001681529035600482015260240160606040518083038186803b1580156114ef57600080fd5b505afa158015611503573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115279190611d0d565b5090915081905061143b60608601866120c7565b61ffff808316600090815260046020526040812054909163ffffffff7f00000000000000000000000000000000000000000000000000000000000f424016916115859116846121e5565b61158f91906121aa565b6115999083612222565b9392505050565b61044273ffffffffffffffffffffffffffffffffffffffff82168430856119cb565b80158061167157506040517fdd62ed3e00000000000000000000000000000000000000000000000000000000815230600482015273ffffffffffffffffffffffffffffffffffffffff838116602483015284169063dd62ed3e9060440160206040518083038186803b15801561163757600080fd5b505afa15801561164b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061166f9190611e4f565b155b6116fd576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603660248201527f5361666545524332303a20617070726f76652066726f6d206e6f6e2d7a65726f60448201527f20746f206e6f6e2d7a65726f20616c6c6f77616e6365000000000000000000006064820152608401610f9c565b60405173ffffffffffffffffffffffffffffffffffffffff83166024820152604481018290526104429084907f095ea7b3000000000000000000000000000000000000000000000000000000009060640161119e565b61ffff8416600090815260066020908152604080832073ffffffffffffffffffffffffffffffffffffffff871684529091529020548190611795908490612192565b61179f9190612222565b61ffff909416600090815260066020908152604080832073ffffffffffffffffffffffffffffffffffffffff909616835294905292909220929092555050565b7f0881410a322342e6e09eb472c7ab91907d7a31436d5816b8f349c30518c9dc9761180d6020850185611da8565b60208501358461182060408801886120fb565b6020013561183160408901896120fb565b61183f9060608101906120c7565b3561184d60408a018a6120fb565b61185b9060808101906120c7565b3561186a8860208c0135612222565b6040805161ffff9098168852602088019690965273ffffffffffffffffffffffffffffffffffffffff909416948601949094526060850191909152608084015260a083019190915260c082015260e001611309565b6000611921826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff16611a299092919063ffffffff16565b805190915015610442578080602001905181019061193f9190611d52565b610442576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f742073756363656564000000000000000000000000000000000000000000006064820152608401610f9c565b60405173ffffffffffffffffffffffffffffffffffffffff80851660248301528316604482015260648101829052610a469085907f23b872dd000000000000000000000000000000000000000000000000000000009060840161119e565b6060611a388484600085611a40565b949350505050565b606082471015611ad2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f60448201527f722063616c6c00000000000000000000000000000000000000000000000000006064820152608401610f9c565b6000808673ffffffffffffffffffffffffffffffffffffffff168587604051611afb9190611f54565b60006040518083038185875af1925050503d8060008114611b38576040519150601f19603f3d011682016040523d82523d6000602084013e611b3d565b606091505b5091509150611b4e87838387611b59565b979650505050505050565b60608315611bec578251611be55773ffffffffffffffffffffffffffffffffffffffff85163b611be5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610f9c565b5081611a38565b611a388383815115611c015781518083602001fd5b806040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f9c9190611fc7565b60405180606001604052806003905b6040805180820190915260008082526020820152815260200190600190039081611c445790505090565b80518015158114611c7e57600080fd5b919050565b600060208284031215611c9557600080fd5b813561159981612389565b60008060408385031215611cb357600080fd5b8235611cbe81612389565b946020939093013593505050565b600080600060608486031215611ce157600080fd5b8335611cec81612389565b92506020840135611cfc81612389565b929592945050506040919091013590565b600080600060608486031215611d2257600080fd5b8351611d2d81612389565b9250611d3b60208501611c6e565b9150611d4960408501611c6e565b90509250925092565b600060208284031215611d6457600080fd5b61159982611c6e565b600060208284031215611d7f57600080fd5b813567ffffffffffffffff811115611d9657600080fd5b82016060818503121561159957600080fd5b600060208284031215611dba57600080fd5b8135611599816123ab565b60008060408385031215611dd857600080fd5b8235611de3816123ab565b91506020830135611df381612389565b809150509250929050565b6000806000610100808587031215611e1557600080fd5b8435611e20816123ab565b93506020850135611e30816123ab565b9250848101861015611e4157600080fd5b506040840190509250925092565b600060208284031215611e6157600080fd5b5051919050565b803582526020810135602083015260006040820135611e8681612389565b73ffffffffffffffffffffffffffffffffffffffff1660408401526060820135368390037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1018112611ed757600080fd5b8201803567ffffffffffffffff811115611ef057600080fd5b803603841315611eff57600080fd5b60806060860152806080860152806020830160a0870137600060a0828701015260a07fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8301168601019250505092915050565b60008251611f66818460208701612239565b9190910192915050565b60c08101818360005b6003811015611fbe578151805173ffffffffffffffffffffffffffffffffffffffff16845260209081015161ffff168185015260409093019290910190600101611f79565b50505092915050565b6020815260008251806020840152611fe6816040850160208701612239565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169190910160400192915050565b602081526000823561202981612389565b73ffffffffffffffffffffffffffffffffffffffff81166020840152506020830135604083015260408301356060830152612067606084018461212f565b60a0608084015261207b60c0840182611e68565b905061208a608085018561212f565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08483030160a08501526120be8282611e68565b95945050505050565b600082357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81833603018112611f6657600080fd5b600082357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff61833603018112611f6657600080fd5b600082357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8183360301811261216357600080fd5b90910192915050565b600061ffff80831681851680830382111561218957612189612285565b01949350505050565b600082198211156121a5576121a5612285565b500190565b6000826121e0577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b500490565b6000817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561221d5761221d612285565b500290565b60008282101561223457612234612285565b500390565b60005b8381101561225457818101518382015260200161223c565b83811115610a465750506000910152565b600060ff821660ff81141561227c5761227c612285565b60010192915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b81356122ee81612389565b73ffffffffffffffffffffffffffffffffffffffff811690508154817fffffffffffffffffffffffff00000000000000000000000000000000000000008216178355602084013561233e816123ab565b75ffff00000000000000000000000000000000000000008160a01b16837fffffffffffffffffffff000000000000000000000000000000000000000000008416171784555050505050565b73ffffffffffffffffffffffffffffffffffffffff81168114610f3157600080fd5b61ffff81168114610f3157600080fdfea2646970667358221220bb31059d7cb4c0283df9324939a67a9a88e9ff819c1b04e31a147b688714dc3464736f6c63430008070033

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

000000000000000000000000c30141b657f4216252dc59af2e7cdb9d8792e1b00000000000000000000000005fd7d0d6b91cc4787bcb86ca47e0bd4ea0346d34

-----Decoded View---------------
Arg [0] : _socketRegistry (address): 0xc30141B657f4216252dc59Af2e7CdB9D8792e1B0
Arg [1] : owner_ (address): 0x5fD7D0d6b91CC4787Bcb86ca47e0Bd4ea0346d34

-----Encoded View---------------
2 Constructor Arguments found :
Arg [0] : 000000000000000000000000c30141b657f4216252dc59af2e7cdb9d8792e1b0
Arg [1] : 0000000000000000000000005fd7d0d6b91cc4787bcb86ca47e0bd4ea0346d34


Deployed Bytecode Sourcemap

254:18012:5:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;16294:158;;;;;;;;;;-1:-1:-1;16294:158:5;;;;;:::i;:::-;16415:30;;16388:4;16415:30;;;:16;:30;;;;;;;;;16294:158;;;;7404:14:8;;7397:22;7379:41;;7367:2;7352:18;16294:158:5;;;;;;;;18113:151;;;;;;;;;;-1:-1:-1;18113:151:5;;;;;:::i;:::-;;:::i;:::-;;583:81:7;;;;;;;;;;-1:-1:-1;649:8:7;;;;583:81;;;5446:42:8;5434:55;;;5416:74;;5404:2;5389:18;583:81:7;5270:226:8;677:39:5;;;;;;;;;;;;;;;6769:701;;;;;;;;;;-1:-1:-1;6769:701:5;;;;;:::i;:::-;;:::i;17023:172::-;;;;;;;;;;-1:-1:-1;17023:172:5;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;879:153:7:-;;;;;;;;;;;;;:::i;670:203::-;;;;;;;;;;-1:-1:-1;670:203:7;;;;;:::i;:::-;;:::i;17653:186:5:-;;;;;;;;;;-1:-1:-1;17653:186:5;;;;;:::i;:::-;;:::i;4358:921::-;;;;;;;;;;-1:-1:-1;4358:921:5;;;;;:::i;:::-;;:::i;16639:153::-;;;;;;;;;;-1:-1:-1;16639:153:5;;;;;:::i;:::-;16760:25;;;;16731:6;16760:25;;;:11;:25;;;;;;;;16639:153;;;;11330:6:8;11318:19;;;11300:38;;11288:2;11273:18;16639:153:5;11156:188:8;500:77:7;;;;;;;;;;-1:-1:-1;538:7:7;564:6;;;500:77;;5644:780:5;;;;;;;;;;-1:-1:-1;5644:780:5;;;;;:::i;:::-;;:::i;15938:192::-;;;;;;;;;;-1:-1:-1;15938:192:5;;;;;:::i;:::-;16078:31;;;16048:7;16078:31;;;:17;:31;;;;;;;;:45;;;;;;;;;;;15938:192;;;;;;;;13485:25:8;;;13473:2;13458:18;15938:192:5;13339:177:8;7814:1796:5;;;;;;:::i;:::-;;:::i;18113:151::-;426:6:7;;;;412:10;:20;408:69;;455:11;;;;;;;;;;;;;;408:69;18229:28:5::1;::::0;:20:::1;::::0;::::1;::::0;:28;::::1;;;::::0;18250:6;;18229:28:::1;::::0;;;18250:6;18229:20;:28;::::1;;;;;;;;;;;;;::::0;::::1;;;;;;18113:151:::0;;:::o;6769:701::-;2246:21:0;:19;:21::i;:::-;6882:31:5::1;::::0;::::1;6862:17;6882:31:::0;;;:17:::1;:31;::::0;;;;;;;:45:::1;::::0;::::1;::::0;;;;;;;;6979:25;;;:11:::1;:25:::0;;;;;;6937:67;;;;::::1;::::0;;;::::1;6862:17:::0;6937:67;::::1;;;;;;;;::::0;;;;::::1;::::0;;;;;::::1;::::0;::::1;::::0;::::1;::::0;;;;::::1;;;;::::0;;::::1;::::0;;;;;;;;;;::::1;::::0;::::1;;;;-1:-1:-1::0;;;7014:31:5::1;::::0;::::1;7062:1;7014:31:::0;;;:17:::1;:31;::::0;;;;;;;:45:::1;::::0;::::1;::::0;;;;;;;:49;-1:-1:-1;6937:67:5;-1:-1:-1;7078:14:5;7074:51:::1;;7108:7;;;;7074:51;7139:7;7134:330;7156:1;7152;:5;;;7134:330;;;7178:275;7217:12;7247:9;7274:19;7294:1;7274:22;;;;;;;;;:::i;:::-;;::::0;;::::1;::::0;;;::::1;::::0;:43;::::1;::::0;7335:25:::1;::::0;;::::1;;::::0;;;:11:::1;:25:::0;;;;;;;;7274:43;;7335:25:::1;7378:19:::0;:22:::1;::::0;::::1;;::::0;::::1;;;;;:::i;:::-;;;;::::0;:31;7427:12;7178:21:::1;:275::i;:::-;7159:3:::0;::::1;::::0;::::1;:::i;:::-;;;;7134:330;;;;6852:618;;2277:1:0;2288:20:::0;1701:1;2790:7;:22;2610:209;2288:20;6769:701:5;;:::o;17023:172::-;17111:29;;:::i;:::-;17163:25;;;;;;;:11;:25;;;;;;17156:32;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17023:172;;;:::o;879:153:7:-;938:8;;;;924:10;:22;920:73;;969:13;;;;;;;;;;;;;;920:73;1096:6;:17;;;;;;1014:10;1096:17;;;;-1:-1:-1;1123:21:7;;;;;;;879:153::o;670:203::-;748:6;;;;734:10;:20;730:69;;777:11;;;;;;;;;;;;;;730:69;808:8;:19;;;;;;;;;;;;;842:24;;;;-1:-1:-1;;842:24:7;670:203;:::o;17653:186:5:-;426:6:7;;;;412:10;:20;408:69;;455:11;;;;;;;;;;;;;;408:69;17785:47:5::1;:26;::::0;::::1;17812:11:::0;17825:6;17785:26:::1;:47::i;4358:921::-:0;426:6:7;;;;412:10;:20;408:69;;455:11;;;;;;;;;;;;;;408:69;4611:30:5::1;::::0;::::1;;::::0;;;:16:::1;:30;::::0;;;;;::::1;;4607:99;;;4664:31;;;;;;;;;;;;;;4607:99;4716:8;4823:33;::::0;;;;;;::::1;:::i;:::-;4775;::::0;;;;;;::::1;:::i;:::-;4727;:12;:33:::0;;::::1;::::0;::::1;;:::i;:::-;:81;;;;:::i;:::-;:129;;;;:::i;:::-;4716:140;;4876:13;4871:18;;:1;:18;;;4867:82;;4912:26;;;;;;;;;;;;;;4867:82;4959:25;::::0;;::::1;;::::0;;;:11:::1;:25;::::0;;;;;;;:41;;;::::1;::::0;;::::1;::::0;;;::::1;::::0;;;5010:11:::1;:25:::0;;;5041:9;;5010:43:::1;5041:9:::0;5010:25;:43:::1;:::i;:::-;-1:-1:-1::0;;5063:25:5::1;::::0;::::1;;::::0;;;:11:::1;:25;::::0;5094:12:::1;5063:25:::0;;;;5094:12;;::::1;::::0;5104:1:::1;5063:28;:43;5094:12:::0;5063:28;:43:::1;:::i;:::-;-1:-1:-1::0;;5116:25:5::1;::::0;::::1;;::::0;;;:11:::1;:25;::::0;5147:12:::1;5116:25:::0;;5147:12;;::::1;::::0;5157:1:::1;5116:28;:43;5147:12:::0;5116:28;:43:::1;:::i;:::-;-1:-1:-1::0;;5169:30:5::1;::::0;::::1;;::::0;;;:16:::1;:30;::::0;;;;:37;;;::::1;5202:4;5169:37;::::0;;5216:56:::1;5186:12:::0;5247:13;5262:9;5216:16:::1;:56::i;:::-;4510:769;4358:921:::0;;;:::o;5644:780::-;426:6:7;;;;412:10;:20;408:69;;455:11;;;;;;;;;;;;;;408:69;5809:30:5::1;::::0;::::1;;::::0;;;:16:::1;:30;::::0;;;;;::::1;;5804:96;;5862:27;;;;;;;;;;;;;;5804:96;5910:8;6017:33;::::0;;;;;;::::1;:::i;:::-;5969;::::0;;;;;;::::1;:::i;:::-;5921;:12;:33:::0;;::::1;::::0;::::1;;:::i;:::-;:81;;;;:::i;:::-;:129;;;;:::i;:::-;5910:140;;6070:13;6065:18;;:1;:18;;;6061:82;;6106:26;;;;;;;;;;;;;;6061:82;6153:25;::::0;;::::1;;::::0;;;:11:::1;:25;::::0;;;;;;;:41;;;::::1;::::0;;::::1;::::0;;;::::1;::::0;;;6204:11:::1;:25:::0;;;6235:9;;6204:43:::1;6235:9:::0;6204:25;:43:::1;:::i;:::-;-1:-1:-1::0;;6257:25:5::1;::::0;::::1;;::::0;;;:11:::1;:25;::::0;6288:12:::1;6257:25:::0;;;;6288:12;;::::1;::::0;6298:1:::1;6257:28;:43;6288:12:::0;6257:28;:43:::1;:::i;:::-;-1:-1:-1::0;;6310:25:5::1;::::0;::::1;;::::0;;;:11:::1;:25;::::0;6341:12:::1;6310:25:::0;;6341:12;;::::1;::::0;6351:1:::1;6310:28;:43;6341:12:::0;6310:28;:43:::1;:::i;:::-;;;;6363:54;6378:12;6392:13;6407:9;6363:14;:54::i;7814:1796::-:0;2246:21:0;:19;:21::i;:::-;7914:16:5::1;:42;7931:24;;::::0;::::1;:11:::0;:24:::1;:::i;:::-;7914:42;;::::0;;::::1;::::0;::::1;::::0;;;;;;-1:-1:-1;7914:42:5;;::::1;;7909:108;;7979:27;;;;;;;;;;;;;;7909:108;8086:23;::::0;8161:57:::1;8194:23;;::::0;::::1;:11:::0;:23:::1;:::i;:::-;8161:32;:57::i;:::-;8072:146:::0;;-1:-1:-1;8072:146:5;-1:-1:-1;8278:22:5::1;8303:106;8338:24;;::::0;::::1;:11:::0;:24:::1;:::i;:::-;8376:11;:23;;;8303:21;:106::i;:::-;8278:131:::0;-1:-1:-1;8278:131:5;8424:23:::1;;::::0;::::1;:11:::0;:23:::1;:::i;:::-;:30;;;:48;8420:99;;8495:13;;;;;;;;;;;;;;8420:99;8558:41;::::0;::::1;491:42;8558:41;8554:711;;;8632:11;:23;;;8619:9;:36;8615:67;;8664:18;;;;;;;;;;;;;;8615:67;8696:25;:6;:25;;8759:40;8785:14:::0;8759:23:::1;::::0;::::1;;:40;:::i;:::-;8746:54;::::0;:9:::1;:54;:::i;:::-;8815:23;;::::0;::::1;:11:::0;:23:::1;:::i;:::-;8696:143;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;8554:711;;;8870:142;8912:10;8940:11;:23;;;8981:17;8870:24;:142::i;:::-;9026:116;:37;::::0;::::1;9081:15:::0;9114:14;9026:37:::1;:116::i;:::-;9156:25;:6;:25;;9189:9;9217:23;;::::0;::::1;:11:::0;:23:::1;:::i;:::-;9156:98;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;8554:711;9338:160;9368:24;;::::0;::::1;:11:::0;:24:::1;:::i;:::-;9406:17;9437:11;:23;;;9474:14;9338:16;:160::i;:::-;9538:65;9556:11;9569:17;9588:14;9538:17;:65::i;:::-;7899:1711;;;2288:20:0::0;1701:1;2790:7;:22;2610:209;2288:20;7814:1796:5;:::o;2321:283:0:-;1744:1;2449:7;;:19;;2441:63;;;;;;;9511:2:8;2441:63:0;;;9493:21:8;9550:2;9530:18;;;9523:30;9589:33;9569:18;;;9562:61;9640:18;;2441:63:0;;;;;;;;;1744:1;2579:18;;2321:283::o;10339:754:5:-;10554:22;;;;10550:537;;10592:22;10638:5;10617:26;;10630:4;10618:16;;:9;:16;;;;:::i;:::-;10617:26;;;;:::i;:::-;10662:62;;;11608:6:8;11596:19;;11578:38;;11635:42;11713:15;;;11708:2;11693:18;;11686:43;11745:18;;;11738:34;;;11808:15;;;11803:2;11788:18;;11781:43;10592:51:5;;-1:-1:-1;10662:62:5;;11565:3:8;11550:19;10662:62:5;;;;;;;10742:36;;;491:42;10742:36;10738:266;;;10799:12;10825:8;10817:22;;10868:14;10817:87;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10798:106;;;10927:7;10922:43;;10943:22;;;;;;;;;;;;;;10922:43;10983:7;;;;10738:266;11017:59;:33;;;11051:8;11061:14;11017:33;:59::i;:::-;10578:509;10550:537;10339:754;;;;;;:::o;763:205:3:-;902:58;;6440:42:8;6428:55;;902:58:3;;;6410:74:8;6500:18;;;6493:34;;;875:86:3;;895:5;;925:23;;6383:18:8;;902:58:3;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;875:19;:86::i;15123:483:5:-;15279:320;15304:12;15330:13;15357:9;15367:1;15357:12;;;;:33;;;;;;;;;;:::i;:::-;15404;;;;;;;;:::i;:::-;15451;;;;;;;;:::i;:::-;15498:21;;;;:9;:21;:::i;:::-;15533;;;;:12;;;:21;:::i;:::-;15568;;;;:12;;;:21;:::i;:::-;15279:320;;;12178:6:8;12211:15;;;12193:34;;12263:15;;;12258:2;12243:18;;12236:43;12315:15;;;12295:18;;;12288:43;;;;12367:15;;;12362:2;12347:18;;12340:43;12420:15;;12414:3;12399:19;;12392:44;12455:42;12534:15;;;12528:3;12513:19;;12506:44;12587:15;;12581:3;12566:19;;12559:44;12640:15;;;;12634:3;12619:19;;12612:44;12155:3;12140:19;15279:320:5;;;;;;;;15123:483;;;:::o;14565:479::-;14719:318;14742:12;14768:13;14795:9;14805:1;14795:12;;11566:620;11695:7;;11727:29;;;;:11;:29;:::i;:::-;:32;11723:457;;11781:20;11809:13;:6;:13;;11840:25;;;;:11;:25;:::i;:::-;11809:73;;;;;;;;;;11840:28;;11809:73;;;13485:25:8;13458:18;;11809:73:5;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;11780:102:5;;-1:-1:-1;11780:102:5;;-1:-1:-1;11918:25:5;;;;:11;:25;:::i;:::-;:36;;;;;;;;;:::i;:::-;11896:59;;;;;11566:620;;;:::o;11723:457::-;11987:20;12015:13;:6;:13;;12046:29;;;;:11;:29;:::i;:::-;12015:77;;;;;;;;;;12046:32;;12015:77;;;13485:25:8;13458:18;;12015:77:5;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;11986:106:5;;-1:-1:-1;11986:106:5;;-1:-1:-1;12128:29:5;;;;:11;:29;:::i;12964:211::-;13129:25;;;;13079:7;13129:25;;;:11;:25;;;;;;13079:7;;13119:48;13158:9;13119:48;;13120:34;;13129:25;13120:6;:34;:::i;:::-;13119:48;;;;:::i;:::-;13109:59;;:6;:59;:::i;:::-;13102:66;12964:211;-1:-1:-1;;;12964:211:5:o;12458:208::-;12593:66;:37;;;12631:4;12645;12652:6;12593:37;:66::i;1475:603:3:-;1830:10;;;1829:62;;-1:-1:-1;1846:39:3;;;;;1870:4;1846:39;;;5736:34:8;1846:15:3;5806::8;;;5786:18;;;5779:43;1846:15:3;;;;;5648:18:8;;1846:39:3;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:44;1829:62;1808:163;;;;;;;9871:2:8;1808:163:3;;;9853:21:8;9910:2;9890:18;;;9883:30;9949:34;9929:18;;;9922:62;10020:24;10000:18;;;9993:52;10062:19;;1808:163:3;9669:418:8;1808:163:3;2008:62;;6440:42:8;6428:55;;2008:62:3;;;6410:74:8;6500:18;;;6493:34;;;1981:90:3;;2001:5;;2031:22;;6383:18:8;;2008:62:3;6236:297:8;13562:343:5;13798:31;;;;;;;:17;:31;;;;;;;;:50;;;;;;;;;;;13884:14;;13798:71;;13863:6;;13798:71;:::i;:::-;:100;;;;:::i;:::-;13733:31;;;;;;;;:17;:31;;;;;;;;:50;;;;;;;;;;;;;:165;;;;-1:-1:-1;;13562:343:5:o;13985:503::-;14145:336;14171:24;;;;:11;:24;:::i;:::-;14209:23;;;;14246:12;14272:23;;;;14209:11;14272:23;:::i;:::-;:33;;;14319:23;;;;:11;:23;:::i;:::-;:41;;;;;;;:::i;:::-;:44;14377:23;;;;:11;:23;:::i;:::-;:37;;;;;;;:::i;:::-;:40;14431;14457:14;14431:23;;;;:40;:::i;:::-;14145:336;;;13010:6:8;12998:19;;;12980:38;;13049:2;13034:18;;13027:34;;;;13109:42;13097:55;;;13077:18;;;13070:83;;;;13184:2;13169:18;;13162:34;;;;13227:3;13212:19;;13205:35;13271:3;13256:19;;13249:35;;;;13315:3;13300:19;;13293:35;12967:3;12952:19;14145:336:5;12667:667:8;3747:706:3;4166:23;4192:69;4220:4;4192:69;;;;;;;;;;;;;;;;;4200:5;4192:27;;;;:69;;;;;:::i;:::-;4275:17;;4166:95;;-1:-1:-1;4275:21:3;4271:176;;4370:10;4359:30;;;;;;;;;;;;:::i;:::-;4351:85;;;;;;;9100:2:8;4351:85:3;;;9082:21:8;9139:2;9119:18;;;9112:30;9178:34;9158:18;;;9151:62;9249:12;9229:18;;;9222:40;9279:19;;4351:85:3;8898:406:8;974:241:3;1139:68;;6045:42:8;6114:15;;;1139:68:3;;;6096:34:8;6166:15;;6146:18;;;6139:43;6198:18;;;6191:34;;;1112:96:3;;1132:5;;1162:27;;6008:18:8;;1139:68:3;5833:398:8;3873:223:4;4006:12;4037:52;4059:6;4067:4;4073:1;4076:12;4037:21;:52::i;:::-;4030:59;3873:223;-1:-1:-1;;;;3873:223:4:o;4960:446::-;5125:12;5182:5;5157:21;:30;;5149:81;;;;;;;8335:2:8;5149:81:4;;;8317:21:8;8374:2;8354:18;;;8347:30;8413:34;8393:18;;;8386:62;8484:8;8464:18;;;8457:36;8510:19;;5149:81:4;8133:402:8;5149:81:4;5241:12;5255:23;5282:6;:11;;5301:5;5308:4;5282:31;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5240:73;;;;5330:69;5357:6;5365:7;5374:10;5386:12;5330:26;:69::i;:::-;5323:76;4960:446;-1:-1:-1;;;;;;;4960:446:4:o;7466:628::-;7646:12;7674:7;7670:418;;;7701:17;;7697:286;;1465:19;;;;7908:60;;;;;;;8742:2:8;7908:60:4;;;8724:21:8;8781:2;8761:18;;;8754:30;8820:31;8800:18;;;8793:59;8869:18;;7908:60:4;8540:353:8;7908:60:4;-1:-1:-1;8003:10:4;7996:17;;7670:418;8044:33;8052:10;8064:12;8775:17;;:21;8771:379;;9003:10;8997:17;9059:15;9046:10;9042:2;9038:19;9031:44;8771:379;9126:12;9119:20;;;;;;;;;;;:::i;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;14:164:8:-;90:13;;139;;132:21;122:32;;112:60;;168:1;165;158:12;112:60;14:164;;;:::o;183:247::-;242:6;295:2;283:9;274:7;270:23;266:32;263:52;;;311:1;308;301:12;263:52;350:9;337:23;369:31;394:5;369:31;:::i;435:323::-;511:6;519;572:2;560:9;551:7;547:23;543:32;540:52;;;588:1;585;578:12;540:52;627:9;614:23;646:31;671:5;646:31;:::i;:::-;696:5;748:2;733:18;;;;720:32;;-1:-1:-1;;;435:323:8:o;763:456::-;840:6;848;856;909:2;897:9;888:7;884:23;880:32;877:52;;;925:1;922;915:12;877:52;964:9;951:23;983:31;1008:5;983:31;:::i;:::-;1033:5;-1:-1:-1;1090:2:8;1075:18;;1062:32;1103:33;1062:32;1103:33;:::i;:::-;763:456;;1155:7;;-1:-1:-1;;;1209:2:8;1194:18;;;;1181:32;;763:456::o;1224:409::-;1306:6;1314;1322;1375:2;1363:9;1354:7;1350:23;1346:32;1343:52;;;1391:1;1388;1381:12;1343:52;1423:9;1417:16;1442:31;1467:5;1442:31;:::i;:::-;1492:5;-1:-1:-1;1516:46:8;1558:2;1543:18;;1516:46;:::i;:::-;1506:56;;1581:46;1623:2;1612:9;1608:18;1581:46;:::i;:::-;1571:56;;1224:409;;;;;:::o;1638:202::-;1705:6;1758:2;1746:9;1737:7;1733:23;1729:32;1726:52;;;1774:1;1771;1764:12;1726:52;1797:37;1824:9;1797:37;:::i;1845:388::-;1933:6;1986:2;1974:9;1965:7;1961:23;1957:32;1954:52;;;2002:1;1999;1992:12;1954:52;2042:9;2029:23;2075:18;2067:6;2064:30;2061:50;;;2107:1;2104;2097:12;2061:50;2130:22;;2186:2;2168:16;;;2164:25;2161:45;;;2202:1;2199;2192:12;2238:245;2296:6;2349:2;2337:9;2328:7;2324:23;2320:32;2317:52;;;2365:1;2362;2355:12;2317:52;2404:9;2391:23;2423:30;2447:5;2423:30;:::i;2488:386::-;2555:6;2563;2616:2;2604:9;2595:7;2591:23;2587:32;2584:52;;;2632:1;2629;2622:12;2584:52;2671:9;2658:23;2690:30;2714:5;2690:30;:::i;:::-;2739:5;-1:-1:-1;2796:2:8;2781:18;;2768:32;2809:33;2768:32;2809:33;:::i;:::-;2861:7;2851:17;;;2488:386;;;;;:::o;2879:573::-;3007:6;3015;3023;3054:3;3098:2;3086:9;3077:7;3073:23;3069:32;3066:52;;;3114:1;3111;3104:12;3066:52;3153:9;3140:23;3172:30;3196:5;3172:30;:::i;:::-;3221:5;-1:-1:-1;3278:2:8;3263:18;;3250:32;3291;3250;3291;:::i;:::-;3342:7;-1:-1:-1;3364:18:8;;;3361:31;-1:-1:-1;3358:51:8;;;3405:1;3402;3395:12;3358:51;;3443:2;3432:9;3428:18;3418:28;;2879:573;;;;;:::o;3457:184::-;3527:6;3580:2;3568:9;3559:7;3555:23;3551:32;3548:52;;;3596:1;3593;3586:12;3548:52;-1:-1:-1;3619:16:8;;3457:184;-1:-1:-1;3457:184:8:o;3646:1130::-;3754:5;3741:19;3736:3;3729:32;3817:4;3810:5;3806:16;3793:30;3786:4;3781:3;3777:14;3770:54;3711:3;3872:4;3865:5;3861:16;3848:30;3887:33;3912:7;3887:33;:::i;:::-;3965:42;3952:56;3945:4;3936:14;;3929:80;4068:4;4057:16;;4044:30;4125:14;4121:26;;;4149:66;4117:99;4093:124;;4083:152;;4231:1;4228;4221:12;4083:152;4259:30;;4312:21;;4356:18;4345:30;;4342:50;;;4388:1;4385;4378:12;4342:50;4435:6;4419:14;4415:27;4408:5;4404:39;4401:59;;;4456:1;4453;4446:12;4401:59;4492:4;4485;4480:3;4476:14;4469:28;4529:6;4522:4;4517:3;4513:14;4506:30;4593:6;4586:4;4577:7;4573:18;4567:3;4562;4558:13;4545:55;4644:1;4638:3;4629:6;4624:3;4620:16;4616:26;4609:37;4766:3;4696:66;4691:2;4683:6;4679:15;4675:88;4670:3;4666:98;4662:108;4655:115;;;;3646:1130;;;;:::o;4781:274::-;4910:3;4948:6;4942:13;4964:53;5010:6;5005:3;4998:4;4990:6;4986:17;4964:53;:::i;:::-;5033:16;;;;;4781:274;-1:-1:-1;;4781:274:8:o;6538:696::-;6770:3;6755:19;;6759:9;6851:6;6728:4;6885:343;6899:4;6896:1;6893:11;6885:343;;;6956:13;;6998:9;;7009:42;6994:58;6982:71;;7076:4;7124:11;;;7118:18;7138:6;7114:31;7100:12;;;7093:53;7175:4;7166:14;;;;7203:15;;;;6919:1;6912:9;6885:343;;;6889:3;;;6538:696;;;;:::o;7686:442::-;7835:2;7824:9;7817:21;7798:4;7867:6;7861:13;7910:6;7905:2;7894:9;7890:18;7883:34;7926:66;7985:6;7980:2;7969:9;7965:18;7960:2;7952:6;7948:15;7926:66;:::i;:::-;8044:2;8032:15;8049:66;8028:88;8013:104;;;;8119:2;8009:113;;7686:442;-1:-1:-1;;7686:442:8:o;10092:1059::-;10281:2;10270:9;10263:21;10244:4;10319:6;10306:20;10335:31;10360:5;10335:31;:::i;:::-;10413:42;10406:5;10402:54;10397:2;10386:9;10382:18;10375:82;;10518:2;10510:6;10506:15;10493:29;10488:2;10477:9;10473:18;10466:57;10584:2;10576:6;10572:15;10559:29;10554:2;10543:9;10539:18;10532:57;10618:70;10684:2;10676:6;10672:15;10664:6;10618:70;:::i;:::-;10725:4;10719:3;10708:9;10704:19;10697:33;10753:75;10823:3;10812:9;10808:19;10794:12;10753:75;:::i;:::-;10739:89;;10859:71;10925:3;10917:6;10913:16;10905:6;10859:71;:::i;:::-;10996:66;10984:9;10976:6;10972:22;10968:95;10961:4;10950:9;10946:20;10939:125;11081:64;11138:6;11122:14;11081:64;:::i;:::-;11073:72;10092:1059;-1:-1:-1;;;;;10092:1059:8:o;13521:389::-;13620:4;13678:11;13665:25;13768:66;13757:8;13741:14;13737:29;13733:102;13713:18;13709:127;13699:155;;13850:1;13847;13840:12;14313:387;14410:4;14468:11;14455:25;14558:66;14547:8;14531:14;14527:29;14523:102;14503:18;14499:127;14489:155;;14640:1;14637;14630:12;14705:357;14778:5;14837:3;14824:17;14919:66;14908:8;14892:14;14888:29;14884:102;14864:18;14860:127;14850:155;;15001:1;14998;14991:12;14850:155;15023:33;;;;14705:357;-1:-1:-1;;14705:357:8:o;15067:224::-;15106:3;15134:6;15167:2;15164:1;15160:10;15197:2;15194:1;15190:10;15228:3;15224:2;15220:12;15215:3;15212:21;15209:47;;;15236:18;;:::i;:::-;15272:13;;15067:224;-1:-1:-1;;;;15067:224:8:o;15296:128::-;15336:3;15367:1;15363:6;15360:1;15357:13;15354:39;;;15373:18;;:::i;:::-;-1:-1:-1;15409:9:8;;15296:128::o;15429:274::-;15469:1;15495;15485:189;;15530:77;15527:1;15520:88;15631:4;15628:1;15621:15;15659:4;15656:1;15649:15;15485:189;-1:-1:-1;15688:9:8;;15429:274::o;15708:228::-;15748:7;15874:1;15806:66;15802:74;15799:1;15796:81;15791:1;15784:9;15777:17;15773:105;15770:131;;;15881:18;;:::i;:::-;-1:-1:-1;15921:9:8;;15708:228::o;15941:125::-;15981:4;16009:1;16006;16003:8;16000:34;;;16014:18;;:::i;:::-;-1:-1:-1;16051:9:8;;15941:125::o;16071:258::-;16143:1;16153:113;16167:6;16164:1;16161:13;16153:113;;;16243:11;;;16237:18;16224:11;;;16217:39;16189:2;16182:10;16153:113;;;16284:6;16281:1;16278:13;16275:48;;;-1:-1:-1;;16319:1:8;16301:16;;16294:27;16071:258::o;16334:175::-;16371:3;16415:4;16408:5;16404:16;16444:4;16435:7;16432:17;16429:43;;;16452:18;;:::i;:::-;16501:1;16488:15;;16334:175;-1:-1:-1;;16334:175:8:o;16514:184::-;16566:77;16563:1;16556:88;16663:4;16660:1;16653:15;16687:4;16684:1;16677:15;16703:184;16755:77;16752:1;16745:88;16852:4;16849:1;16842:15;16876:4;16873:1;16866:15;16892:722;17059:5;17046:19;17074:33;17099:7;17074:33;:::i;:::-;17144:42;17135:7;17131:56;17116:71;;17212:4;17206:11;17319:7;17250:66;17246:2;17242:75;17239:88;17233:4;17226:102;17376:2;17369:5;17365:14;17352:28;17389:32;17413:7;17389:32;:::i;:::-;17559:46;17549:7;17544:3;17540:17;17536:70;17526:7;17457:66;17453:2;17449:75;17446:88;17443:164;17437:4;17430:178;;;;16892:722;;:::o;17619:154::-;17705:42;17698:5;17694:54;17687:5;17684:65;17674:93;;17763:1;17760;17753:12;17778:117;17863:6;17856:5;17852:18;17845:5;17842:29;17832:57;;17885:1;17882;17875:12

Swarm Source

ipfs://bb31059d7cb4c0283df9324939a67a9a88e9ff819c1b04e31a147b688714dc34

Block Transaction Difficulty Gas Used Reward
View All Blocks Produced

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

Validator Index Block Amount
View All Withdrawals

Transaction Hash Block Value Eth2 PubKey Valid
View All Deposits
Chain Token Portfolio % Price Amount Value
ETH
Ether (ETH)
33.49%$3,478.910.1933$672.42
ETH13.66%$1273.6544$274.2
ETH9.39%$53.843.5$188.45
ETH6.17%$1.04119.5194$123.88
ETH4.57%$14.466.3485$91.8
ETH4.50%$0.99323590.9299$90.31
ETH3.43%$0.0000232,995,368.232$68.89
ETH2.59%$0.517334100.5673$52.03
ETH2.59%$1.9526.6638$51.99
ETH1.73%$37.190.9334$34.71
ETH1.54%$4,111.650.00753727$30.99
ETH1.50%$0.226788132.7736$30.11
ETH1.42%$0.9961228.6415$28.53
ETH1.40%$128.1234$28.12
ETH1.38%$3,478.910.007946$27.64
ETH1.37%$376.240.0733$27.57
ETH1.12%$122.5$22.55
ETH0.95%$0.048963387.75$18.99
ETH0.68%$113.515$13.57
ETH0.61%$0.5924620.802$12.32
ETH0.46%$0.11744579.399$9.33
ETH0.41%$0.61704513.3244$8.22
ETH0.37%$0.58497812.8495$7.52
ETH0.33%$1.574.2043$6.6
ETH0.28%$0.9948715.6119$5.58
ETH0.25%$1.473.4721$5.1
ETH0.22%$20.310.2207$4.48
ETH0.22%$0.007959549.3487$4.37
ETH0.19%$3.751$3.75
ETH0.17%$42.970.0802$3.45
ETH0.17%$0.5356946.3116$3.38
ETH0.16%$0.8736823.6896$3.22
ETH0.14%$25.230.114$2.88
ETH0.14%$0.05643848.9434$2.76
ETH0.13%$0.9807562.6074$2.56
ETH0.13%$0.4640755.4236$2.52
ETH0.11%$4.320.5$2.16
ETH0.10%$3,829.290.00049837$1.91
ETH0.08%$3,409.030.0005$1.7
ETH0.08%$0.02437569.5$1.69
ETH0.08%$276.310.00571372$1.58
ETH0.07%$0.01983569.94$1.39
ETH0.07%$0.1178911.7174$1.38
ETH0.07%$1.061.2696$1.35
ETH0.06%$2.290.5696$1.3
ETH0.06%$1.251.0187$1.27
ETH0.06%$0.9988961.25$1.25
ETH0.06%$38.820.0288$1.12
ETH0.05%$0.6618551.6472$1.09
ETH0.05%$2.690.3638$0.9785
ETH0.05%$0.001041920.8561$0.959
ETH0.04%$0.006783120.5773$0.8179
ETH0.04%$0.990480.7538$0.7466
ETH0.03%$20.980.0283$0.5944
ETH0.03%$0.0172333.548$0.578
ETH0.03%$0.1929732.817$0.5436
ETH0.03%$0.2747761.9343$0.5315
ETH0.02%$0.6425460.75$0.4819
ETH0.02%$3,463.470.00013589$0.4706
ETH0.02%$1.670.25$0.4175
ETH0.02%$0.9957040.3536$0.352
ETH0.02%$0.01439324.1016$0.3468
ETH0.02%$0.3254231$0.3254
ETH0.01%$3.210.09$0.2889
ETH0.01%$0.2185831.3214$0.2888
ETH0.01%$3.390.08$0.2709
ETH0.01%$0.0177314.4801$0.2567
ETH0.01%$0.00564743.9698$0.2482
ETH0.01%$0.2935960.7584$0.2226
ETH0.01%$0.0684433.1695$0.2169
ETH0.01%$86.240.002451$0.2113
ETH<0.01%$0.02001310$0.2001
ETH<0.01%$0.0000464,081.875$0.1879
ETH<0.01%$0.00000529,494.812$0.1465
ETH<0.01%$0.00000346,969.8607$0.1458
ETH<0.01%$0.0627472$0.1254
ETH<0.01%$0.00987111.7161$0.1156
ETH<0.01%$0.4867310.2067$0.1006
BSC0.63%$0.000016804,828$12.6
POL<0.01%$0.521510.006$0.003129
Loading...
Loading
[ Download: CSV Export  ]
[ Download: CSV Export  ]

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