Contract 0xe03489d4e90b22c59c5e23d45dfd59fc0db8a025

Contract Overview

Balance:
0 MATIC
Txn Hash Method
Block
From
To
Value [Txn Fee]
0x84fe200270a4386fe0518d31720e438de1be8dcd37f5329d96dd882f93c6a121Transfer276045202022-08-13 14:34:351 day 7 hrs ago0xebb9603d319a8a55c05de2df3faf0deb085372e6 IN  0xe03489d4e90b22c59c5e23d45dfd59fc0db8a0250 MATIC0.0003452159549.3793391
0x1c386bcf9bfa88cec470d5a6235f56f88631d51f8efc2324069fbcafed8d7bc6Approve275966522022-08-13 2:00:521 day 20 hrs ago0x6f6050950cfa13f612388cd793242458acca4aa7 IN  0xe03489d4e90b22c59c5e23d45dfd59fc0db8a0250 MATIC0.00012152 2.500000008
0x5fdf21f25d2674f7bab40e906bf7551ca5a1c5c82c184e377047378782554179Transfer275889802022-08-12 13:26:372 days 8 hrs ago0x39d1874feee074c36e22bf22c2f8e0fdc3c16afc IN  0xe03489d4e90b22c59c5e23d45dfd59fc0db8a0250 MATIC0.00125137320133.965941091
0x8861a612783c06ed142a9d7e5e4689166f8e8153303f072f8a02835c3cff6e6dTransfer275842972022-08-12 5:41:242 days 16 hrs ago0xf29a7659fc66152b95a76de61bf6ff5c9933f138 IN  0xe03489d4e90b22c59c5e23d45dfd59fc0db8a0250 MATIC0.00151052241
0xcf5f25fdb21479222ea2697361c8f8b75a23e9f5faf38a7173e5c4660b9d30caTransfer275838052022-08-12 4:54:462 days 17 hrs ago0xf29a7659fc66152b95a76de61bf6ff5c9933f138 IN  0xe03489d4e90b22c59c5e23d45dfd59fc0db8a0250 MATIC0.00161074161943.720254589
0x468cd28cdb865d3f77c0abb626b642e03882438c715c0423225fece142cd379dTransfer275739092022-08-11 12:38:223 days 9 hrs ago0x39d1874feee074c36e22bf22c2f8e0fdc3c16afc IN  0xe03489d4e90b22c59c5e23d45dfd59fc0db8a0250 MATIC0.000184215
0x42f80f4ff194fd49144009b67341ddfc60987ddf8ed3635ac8dd838c581936c5Transfer275730012022-08-11 11:06:283 days 10 hrs ago0x39d1874feee074c36e22bf22c2f8e0fdc3c16afc IN  0xe03489d4e90b22c59c5e23d45dfd59fc0db8a0250 MATIC0.00147379717840.003180578
0x05afef9fc921f84c35f94668c290b9f3aa53ca8a681de8a3487ce9e32c67a813Transfer275729682022-08-11 11:03:423 days 11 hrs ago0x39d1874feee074c36e22bf22c2f8e0fdc3c16afc IN  0xe03489d4e90b22c59c5e23d45dfd59fc0db8a0250 MATIC0.00157787435342.828140521
0x7224a966d3b63b6ae2cb66d13a776192dd4c4ff13aa6a346efb750add8494fd8Transfer275729212022-08-11 10:59:463 days 11 hrs ago0x39d1874feee074c36e22bf22c2f8e0fdc3c16afc IN  0xe03489d4e90b22c59c5e23d45dfd59fc0db8a0250 MATIC0.00052164352414.158936119
0x86c05893916caa0ecfd6706162dded643b102b2f12bda8d7aa51369150fc00c3Transfer275704322022-08-11 6:59:433 days 15 hrs ago0x39d1874feee074c36e22bf22c2f8e0fdc3c16afc IN  0xe03489d4e90b22c59c5e23d45dfd59fc0db8a0250 MATIC0.00168359193445.697625936
0xb7f322fd5c04ae92b0f243ff5530765b032d96cbe4a18caecad8da83b6f84cadApprove275590152022-08-10 14:27:594 days 7 hrs ago0xc3f4929ecc1bbd794ad46089b8c1e9777c11ea4d IN  0xe03489d4e90b22c59c5e23d45dfd59fc0db8a0250 MATIC0.001562273267 32.132317311
0x0cb34e851b1a4b957ed9a36be74ab94be63f54e33255ae360f5d2264fbed16c0Approve275589062022-08-10 14:18:524 days 7 hrs ago0xc3f4929ecc1bbd794ad46089b8c1e9777c11ea4d IN  0xe03489d4e90b22c59c5e23d45dfd59fc0db8a0250 MATIC0.00158193672 32.53674868
0x0398e7e2f725399e750c756484dff3067af5f096a25021a40e9608a0ab0ce26fTransfer275537562022-08-10 5:53:424 days 16 hrs ago0xf29a7659fc66152b95a76de61bf6ff5c9933f138 IN  0xe03489d4e90b22c59c5e23d45dfd59fc0db8a0250 MATIC0.00115805581231.433033296
0x6059e986cb92dac16f549bef7559deb29d219be2601323c7f211d6b141d952e8Transfer275525372022-08-10 3:52:384 days 18 hrs ago0xf29a7659fc66152b95a76de61bf6ff5c9933f138 IN  0xe03489d4e90b22c59c5e23d45dfd59fc0db8a0250 MATIC0.00115825409731.438415329
0xc0e691f8a25e9672bd1a5689dfd3caa35169cde165a805e1f5f45ce4a4e769a7Approve275449532022-08-09 15:55:595 days 6 hrs ago0xcebcdab87274f323ef614abd2a8ed255a2d2b1c0 IN  0xe03489d4e90b22c59c5e23d45dfd59fc0db8a0250 MATIC0.001537477616 31.428405889
0x23bd0a073074f9f6b1262589414606d86853515e51ae7b573a372e8db06c33c8Approve275427212022-08-09 11:40:355 days 10 hrs ago0xf29a7659fc66152b95a76de61bf6ff5c9933f138 IN  0xe03489d4e90b22c59c5e23d45dfd59fc0db8a0250 MATIC0.00161517276333.105943329
0xc183af5bda3faa2c4f337fa8ab34969f4471ed2c1ba99a75bb0d3f2d26c94a2eTransfer275406942022-08-09 7:49:035 days 14 hrs ago0xebb9603d319a8a55c05de2df3faf0deb085372e6 IN  0xe03489d4e90b22c59c5e23d45dfd59fc0db8a0250 MATIC0.001645678023 30.501501717
0x3a16bddf5b57cce797e6654f9816afd38e9103c31f5287eab5c6dea2307073fdTransfer275367172022-08-09 1:00:015 days 21 hrs ago0x2326b8bea7dcacc62dcdf02f308774e632daf7fe IN  0xe03489d4e90b22c59c5e23d45dfd59fc0db8a0250 MATIC0.0014736840
0x233ae1405767ac7c49f4d564aaee04a16b88cd8e1c0cccf0c911d0166b97e24cTransfer275298892022-08-08 13:21:146 days 8 hrs ago0xebb9603d319a8a55c05de2df3faf0deb085372e6 IN  0xe03489d4e90b22c59c5e23d45dfd59fc0db8a0250 MATIC0.00089759727924.387254249
0x179cca25a400f3fbd8940494d8809a3763d11273021780373c208d527b9475a4Transfer275298652022-08-08 13:19:146 days 8 hrs ago0xebb9603d319a8a55c05de2df3faf0deb085372e6 IN  0xe03489d4e90b22c59c5e23d45dfd59fc0db8a0250 MATIC0.00111179254930.206829023
0xd5f0d61c7cb3818d319fe1671aebfd58735f09db34e8da1810621e97767e77b6Transfer275298282022-08-08 13:13:536 days 8 hrs ago0x39d1874feee074c36e22bf22c2f8e0fdc3c16afc IN  0xe03489d4e90b22c59c5e23d45dfd59fc0db8a0250 MATIC0.00117606739631.93232138
0x1782ee68b4ff94123a03e03859db5f0e3e92c959fc2ed0d67de596114438a56fTransfer275298072022-08-08 13:10:236 days 8 hrs ago0xebb9603d319a8a55c05de2df3faf0deb085372e6 IN  0xe03489d4e90b22c59c5e23d45dfd59fc0db8a0250 MATIC0.00174005837232.279493432
0x7a7cae6b0239dc9bd332cc583b1fe00f93b52ed8a432170e9f52151ed84fa357Transfer275297532022-08-08 13:04:326 days 9 hrs ago0xebb9603d319a8a55c05de2df3faf0deb085372e6 IN  0xe03489d4e90b22c59c5e23d45dfd59fc0db8a0250.002000395324985 MATIC0.00067573990630.903681832
0xc69e17561098bf5f47913d8a0367be874759603e78359298e4b9290adcba1066Transfer275296952022-08-08 12:59:416 days 9 hrs ago0xebb9603d319a8a55c05de2df3faf0deb085372e6 IN  0xe03489d4e90b22c59c5e23d45dfd59fc0db8a0250.002605272053142 MATIC0.0008800691940.24829373
0xec44610d1ca0eda5f51f6337c87a00b45ee1f693dea8d4f7c49bc7691273d54fTransfer275295192022-08-08 12:39:386 days 9 hrs ago0x39d1874feee074c36e22bf22c2f8e0fdc3c16afc IN  0xe03489d4e90b22c59c5e23d45dfd59fc0db8a0250.001547350000353 MATIC0.0007653135.000000008
[ Download CSV Export 
Parent Txn Hash Block From To Value
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
PolygonSand

Compiler Version
v0.8.2+commit.661d1103

Optimization Enabled:
Yes with 2000 runs

Other Settings:
default evmVersion

Contract Source Code (Solidity Standard Json-Input format)

File 1 of 13 : PolygonSand.sol
//SPDX-License-Identifier: MIT
// solhint-disable-next-line compiler-version
pragma solidity 0.8.2;

import "@openzeppelin/contracts-0.8/access/Ownable.sol";
import "../../../common/BaseWithStorage/ERC2771Handler.sol";
import "../../../Sand/SandBaseToken.sol";

contract PolygonSand is SandBaseToken, Ownable, ERC2771Handler {
    address public childChainManagerProxy;

    constructor(
        address _childChainManagerProxy,
        address trustedForwarder,
        address sandAdmin,
        address executionAdmin
    ) SandBaseToken(sandAdmin, executionAdmin, address(0), 0) {
        require(_childChainManagerProxy != address(0), "Bad ChildChainManagerProxy address");
        childChainManagerProxy = _childChainManagerProxy;
        __ERC2771Handler_initialize(trustedForwarder);
    }

    /// @notice update the ChildChainManager Proxy address
    /// @param newChildChainManagerProxy address of the new childChainManagerProxy
    function updateChildChainManager(address newChildChainManagerProxy) external onlyOwner {
        require(newChildChainManagerProxy != address(0), "Bad ChildChainManagerProxy address");
        childChainManagerProxy = newChildChainManagerProxy;
    }

    /// @notice called when tokens are deposited on root chain
    /// @param user user address for whom deposit is being done
    /// @param depositData abi encoded amount
    function deposit(address user, bytes calldata depositData) external {
        require(_msgSender() == childChainManagerProxy, "You're not allowed to deposit");
        uint256 amount = abi.decode(depositData, (uint256));
        _mint(user, amount);
    }

    /// @notice called when user wants to withdraw tokens back to root chain
    /// @dev Should burn user's tokens. This transaction will be verified when exiting on root chain
    /// @param amount amount to withdraw
    function withdraw(uint256 amount) external {
        _burn(_msgSender(), amount);
    }

    function setTrustedForwarder(address trustedForwarder) external onlyOwner {
        _trustedForwarder = trustedForwarder;
    }

    function _msgSender() internal view override(Context, ERC2771Handler) returns (address sender) {
        return ERC2771Handler._msgSender();
    }

    function _msgData() internal view override(Context, ERC2771Handler) returns (bytes calldata) {
        return ERC2771Handler._msgData();
    }
}

File 2 of 13 : Ownable.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

import "../utils/Context.sol";
/**
 * @dev Contract module which provides a basic access control mechanism, where
 * there is an account (an owner) that can be granted exclusive access to
 * specific functions.
 *
 * By default, the owner account will be the one that deploys the contract. This
 * can later be changed with {transferOwnership}.
 *
 * This module is used through inheritance. It will make available the modifier
 * `onlyOwner`, which can be applied to your functions to restrict their use to
 * the owner.
 */
abstract contract Ownable is Context {
    address private _owner;

    event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);

    /**
     * @dev Initializes the contract setting the deployer as the initial owner.
     */
    constructor () {
        address msgSender = _msgSender();
        _owner = msgSender;
        emit OwnershipTransferred(address(0), msgSender);
    }

    /**
     * @dev Returns the address of the current owner.
     */
    function owner() public view virtual returns (address) {
        return _owner;
    }

    /**
     * @dev Throws if called by any account other than the owner.
     */
    modifier onlyOwner() {
        require(owner() == _msgSender(), "Ownable: caller is not the owner");
        _;
    }

    /**
     * @dev Leaves the contract without owner. It will not be possible to call
     * `onlyOwner` functions anymore. Can only be called by the current owner.
     *
     * NOTE: Renouncing ownership will leave the contract without an owner,
     * thereby removing any functionality that is only available to the owner.
     */
    function renounceOwnership() public virtual onlyOwner {
        emit OwnershipTransferred(_owner, address(0));
        _owner = address(0);
    }

    /**
     * @dev Transfers ownership of the contract to a new account (`newOwner`).
     * Can only be called by the current owner.
     */
    function transferOwnership(address newOwner) public virtual onlyOwner {
        require(newOwner != address(0), "Ownable: new owner is the zero address");
        emit OwnershipTransferred(_owner, newOwner);
        _owner = newOwner;
    }
}

File 3 of 13 : ERC2771Handler.sol
// SPDX-License-Identifier: MIT
// solhint-disable-next-line compiler-version
pragma solidity ^0.8.0;

/// @dev minimal ERC2771 handler to keep bytecode-size down.
/// based on: https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/metatx/ERC2771Context.sol

contract ERC2771Handler {
    address internal _trustedForwarder;

    function __ERC2771Handler_initialize(address forwarder) internal {
        _trustedForwarder = forwarder;
    }

    function isTrustedForwarder(address forwarder) public view returns (bool) {
        return forwarder == _trustedForwarder;
    }

    function getTrustedForwarder() external view returns (address trustedForwarder) {
        return _trustedForwarder;
    }

    function _msgSender() internal view virtual returns (address sender) {
        if (isTrustedForwarder(msg.sender)) {
            // The assembly code is more direct than the Solidity version using `abi.decode`.
            // solhint-disable-next-line no-inline-assembly
            assembly {
                sender := shr(96, calldataload(sub(calldatasize(), 20)))
            }
        } else {
            return msg.sender;
        }
    }

    function _msgData() internal view virtual returns (bytes calldata) {
        if (isTrustedForwarder(msg.sender)) {
            return msg.data[:msg.data.length - 20];
        } else {
            return msg.data;
        }
    }
}

File 4 of 13 : SandBaseToken.sol
// SPDX-License-Identifier: MIT

pragma solidity 0.8.2;

import "../common/BaseWithStorage/ERC20/extensions/ERC20BasicApproveExtension.sol";
import "../common/BaseWithStorage/ERC20/ERC20BaseToken.sol";

contract SandBaseToken is ERC20BaseToken, ERC20BasicApproveExtension {
    constructor(
        address sandAdmin,
        address executionAdmin,
        address beneficiary,
        uint256 amount
    ) ERC20BaseToken("SAND", "SAND", sandAdmin, executionAdmin) {
        _admin = sandAdmin;
        if (beneficiary != address(0)) {
            uint256 initialSupply = amount * (1 ether);
            _mint(beneficiary, initialSupply);
        }
    }
}

File 5 of 13 : Context.sol
// SPDX-License-Identifier: MIT

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) {
        this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691
        return msg.data;
    }
}

File 6 of 13 : ERC20BasicApproveExtension.sol
//SPDX-License-Identifier: MIT

pragma solidity 0.8.2;

import "@openzeppelin/contracts-0.8/utils/Context.sol";
import "./ERC20Internal.sol";
import "../../../Libraries/BytesUtil.sol";

abstract contract ERC20BasicApproveExtension is ERC20Internal, Context {
    /// @notice Approve `target` to spend `amount` and call it with data.
    /// @param target The address to be given rights to transfer and destination of the call.
    /// @param amount The number of tokens allowed.
    /// @param data The bytes for the call.
    /// @return The data of the call.
    function approveAndCall(
        address target,
        uint256 amount,
        bytes calldata data
    ) external payable returns (bytes memory) {
        require(BytesUtil.doFirstParamEqualsAddress(data, _msgSender()), "FIRST_PARAM_NOT_SENDER");

        _approveFor(_msgSender(), target, amount);

        // solhint-disable-next-line avoid-low-level-calls
        (bool success, bytes memory returnData) = target.call{value: msg.value}(data);
        require(success, string(returnData));
        return returnData;
    }

    /// @notice Temporarily approve `target` to spend `amount` and call it with data.
    /// Previous approvals remains unchanged.
    /// @param target The destination of the call, allowed to spend the amount specified
    /// @param amount The number of tokens allowed to spend.
    /// @param data The bytes for the call.
    /// @return The data of the call.
    function paidCall(
        address target,
        uint256 amount,
        bytes calldata data
    ) external payable returns (bytes memory) {
        require(BytesUtil.doFirstParamEqualsAddress(data, _msgSender()), "FIRST_PARAM_NOT_SENDER");

        if (amount > 0) {
            _addAllowanceIfNeeded(_msgSender(), target, amount);
        }

        // solhint-disable-next-line avoid-low-level-calls
        (bool success, bytes memory returnData) = target.call{value: msg.value}(data);
        require(success, string(returnData));

        return returnData;
    }
}

File 7 of 13 : ERC20BaseToken.sol
//SPDX-License-Identifier: MIT
pragma solidity 0.8.2;

import "@openzeppelin/contracts-0.8/utils/Context.sol";
import "./extensions/ERC20Internal.sol";
import "../../interfaces/IERC20Extended.sol";
import "../WithSuperOperators.sol";

abstract contract ERC20BaseToken is WithSuperOperators, IERC20, IERC20Extended, ERC20Internal, Context {
    bytes32 internal immutable _name; // works only for string that can fit into 32 bytes
    bytes32 internal immutable _symbol; // works only for string that can fit into 32 bytes
    address internal immutable _operator;
    uint256 internal _totalSupply;
    mapping(address => uint256) internal _balances;
    mapping(address => mapping(address => uint256)) internal _allowances;

    constructor(
        string memory tokenName,
        string memory tokenSymbol,
        address admin,
        address operator
    ) {
        require(bytes(tokenName).length > 0, "INVALID_NAME_REQUIRED");
        require(bytes(tokenName).length <= 32, "INVALID_NAME_TOO_LONG");
        _name = _firstBytes32(bytes(tokenName));
        require(bytes(tokenSymbol).length > 0, "INVALID_SYMBOL_REQUIRED");
        require(bytes(tokenSymbol).length <= 32, "INVALID_SYMBOL_TOO_LONG");
        _symbol = _firstBytes32(bytes(tokenSymbol));
        _admin = admin;
        _operator = operator;
    }

    /// @notice Transfer `amount` tokens to `to`.
    /// @param to The recipient address of the tokens being transfered.
    /// @param amount The number of tokens being transfered.
    /// @return success Whether or not the transfer succeeded.
    function transfer(address to, uint256 amount) external override returns (bool success) {
        _transfer(_msgSender(), to, amount);
        return true;
    }

    /// @notice Transfer `amount` tokens from `from` to `to`.
    /// @param from The origin address  of the tokens being transferred.
    /// @param to The recipient address of the tokensbeing  transfered.
    /// @param amount The number of tokens transfered.
    /// @return success Whether or not the transfer succeeded.
    function transferFrom(
        address from,
        address to,
        uint256 amount
    ) external override returns (bool success) {
        if (_msgSender() != from && !_superOperators[_msgSender()] && _msgSender() != _operator) {
            uint256 currentAllowance = _allowances[from][_msgSender()];
            if (currentAllowance != ~uint256(0)) {
                // save gas when allowance is maximal by not reducing it (see https://github.com/ethereum/EIPs/issues/717)
                require(currentAllowance >= amount, "NOT_AUTHORIZED_ALLOWANCE");
                _allowances[from][_msgSender()] = currentAllowance - amount;
            }
        }
        _transfer(from, to, amount);
        return true;
    }

    /// @notice Burn `amount` tokens.
    /// @param amount The number of tokens to burn.
    function burn(uint256 amount) external override {
        _burn(_msgSender(), amount);
    }

    /// @notice Burn `amount` tokens from `owner`.
    /// @param from The address whose token to burn.
    /// @param amount The number of tokens to burn.
    function burnFor(address from, uint256 amount) external override {
        _burn(from, amount);
    }

    /// @notice Approve `spender` to transfer `amount` tokens.
    /// @param spender The address to be given rights to transfer.
    /// @param amount The number of tokens allowed.
    /// @return success Whether or not the call succeeded.
    function approve(address spender, uint256 amount) external override returns (bool success) {
        _approveFor(_msgSender(), spender, amount);
        return true;
    }

    /// @notice Get the name of the token collection.
    /// @return The name of the token collection.
    function name() external view virtual returns (string memory) {
        //added virtual
        return string(abi.encodePacked(_name));
    }

    /// @notice Get the symbol for the token collection.
    /// @return The symbol of the token collection.
    function symbol() external view virtual returns (string memory) {
        //added virtual
        return string(abi.encodePacked(_symbol));
    }

    /// @notice Get the total number of tokens in existence.
    /// @return The total number of tokens in existence.
    function totalSupply() external view override returns (uint256) {
        return _totalSupply;
    }

    /// @notice Get the balance of `owner`.
    /// @param owner The address to query the balance of.
    /// @return The amount owned by `owner`.
    function balanceOf(address owner) external view override returns (uint256) {
        return _balances[owner];
    }

    /// @notice Get the allowance of `spender` for `owner`'s tokens.
    /// @param owner The address whose token is allowed.
    /// @param spender The address allowed to transfer.
    /// @return remaining The amount of token `spender` is allowed to transfer on behalf of `owner`.
    function allowance(address owner, address spender) external view override returns (uint256 remaining) {
        return _allowances[owner][spender];
    }

    /// @notice Get the number of decimals for the token collection.
    /// @return The number of decimals.
    function decimals() external pure virtual returns (uint8) {
        return uint8(18);
    }

    /// @notice Approve `spender` to transfer `amount` tokens from `owner`.
    /// @param owner The address whose token is allowed.
    /// @param spender The address to be given rights to transfer.
    /// @param amount The number of tokens allowed.
    /// @return success Whether or not the call succeeded.
    function approveFor(
        address owner,
        address spender,
        uint256 amount
    ) public override returns (bool success) {
        require(_msgSender() == owner || _superOperators[_msgSender()] || _msgSender() == _operator, "NOT_AUTHORIZED");
        _approveFor(owner, spender, amount);
        return true;
    }

    /// @notice Increase the allowance for the spender if needed
    /// @param owner The address of the owner of the tokens
    /// @param spender The address wanting to spend tokens
    /// @param amountNeeded The amount requested to spend
    /// @return success Whether or not the call succeeded.
    function addAllowanceIfNeeded(
        address owner,
        address spender,
        uint256 amountNeeded
    ) public returns (bool success) {
        require(_msgSender() == owner || _superOperators[_msgSender()] || _msgSender() == _operator, "INVALID_SENDER");
        _addAllowanceIfNeeded(owner, spender, amountNeeded);
        return true;
    }

    /// @notice Get the first 32 bytes of input `src`.
    /// @param src The input data
    /// @return output The first 32 bytes of `src`.
    function _firstBytes32(bytes memory src) public pure returns (bytes32 output) {
        // solhint-disable-next-line no-inline-assembly
        assembly {
            output := mload(add(src, 32))
        }
    }

    /// @dev See addAllowanceIfNeeded.
    function _addAllowanceIfNeeded(
        address owner,
        address spender,
        uint256 amountNeeded /*(ERC20Internal, ERC20ExecuteExtension, ERC20BasicApproveExtension)*/
    ) internal virtual override {
        if (amountNeeded > 0 && !isSuperOperator(spender) && spender != _operator) {
            uint256 currentAllowance = _allowances[owner][spender];
            if (currentAllowance < amountNeeded) {
                _approveFor(owner, spender, amountNeeded);
            }
        }
    }

    /// @dev See approveFor.
    function _approveFor(
        address owner,
        address spender,
        uint256 amount /*(ERC20BasicApproveExtension, ERC20Internal)*/
    ) internal virtual override {
        require(owner != address(0) && spender != address(0), "INVALID_OWNER_||_SPENDER");
        _allowances[owner][spender] = amount;
        emit Approval(owner, spender, amount);
    }

    /// @dev See transfer.
    function _transfer(
        address from,
        address to,
        uint256 amount /*(ERC20Internal, ERC20ExecuteExtension)*/
    ) internal virtual override {
        require(to != address(0), "NOT_TO_ZEROADDRESS");
        require(to != address(this), "NOT_TO_THIS");
        uint256 currentBalance = _balances[from];
        require(currentBalance >= amount, "INSUFFICIENT_FUNDS");
        _balances[from] = currentBalance - amount;
        _balances[to] += amount;
        emit Transfer(from, to, amount);
    }

    /// @dev Mint tokens for a recipient.
    /// @param to The recipient address.
    /// @param amount The number of token to mint.
    function _mint(address to, uint256 amount) internal {
        require(to != address(0), "NOT_TO_ZEROADDRESS");
        require(amount > 0, "MINT_O_TOKENS");
        uint256 currentTotalSupply = _totalSupply;
        uint256 newTotalSupply = currentTotalSupply + amount;
        require(newTotalSupply > currentTotalSupply, "OVERFLOW");
        _totalSupply = newTotalSupply;
        _balances[to] += amount;
        emit Transfer(address(0), to, amount);
    }

    /// @dev Burn tokens from an address.
    /// @param from The address whose tokens to burn.
    /// @param amount The number of token to burn.
    function _burn(address from, uint256 amount) internal {
        require(amount > 0, "BURN_O_TOKENS");
        if (_msgSender() != from && !_superOperators[_msgSender()] && _msgSender() != _operator) {
            uint256 currentAllowance = _allowances[from][_msgSender()];
            if (currentAllowance != ~uint256(0)) {
                // save gas when allowance is maximal by not reducing it (see https://github.com/ethereum/EIPs/issues/717)
                require(currentAllowance >= amount, "INSUFFICIENT_ALLOWANCE");
                _allowances[from][_msgSender()] = currentAllowance - amount;
            }
        }

        uint256 currentBalance = _balances[from];
        require(currentBalance >= amount, "INSUFFICIENT_FUNDS");
        _balances[from] = currentBalance - amount;
        _totalSupply -= amount;
        emit Transfer(from, address(0), amount);
    }
}

File 8 of 13 : ERC20Internal.sol
//SPDX-License-Identifier: MIT
pragma solidity 0.8.2;

abstract contract ERC20Internal {
    function _approveFor(
        address owner,
        address target,
        uint256 amount
    ) internal virtual;

    function _addAllowanceIfNeeded(
        address owner,
        address spender,
        uint256 amountNeeded
    ) internal virtual;

    function _transfer(
        address from,
        address to,
        uint256 amount
    ) internal virtual;
}

File 9 of 13 : BytesUtil.sol
//SPDX-License-Identifier: MIT
pragma solidity 0.8.2;

library BytesUtil {
    /// @dev Check if the data == _address.
    /// @param data The bytes passed to the function.
    /// @param _address The address to compare to.
    /// @return Whether the first param == _address.
    function doFirstParamEqualsAddress(bytes memory data, address _address) internal pure returns (bool) {
        if (data.length < (36 + 32)) {
            return false;
        }
        uint256 value;
        // solhint-disable-next-line no-inline-assembly
        assembly {
            value := mload(add(data, 36))
        }
        return value == uint256(uint160(_address));
    }
}

File 10 of 13 : IERC20Extended.sol
// SPDX-License-Identifier: MIT

pragma solidity 0.8.2;

import "./IERC20.sol";

interface IERC20Extended is IERC20 {
    function burnFor(address from, uint256 amount) external;

    function burn(uint256 amount) external;

    function approveFor(
        address owner,
        address spender,
        uint256 amount
    ) external returns (bool success);
}

File 11 of 13 : WithSuperOperators.sol
//SPDX-License-Identifier: MIT
// solhint-disable-next-line compiler-version
pragma solidity 0.8.2;

import "./WithAdmin.sol";

contract WithSuperOperators is WithAdmin {
    mapping(address => bool) internal _superOperators;

    event SuperOperator(address superOperator, bool enabled);

    /// @notice Enable or disable the ability of `superOperator` to transfer tokens of all (superOperator rights).
    /// @param superOperator address that will be given/removed superOperator right.
    /// @param enabled set whether the superOperator is enabled or disabled.
    function setSuperOperator(address superOperator, bool enabled) external {
        require(msg.sender == _admin, "only admin is allowed to add super operators");
        _superOperators[superOperator] = enabled;
        emit SuperOperator(superOperator, enabled);
    }

    /// @notice check whether address `who` is given superOperator rights.
    /// @param who The address to query.
    /// @return whether the address has superOperator rights.
    function isSuperOperator(address who) public view returns (bool) {
        return _superOperators[who];
    }
}

File 12 of 13 : IERC20.sol
// SPDX-License-Identifier: MIT

pragma solidity 0.8.2;

/// @dev see https://eips.ethereum.org/EIPS/eip-20
interface IERC20 {
    /// @notice emitted when tokens are transfered from one address to another.
    /// @param from address from which the token are transfered from (zero means tokens are minted).
    /// @param to destination address which the token are transfered to (zero means tokens are burnt).
    /// @param value amount of tokens transferred.
    event Transfer(address indexed from, address indexed to, uint256 value);

    /// @notice emitted when owner grant transfer rights to another address
    /// @param owner address allowing its token to be transferred.
    /// @param spender address allowed to spend on behalf of `owner`
    /// @param value amount of tokens allowed.
    event Approval(address indexed owner, address indexed spender, uint256 value);

    /// @notice return the current total amount of tokens owned by all holders.
    /// @return supply total number of tokens held.
    function totalSupply() external view returns (uint256 supply);

    /// @notice return the number of tokens held by a particular address.
    /// @param who address being queried.
    /// @return balance number of token held by that address.
    function balanceOf(address who) external view returns (uint256 balance);

    /// @notice transfer tokens to a specific address.
    /// @param to destination address receiving the tokens.
    /// @param value number of tokens to transfer.
    /// @return success whether the transfer succeeded.
    function transfer(address to, uint256 value) external returns (bool success);

    /// @notice transfer tokens from one address to another.
    /// @param from address tokens will be sent from.
    /// @param to destination address receiving the tokens.
    /// @param value number of tokens to transfer.
    /// @return success whether the transfer succeeded.
    function transferFrom(
        address from,
        address to,
        uint256 value
    ) external returns (bool success);

    /// @notice approve an address to spend on your behalf.
    /// @param spender address entitled to transfer on your behalf.
    /// @param value amount allowed to be transfered.
    /// @param success whether the approval succeeded.
    function approve(address spender, uint256 value) external returns (bool success);

    /// @notice return the current allowance for a particular owner/spender pair.
    /// @param owner address allowing spender.
    /// @param spender address allowed to spend.
    /// @return amount number of tokens `spender` can spend on behalf of `owner`.
    function allowance(address owner, address spender) external view returns (uint256 amount);
}

File 13 of 13 : WithAdmin.sol
//SPDX-License-Identifier: MIT
// solhint-disable-next-line compiler-version
pragma solidity 0.8.2;

contract WithAdmin {
    address internal _admin;

    /// @dev Emits when the contract administrator is changed.
    /// @param oldAdmin The address of the previous administrator.
    /// @param newAdmin The address of the new administrator.
    event AdminChanged(address oldAdmin, address newAdmin);

    modifier onlyAdmin() {
        require(msg.sender == _admin, "ADMIN_ONLY");
        _;
    }

    /// @dev Get the current administrator of this contract.
    /// @return The current administrator of this contract.
    function getAdmin() external view returns (address) {
        return _admin;
    }

    /// @dev Change the administrator to be `newAdmin`.
    /// @param newAdmin The address of the new administrator.
    function changeAdmin(address newAdmin) external {
        require(msg.sender == _admin, "ADMIN_ACCESS_DENIED");
        emit AdminChanged(_admin, newAdmin);
        _admin = newAdmin;
    }
}

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

Contract ABI

[{"inputs":[{"internalType":"address","name":"_childChainManagerProxy","type":"address"},{"internalType":"address","name":"trustedForwarder","type":"address"},{"internalType":"address","name":"sandAdmin","type":"address"},{"internalType":"address","name":"executionAdmin","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"oldAdmin","type":"address"},{"indexed":false,"internalType":"address","name":"newAdmin","type":"address"}],"name":"AdminChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"superOperator","type":"address"},{"indexed":false,"internalType":"bool","name":"enabled","type":"bool"}],"name":"SuperOperator","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"internalType":"bytes","name":"src","type":"bytes"}],"name":"_firstBytes32","outputs":[{"internalType":"bytes32","name":"output","type":"bytes32"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"amountNeeded","type":"uint256"}],"name":"addAllowanceIfNeeded","outputs":[{"internalType":"bool","name":"success","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"remaining","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"success","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"target","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"approveAndCall","outputs":[{"internalType":"bytes","name":"","type":"bytes"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"approveFor","outputs":[{"internalType":"bool","name":"success","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"burnFor","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newAdmin","type":"address"}],"name":"changeAdmin","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"childChainManagerProxy","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"address","name":"user","type":"address"},{"internalType":"bytes","name":"depositData","type":"bytes"}],"name":"deposit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"getAdmin","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getTrustedForwarder","outputs":[{"internalType":"address","name":"trustedForwarder","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"who","type":"address"}],"name":"isSuperOperator","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"forwarder","type":"address"}],"name":"isTrustedForwarder","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"target","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"paidCall","outputs":[{"internalType":"bytes","name":"","type":"bytes"}],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"superOperator","type":"address"},{"internalType":"bool","name":"enabled","type":"bool"}],"name":"setSuperOperator","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"trustedForwarder","type":"address"}],"name":"setTrustedForwarder","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"success","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"success","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newChildChainManagerProxy","type":"address"}],"name":"updateChildChainManager","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]

60e06040523480156200001157600080fd5b506040516200241038038062002410833981016040819052620000349162000521565b81816000806040518060400160405280600481526020016314d0539160e21b8152506040518060400160405280600481526020016314d0539160e21b81525085856000845111620000cc5760405162461bcd60e51b815260206004820152601560248201527f494e56414c49445f4e414d455f5245515549524544000000000000000000000060448201526064015b60405180910390fd5b602084511115620001205760405162461bcd60e51b815260206004820152601560248201527f494e56414c49445f4e414d455f544f4f5f4c4f4e4700000000000000000000006044820152606401620000c3565b60208401516080528251620001785760405162461bcd60e51b815260206004820152601760248201527f494e56414c49445f53594d424f4c5f52455155495245440000000000000000006044820152606401620000c3565b602083511115620001cc5760405162461bcd60e51b815260206004820152601760248201527f494e56414c49445f53594d424f4c5f544f4f5f4c4f4e470000000000000000006044820152606401620000c3565b602083015160a0526000805460609290921b6001600160601b03191660c0526001600160a01b03199182166001600160a01b039384161790911688831617905584161591506200023e90505760006200022e82670de0b6b3a764000062000598565b90506200023c838262000351565b505b50505050600062000254620004aa60201b60201c565b600580546001600160a01b0319166001600160a01b038316908117909155604051919250906000907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a3506001600160a01b038416620003055760405162461bcd60e51b815260206004820152602260248201527f426164204368696c64436861696e4d616e6167657250726f7879206164647265604482015261737360f01b6064820152608401620000c3565b600780546001600160a01b0319166001600160a01b0386161790556200034783600680546001600160a01b0319166001600160a01b0392909216919091179055565b50505050620005d0565b6001600160a01b0382166200039e5760405162461bcd60e51b81526020600482015260126024820152714e4f545f544f5f5a45524f4144445245535360701b6044820152606401620000c3565b60008111620003e05760405162461bcd60e51b815260206004820152600d60248201526c4d494e545f4f5f544f4b454e5360981b6044820152606401620000c3565b6002546000620003f183836200057d565b90508181116200042f5760405162461bcd60e51b81526020600482015260086024820152674f564552464c4f5760c01b6044820152606401620000c3565b60028190556001600160a01b038416600090815260036020526040812080548592906200045e9084906200057d565b90915550506040518381526001600160a01b038516906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a350505050565b6000620004c1620004c760201b6200123d1760201c565b90505b90565b6000620004d433620004f2565b15620004ea575060131936013560601c620004c4565b5033620004c4565b6006546001600160a01b038281169116145b919050565b80516001600160a01b03811681146200050457600080fd5b6000806000806080858703121562000537578384fd5b620005428562000509565b9350620005526020860162000509565b9250620005626040860162000509565b9150620005726060860162000509565b905092959194509250565b60008219821115620005935762000593620005ba565b500190565b6000816000190483118215151615620005b557620005b5620005ba565b500290565b634e487b7160e01b600052601160045260246000fd5b60805160a05160c05160601c611df16200061f6000396000818161068c0152818161081b015281816109170152818161140601526117ed01526000610c8a015260006105c80152611df16000f3fe6080604052600436106101cc5760003560e01c80636e9960c3116100f7578063ac9fe42111610095578063cf2c52cb11610064578063cf2c52cb1461051c578063da7422281461053c578063dd62ed3e1461055c578063f2fde38b146105a2576101cc565b8063ac9fe421146104b8578063bb1e23cb146104d8578063cae9ca51146104eb578063ce1b815f146104fe576101cc565b80638da5cb5b116100d15780638da5cb5b146104455780638f2839701461046357806395d89b4114610483578063a9059cbb14610498576101cc565b80636e9960c3146103dc57806370a08231146103fa578063715018a614610430576101cc565b80632e1a7d4d1161016f578063445a67971161013e578063445a67971461032b578063572b6c051461034b57806362f629e71461036b578063654b748a146103a3576101cc565b80632e1a7d4d146102cf578063313ce567146102ef5780633b7b5a161461030b57806342966c68146102cf576101cc565b806318160ddd116101ab57806318160ddd146102585780631dd319cb1461026d57806323b872dd1461028f5780632b991746146102af576101cc565b80629ad300146101d157806306fdde0314610206578063095ea7b314610228575b600080fd5b3480156101dd57600080fd5b506101f36101ec366004611bfe565b6020015190565b6040519081526020015b60405180910390f35b34801561021257600080fd5b5061021b6105c2565b6040516101fd9190611d1b565b34801561023457600080fd5b50610248610243366004611b7d565b610606565b60405190151581526020016101fd565b34801561026457600080fd5b506002546101f3565b34801561027957600080fd5b5061028d610288366004611b7d565b610624565b005b34801561029b57600080fd5b506102486102aa366004611ab7565b610632565b3480156102bb57600080fd5b506102486102ca366004611ab7565b6107c5565b3480156102db57600080fd5b5061028d6102ea366004611ca8565b6108ad565b3480156102fb57600080fd5b50604051601281526020016101fd565b34801561031757600080fd5b50610248610326366004611ab7565b6108c1565b34801561033757600080fd5b5061028d610346366004611a64565b6109a9565b34801561035757600080fd5b50610248610366366004611a64565b610acd565b34801561037757600080fd5b5060075461038b906001600160a01b031681565b6040516001600160a01b0390911681526020016101fd565b3480156103af57600080fd5b506102486103be366004611a64565b6001600160a01b031660009081526001602052604090205460ff1690565b3480156103e857600080fd5b506000546001600160a01b031661038b565b34801561040657600080fd5b506101f3610415366004611a64565b6001600160a01b031660009081526003602052604090205490565b34801561043c57600080fd5b5061028d610ae4565b34801561045157600080fd5b506005546001600160a01b031661038b565b34801561046f57600080fd5b5061028d61047e366004611a64565b610bb4565b34801561048f57600080fd5b5061021b610c84565b3480156104a457600080fd5b506102486104b3366004611b7d565b610cb7565b3480156104c457600080fd5b5061028d6104d3366004611af2565b610ccb565b61021b6104e6366004611ba6565b610dcc565b61021b6104f9366004611ba6565b610f0a565b34801561050a57600080fd5b506006546001600160a01b031661038b565b34801561052857600080fd5b5061028d610537366004611b2c565b610fad565b34801561054857600080fd5b5061028d610557366004611a64565b611037565b34801561056857600080fd5b506101f3610577366004611a85565b6001600160a01b03918216600090815260046020908152604080832093909416825291909152205490565b3480156105ae57600080fd5b5061028d6105bd366004611a64565b6110df565b604080517f00000000000000000000000000000000000000000000000000000000000000006020820152606091015b60405160208183030381529060405290505b90565b600061061a610613611281565b8484611290565b5060015b92915050565b61062e828261135e565b5050565b6000836001600160a01b0316610646611281565b6001600160a01b031614158015610683575060016000610664611281565b6001600160a01b0316815260208101919091526040016000205460ff16155b80156106c857507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166106bc611281565b6001600160a01b031614155b156107b0576001600160a01b0384166000908152600460205260408120816106ee611281565b6001600160a01b03168152602081019190915260400160002054905060001981146107ae57828110156107685760405162461bcd60e51b815260206004820152601860248201527f4e4f545f415554484f52495a45445f414c4c4f57414e4345000000000000000060448201526064015b60405180910390fd5b6107728382611d46565b6001600160a01b038616600090815260046020526040812090610793611281565b6001600160a01b031681526020810191909152604001600020555b505b6107bb848484611609565b5060019392505050565b6000836001600160a01b03166107d9611281565b6001600160a01b031614806108135750600160006107f5611281565b6001600160a01b0316815260208101919091526040016000205460ff165b8061085657507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031661084b611281565b6001600160a01b0316145b6108a25760405162461bcd60e51b815260206004820152600e60248201527f4e4f545f415554484f52495a4544000000000000000000000000000000000000604482015260640161075f565b6107bb848484611290565b6108be6108b8611281565b8261135e565b50565b6000836001600160a01b03166108d5611281565b6001600160a01b0316148061090f5750600160006108f1611281565b6001600160a01b0316815260208101919091526040016000205460ff165b8061095257507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316610947611281565b6001600160a01b0316145b61099e5760405162461bcd60e51b815260206004820152600e60248201527f494e56414c49445f53454e444552000000000000000000000000000000000000604482015260640161075f565b6107bb8484846117bb565b6109b1611281565b6001600160a01b03166109cc6005546001600160a01b031690565b6001600160a01b031614610a225760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161075f565b6001600160a01b038116610a9e5760405162461bcd60e51b815260206004820152602260248201527f426164204368696c64436861696e4d616e6167657250726f787920616464726560448201527f7373000000000000000000000000000000000000000000000000000000000000606482015260840161075f565b6007805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b0392909216919091179055565b6006546001600160a01b038281169116145b919050565b610aec611281565b6001600160a01b0316610b076005546001600160a01b031690565b6001600160a01b031614610b5d5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161075f565b6005546040516000916001600160a01b0316907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a36005805473ffffffffffffffffffffffffffffffffffffffff19169055565b6000546001600160a01b03163314610c0e5760405162461bcd60e51b815260206004820152601360248201527f41444d494e5f4143434553535f44454e49454400000000000000000000000000604482015260640161075f565b600054604080516001600160a01b03928316815291831660208301527f7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f910160405180910390a16000805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b0392909216919091179055565b604080517f00000000000000000000000000000000000000000000000000000000000000006020820152606091016105f1565b600061061a610cc4611281565b8484611609565b6000546001600160a01b03163314610d4b5760405162461bcd60e51b815260206004820152602c60248201527f6f6e6c792061646d696e20697320616c6c6f77656420746f206164642073757060448201527f6572206f70657261746f72730000000000000000000000000000000000000000606482015260840161075f565b6001600160a01b03821660008181526001602090815260409182902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00168515159081179091558251938452908301527f44f92d27abdf4cfb6a7d712c3af68f3be086d4ca747ab802c36f67d6790060d8910160405180910390a15050565b6060610e1683838080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250610e119250611281915050565b611865565b610e625760405162461bcd60e51b815260206004820152601660248201527f46495253545f504152414d5f4e4f545f53454e44455200000000000000000000604482015260640161075f565b8315610e7a57610e7a610e73611281565b86866117bb565b600080866001600160a01b0316348686604051610e98929190611d0b565b60006040518083038185875af1925050503d8060008114610ed5576040519150601f19603f3d011682016040523d82523d6000602084013e610eda565b606091505b5091509150818190610eff5760405162461bcd60e51b815260040161075f9190611d1b565b509695505050505050565b6060610f4f83838080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250610e119250611281915050565b610f9b5760405162461bcd60e51b815260206004820152601660248201527f46495253545f504152414d5f4e4f545f53454e44455200000000000000000000604482015260640161075f565b610e7a610fa6611281565b8686611290565b6007546001600160a01b0316610fc1611281565b6001600160a01b0316146110175760405162461bcd60e51b815260206004820152601d60248201527f596f75277265206e6f7420616c6c6f77656420746f206465706f736974000000604482015260640161075f565b600061102582840184611ca8565b90506110318482611890565b50505050565b61103f611281565b6001600160a01b031661105a6005546001600160a01b031690565b6001600160a01b0316146110b05760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161075f565b6006805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b0392909216919091179055565b6110e7611281565b6001600160a01b03166111026005546001600160a01b031690565b6001600160a01b0316146111585760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161075f565b6001600160a01b0381166111d45760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f6464726573730000000000000000000000000000000000000000000000000000606482015260840161075f565b6005546040516001600160a01b038084169216907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a36005805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b0392909216919091179055565b600061124833610acd565b1561127a57507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffec36013560601c610603565b5033610603565b600061128b61123d565b905090565b6001600160a01b038316158015906112b057506001600160a01b03821615155b6112fc5760405162461bcd60e51b815260206004820152601860248201527f494e56414c49445f4f574e45525f7c7c5f5350454e4445520000000000000000604482015260640161075f565b6001600160a01b0383811660008181526004602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591015b60405180910390a3505050565b600081116113ae5760405162461bcd60e51b815260206004820152600d60248201527f4255524e5f4f5f544f4b454e5300000000000000000000000000000000000000604482015260640161075f565b816001600160a01b03166113c0611281565b6001600160a01b0316141580156113fd5750600160006113de611281565b6001600160a01b0316815260208101919091526040016000205460ff16155b801561144257507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316611436611281565b6001600160a01b031614155b15611525576001600160a01b038216600090815260046020526040812081611468611281565b6001600160a01b031681526020810191909152604001600020549050600019811461152357818110156114dd5760405162461bcd60e51b815260206004820152601660248201527f494e53554646494349454e545f414c4c4f57414e434500000000000000000000604482015260640161075f565b6114e78282611d46565b6001600160a01b038416600090815260046020526040812090611508611281565b6001600160a01b031681526020810191909152604001600020555b505b6001600160a01b0382166000908152600360205260409020548181101561158e5760405162461bcd60e51b815260206004820152601260248201527f494e53554646494349454e545f46554e44530000000000000000000000000000604482015260640161075f565b6115988282611d46565b6001600160a01b038416600090815260036020526040812091909155600280548492906115c6908490611d46565b90915550506040518281526000906001600160a01b038516907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef90602001611351565b6001600160a01b03821661165f5760405162461bcd60e51b815260206004820152601260248201527f4e4f545f544f5f5a45524f414444524553530000000000000000000000000000604482015260640161075f565b6001600160a01b0382163014156116b85760405162461bcd60e51b815260206004820152600b60248201527f4e4f545f544f5f54484953000000000000000000000000000000000000000000604482015260640161075f565b6001600160a01b038316600090815260036020526040902054818110156117215760405162461bcd60e51b815260206004820152601260248201527f494e53554646494349454e545f46554e44530000000000000000000000000000604482015260640161075f565b61172b8282611d46565b6001600160a01b038086166000908152600360205260408082209390935590851681529081208054849290611761908490611d2e565b92505081905550826001600160a01b0316846001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040516117ad91815260200190565b60405180910390a350505050565b6000811180156117e457506001600160a01b03821660009081526001602052604090205460ff16155b801561182257507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b031614155b15611860576001600160a01b038084166000908152600460209081526040808320938616835292905220548181101561103157611031848484611290565b505050565b60006044835110156118795750600061061e565b5060248201516001600160a01b0382161492915050565b6001600160a01b0382166118e65760405162461bcd60e51b815260206004820152601260248201527f4e4f545f544f5f5a45524f414444524553530000000000000000000000000000604482015260640161075f565b600081116119365760405162461bcd60e51b815260206004820152600d60248201527f4d494e545f4f5f544f4b454e5300000000000000000000000000000000000000604482015260640161075f565b60025460006119458383611d2e565b90508181116119965760405162461bcd60e51b815260206004820152600860248201527f4f564552464c4f57000000000000000000000000000000000000000000000000604482015260640161075f565b60028190556001600160a01b038416600090815260036020526040812080548592906119c3908490611d2e565b90915550506040518381526001600160a01b038516906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef906020016117ad565b80356001600160a01b0381168114610adf57600080fd5b60008083601f840112611a2e578081fd5b50813567ffffffffffffffff811115611a45578182fd5b602083019150836020828501011115611a5d57600080fd5b9250929050565b600060208284031215611a75578081fd5b611a7e82611a06565b9392505050565b60008060408385031215611a97578081fd5b611aa083611a06565b9150611aae60208401611a06565b90509250929050565b600080600060608486031215611acb578081fd5b611ad484611a06565b9250611ae260208501611a06565b9150604084013590509250925092565b60008060408385031215611b04578182fd5b611b0d83611a06565b915060208301358015158114611b21578182fd5b809150509250929050565b600080600060408486031215611b40578283fd5b611b4984611a06565b9250602084013567ffffffffffffffff811115611b64578283fd5b611b7086828701611a1d565b9497909650939450505050565b60008060408385031215611b8f578182fd5b611b9883611a06565b946020939093013593505050565b60008060008060608587031215611bbb578081fd5b611bc485611a06565b935060208501359250604085013567ffffffffffffffff811115611be6578182fd5b611bf287828801611a1d565b95989497509550505050565b600060208284031215611c0f578081fd5b813567ffffffffffffffff80821115611c26578283fd5b818401915084601f830112611c39578283fd5b813581811115611c4b57611c4b611d8c565b604051601f8201601f19908116603f01168101908382118183101715611c7357611c73611d8c565b81604052828152876020848701011115611c8b578586fd5b826020860160208301379182016020019490945295945050505050565b600060208284031215611cb9578081fd5b5035919050565b60008151808452815b81811015611ce557602081850181015186830182015201611cc9565b81811115611cf65782602083870101525b50601f01601f19169290920160200192915050565b6000828483379101908152919050565b600060208252611a7e6020830184611cc0565b60008219821115611d4157611d41611d5d565b500190565b600082821015611d5857611d58611d5d565b500390565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fdfea2646970667358221220c39f687cba8396b0a8e2e672b33b2e675e43e2c92c9e43302886f47e823a161a64736f6c63430008020033000000000000000000000000b5505a6d998549090530911180f38ac5130101c60000000000000000000000009399bb24dbb5c4b782c70c2969f58716ebbd6a3b00000000000000000000000049c4d4c94829b9c44052c5f5cb164fc61218116500000000000000000000000049c4d4c94829b9c44052c5f5cb164fc612181165

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

000000000000000000000000b5505a6d998549090530911180f38ac5130101c60000000000000000000000009399bb24dbb5c4b782c70c2969f58716ebbd6a3b00000000000000000000000049c4d4c94829b9c44052c5f5cb164fc61218116500000000000000000000000049c4d4c94829b9c44052c5f5cb164fc612181165

-----Decoded View---------------
Arg [0] : _childChainManagerProxy (address): 0xb5505a6d998549090530911180f38ac5130101c6
Arg [1] : trustedForwarder (address): 0x9399bb24dbb5c4b782c70c2969f58716ebbd6a3b
Arg [2] : sandAdmin (address): 0x49c4d4c94829b9c44052c5f5cb164fc612181165
Arg [3] : executionAdmin (address): 0x49c4d4c94829b9c44052c5f5cb164fc612181165

-----Encoded View---------------
4 Constructor Arguments found :
Arg [0] : 000000000000000000000000b5505a6d998549090530911180f38ac5130101c6
Arg [1] : 0000000000000000000000009399bb24dbb5c4b782c70c2969f58716ebbd6a3b
Arg [2] : 00000000000000000000000049c4d4c94829b9c44052c5f5cb164fc612181165
Arg [3] : 00000000000000000000000049c4d4c94829b9c44052c5f5cb164fc612181165


Block Transaction Gas Used Reward
Age Block Fee Address BC Fee Address Voting Power Jailed Incoming
Block Uncle Number Difficulty Gas Used Reward
Loading