Contract 0xce8f24a58d85ed5c5a6824f7be1f8d4711a0eb4c 12

 
Txn Hash Method
Block
From
To
Value
0x348bf61c0ff5dacce2c67f43b926949d63d249358d47c12df48d0ef7185fa55fMeta Route10216592023-06-07 14:59:5938 mins ago0x3de44134ac73893c63fd5bbb0e912ef10a586cc6 IN  0xce8f24a58d85ed5c5a6824f7be1f8d4711a0eb4c0.0225 Ether0.0004502711
0x21d9aaa89cebefebcab2f305f18e74e4d354f40660b88bef0765f86790c7041eMeta Route10216572023-06-07 14:57:5740 mins ago0x3de44134ac73893c63fd5bbb0e912ef10a586cc6 IN  0xce8f24a58d85ed5c5a6824f7be1f8d4711a0eb4c0.022 Ether0.0004150881
0x4e3f0d95ffae869ad6051f258e7f41d2b1ac7390d5ecd5497c58fa52ca18da68Meta Route10216542023-06-07 14:54:2444 mins ago0x3de44134ac73893c63fd5bbb0e912ef10a586cc6 IN  0xce8f24a58d85ed5c5a6824f7be1f8d4711a0eb4c0.023 Ether0.0004346781
0xe168b9e3ae964484cf75806679e455f7226dbccec993d993c8ab277d30640508Meta Route10216512023-06-07 14:49:2049 mins ago0x3de44134ac73893c63fd5bbb0e912ef10a586cc6 IN  0xce8f24a58d85ed5c5a6824f7be1f8d4711a0eb4c0 Ether0.0004761011
0x43c42c43b3e4e5d7a6bf7fd09e1790c4576f4cc7314c555ae3c147bd0e2ab59eMeta Route10215572023-06-07 9:34:386 hrs 4 mins ago0xadff2bf10cac8c2124a5a7a85f4a2a394c1f3732 IN  0xce8f24a58d85ed5c5a6824f7be1f8d4711a0eb4c0.0085 Ether0.0005056131
0xa608cf943f83967fbdb4eef089e65cf34089903300e8417785e8959c2f62c04cMeta Route10215562023-06-07 9:31:576 hrs 6 mins ago0xadff2bf10cac8c2124a5a7a85f4a2a394c1f3732 IN  0xce8f24a58d85ed5c5a6824f7be1f8d4711a0eb4c0 Ether0.0005397431
0xcfe3cab3d3726536107b8ef08e08106146765db53e308d8c567b55a1a6daa3beMeta Route10210232023-06-05 17:41:451 day 21 hrs ago0xb13d68961c75161ad66f96ed9070ea69ac6dd9d4 IN  0xce8f24a58d85ed5c5a6824f7be1f8d4711a0eb4c0.01 Ether0.0006577941
0x06aaa9e831a87bde176e62e4251454955e055e9fcb63a2a197418608b5dace6bMeta Route10209542023-06-05 15:13:132 days 25 mins ago0x20414830660bd39e6245978452ce4ac188524100 IN  0xce8f24a58d85ed5c5a6824f7be1f8d4711a0eb4c0 Ether0.0011185142651.265
0xe97947dcf9fc5668afa8b9f25eac52b8d92dc999b45353c567e43f1ec77c142dMeta Route10209372023-06-05 13:52:142 days 1 hr ago0x603c54e34e034409eff91f708028ddfbea664d64 IN  0xce8f24a58d85ed5c5a6824f7be1f8d4711a0eb4c0.01 Ether0.0008241259951.265
0xa92eb7c153277c3cd31869eae32f28bf2c21d8c474ca0c297d09671baf5f9df2Meta Route10209032023-06-05 11:58:042 days 3 hrs ago0x689e4c24a7294129ad7e8c1d3814c62afacdade5 IN  0xce8f24a58d85ed5c5a6824f7be1f8d4711a0eb4c0 Ether0.00067380821.3
0x375aee13022dcc4a3ecb2371805bc8b1e9ee6d522583058043fda8f6d9f37e2fMeta Route10208852023-06-05 11:33:082 days 4 hrs ago0xc89b4bf0b92da7e2dada454167d136be8735fb16 IN  0xce8f24a58d85ed5c5a6824f7be1f8d4711a0eb4c0.0085 Ether0.00061016541.3
0x32a6e3bd00dce06943c7ecb32ccc97d0cab9f4f06f8f6b4a40ef8ca18071dddcMeta Route10208722023-06-05 9:58:552 days 5 hrs ago0xb6c96272cf10c5c966364232d43d522aa343082b IN  0xce8f24a58d85ed5c5a6824f7be1f8d4711a0eb4c0.0095 Ether0.00062251931.3
0x861a07788a430778fd3249a6758e0bc66dde4f9115de8783675a659bd3eb6441Meta Route10208712023-06-05 9:58:392 days 5 hrs ago0x3b0f16957286c532b1b7af9de3e68383acbfbbe6 IN  0xce8f24a58d85ed5c5a6824f7be1f8d4711a0eb4c0 Ether0.0003926921
0xd0a0f3f92e86cac0381fc1f85158569f436ec03937b2aa455ea7ff8f3268bf81Meta Route10208562023-06-05 8:44:092 days 6 hrs ago0xe377bd085384cb5ba6e8d268c9609c79542bea70 IN  0xce8f24a58d85ed5c5a6824f7be1f8d4711a0eb4c0.0195 Ether0.00066555581.3
0x04cbd0affe8112729715c6981eb8e409fab1b25edafa2def9b0badd10baa111fMeta Route10208352023-06-05 6:47:142 days 8 hrs ago0x63379a990db3aac431ed666926b30a8e9b4fdb96 IN  0xce8f24a58d85ed5c5a6824f7be1f8d4711a0eb4c0 Ether0.0005602351.3
0x1d77eda6197b8f2cf2066f0ec2a63e0df3cfd5e48dbcb5877e74721a01dbaa05Meta Route10208322023-06-05 6:38:332 days 9 hrs ago0x5aa772ffaa3bd938603bb571c09982900dee6a26 IN  0xce8f24a58d85ed5c5a6824f7be1f8d4711a0eb4c0.0195 Ether0.00067057251.3
0xb385d244b288d58133c3fbd6edee58630e29dfe9e0622e19d9042ee79fbc6bdbMeta Route10208292023-06-05 6:28:442 days 9 hrs ago0xbe8731b6172dc27f4757ce94afafa435d9108735 IN  0xce8f24a58d85ed5c5a6824f7be1f8d4711a0eb4c0 Ether0.0003976551
0xabd4d668c087985d825036f9a5e87be92aa40b7a67aa59a520e0433555e17fcaMeta Route10208272023-06-05 6:27:152 days 9 hrs ago0xbe8731b6172dc27f4757ce94afafa435d9108735 IN  0xce8f24a58d85ed5c5a6824f7be1f8d4711a0eb4c0 Ether0.0003985071
0x715c8e7206016f76ded375abc9278833c9e19ad156c32a159c466c02c92132e7Meta Route10206842023-06-04 17:24:592 days 22 hrs ago0x5a0f48835ed76f1d8abdfe1433f0a5aa36a8304f IN  0xce8f24a58d85ed5c5a6824f7be1f8d4711a0eb4c0.02 Ether0.00063710791.3
0x0e6dac425df0bed11ddd27931f28529dbc2b8bdf8c9179fb6143e08770575198Meta Route10206442023-06-04 14:07:173 days 1 hr ago0x38d6db47ab4e44fe22aff0e582b4e84fd614b8f1 IN  0xce8f24a58d85ed5c5a6824f7be1f8d4711a0eb4c0.02 Ether0.00062784021.3
0x2bdd686706eabac16227e201c0f2eff62a2fa869efe5d47f3695794ca24c387bMeta Route10206142023-06-04 12:00:023 days 3 hrs ago0x75b359c18ceb423fc43ef1ca96b3a1bd94a6196e IN  0xce8f24a58d85ed5c5a6824f7be1f8d4711a0eb4c0.02 Ether0.00061250411.3
0xb18606cb5203248321baa642139e12bca8b02879e7db17c965325fcb1405b62cMeta Route10205972023-06-04 10:09:343 days 5 hrs ago0x20418b7af5ec5f1ae2bbccae7c4cb91c7a7f51c9 IN  0xce8f24a58d85ed5c5a6824f7be1f8d4711a0eb4c0 Ether0.00072940981.4
0xd2669e8b2d07920c7ab9db00263acc174573d63c1f2fbe9c394f4db9ad7c7e88Meta Route10205902023-06-04 9:35:083 days 6 hrs ago0x1cfbc5276e46b496a0fc26fc3b48e95506a877f3 IN  0xce8f24a58d85ed5c5a6824f7be1f8d4711a0eb4c0.02 Ether0.00061651721.3
0x0e383acd7f37e91d2a78321da8f1021230cb45cc860949f635f057620c2d1176Meta Route10205682023-06-04 7:37:523 days 8 hrs ago0x420ec282c042af34d018279fa9399995220d47d5 IN  0xce8f24a58d85ed5c5a6824f7be1f8d4711a0eb4c0.02001 Ether0.00060519161.3
0xaeed21053542f3d07420008e37ec8d6ef9875cdc4ba2d7f5764aa581f5dc34afMeta Route10205032023-06-04 0:25:553 days 15 hrs ago0xc06bb909de25a2c5c4ef7752c07e208b815b1722 IN  0xce8f24a58d85ed5c5a6824f7be1f8d4711a0eb4c0.48 Ether0.00060789171.3
[ Download CSV Export 
Latest 25 internal transaction
Parent Txn Hash Block From To Value
0x348bf61c0ff5dacce2c67f43b926949d63d249358d47c12df48d0ef7185fa55f10216592023-06-07 14:59:5938 mins ago 0xce8f24a58d85ed5c5a6824f7be1f8d4711a0eb4c 0xb8f275fbf7a959f4bce59999a2ef122a099e81a80 Ether
0x348bf61c0ff5dacce2c67f43b926949d63d249358d47c12df48d0ef7185fa55f10216592023-06-07 14:59:5938 mins ago 0xce8f24a58d85ed5c5a6824f7be1f8d4711a0eb4cBoba Network: USDC Token0 Ether
0x348bf61c0ff5dacce2c67f43b926949d63d249358d47c12df48d0ef7185fa55f10216592023-06-07 14:59:5938 mins ago 0xce8f24a58d85ed5c5a6824f7be1f8d4711a0eb4cBoba Network: USDC Token0 Ether
0x348bf61c0ff5dacce2c67f43b926949d63d249358d47c12df48d0ef7185fa55f10216592023-06-07 14:59:5938 mins ago 0xce8f24a58d85ed5c5a6824f7be1f8d4711a0eb4c SushiSwap: Sushi Swap Router0.0225 Ether
0x21d9aaa89cebefebcab2f305f18e74e4d354f40660b88bef0765f86790c7041e10216572023-06-07 14:57:5740 mins ago 0xce8f24a58d85ed5c5a6824f7be1f8d4711a0eb4c 0xb8f275fbf7a959f4bce59999a2ef122a099e81a80 Ether
0x21d9aaa89cebefebcab2f305f18e74e4d354f40660b88bef0765f86790c7041e10216572023-06-07 14:57:5740 mins ago 0xce8f24a58d85ed5c5a6824f7be1f8d4711a0eb4cBoba Network: USDC Token0 Ether
0x21d9aaa89cebefebcab2f305f18e74e4d354f40660b88bef0765f86790c7041e10216572023-06-07 14:57:5740 mins ago 0xce8f24a58d85ed5c5a6824f7be1f8d4711a0eb4cBoba Network: USDC Token0 Ether
0x21d9aaa89cebefebcab2f305f18e74e4d354f40660b88bef0765f86790c7041e10216572023-06-07 14:57:5740 mins ago 0xce8f24a58d85ed5c5a6824f7be1f8d4711a0eb4c SushiSwap: Sushi Swap Router0.022 Ether
0x4e3f0d95ffae869ad6051f258e7f41d2b1ac7390d5ecd5497c58fa52ca18da6810216542023-06-07 14:54:2444 mins ago 0xce8f24a58d85ed5c5a6824f7be1f8d4711a0eb4c 0xb8f275fbf7a959f4bce59999a2ef122a099e81a80 Ether
0x4e3f0d95ffae869ad6051f258e7f41d2b1ac7390d5ecd5497c58fa52ca18da6810216542023-06-07 14:54:2444 mins ago 0xce8f24a58d85ed5c5a6824f7be1f8d4711a0eb4cBoba Network: USDC Token0 Ether
0x4e3f0d95ffae869ad6051f258e7f41d2b1ac7390d5ecd5497c58fa52ca18da6810216542023-06-07 14:54:2444 mins ago 0xce8f24a58d85ed5c5a6824f7be1f8d4711a0eb4cBoba Network: USDC Token0 Ether
0x4e3f0d95ffae869ad6051f258e7f41d2b1ac7390d5ecd5497c58fa52ca18da6810216542023-06-07 14:54:2444 mins ago 0xce8f24a58d85ed5c5a6824f7be1f8d4711a0eb4c SushiSwap: Sushi Swap Router0.023 Ether
0xe168b9e3ae964484cf75806679e455f7226dbccec993d993c8ab277d3064050810216512023-06-07 14:49:2049 mins ago 0xce8f24a58d85ed5c5a6824f7be1f8d4711a0eb4c 0xb8f275fbf7a959f4bce59999a2ef122a099e81a80 Ether
0xe168b9e3ae964484cf75806679e455f7226dbccec993d993c8ab277d3064050810216512023-06-07 14:49:2049 mins ago 0xce8f24a58d85ed5c5a6824f7be1f8d4711a0eb4cBoba Network: USDC Token0 Ether
0xe168b9e3ae964484cf75806679e455f7226dbccec993d993c8ab277d3064050810216512023-06-07 14:49:2049 mins ago 0xce8f24a58d85ed5c5a6824f7be1f8d4711a0eb4c0xadb2d3b711bb8d8ea92ff70292c466140432c2780 Ether
0x77a28389cd9ce46944ba2955ac53d41e8a2bd996ab5e69caf0e53b8f5c65716b10216472023-06-07 14:45:3253 mins ago 0xce8f24a58d85ed5c5a6824f7be1f8d4711a0eb4c SushiSwap: Sushi Swap Router0 Ether
0x77a28389cd9ce46944ba2955ac53d41e8a2bd996ab5e69caf0e53b8f5c65716b10216472023-06-07 14:45:3253 mins ago 0xce8f24a58d85ed5c5a6824f7be1f8d4711a0eb4cBoba Network: USDC Token0 Ether
0x77a28389cd9ce46944ba2955ac53d41e8a2bd996ab5e69caf0e53b8f5c65716b10216472023-06-07 14:45:3253 mins ago 0xb8f275fbf7a959f4bce59999a2ef122a099e81a8 0xce8f24a58d85ed5c5a6824f7be1f8d4711a0eb4c0 Ether
0x4726ee01089a9eea6bbc887f804402cbe2504c322f81cf3602f540e2f33fa96510215962023-06-07 13:09:052 hrs 29 mins ago 0xce8f24a58d85ed5c5a6824f7be1f8d4711a0eb4c SushiSwap: Sushi Swap Router0 Ether
0x4726ee01089a9eea6bbc887f804402cbe2504c322f81cf3602f540e2f33fa96510215962023-06-07 13:09:052 hrs 29 mins ago 0xce8f24a58d85ed5c5a6824f7be1f8d4711a0eb4cBoba Network: USDC Token0 Ether
0x4726ee01089a9eea6bbc887f804402cbe2504c322f81cf3602f540e2f33fa96510215962023-06-07 13:09:052 hrs 29 mins ago 0xb8f275fbf7a959f4bce59999a2ef122a099e81a8 0xce8f24a58d85ed5c5a6824f7be1f8d4711a0eb4c0 Ether
0x43c42c43b3e4e5d7a6bf7fd09e1790c4576f4cc7314c555ae3c147bd0e2ab59e10215572023-06-07 9:34:386 hrs 4 mins ago 0xce8f24a58d85ed5c5a6824f7be1f8d4711a0eb4c 0xb8f275fbf7a959f4bce59999a2ef122a099e81a80 Ether
0x43c42c43b3e4e5d7a6bf7fd09e1790c4576f4cc7314c555ae3c147bd0e2ab59e10215572023-06-07 9:34:386 hrs 4 mins ago 0xce8f24a58d85ed5c5a6824f7be1f8d4711a0eb4cBoba Network: USDC Token0 Ether
0x43c42c43b3e4e5d7a6bf7fd09e1790c4576f4cc7314c555ae3c147bd0e2ab59e10215572023-06-07 9:34:386 hrs 4 mins ago 0xce8f24a58d85ed5c5a6824f7be1f8d4711a0eb4cBoba Network: USDC Token0 Ether
0x43c42c43b3e4e5d7a6bf7fd09e1790c4576f4cc7314c555ae3c147bd0e2ab59e10215572023-06-07 9:34:386 hrs 4 mins ago 0xce8f24a58d85ed5c5a6824f7be1f8d4711a0eb4c SushiSwap: Sushi Swap Router0.0085 Ether
[ Download CSV Export 
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
MetaRouter

Compiler Version
v0.8.7+commit.e28d00a7

Optimization Enabled:
Yes with 2000 runs

Other Settings:
default evmVersion
File 1 of 7 : MetaRouter.sol
// SPDX-License-Identifier: GPL-3.0
// uni -> stable -> uni scheme

pragma solidity ^0.8.0;

import "@openzeppelin/contracts/utils/Context.sol";
import "@openzeppelin/contracts/token/ERC20/IERC20.sol";
import "./MetaRouteStructs.sol";
import "./MetaRouterGateway.sol";
import "../../utils/RevertMessageParser.sol";

/**
 * @title MetaRouterV3
 * @notice Users must give approve on their tokens to `MetaRoutetGateway` contract,
 * not to `MetaRouter` contract.
 */
contract MetaRouter is Context {
    MetaRouterGateway public immutable metaRouterGateway;

    constructor() {
        metaRouterGateway = new MetaRouterGateway(address(this));
    }

    /**
     * @notice Method that starts the Meta Routing
     * @dev external + internal swap for burn scheme, only external for synth scheme
     * @dev calls the next method on the other side
     * @param _metarouteTransaction metaRoute offchain transaction data
     */
    function metaRoute(
        MetaRouteStructs.MetaRouteTransaction calldata _metarouteTransaction
    ) external payable {
        uint256 approvedTokensLength = _metarouteTransaction.approvedTokens.length;

        if (!_metarouteTransaction.nativeIn) {
            metaRouterGateway.claimTokens(
                _metarouteTransaction.approvedTokens[0],
                _msgSender(),
                _metarouteTransaction.amount
            );
        }

        uint256 secondSwapAmountIn = _metarouteTransaction.amount;
        if (_metarouteTransaction.firstSwapCalldata.length != 0) {
            if (!_metarouteTransaction.nativeIn) {
                _lazyApprove(
                    _metarouteTransaction.approvedTokens[0],
                    _metarouteTransaction.firstDexRouter,
                    _metarouteTransaction.amount
                );
            }

            require(
                _metarouteTransaction.firstDexRouter != address(metaRouterGateway),
                "MetaRouter: invalid first router"
            );

            {
                uint256 size;
                address toCheck = _metarouteTransaction.firstDexRouter;

                assembly {
                    size := extcodesize(toCheck)
                }

                require(size != 0, "MetaRouter: call for a non-contract account");
            }

            (bool firstSwapSuccess, bytes memory swapData) = _metarouteTransaction.firstDexRouter.call{value: msg.value}(
                _metarouteTransaction.firstSwapCalldata
            );

            if (!firstSwapSuccess) {
                revert(RevertMessageParser.getRevertMessage(swapData, "MetaRouter: first swap failed"));
            }

            secondSwapAmountIn = IERC20(_metarouteTransaction.approvedTokens[1]).balanceOf(address(this));
        }

        uint256 finalSwapAmountIn = secondSwapAmountIn;
        if (_metarouteTransaction.secondSwapCalldata.length != 0) {
            bytes memory secondSwapCalldata = _metarouteTransaction.secondSwapCalldata;

            assembly {
                mstore(add(secondSwapCalldata, 36), secondSwapAmountIn)
            }

            _lazyApprove(
                _metarouteTransaction.approvedTokens[approvedTokensLength - 2],
                _metarouteTransaction.secondDexRouter,
                secondSwapAmountIn
            );

            require(
                _metarouteTransaction.secondDexRouter != address(metaRouterGateway),
                "MetaRouter: invalid second router"
            );

            {
                uint256 size;
                address toCheck = _metarouteTransaction.secondDexRouter;

                assembly {
                    size := extcodesize(toCheck)
                }

                require(size != 0, "MetaRouter: call for a non-contract account");
            }

            (bool secondSwapSuccess, bytes memory swapData) = _metarouteTransaction.secondDexRouter.call(secondSwapCalldata);

            if (!secondSwapSuccess) {
                revert(RevertMessageParser.getRevertMessage(swapData, "MetaRouter: second swap failed"));
            }

            finalSwapAmountIn = IERC20(
                _metarouteTransaction.approvedTokens[approvedTokensLength - 1]
            ).balanceOf(address(this));
        }

        _lazyApprove(
            _metarouteTransaction.approvedTokens[approvedTokensLength - 1],
            _metarouteTransaction.relayRecipient,
            finalSwapAmountIn
        );

        bytes memory otherSideCalldata = _metarouteTransaction.otherSideCalldata;
        assembly {
            mstore(add(otherSideCalldata, 100), finalSwapAmountIn)
        }

        require(
            _metarouteTransaction.relayRecipient != address(metaRouterGateway),
            "MetaRouter: invalid recipient"
        );

        {
            uint256 size;
            address toCheck = _metarouteTransaction.relayRecipient;

            assembly {
                size := extcodesize(toCheck)
            }

            require(size != 0, "MetaRouter: call for a non-contract account");
        }

        (bool otherSideCallSuccess, bytes memory data) = _metarouteTransaction.relayRecipient.call(otherSideCalldata);

        if (!otherSideCallSuccess) {
            revert(RevertMessageParser.getRevertMessage(data, "MetaRouter: other side call failed"));
        }
    }

    /**
     * @notice Implements an external call on some contract
     * @dev called by Portal in metaUnsynthesize() method
     * @param _token address of token
     * @param _amount amount of _token
     * @param _receiveSide contract on which call will take place
     * @param _calldata encoded method to call
     * @param _offset shift to patch the amount to calldata
     */
    function externalCall(
        address _token,
        uint256 _amount,
        address _receiveSide,
        bytes calldata _calldata,
        uint256 _offset
    ) external {
        (bool success, bytes memory data) = _externalCall(_token, _amount, _receiveSide, _calldata, _offset);

        if (!success) {
            revert(RevertMessageParser.getRevertMessage(data, "MetaRouter: external call failed"));
        }
    }

    function returnSwap(
        address _token,
        uint256 _amount,
        address _router,
        bytes calldata _swapCalldata,
        address _burnToken,
        address _synthesis,
        bytes calldata _burnCalldata
    ) external {
        (bool success, bytes memory data) = _externalCall(_token, _amount, _router, _swapCalldata, 36);

        if (!success) {
            revert(RevertMessageParser.getRevertMessage(data, "MetaRouterV2: internal swap failed"));
        }

        uint256 internalSwapAmountOut = IERC20(_burnToken).balanceOf(address(this));

        bytes memory burnCalldata = _burnCalldata;
        assembly {
            mstore(add(burnCalldata, 100), internalSwapAmountOut)
        }

        require(
            _synthesis != address(metaRouterGateway),
            "MetaRouterV2: invalid recipient"
        );

        {
            uint256 size;
            address toCheck = _synthesis;

            assembly {
                size := extcodesize(toCheck)
            }

            require(size != 0, "MetaRouter: call for a non-contract account");
        }

        (bool otherSideCallSuccess, bytes memory burnData) = _synthesis.call(burnCalldata);

        if (!otherSideCallSuccess) {
            revert(RevertMessageParser.getRevertMessage(burnData, "MetaRouterV2: revertSynthesizeRequest call failed"));
        }
    }

    /**
     * @notice Implements an internal swap on stable router and final method call
     * @dev called by Synthesis in metaMint() method
     * @param _metaMintTransaction metaMint offchain transaction data
     */
    function metaMintSwap(
        MetaRouteStructs.MetaMintTransaction calldata _metaMintTransaction
    ) external {
        address finalCallToken = _metaMintTransaction.swapTokens[0];
        if (_metaMintTransaction.secondSwapCalldata.length != 0) {
            // internal swap
            (bool internalSwapSuccess, bytes memory internalSwapData) = _externalCall(
                _metaMintTransaction.swapTokens[0],
                _metaMintTransaction.amount,
                _metaMintTransaction.secondDexRouter,
                _metaMintTransaction.secondSwapCalldata,
                36
            );

            if (!internalSwapSuccess) {
                revert(RevertMessageParser.getRevertMessage(internalSwapData, "MetaRouter: internal swap failed"));
            }
            finalCallToken = _metaMintTransaction.swapTokens[1];
        }
        if (_metaMintTransaction.finalCalldata.length != 0) {
            uint256 finalAmountIn = IERC20(finalCallToken).balanceOf(address(this));
            // external call
            (bool finalSuccess, bytes memory finalData) = _externalCall(
                finalCallToken,
                finalAmountIn,
                _metaMintTransaction.finalReceiveSide,
                _metaMintTransaction.finalCalldata,
                _metaMintTransaction.finalOffset
            );

            if (!finalSuccess) {
                revert(RevertMessageParser.getRevertMessage(finalData, "MetaRouter: final call failed"));
            }
        }

        uint256 amountOut = IERC20(_metaMintTransaction.swapTokens[_metaMintTransaction.swapTokens.length - 1]).balanceOf(address(this));

        if (amountOut != 0) {
            TransferHelper.safeTransfer(
                _metaMintTransaction.swapTokens[_metaMintTransaction.swapTokens.length - 1],
                _metaMintTransaction.to,
                amountOut
            );
        }
    }

    /**
     * @notice Implements call of some operation with token
     * @dev Internal function used in metaMintSwap() and externalCall()
     * @param _token token address
     * @param _amount amount of _token
     * @param _receiveSide address of contract on which method will be called
     * @param _calldata encoded method call
     * @param _offset shift to patch the _amount to calldata
     */
    function _externalCall(
        address _token,
        uint256 _amount,
        address _receiveSide,
        bytes memory _calldata,
        uint256 _offset
    ) internal returns (bool success, bytes memory data) {
        require(_receiveSide != address(metaRouterGateway), "MetaRouter: invalid receiveSide");

        _lazyApprove(_token, _receiveSide, _amount);

        assembly {
            mstore(add(_calldata, _offset), _amount)
        }

        {
            uint256 size;
            address toCheck = _receiveSide;

            assembly {
                size := extcodesize(toCheck)
            }

            require(size != 0, "MetaRouter: call for a non-contract account");
        }

        (success, data) = _receiveSide.call(_calldata);
    }

    /**
     * @notice Implements approve
     * @dev Internal function used to approve the token spending
     * @param _token token address
     * @param _to address to approve
     * @param _amount amount for which approve will be given
     */
    function _lazyApprove(address _token, address _to, uint256 _amount) internal {
        if (IERC20(_token).allowance(address(this), _to) < _amount) {
            TransferHelper.safeApprove(_token, _to, type(uint256).max);
        }
    }
}

File 2 of 7 : Context.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (utils/Context.sol)

pragma solidity ^0.8.0;

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

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

File 3 of 7 : IERC20.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (token/ERC20/IERC20.sol)

pragma solidity ^0.8.0;

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

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

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

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

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

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

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

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

File 4 of 7 : MetaRouteStructs.sol
// SPDX-License-Identifier: GPL-3.0

pragma solidity ^0.8.0;

library MetaRouteStructs {
    struct MetaBurnTransaction {
        uint256 stableBridgingFee;
        uint256 amount;
        address syntCaller;
        address finalReceiveSide;
        address sToken;
        bytes finalCallData;
        uint256 finalOffset;
        address chain2address;
        address receiveSide;
        address oppositeBridge;
        address revertableAddress;
        uint256 chainID;
        bytes32 clientID;
    }

    struct MetaMintTransaction {
        uint256 stableBridgingFee;
        uint256 amount;
        bytes32 externalID;
        address tokenReal;
        uint256 chainID;
        address to;
        address[] swapTokens;
        address secondDexRouter;
        bytes secondSwapCalldata;
        address finalReceiveSide;
        bytes finalCalldata;
        uint256 finalOffset;
    }

    struct MetaRouteTransaction {
        bytes firstSwapCalldata;
        bytes secondSwapCalldata;
        address[] approvedTokens;
        address firstDexRouter;
        address secondDexRouter;
        uint256 amount;
        bool nativeIn;
        address relayRecipient;
        bytes otherSideCalldata;
    }

    struct MetaSynthesizeTransaction {
        uint256 stableBridgingFee;
        uint256 amount;
        address rtoken;
        address chain2address;
        address receiveSide;
        address oppositeBridge;
        address syntCaller;
        uint256 chainID;
        address[] swapTokens;
        address secondDexRouter;
        bytes secondSwapCalldata;
        address finalReceiveSide;
        bytes finalCalldata;
        uint256 finalOffset;
        address revertableAddress;
        bytes32 clientID;
    }

    struct MetaRevertTransaction {
        uint256 stableBridgingFee;
        bytes32 internalID;
        address receiveSide;
        address managerChainBridge;
        address sourceChainBridge;
        uint256 managerChainId;
        uint256 sourceChainId;
        address router;
        bytes swapCalldata;
        address sourceChainSynthesis;
        address burnToken;
        bytes burnCalldata;
        bytes32 clientID;
    }
}

File 5 of 7 : MetaRouterGateway.sol
// SPDX-License-Identifier: GPL-3.0

pragma solidity ^0.8.0;

import "@uniswap/lib/contracts/libraries/TransferHelper.sol";

/**
 * @title MetaRouterGateway
 * @notice During the `metaRoute` transaction `MetaRouter` (only) claims user's tokens
 * from `MetaRoutetGateway` contract and then operates with them.
 */
contract MetaRouterGateway {
    address public immutable metaRouter;

    modifier onlyMetarouter() {
        require(metaRouter == msg.sender, "Symb: caller is not the metarouter");
        _;
    }

    constructor(address _metaRouter) {
        metaRouter = _metaRouter;
    }

    function claimTokens(
        address _token,
        address _from,
        uint256 _amount
    ) external onlyMetarouter {
        TransferHelper.safeTransferFrom(_token, _from, metaRouter, _amount);
    }
}

File 6 of 7 : RevertMessageParser.sol
// SPDX-License-Identifier: GPL-3.0

pragma solidity ^0.8.0;

library RevertMessageParser {
    function getRevertMessage(bytes memory _data, string memory _defaultMessage) internal pure returns (string memory) {
        // If the _data length is less than 68, then the transaction failed silently (without a revert message)
        if (_data.length < 68) return _defaultMessage;

        assembly {
            // Slice the sighash
            _data := add(_data, 0x04)
        }
        return abi.decode(_data, (string));
    }
}

File 7 of 7 : TransferHelper.sol
// SPDX-License-Identifier: GPL-3.0-or-later

pragma solidity >=0.6.0;

// helper methods for interacting with ERC20 tokens and sending ETH that do not consistently return true/false
library TransferHelper {
    function safeApprove(
        address token,
        address to,
        uint256 value
    ) internal {
        // bytes4(keccak256(bytes('approve(address,uint256)')));
        (bool success, bytes memory data) = token.call(abi.encodeWithSelector(0x095ea7b3, to, value));
        require(
            success && (data.length == 0 || abi.decode(data, (bool))),
            'TransferHelper::safeApprove: approve failed'
        );
    }

    function safeTransfer(
        address token,
        address to,
        uint256 value
    ) internal {
        // bytes4(keccak256(bytes('transfer(address,uint256)')));
        (bool success, bytes memory data) = token.call(abi.encodeWithSelector(0xa9059cbb, to, value));
        require(
            success && (data.length == 0 || abi.decode(data, (bool))),
            'TransferHelper::safeTransfer: transfer failed'
        );
    }

    function safeTransferFrom(
        address token,
        address from,
        address to,
        uint256 value
    ) internal {
        // bytes4(keccak256(bytes('transferFrom(address,address,uint256)')));
        (bool success, bytes memory data) = token.call(abi.encodeWithSelector(0x23b872dd, from, to, value));
        require(
            success && (data.length == 0 || abi.decode(data, (bool))),
            'TransferHelper::transferFrom: transferFrom failed'
        );
    }

    function safeTransferETH(address to, uint256 value) internal {
        (bool success, ) = to.call{value: value}(new bytes(0));
        require(success, 'TransferHelper::safeTransferETH: ETH transfer failed');
    }
}

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

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[{"internalType":"address","name":"_token","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"},{"internalType":"address","name":"_receiveSide","type":"address"},{"internalType":"bytes","name":"_calldata","type":"bytes"},{"internalType":"uint256","name":"_offset","type":"uint256"}],"name":"externalCall","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"components":[{"internalType":"uint256","name":"stableBridgingFee","type":"uint256"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"bytes32","name":"externalID","type":"bytes32"},{"internalType":"address","name":"tokenReal","type":"address"},{"internalType":"uint256","name":"chainID","type":"uint256"},{"internalType":"address","name":"to","type":"address"},{"internalType":"address[]","name":"swapTokens","type":"address[]"},{"internalType":"address","name":"secondDexRouter","type":"address"},{"internalType":"bytes","name":"secondSwapCalldata","type":"bytes"},{"internalType":"address","name":"finalReceiveSide","type":"address"},{"internalType":"bytes","name":"finalCalldata","type":"bytes"},{"internalType":"uint256","name":"finalOffset","type":"uint256"}],"internalType":"struct MetaRouteStructs.MetaMintTransaction","name":"_metaMintTransaction","type":"tuple"}],"name":"metaMintSwap","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"components":[{"internalType":"bytes","name":"firstSwapCalldata","type":"bytes"},{"internalType":"bytes","name":"secondSwapCalldata","type":"bytes"},{"internalType":"address[]","name":"approvedTokens","type":"address[]"},{"internalType":"address","name":"firstDexRouter","type":"address"},{"internalType":"address","name":"secondDexRouter","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"bool","name":"nativeIn","type":"bool"},{"internalType":"address","name":"relayRecipient","type":"address"},{"internalType":"bytes","name":"otherSideCalldata","type":"bytes"}],"internalType":"struct MetaRouteStructs.MetaRouteTransaction","name":"_metarouteTransaction","type":"tuple"}],"name":"metaRoute","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"metaRouterGateway","outputs":[{"internalType":"contract MetaRouterGateway","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_token","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"},{"internalType":"address","name":"_router","type":"address"},{"internalType":"bytes","name":"_swapCalldata","type":"bytes"},{"internalType":"address","name":"_burnToken","type":"address"},{"internalType":"address","name":"_synthesis","type":"address"},{"internalType":"bytes","name":"_burnCalldata","type":"bytes"}],"name":"returnSwap","outputs":[],"stateMutability":"nonpayable","type":"function"}]

60a060405234801561001057600080fd5b503060405161001e90610060565b6001600160a01b039091168152602001604051809103906000f08015801561004a573d6000803e3d6000fd5b5060601b6001600160601b03191660805261006d565b6104d780611d7983390190565b60805160601c611cc56100b46000396000818160a6015281816102780152818161042401528181610584015281816108b901528181610c0001526112280152611cc56000f3fe60806040526004361061005a5760003560e01c8063c394a5da11610043578063c394a5da14610094578063e1edd61c146100e4578063e1ee0f791461010457600080fd5b8063732cffe91461005f578063a11b119814610081575b600080fd5b34801561006b57600080fd5b5061007f61007a3660046117e1565b610124565b005b61007f61008f366004611a43565b6103f3565b3480156100a057600080fd5b506100c87f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b03909116815260200160405180910390f35b3480156100f057600080fd5b5061007f6100ff366004611a07565b610da8565b34801561011057600080fd5b5061007f61011f3660046118a2565b611189565b60008061016c8b8b8b8b8b8080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525060249250611222915050565b91509150816101b95761019781604051806060016040528060228152602001611c4c60229139611388565b60405162461bcd60e51b81526004016101b09190611ac4565b60405180910390fd5b6040516370a0823160e01b81523060048201526000906001600160a01b038816906370a082319060240160206040518083038186803b1580156101fb57600080fd5b505afa15801561020f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906102339190611a7f565b9050600085858080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505050506064810183905290507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0390811690881614156102f35760405162461bcd60e51b815260206004820152601f60248201527f4d657461526f7574657256323a20696e76616c696420726563697069656e740060448201526064016101b0565b863b87816103575760405162461bcd60e51b815260206004820152602b60248201527f4d657461526f757465723a2063616c6c20666f722061206e6f6e2d636f6e747260448201526a1858dd081858d8dbdd5b9d60aa1b60648201526084016101b0565b5050600080886001600160a01b0316836040516103749190611aa8565b6000604051808303816000865af19150503d80600081146103b1576040519150601f19603f3d011682016040523d82523d6000602084013e6103b6565b606091505b5091509150816103e25761019781604051806060016040528060318152602001611c1b60319139611388565b505050505050505050505050505050565b60006104026040830183611af7565b9150610416905060e0830160c08401611919565b610500576001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016639fc314c86104566040850185611af7565b600081811061046757610467611bdd565b905060200201602081019061047c91906117c6565b336040517fffffffff0000000000000000000000000000000000000000000000000000000060e085901b1681526001600160a01b0392831660048201529116602482015260a08501356044820152606401600060405180830381600087803b1580156104e757600080fd5b505af11580156104fb573d6000803e3d6000fd5b505050505b60a082013561050f8380611b41565b1590506107f95761052660e0840160c08501611919565b61057a5761057a61053a6040850185611af7565b600081811061054b5761054b611bdd565b905060200201602081019061056091906117c6565b61057060808601606087016117c6565b8560a001356113be565b6001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000166105b460808501606086016117c6565b6001600160a01b0316141561060b5760405162461bcd60e51b815260206004820181905260248201527f4d657461526f757465723a20696e76616c696420666972737420726f7574657260448201526064016101b0565b60008061061e60808601606087016117c6565b803b92509050816106855760405162461bcd60e51b815260206004820152602b60248201527f4d657461526f757465723a2063616c6c20666f722061206e6f6e2d636f6e747260448201526a1858dd081858d8dbdd5b9d60aa1b60648201526084016101b0565b50600090508061069b60808601606087016117c6565b6001600160a01b0316346106af8780611b41565b6040516106bd929190611a98565b60006040518083038185875af1925050503d80600081146106fa576040519150601f19603f3d011682016040523d82523d6000602084013e6106ff565b606091505b50915091508161074857610197816040518060400160405280601d81526020017f4d657461526f757465723a2066697273742073776170206661696c6564000000815250611388565b6107556040860186611af7565b600181811061076657610766611bdd565b905060200201602081019061077b91906117c6565b6040516370a0823160e01b81523060048201526001600160a01b0391909116906370a082319060240160206040518083038186803b1580156107bc57600080fd5b505afa1580156107d0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107f49190611a7f565b925050505b806108076020850185611b41565b159050610b5357600061081d6020860186611b41565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505050506024810184905290506108af61086a6040870187611af7565b610875600288611b88565b81811061088457610884611bdd565b905060200201602081019061089991906117c6565b6108a960a08801608089016117c6565b856113be565b6001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000166108e960a08701608088016117c6565b6001600160a01b031614156109665760405162461bcd60e51b815260206004820152602160248201527f4d657461526f757465723a20696e76616c6964207365636f6e6420726f75746560448201527f720000000000000000000000000000000000000000000000000000000000000060648201526084016101b0565b60008061097960a08801608089016117c6565b803b92509050816109e05760405162461bcd60e51b815260206004820152602b60248201527f4d657461526f757465723a2063616c6c20666f722061206e6f6e2d636f6e747260448201526a1858dd081858d8dbdd5b9d60aa1b60648201526084016101b0565b5060009050806109f660a08801608089016117c6565b6001600160a01b031683604051610a0d9190611aa8565b6000604051808303816000865af19150503d8060008114610a4a576040519150601f19603f3d011682016040523d82523d6000602084013e610a4f565b606091505b509150915081610a9857610197816040518060400160405280601e81526020017f4d657461526f757465723a207365636f6e642073776170206661696c65640000815250611388565b610aa56040880188611af7565b610ab0600189611b88565b818110610abf57610abf611bdd565b9050602002016020810190610ad491906117c6565b6040516370a0823160e01b81523060048201526001600160a01b0391909116906370a082319060240160206040518083038186803b158015610b1557600080fd5b505afa158015610b29573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b4d9190611a7f565b93505050505b610ba9610b636040860186611af7565b610b6e600187611b88565b818110610b7d57610b7d611bdd565b9050602002016020810190610b9291906117c6565b610ba3610100870160e088016117c6565b836113be565b6000610bb9610100860186611b41565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505050506064810183905290506001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016610c31610100870160e088016117c6565b6001600160a01b03161415610c885760405162461bcd60e51b815260206004820152601d60248201527f4d657461526f757465723a20696e76616c696420726563697069656e7400000060448201526064016101b0565b600080610c9c610100880160e089016117c6565b803b9250905081610d035760405162461bcd60e51b815260206004820152602b60248201527f4d657461526f757465723a2063616c6c20666f722061206e6f6e2d636f6e747260448201526a1858dd081858d8dbdd5b9d60aa1b60648201526084016101b0565b506000905080610d1a610100880160e089016117c6565b6001600160a01b031683604051610d319190611aa8565b6000604051808303816000865af19150503d8060008114610d6e576040519150601f19603f3d011682016040523d82523d6000602084013e610d73565b606091505b509150915081610d9f5761019781604051806060016040528060228152602001611c6e60229139611388565b50505050505050565b6000610db760c0830183611af7565b6000818110610dc857610dc8611bdd565b9050602002016020810190610ddd91906117c6565b9050610ded610100830183611b41565b159050610f0e57600080610e8e610e0760c0860186611af7565b6000818110610e1857610e18611bdd565b9050602002016020810190610e2d91906117c6565b6020860135610e43610100880160e089016117c6565b610e51610100890189611b41565b8080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525060249250611222915050565b9150915081610ed657610197816040518060400160405280602081526020017f4d657461526f757465723a20696e7465726e616c2073776170206661696c6564815250611388565b610ee360c0850185611af7565b6001818110610ef457610ef4611bdd565b9050602002016020810190610f0991906117c6565b925050505b610f1c610140830183611b41565b159050611052576040516370a0823160e01b81523060048201526000906001600160a01b038316906370a082319060240160206040518083038186803b158015610f6557600080fd5b505afa158015610f79573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f9d9190611a7f565b90506000806110068484610fb961014089016101208a016117c6565b610fc76101408a018a611b41565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505050506101608a0135611222565b915091508161104e57610197816040518060400160405280601d81526020017f4d657461526f757465723a2066696e616c2063616c6c206661696c6564000000815250611388565b5050505b600061106160c0840184611af7565b600161107060c0870187611af7565b61107b929150611b88565b81811061108a5761108a611bdd565b905060200201602081019061109f91906117c6565b6040516370a0823160e01b81523060048201526001600160a01b0391909116906370a082319060240160206040518083038186803b1580156110e057600080fd5b505afa1580156110f4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111189190611a7f565b905080156111845761118461113060c0850185611af7565b600161113f60c0880188611af7565b61114a929150611b88565b81811061115957611159611bdd565b905060200201602081019061116e91906117c6565b61117e60c0860160a087016117c6565b8361148a565b505050565b6000806111d088888888888080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152508a9250611222915050565b915091508161121857610197816040518060400160405280602081526020017f4d657461526f757465723a2065787465726e616c2063616c6c206661696c6564815250611388565b5050505050505050565b600060607f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316856001600160a01b031614156112a85760405162461bcd60e51b815260206004820152601f60248201527f4d657461526f757465723a20696e76616c69642072656365697665536964650060448201526064016101b0565b6112b38786886113be565b838301869052843b858161131d5760405162461bcd60e51b815260206004820152602b60248201527f4d657461526f757465723a2063616c6c20666f722061206e6f6e2d636f6e747260448201526a1858dd081858d8dbdd5b9d60aa1b60648201526084016101b0565b5050846001600160a01b0316846040516113379190611aa8565b6000604051808303816000865af19150503d8060008114611374576040519150601f19603f3d011682016040523d82523d6000602084013e611379565b606091505b50909890975095505050505050565b606060448351101561139b5750806113b8565b600483019250828060200190518101906113b5919061195a565b90505b92915050565b6040517fdd62ed3e0000000000000000000000000000000000000000000000000000000081523060048201526001600160a01b03838116602483015282919085169063dd62ed3e9060440160206040518083038186803b15801561142157600080fd5b505afa158015611435573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114599190611a7f565b10156111845761118483837fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6115f9565b604080516001600160a01b038481166024830152604480830185905283518084039091018152606490920183526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fa9059cbb0000000000000000000000000000000000000000000000000000000017905291516000928392908716916115149190611aa8565b6000604051808303816000865af19150503d8060008114611551576040519150601f19603f3d011682016040523d82523d6000602084013e611556565b606091505b5091509150818015611580575080511580611580575080806020019051810190611580919061193d565b6115f25760405162461bcd60e51b815260206004820152602d60248201527f5472616e7366657248656c7065723a3a736166655472616e736665723a20747260448201527f616e73666572206661696c65640000000000000000000000000000000000000060648201526084016101b0565b5050505050565b604080516001600160a01b038481166024830152604480830185905283518084039091018152606490920183526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f095ea7b30000000000000000000000000000000000000000000000000000000017905291516000928392908716916116839190611aa8565b6000604051808303816000865af19150503d80600081146116c0576040519150601f19603f3d011682016040523d82523d6000602084013e6116c5565b606091505b50915091508180156116ef5750805115806116ef5750808060200190518101906116ef919061193d565b6115f25760405162461bcd60e51b815260206004820152602b60248201527f5472616e7366657248656c7065723a3a73616665417070726f76653a2061707060448201527f726f7665206661696c656400000000000000000000000000000000000000000060648201526084016101b0565b80356001600160a01b038116811461177857600080fd5b919050565b60008083601f84011261178f57600080fd5b50813567ffffffffffffffff8111156117a757600080fd5b6020830191508360208285010111156117bf57600080fd5b9250929050565b6000602082840312156117d857600080fd5b6113b582611761565b600080600080600080600080600060e08a8c0312156117ff57600080fd5b6118088a611761565b985060208a0135975061181d60408b01611761565b965060608a013567ffffffffffffffff8082111561183a57600080fd5b6118468d838e0161177d565b909850965086915061185a60808d01611761565b955061186860a08d01611761565b945060c08c013591508082111561187e57600080fd5b5061188b8c828d0161177d565b915080935050809150509295985092959850929598565b60008060008060008060a087890312156118bb57600080fd5b6118c487611761565b9550602087013594506118d960408801611761565b9350606087013567ffffffffffffffff8111156118f557600080fd5b61190189828a0161177d565b979a9699509497949695608090950135949350505050565b60006020828403121561192b57600080fd5b813561193681611c09565b9392505050565b60006020828403121561194f57600080fd5b815161193681611c09565b60006020828403121561196c57600080fd5b815167ffffffffffffffff8082111561198457600080fd5b818401915084601f83011261199857600080fd5b8151818111156119aa576119aa611bf3565b604051601f8201601f19908116603f011681019083821181831017156119d2576119d2611bf3565b816040528281528760208487010111156119eb57600080fd5b6119fc836020830160208801611bad565b979650505050505050565b600060208284031215611a1957600080fd5b813567ffffffffffffffff811115611a3057600080fd5b8201610180818503121561193657600080fd5b600060208284031215611a5557600080fd5b813567ffffffffffffffff811115611a6c57600080fd5b8201610120818503121561193657600080fd5b600060208284031215611a9157600080fd5b5051919050565b8183823760009101908152919050565b60008251611aba818460208701611bad565b9190910192915050565b6020815260008251806020840152611ae3816040850160208701611bad565b601f01601f19169190910160400192915050565b6000808335601e19843603018112611b0e57600080fd5b83018035915067ffffffffffffffff821115611b2957600080fd5b6020019150600581901b36038213156117bf57600080fd5b6000808335601e19843603018112611b5857600080fd5b83018035915067ffffffffffffffff821115611b7357600080fd5b6020019150368190038213156117bf57600080fd5b600082821015611ba857634e487b7160e01b600052601160045260246000fd5b500390565b60005b83811015611bc8578181015183820152602001611bb0565b83811115611bd7576000848401525b50505050565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b8015158114611c1757600080fd5b5056fe4d657461526f7574657256323a2072657665727453796e74686573697a65526571756573742063616c6c206661696c65644d657461526f7574657256323a20696e7465726e616c2073776170206661696c65644d657461526f757465723a206f7468657220736964652063616c6c206661696c6564a26469706673582212206ce32b01df8b2445c5404d60cbf720233dde76d1d34b7ead47d0de10e1f51d4764736f6c6343000807003360a060405234801561001057600080fd5b506040516104d73803806104d783398101604081905261002f91610044565b60601b6001600160601b031916608052610074565b60006020828403121561005657600080fd5b81516001600160a01b038116811461006d57600080fd5b9392505050565b60805160601c61043961009e6000396000818160550152818160a2015261017101526104396000f3fe608060405234801561001057600080fd5b50600436106100365760003560e01c80639fc314c81461003b578063dbec15bb14610050575b600080fd5b61004e610049366004610363565b6100a0565b005b6100777f000000000000000000000000000000000000000000000000000000000000000081565b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200160405180910390f35b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16331461016a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602260248201527f53796d623a2063616c6c6572206973206e6f7420746865206d657461726f757460448201527f657200000000000000000000000000000000000000000000000000000000000060648201526084015b60405180910390fd5b61019683837f00000000000000000000000000000000000000000000000000000000000000008461019b565b505050565b6040805173ffffffffffffffffffffffffffffffffffffffff85811660248301528481166044830152606480830185905283518084039091018152608490920183526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f23b872dd00000000000000000000000000000000000000000000000000000000179052915160009283929088169161023a91906103c8565b6000604051808303816000865af19150503d8060008114610277576040519150601f19603f3d011682016040523d82523d6000602084013e61027c565b606091505b50915091508180156102a65750805115806102a65750808060200190518101906102a6919061039f565b610332576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603160248201527f5472616e7366657248656c7065723a3a7472616e7366657246726f6d3a20747260448201527f616e7366657246726f6d206661696c65640000000000000000000000000000006064820152608401610161565b505050505050565b803573ffffffffffffffffffffffffffffffffffffffff8116811461035e57600080fd5b919050565b60008060006060848603121561037857600080fd5b6103818461033a565b925061038f6020850161033a565b9150604084013590509250925092565b6000602082840312156103b157600080fd5b815180151581146103c157600080fd5b9392505050565b6000825160005b818110156103e957602081860181015185830152016103cf565b818111156103f8576000828501525b50919091019291505056fea26469706673582212202568575dd38d51c811ca9abb487d12cf7f92601b834f2b8dba043bc452c3f35164736f6c63430008070033

Block Transaction Difficulty Gas Used Reward
Block Uncle Number Difficulty Gas Used Reward
Loading
Make sure to use the "Vote Down" button for any spammy posts, and the "Vote Up" for interesting conversations.