Contract Address Details

0x1d450Dd5Bb1E17032244A2E092c31376C31a30BF

Contract Name
AuctionCreation
Creator
0xb7d31d–e8f8e8 at 0x19f8d4–56cb71
Balance
0 mADA
Tokens
Fetching tokens...
Transactions
31 Transactions
Transfers
67 Transfers
Gas Used
21,050,592
Last Balance Update
40300354
Contract name:
AuctionCreation




Optimization enabled
true
Compiler version
v0.6.12+commit.27d51765




Optimization runs
200
Verified at
2023-12-15T01:05:47.587326Z

Constructor Arguments

000000000000000000000000e5f0d922691919aa32d15a58fe6a5936360c92260000000000000000000000003f0e141200916c8486726de82d0d3a014755d425000000000000000000000000ff1e379c7287e6f5d5827fa5324f2512f853b9b20000000000000000000000006c39056e1caeddd529ec83030d14976bad72259c000000000000000000000000da2f048c128506e720b0b0b32f20432157dde1c700000000000000000000000011482237bab3918d21df2cdbda6e73cbef486eac

Arg [0] (address) : 0xe5f0d922691919aa32d15a58fe6a5936360c9226
Arg [1] (address) : 0x3f0e141200916c8486726de82d0d3a014755d425
Arg [2] (address) : 0xff1e379c7287e6f5d5827fa5324f2512f853b9b2
Arg [3] (address) : 0x6c39056e1caeddd529ec83030d14976bad72259c
Arg [4] (address) : 0xda2f048c128506e720b0b0b32f20432157dde1c7
Arg [5] (address) : 0x11482237bab3918d21df2cdbda6e73cbef486eac

              

contracts/Molecule/AuctionCreation.sol

// SPDX-License-Identifier: UNLICENSED

pragma solidity 0.6.12;

import "../interfaces/IERC20.sol";
import "../Utils/SafeTransfer.sol";

interface IIHubTokenFactory {
    function createToken(
        uint256 _templateId,
        address payable _integratorFeeAccount,
        bytes calldata _data
    ) external payable returns (address token);
}

interface IPointList {
    function deployPointList(
        address _listOwner,
        address[] calldata _accounts,
        uint256[] calldata _amounts
    ) external payable returns (address pointList);
}

interface IIHubLauncher {
    function createLauncher(
        uint256 _templateId,
        address _token,
        uint256 _tokenSupply,
        address payable _integratorFeeAccount,
        bytes calldata _data
    ) external payable returns (address newLauncher);
}

interface IIHubMarket {
    function createMarket(
        uint256 _templateId,
        address _token,
        uint256 _tokenSupply,
        address payable _integratorFeeAccount,
        bytes calldata _data
    ) external payable returns (address newMarket);

    function setAuctionWallet(address payable _wallet) external;

    function setPostAuctionLauncher(address _postAUctionLauncher) external;

    function addAdminRole(address _address) external;

    function getAuctionTemplate(uint256 _templateId) external view returns (address);
}

interface IAuctionTemplate {
    function marketTemplate() external view returns (uint256);
}

// Auction Creation Molecule
// 1. Create Token
// 2. Create purplelist (Optional)
// 3. Create Auction with token address and purplelist address
// 4. Create Liquidity Launcher with auction and token address
// 5. Set destination wallet of auction to liquidity launcher
contract AuctionCreation is SafeTransfer {
    IIHubTokenFactory public iHubTokenFactory;
    IPointList public pointListFactory;
    IIHubLauncher public iHubLauncher;
    IIHubMarket public iHubMarket;
    address public factory;
    /// @dev Contract of the Tangleswap Nonfungible Position Manager.
    address public nonfungiblePositionManager;

    constructor(
        IIHubTokenFactory _iHubTokenFactory,
        IPointList _pointListFactory,
        IIHubLauncher _iHubLauncher,
        IIHubMarket _iHubMarket,
        address _factory,
        address _nonfungiblePositionManager
    ) public {
        iHubTokenFactory = _iHubTokenFactory;
        pointListFactory = _pointListFactory;
        iHubLauncher = _iHubLauncher;
        iHubMarket = _iHubMarket;
        factory = _factory;
        nonfungiblePositionManager = _nonfungiblePositionManager;
    }

    function prepareIHub(
        bytes memory tokenFactoryData,
        address[] memory _accounts,
        uint256[] memory _amounts,
        bytes memory marketData,
        bytes memory launcherData
    ) external payable {
        require(_accounts.length == _amounts.length, "!len");

        address token = createToken(tokenFactoryData);

        address pointList = createPointList(_accounts, _amounts);

        (address newMarket, uint256 tokenForSale) = createMarket(marketData, token, pointList);

        // IHub market has to give admin role to the user, since it's set to this contract initially
        // to allow the auction wallet to be set to launcher once it's been deployed
        IIHubMarket(newMarket).addAdminRole(msg.sender);
        IIHubMarket(newMarket).addAdminRole(address(iHubLauncher));

        createLauncher(launcherData, token, tokenForSale, newMarket);

        uint256 tokenBalanceRemaining = IERC20(token).balanceOf(address(this));
        if (tokenBalanceRemaining > 0) {
            _safeTransfer(token, msg.sender, tokenBalanceRemaining);
        }
    }

    function createToken(bytes memory tokenFactoryData) internal returns (address token) {
        (
            bool isDeployed,
            address deployedToken,
            uint256 _iHubTokenFactoryTemplateId,
            string memory _name,
            string memory _symbol,
            uint256 _initialSupply
        ) = abi.decode(tokenFactoryData, (bool, address, uint256, string, string, uint256));
        if (isDeployed) {
            token = deployedToken;
            IERC20(deployedToken).transferFrom(msg.sender, address(this), _initialSupply);
        } else {
            token = iHubTokenFactory.createToken(
                _iHubTokenFactoryTemplateId,
                address(0),
                abi.encode(_name, _symbol, msg.sender, _initialSupply)
            );
        }

        IERC20(token).approve(address(iHubMarket), _initialSupply);
        IERC20(token).approve(address(iHubLauncher), _initialSupply);
    }

    function createPointList(
        address[] memory _accounts,
        uint256[] memory _amounts
    ) internal returns (address pointList) {
        if (_accounts.length != 0) {
            pointList = pointListFactory.deployPointList(msg.sender, _accounts, _amounts);
        }
    }

    function createMarket(
        bytes memory marketData,
        address token,
        address pointList
    ) internal returns (address newMarket, uint256 tokenForSale) {
        (uint256 _marketTemplateId, bytes memory mData) = abi.decode(marketData, (uint256, bytes));

        tokenForSale = getTokenForSale(_marketTemplateId, mData);

        newMarket = iHubMarket.createMarket(
            _marketTemplateId,
            token,
            tokenForSale,
            address(0),
            abi.encodePacked(
                abi.encode(address(iHubMarket), token),
                mData,
                abi.encode(address(this), pointList, msg.sender)
            )
        );
    }

    function createLauncher(
        bytes memory launcherData,
        address token,
        uint256 tokenForSale,
        address newMarket
    ) internal returns (address newLauncher) {
        (uint256 _launcherTemplateId, uint256 _liquidityPercent, uint256 _locktime) = abi.decode(
            launcherData,
            (uint256, uint256, uint256)
        );

        if (_liquidityPercent > 0) {
            newLauncher = iHubLauncher.createLauncher(
                _launcherTemplateId,
                token,
                (tokenForSale * _liquidityPercent) / 10000,
                address(0),
                abi.encode(
                    nonfungiblePositionManager,
                    newMarket,
                    factory,
                    msg.sender,
                    msg.sender,
                    _liquidityPercent,
                    _locktime
                )
            );

            // Have to set auction wallet to the new launcher address AFTER the market is created
            // new launcher address is casted to payable to satisfy interface.
            IIHubMarket(newMarket).setAuctionWallet(payable(newLauncher));
            // set new launcher address
            IIHubMarket(newMarket).setPostAuctionLauncher(newLauncher);
        }
    }

    function getTokenForSale(
        uint256 marketTemplateId,
        bytes memory mData
    ) internal view returns (uint256 tokenForSale) {
        address auctionTemplate = iHubMarket.getAuctionTemplate(marketTemplateId);

        uint256 auctionTemplateId = IAuctionTemplate(auctionTemplate).marketTemplate();

        if (auctionTemplateId == 1) {
            (, tokenForSale) = abi.decode(mData, (uint256, uint256));
        } else {
            tokenForSale = abi.decode(mData, (uint256));
        }
    }
}
        

contracts/Utils/SafeTransfer.sol

pragma solidity 0.6.12;

contract SafeTransfer {
    address private constant ETH_ADDRESS = 0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE;

    /// @notice Event for token withdrawals.
    event TokensWithdrawn(address token, address to, uint256 amount);

    /// @dev Helper function to handle both ETH and ERC20 payments
    function _safeTokenPayment(address _token, address payable _to, uint256 _amount) internal {
        if (address(_token) == ETH_ADDRESS) {
            _safeTransferETH(_to, _amount);
        } else {
            _safeTransfer(_token, _to, _amount);
        }

        emit TokensWithdrawn(_token, _to, _amount);
    }

    /// @dev Helper function to handle both ETH and ERC20 payments
    function _tokenPayment(address _token, address payable _to, uint256 _amount) internal {
        if (address(_token) == ETH_ADDRESS) {
            _to.transfer(_amount);
        } else {
            _safeTransfer(_token, _to, _amount);
        }

        emit TokensWithdrawn(_token, _to, _amount);
    }

    /// @dev Transfer helper from UniswapV2 Router
    function _safeApprove(address token, address to, uint value) internal {
        // bytes4(keccak256(bytes('approve(address,uint256)')));
        // solhint-disable-next-line avoid-low-level-calls
        (bool success, bytes memory data) = token.call(abi.encodeWithSelector(0x095ea7b3, to, value));
        require(success && (data.length == 0 || abi.decode(data, (bool))), "TransferHelper: APPROVE_FAILED");
    }

    /**
     * There are many non-compliant ERC20 tokens... this can handle most, adapted from UniSwap V2
     * Im trying to make it a habit to put external calls last (reentrancy)
     * You can put this in an internal function if you like.
     */
    function _safeTransfer(address token, address to, uint256 amount) internal virtual {
        // solhint-disable-next-line avoid-low-level-calls
        (bool success, bytes memory data) = token.call(
            // 0xa9059cbb = bytes4(keccak256("transfer(address,uint256)"))
            abi.encodeWithSelector(0xa9059cbb, to, amount)
        );
        // solhint-disable-next-line reason-string
        require(success && (data.length == 0 || abi.decode(data, (bool))), "TransferHelper: TRANSFER_FAILED"); // ERC20 Transfer failed
    }

    function _safeTransferFrom(address token, address from, uint256 amount) internal virtual {
        // solhint-disable-next-line avoid-low-level-calls
        (bool success, bytes memory data) = token.call(
            // 0x23b872dd = bytes4(keccak256("transferFrom(address,address,uint256)"))
            abi.encodeWithSelector(0x23b872dd, from, address(this), amount)
        );
        // solhint-disable-next-line reason-string
        require(success && (data.length == 0 || abi.decode(data, (bool))), "TransferHelper: TRANSFER_FROM_FAILED"); // ERC20 TransferFrom failed
    }

    function _safeTransferFrom(address token, address from, address to, uint value) internal {
        // bytes4(keccak256(bytes('transferFrom(address,address,uint256)')));
        // solhint-disable-next-line avoid-low-level-calls
        (bool success, bytes memory data) = token.call(abi.encodeWithSelector(0x23b872dd, from, to, value));
        // solhint-disable-next-line reason-string
        require(success && (data.length == 0 || abi.decode(data, (bool))), "TransferHelper: TRANSFER_FROM_FAILED");
    }

    function _safeTransferETH(address to, uint value) internal {
        // solhint-disable-next-line avoid-low-level-calls
        (bool success, ) = to.call{value: value}(new bytes(0));
        // solhint-disable-next-line reason-string
        require(success, "TransferHelper: ETH_TRANSFER_FAILED");
    }
}
          

contracts/interfaces/IERC20.sol

pragma solidity 0.6.12;

interface IERC20 {
    function totalSupply() external view returns (uint256);

    function balanceOf(address account) external view returns (uint256);

    function allowance(address owner, address spender) external view returns (uint256);

    function approve(address spender, uint256 amount) external returns (bool);

    function name() external view returns (string memory);

    function symbol() external view returns (string memory);

    function decimals() external view returns (uint8);

    event Transfer(address indexed from, address indexed to, uint256 value);
    event Approval(address indexed owner, address indexed spender, uint256 value);

    function transferFrom(address from, address to, uint256 amount) external returns (bool);

    function permit(
        address owner,
        address spender,
        uint256 value,
        uint256 deadline,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) external;
}
          

Contract ABI

[{"type":"constructor","stateMutability":"nonpayable","inputs":[{"type":"address","name":"_iHubTokenFactory","internalType":"contract IIHubTokenFactory"},{"type":"address","name":"_pointListFactory","internalType":"contract IPointList"},{"type":"address","name":"_iHubLauncher","internalType":"contract IIHubLauncher"},{"type":"address","name":"_iHubMarket","internalType":"contract IIHubMarket"},{"type":"address","name":"_factory","internalType":"address"},{"type":"address","name":"_nonfungiblePositionManager","internalType":"address"}]},{"type":"event","name":"TokensWithdrawn","inputs":[{"type":"address","name":"token","internalType":"address","indexed":false},{"type":"address","name":"to","internalType":"address","indexed":false},{"type":"uint256","name":"amount","internalType":"uint256","indexed":false}],"anonymous":false},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address"}],"name":"factory","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"contract IIHubLauncher"}],"name":"iHubLauncher","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"contract IIHubMarket"}],"name":"iHubMarket","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"contract IIHubTokenFactory"}],"name":"iHubTokenFactory","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address"}],"name":"nonfungiblePositionManager","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"contract IPointList"}],"name":"pointListFactory","inputs":[]},{"type":"function","stateMutability":"payable","outputs":[],"name":"prepareIHub","inputs":[{"type":"bytes","name":"tokenFactoryData","internalType":"bytes"},{"type":"address[]","name":"_accounts","internalType":"address[]"},{"type":"uint256[]","name":"_amounts","internalType":"uint256[]"},{"type":"bytes","name":"marketData","internalType":"bytes"},{"type":"bytes","name":"launcherData","internalType":"bytes"}]}]
            

Deployed ByteCode

0x6080604052600436106100705760003560e01c8063b44a27221161004e578063b44a27221461036f578063b811cefc14610384578063c45a015514610399578063f05f3d4e146103ae57610070565b80631070653214610075578063737407051461032957806383c19e311461035a575b600080fd5b610327600480360360a081101561008b57600080fd5b810190602081018135600160201b8111156100a557600080fd5b8201836020820111156100b757600080fd5b803590602001918460018302840111600160201b831117156100d857600080fd5b91908080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152509295949360208101935035915050600160201b81111561012a57600080fd5b82018360208201111561013c57600080fd5b803590602001918460208302840111600160201b8311171561015d57600080fd5b9190808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152509295949360208101935035915050600160201b8111156101ac57600080fd5b8201836020820111156101be57600080fd5b803590602001918460208302840111600160201b831117156101df57600080fd5b9190808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152509295949360208101935035915050600160201b81111561022e57600080fd5b82018360208201111561024057600080fd5b803590602001918460018302840111600160201b8311171561026157600080fd5b91908080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152509295949360208101935035915050600160201b8111156102b357600080fd5b8201836020820111156102c557600080fd5b803590602001918460018302840111600160201b831117156102e657600080fd5b91908080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152509295506103c3945050505050565b005b34801561033557600080fd5b5061033e6105a3565b604080516001600160a01b039092168252519081900360200190f35b34801561036657600080fd5b5061033e6105b2565b34801561037b57600080fd5b5061033e6105c1565b34801561039057600080fd5b5061033e6105d0565b3480156103a557600080fd5b5061033e6105df565b3480156103ba57600080fd5b5061033e6105ee565b8251845114610402576040805162461bcd60e51b8152602060048083019190915260248201526310b632b760e11b604482015290519081900360640190fd5b600061040d866105fd565b9050600061041b8686610b44565b905060008061042b868585610c5f565b91509150816001600160a01b0316636595171c336040518263ffffffff1660e01b815260040180826001600160a01b03168152602001915050600060405180830381600087803b15801561047e57600080fd5b505af1158015610492573d6000803e3d6000fd5b50506002546040805163196545c760e21b81526001600160a01b03928316600482015290519186169350636595171c925060248082019260009290919082900301818387803b1580156104e457600080fd5b505af11580156104f8573d6000803e3d6000fd5b5050505061050885858385610fa3565b506000846001600160a01b03166370a08231306040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b15801561055857600080fd5b505afa15801561056c573d6000803e3d6000fd5b505050506040513d602081101561058257600080fd5b5051905080156105975761059785338361121f565b50505050505050505050565b6000546001600160a01b031681565b6002546001600160a01b031681565b6005546001600160a01b031681565b6001546001600160a01b031681565b6004546001600160a01b031681565b6003546001600160a01b031681565b60008060008060608060008780602001905160c081101561061d57600080fd5b815160208301516040808501516060860180519251949693959194939182019284600160201b82111561064f57600080fd5b90830190602082018581111561066457600080fd5b8251600160201b81118282018810171561067d57600080fd5b82525081516020918201929091019080838360005b838110156106aa578181015183820152602001610692565b50505050905090810190601f1680156106d75780820380516001836020036101000a031916815260200191505b5060405260200180516040519392919084600160201b8211156106f957600080fd5b90830190602082018581111561070e57600080fd5b8251600160201b81118282018810171561072757600080fd5b82525081516020918201929091019080838360005b8381101561075457818101518382015260200161073c565b50505050905090810190601f1680156107815780820380516001836020036101000a031916815260200191505b5060405260200151969c50949a509298509096509450919250508615905061082f57604080516323b872dd60e01b815233600482015230602482015260448101839052905195975087956001600160a01b038716916323b872dd9160648083019260209291908290030181600087803b1580156107fd57600080fd5b505af1158015610811573d6000803e3d6000fd5b505050506040513d602081101561082757600080fd5b50610a349050565b60008054906101000a90046001600160a01b03166001600160a01b031663870837d785600086863387604051602001808060200180602001856001600160a01b03168152602001848152602001838103835287818151815260200191508051906020019080838360005b838110156108b1578181015183820152602001610899565b50505050905090810190601f1680156108de5780820380516001836020036101000a031916815260200191505b50838103825286518152865160209182019188019080838360005b838110156109115781810151838201526020016108f9565b50505050905090810190601f16801561093e5780820380516001836020036101000a031916815260200191505b5096505050505050506040516020818303038152906040526040518463ffffffff1660e01b815260040180848152602001836001600160a01b0316815260200180602001828103825283818151815260200191508051906020019080838360005b838110156109b757818101518382015260200161099f565b50505050905090810190601f1680156109e45780820380516001836020036101000a031916815260200191505b50945050505050602060405180830381600087803b158015610a0557600080fd5b505af1158015610a19573d6000803e3d6000fd5b505050506040513d6020811015610a2f57600080fd5b505196505b6003546040805163095ea7b360e01b81526001600160a01b0392831660048201526024810184905290519189169163095ea7b3916044808201926020929091908290030181600087803b158015610a8a57600080fd5b505af1158015610a9e573d6000803e3d6000fd5b505050506040513d6020811015610ab457600080fd5b50506002546040805163095ea7b360e01b81526001600160a01b0392831660048201526024810184905290519189169163095ea7b3916044808201926020929091908290030181600087803b158015610b0c57600080fd5b505af1158015610b20573d6000803e3d6000fd5b505050506040513d6020811015610b3657600080fd5b509698975050505050505050565b60008251600014610c595760015460405163424599a360e01b815233600482018181526060602484019081528751606485015287516001600160a01b039095169463424599a394899389939092909160448101916084909101906020808801910280838360005b83811015610bc3578181015183820152602001610bab565b50505050905001838103825284818151815260200191508051906020019060200280838360005b83811015610c02578181015183820152602001610bea565b5050505090500195505050505050602060405180830381600087803b158015610c2a57600080fd5b505af1158015610c3e573d6000803e3d6000fd5b505050506040513d6020811015610c5457600080fd5b505190505b92915050565b60008060006060868060200190516040811015610c7b57600080fd5b815160208301805160405192949293830192919084600160201b821115610ca157600080fd5b908301906020820185811115610cb657600080fd5b8251600160201b811182820188101715610ccf57600080fd5b82525081516020918201929091019080838360005b83811015610cfc578181015183820152602001610ce4565b50505050905090810190601f168015610d295780820380516001836020036101000a031916815260200191505b5060405250505091509150610d3e8282611389565b600354604080516001600160a01b0392831660208083018290528b851683850152835180840385018152606084018552306080850152948b1660a08401523360c0808501919091528451808503909101815260e084019094528451959850909463aa1bd2f69488948d948b946000948b939261010001918291908601908083835b60208310610dde5780518252601f199092019160209182019101610dbf565b51815160209384036101000a600019018019909216911617905286519190930192860191508083835b60208310610e265780518252601f199092019160209182019101610e07565b51815160209384036101000a600019018019909216911617905285519190930192850191508083835b60208310610e6e5780518252601f199092019160209182019101610e4f565b6001836020036101000a03801982511681845116808217855250505050505090500193505050506040516020818303038152906040526040518663ffffffff1660e01b815260040180868152602001856001600160a01b03168152602001848152602001836001600160a01b0316815260200180602001828103825283818151815260200191508051906020019080838360005b83811015610f1a578181015183820152602001610f02565b50505050905090810190601f168015610f475780820380516001836020036101000a031916815260200191505b509650505050505050602060405180830381600087803b158015610f6a57600080fd5b505af1158015610f7e573d6000803e3d6000fd5b505050506040513d6020811015610f9457600080fd5b50519792965091945050505050565b600080600080878060200190516060811015610fbe57600080fd5b508051602082015160409092015190945090925090508115611214576002546001600160a01b031663632cef9084896127108a8702600554600454604080516001600160a01b039384166020808301919091528f8516828401529284166060820152336080820181905260a08083019190915260c082018d905260e08083018d9052835180840382018152610100840194859052908b901b6001600160e01b031916909352610104820189815294881661012483015295909404610144850181905260006101648601819052610184860196875282516101a487015282519196909592949390926101c4019190850190808383895b838110156110cb5781810151838201526020016110b3565b50505050905090810190601f1680156110f85780820380516001836020036101000a031916815260200191505b509650505050505050602060405180830381600087803b15801561111b57600080fd5b505af115801561112f573d6000803e3d6000fd5b505050506040513d602081101561114557600080fd5b5051604080516326a1c88b60e21b81526001600160a01b038084166004830152915192965090871691639a87222c9160248082019260009290919082900301818387803b15801561119557600080fd5b505af11580156111a9573d6000803e3d6000fd5b50505050846001600160a01b031662146872856040518263ffffffff1660e01b815260040180826001600160a01b03168152602001915050600060405180830381600087803b1580156111fb57600080fd5b505af115801561120f573d6000803e3d6000fd5b505050505b505050949350505050565b604080516001600160a01b038481166024830152604480830185905283518084039091018152606490920183526020820180516001600160e01b031663a9059cbb60e01b178152925182516000946060949389169392918291908083835b6020831061129c5780518252601f19909201916020918201910161127d565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d80600081146112fe576040519150601f19603f3d011682016040523d82523d6000602084013e611303565b606091505b5091509150818015611331575080511580611331575080806020019051602081101561132e57600080fd5b50515b611382576040805162461bcd60e51b815260206004820152601f60248201527f5472616e7366657248656c7065723a205452414e534645525f4641494c454400604482015290519081900360640190fd5b5050505050565b60035460408051634b939ed760e01b815260048101859052905160009283926001600160a01b0390911691634b939ed791602480820192602092909190829003018186803b1580156113da57600080fd5b505afa1580156113ee573d6000803e3d6000fd5b505050506040513d602081101561140457600080fd5b505160408051630d9f230760e11b815290519192506000916001600160a01b03841691631b3e460e916004808301926020929190829003018186803b15801561144c57600080fd5b505afa158015611460573d6000803e3d6000fd5b505050506040513d602081101561147657600080fd5b5051905060018114156114a45783806020019051604081101561149857600080fd5b506020015192506114be565b8380602001905160208110156114b957600080fd5b505192505b50509291505056fea2646970667358221220280ef72c7eec4469cd67122a8f6a2e66db9f0d5f294022c7f9144e4722f7064064736f6c634300060c0033