Token SAND

 

Overview ERC-20

Price
$0.53 @ 0.595394 MATIC (-4.22%)
Fully Diluted Market Cap
Total Supply:
201,269,996.955406 SAND

Holders:
68,554 addresses
 
Balance
0 SAND

Value
$0.00
0x1b1e76aae30a105b8e154bf53e4d0a38e06ab4f9
Loading
[ Download CSV Export  ] 
Loading
[ Download CSV Export  ] 
Loading

Market

Volume (24H):$118,633,356.00
Market Capitalization:$978,346,999.00
Circulating Supply:1,853,581,926.00 SAND
Market Data Source: Coinmarketcap


Update? Click here to update the token ICO / general information
# Exchange Pair Price  24H Volume % Volume
1
CoinDCX
SAND-USDT$0.5257
0.0000195 Btc
$19,128,047.00
36,387,626.882 SAND
17.7804%
2
Binance
SAND-USDT$0.5267
0.0000195 Btc
$19,052,466.00
36,172,043.108 SAND
17.6750%
3
Bitrue
SAND-USDT$0.5261
0.0000195 Btc
$15,724,419.00
29,887,642.000 SAND
14.6042%
4
Upbit
SAND-KRW$0.5315
0.0000197 Btc
$12,395,548.00
23,322,458.918 SAND
11.3962%
5
XT.COM
SAND-USDT$0.5252
0.0000195 Btc
$6,775,393.00
12,434,345.740 SAND
6.0759%
6
Bitforex
SAND-USDT$0.5248
0.0000195 Btc
$3,624,378.00
6,905,690.607 SAND
3.3744%
7
OKX
SAND-USDT$0.5263
0.0000195 Btc
$3,516,173.00
6,473,818.975 SAND
3.1634%
8
HitBTC
SAND-USDT$0.5249
0.0000195 Btc
$2,273,692.00
4,187,832.300 SAND
2.0463%
9
Bithumb
SAND-KRW$0.5309
0.0000197 Btc
$1,886,574.00
3,553,656.666 SAND
1.7365%
10
Phemex
SAND-USDT$0.5262
0.0000195 Btc
$1,734,737.00
3,296,729.590 SAND
1.6109%
11
BingX
SAND-USDT$0.5252
0.0000195 Btc
$1,713,268.00
3,146,839.579 SAND
1.5377%
12
CoinDCX
SAND-BTC$0.5252
0.0000195 Btc
$1,480,732.00
2,819,158.364 SAND
1.3775%
13
Binance
SAND-BTC$0.5262
0.0000195 Btc
$1,480,224.00
2,812,800.633 SAND
1.3744%
14
DigiFinex
SAND-USDT$0.5246
0.0000195 Btc
$1,323,258.00
2,522,511.000 SAND
1.2326%
15
Dcoin
SAND-USDT$0.525
0.0000195 Btc
$1,320,373.00
2,515,178.000 SAND
1.2290%
16
Binance
SAND-BUSD$0.5266
0.0000195 Btc
$1,230,387.00
2,336,487.915 SAND
1.1417%
17
KuCoin
SAND-USDT$0.5251
0.0000195 Btc
$1,155,325.00
2,200,261.881 SAND
1.0751%
18
BTCEX
SAND-USDT$0.5252
0.0000195 Btc
$951,988.00
1,749,775.000 SAND
0.8550%
19
Toobit
SAND-USDT$0.5261
0.0000195 Btc
$931,434.00
1,710,599.000 SAND
0.8359%
20
BTSE
SAND-USD$0.5284
0.0000196 Btc
$882,903.00
1,671,057.873 SAND
0.8165%
21
Bitubu Exchange
SAND-USDT$0.5262
0.0000195 Btc
$874,448.00
1,611,260.888 SAND
0.7873%
22
Dex-Trade
SAND-USDT$0.5257
0.0000195 Btc
$844,004.00
1,605,433.000 SAND
0.7845%
23
Coinbase Exchange
SAND-USD$0.5268
0.0000196 Btc
$711,749.00
1,351,079.580 SAND
0.6602%
24
Gate.io
SAND-USDT$0.5263
0.0000195 Btc
$554,828.00
1,018,377.955 SAND
0.4976%
25
HitBTC
SAND-BTC$0.5261
0.0000195 Btc
$497,128.00
928,946.900 SAND
0.4539%
26
LBank
SAND-USDC$0.5261
0.0000195 Btc
$484,968.00
921,874.807 SAND
0.4505%
27
Bitget
SAND-USDT$0.5252
0.0000195 Btc
$455,013.00
834,937.268 SAND
0.4080%
28
DIFX
SAND-USDT$0.5256
0.0000195 Btc
$451,690.00
830,734.000 SAND
0.4059%
29
Bybit
SAND-USDT$0.525
0.0000195 Btc
$358,632.00
683,105.860 SAND
0.3338%
30
CoinTR Pro
SAND-USDT$0.5263
0.0000195 Btc
$350,006.00
643,776.000 SAND
0.3146%
31
Binance
SAND-BNB$0.5271
0.0000196 Btc
$296,719.00
562,884.718 SAND
0.2750%
32
AscendEX (BitMax)
SAND-USDT$0.5243
0.0000195 Btc
$258,421.00
492,878.000 SAND
0.2408%
33
Deepcoin
SAND-USDT$0.5262
0.0000195 Btc
$236,796.00
639,960.808 SAND
0.3127%
34
FameEX
SAND-USDT$0.5254
0.0000195 Btc
$203,194.00
373,379.044 SAND
0.1824%
35
Huobi
SAND-USDT$0.5263
0.0000195 Btc
$190,171.00
348,660.920 SAND
0.1704%
36
Quickswap (v3)
0XBBBA073C31BF03B8ACF7C28EF0738DECF3695683-0X0D500B1D8E8EF31E21C99D1DB9A6444D3ADF1270$0.5265
0.0000195 Btc
$189,351.00
352,104.071 0XBBBA073C31BF03B8ACF7C28EF0738DECF3695683
0.1721%
37
Crypto.com Exchange
SAND-USDT$0.5246
0.0000195 Btc
$176,253.00
335,962.300 SAND
0.1642%
38
Pionex
SAND-USDT$0.5266
0.0000195 Btc
$155,908.00
286,313.540 SAND
0.1399%
39
BitMart
SAND-USDT$0.529
0.0000196 Btc
$128,902.00
243,656.000 SAND
0.1191%
40
Kraken
SAND-USD$0.5287
0.0000196 Btc
$122,217.00
231,166.051 SAND
0.1130%
41
Dex-Trade
SAND-BTC$0.5264
0.0000195 Btc
$119,407.00
226,858.000 SAND
0.1109%
42
MEXC Global
SAND-USDT$0.5249
0.0000195 Btc
$109,886.00
209,334.350 SAND
0.1023%
43
Bitkub
SAND-THB$0.5251
0.0000195 Btc
$105,247.00
200,413.231 SAND
0.0979%
44
LBank
SAND-USDT$0.5249
0.0000195 Btc
$96,330.00
183,506.790 SAND
0.0897%
45
Bitazza
SAND-USDT$0.5264
0.0000196 Btc
$88,561.00
162,724.000 SAND
0.0795%
46
Bitvavo
SAND-EUR$0.5289
0.0000197 Btc
$86,147.00
162,875.609 SAND
0.0796%
47
Bitazza
SAND-USDF$0.5265
0.0000196 Btc
$82,930.00
152,443.000 SAND
0.0745%
48
Bybit
SAND-USDC$0.5247
0.0000195 Btc
$80,863.00
154,113.340 SAND
0.0753%
49
Bitso
SAND-USD$0.5251
0.0000195 Btc
$72,974.00
138,983.010 SAND
0.0679%
50
Quickswap
0XBBBA073C31BF03B8ACF7C28EF0738DECF3695683-0X0D500B1D8E8EF31E21C99D1DB9A6444D3ADF1270$0.5275
0.0000196 Btc
$70,845.00
132,154.475 0XBBBA073C31BF03B8ACF7C28EF0738DECF3695683
0.0646%
51
BigONE
SAND-USDT$0.5241
0.0000195 Btc
$68,493.00
130,681.800 SAND
0.0639%
52
OKX
SAND-USDC$0.5266
0.0000195 Btc
$67,614.00
122,855.328 SAND
0.0600%
53
BtcTurk PRO
SAND-USDT$0.5281
0.0000196 Btc
$57,747.00
109,347.130 SAND
0.0534%
54
Gate.io
SAND-USD$0.5265
0.0000195 Btc
$52,920.00
97,167.246 SAND
0.0475%
55
Binance
SAND-ETH$0.5284
0.0000196 Btc
$48,992.00
92,716.562 SAND
0.0453%
56
Nominex
SAND-USDT$0.5256
0.0000195 Btc
$45,964.00
87,449.243 SAND
0.0427%
57
Bitbank
SAND-JPY$0.5261
0.0000195 Btc
$45,962.00
87,360.220 SAND
0.0427%
58
WhiteBIT
SAND-USDT$0.5265
0.0000195 Btc
$43,048.00
81,759.070 SAND
0.0400%
59
WOO X
SAND-USDT$0.526
0.0000195 Btc
$41,853.00
79,574.300 SAND
0.0389%
60
BitMart
SAND-USDC$0.5294
0.0000196 Btc
$40,850.00
77,165.200 SAND
0.0377%
61
Coinbase Exchange
SAND-USDT$0.5264
0.0000195 Btc
$40,528.00
76,988.780 SAND
0.0376%
62
Binance US
SAND-USDT$0.5243
0.0000194 Btc
$39,387.00
75,117.581 SAND
0.0367%
63
Bitazza
SAND-BTC$0.5254
0.0000195 Btc
$36,859.00
68,882.000 SAND
0.0337%
64
Bitci TR
SAND-USDT$0.5218
0.0000194 Btc
$29,309.00
53,525.707 SAND
0.0262%
65
Dex-Trade
SAND-BNB$0.5265
0.0000195 Btc
$28,428.00
53,991.000 SAND
0.0264%
66
Crypto.com Exchange
SAND-USD$0.5248
0.0000195 Btc
$24,889.00
47,425.900 SAND
0.0232%
67
TokoCrypto
SAND-USDT$0.5282
0.0000196 Btc
$23,011.00
43,567.681 SAND
0.0213%
68
Tarmex
SAND-USDT$0.5274
0.0000196 Btc
$22,132.00
40,599.310 SAND
0.0198%
69
WhiteBIT
SAND-BTC$0.5255
0.0000195 Btc
$20,265.00
38,560.000 SAND
0.0188%
70
XT.COM
SAND-XT$0.5258
0.0000195 Btc
$19,814.93
36,449.630 SAND
0.0178%
71
Bitfinex
SAND-USDT$0.5266
0.0000195 Btc
$19,617.49
37,254.669 SAND
0.0182%
72
Biconomy
SAND-USDT$0.5253
0.0000195 Btc
$18,852.98
34,592.100 SAND
0.0169%
73
Bitfinex
SAND-USD$0.5255
0.0000195 Btc
$18,481.73
35,168.470 SAND
0.0172%
74
Binance US
SAND-USD$0.525
0.0000195 Btc
$18,219.53
34,703.871 SAND
0.0170%
75
Gemini
SAND-USD$0.528
0.0000196 Btc
$16,892.83
31,995.212 SAND
0.0156%
76
Kraken
SAND-GBP$0.5334
0.0000198 Btc
$15,040.95
28,196.223 SAND
0.0138%
77
CoinEx
SAND-USDT$0.5236
0.0000194 Btc
$13,881.00
25,682.985 SAND
0.0125%
78
Dex-Trade
SAND-ETH$0.527
0.0000196 Btc
$12,955.11
24,581.200 SAND
0.0120%
79
Huobi
SAND-HT$0.5271
0.0000196 Btc
$11,378.72
21,354.266 SAND
0.0104%
80
Narkasa
SAND-USDT$0.5282
0.0000196 Btc
$9,978.32
18,890.000 SAND
0.0092%
81
Bybit
SAND-BTC$0.5295
0.0000197 Btc
$9,514.69
17,968.200 SAND
0.0088%
82
Kanga
SAND-USDT$0.5272
0.0000196 Btc
$9,062.39
0.000 SAND
0.0000%
83
Max Maicoin
SAND-USDT$0.5254
0.0000195 Btc
$8,632.90
16,432.000 SAND
0.0080%
84
Binance
SAND-BRL$0.5299
0.0000197 Btc
$8,042.31
15,177.047 SAND
0.0074%
85
Indodax
SAND-IDR$0.5263
0.0000195 Btc
$7,172.27
13,628.076 SAND
0.0067%
86
Bitstamp
SAND-EUR$0.5313
0.0000197 Btc
$5,849.85
11,009.868 SAND
0.0054%
87
CoinEx
SAND-USDC$0.5271
0.0000196 Btc
$5,597.50
10,262.861 SAND
0.0050%
88
CoinEx
SAND-BTC$0.5252
0.0000195 Btc
$5,571.47
10,408.796 SAND
0.0051%
89
Uniswap V2 (Ethereum)
0X557B933A7C2C45672B610F8954A3DEB39A51A8CA-0X3845BADADE8E6DFF049820680D1F14BD3903A5D0$0.5289
0.0000196 Btc
$5,353.13
590,022.835 0X557B933A7C2C45672B610F8954A3DEB39A51A8CA
0.2883%
90
Gate.io
SAND-ETH$0.5267
0.0000195 Btc
$5,315.35
9,881.088 SAND
0.0048%
91
Bitazza
SAND-THB$0.5253
0.0000195 Btc
$3,586.63
6,606.000 SAND
0.0032%
92
Bitstamp
SAND-USD$0.5283
0.0000196 Btc
$3,558.96
6,736.378 SAND
0.0033%
93
Uniswap V2 (Ethereum)
0XE53EC727DBDEB9E2D5456C3BE40CFF031AB40A55-0X3845BADADE8E6DFF049820680D1F14BD3903A5D0$0.5302
0.0000197 Btc
$2,020.82
13,912.342 0XE53EC727DBDEB9E2D5456C3BE40CFF031AB40A55
0.0068%
94
Nominex
SAND-BUSD$0.526
0.0000195 Btc
$1,884.91
3,583.434 SAND
0.0018%
95
Coins.ph
SAND-PHP$0.5255
0.0000195 Btc
$1,311.37
2,432.168 SAND
0.0012%
96
Quickswap
0XBBBA073C31BF03B8ACF7C28EF0738DECF3695683-0XDFCE1E99A31C4597A3F8A8945CBFA9037655E335$0.5275
0.0000196 Btc
$1,126.70
2,108.094 0XBBBA073C31BF03B8ACF7C28EF0738DECF3695683
0.0010%
97
Poloniex
SAND-USDT$0.5243
0.0000195 Btc
$53.03
97.651 SAND
0.0000%
98
CEX.IO
SAND-USDT$0.5253
0.0000195 Btc
$47.01
87.959 SAND
0.0000%
99
Coinmetro
SAND-USD$0.526
0.0000195 Btc
$0.00
0.000 SAND
0.0000%
100
Coinmetro
SAND-EUR$0.5259
0.0000195 Btc
$0.00
0.000 SAND
0.0000%
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
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 {
    string internal _name;
    string internal _symbol;
    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
    ) {
        _name = tokenName;
        _symbol = 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 _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 _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;
    }

    /// @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 {
    uint256 private constant DATA_MIN_LENGTH = 68;

    /// @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 < DATA_MIN_LENGTH) {
            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",
        "devdoc",
        "userdoc",
        "metadata",
        "abi"
      ]
    }
  },
  "metadata": {
    "useLiteralContent": true
  },
  "libraries": {}
}

Contract Security Audit

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":"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"}]

60a06040523480156200001157600080fd5b506040516200234b3803806200234b83398101604081905262000034916200049b565b81816000806040518060400160405280600481526020016314d0539160e21b8152506040518060400160405280600481526020016314d0539160e21b815250858583600290805190602001906200008d929190620003dd565b508251620000a3906003906020860190620003dd565b506000805460609290921b6001600160601b0319166080526001600160a01b03199182166001600160a01b039384161790911688831617905584161591506200010e9050576000620000fe82670de0b6b3a764000062000512565b90506200010c838262000225565b505b505050506000620001246200037e60201b60201c565b600780546001600160a01b0319166001600160a01b038316908117909155604051919250906000907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a3506001600160a01b038416620001d95760405162461bcd60e51b815260206004820152602260248201527f426164204368696c64436861696e4d616e6167657250726f7879206164647265604482015261737360f01b60648201526084015b60405180910390fd5b600980546001600160a01b0319166001600160a01b0386161790556200021b83600880546001600160a01b0319166001600160a01b0392909216919091179055565b5050505062000587565b6001600160a01b038216620002725760405162461bcd60e51b81526020600482015260126024820152714e4f545f544f5f5a45524f4144445245535360701b6044820152606401620001d0565b60008111620002b45760405162461bcd60e51b815260206004820152600d60248201526c4d494e545f4f5f544f4b454e5360981b6044820152606401620001d0565b6004546000620002c58383620004f7565b9050818111620003035760405162461bcd60e51b81526020600482015260086024820152674f564552464c4f5760c01b6044820152606401620001d0565b60048190556001600160a01b0384166000908152600560205260408120805485929062000332908490620004f7565b90915550506040518381526001600160a01b038516906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a350505050565b6000620003956200039b60201b6200123c1760201c565b90505b90565b6000620003a833620003c6565b15620003be575060131936013560601c62000398565b503362000398565b6008546001600160a01b038281169116145b919050565b828054620003eb9062000534565b90600052602060002090601f0160209004810192826200040f57600085556200045a565b82601f106200042a57805160ff19168380011785556200045a565b828001600101855582156200045a579182015b828111156200045a5782518255916020019190600101906200043d565b50620004689291506200046c565b5090565b5b808211156200046857600081556001016200046d565b80516001600160a01b0381168114620003d857600080fd5b60008060008060808587031215620004b1578384fd5b620004bc8562000483565b9350620004cc6020860162000483565b9250620004dc6040860162000483565b9150620004ec6060860162000483565b905092959194509250565b600082198211156200050d576200050d62000571565b500190565b60008160001904831182151516156200052f576200052f62000571565b500290565b6002810460018216806200054957607f821691505b602082108114156200056b57634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052601160045260246000fd5b60805160601c611d89620005c2600039600081816106af0152818161083e0152818161093a0152818161140501526117ec0152611d896000f3fe6080604052600436106101c25760003560e01c80636e9960c3116100f7578063ac9fe42111610095578063cf2c52cb11610064578063cf2c52cb146104f0578063da74222814610510578063dd62ed3e14610530578063f2fde38b14610576576101c2565b8063ac9fe4211461048c578063bb1e23cb146104ac578063cae9ca51146104bf578063ce1b815f146104d2576101c2565b80638da5cb5b116100d15780638da5cb5b146104195780638f2839701461043757806395d89b4114610457578063a9059cbb1461046c576101c2565b80636e9960c3146103b057806370a08231146103ce578063715018a614610404576101c2565b8063313ce56711610164578063445a67971161013e578063445a6797146102ff578063572b6c051461031f57806362f629e71461033f578063654b748a14610377576101c2565b8063313ce567146102c35780633b7b5a16146102df57806342966c68146102a3576101c2565b80631dd319cb116101a05780631dd319cb1461024157806323b872dd146102635780632b991746146102835780632e1a7d4d146102a3576101c2565b806306fdde03146101c7578063095ea7b3146101f257806318160ddd14610222575b600080fd5b3480156101d357600080fd5b506101dc610596565b6040516101e99190611c8e565b60405180910390f35b3480156101fe57600080fd5b5061021261020d366004611b7c565b610629565b60405190151581526020016101e9565b34801561022e57600080fd5b506004545b6040519081526020016101e9565b34801561024d57600080fd5b5061026161025c366004611b7c565b610647565b005b34801561026f57600080fd5b5061021261027e366004611ab6565b610655565b34801561028f57600080fd5b5061021261029e366004611ab6565b6107e8565b3480156102af57600080fd5b506102616102be366004611bfd565b6108d0565b3480156102cf57600080fd5b50604051601281526020016101e9565b3480156102eb57600080fd5b506102126102fa366004611ab6565b6108e4565b34801561030b57600080fd5b5061026161031a366004611a63565b6109cc565b34801561032b57600080fd5b5061021261033a366004611a63565b610af0565b34801561034b57600080fd5b5060095461035f906001600160a01b031681565b6040516001600160a01b0390911681526020016101e9565b34801561038357600080fd5b50610212610392366004611a63565b6001600160a01b031660009081526001602052604090205460ff1690565b3480156103bc57600080fd5b506000546001600160a01b031661035f565b3480156103da57600080fd5b506102336103e9366004611a63565b6001600160a01b031660009081526005602052604090205490565b34801561041057600080fd5b50610261610b07565b34801561042557600080fd5b506007546001600160a01b031661035f565b34801561044357600080fd5b50610261610452366004611a63565b610bd7565b34801561046357600080fd5b506101dc610ca7565b34801561047857600080fd5b50610212610487366004611b7c565b610cb6565b34801561049857600080fd5b506102616104a7366004611af1565b610cca565b6101dc6104ba366004611ba5565b610dcb565b6101dc6104cd366004611ba5565b610f09565b3480156104de57600080fd5b506008546001600160a01b031661035f565b3480156104fc57600080fd5b5061026161050b366004611b2b565b610fac565b34801561051c57600080fd5b5061026161052b366004611a63565b611036565b34801561053c57600080fd5b5061023361054b366004611a84565b6001600160a01b03918216600090815260066020908152604080832093909416825291909152205490565b34801561058257600080fd5b50610261610591366004611a63565b6110de565b6060600280546105a590611cd0565b80601f01602080910402602001604051908101604052809291908181526020018280546105d190611cd0565b801561061e5780601f106105f35761010080835404028352916020019161061e565b820191906000526020600020905b81548152906001019060200180831161060157829003601f168201915b505050505090505b90565b600061063d610636611280565b848461128f565b5060015b92915050565b610651828261135d565b5050565b6000836001600160a01b0316610669611280565b6001600160a01b0316141580156106a6575060016000610687611280565b6001600160a01b0316815260208101919091526040016000205460ff16155b80156106eb57507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166106df611280565b6001600160a01b031614155b156107d3576001600160a01b038416600090815260066020526040812081610711611280565b6001600160a01b03168152602081019190915260400160002054905060001981146107d1578281101561078b5760405162461bcd60e51b815260206004820152601860248201527f4e4f545f415554484f52495a45445f414c4c4f57414e4345000000000000000060448201526064015b60405180910390fd5b6107958382611cb9565b6001600160a01b0386166000908152600660205260408120906107b6611280565b6001600160a01b031681526020810191909152604001600020555b505b6107de848484611608565b5060019392505050565b6000836001600160a01b03166107fc611280565b6001600160a01b03161480610836575060016000610818611280565b6001600160a01b0316815260208101919091526040016000205460ff165b8061087957507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031661086e611280565b6001600160a01b0316145b6108c55760405162461bcd60e51b815260206004820152600e60248201527f4e4f545f415554484f52495a45440000000000000000000000000000000000006044820152606401610782565b6107de84848461128f565b6108e16108db611280565b8261135d565b50565b6000836001600160a01b03166108f8611280565b6001600160a01b03161480610932575060016000610914611280565b6001600160a01b0316815260208101919091526040016000205460ff165b8061097557507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031661096a611280565b6001600160a01b0316145b6109c15760405162461bcd60e51b815260206004820152600e60248201527f494e56414c49445f53454e4445520000000000000000000000000000000000006044820152606401610782565b6107de8484846117ba565b6109d4611280565b6001600160a01b03166109ef6007546001600160a01b031690565b6001600160a01b031614610a455760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610782565b6001600160a01b038116610ac15760405162461bcd60e51b815260206004820152602260248201527f426164204368696c64436861696e4d616e6167657250726f787920616464726560448201527f73730000000000000000000000000000000000000000000000000000000000006064820152608401610782565b6009805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b0392909216919091179055565b6008546001600160a01b038281169116145b919050565b610b0f611280565b6001600160a01b0316610b2a6007546001600160a01b031690565b6001600160a01b031614610b805760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610782565b6007546040516000916001600160a01b0316907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a36007805473ffffffffffffffffffffffffffffffffffffffff19169055565b6000546001600160a01b03163314610c315760405162461bcd60e51b815260206004820152601360248201527f41444d494e5f4143434553535f44454e494544000000000000000000000000006044820152606401610782565b600054604080516001600160a01b03928316815291831660208301527f7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f910160405180910390a16000805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b0392909216919091179055565b6060600380546105a590611cd0565b600061063d610cc3611280565b8484611608565b6000546001600160a01b03163314610d4a5760405162461bcd60e51b815260206004820152602c60248201527f6f6e6c792061646d696e20697320616c6c6f77656420746f206164642073757060448201527f6572206f70657261746f727300000000000000000000000000000000000000006064820152608401610782565b6001600160a01b03821660008181526001602090815260409182902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00168515159081179091558251938452908301527f44f92d27abdf4cfb6a7d712c3af68f3be086d4ca747ab802c36f67d6790060d8910160405180910390a15050565b6060610e1583838080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250610e109250611280915050565b611864565b610e615760405162461bcd60e51b815260206004820152601660248201527f46495253545f504152414d5f4e4f545f53454e444552000000000000000000006044820152606401610782565b8315610e7957610e79610e72611280565b86866117ba565b600080866001600160a01b0316348686604051610e97929190611c7e565b60006040518083038185875af1925050503d8060008114610ed4576040519150601f19603f3d011682016040523d82523d6000602084013e610ed9565b606091505b5091509150818190610efe5760405162461bcd60e51b81526004016107829190611c8e565b509695505050505050565b6060610f4e83838080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250610e109250611280915050565b610f9a5760405162461bcd60e51b815260206004820152601660248201527f46495253545f504152414d5f4e4f545f53454e444552000000000000000000006044820152606401610782565b610e79610fa5611280565b868661128f565b6009546001600160a01b0316610fc0611280565b6001600160a01b0316146110165760405162461bcd60e51b815260206004820152601d60248201527f596f75277265206e6f7420616c6c6f77656420746f206465706f7369740000006044820152606401610782565b600061102482840184611bfd565b9050611030848261188f565b50505050565b61103e611280565b6001600160a01b03166110596007546001600160a01b031690565b6001600160a01b0316146110af5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610782565b6008805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b0392909216919091179055565b6110e6611280565b6001600160a01b03166111016007546001600160a01b031690565b6001600160a01b0316146111575760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610782565b6001600160a01b0381166111d35760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f64647265737300000000000000000000000000000000000000000000000000006064820152608401610782565b6007546040516001600160a01b038084169216907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a36007805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b0392909216919091179055565b600061124733610af0565b1561127957507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffec36013560601c610626565b5033610626565b600061128a61123c565b905090565b6001600160a01b038316158015906112af57506001600160a01b03821615155b6112fb5760405162461bcd60e51b815260206004820152601860248201527f494e56414c49445f4f574e45525f7c7c5f5350454e44455200000000000000006044820152606401610782565b6001600160a01b0383811660008181526006602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591015b60405180910390a3505050565b600081116113ad5760405162461bcd60e51b815260206004820152600d60248201527f4255524e5f4f5f544f4b454e53000000000000000000000000000000000000006044820152606401610782565b816001600160a01b03166113bf611280565b6001600160a01b0316141580156113fc5750600160006113dd611280565b6001600160a01b0316815260208101919091526040016000205460ff16155b801561144157507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316611435611280565b6001600160a01b031614155b15611524576001600160a01b038216600090815260066020526040812081611467611280565b6001600160a01b031681526020810191909152604001600020549050600019811461152257818110156114dc5760405162461bcd60e51b815260206004820152601660248201527f494e53554646494349454e545f414c4c4f57414e4345000000000000000000006044820152606401610782565b6114e68282611cb9565b6001600160a01b038416600090815260066020526040812090611507611280565b6001600160a01b031681526020810191909152604001600020555b505b6001600160a01b0382166000908152600560205260409020548181101561158d5760405162461bcd60e51b815260206004820152601260248201527f494e53554646494349454e545f46554e445300000000000000000000000000006044820152606401610782565b6115978282611cb9565b6001600160a01b038416600090815260056020526040812091909155600480548492906115c5908490611cb9565b90915550506040518281526000906001600160a01b038516907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef90602001611350565b6001600160a01b03821661165e5760405162461bcd60e51b815260206004820152601260248201527f4e4f545f544f5f5a45524f4144445245535300000000000000000000000000006044820152606401610782565b6001600160a01b0382163014156116b75760405162461bcd60e51b815260206004820152600b60248201527f4e4f545f544f5f544849530000000000000000000000000000000000000000006044820152606401610782565b6001600160a01b038316600090815260056020526040902054818110156117205760405162461bcd60e51b815260206004820152601260248201527f494e53554646494349454e545f46554e445300000000000000000000000000006044820152606401610782565b61172a8282611cb9565b6001600160a01b038086166000908152600560205260408082209390935590851681529081208054849290611760908490611ca1565b92505081905550826001600160a01b0316846001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040516117ac91815260200190565b60405180910390a350505050565b6000811180156117e357506001600160a01b03821660009081526001602052604090205460ff16155b801561182157507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b031614155b1561185f576001600160a01b03808416600090815260066020908152604080832093861683529290522054818110156110305761103084848461128f565b505050565b600060448351101561187857506000610641565b5060248201516001600160a01b0382161492915050565b6001600160a01b0382166118e55760405162461bcd60e51b815260206004820152601260248201527f4e4f545f544f5f5a45524f4144445245535300000000000000000000000000006044820152606401610782565b600081116119355760405162461bcd60e51b815260206004820152600d60248201527f4d494e545f4f5f544f4b454e53000000000000000000000000000000000000006044820152606401610782565b60045460006119448383611ca1565b90508181116119955760405162461bcd60e51b815260206004820152600860248201527f4f564552464c4f570000000000000000000000000000000000000000000000006044820152606401610782565b60048190556001600160a01b038416600090815260056020526040812080548592906119c2908490611ca1565b90915550506040518381526001600160a01b038516906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef906020016117ac565b80356001600160a01b0381168114610b0257600080fd5b60008083601f840112611a2d578182fd5b50813567ffffffffffffffff811115611a44578182fd5b602083019150836020828501011115611a5c57600080fd5b9250929050565b600060208284031215611a74578081fd5b611a7d82611a05565b9392505050565b60008060408385031215611a96578081fd5b611a9f83611a05565b9150611aad60208401611a05565b90509250929050565b600080600060608486031215611aca578081fd5b611ad384611a05565b9250611ae160208501611a05565b9150604084013590509250925092565b60008060408385031215611b03578182fd5b611b0c83611a05565b915060208301358015158114611b20578182fd5b809150509250929050565b600080600060408486031215611b3f578283fd5b611b4884611a05565b9250602084013567ffffffffffffffff811115611b63578283fd5b611b6f86828701611a1c565b9497909650939450505050565b60008060408385031215611b8e578182fd5b611b9783611a05565b946020939093013593505050565b60008060008060608587031215611bba578081fd5b611bc385611a05565b935060208501359250604085013567ffffffffffffffff811115611be5578182fd5b611bf187828801611a1c565b95989497509550505050565b600060208284031215611c0e578081fd5b5035919050565b60008151808452815b81811015611c3a57602081850181015186830182015201611c1e565b81811115611c4b5782602083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b6000828483379101908152919050565b600060208252611a7d6020830184611c15565b60008219821115611cb457611cb4611d24565b500190565b600082821015611ccb57611ccb611d24565b500390565b600281046001821680611ce457607f821691505b60208210811415611d1e577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fdfea264697066735822122062a887365b69f1c5fb4fb5b0be071e4c0dc583555fa546d72053d18702a5dfe064736f6c63430008020033000000000000000000000000a6fa4fb5f76172d178d61b04b0ecd319c5d1c0aa00000000000000000000000086c80a8aa58e0a4fa09a69624c31ab2a6cad56b8000000000000000000000000e75ce341c98400a45f579e32c95ff49681fc93fa000000000000000000000000e75ce341c98400a45f579e32c95ff49681fc93fa

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

000000000000000000000000a6fa4fb5f76172d178d61b04b0ecd319c5d1c0aa00000000000000000000000086c80a8aa58e0a4fa09a69624c31ab2a6cad56b8000000000000000000000000e75ce341c98400a45f579e32c95ff49681fc93fa000000000000000000000000e75ce341c98400a45f579e32c95ff49681fc93fa

-----Decoded View---------------
Arg [0] : _childChainManagerProxy (address): 0xa6fa4fb5f76172d178d61b04b0ecd319c5d1c0aa
Arg [1] : trustedForwarder (address): 0x86c80a8aa58e0a4fa09a69624c31ab2a6cad56b8
Arg [2] : sandAdmin (address): 0xe75ce341c98400a45f579e32c95ff49681fc93fa
Arg [3] : executionAdmin (address): 0xe75ce341c98400a45f579e32c95ff49681fc93fa

-----Encoded View---------------
4 Constructor Arguments found :
Arg [0] : 000000000000000000000000a6fa4fb5f76172d178d61b04b0ecd319c5d1c0aa
Arg [1] : 00000000000000000000000086c80a8aa58e0a4fa09a69624c31ab2a6cad56b8
Arg [2] : 000000000000000000000000e75ce341c98400a45f579e32c95ff49681fc93fa
Arg [3] : 000000000000000000000000e75ce341c98400a45f579e32c95ff49681fc93fa


Loading