Contract 0x0cc2caed31490b546c741bd93dbba8ab387f7f2c 1

 

Contract Overview

Polygon: Fx ERC20 Child Tunnel
Balance:
0 MATIC

MATIC Value:
$0.00

Token:
 
Txn Hash Method
Block
From
To
Value [Txn Fee]
0x577223620bdc57d0fc3b145d81e7b16641e59b0a13759b1870cb493eebfd64d7Withdraw259373442022-03-14 15:17:08106 days 18 hrs ago0x2254e4d1b41f2dd3969a79b994e6ee8c3c6f2c71 IN  Polygon: Fx ERC20 Child Tunnel0 MATIC0.001581827513 30.884210889
0xded6d09990c141fed7649681db617222b0e6afcc118f06a376a1bbc812576379Withdraw241808112022-01-26 9:21:45154 days 25 mins ago0x679606f3b37c49946f5aa7774a37f03387c7f264 IN  Polygon: Fx ERC20 Child Tunnel0 MATIC0.003146547434 75.540102615
0xf73c763aea3ac5e2bc56547aea1ee019915942d72d14e663ff9f72d43524b0c3Withdraw230248732021-12-27 13:19:57183 days 20 hrs ago0xdb9923a6845f74c9943877324b89804e396703df IN  Polygon: Fx ERC20 Child Tunnel0 MATIC0.0015379830
0xf59f0c393001fde989f5d23871a0e036a9d82bf8c2e382f76b61e409a688a3fbWithdraw228261552021-12-22 11:25:19188 days 22 hrs ago0xdb9923a6845f74c9943877324b89804e396703df IN  Polygon: Fx ERC20 Child Tunnel0 MATIC0.0015379830
0x7de4ba2820022f7c403002122b154776b158c12a1c33d5297faa482b2a0925dfWithdraw227833162021-12-21 9:21:32190 days 25 mins ago0xdb9923a6845f74c9943877324b89804e396703df IN  Polygon: Fx ERC20 Child Tunnel0 MATIC0.0015379830
0xe2036f6ab4990623e5853439928e5cd16555ca5d4eb670d18db3e9af3930f065Withdraw226302412021-12-17 11:52:06193 days 21 hrs ago0xdb9923a6845f74c9943877324b89804e396703df IN  Polygon: Fx ERC20 Child Tunnel0 MATIC0.0015365430
0x9938ee8d44d8bac603bbe555afc9fddcef5b81286aa8d380b3c7d79b6453a910Withdraw226273982021-12-17 10:08:54193 days 23 hrs ago0xdb9923a6845f74c9943877324b89804e396703df IN  Polygon: Fx ERC20 Child Tunnel0 MATIC0.0015376230
0x4760314ea3320c2135167d678b0a88a58c9ae29a56145fd38787c36ecf345703Withdraw225548262021-12-15 13:47:17195 days 19 hrs ago0xdb9923a6845f74c9943877324b89804e396703df IN  Polygon: Fx ERC20 Child Tunnel0 MATIC0.0015361830
0x3be9cf706b97b82b87d457a651ac0f9c75ed5eb63ac1eeba377ceea8d237f11bSet Fx Root Tunn...217871882021-11-25 14:22:16215 days 19 hrs ago0x020f35319b48c0303c8ad2f57c5ca907cab5129f IN  Polygon: Fx ERC20 Child Tunnel0 MATIC0.0013208730
0x1b6deed66ad35bdbf1b0c3b6c53bc39dda93947b2627a08dc4d8761ba53b32460x60806040217838242021-11-25 12:18:05215 days 21 hrs ago0x020f35319b48c0303c8ad2f57c5ca907cab5129f IN  Create: FxERC20ChildTunnel0 MATIC0.0380896830
[ Download CSV Export 
Parent Txn Hash Block From To Value
Loading
This contract may be a proxy contract. Click on More Options and select Is this a proxy? to confirm and enable the "Read as Proxy" & "Write as Proxy" tabs.

Contract Source Code Verified (Exact Match)

Contract Name:
FxERC20ChildTunnel

Compiler Version
v0.8.0+commit.c7dfd78e

Optimization Enabled:
Yes with 9999 runs

Other Settings:
default evmVersion
File 1 of 5 : FxERC20ChildTunnel.sol
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;

import {FxBaseChildTunnel} from "../../tunnel/FxBaseChildTunnel.sol";
import {Create2} from "../../lib/Create2.sol";
import {IFxERC20} from "../../tokens/IFxERC20.sol";

/**
 * @title FxERC20ChildTunnel
 */
contract FxERC20ChildTunnel is FxBaseChildTunnel, Create2 {
    bytes32 public constant DEPOSIT = keccak256("DEPOSIT");
    bytes32 public constant MAP_TOKEN = keccak256("MAP_TOKEN");
    string public constant SUFFIX_NAME = " (FXERC20)";
    string public constant PREFIX_SYMBOL = "fx";

    // event for token maping
    event TokenMapped(address indexed rootToken, address indexed childToken);
    // root to child token
    mapping(address => address) public rootToChildToken;
    // token template
    address public tokenTemplate;

    constructor(address _fxChild, address _tokenTemplate) FxBaseChildTunnel(_fxChild) {
        tokenTemplate = _tokenTemplate;
        require(_isContract(_tokenTemplate), "Token template is not contract");
    }

    function withdraw(address childToken, uint256 amount) public {
        _withdraw(childToken, msg.sender, amount);
    }

    function withdrawTo(
        address childToken,
        address receiver,
        uint256 amount
    ) public {
        _withdraw(childToken, receiver, amount);
    }

    //
    // Internal methods
    //

    function _processMessageFromRoot(
        uint256, /* stateId */
        address sender,
        bytes memory data
    ) internal override validateSender(sender) {
        // decode incoming data
        (bytes32 syncType, bytes memory syncData) = abi.decode(data, (bytes32, bytes));

        if (syncType == DEPOSIT) {
            _syncDeposit(syncData);
        } else if (syncType == MAP_TOKEN) {
            _mapToken(syncData);
        } else {
            revert("FxERC20ChildTunnel: INVALID_SYNC_TYPE");
        }
    }

    function _mapToken(bytes memory syncData) internal returns (address) {
        (address rootToken, string memory name, string memory symbol, uint8 decimals) = abi.decode(
            syncData,
            (address, string, string, uint8)
        );

        // get root to child token
        address childToken = rootToChildToken[rootToken];

        // check if it's already mapped
        require(childToken == address(0x0), "FxERC20ChildTunnel: ALREADY_MAPPED");

        // deploy new child token
        bytes32 salt = keccak256(abi.encodePacked(rootToken));
        childToken = createClone(salt, tokenTemplate);
        IFxERC20(childToken).initialize(
            address(this),
            rootToken,
            string(abi.encodePacked(name, SUFFIX_NAME)),
            string(abi.encodePacked(PREFIX_SYMBOL, symbol)),
            decimals
        );

        // map the token
        rootToChildToken[rootToken] = childToken;
        emit TokenMapped(rootToken, childToken);

        // return new child token
        return childToken;
    }

    function _syncDeposit(bytes memory syncData) internal {
        (address rootToken, address depositor, address to, uint256 amount, bytes memory depositData) = abi.decode(
            syncData,
            (address, address, address, uint256, bytes)
        );
        address childToken = rootToChildToken[rootToken];

        // deposit tokens
        IFxERC20 childTokenContract = IFxERC20(childToken);
        childTokenContract.mint(to, amount);

        // call `onTokenTranfer` on `to` with limit and ignore error
        if (_isContract(to)) {
            uint256 txGas = 2000000;
            bool success = false;
            bytes memory data = abi.encodeWithSignature(
                "onTokenTransfer(address,address,address,address,uint256,bytes)",
                rootToken,
                childToken,
                depositor,
                to,
                amount,
                depositData
            );
            // solium-disable-next-line security/no-inline-assembly
            assembly {
                success := call(txGas, to, 0, add(data, 0x20), mload(data), 0, 0)
            }
        }
    }

    function _withdraw(
        address childToken,
        address receiver,
        uint256 amount
    ) internal {
        IFxERC20 childTokenContract = IFxERC20(childToken);
        // child token contract will have root token
        address rootToken = childTokenContract.connectedToken();

        // validate root and child token mapping
        require(
            childToken != address(0x0) && rootToken != address(0x0) && childToken == rootToChildToken[rootToken],
            "FxERC20ChildTunnel: NO_MAPPED_TOKEN"
        );

        // withdraw tokens
        childTokenContract.burn(msg.sender, amount);

        // send message to root regarding token burn
        _sendMessageToRoot(abi.encode(rootToken, childToken, receiver, amount));
    }

    // check if address is contract
    function _isContract(address _addr) private view returns (bool) {
        uint32 size;
        assembly {
            size := extcodesize(_addr)
        }
        return (size > 0);
    }
}

File 2 of 5 : FxBaseChildTunnel.sol
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;

// IFxMessageProcessor represents interface to process message
interface IFxMessageProcessor {
    function processMessageFromRoot(
        uint256 stateId,
        address rootMessageSender,
        bytes calldata data
    ) external;
}

/**
 * @notice Mock child tunnel contract to receive and send message from L2
 */
abstract contract FxBaseChildTunnel is IFxMessageProcessor {
    // MessageTunnel on L1 will get data from this event
    event MessageSent(bytes message);

    // fx child
    address public fxChild;

    // fx root tunnel
    address public fxRootTunnel;

    constructor(address _fxChild) {
        fxChild = _fxChild;
    }

    // Sender must be fxRootTunnel in case of ERC20 tunnel
    modifier validateSender(address sender) {
        require(sender == fxRootTunnel, "FxBaseChildTunnel: INVALID_SENDER_FROM_ROOT");
        _;
    }

    // set fxRootTunnel if not set already
    function setFxRootTunnel(address _fxRootTunnel) external {
        require(fxRootTunnel == address(0x0), "FxBaseChildTunnel: ROOT_TUNNEL_ALREADY_SET");
        fxRootTunnel = _fxRootTunnel;
    }

    function processMessageFromRoot(
        uint256 stateId,
        address rootMessageSender,
        bytes calldata data
    ) external override {
        require(msg.sender == fxChild, "FxBaseChildTunnel: INVALID_SENDER");
        _processMessageFromRoot(stateId, rootMessageSender, data);
    }

    /**
     * @notice Emit message that can be received on Root Tunnel
     * @dev Call the internal function when need to emit message
     * @param message bytes message that will be sent to Root Tunnel
     * some message examples -
     *   abi.encode(tokenId);
     *   abi.encode(tokenId, tokenMetadata);
     *   abi.encode(messageType, messageData);
     */
    function _sendMessageToRoot(bytes memory message) internal {
        emit MessageSent(message);
    }

    /**
     * @notice Process message received from Root Tunnel
     * @dev function needs to be implemented to handle message as per requirement
     * This is called by onStateReceive function.
     * Since it is called via a system call, any event will not be emitted during its execution.
     * @param stateId unique state id
     * @param sender root message sender
     * @param message bytes message that was sent from Root Tunnel
     */
    function _processMessageFromRoot(
        uint256 stateId,
        address sender,
        bytes memory message
    ) internal virtual;
}

File 3 of 5 : Create2.sol
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;

// Create2 adds common methods for minimal proxy with create2
abstract contract Create2 {
    // creates clone using minimal proxy
    function createClone(bytes32 _salt, address _target) internal returns (address _result) {
        bytes20 _targetBytes = bytes20(_target);

        assembly {
            let clone := mload(0x40)
            mstore(clone, 0x3d602d80600a3d3981f3363d3d373d3d3d363d73000000000000000000000000)
            mstore(add(clone, 0x14), _targetBytes)
            mstore(add(clone, 0x28), 0x5af43d82803e903d91602b57fd5bf30000000000000000000000000000000000)
            _result := create2(0, clone, 0x37, _salt)
        }

        require(_result != address(0), "Create2: Failed on minimal deploy");
    }

    // get minimal proxy creation code
    function minimalProxyCreationCode(address logic) internal pure returns (bytes memory) {
        bytes10 creation = 0x3d602d80600a3d3981f3;
        bytes10 prefix = 0x363d3d373d3d3d363d73;
        bytes20 targetBytes = bytes20(logic);
        bytes15 suffix = 0x5af43d82803e903d91602b57fd5bf3;
        return abi.encodePacked(creation, prefix, targetBytes, suffix);
    }

    // get computed create2 address
    function computedCreate2Address(
        bytes32 salt,
        bytes32 bytecodeHash,
        address deployer
    ) public pure returns (address) {
        bytes32 _data = keccak256(abi.encodePacked(bytes1(0xff), deployer, salt, bytecodeHash));
        return address(uint160(uint256(_data)));
    }
}

File 4 of 5 : IFxERC20.sol
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;

import {IERC20} from "../lib/IERC20.sol";

interface IFxERC20 is IERC20 {
    function fxManager() external returns (address);

    function connectedToken() external returns (address);

    function initialize(
        address _fxManager,
        address _connectedToken,
        string memory _name,
        string memory _symbol,
        uint8 _decimals
    ) external;

    function mint(address user, uint256 amount) external;

    function burn(address user, uint256 amount) external;
}

File 5 of 5 : IERC20.sol
// SPDX-License-Identifier: MIT
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);
}

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

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"address","name":"_fxChild","type":"address"},{"internalType":"address","name":"_tokenTemplate","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bytes","name":"message","type":"bytes"}],"name":"MessageSent","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"rootToken","type":"address"},{"indexed":true,"internalType":"address","name":"childToken","type":"address"}],"name":"TokenMapped","type":"event"},{"inputs":[],"name":"DEPOSIT","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAP_TOKEN","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PREFIX_SYMBOL","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"SUFFIX_NAME","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"salt","type":"bytes32"},{"internalType":"bytes32","name":"bytecodeHash","type":"bytes32"},{"internalType":"address","name":"deployer","type":"address"}],"name":"computedCreate2Address","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"fxChild","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"fxRootTunnel","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"stateId","type":"uint256"},{"internalType":"address","name":"rootMessageSender","type":"address"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"processMessageFromRoot","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"rootToChildToken","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_fxRootTunnel","type":"address"}],"name":"setFxRootTunnel","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"tokenTemplate","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"childToken","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"childToken","type":"address"},{"internalType":"address","name":"receiver","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"withdrawTo","outputs":[],"stateMutability":"nonpayable","type":"function"}]

60806040523480156200001157600080fd5b506040516200167a3803806200167a8339810160408190526200003491620000c7565b600080546001600160a01b038085166001600160a01b03199283161790925560038054928416929091169190911790556200006f816200009f565b620000975760405162461bcd60e51b81526004016200008e90620000fe565b60405180910390fd5b505062000135565b63ffffffff813b1615155b919050565b80516001600160a01b0381168114620000aa57600080fd5b60008060408385031215620000da578182fd5b620000e583620000af565b9150620000f560208401620000af565b90509250929050565b6020808252601e908201527f546f6b656e2074656d706c617465206973206e6f7420636f6e74726163740000604082015260600190565b61153580620001456000396000f3fe608060405234801561001057600080fd5b50600436106100df5760003560e01c8063886a69ba1161008c578063c3b35a7e11610066578063c3b35a7e1461017f578063d81c8e5214610192578063ea60c7c41461019a578063f3fef3a3146101ad576100df565b8063886a69ba1461014257806388837094146101575780639a7c4b711461016c576100df565b8063450d11f0116100bd578063450d11f01461011f5780637337957f146101275780637f1e9cb01461013a576100df565b80630814d3dd146100e45780633740d5a01461010257806339c6c9e014610117575b600080fd5b6100ec6101c0565b6040516100f9919061109e565b60405180910390f35b61010a6101dc565b6040516100f991906111e1565b61010a610215565b6100ec61024e565b6100ec610135366004610eae565b61026a565b6100ec6102a9565b61014a6102c5565b6040516100f991906111d8565b61016a610165366004610cf8565b6102e9565b005b61016a61017a366004610f2b565b610389565b61016a61018d366004610e43565b610421565b61014a610431565b6100ec6101a8366004610cf8565b610455565b61016a6101bb366004610e83565b61047d565b60035473ffffffffffffffffffffffffffffffffffffffff1681565b6040518060400160405280600281526020017f667800000000000000000000000000000000000000000000000000000000000081525081565b6040518060400160405280600a81526020017f202846584552433230290000000000000000000000000000000000000000000081525081565b60005473ffffffffffffffffffffffffffffffffffffffff1681565b60008060ff60f81b838686604051602001610288949392919061100b565b60408051808303601f19018152919052805160209091012095945050505050565b60015473ffffffffffffffffffffffffffffffffffffffff1681565b7f2cef46a936bdc5b7e6e8c71aa04560c41cf7d88bb26901a7e7f4936ff02accad81565b60015473ffffffffffffffffffffffffffffffffffffffff1615610342576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161033990611422565b60405180910390fd5b600180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055565b60005473ffffffffffffffffffffffffffffffffffffffff1633146103da576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610339906111f4565b61041b848484848080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061048c92505050565b50505050565b61042c8383836105a4565b505050565b7f87a7811f4bfedea3d341ad165680ae306b01aaeacc205d227629cf157dd9f82181565b60026020526000908152604090205473ffffffffffffffffffffffffffffffffffffffff1681565b6104888233836105a4565b5050565b600154829073ffffffffffffffffffffffffffffffffffffffff8083169116146104e2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161033990611251565b600080838060200190518101906104f99190610ee6565b915091507f87a7811f4bfedea3d341ad165680ae306b01aaeacc205d227629cf157dd9f8218214156105335761052e8161078d565b61059c565b7f2cef46a936bdc5b7e6e8c71aa04560c41cf7d88bb26901a7e7f4936ff02accad82141561056a57610564816108fc565b5061059c565b6040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610339906112ae565b505050505050565b600083905060008173ffffffffffffffffffffffffffffffffffffffff16630a8a49146040518163ffffffff1660e01b8152600401602060405180830381600087803b1580156105f357600080fd5b505af1158015610607573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061062b9190610d1b565b905073ffffffffffffffffffffffffffffffffffffffff851615801590610667575073ffffffffffffffffffffffffffffffffffffffff811615155b801561069c575073ffffffffffffffffffffffffffffffffffffffff8082166000908152600260205260409020548682169116145b6106d2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016103399061130b565b6040517f9dc29fac00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff831690639dc29fac9061072690339087906004016111b2565b600060405180830381600087803b15801561074057600080fd5b505af1158015610754573d6000803e3d6000fd5b5050505061078681868686604051602001610772949392919061111a565b604051602081830303815290604052610b79565b5050505050565b6000806000806000858060200190518101906107a99190610d37565b73ffffffffffffffffffffffffffffffffffffffff808616600090815260026020526040908190205490517f40c10f19000000000000000000000000000000000000000000000000000000008152969b5094995092975090955093501690819081906340c10f199061082190889088906004016111b2565b600060405180830381600087803b15801561083b57600080fd5b505af115801561084f573d6000803e3d6000fd5b5050505061085c85610bb3565b156108f2576000621e8480905060008089858a8a8a8a604051602401610887969594939291906110bf565b60408051601f198184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f166480c20000000000000000000000000000000000000000000000000000000017815281519192506000918291828c88f1505050505b5050505050505050565b6000806000806000858060200190518101906109189190610db7565b73ffffffffffffffffffffffffffffffffffffffff8085166000908152600260205260409020549498509296509094509250168015610983576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161033990611368565b6000856040516020016109969190610fdb565b60408051601f1981840301815291905280516020909101206003549091506109d590829073ffffffffffffffffffffffffffffffffffffffff16610bbf565b91508173ffffffffffffffffffffffffffffffffffffffff16638420ce993088886040518060400160405280600a81526020017f2028465845524332302900000000000000000000000000000000000000000000815250604051602001610a3d92919061106f565b6040516020818303038152906040526040518060400160405280600281526020017f667800000000000000000000000000000000000000000000000000000000000081525089604051602001610a9492919061106f565b604051602081830303815290604052886040518663ffffffff1660e01b8152600401610ac4959493929190611151565b600060405180830381600087803b158015610ade57600080fd5b505af1158015610af2573d6000803e3d6000fd5b5050505073ffffffffffffffffffffffffffffffffffffffff86811660008181526002602052604080822080547fffffffffffffffffffffffff0000000000000000000000000000000000000000169487169485179055517f85920d35e6c72f6b2affffa04298b0cecfeba86e4a9f407df661f1cb8ab5e6179190a3509695505050505050565b7f8c5261668696ce22758910d05bab8f186d6eb247ceac2af2e82c7dc17669b03681604051610ba891906111e1565b60405180910390a150565b3b63ffffffff16151590565b6000808260601b90506040517f3d602d80600a3d3981f3363d3d373d3d3d363d7300000000000000000000000081528160148201527f5af43d82803e903d91602b57fd5bf300000000000000000000000000000000006028820152846037826000f592505073ffffffffffffffffffffffffffffffffffffffff8216610c71576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610339906113c5565b5092915050565b600082601f830112610c88578081fd5b815167ffffffffffffffff80821115610ca357610ca36114ab565b6040516020601f19601f8501168201018181108382111715610cc757610cc76114ab565b604052828152848301602001861015610cde578384fd5b610cef83602083016020880161147f565b95945050505050565b600060208284031215610d09578081fd5b8135610d14816114da565b9392505050565b600060208284031215610d2c578081fd5b8151610d14816114da565b600080600080600060a08688031215610d4e578081fd5b8551610d59816114da565b6020870151909550610d6a816114da565b6040870151909450610d7b816114da565b60608701516080880151919450925067ffffffffffffffff811115610d9e578182fd5b610daa88828901610c78565b9150509295509295909350565b60008060008060808587031215610dcc578384fd5b8451610dd7816114da565b602086015190945067ffffffffffffffff80821115610df4578485fd5b610e0088838901610c78565b94506040870151915080821115610e15578384fd5b50610e2287828801610c78565b925050606085015160ff81168114610e38578182fd5b939692955090935050565b600080600060608486031215610e57578283fd5b8335610e62816114da565b92506020840135610e72816114da565b929592945050506040919091013590565b60008060408385031215610e95578182fd5b8235610ea0816114da565b946020939093013593505050565b600080600060608486031215610ec2578283fd5b83359250602084013591506040840135610edb816114da565b809150509250925092565b60008060408385031215610ef8578182fd5b82519150602083015167ffffffffffffffff811115610f15578182fd5b610f2185828601610c78565b9150509250929050565b60008060008060608587031215610f40578384fd5b843593506020850135610f52816114da565b9250604085013567ffffffffffffffff80821115610f6e578384fd5b818701915087601f830112610f81578384fd5b813581811115610f8f578485fd5b886020828501011115610fa0578485fd5b95989497505060200194505050565b60008151808452610fc781602086016020860161147f565b601f01601f19169290920160200192915050565b60609190911b7fffffffffffffffffffffffffffffffffffffffff00000000000000000000000016815260140190565b7fff0000000000000000000000000000000000000000000000000000000000000094909416845260609290921b7fffffffffffffffffffffffffffffffffffffffff0000000000000000000000001660018401526015830152603582015260550190565b6000835161108181846020880161147f565b83519083019061109581836020880161147f565b01949350505050565b73ffffffffffffffffffffffffffffffffffffffff91909116815260200190565b600073ffffffffffffffffffffffffffffffffffffffff80891683528088166020840152808716604084015280861660608401525083608083015260c060a083015261110e60c0830184610faf565b98975050505050505050565b73ffffffffffffffffffffffffffffffffffffffff9485168152928416602084015292166040820152606081019190915260800190565b600073ffffffffffffffffffffffffffffffffffffffff808816835280871660208401525060a0604083015261118a60a0830186610faf565b828103606084015261119c8186610faf565b91505060ff831660808301529695505050505050565b73ffffffffffffffffffffffffffffffffffffffff929092168252602082015260400190565b90815260200190565b600060208252610d146020830184610faf565b60208082526021908201527f4678426173654368696c6454756e6e656c3a20494e56414c49445f53454e444560408201527f5200000000000000000000000000000000000000000000000000000000000000606082015260800190565b6020808252602b908201527f4678426173654368696c6454756e6e656c3a20494e56414c49445f53454e444560408201527f525f46524f4d5f524f4f54000000000000000000000000000000000000000000606082015260800190565b60208082526025908201527f467845524332304368696c6454756e6e656c3a20494e56414c49445f53594e4360408201527f5f54595045000000000000000000000000000000000000000000000000000000606082015260800190565b60208082526023908201527f467845524332304368696c6454756e6e656c3a204e4f5f4d41505045445f544f60408201527f4b454e0000000000000000000000000000000000000000000000000000000000606082015260800190565b60208082526022908201527f467845524332304368696c6454756e6e656c3a20414c52454144595f4d41505060408201527f4544000000000000000000000000000000000000000000000000000000000000606082015260800190565b60208082526021908201527f437265617465323a204661696c6564206f6e206d696e696d616c206465706c6f60408201527f7900000000000000000000000000000000000000000000000000000000000000606082015260800190565b6020808252602a908201527f4678426173654368696c6454756e6e656c3a20524f4f545f54554e4e454c5f4160408201527f4c52454144595f53455400000000000000000000000000000000000000000000606082015260800190565b60005b8381101561149a578181015183820152602001611482565b8381111561041b5750506000910152565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b73ffffffffffffffffffffffffffffffffffffffff811681146114fc57600080fd5b5056fea264697066735822122009e9afba5de46a7f3f5a9cd9089efa72fd362ab3b5c8af4485b50a47f5d2e53d64736f6c634300080000330000000000000000000000008397259c983751daf40400790063935a11afa28a000000000000000000000000ad87e3b217c66b0d45deafbc540330d300811b94

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

0000000000000000000000008397259c983751daf40400790063935a11afa28a000000000000000000000000ad87e3b217c66b0d45deafbc540330d300811b94

-----Decoded View---------------
Arg [0] : _fxChild (address): 0x8397259c983751daf40400790063935a11afa28a
Arg [1] : _tokenTemplate (address): 0xad87e3b217c66b0d45deafbc540330d300811b94

-----Encoded View---------------
2 Constructor Arguments found :
Arg [0] : 0000000000000000000000008397259c983751daf40400790063935a11afa28a
Arg [1] : 000000000000000000000000ad87e3b217c66b0d45deafbc540330d300811b94


Block Transaction Gas Used Reward
Age Block Fee Address BC Fee Address Voting Power Jailed Incoming
Block Uncle Number Difficulty Gas Used Reward
Loading
Loading
Make sure to use the "Vote Down" button for any spammy posts, and the "Vote Up" for interesting conversations.