ETH Price: $3,456.48 (-0.77%)
Gas: 2 Gwei

Contract

0x07042134d4DC295CBF3aB08a4a0eFF847a528171
 

Overview

ETH Balance

0.24484436323220714 ETH

Eth Value

$846.30 (@ $3,456.48/ETH)

Multichain Info

No addresses found
Transaction Hash
Method
Block
From
To
Value
Bridge ERC20202163652024-07-02 4:11:4742 mins ago1719893507IN
0x07042134...47a528171
0 ETH0.001376652.71643751
Bridge ERC20202162252024-07-02 3:43:351 hr ago1719891815IN
0x07042134...47a528171
0 ETH0.001357473.6389161
Bridge ERC20202160512024-07-02 3:08:351 hr ago1719889715IN
0x07042134...47a528171
0 ETH0.001094742.18444579
Bridge ERC20202159692024-07-02 2:51:592 hrs ago1719888719IN
0x07042134...47a528171
0 ETH0.00062621.70435202
Bridge ERC20202159472024-07-02 2:47:352 hrs ago1719888455IN
0x07042134...47a528171
0 ETH0.00084131.67880356
Bridge ERC20202158842024-07-02 2:34:472 hrs ago1719887687IN
0x07042134...47a528171
0 ETH0.000869751.7454375
Bridge ERC20202156562024-07-02 1:49:113 hrs ago1719884951IN
0x07042134...47a528171
0 ETH0.000698311.87180737
Bridge ERC20202154442024-07-02 1:06:473 hrs ago1719882407IN
0x07042134...47a528171
0 ETH0.001078042.12725676
Bridge ERC20202153882024-07-02 0:55:353 hrs ago1719881735IN
0x07042134...47a528171
0 ETH0.000704631.88858061
Bridge ERC20202150192024-07-01 23:41:235 hrs ago1719877283IN
0x07042134...47a528171
0 ETH0.000774762.07661243
Bridge ERC20202150112024-07-01 23:39:475 hrs ago1719877187IN
0x07042134...47a528171
0 ETH0.0011132.19640794
Bridge ERC20202149162024-07-01 23:20:475 hrs ago1719876047IN
0x07042134...47a528171
0 ETH0.001288912.54353544
Bridge ERC20202139872024-07-01 20:14:118 hrs ago1719864851IN
0x07042134...47a528171
0 ETH0.003454979.26036547
Bridge ERC20202139382024-07-01 20:04:238 hrs ago1719864263IN
0x07042134...47a528171
0 ETH0.003578989.59366496
Bridge ERC20202138152024-07-01 19:39:479 hrs ago1719862787IN
0x07042134...47a528171
0 ETH0.00631112.45324197
Bridge ERC20202137662024-07-01 19:29:599 hrs ago1719862199IN
0x07042134...47a528171
0 ETH0.0054345510.72353604
Bridge ERC20202137382024-07-01 19:24:239 hrs ago1719861863IN
0x07042134...47a528171
0 ETH0.0058990911.63906882
Bridge ERC20202134402024-07-01 18:24:2310 hrs ago1719858263IN
0x07042134...47a528171
0 ETH0.0068004513.41746923
Bridge ERC20202132892024-07-01 17:54:1111 hrs ago1719856451IN
0x07042134...47a528171
0 ETH0.002789877.47816609
Bridge ERC20202132642024-07-01 17:48:5911 hrs ago1719856139IN
0x07042134...47a528171
0 ETH0.002828387.58091104
Bridge ERC20202132022024-07-01 17:36:3511 hrs ago1719855395IN
0x07042134...47a528171
0 ETH0.003901777.69903468
Bridge ERC20202131902024-07-01 17:34:1111 hrs ago1719855251IN
0x07042134...47a528171
0 ETH0.004132128.15375598
Bridge ERC20202131372024-07-01 17:23:3511 hrs ago1719854615IN
0x07042134...47a528171
0 ETH0.003820387.53878448
Bridge ERC20202131172024-07-01 17:19:3511 hrs ago1719854375IN
0x07042134...47a528171
0 ETH0.00362187.14607544
Bridge ERC20202130032024-07-01 16:56:3511 hrs ago1719852995IN
0x07042134...47a528171
0 ETH0.002564486.87425697
View all transactions

Latest 25 internal transactions (View All)

Advanced mode:
Parent Transaction Hash Block From To Value
202163652024-07-02 4:11:4742 mins ago1719893507
0x07042134...47a528171
0 ETH
202163652024-07-02 4:11:4742 mins ago1719893507
0x07042134...47a528171
 Contract Creation0 ETH
202160512024-07-02 3:08:351 hr ago1719889715
0x07042134...47a528171
0 ETH
202160512024-07-02 3:08:351 hr ago1719889715
0x07042134...47a528171
 Contract Creation0 ETH
202159472024-07-02 2:47:352 hrs ago1719888455
0x07042134...47a528171
0 ETH
202159472024-07-02 2:47:352 hrs ago1719888455
0x07042134...47a528171
 Contract Creation0 ETH
202158842024-07-02 2:34:472 hrs ago1719887687
0x07042134...47a528171
0 ETH
202158842024-07-02 2:34:472 hrs ago1719887687
0x07042134...47a528171
 Contract Creation0 ETH
202154442024-07-02 1:06:473 hrs ago1719882407
0x07042134...47a528171
0 ETH
202154442024-07-02 1:06:473 hrs ago1719882407
0x07042134...47a528171
 Contract Creation0 ETH
202150112024-07-01 23:39:475 hrs ago1719877187
0x07042134...47a528171
0 ETH
202150112024-07-01 23:39:475 hrs ago1719877187
0x07042134...47a528171
 Contract Creation0 ETH
202149162024-07-01 23:20:475 hrs ago1719876047
0x07042134...47a528171
0 ETH
202149162024-07-01 23:20:475 hrs ago1719876047
0x07042134...47a528171
 Contract Creation0 ETH
202138152024-07-01 19:39:479 hrs ago1719862787
0x07042134...47a528171
0 ETH
202138152024-07-01 19:39:479 hrs ago1719862787
0x07042134...47a528171
 Contract Creation0 ETH
202137662024-07-01 19:29:599 hrs ago1719862199
0x07042134...47a528171
0 ETH
202137662024-07-01 19:29:599 hrs ago1719862199
0x07042134...47a528171
 Contract Creation0 ETH
202137382024-07-01 19:24:239 hrs ago1719861863
0x07042134...47a528171
0 ETH
202137382024-07-01 19:24:239 hrs ago1719861863
0x07042134...47a528171
 Contract Creation0 ETH
202134402024-07-01 18:24:2310 hrs ago1719858263
0x07042134...47a528171
0 ETH
202134402024-07-01 18:24:2310 hrs ago1719858263
0x07042134...47a528171
 Contract Creation0 ETH
202132022024-07-01 17:36:3511 hrs ago1719855395
0x07042134...47a528171
0 ETH
202132022024-07-01 17:36:3511 hrs ago1719855395
0x07042134...47a528171
 Contract Creation0 ETH
202131902024-07-01 17:34:1111 hrs ago1719855251
0x07042134...47a528171
0 ETH
View All Internal Transactions
Loading...
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
T2BRouter

Compiler Version
v0.8.13+commit.abaa5c0e

Optimization Enabled:
Yes with 1000000 runs

Other Settings:
default evmVersion
File 1 of 11 : T2BRouter.sol
pragma solidity ^0.8.13;

import "./utils/Ownable.sol";
import "./T2BApproval.sol";
import "./interfaces/IT2BRequest.sol";
import {SafeTransferLib} from "lib/solmate/src/utils/SafeTransferLib.sol";
import {ERC20} from "lib/solmate/src/tokens/ERC20.sol";
import "lib/openzeppelin-contracts/contracts/utils/cryptography/ECDSA.sol";

contract T2BRouter is Ownable {
    using SafeTransferLib for ERC20;

    // Errors
    error VerificationCallFailed();
    error InvalidTokenAddress();
    error BalanceMismatch();
    error BridgingFailed();
    error UnsupportedBridge();
    error ZeroAddress();
    error SignerMismatch();
    error InvalidNonce();

    /**
     * @dev The address used to identify ETH.
     */
    address public constant ETH_ADDRESS =
        address(0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE);

    // Socket Gateway.
    address public immutable socketGateway;

    address public feeTakerAddress;

    address[] public supportedTokens;

    address public signerAddress;

    // mapping of routeids against verifier contracts
    mapping(uint32 => address) public bridgeVerifiers;

    // nonce used in fee update signatures
    mapping(address => uint256) public nextNonce;

    // Constructor
    constructor(
        address _owner,
        address _socketGateway,
        address _feeTakerAddress
    ) Ownable(_owner) {
        socketGateway = _socketGateway;
        feeTakerAddress = _feeTakerAddress;
    }

    // Set the t2b factory address
    function setFeeTakerAddress(address _feeTakerAddress) external onlyOwner {
        feeTakerAddress = _feeTakerAddress;
    }

    // Set the signer address
    function setSignerAddress(address _signerAddress) external onlyOwner {
        signerAddress = _signerAddress;
    }

    // Set bridge verifier contract address against routeId
    function setBridgeVerifier(
        uint32 routeId,
        address bridgeVerifier
    ) external onlyOwner {
        bridgeVerifiers[routeId] = bridgeVerifier;
    }

    // function to add tokens to supportedTokens
    function setSupportedTokens(address[] memory _tokens) external onlyOwner {
        for (uint256 i = 0; i < _tokens.length; i++) {
            supportedTokens.push(_tokens[i]);
        }
        supportedTokens.push(address(0));
    }

    // function to empty supported tokens array
    function emptyTokenList() external onlyOwner {
        address[] memory emptyList;
        supportedTokens = emptyList;
    }

    // Function that bridges taking amount from the t2bAddress where the user funds are parked.
    function bridgeERC20(
        uint256 fees,
        uint256 nonce,
        bytes calldata bridgeData,
        bytes calldata signature
    ) external {
        // recovering signer.
        address recoveredSigner = ECDSA.recover(
            keccak256(
                abi.encodePacked(
                    "\x19Ethereum Signed Message:\n32",
                    keccak256(
                        abi.encode(
                            address(this),
                            nonce,
                            block.chainid, // uint256
                            fees,
                            bridgeData
                        )
                    )
                )
            ),
            signature
        );

        if (signerAddress != recoveredSigner) revert SignerMismatch();
        // nonce is used by gated roles and we don't expect nonce to reach the max value of uint256
        unchecked {
            if (nonce != nextNonce[signerAddress]++) revert InvalidNonce();
        }

        if (bridgeVerifiers[uint32(bytes4(bridgeData[0:4]))] == address(0))
            revert UnsupportedBridge();
        (bool parseSuccess, bytes memory parsedData) = bridgeVerifiers[
            uint32(bytes4(bridgeData[0:4]))
        ].call(bridgeData[4:bridgeData.length - 1]);

        if (!parseSuccess) revert VerificationCallFailed();

        IT2BRequest.T2BRequest memory t2bRequest = abi.decode(
            parsedData,
            (IT2BRequest.T2BRequest)
        );
        address t2bAddress = getAddressFor(
            t2bRequest.recipient,
            t2bRequest.toChainId
        );
        if (
            ERC20(t2bRequest.token).allowance(t2bAddress, address(this)) <
            t2bRequest.amount
        ) {
            bytes32 uniqueSalt = keccak256(
                abi.encode(t2bRequest.recipient, t2bRequest.toChainId)
            );
            new T2BApproval{salt: uniqueSalt}(address(this));
        }

        ERC20(t2bRequest.token).safeTransferFrom(
            t2bAddress,
            address(this),
            t2bRequest.amount + fees
        );

        if (fees > 0)
            ERC20(t2bRequest.token).safeTransfer(feeTakerAddress, fees);

        if (
            t2bRequest.amount >
            ERC20(t2bRequest.token).allowance(address(this), socketGateway)
        ) {
            ERC20(t2bRequest.token).safeApprove(
                address(socketGateway),
                type(uint256).max
            );
        }

        (bool bridgeSuccess, ) = socketGateway.call(bridgeData);

        if (!bridgeSuccess) revert BridgingFailed();
    }

    function deployApprovalContract(
        address receiver,
        uint256 toChainId
    ) public returns (address approvalAddress) {
        bytes32 uniqueSalt = keccak256(abi.encode(receiver, toChainId));
        approvalAddress = address(new T2BApproval{salt: uniqueSalt}(address(this)));
    }

    function getAddressFor(
        address receiver,
        uint256 toChainId
    ) public view returns (address) {
        bytes32 salt = keccak256(abi.encode(receiver, toChainId));
        return
            address(
                uint160(
                    uint256(
                        keccak256(
                            abi.encodePacked(
                                bytes1(0xff),
                                address(this),
                                salt,
                                keccak256(
                                    abi.encodePacked(
                                        type(T2BApproval).creationCode,
                                        abi.encode(address(this))
                                    )
                                )
                            )
                        )
                    )
                )
            );
    }

    /*******************************************
     *          RESTRICTED RESCUE FUNCTION    *
     *******************************************/

    /**
     * @dev Rescues funds from a contract.
     * @param token_ The address of the token contract.
     * @param userAddress_ The address of the user.
     * @param amount_ The amount of tokens to be rescued.
     */
    function rescueFunds(
        address token_,
        address userAddress_,
        uint256 amount_
    ) external onlyOwner {
        if (userAddress_ == address(0)) revert ZeroAddress();

        if (token_ == ETH_ADDRESS) {
            SafeTransferLib.safeTransferETH(userAddress_, amount_);
        } else {
            if (token_.code.length == 0) revert InvalidTokenAddress();
            SafeTransferLib.safeTransfer(ERC20(token_), userAddress_, amount_);
        }
    }

    function rescueFromT2BReceiver(
        address t2bReceiver_,
        address token_,
        address userAddress_,
        uint256 amount_
    ) external onlyOwner {
        if (userAddress_ == address(0)) revert ZeroAddress();
        if (token_.code.length == 0) revert InvalidTokenAddress();
        SafeTransferLib.safeTransferFrom(
            ERC20(token_),
            t2bReceiver_,
            userAddress_,
            amount_
        );
    }
}

File 2 of 11 : T2BApproval.sol
pragma solidity ^0.8.13;

import "./interfaces/IT2BRouter.sol";
import {SafeTransferLib} from "lib/solmate/src/utils/SafeTransferLib.sol";
import {ERC20} from "lib/solmate/src/tokens/ERC20.sol";
 
contract T2BApproval {
    using SafeTransferLib for ERC20;

    error ZeroAddress();
    error InvalidTokenAddress();


    // Constructor
    constructor(address _t2bRouter) {
        // Set T2b Router.
        IT2BRouter t2bRouter = IT2BRouter(_t2bRouter);

        // Set Max Approvals for supported tokens.
        uint256 tokenIndex = 0;
        while (t2bRouter.supportedTokens(tokenIndex) != address(0)) {
            ERC20(t2bRouter.supportedTokens(tokenIndex)).safeApprove(
                address(t2bRouter),
                type(uint256).max
            );
            unchecked {
                ++tokenIndex;
            }
        }

        selfdestruct(payable(msg.sender));
    }
}

File 3 of 11 : IT2BRouter.sol
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.4;

/**
 * @title IT2BRouter
 * @notice Interface for T2B Router.
 * @dev functions can be added here for invocation from external contracts or off-chain
 * @author Socket dot tech.
 */
abstract contract IT2BRouter {
    // tokenlist in IT2BRouter
    address[] public supportedTokens;
}

File 4 of 11 : SafeTransferLib.sol
// SPDX-License-Identifier: AGPL-3.0-only
pragma solidity >=0.8.0;

import {ERC20} from "../tokens/ERC20.sol";

/// @notice Safe ETH and ERC20 transfer library that gracefully handles missing return values.
/// @author Solmate (https://github.com/transmissions11/solmate/blob/main/src/utils/SafeTransferLib.sol)
/// @dev Use with caution! Some functions in this library knowingly create dirty bits at the destination of the free memory pointer.
/// @dev Note that none of the functions in this library check that a token has code at all! That responsibility is delegated to the caller.
library SafeTransferLib {
    /*//////////////////////////////////////////////////////////////
                             ETH OPERATIONS
    //////////////////////////////////////////////////////////////*/

    function safeTransferETH(address to, uint256 amount) internal {
        bool success;

        /// @solidity memory-safe-assembly
        assembly {
            // Transfer the ETH and store if it succeeded or not.
            success := call(gas(), to, amount, 0, 0, 0, 0)
        }

        require(success, "ETH_TRANSFER_FAILED");
    }

    /*//////////////////////////////////////////////////////////////
                            ERC20 OPERATIONS
    //////////////////////////////////////////////////////////////*/

    function safeTransferFrom(
        ERC20 token,
        address from,
        address to,
        uint256 amount
    ) internal {
        bool success;

        /// @solidity memory-safe-assembly
        assembly {
            // Get a pointer to some free memory.
            let freeMemoryPointer := mload(0x40)

            // Write the abi-encoded calldata into memory, beginning with the function selector.
            mstore(freeMemoryPointer, 0x23b872dd00000000000000000000000000000000000000000000000000000000)
            mstore(add(freeMemoryPointer, 4), and(from, 0xffffffffffffffffffffffffffffffffffffffff)) // Append and mask the "from" argument.
            mstore(add(freeMemoryPointer, 36), and(to, 0xffffffffffffffffffffffffffffffffffffffff)) // Append and mask the "to" argument.
            mstore(add(freeMemoryPointer, 68), amount) // Append the "amount" argument. Masking not required as it's a full 32 byte type.

            success := and(
                // Set success to whether the call reverted, if not we check it either
                // returned exactly 1 (can't just be non-zero data), or had no return data.
                or(and(eq(mload(0), 1), gt(returndatasize(), 31)), iszero(returndatasize())),
                // We use 100 because the length of our calldata totals up like so: 4 + 32 * 3.
                // We use 0 and 32 to copy up to 32 bytes of return data into the scratch space.
                // Counterintuitively, this call must be positioned second to the or() call in the
                // surrounding and() call or else returndatasize() will be zero during the computation.
                call(gas(), token, 0, freeMemoryPointer, 100, 0, 32)
            )
        }

        require(success, "TRANSFER_FROM_FAILED");
    }

    function safeTransfer(
        ERC20 token,
        address to,
        uint256 amount
    ) internal {
        bool success;

        /// @solidity memory-safe-assembly
        assembly {
            // Get a pointer to some free memory.
            let freeMemoryPointer := mload(0x40)

            // Write the abi-encoded calldata into memory, beginning with the function selector.
            mstore(freeMemoryPointer, 0xa9059cbb00000000000000000000000000000000000000000000000000000000)
            mstore(add(freeMemoryPointer, 4), and(to, 0xffffffffffffffffffffffffffffffffffffffff)) // Append and mask the "to" argument.
            mstore(add(freeMemoryPointer, 36), amount) // Append the "amount" argument. Masking not required as it's a full 32 byte type.

            success := and(
                // Set success to whether the call reverted, if not we check it either
                // returned exactly 1 (can't just be non-zero data), or had no return data.
                or(and(eq(mload(0), 1), gt(returndatasize(), 31)), iszero(returndatasize())),
                // We use 68 because the length of our calldata totals up like so: 4 + 32 * 2.
                // We use 0 and 32 to copy up to 32 bytes of return data into the scratch space.
                // Counterintuitively, this call must be positioned second to the or() call in the
                // surrounding and() call or else returndatasize() will be zero during the computation.
                call(gas(), token, 0, freeMemoryPointer, 68, 0, 32)
            )
        }

        require(success, "TRANSFER_FAILED");
    }

    function safeApprove(
        ERC20 token,
        address to,
        uint256 amount
    ) internal {
        bool success;

        /// @solidity memory-safe-assembly
        assembly {
            // Get a pointer to some free memory.
            let freeMemoryPointer := mload(0x40)

            // Write the abi-encoded calldata into memory, beginning with the function selector.
            mstore(freeMemoryPointer, 0x095ea7b300000000000000000000000000000000000000000000000000000000)
            mstore(add(freeMemoryPointer, 4), and(to, 0xffffffffffffffffffffffffffffffffffffffff)) // Append and mask the "to" argument.
            mstore(add(freeMemoryPointer, 36), amount) // Append the "amount" argument. Masking not required as it's a full 32 byte type.

            success := and(
                // Set success to whether the call reverted, if not we check it either
                // returned exactly 1 (can't just be non-zero data), or had no return data.
                or(and(eq(mload(0), 1), gt(returndatasize(), 31)), iszero(returndatasize())),
                // We use 68 because the length of our calldata totals up like so: 4 + 32 * 2.
                // We use 0 and 32 to copy up to 32 bytes of return data into the scratch space.
                // Counterintuitively, this call must be positioned second to the or() call in the
                // surrounding and() call or else returndatasize() will be zero during the computation.
                call(gas(), token, 0, freeMemoryPointer, 68, 0, 32)
            )
        }

        require(success, "APPROVE_FAILED");
    }
}

File 5 of 11 : ERC20.sol
// SPDX-License-Identifier: AGPL-3.0-only
pragma solidity >=0.8.0;

/// @notice Modern and gas efficient ERC20 + EIP-2612 implementation.
/// @author Solmate (https://github.com/transmissions11/solmate/blob/main/src/tokens/ERC20.sol)
/// @author Modified from Uniswap (https://github.com/Uniswap/uniswap-v2-core/blob/master/contracts/UniswapV2ERC20.sol)
/// @dev Do not manually set balances without updating totalSupply, as the sum of all user balances must not exceed it.
abstract contract ERC20 {
    /*//////////////////////////////////////////////////////////////
                                 EVENTS
    //////////////////////////////////////////////////////////////*/

    event Transfer(address indexed from, address indexed to, uint256 amount);

    event Approval(address indexed owner, address indexed spender, uint256 amount);

    /*//////////////////////////////////////////////////////////////
                            METADATA STORAGE
    //////////////////////////////////////////////////////////////*/

    string public name;

    string public symbol;

    uint8 public immutable decimals;

    /*//////////////////////////////////////////////////////////////
                              ERC20 STORAGE
    //////////////////////////////////////////////////////////////*/

    uint256 public totalSupply;

    mapping(address => uint256) public balanceOf;

    mapping(address => mapping(address => uint256)) public allowance;

    /*//////////////////////////////////////////////////////////////
                            EIP-2612 STORAGE
    //////////////////////////////////////////////////////////////*/

    uint256 internal immutable INITIAL_CHAIN_ID;

    bytes32 internal immutable INITIAL_DOMAIN_SEPARATOR;

    mapping(address => uint256) public nonces;

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

    constructor(
        string memory _name,
        string memory _symbol,
        uint8 _decimals
    ) {
        name = _name;
        symbol = _symbol;
        decimals = _decimals;

        INITIAL_CHAIN_ID = block.chainid;
        INITIAL_DOMAIN_SEPARATOR = computeDomainSeparator();
    }

    /*//////////////////////////////////////////////////////////////
                               ERC20 LOGIC
    //////////////////////////////////////////////////////////////*/

    function approve(address spender, uint256 amount) public virtual returns (bool) {
        allowance[msg.sender][spender] = amount;

        emit Approval(msg.sender, spender, amount);

        return true;
    }

    function transfer(address to, uint256 amount) public virtual returns (bool) {
        balanceOf[msg.sender] -= amount;

        // Cannot overflow because the sum of all user
        // balances can't exceed the max uint256 value.
        unchecked {
            balanceOf[to] += amount;
        }

        emit Transfer(msg.sender, to, amount);

        return true;
    }

    function transferFrom(
        address from,
        address to,
        uint256 amount
    ) public virtual returns (bool) {
        uint256 allowed = allowance[from][msg.sender]; // Saves gas for limited approvals.

        if (allowed != type(uint256).max) allowance[from][msg.sender] = allowed - amount;

        balanceOf[from] -= amount;

        // Cannot overflow because the sum of all user
        // balances can't exceed the max uint256 value.
        unchecked {
            balanceOf[to] += amount;
        }

        emit Transfer(from, to, amount);

        return true;
    }

    /*//////////////////////////////////////////////////////////////
                             EIP-2612 LOGIC
    //////////////////////////////////////////////////////////////*/

    function permit(
        address owner,
        address spender,
        uint256 value,
        uint256 deadline,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) public virtual {
        require(deadline >= block.timestamp, "PERMIT_DEADLINE_EXPIRED");

        // Unchecked because the only math done is incrementing
        // the owner's nonce which cannot realistically overflow.
        unchecked {
            address recoveredAddress = ecrecover(
                keccak256(
                    abi.encodePacked(
                        "\x19\x01",
                        DOMAIN_SEPARATOR(),
                        keccak256(
                            abi.encode(
                                keccak256(
                                    "Permit(address owner,address spender,uint256 value,uint256 nonce,uint256 deadline)"
                                ),
                                owner,
                                spender,
                                value,
                                nonces[owner]++,
                                deadline
                            )
                        )
                    )
                ),
                v,
                r,
                s
            );

            require(recoveredAddress != address(0) && recoveredAddress == owner, "INVALID_SIGNER");

            allowance[recoveredAddress][spender] = value;
        }

        emit Approval(owner, spender, value);
    }

    function DOMAIN_SEPARATOR() public view virtual returns (bytes32) {
        return block.chainid == INITIAL_CHAIN_ID ? INITIAL_DOMAIN_SEPARATOR : computeDomainSeparator();
    }

    function computeDomainSeparator() internal view virtual returns (bytes32) {
        return
            keccak256(
                abi.encode(
                    keccak256("EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)"),
                    keccak256(bytes(name)),
                    keccak256("1"),
                    block.chainid,
                    address(this)
                )
            );
    }

    /*//////////////////////////////////////////////////////////////
                        INTERNAL MINT/BURN LOGIC
    //////////////////////////////////////////////////////////////*/

    function _mint(address to, uint256 amount) internal virtual {
        totalSupply += amount;

        // Cannot overflow because the sum of all user
        // balances can't exceed the max uint256 value.
        unchecked {
            balanceOf[to] += amount;
        }

        emit Transfer(address(0), to, amount);
    }

    function _burn(address from, uint256 amount) internal virtual {
        balanceOf[from] -= amount;

        // Cannot underflow because a user's balance
        // will never be larger than the total supply.
        unchecked {
            totalSupply -= amount;
        }

        emit Transfer(from, address(0), amount);
    }
}

File 6 of 11 : 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 7 of 11 : IT2BRequest.sol
pragma solidity ^0.8.13;

interface IT2BRequest {
    struct T2BRequest {
        uint256 amount;
        address recipient;
        uint256 toChainId;
        address token;
    }
}

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

pragma solidity ^0.8.0;

import "../Strings.sol";

/**
 * @dev Elliptic Curve Digital Signature Algorithm (ECDSA) operations.
 *
 * These functions can be used to verify that a message was signed by the holder
 * of the private keys of a given address.
 */
library ECDSA {
    enum RecoverError {
        NoError,
        InvalidSignature,
        InvalidSignatureLength,
        InvalidSignatureS,
        InvalidSignatureV // Deprecated in v4.8
    }

    function _throwError(RecoverError error) private pure {
        if (error == RecoverError.NoError) {
            return; // no error: do nothing
        } else if (error == RecoverError.InvalidSignature) {
            revert("ECDSA: invalid signature");
        } else if (error == RecoverError.InvalidSignatureLength) {
            revert("ECDSA: invalid signature length");
        } else if (error == RecoverError.InvalidSignatureS) {
            revert("ECDSA: invalid signature 's' value");
        }
    }

    /**
     * @dev Returns the address that signed a hashed message (`hash`) with
     * `signature` or error string. This address can then be used for verification purposes.
     *
     * The `ecrecover` EVM opcode allows for malleable (non-unique) signatures:
     * this function rejects them by requiring the `s` value to be in the lower
     * half order, and the `v` value to be either 27 or 28.
     *
     * IMPORTANT: `hash` _must_ be the result of a hash operation for the
     * verification to be secure: it is possible to craft signatures that
     * recover to arbitrary addresses for non-hashed data. A safe way to ensure
     * this is by receiving a hash of the original message (which may otherwise
     * be too long), and then calling {toEthSignedMessageHash} on it.
     *
     * Documentation for signature generation:
     * - with https://web3js.readthedocs.io/en/v1.3.4/web3-eth-accounts.html#sign[Web3.js]
     * - with https://docs.ethers.io/v5/api/signer/#Signer-signMessage[ethers]
     *
     * _Available since v4.3._
     */
    function tryRecover(bytes32 hash, bytes memory signature) internal pure returns (address, RecoverError) {
        if (signature.length == 65) {
            bytes32 r;
            bytes32 s;
            uint8 v;
            // ecrecover takes the signature parameters, and the only way to get them
            // currently is to use assembly.
            /// @solidity memory-safe-assembly
            assembly {
                r := mload(add(signature, 0x20))
                s := mload(add(signature, 0x40))
                v := byte(0, mload(add(signature, 0x60)))
            }
            return tryRecover(hash, v, r, s);
        } else {
            return (address(0), RecoverError.InvalidSignatureLength);
        }
    }

    /**
     * @dev Returns the address that signed a hashed message (`hash`) with
     * `signature`. This address can then be used for verification purposes.
     *
     * The `ecrecover` EVM opcode allows for malleable (non-unique) signatures:
     * this function rejects them by requiring the `s` value to be in the lower
     * half order, and the `v` value to be either 27 or 28.
     *
     * IMPORTANT: `hash` _must_ be the result of a hash operation for the
     * verification to be secure: it is possible to craft signatures that
     * recover to arbitrary addresses for non-hashed data. A safe way to ensure
     * this is by receiving a hash of the original message (which may otherwise
     * be too long), and then calling {toEthSignedMessageHash} on it.
     */
    function recover(bytes32 hash, bytes memory signature) internal pure returns (address) {
        (address recovered, RecoverError error) = tryRecover(hash, signature);
        _throwError(error);
        return recovered;
    }

    /**
     * @dev Overload of {ECDSA-tryRecover} that receives the `r` and `vs` short-signature fields separately.
     *
     * See https://eips.ethereum.org/EIPS/eip-2098[EIP-2098 short signatures]
     *
     * _Available since v4.3._
     */
    function tryRecover(
        bytes32 hash,
        bytes32 r,
        bytes32 vs
    ) internal pure returns (address, RecoverError) {
        bytes32 s = vs & bytes32(0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff);
        uint8 v = uint8((uint256(vs) >> 255) + 27);
        return tryRecover(hash, v, r, s);
    }

    /**
     * @dev Overload of {ECDSA-recover} that receives the `r and `vs` short-signature fields separately.
     *
     * _Available since v4.2._
     */
    function recover(
        bytes32 hash,
        bytes32 r,
        bytes32 vs
    ) internal pure returns (address) {
        (address recovered, RecoverError error) = tryRecover(hash, r, vs);
        _throwError(error);
        return recovered;
    }

    /**
     * @dev Overload of {ECDSA-tryRecover} that receives the `v`,
     * `r` and `s` signature fields separately.
     *
     * _Available since v4.3._
     */
    function tryRecover(
        bytes32 hash,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) internal pure returns (address, RecoverError) {
        // EIP-2 still allows signature malleability for ecrecover(). Remove this possibility and make the signature
        // unique. Appendix F in the Ethereum Yellow paper (https://ethereum.github.io/yellowpaper/paper.pdf), defines
        // the valid range for s in (301): 0 < s < secp256k1n ÷ 2 + 1, and for v in (302): v ∈ {27, 28}. Most
        // signatures from current libraries generate a unique signature with an s-value in the lower half order.
        //
        // If your library generates malleable signatures, such as s-values in the upper range, calculate a new s-value
        // with 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEBAAEDCE6AF48A03BBFD25E8CD0364141 - s1 and flip v from 27 to 28 or
        // vice versa. If your library also generates signatures with 0/1 for v instead 27/28, add 27 to v to accept
        // these malleable signatures as well.
        if (uint256(s) > 0x7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5D576E7357A4501DDFE92F46681B20A0) {
            return (address(0), RecoverError.InvalidSignatureS);
        }

        // If the signature is valid (and not malleable), return the signer address
        address signer = ecrecover(hash, v, r, s);
        if (signer == address(0)) {
            return (address(0), RecoverError.InvalidSignature);
        }

        return (signer, RecoverError.NoError);
    }

    /**
     * @dev Overload of {ECDSA-recover} that receives the `v`,
     * `r` and `s` signature fields separately.
     */
    function recover(
        bytes32 hash,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) internal pure returns (address) {
        (address recovered, RecoverError error) = tryRecover(hash, v, r, s);
        _throwError(error);
        return recovered;
    }

    /**
     * @dev Returns an Ethereum Signed Message, created from a `hash`. This
     * produces hash corresponding to the one signed with the
     * https://eth.wiki/json-rpc/API#eth_sign[`eth_sign`]
     * JSON-RPC method as part of EIP-191.
     *
     * See {recover}.
     */
    function toEthSignedMessageHash(bytes32 hash) internal pure returns (bytes32) {
        // 32 is the length in bytes of hash,
        // enforced by the type signature above
        return keccak256(abi.encodePacked("\x19Ethereum Signed Message:\n32", hash));
    }

    /**
     * @dev Returns an Ethereum Signed Message, created from `s`. This
     * produces hash corresponding to the one signed with the
     * https://eth.wiki/json-rpc/API#eth_sign[`eth_sign`]
     * JSON-RPC method as part of EIP-191.
     *
     * See {recover}.
     */
    function toEthSignedMessageHash(bytes memory s) internal pure returns (bytes32) {
        return keccak256(abi.encodePacked("\x19Ethereum Signed Message:\n", Strings.toString(s.length), s));
    }

    /**
     * @dev Returns an Ethereum Signed Typed Data, created from a
     * `domainSeparator` and a `structHash`. This produces hash corresponding
     * to the one signed with the
     * https://eips.ethereum.org/EIPS/eip-712[`eth_signTypedData`]
     * JSON-RPC method as part of EIP-712.
     *
     * See {recover}.
     */
    function toTypedDataHash(bytes32 domainSeparator, bytes32 structHash) internal pure returns (bytes32) {
        return keccak256(abi.encodePacked("\x19\x01", domainSeparator, structHash));
    }
}

File 9 of 11 : Strings.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.7.0) (utils/Strings.sol)

pragma solidity ^0.8.0;

/**
 * @dev String operations.
 */
library Strings {
    bytes16 private constant _HEX_SYMBOLS = "0123456789abcdef";
    uint8 private constant _ADDRESS_LENGTH = 20;

    /**
     * @dev Converts a `uint256` to its ASCII `string` decimal representation.
     */
    function toString(uint256 value) internal pure returns (string memory) {
        // Inspired by OraclizeAPI's implementation - MIT licence
        // https://github.com/oraclize/ethereum-api/blob/b42146b063c7d6ee1358846c198246239e9360e8/oraclizeAPI_0.4.25.sol

        if (value == 0) {
            return "0";
        }
        uint256 temp = value;
        uint256 digits;
        while (temp != 0) {
            digits++;
            temp /= 10;
        }
        bytes memory buffer = new bytes(digits);
        while (value != 0) {
            digits -= 1;
            buffer[digits] = bytes1(uint8(48 + uint256(value % 10)));
            value /= 10;
        }
        return string(buffer);
    }

    /**
     * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation.
     */
    function toHexString(uint256 value) internal pure returns (string memory) {
        if (value == 0) {
            return "0x00";
        }
        uint256 temp = value;
        uint256 length = 0;
        while (temp != 0) {
            length++;
            temp >>= 8;
        }
        return toHexString(value, length);
    }

    /**
     * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length.
     */
    function toHexString(uint256 value, uint256 length) internal pure returns (string memory) {
        bytes memory buffer = new bytes(2 * length + 2);
        buffer[0] = "0";
        buffer[1] = "x";
        for (uint256 i = 2 * length + 1; i > 1; --i) {
            buffer[i] = _HEX_SYMBOLS[value & 0xf];
            value >>= 4;
        }
        require(value == 0, "Strings: hex length insufficient");
        return string(buffer);
    }

    /**
     * @dev Converts an `address` with fixed length of 20 bytes to its not checksummed ASCII `string` hexadecimal representation.
     */
    function toHexString(address addr) internal pure returns (string memory) {
        return toHexString(uint256(uint160(addr)), _ADDRESS_LENGTH);
    }
}

File 10 of 11 : SynapseVerifier.sol
// SPDX-License-Identifier: UNLICENSED
pragma solidity ^0.8.13;
import "../interfaces/ISynapseImpl.sol";

contract SynapseVerifier {
    address NATIVE_TOKEN_ADDRESS = 0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE;

    function bridgeERC20To(
        uint256 amount,
        bytes32 metadata,
        address receiverAddress,
        address token,
        uint256 toChainId,
        ISynapseImpl.SwapQuery calldata originQuery,
        ISynapseImpl.SwapQuery calldata destinationQuery
    ) external payable returns (ISynapseImpl.T2BRequest memory) {
        return
            ISynapseImpl.T2BRequest(amount, receiverAddress, toChainId, token);
    }

    function bridgeNativeTo(
        uint256 amount,
        bytes32 metadata,
        address receiverAddress,
        uint256 toChainId,
        ISynapseImpl.SwapQuery calldata originQuery,
        ISynapseImpl.SwapQuery calldata destinationQuery
    ) external view returns (ISynapseImpl.T2BRequest memory) {
        return
            ISynapseImpl.T2BRequest(
                amount,
                receiverAddress,
                toChainId,
                NATIVE_TOKEN_ADDRESS
            );
    }
}

File 11 of 11 : ISynapseImpl.sol
pragma solidity ^0.8.13;

interface ISynapseImpl {
    struct SwapQuery {
        address swapAdapter;
        address tokenOut;
        uint256 minAmountOut;
        uint256 deadline;
        bytes rawParams;
    }

    struct T2BRequest {
        uint256 amount;
        address recipient;
        uint256 toChainId;
        address token;
    }

    function bridgeERC20To(
        uint256 amount,
        bytes32 metadata,
        address receiverAddress,
        address token,
        uint256 toChainId,
        SwapQuery calldata originQuery,
        SwapQuery calldata destinationQuery
    ) external view returns (T2BRequest memory);

    function bridgeNativeTo(
        uint256 amount,
        bytes32 metadata,
        address receiverAddress,
        uint256 toChainId,
        SwapQuery calldata originQuery,
        SwapQuery calldata destinationQuery
    ) external view returns (T2BRequest memory);
}

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

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"address","name":"_owner","type":"address"},{"internalType":"address","name":"_socketGateway","type":"address"},{"internalType":"address","name":"_feeTakerAddress","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"BalanceMismatch","type":"error"},{"inputs":[],"name":"BridgingFailed","type":"error"},{"inputs":[],"name":"InvalidNonce","type":"error"},{"inputs":[],"name":"InvalidTokenAddress","type":"error"},{"inputs":[],"name":"OnlyNominee","type":"error"},{"inputs":[],"name":"OnlyOwner","type":"error"},{"inputs":[],"name":"SignerMismatch","type":"error"},{"inputs":[],"name":"UnsupportedBridge","type":"error"},{"inputs":[],"name":"VerificationCallFailed","type":"error"},{"inputs":[],"name":"ZeroAddress","type":"error"},{"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"},{"inputs":[],"name":"ETH_ADDRESS","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"fees","type":"uint256"},{"internalType":"uint256","name":"nonce","type":"uint256"},{"internalType":"bytes","name":"bridgeData","type":"bytes"},{"internalType":"bytes","name":"signature","type":"bytes"}],"name":"bridgeERC20","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint32","name":"","type":"uint32"}],"name":"bridgeVerifiers","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"claimOwner","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"receiver","type":"address"},{"internalType":"uint256","name":"toChainId","type":"uint256"}],"name":"deployApprovalContract","outputs":[{"internalType":"address","name":"approvalAddress","type":"address"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"emptyTokenList","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"feeTakerAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"receiver","type":"address"},{"internalType":"uint256","name":"toChainId","type":"uint256"}],"name":"getAddressFor","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"nextNonce","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"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":"address","name":"t2bReceiver_","type":"address"},{"internalType":"address","name":"token_","type":"address"},{"internalType":"address","name":"userAddress_","type":"address"},{"internalType":"uint256","name":"amount_","type":"uint256"}],"name":"rescueFromT2BReceiver","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":"uint32","name":"routeId","type":"uint32"},{"internalType":"address","name":"bridgeVerifier","type":"address"}],"name":"setBridgeVerifier","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_feeTakerAddress","type":"address"}],"name":"setFeeTakerAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_signerAddress","type":"address"}],"name":"setSignerAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"_tokens","type":"address[]"}],"name":"setSupportedTokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"signerAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"socketGateway","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"supportedTokens","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"}]

60a06040523480156200001157600080fd5b506040516200259f3803806200259f833981016040819052620000349162000091565b600080546001600160a01b039485166001600160a01b031991821617909155600180548216905591831660805260028054919093169116179055620000db565b80516001600160a01b03811681146200008c57600080fd5b919050565b600080600060608486031215620000a757600080fd5b620000b28462000074565b9250620000c26020850162000074565b9150620000d26040850162000074565b90509250925092565b6080516124936200010c600039600081816102d801528181611013015281816110b501526110ff01526124936000f3fe60806040523480156200001157600080fd5b5060043610620001955760003560e01c80636ccae05411620000e9578063c97093ae1162000097578063d9620611116200006e578063d962061114620003c9578063de81ea3014620003d3578063f3597fa314620003ea57600080fd5b8063c97093ae146200037a578063cdebe0c6146200039b578063d28e270f14620003b257600080fd5b8063a734f06e11620000cc578063a734f06e1462000330578063b9bb2f40146200034c578063c6255626146200036357600080fd5b80636ccae05414620002fa5780638da5cb5b146200031157600080fd5b80633bd1adec11620001475780635b7633d0116200012a5780635b7633d0146200029a5780635b94db2714620002bb578063678fcd6114620002d257600080fd5b80633bd1adec1462000279578063471b609c146200028357600080fd5b80630cd55abf116200017c5780630cd55abf14620001ca57806320f99c0a14620002005780632bdaca47146200024057600080fd5b8063046dc166146200019a5780630865d28614620001b3575b600080fd5b620001b1620001ab36600462001bd2565b62000401565b005b620001b1620001c436600462001c13565b6200049a565b620001ed620001db36600462001bd2565b60066020526000908152604090205481565b6040519081526020015b60405180910390f35b60015473ffffffffffffffffffffffffffffffffffffffff165b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001620001f7565b6200021a6200025136600462001c4f565b60056020526000908152604090205473ffffffffffffffffffffffffffffffffffffffff1681565b620001b162000547565b620001b16200029436600462001c6d565b620005d1565b6004546200021a9073ffffffffffffffffffffffffffffffffffffffff1681565b620001b1620002cc36600462001bd2565b620006d7565b6200021a7f000000000000000000000000000000000000000000000000000000000000000081565b620001b16200030b36600462001cc5565b62000798565b60005473ffffffffffffffffffffffffffffffffffffffff166200021a565b6200021a73eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee81565b6200021a6200035d36600462001d0b565b620008e6565b6200021a6200037436600462001d3a565b62000a84565b6002546200021a9073ffffffffffffffffffffffffffffffffffffffff1681565b620001b1620003ac36600462001d99565b62000abc565b620001b1620003c336600462001ea4565b620011d4565b620001b16200131b565b6200021a620003e436600462001d0b565b62001386565b620001b1620003fb36600462001bd2565b62001423565b60005473ffffffffffffffffffffffffffffffffffffffff16331462000453576040517f5fc483c500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600480547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055565b60005473ffffffffffffffffffffffffffffffffffffffff163314620004ec576040517f5fc483c500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b63ffffffff91909116600090815260056020526040902080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff909216919091179055565b60015473ffffffffffffffffffffffffffffffffffffffff16331462000599576040517f7c91ccdd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600080547fffffffffffffffffffffffff00000000000000000000000000000000000000009081163317909155600180549091169055565b60005473ffffffffffffffffffffffffffffffffffffffff16331462000623576040517f5fc483c500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff821662000671576040517fd92e233d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8273ffffffffffffffffffffffffffffffffffffffff163b600003620006c3576040517f1eb00b0600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b620006d183858484620014bc565b50505050565b60005473ffffffffffffffffffffffffffffffffffffffff16331462000729576040517f5fc483c500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83169081179091556040517f906a1c6bd7e3091ea86693dd029a831c19049ce77f1dce2ce0bab1cacbabce2290600090a250565b60005473ffffffffffffffffffffffffffffffffffffffff163314620007ea576040517f5fc483c500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff821662000838576040517fd92e233d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7fffffffffffffffffffffffff111111111111111111111111111111111111111273ffffffffffffffffffffffffffffffffffffffff8416016200088757620008828282620015b4565b505050565b8273ffffffffffffffffffffffffffffffffffffffff163b600003620008d9576040517f1eb00b0600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b620008828383836200162b565b6040805173ffffffffffffffffffffffffffffffffffffffff84166020820152908101829052600090819060600160405160208183030381529060405280519060200120905060ff60f81b308260405180602001620009459062001afb565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe082820381018352601f90910116604081815230602083015201604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815290829052620009bd929160200162001fa1565b6040516020818303038152906040528051906020012060405160200162000a4694939291907fff0000000000000000000000000000000000000000000000000000000000000094909416845260609290921b7fffffffffffffffffffffffffffffffffffffffff0000000000000000000000001660018401526015830152603582015260550190565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190528051602090910120949350505050565b6003818154811062000a9557600080fd5b60009182526020909120015473ffffffffffffffffffffffffffffffffffffffff16905081565b600062000b993087468a898960405160200162000adf9695949392919062001fc2565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529082905280516020918201207f19457468657265756d205369676e6564204d6573736167653a0a33320000000091830191909152603c820152605c016040516020818303038152906040528051906020012084848080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250620016fc92505050565b60045490915073ffffffffffffffffffffffffffffffffffffffff80831691161462000bf1576040517f10c74b0300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60045473ffffffffffffffffffffffffffffffffffffffff166000908152600660205260409020805460018101909155861462000c5a576040517f756688fe00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600060058162000c6e600482898b62002041565b62000c79916200206d565b60e01c815260208101919091526040016000205473ffffffffffffffffffffffffffffffffffffffff160362000cdb576040517f1da5310500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008060058162000cf06004828a8c62002041565b62000cfb916200206d565b60e01c815260208101919091526040016000205473ffffffffffffffffffffffffffffffffffffffff168760048862000d36600182620020e5565b9262000d459392919062002041565b60405162000d55929190620020ff565b6000604051808303816000865af19150503d806000811462000d94576040519150601f19603f3d011682016040523d82523d6000602084013e62000d99565b606091505b50915091508162000dd6576040517f9cd56f3c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008180602001905181019062000dee91906200210f565b9050600062000e0682602001518360400151620008e6565b825160608401516040517fdd62ed3e00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff80851660048301523060248301529394509192169063dd62ed3e90604401602060405180830381865afa15801562000e84573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000eaa91906200218a565b101562000f5a5760008260200151836040015160405160200162000ef092919073ffffffffffffffffffffffffffffffffffffffff929092168252602082015260400190565b604051602081830303815290604052805190602001209050803060405162000f189062001afb565b73ffffffffffffffffffffffffffffffffffffffff90911681526020018190604051809103906000f590508015801562000f56573d6000803e3d6000fd5b5050505b62000f9681308d856000015162000f729190620021a4565b606086015173ffffffffffffffffffffffffffffffffffffffff16929190620014bc565b8a1562000fcb57600254606083015162000fcb9173ffffffffffffffffffffffffffffffffffffffff91821691168d6200162b565b60608201516040517fdd62ed3e00000000000000000000000000000000000000000000000000000000815230600482015273ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000811660248301529091169063dd62ed3e90604401602060405180830381865afa15801562001064573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200108a91906200218a565b82511115620010fb576060820151620010fb9073ffffffffffffffffffffffffffffffffffffffff167f00000000000000000000000000000000000000000000000000000000000000007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff62001724565b60007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff168a8a60405162001146929190620020ff565b6000604051808303816000865af19150503d806000811462001185576040519150601f19603f3d011682016040523d82523d6000602084013e6200118a565b606091505b5050905080620011c6576040517f143fd2cb00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b505050505050505050505050565b60005473ffffffffffffffffffffffffffffffffffffffff16331462001226576040517f5fc483c500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60005b8151811015620012bf5760038282815181106200124a576200124a620021bf565b60209081029190910181015182546001810184556000938452919092200180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff90921691909117905580620012b681620021ee565b91505062001229565b5050600380546001810182556000919091527fc2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85b0180547fffffffffffffffffffffffff0000000000000000000000000000000000000000169055565b60005473ffffffffffffffffffffffffffffffffffffffff1633146200136d576040517f5fc483c500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60608051620013829060039060809062001b09565b5050565b6040805173ffffffffffffffffffffffffffffffffffffffff8416602082015290810182905260009081906060016040516020818303038152906040528051906020012090508030604051620013dc9062001afb565b73ffffffffffffffffffffffffffffffffffffffff90911681526020018190604051809103906000f59050801580156200141a573d6000803e3d6000fd5b50949350505050565b60005473ffffffffffffffffffffffffffffffffffffffff16331462001475576040517f5fc483c500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600280547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055565b60006040517f23b872dd00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8516600482015273ffffffffffffffffffffffffffffffffffffffff841660248201528260448201526020600060648360008a5af13d15601f3d1160016000511416171691505080620015ad576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f5452414e534645525f46524f4d5f4641494c454400000000000000000000000060448201526064015b60405180910390fd5b5050505050565b600080600080600085875af190508062000882576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601360248201527f4554485f5452414e534645525f4641494c4544000000000000000000000000006044820152606401620015a4565b60006040517fa9059cbb00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff84166004820152826024820152602060006044836000895af13d15601f3d1160016000511416171691505080620006d1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600f60248201527f5452414e534645525f4641494c454400000000000000000000000000000000006044820152606401620015a4565b60008060006200170d8585620017f5565b915091506200171c816200183e565b509392505050565b60006040517f095ea7b300000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff84166004820152826024820152602060006044836000895af13d15601f3d1160016000511416171691505080620006d1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600e60248201527f415050524f56455f4641494c45440000000000000000000000000000000000006044820152606401620015a4565b60008082516041036200182f5760208301516040840151606085015160001a620018228782858562001a07565b9450945050505062001837565b506000905060025b9250929050565b600081600481111562001855576200185562002229565b036200185e5750565b600181600481111562001875576200187562002229565b03620018de576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601860248201527f45434453413a20696e76616c6964207369676e617475726500000000000000006044820152606401620015a4565b6002816004811115620018f557620018f562002229565b036200195e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f45434453413a20696e76616c6964207369676e6174757265206c656e677468006044820152606401620015a4565b600381600481111562001975576200197562002229565b0362001a04576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202773272076616c60448201527f75650000000000000000000000000000000000000000000000000000000000006064820152608401620015a4565b50565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a083111562001a40575060009050600362001af2565b6040805160008082526020820180845289905260ff881692820192909252606081018690526080810185905260019060a0016020604051602081039080840390855afa15801562001a95573d6000803e3d6000fd5b50506040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0015191505073ffffffffffffffffffffffffffffffffffffffff811662001aeb5760006001925092505062001af2565b9150600090505b94509492505050565b610205806200225983390190565b82805482825590600052602060002090810192821562001b86579160200282015b8281111562001b8657825182547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff90911617825560209092019160019091019062001b2a565b5062001b9492915062001b98565b5090565b5b8082111562001b94576000815560010162001b99565b73ffffffffffffffffffffffffffffffffffffffff8116811462001a0457600080fd5b60006020828403121562001be557600080fd5b813562001bf28162001baf565b9392505050565b803563ffffffff8116811462001c0e57600080fd5b919050565b6000806040838503121562001c2757600080fd5b62001c328362001bf9565b9150602083013562001c448162001baf565b809150509250929050565b60006020828403121562001c6257600080fd5b62001bf28262001bf9565b6000806000806080858703121562001c8457600080fd5b843562001c918162001baf565b9350602085013562001ca38162001baf565b9250604085013562001cb58162001baf565b9396929550929360600135925050565b60008060006060848603121562001cdb57600080fd5b833562001ce88162001baf565b9250602084013562001cfa8162001baf565b929592945050506040919091013590565b6000806040838503121562001d1f57600080fd5b823562001d2c8162001baf565b946020939093013593505050565b60006020828403121562001d4d57600080fd5b5035919050565b60008083601f84011262001d6757600080fd5b50813567ffffffffffffffff81111562001d8057600080fd5b6020830191508360208285010111156200183757600080fd5b6000806000806000806080878903121562001db357600080fd5b8635955060208701359450604087013567ffffffffffffffff8082111562001dda57600080fd5b62001de88a838b0162001d54565b9096509450606089013591508082111562001e0257600080fd5b5062001e1189828a0162001d54565b979a9699509497509295939492505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff8111828210171562001e9c5762001e9c62001e23565b604052919050565b6000602080838503121562001eb857600080fd5b823567ffffffffffffffff8082111562001ed157600080fd5b818501915085601f83011262001ee657600080fd5b81358181111562001efb5762001efb62001e23565b8060051b915062001f0e84830162001e52565b818152918301840191848101908884111562001f2957600080fd5b938501935b8385101562001f57578435925062001f468362001baf565b828252938501939085019062001f2e565b98975050505050505050565b6000815160005b8181101562001f86576020818501810151868301520162001f6a565b8181111562001f96576000828601525b509290920192915050565b600062001fba62001fb3838662001f63565b8462001f63565b949350505050565b73ffffffffffffffffffffffffffffffffffffffff8716815285602082015284604082015283606082015260a060808201528160a0820152818360c0830137600081830160c090810191909152601f9092017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016010195945050505050565b600080858511156200205257600080fd5b838611156200206057600080fd5b5050820193919092039150565b7fffffffff000000000000000000000000000000000000000000000000000000008135818116916004851015620020ae5780818660040360031b1b83161692505b505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600082821015620020fa57620020fa620020b6565b500390565b8183823760009101908152919050565b6000608082840312156200212257600080fd5b6040516080810181811067ffffffffffffffff8211171562002148576200214862001e23565b6040528251815260208301516200215f8162001baf565b60208201526040838101519082015260608301516200217e8162001baf565b60608201529392505050565b6000602082840312156200219d57600080fd5b5051919050565b60008219821115620021ba57620021ba620020b6565b500190565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203620022225762002222620020b6565b5060010190565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fdfe608060405234801561001057600080fd5b5060405161020538038061020583398101604081905261002f916101d4565b8060005b604051636312ab1360e11b8152600481018290526000906001600160a01b0384169063c625562690602401602060405180830381865afa15801561007b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061009f91906101d4565b6001600160a01b0316146101475761013f82600019846001600160a01b031663c6255626856040518263ffffffff1660e01b81526004016100e291815260200190565b602060405180830381865afa1580156100ff573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061012391906101d4565b6001600160a01b031661014a60201b610009179092919060201c565b600101610033565b33ff5b600060405163095ea7b360e01b81526001600160a01b0384166004820152826024820152602060006044836000895af13d15601f3d11600160005114161716915050806101ce5760405162461bcd60e51b815260206004820152600e60248201526d1054141493d59157d1905253115160921b604482015260640160405180910390fd5b50505050565b6000602082840312156101e657600080fd5b81516001600160a01b03811681146101fd57600080fd5b939250505056fea2646970667358221220857383cce2fe96ed338a0c6f2b3640bc7b712135e46fea7ac41f3528e903e4db64736f6c634300080d0033000000000000000000000000e8dd38e673a93ccfc2e3d7053efccb5c93f493650000000000000000000000003a23f943181408eac424116af7b7790c94cb97a50000000000000000000000000e1b5ab67af1c99f8c7ebc71f41f75d4d6211e53

Deployed Bytecode

0x60806040523480156200001157600080fd5b5060043610620001955760003560e01c80636ccae05411620000e9578063c97093ae1162000097578063d9620611116200006e578063d962061114620003c9578063de81ea3014620003d3578063f3597fa314620003ea57600080fd5b8063c97093ae146200037a578063cdebe0c6146200039b578063d28e270f14620003b257600080fd5b8063a734f06e11620000cc578063a734f06e1462000330578063b9bb2f40146200034c578063c6255626146200036357600080fd5b80636ccae05414620002fa5780638da5cb5b146200031157600080fd5b80633bd1adec11620001475780635b7633d0116200012a5780635b7633d0146200029a5780635b94db2714620002bb578063678fcd6114620002d257600080fd5b80633bd1adec1462000279578063471b609c146200028357600080fd5b80630cd55abf116200017c5780630cd55abf14620001ca57806320f99c0a14620002005780632bdaca47146200024057600080fd5b8063046dc166146200019a5780630865d28614620001b3575b600080fd5b620001b1620001ab36600462001bd2565b62000401565b005b620001b1620001c436600462001c13565b6200049a565b620001ed620001db36600462001bd2565b60066020526000908152604090205481565b6040519081526020015b60405180910390f35b60015473ffffffffffffffffffffffffffffffffffffffff165b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001620001f7565b6200021a6200025136600462001c4f565b60056020526000908152604090205473ffffffffffffffffffffffffffffffffffffffff1681565b620001b162000547565b620001b16200029436600462001c6d565b620005d1565b6004546200021a9073ffffffffffffffffffffffffffffffffffffffff1681565b620001b1620002cc36600462001bd2565b620006d7565b6200021a7f0000000000000000000000003a23f943181408eac424116af7b7790c94cb97a581565b620001b16200030b36600462001cc5565b62000798565b60005473ffffffffffffffffffffffffffffffffffffffff166200021a565b6200021a73eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee81565b6200021a6200035d36600462001d0b565b620008e6565b6200021a6200037436600462001d3a565b62000a84565b6002546200021a9073ffffffffffffffffffffffffffffffffffffffff1681565b620001b1620003ac36600462001d99565b62000abc565b620001b1620003c336600462001ea4565b620011d4565b620001b16200131b565b6200021a620003e436600462001d0b565b62001386565b620001b1620003fb36600462001bd2565b62001423565b60005473ffffffffffffffffffffffffffffffffffffffff16331462000453576040517f5fc483c500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600480547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055565b60005473ffffffffffffffffffffffffffffffffffffffff163314620004ec576040517f5fc483c500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b63ffffffff91909116600090815260056020526040902080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff909216919091179055565b60015473ffffffffffffffffffffffffffffffffffffffff16331462000599576040517f7c91ccdd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600080547fffffffffffffffffffffffff00000000000000000000000000000000000000009081163317909155600180549091169055565b60005473ffffffffffffffffffffffffffffffffffffffff16331462000623576040517f5fc483c500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff821662000671576040517fd92e233d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8273ffffffffffffffffffffffffffffffffffffffff163b600003620006c3576040517f1eb00b0600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b620006d183858484620014bc565b50505050565b60005473ffffffffffffffffffffffffffffffffffffffff16331462000729576040517f5fc483c500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83169081179091556040517f906a1c6bd7e3091ea86693dd029a831c19049ce77f1dce2ce0bab1cacbabce2290600090a250565b60005473ffffffffffffffffffffffffffffffffffffffff163314620007ea576040517f5fc483c500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff821662000838576040517fd92e233d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7fffffffffffffffffffffffff111111111111111111111111111111111111111273ffffffffffffffffffffffffffffffffffffffff8416016200088757620008828282620015b4565b505050565b8273ffffffffffffffffffffffffffffffffffffffff163b600003620008d9576040517f1eb00b0600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b620008828383836200162b565b6040805173ffffffffffffffffffffffffffffffffffffffff84166020820152908101829052600090819060600160405160208183030381529060405280519060200120905060ff60f81b308260405180602001620009459062001afb565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe082820381018352601f90910116604081815230602083015201604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815290829052620009bd929160200162001fa1565b6040516020818303038152906040528051906020012060405160200162000a4694939291907fff0000000000000000000000000000000000000000000000000000000000000094909416845260609290921b7fffffffffffffffffffffffffffffffffffffffff0000000000000000000000001660018401526015830152603582015260550190565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190528051602090910120949350505050565b6003818154811062000a9557600080fd5b60009182526020909120015473ffffffffffffffffffffffffffffffffffffffff16905081565b600062000b993087468a898960405160200162000adf9695949392919062001fc2565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529082905280516020918201207f19457468657265756d205369676e6564204d6573736167653a0a33320000000091830191909152603c820152605c016040516020818303038152906040528051906020012084848080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250620016fc92505050565b60045490915073ffffffffffffffffffffffffffffffffffffffff80831691161462000bf1576040517f10c74b0300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60045473ffffffffffffffffffffffffffffffffffffffff166000908152600660205260409020805460018101909155861462000c5a576040517f756688fe00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600060058162000c6e600482898b62002041565b62000c79916200206d565b60e01c815260208101919091526040016000205473ffffffffffffffffffffffffffffffffffffffff160362000cdb576040517f1da5310500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008060058162000cf06004828a8c62002041565b62000cfb916200206d565b60e01c815260208101919091526040016000205473ffffffffffffffffffffffffffffffffffffffff168760048862000d36600182620020e5565b9262000d459392919062002041565b60405162000d55929190620020ff565b6000604051808303816000865af19150503d806000811462000d94576040519150601f19603f3d011682016040523d82523d6000602084013e62000d99565b606091505b50915091508162000dd6576040517f9cd56f3c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008180602001905181019062000dee91906200210f565b9050600062000e0682602001518360400151620008e6565b825160608401516040517fdd62ed3e00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff80851660048301523060248301529394509192169063dd62ed3e90604401602060405180830381865afa15801562000e84573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000eaa91906200218a565b101562000f5a5760008260200151836040015160405160200162000ef092919073ffffffffffffffffffffffffffffffffffffffff929092168252602082015260400190565b604051602081830303815290604052805190602001209050803060405162000f189062001afb565b73ffffffffffffffffffffffffffffffffffffffff90911681526020018190604051809103906000f590508015801562000f56573d6000803e3d6000fd5b5050505b62000f9681308d856000015162000f729190620021a4565b606086015173ffffffffffffffffffffffffffffffffffffffff16929190620014bc565b8a1562000fcb57600254606083015162000fcb9173ffffffffffffffffffffffffffffffffffffffff91821691168d6200162b565b60608201516040517fdd62ed3e00000000000000000000000000000000000000000000000000000000815230600482015273ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000003a23f943181408eac424116af7b7790c94cb97a5811660248301529091169063dd62ed3e90604401602060405180830381865afa15801562001064573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200108a91906200218a565b82511115620010fb576060820151620010fb9073ffffffffffffffffffffffffffffffffffffffff167f0000000000000000000000003a23f943181408eac424116af7b7790c94cb97a57fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff62001724565b60007f0000000000000000000000003a23f943181408eac424116af7b7790c94cb97a573ffffffffffffffffffffffffffffffffffffffff168a8a60405162001146929190620020ff565b6000604051808303816000865af19150503d806000811462001185576040519150601f19603f3d011682016040523d82523d6000602084013e6200118a565b606091505b5050905080620011c6576040517f143fd2cb00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b505050505050505050505050565b60005473ffffffffffffffffffffffffffffffffffffffff16331462001226576040517f5fc483c500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60005b8151811015620012bf5760038282815181106200124a576200124a620021bf565b60209081029190910181015182546001810184556000938452919092200180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff90921691909117905580620012b681620021ee565b91505062001229565b5050600380546001810182556000919091527fc2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85b0180547fffffffffffffffffffffffff0000000000000000000000000000000000000000169055565b60005473ffffffffffffffffffffffffffffffffffffffff1633146200136d576040517f5fc483c500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60608051620013829060039060809062001b09565b5050565b6040805173ffffffffffffffffffffffffffffffffffffffff8416602082015290810182905260009081906060016040516020818303038152906040528051906020012090508030604051620013dc9062001afb565b73ffffffffffffffffffffffffffffffffffffffff90911681526020018190604051809103906000f59050801580156200141a573d6000803e3d6000fd5b50949350505050565b60005473ffffffffffffffffffffffffffffffffffffffff16331462001475576040517f5fc483c500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600280547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055565b60006040517f23b872dd00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8516600482015273ffffffffffffffffffffffffffffffffffffffff841660248201528260448201526020600060648360008a5af13d15601f3d1160016000511416171691505080620015ad576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f5452414e534645525f46524f4d5f4641494c454400000000000000000000000060448201526064015b60405180910390fd5b5050505050565b600080600080600085875af190508062000882576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601360248201527f4554485f5452414e534645525f4641494c4544000000000000000000000000006044820152606401620015a4565b60006040517fa9059cbb00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff84166004820152826024820152602060006044836000895af13d15601f3d1160016000511416171691505080620006d1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600f60248201527f5452414e534645525f4641494c454400000000000000000000000000000000006044820152606401620015a4565b60008060006200170d8585620017f5565b915091506200171c816200183e565b509392505050565b60006040517f095ea7b300000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff84166004820152826024820152602060006044836000895af13d15601f3d1160016000511416171691505080620006d1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600e60248201527f415050524f56455f4641494c45440000000000000000000000000000000000006044820152606401620015a4565b60008082516041036200182f5760208301516040840151606085015160001a620018228782858562001a07565b9450945050505062001837565b506000905060025b9250929050565b600081600481111562001855576200185562002229565b036200185e5750565b600181600481111562001875576200187562002229565b03620018de576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601860248201527f45434453413a20696e76616c6964207369676e617475726500000000000000006044820152606401620015a4565b6002816004811115620018f557620018f562002229565b036200195e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f45434453413a20696e76616c6964207369676e6174757265206c656e677468006044820152606401620015a4565b600381600481111562001975576200197562002229565b0362001a04576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202773272076616c60448201527f75650000000000000000000000000000000000000000000000000000000000006064820152608401620015a4565b50565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a083111562001a40575060009050600362001af2565b6040805160008082526020820180845289905260ff881692820192909252606081018690526080810185905260019060a0016020604051602081039080840390855afa15801562001a95573d6000803e3d6000fd5b50506040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0015191505073ffffffffffffffffffffffffffffffffffffffff811662001aeb5760006001925092505062001af2565b9150600090505b94509492505050565b610205806200225983390190565b82805482825590600052602060002090810192821562001b86579160200282015b8281111562001b8657825182547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff90911617825560209092019160019091019062001b2a565b5062001b9492915062001b98565b5090565b5b8082111562001b94576000815560010162001b99565b73ffffffffffffffffffffffffffffffffffffffff8116811462001a0457600080fd5b60006020828403121562001be557600080fd5b813562001bf28162001baf565b9392505050565b803563ffffffff8116811462001c0e57600080fd5b919050565b6000806040838503121562001c2757600080fd5b62001c328362001bf9565b9150602083013562001c448162001baf565b809150509250929050565b60006020828403121562001c6257600080fd5b62001bf28262001bf9565b6000806000806080858703121562001c8457600080fd5b843562001c918162001baf565b9350602085013562001ca38162001baf565b9250604085013562001cb58162001baf565b9396929550929360600135925050565b60008060006060848603121562001cdb57600080fd5b833562001ce88162001baf565b9250602084013562001cfa8162001baf565b929592945050506040919091013590565b6000806040838503121562001d1f57600080fd5b823562001d2c8162001baf565b946020939093013593505050565b60006020828403121562001d4d57600080fd5b5035919050565b60008083601f84011262001d6757600080fd5b50813567ffffffffffffffff81111562001d8057600080fd5b6020830191508360208285010111156200183757600080fd5b6000806000806000806080878903121562001db357600080fd5b8635955060208701359450604087013567ffffffffffffffff8082111562001dda57600080fd5b62001de88a838b0162001d54565b9096509450606089013591508082111562001e0257600080fd5b5062001e1189828a0162001d54565b979a9699509497509295939492505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff8111828210171562001e9c5762001e9c62001e23565b604052919050565b6000602080838503121562001eb857600080fd5b823567ffffffffffffffff8082111562001ed157600080fd5b818501915085601f83011262001ee657600080fd5b81358181111562001efb5762001efb62001e23565b8060051b915062001f0e84830162001e52565b818152918301840191848101908884111562001f2957600080fd5b938501935b8385101562001f57578435925062001f468362001baf565b828252938501939085019062001f2e565b98975050505050505050565b6000815160005b8181101562001f86576020818501810151868301520162001f6a565b8181111562001f96576000828601525b509290920192915050565b600062001fba62001fb3838662001f63565b8462001f63565b949350505050565b73ffffffffffffffffffffffffffffffffffffffff8716815285602082015284604082015283606082015260a060808201528160a0820152818360c0830137600081830160c090810191909152601f9092017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016010195945050505050565b600080858511156200205257600080fd5b838611156200206057600080fd5b5050820193919092039150565b7fffffffff000000000000000000000000000000000000000000000000000000008135818116916004851015620020ae5780818660040360031b1b83161692505b505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600082821015620020fa57620020fa620020b6565b500390565b8183823760009101908152919050565b6000608082840312156200212257600080fd5b6040516080810181811067ffffffffffffffff8211171562002148576200214862001e23565b6040528251815260208301516200215f8162001baf565b60208201526040838101519082015260608301516200217e8162001baf565b60608201529392505050565b6000602082840312156200219d57600080fd5b5051919050565b60008219821115620021ba57620021ba620020b6565b500190565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203620022225762002222620020b6565b5060010190565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fdfe608060405234801561001057600080fd5b5060405161020538038061020583398101604081905261002f916101d4565b8060005b604051636312ab1360e11b8152600481018290526000906001600160a01b0384169063c625562690602401602060405180830381865afa15801561007b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061009f91906101d4565b6001600160a01b0316146101475761013f82600019846001600160a01b031663c6255626856040518263ffffffff1660e01b81526004016100e291815260200190565b602060405180830381865afa1580156100ff573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061012391906101d4565b6001600160a01b031661014a60201b610009179092919060201c565b600101610033565b33ff5b600060405163095ea7b360e01b81526001600160a01b0384166004820152826024820152602060006044836000895af13d15601f3d11600160005114161716915050806101ce5760405162461bcd60e51b815260206004820152600e60248201526d1054141493d59157d1905253115160921b604482015260640160405180910390fd5b50505050565b6000602082840312156101e657600080fd5b81516001600160a01b03811681146101fd57600080fd5b939250505056fea2646970667358221220857383cce2fe96ed338a0c6f2b3640bc7b712135e46fea7ac41f3528e903e4db64736f6c634300080d0033

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

000000000000000000000000e8dd38e673a93ccfc2e3d7053efccb5c93f493650000000000000000000000003a23f943181408eac424116af7b7790c94cb97a50000000000000000000000000e1b5ab67af1c99f8c7ebc71f41f75d4d6211e53

-----Decoded View---------------
Arg [0] : _owner (address): 0xe8dD38E673A93ccFC2E3d7053efcCb5c93F49365
Arg [1] : _socketGateway (address): 0x3a23F943181408EAC424116Af7b7790c94Cb97a5
Arg [2] : _feeTakerAddress (address): 0x0E1B5AB67aF1c99F8c7Ebc71f41f75D4D6211e53

-----Encoded View---------------
3 Constructor Arguments found :
Arg [0] : 000000000000000000000000e8dd38e673a93ccfc2e3d7053efccb5c93f49365
Arg [1] : 0000000000000000000000003a23f943181408eac424116af7b7790c94cb97a5
Arg [2] : 0000000000000000000000000e1b5ab67af1c99f8c7ebc71f41f75d4d6211e53


Block Transaction Difficulty Gas Used Reward
View All Blocks Produced

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

Validator Index Block Amount
View All Withdrawals

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

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