Contract 0xce5d236164d2bc0b2f65351f23b617c2a7d5cc28 1

Txn Hash Method
Block
From
To
Value [Txn Fee]
0x20cba785c479ad73c9829b5e56a4f837fdb39ea6bc7272c8b80f7b6192b9359bSet Fee253716502023-01-24 22:51:416 days 1 hr ago0x813288526ccbfade7aba8836a4ca2462eb886bb7 IN  0xce5d236164d2bc0b2f65351f23b617c2a7d5cc280 AVAX0.00195314 28
0x76075ec997fe76d5dc111b408c1be12400bb8c8da8717e0b63dfd51f9952e972Set Owner253716462023-01-24 22:51:326 days 1 hr ago0x813288526ccbfade7aba8836a4ca2462eb886bb7 IN  0xce5d236164d2bc0b2f65351f23b617c2a7d5cc280 AVAX0.00133924 28
0x0082b6791df39441ddd66a101b743b526e1161237d1aef518d3e23261644720a0x60806040253716442023-01-24 22:51:296 days 1 hr ago0x813288526ccbfade7aba8836a4ca2462eb886bb7 IN  Create: TSAggregatorUniswapV2AVAX0 AVAX0.02806468 28
[ Download CSV Export 
Parent Txn Hash Block From To Value
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
TSAggregatorUniswapV2AVAX

Compiler Version
v0.8.10+commit.fc410830

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion

Contract Source Code (Solidity Standard Json-Input format)

File 1 of 8 : ReentrancyGuard.sol
// SPDX-License-Identifier: AGPL-3.0-only
pragma solidity >=0.8.0;

/// @notice Gas optimized reentrancy protection for smart contracts.
/// @author Solmate (https://github.com/Rari-Capital/solmate/blob/main/src/utils/ReentrancyGuard.sol)
/// @author Modified from OpenZeppelin (https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/security/ReentrancyGuard.sol)
abstract contract ReentrancyGuard {
    uint256 private locked = 1;

    modifier nonReentrant() {
        require(locked == 1, "REENTRANCY");

        locked = 2;

        _;

        locked = 1;
    }
}

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

/// @notice Safe ETH and ERC20 transfer library that gracefully handles missing return values.
/// @author Solmate (https://github.com/Rari-Capital/solmate/blob/main/src/utils/SafeTransferLib.sol)
/// @author Modified from Gnosis (https://github.com/gnosis/gp-v2-contracts/blob/main/src/contracts/libraries/GPv2SafeERC20.sol)
/// @dev Use with caution! Some functions in this library knowingly create dirty bits at the destination of the free memory pointer.
library SafeTransferLib {
    /*///////////////////////////////////////////////////////////////
                            ETH OPERATIONS
    //////////////////////////////////////////////////////////////*/

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

        assembly {
            // Transfer the ETH and store if it succeeded or not.
            callStatus := call(gas(), to, amount, 0, 0, 0, 0)
        }

        require(callStatus, "ETH_TRANSFER_FAILED");
    }

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

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

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

            // Write the abi-encoded calldata to memory piece by piece:
            mstore(freeMemoryPointer, 0x23b872dd00000000000000000000000000000000000000000000000000000000) // Begin with the function selector.
            mstore(add(freeMemoryPointer, 4), and(from, 0xffffffffffffffffffffffffffffffffffffffff)) // Mask and append the "from" argument.
            mstore(add(freeMemoryPointer, 36), and(to, 0xffffffffffffffffffffffffffffffffffffffff)) // Mask and append the "to" argument.
            mstore(add(freeMemoryPointer, 68), amount) // Finally append the "amount" argument. No mask as it's a full 32 byte value.

            // Call the token and store if it succeeded or not.
            // We use 100 because the calldata length is 4 + 32 * 3.
            callStatus := call(gas(), token, 0, freeMemoryPointer, 100, 0, 0)
        }

        require(didLastOptionalReturnCallSucceed(callStatus), "TRANSFER_FROM_FAILED");
    }

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

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

            // Write the abi-encoded calldata to memory piece by piece:
            mstore(freeMemoryPointer, 0xa9059cbb00000000000000000000000000000000000000000000000000000000) // Begin with the function selector.
            mstore(add(freeMemoryPointer, 4), and(to, 0xffffffffffffffffffffffffffffffffffffffff)) // Mask and append the "to" argument.
            mstore(add(freeMemoryPointer, 36), amount) // Finally append the "amount" argument. No mask as it's a full 32 byte value.

            // Call the token and store if it succeeded or not.
            // We use 68 because the calldata length is 4 + 32 * 2.
            callStatus := call(gas(), token, 0, freeMemoryPointer, 68, 0, 0)
        }

        require(didLastOptionalReturnCallSucceed(callStatus), "TRANSFER_FAILED");
    }

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

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

            // Write the abi-encoded calldata to memory piece by piece:
            mstore(freeMemoryPointer, 0x095ea7b300000000000000000000000000000000000000000000000000000000) // Begin with the function selector.
            mstore(add(freeMemoryPointer, 4), and(to, 0xffffffffffffffffffffffffffffffffffffffff)) // Mask and append the "to" argument.
            mstore(add(freeMemoryPointer, 36), amount) // Finally append the "amount" argument. No mask as it's a full 32 byte value.

            // Call the token and store if it succeeded or not.
            // We use 68 because the calldata length is 4 + 32 * 2.
            callStatus := call(gas(), token, 0, freeMemoryPointer, 68, 0, 0)
        }

        require(didLastOptionalReturnCallSucceed(callStatus), "APPROVE_FAILED");
    }

    /*///////////////////////////////////////////////////////////////
                         INTERNAL HELPER LOGIC
    //////////////////////////////////////////////////////////////*/

    function didLastOptionalReturnCallSucceed(bool callStatus) private pure returns (bool success) {
        assembly {
            // Get how many bytes the call returned.
            let returnDataSize := returndatasize()

            // If the call reverted:
            if iszero(callStatus) {
                // Copy the revert message into memory.
                returndatacopy(0, 0, returnDataSize)

                // Revert with the same message.
                revert(0, returnDataSize)
            }

            switch returnDataSize
            case 32 {
                // Copy the return data into memory.
                returndatacopy(0, 0, returnDataSize)

                // Set success to whether it returned true.
                success := iszero(iszero(mload(0)))
            }
            case 0 {
                // There was no return data.
                success := 1
            }
            default {
                // It returned some malformed input.
                success := 0
            }
        }
    }
}

File 3 of 8 : Owners.sol
// SPDX-License-Identifier: MIT
pragma solidity 0.8.10;

abstract contract Owners {
    event OwnerSet(address indexed owner, bool active);

    mapping(address => bool) public owners;

    modifier isOwner() {
        require(owners[msg.sender], "Unauthorized");
        _;
    }

    function _setOwner(address owner, bool active) internal virtual {
      owners[owner] = active;
      emit OwnerSet(owner, active);
    }

    function setOwner(address owner, bool active) external virtual isOwner {
      _setOwner(owner, active);
    }
}

File 4 of 8 : TSAggregator.sol
// SPDX-License-Identifier: MIT
pragma solidity 0.8.10;

import { SafeTransferLib } from "../lib/SafeTransferLib.sol";
import { ReentrancyGuard } from "../lib/ReentrancyGuard.sol";
import { Owners } from "./Owners.sol";
import { TSAggregatorTokenTransferProxy } from './TSAggregatorTokenTransferProxy.sol';

abstract contract TSAggregator is Owners, ReentrancyGuard {
    using SafeTransferLib for address;

    event FeeSet(uint256 fee, address feeRecipient);

    uint256 public fee;
    address public feeRecipient;
    TSAggregatorTokenTransferProxy public tokenTransferProxy;

    constructor(address _tokenTransferProxy) {
        _setOwner(msg.sender, true);
        tokenTransferProxy = TSAggregatorTokenTransferProxy(_tokenTransferProxy);
    }

    // Needed for the swap router to be able to send back ETH
    receive() external payable {}

    function setFee(uint256 _fee, address _feeRecipient) external isOwner {
        require(_fee <= 1000, "fee can not be more than 10%");
        fee = _fee;
        feeRecipient = _feeRecipient;
        emit FeeSet(_fee, _feeRecipient);
    }

    function skimFee(uint256 amount) internal returns (uint256) {
        uint256 amountFee = getFee(amount);
        if (amountFee > 0) {
            feeRecipient.safeTransferETH(amountFee);
            amount -= amountFee;
        }
        return amount;
    }

    function getFee(uint256 amount) internal view returns (uint256) {
        if (fee != 0 && feeRecipient != address(0)) {
            return (amount * fee) / 10000;
        }
        return 0;
    }

    // Parse amountOutMin treating the last 2 digits as an exponent
    // So 15e4 = 150000. This allows for compressed memos on chains
    // with limited space like Bitcoin
    function _parseAmountOutMin(uint256 amount) internal pure returns (uint256) {
      return amount / 100 * (10 ** (amount % 100));
    }
}

File 5 of 8 : TSAggregatorTokenTransferProxy.sol
// SPDX-License-Identifier: MIT
pragma solidity 0.8.10;

import { SafeTransferLib } from "../lib/SafeTransferLib.sol";
import { Owners } from "./Owners.sol";

contract TSAggregatorTokenTransferProxy is Owners {
    using SafeTransferLib for address;

    constructor() {
        _setOwner(msg.sender, true);
    }

    function transferTokens(address token, address from, address to, uint256 amount) external isOwner {
        require(from == tx.origin || _isContract(from), "Invalid from address");
        token.safeTransferFrom(from, to, amount);
    }

    function _isContract(address account) internal view returns (bool) {
        // This method relies on extcodesize, which returns 0 for contracts in
        // construction, since the code is only stored at the end of the
        // constructor execution.
        uint256 size;
        // solhint-disable-next-line no-inline-assembly
        assembly { size := extcodesize(account) }
        return size > 0;
    }
}

File 6 of 8 : TSAggregatorUniswapV2AVAX.sol
// SPDX-License-Identifier: MIT
pragma solidity 0.8.10;

import { SafeTransferLib } from "../lib/SafeTransferLib.sol";
import { TSAggregator } from "./TSAggregator.sol";
import { IThorchainRouter } from "./interfaces/IThorchainRouter.sol";
import { IUniswapRouterV2AVAX } from "./interfaces/IUniswapRouterV2AVAX.sol";

contract TSAggregatorUniswapV2AVAX is TSAggregator {
    using SafeTransferLib for address;

    address public weth;
    IUniswapRouterV2AVAX public swapRouter;

    event SwapIn(address from, address token, uint256 amount, uint256 out, uint256 fee, address vault, string memo);
    event SwapOut(address to, address token, uint256 amount, uint256 fee);

    constructor(
      address _ttp, address _weth, address _swapRouter
    ) TSAggregator(_ttp) {
        weth = _weth;
        swapRouter = IUniswapRouterV2AVAX(_swapRouter);
    }

    function swapIn(
        address router,
        address vault,
        string calldata memo,
        address token,
        uint amount,
        uint amountOutMin,
        uint deadline
    ) public nonReentrant {
        tokenTransferProxy.transferTokens(token, msg.sender, address(this), amount);
        token.safeApprove(address(swapRouter), 0); // USDT quirk
        token.safeApprove(address(swapRouter), amount);

        address[] memory path = new address[](2);
        path[0] = token;
        path[1] = weth;
        swapRouter.swapExactTokensForAVAX(
            amount,
            amountOutMin,
            path,
            address(this),
            deadline
        );

        uint256 out = address(this).balance;
        {
            uint256 outMinusFee = skimFee(out);
            IThorchainRouter(router).depositWithExpiry{value: outMinusFee}(
                payable(vault),
                address(0),
                outMinusFee,
                memo,
                deadline
            );
        }
        emit SwapIn(msg.sender, token, amount, out+getFee(out), getFee(out), vault, memo);
    }

    function swapOut(address token, address to, uint256 amountOutMin) public payable nonReentrant {
        uint256 amount = skimFee(msg.value);
        address[] memory path = new address[](2);
        path[0] = weth;
        path[1] = token;
        swapRouter.swapExactAVAXForTokens{value: amount}(
            _parseAmountOutMin(amountOutMin),
            path,
            to,
            type(uint).max // deadline
        );
        emit SwapOut(to, token, msg.value, msg.value-amount);
    }
}

File 7 of 8 : IThorchainRouter.sol
// SPDX-License-Identifier: MIT
pragma solidity 0.8.10;

interface IThorchainRouter {
    function depositWithExpiry(
        address payable vault,
        address asset,
        uint amount,
        string memory memo,
        uint expiration
    ) external payable;
}

File 8 of 8 : IUniswapRouterV2AVAX.sol
// SPDX-License-Identifier: MIT
pragma solidity 0.8.10;

interface IUniswapRouterV2AVAX {
    function swapExactTokensForAVAX(
        uint256 amountIn,
        uint256 amountOutMin,
        address[] calldata path,
        address to,
        uint256 deadline
    ) external;
    function swapExactAVAXForTokens(
        uint amountOutMin,
        address[] calldata path,
        address to, uint deadline
    ) external payable;
}

Settings
{
  "remappings": [
    "hardhat/=node_modules/hardhat/"
  ],
  "optimizer": {
    "enabled": true,
    "runs": 200
  },
  "metadata": {
    "bytecodeHash": "ipfs"
  },
  "outputSelection": {
    "*": {
      "*": [
        "evm.bytecode",
        "evm.deployedBytecode",
        "devdoc",
        "userdoc",
        "metadata",
        "abi"
      ]
    }
  },
  "evmVersion": "london",
  "libraries": {}
}

Contract ABI

[{"inputs":[{"internalType":"address","name":"_ttp","type":"address"},{"internalType":"address","name":"_weth","type":"address"},{"internalType":"address","name":"_swapRouter","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"fee","type":"uint256"},{"indexed":false,"internalType":"address","name":"feeRecipient","type":"address"}],"name":"FeeSet","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":false,"internalType":"bool","name":"active","type":"bool"}],"name":"OwnerSet","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"from","type":"address"},{"indexed":false,"internalType":"address","name":"token","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"out","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"fee","type":"uint256"},{"indexed":false,"internalType":"address","name":"vault","type":"address"},{"indexed":false,"internalType":"string","name":"memo","type":"string"}],"name":"SwapIn","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"address","name":"token","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"fee","type":"uint256"}],"name":"SwapOut","type":"event"},{"inputs":[],"name":"fee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"feeRecipient","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"owners","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_fee","type":"uint256"},{"internalType":"address","name":"_feeRecipient","type":"address"}],"name":"setFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"bool","name":"active","type":"bool"}],"name":"setOwner","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"router","type":"address"},{"internalType":"address","name":"vault","type":"address"},{"internalType":"string","name":"memo","type":"string"},{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"amountOutMin","type":"uint256"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"swapIn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amountOutMin","type":"uint256"}],"name":"swapOut","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"swapRouter","outputs":[{"internalType":"contract IUniswapRouterV2AVAX","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tokenTransferProxy","outputs":[{"internalType":"contract TSAggregatorTokenTransferProxy","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"weth","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"stateMutability":"payable","type":"receive"}]

60806040526001805534801561001457600080fd5b50604051611053380380611053833981016040819052610033916100f9565b8261003f336001610080565b600480546001600160a01b03199081166001600160a01b0393841617909155600580548216948316949094179093556006805490931691161790555061013c565b6001600160a01b03821660008181526020818152604091829020805460ff191685151590811790915591519182527ff74826f11048fa8ecf33e91132bf280f6582ed97548a84e426b56e98526b9316910160405180910390a25050565b80516001600160a01b03811681146100f457600080fd5b919050565b60008060006060848603121561010e57600080fd5b610117846100dd565b9250610125602085016100dd565b9150610133604085016100dd565b90509250925092565b610f088061014b6000396000f3fe6080604052600436106100955760003560e01c8063516c731c11610059578063516c731c14610173578063b4f2e8b814610193578063c31c9c07146101b3578063ddca3f43146101d3578063e4d0c7f0146101f757600080fd5b8063022914a7146100a15780630eefdbad146100e65780633fc8cef31461011e578063469048401461013e57806348c314f41461015e57600080fd5b3661009c57005b600080fd5b3480156100ad57600080fd5b506100d16100bc366004610a2c565b60006020819052908152604090205460ff1681565b60405190151581526020015b60405180910390f35b3480156100f257600080fd5b50600454610106906001600160a01b031681565b6040516001600160a01b0390911681526020016100dd565b34801561012a57600080fd5b50600554610106906001600160a01b031681565b34801561014a57600080fd5b50600354610106906001600160a01b031681565b61017161016c366004610a4e565b610217565b005b34801561017f57600080fd5b5061017161018e366004610a8a565b6103cd565b34801561019f57600080fd5b506101716101ae366004610ac6565b610429565b3480156101bf57600080fd5b50600654610106906001600160a01b031681565b3480156101df57600080fd5b506101e960025481565b6040519081526020016100dd565b34801561020357600080fd5b50610171610212366004610af2565b61052a565b60015460011461025b5760405162461bcd60e51b815260206004820152600a6024820152695245454e5452414e435960b01b60448201526064015b60405180910390fd5b6002600155600061026b346107e0565b6040805160028082526060820183529293506000929091602083019080368337505060055482519293506001600160a01b0316918391506000906102b1576102b1610bb1565b60200260200101906001600160a01b031690816001600160a01b03168152505084816001815181106102e5576102e5610bb1565b6001600160a01b0392831660209182029290920101526006541663a2a1623d8361030e8661081e565b84886000196040518663ffffffff1660e01b81526004016103329493929190610c0b565b6000604051808303818588803b15801561034b57600080fd5b505af115801561035f573d6000803e3d6000fd5b50505050507f61fad1e4996f793deb2a6b2d07c7fe999e0ce4a95e1ca4662fd430f1c524401984863485346103949190610c56565b604080516001600160a01b03958616815294909316602085015291830152606082015260800160405180910390a1505060018055505050565b3360009081526020819052604090205460ff1661041b5760405162461bcd60e51b815260206004820152600c60248201526b155b985d5d1a1bdc9a5e995960a21b6044820152606401610252565b6104258282610851565b5050565b3360009081526020819052604090205460ff166104775760405162461bcd60e51b815260206004820152600c60248201526b155b985d5d1a1bdc9a5e995960a21b6044820152606401610252565b6103e88211156104c95760405162461bcd60e51b815260206004820152601c60248201527f6665652063616e206e6f74206265206d6f7265207468616e20313025000000006044820152606401610252565b6002829055600380546001600160a01b0319166001600160a01b0383169081179091556040805184815260208101929092527fc8242dc5446855370b781abbfc5d882af1d1a3cc29143216aba3558feb0ce925910160405180910390a15050565b6001546001146105695760405162461bcd60e51b815260206004820152600a6024820152695245454e5452414e435960b01b6044820152606401610252565b6002600155600480546040516368155ec160e01b81526001600160a01b0387811693820193909352336024820152306044820152606481018690529116906368155ec190608401600060405180830381600087803b1580156105ca57600080fd5b505af11580156105de573d6000803e3d6000fd5b50506006546105fd92506001600160a01b0387811692501660006108ae565b600654610617906001600160a01b038681169116856108ae565b604080516002808252606082018352600092602083019080368337019050509050848160008151811061064c5761064c610bb1565b6001600160a01b03928316602091820292909201015260055482519116908290600190811061067d5761067d610bb1565b6001600160a01b03928316602091820292909201015260065460405163676528d160e01b815291169063676528d1906106c29087908790869030908990600401610c6d565b600060405180830381600087803b1580156106dc57600080fd5b505af11580156106f0573d6000803e3d6000fd5b5050505060004790506000610704826107e0565b90508a6001600160a01b03166344bc937b828c6000858e8e8b6040518863ffffffff1660e01b815260040161073e96959493929190610cd2565b6000604051808303818588803b15801561075757600080fd5b505af115801561076b573d6000803e3d6000fd5b5050505050507fd0905d621f104066424412dcaf4dd7189ca00660fc08a026e5927026b8afa82c33878761079e8561092c565b6107a89086610d19565b6107b18661092c565b8e8e8e6040516107c8989796959493929190610d31565b60405180910390a15050600180555050505050505050565b6000806107ec8361092c565b905080156108175760035461080a906001600160a01b031682610973565b6108148184610c56565b92505b5090919050565b600061082b606483610d9b565b61083690600a610e93565b610841606484610e9f565b61084b9190610eb3565b92915050565b6001600160a01b03821660008181526020818152604091829020805460ff191685151590811790915591519182527ff74826f11048fa8ecf33e91132bf280f6582ed97548a84e426b56e98526b9316910160405180910390a25050565b600060405163095ea7b360e01b81526001600160a01b03841660048201528260248201526000806044836000895af19150506108e9816109c9565b6109265760405162461bcd60e51b815260206004820152600e60248201526d1054141493d59157d1905253115160921b6044820152606401610252565b50505050565b600060025460001415801561094b57506003546001600160a01b031615155b1561096b57612710600254836109619190610eb3565b61084b9190610e9f565b506000919050565b600080600080600085875af19050806109c45760405162461bcd60e51b815260206004820152601360248201527211551217d514905394d1915497d19052531151606a1b6044820152606401610252565b505050565b60003d826109db57806000803e806000fd5b80602081146109f3578015610a045760009250610a09565b816000803e60005115159250610a09565b600192505b5050919050565b80356001600160a01b0381168114610a2757600080fd5b919050565b600060208284031215610a3e57600080fd5b610a4782610a10565b9392505050565b600080600060608486031215610a6357600080fd5b610a6c84610a10565b9250610a7a60208501610a10565b9150604084013590509250925092565b60008060408385031215610a9d57600080fd5b610aa683610a10565b915060208301358015158114610abb57600080fd5b809150509250929050565b60008060408385031215610ad957600080fd5b82359150610ae960208401610a10565b90509250929050565b60008060008060008060008060e0898b031215610b0e57600080fd5b610b1789610a10565b9750610b2560208a01610a10565b9650604089013567ffffffffffffffff80821115610b4257600080fd5b818b0191508b601f830112610b5657600080fd5b813581811115610b6557600080fd5b8c6020828501011115610b7757600080fd5b602083019850809750505050610b8f60608a01610a10565b979a96995094979396956080850135955060a08501359460c001359350915050565b634e487b7160e01b600052603260045260246000fd5b600081518084526020808501945080840160005b83811015610c005781516001600160a01b031687529582019590820190600101610bdb565b509495945050505050565b848152608060208201526000610c246080830186610bc7565b6001600160a01b03949094166040830152506060015292915050565b634e487b7160e01b600052601160045260246000fd5b600082821015610c6857610c68610c40565b500390565b85815284602082015260a060408201526000610c8c60a0830186610bc7565b6001600160a01b0394909416606083015250608001529392505050565b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b6001600160a01b038781168252861660208201526040810185905260a060608201819052600090610d069083018587610ca9565b9050826080830152979650505050505050565b60008219821115610d2c57610d2c610c40565b500190565b600060018060a01b03808b168352808a16602084015288604084015287606084015286608084015280861660a08401525060e060c0830152610d7760e083018486610ca9565b9a9950505050505050505050565b634e487b7160e01b600052601260045260246000fd5b600082610daa57610daa610d85565b500690565b600181815b80851115610dea578160001904821115610dd057610dd0610c40565b80851615610ddd57918102915b93841c9390800290610db4565b509250929050565b600082610e015750600161084b565b81610e0e5750600061084b565b8160018114610e245760028114610e2e57610e4a565b600191505061084b565b60ff841115610e3f57610e3f610c40565b50506001821b61084b565b5060208310610133831016604e8410600b8410161715610e6d575081810a61084b565b610e778383610daf565b8060001904821115610e8b57610e8b610c40565b029392505050565b6000610a478383610df2565b600082610eae57610eae610d85565b500490565b6000816000190483118215151615610ecd57610ecd610c40565b50029056fea2646970667358221220eafea89ad2ae5e4d021f2bfbc4493f1ac8a8d356ded297382f5894bd3c9b6af564736f6c634300080a003300000000000000000000000069ba883af416ff5501d54d5e27a1f497fbd97156000000000000000000000000b31f66aa3c1e785363f0875a1b74e27b85fd66c700000000000000000000000060ae616a2155ee3d9a68541ba4544862310933d4

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

00000000000000000000000069ba883af416ff5501d54d5e27a1f497fbd97156000000000000000000000000b31f66aa3c1e785363f0875a1b74e27b85fd66c700000000000000000000000060ae616a2155ee3d9a68541ba4544862310933d4

-----Decoded View---------------
Arg [0] : _ttp (address): 0x69ba883af416ff5501d54d5e27a1f497fbd97156
Arg [1] : _weth (address): 0xb31f66aa3c1e785363f0875a1b74e27b85fd66c7
Arg [2] : _swapRouter (address): 0x60ae616a2155ee3d9a68541ba4544862310933d4

-----Encoded View---------------
3 Constructor Arguments found :
Arg [0] : 00000000000000000000000069ba883af416ff5501d54d5e27a1f497fbd97156
Arg [1] : 000000000000000000000000b31f66aa3c1e785363f0875a1b74e27b85fd66c7
Arg [2] : 00000000000000000000000060ae616a2155ee3d9a68541ba4544862310933d4


Block Transaction Gas Used Reward
Age Block Fee Address BC Fee Address Voting Power Jailed Incoming
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.