false
false
0
The new Blockscout UI is now open source! Learn how to deploy it here
- We're indexing this chain right now. Some of the counts may be inaccurate.

Contract Address Details

0x204d562C5a6e9e75257f01cd7e313F597349e684

Token
0x204d56-49e684
Creator
0x6d56ba–6e0398 at 0xd415d3–999ee1
Balance
0 ETH
Tokens
Fetching tokens...
Transactions
Fetching transactions...
Transfers
Fetching transfers...
Gas Used
Fetching gas used...
Last Balance Update
4969792
Warning! Contract bytecode has been changed and doesn't match the verified one. Therefore, interaction with this smart contract may be risky.
Contract name:
QsnTokenTaiko




Optimization enabled
true
Compiler version
v0.8.28+commit.7893614a




Optimization runs
200
EVM Version
cancun




Verified at
2026-03-29T13:16:32.754117Z

Constructor Arguments

0x0000000000000000000000006d56ba3bb226b1053fc9a9c88c346a69596e0398

Arg [0] (address) : 0x6d56ba3bb226b1053fc9a9c88c346a69596e0398

              

src/token/QsnTokenTaiko.sol

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.20;

interface IERC20Metadata {
    function name() external view returns (string memory);
    function symbol() external view returns (string memory);
    function decimals() external view returns (uint8);
    function totalSupply() external view returns (uint256);
    function balanceOf(address account) external view returns (uint256);
    function transfer(address to, uint256 amount) external returns (bool);
    function allowance(address owner, address spender) external view returns (uint256);
    function approve(address spender, uint256 amount) external returns (bool);
    function transferFrom(address from, address to, uint256 amount) external returns (bool);

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

interface IERC20Permit {
    function permit(
        address owner,
        address spender,
        uint256 value,
        uint256 deadline,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) external;
    function nonces(address owner) external view returns (uint256);
    function DOMAIN_SEPARATOR() external view returns (bytes32);
}

contract QsnTokenTaiko is IERC20Metadata, IERC20Permit {
    string public constant override name = "Quantum Security Network";
    string public constant override symbol = "QSN";
    uint8 public constant override decimals = 18;
    uint256 public constant MAX_SUPPLY = 1_000_000_000 * 1e18;

    uint256 public override totalSupply;
    address public owner;

    mapping(address => uint256) public override balanceOf;
    mapping(address => mapping(address => uint256)) public override allowance;
    mapping(address => uint256) public override nonces;

    bytes32 public override DOMAIN_SEPARATOR;
    bytes32 private constant PERMIT_TYPEHASH = keccak256("Permit(address owner,address spender,uint256 value,uint256 nonce,uint256 deadline)");

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

    modifier onlyOwner() {
        require(msg.sender == owner, "QSN: not owner");
        _;
    }

    constructor(address _owner) {
        owner = _owner;
        DOMAIN_SEPARATOR = keccak256(
            abi.encode(
                keccak256("EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)"),
                keccak256(bytes("Quantum Security Network")),
                keccak256(bytes("1")),
                block.chainid,
                address(this)
            )
        );
    }

    function mint(address to, uint256 amount) external onlyOwner {
        require(to != address(0), "QSN: mint to zero");
        require(totalSupply + amount <= MAX_SUPPLY, "QSN: exceeds max supply");
        totalSupply += amount;
        balanceOf[to] += amount;
        emit Transfer(address(0), to, amount);
    }

    function burn(uint256 amount) external {
        _burn(msg.sender, amount);
    }

    function burnFrom(address account, uint256 amount) external {
        _spendAllowance(account, msg.sender, amount);
        _burn(account, amount);
    }

    function transfer(address to, uint256 amount) external override returns (bool) {
        _transfer(msg.sender, to, amount);
        return true;
    }

    function transferFrom(address from, address to, uint256 amount) external override returns (bool) {
        _spendAllowance(from, msg.sender, amount);
        _transfer(from, to, amount);
        return true;
    }

    function approve(address spender, uint256 amount) external override returns (bool) {
        _approve(msg.sender, spender, amount);
        return true;
    }

    function increaseAllowance(address spender, uint256 addedValue) external returns (bool) {
        _approve(msg.sender, spender, allowance[msg.sender][spender] + addedValue);
        return true;
    }

    function decreaseAllowance(address spender, uint256 subtractedValue) external returns (bool) {
        uint256 currentAllowance = allowance[msg.sender][spender];
        require(currentAllowance >= subtractedValue, "QSN: decreased allowance below zero");
        _approve(msg.sender, spender, currentAllowance - subtractedValue);
        return true;
    }

    function permit(
        address _owner,
        address spender,
        uint256 value,
        uint256 deadline,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) external override {
        require(block.timestamp <= deadline, "QSN: permit expired");
        bytes32 structHash = keccak256(abi.encode(PERMIT_TYPEHASH, _owner, spender, value, nonces[_owner]++, deadline));
        bytes32 hash = keccak256(abi.encodePacked("\x19\x01", DOMAIN_SEPARATOR, structHash));
        address signer = ecrecover(hash, v, r, s);
        require(signer != address(0) && signer == _owner, "QSN: invalid permit");
        _approve(_owner, spender, value);
    }

    function transferOwnership(address newOwner) external onlyOwner {
        require(newOwner != address(0), "QSN: zero address");
        emit OwnershipTransferred(owner, newOwner);
        owner = newOwner;
    }

    function renounceOwnership() external onlyOwner {
        emit OwnershipTransferred(owner, address(0));
        owner = address(0);
    }

    function _transfer(address from, address to, uint256 amount) internal {
        require(from != address(0), "QSN: transfer from zero");
        require(to != address(0), "QSN: transfer to zero");
        require(balanceOf[from] >= amount, "QSN: insufficient balance");
        unchecked {
            balanceOf[from] -= amount;
        }
        balanceOf[to] += amount;
        emit Transfer(from, to, amount);
    }

    function _burn(address account, uint256 amount) internal {
        require(account != address(0), "QSN: burn from zero");
        require(balanceOf[account] >= amount, "QSN: burn exceeds balance");
        unchecked {
            balanceOf[account] -= amount;
        }
        totalSupply -= amount;
        emit Transfer(account, address(0), amount);
    }

    function _approve(address _owner, address spender, uint256 amount) internal {
        require(_owner != address(0), "QSN: approve from zero");
        require(spender != address(0), "QSN: approve to zero");
        allowance[_owner][spender] = amount;
        emit Approval(_owner, spender, amount);
    }

    function _spendAllowance(address _owner, address spender, uint256 amount) internal {
        uint256 currentAllowance = allowance[_owner][spender];
        if (currentAllowance != type(uint256).max) {
            require(currentAllowance >= amount, "QSN: insufficient allowance");
            unchecked {
                allowance[_owner][spender] = currentAllowance - amount;
            }
        }
    }
}
        

Compiler Settings

{"viaIR":true,"remappings":["@openzeppelin/contracts/=lib/openzeppelin-contracts/contracts/","erc4626-tests/=lib/openzeppelin-contracts/lib/erc4626-tests/","forge-std/=lib/openzeppelin-contracts/lib/forge-std/src/","halmos-cheatcodes/=lib/openzeppelin-contracts/lib/halmos-cheatcodes/src/","openzeppelin-contracts/=lib/openzeppelin-contracts/"],"outputSelection":{"*":{"*":["*"],"":["*"]}},"optimizer":{"runs":200,"enabled":true},"metadata":{"useLiteralContent":false,"bytecodeHash":"ipfs","appendCBOR":true},"libraries":{},"evmVersion":"cancun"}
              

Contract ABI

[{"type":"constructor","stateMutability":"nonpayable","inputs":[{"type":"address","name":"_owner","internalType":"address"}]},{"type":"event","name":"Approval","inputs":[{"type":"address","name":"owner","internalType":"address","indexed":true},{"type":"address","name":"spender","internalType":"address","indexed":true},{"type":"uint256","name":"value","internalType":"uint256","indexed":false}],"anonymous":false},{"type":"event","name":"OwnershipTransferred","inputs":[{"type":"address","name":"previousOwner","internalType":"address","indexed":true},{"type":"address","name":"newOwner","internalType":"address","indexed":true}],"anonymous":false},{"type":"event","name":"Transfer","inputs":[{"type":"address","name":"from","internalType":"address","indexed":true},{"type":"address","name":"to","internalType":"address","indexed":true},{"type":"uint256","name":"value","internalType":"uint256","indexed":false}],"anonymous":false},{"type":"function","stateMutability":"view","outputs":[{"type":"bytes32","name":"","internalType":"bytes32"}],"name":"DOMAIN_SEPARATOR","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"MAX_SUPPLY","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"allowance","inputs":[{"type":"address","name":"","internalType":"address"},{"type":"address","name":"","internalType":"address"}]},{"type":"function","stateMutability":"nonpayable","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"approve","inputs":[{"type":"address","name":"spender","internalType":"address"},{"type":"uint256","name":"amount","internalType":"uint256"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"balanceOf","inputs":[{"type":"address","name":"","internalType":"address"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"burn","inputs":[{"type":"uint256","name":"amount","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"burnFrom","inputs":[{"type":"address","name":"account","internalType":"address"},{"type":"uint256","name":"amount","internalType":"uint256"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint8","name":"","internalType":"uint8"}],"name":"decimals","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"decreaseAllowance","inputs":[{"type":"address","name":"spender","internalType":"address"},{"type":"uint256","name":"subtractedValue","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"increaseAllowance","inputs":[{"type":"address","name":"spender","internalType":"address"},{"type":"uint256","name":"addedValue","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"mint","inputs":[{"type":"address","name":"to","internalType":"address"},{"type":"uint256","name":"amount","internalType":"uint256"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"string","name":"","internalType":"string"}],"name":"name","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"nonces","inputs":[{"type":"address","name":"","internalType":"address"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address"}],"name":"owner","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"permit","inputs":[{"type":"address","name":"_owner","internalType":"address"},{"type":"address","name":"spender","internalType":"address"},{"type":"uint256","name":"value","internalType":"uint256"},{"type":"uint256","name":"deadline","internalType":"uint256"},{"type":"uint8","name":"v","internalType":"uint8"},{"type":"bytes32","name":"r","internalType":"bytes32"},{"type":"bytes32","name":"s","internalType":"bytes32"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"renounceOwnership","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"string","name":"","internalType":"string"}],"name":"symbol","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"totalSupply","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"transfer","inputs":[{"type":"address","name":"to","internalType":"address"},{"type":"uint256","name":"amount","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"transferFrom","inputs":[{"type":"address","name":"from","internalType":"address"},{"type":"address","name":"to","internalType":"address"},{"type":"uint256","name":"amount","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"transferOwnership","inputs":[{"type":"address","name":"newOwner","internalType":"address"}]}]
              

Contract Creation Code

0x6080806040523461012e57602081610f43803803809161001f8285610132565b83398101031261012e57516001600160a01b0381169081900361012e5760018060a01b0319600154161760015560405161005a604082610132565b601881527f5175616e74756d205365637572697479204e6574776f726b0000000000000000602090910152604080517fe5211b51e7d6dfe90d9f5af032ec98f883d5da33ec9b7704cc6b56a5cb6f11f7916100b59082610132565b600181526020810190603160f81b82525190206040519060208201927f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f8452604083015260608201524660808201523060a082015260a0815261011960c082610132565b519020600555604051610dd9908161016a8239f35b5f80fd5b601f909101601f19168101906001600160401b0382119082101761015557604052565b634e487b7160e01b5f52604160045260245ffdfe60806040526004361015610011575f80fd5b5f3560e01c806306fdde031461089e578063095ea7b31461087857806318160ddd1461085c57806323b872dd14610824578063313ce5671461080957806332cb6b0c146107e35780633644e515146107c6578063395093511461077f57806340c10f191461064e57806342966c681461063157806370a08231146105f9578063715018a61461059d57806379cc67901461056d5780637ecebe00146105355780638da5cb5b1461050d57806395d89b41146104cc578063a457c2d714610424578063a9059cbb146103f3578063d505accf14610205578063dd62ed3e146101b55763f2fde38b14610100575f80fd5b346101b15760203660031901126101b157610119610955565b6001546001600160a01b0381169161013233841461098e565b6001600160a01b03169182156101785782907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e05f80a36001600160a01b03191617600155005b60405162461bcd60e51b815260206004820152601160248201527051534e3a207a65726f206164647265737360781b6044820152606490fd5b5f80fd5b346101b15760403660031901126101b1576101ce610955565b6101d661096b565b6001600160a01b039182165f908152600360209081526040808320949093168252928352819020549051908152f35b346101b15760e03660031901126101b15761021e610955565b61022661096b565b6044359060643560843560ff81168091036101b1578142116103b8576001600160a01b0385165f8181526004602052604090208054919391925f1984146103a457835f93608093600160209701905560405190868201927f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c9845288604084015260018060a01b038a1660608401528a8684015260a083015260c082015260c081526102d260e0826108f5565b51902060055490604051908682019261190160f01b845260228301526042820152604281526103026062826108f5565b519020906040519182528482015260a435604082015260c435606082015282805260015afa15610399575f516001600160a01b031680151591908261038f575b50501561035457610352926109d8565b005b60405162461bcd60e51b81526020600482015260136024820152721454d38e881a5b9d985b1a59081c195c9b5a5d606a1b6044820152606490fd5b1490508480610342565b6040513d5f823e3d90fd5b634e487b7160e01b5f52601160045260245ffd5b60405162461bcd60e51b81526020600482015260136024820152721454d38e881c195c9b5a5d08195e1c1a5c9959606a1b6044820152606490fd5b346101b15760403660031901126101b15761041961040f610955565b6024359033610b65565b602060405160018152f35b346101b15760403660031901126101b15761043d610955565b60243590335f52600360205260405f2060018060a01b0382165f5260205260405f205482811061047b5761041992610474916109cb565b90336109d8565b60405162461bcd60e51b815260206004820152602360248201527f51534e3a2064656372656173656420616c6c6f77616e63652062656c6f77207a60448201526265726f60e81b6064820152608490fd5b346101b1575f3660031901126101b1576105096040516104ed6040826108f5565b600381526228a9a760e91b60208201526040519182918261092b565b0390f35b346101b1575f3660031901126101b1576001546040516001600160a01b039091168152602090f35b346101b15760203660031901126101b1576001600160a01b03610556610955565b165f526004602052602060405f2054604051908152f35b346101b15760403660031901126101b157610352610589610955565b60243590610598823383610ab5565b610cb5565b346101b1575f3660031901126101b1576001545f6001600160a01b0382166105c633821461098e565b7f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08280a36001600160a01b031916600155005b346101b15760203660031901126101b1576001600160a01b0361061a610955565b165f526002602052602060405f2054604051908152f35b346101b15760203660031901126101b15761035260043533610cb5565b346101b15760403660031901126101b157610667610955565b6024359061068060018060a01b0360015416331461098e565b6001600160a01b0316908115610746575f54906b033b2e3c9fd0803ce80000006106aa8284610981565b11610701576020816106de7fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef935f95610981565b845584845260028252604084206106f6828254610981565b9055604051908152a3005b60405162461bcd60e51b815260206004820152601760248201527f51534e3a2065786365656473206d617820737570706c790000000000000000006044820152606490fd5b60405162461bcd60e51b815260206004820152601160248201527051534e3a206d696e7420746f207a65726f60781b6044820152606490fd5b346101b15760403660031901126101b15761041961079b610955565b335f52600360205260405f2060018060a01b0382165f5260205261047460405f206024359054610981565b346101b1575f3660031901126101b1576020600554604051908152f35b346101b1575f3660031901126101b15760206040516b033b2e3c9fd0803ce80000008152f35b346101b1575f3660031901126101b157602060405160128152f35b346101b15760603660031901126101b157610419610840610955565b61084861096b565b60443591610857833383610ab5565b610b65565b346101b1575f3660031901126101b15760205f54604051908152f35b346101b15760403660031901126101b157610419610894610955565b60243590336109d8565b346101b1575f3660031901126101b1576105096040516108bf6040826108f5565b601881527f5175616e74756d205365637572697479204e6574776f726b000000000000000060208201526040519182918261092b565b90601f8019910116810190811067ffffffffffffffff82111761091757604052565b634e487b7160e01b5f52604160045260245ffd5b602060409281835280519182918282860152018484015e5f828201840152601f01601f1916010190565b600435906001600160a01b03821682036101b157565b602435906001600160a01b03821682036101b157565b919082018092116103a457565b1561099557565b60405162461bcd60e51b815260206004820152600e60248201526d28a9a71d103737ba1037bbb732b960911b6044820152606490fd5b919082039182116103a457565b6001600160a01b0316908115610a77576001600160a01b0316918215610a3b5760207f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591835f526003825260405f20855f5282528060405f2055604051908152a3565b60405162461bcd60e51b815260206004820152601460248201527351534e3a20617070726f766520746f207a65726f60601b6044820152606490fd5b60405162461bcd60e51b815260206004820152601660248201527551534e3a20617070726f76652066726f6d207a65726f60501b6044820152606490fd5b6001600160a01b039081165f8181526003602090815260408083209486168352939052919091205492919060018401610aef575b50505050565b828410610b20575f52600360205260405f209060018060a01b03165f5260205260405f20910390555f808080610ae9565b60405162461bcd60e51b815260206004820152601b60248201527f51534e3a20696e73756666696369656e7420616c6c6f77616e636500000000006044820152606490fd5b6001600160a01b0316908115610c70576001600160a01b0316918215610c3357815f5260026020528060405f205410610bee5760207fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91835f526002825260405f20818154039055845f526002825260405f20610be3828254610981565b9055604051908152a3565b60405162461bcd60e51b815260206004820152601960248201527f51534e3a20696e73756666696369656e742062616c616e6365000000000000006044820152606490fd5b60405162461bcd60e51b815260206004820152601560248201527451534e3a207472616e7366657220746f207a65726f60581b6044820152606490fd5b60405162461bcd60e51b815260206004820152601760248201527f51534e3a207472616e736665722066726f6d207a65726f0000000000000000006044820152606490fd5b6001600160a01b03168015610d6857805f5260026020528160405f205410610d23577fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60205f938385526002825260408520818154039055610d188186546109cb565b8555604051908152a3565b60405162461bcd60e51b815260206004820152601960248201527f51534e3a206275726e20657863656564732062616c616e6365000000000000006044820152606490fd5b60405162461bcd60e51b815260206004820152601360248201527251534e3a206275726e2066726f6d207a65726f60681b6044820152606490fdfea2646970667358221220c0a3483c7fbf716b10d98c54d22b74f1584f6d096d205508edda1680f3aee94364736f6c634300081c00330000000000000000000000006d56ba3bb226b1053fc9a9c88c346a69596e0398

Deployed ByteCode

0x60806040526004361015610011575f80fd5b5f3560e01c806306fdde031461089e578063095ea7b31461087857806318160ddd1461085c57806323b872dd14610824578063313ce5671461080957806332cb6b0c146107e35780633644e515146107c6578063395093511461077f57806340c10f191461064e57806342966c681461063157806370a08231146105f9578063715018a61461059d57806379cc67901461056d5780637ecebe00146105355780638da5cb5b1461050d57806395d89b41146104cc578063a457c2d714610424578063a9059cbb146103f3578063d505accf14610205578063dd62ed3e146101b55763f2fde38b14610100575f80fd5b346101b15760203660031901126101b157610119610955565b6001546001600160a01b0381169161013233841461098e565b6001600160a01b03169182156101785782907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e05f80a36001600160a01b03191617600155005b60405162461bcd60e51b815260206004820152601160248201527051534e3a207a65726f206164647265737360781b6044820152606490fd5b5f80fd5b346101b15760403660031901126101b1576101ce610955565b6101d661096b565b6001600160a01b039182165f908152600360209081526040808320949093168252928352819020549051908152f35b346101b15760e03660031901126101b15761021e610955565b61022661096b565b6044359060643560843560ff81168091036101b1578142116103b8576001600160a01b0385165f8181526004602052604090208054919391925f1984146103a457835f93608093600160209701905560405190868201927f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c9845288604084015260018060a01b038a1660608401528a8684015260a083015260c082015260c081526102d260e0826108f5565b51902060055490604051908682019261190160f01b845260228301526042820152604281526103026062826108f5565b519020906040519182528482015260a435604082015260c435606082015282805260015afa15610399575f516001600160a01b031680151591908261038f575b50501561035457610352926109d8565b005b60405162461bcd60e51b81526020600482015260136024820152721454d38e881a5b9d985b1a59081c195c9b5a5d606a1b6044820152606490fd5b1490508480610342565b6040513d5f823e3d90fd5b634e487b7160e01b5f52601160045260245ffd5b60405162461bcd60e51b81526020600482015260136024820152721454d38e881c195c9b5a5d08195e1c1a5c9959606a1b6044820152606490fd5b346101b15760403660031901126101b15761041961040f610955565b6024359033610b65565b602060405160018152f35b346101b15760403660031901126101b15761043d610955565b60243590335f52600360205260405f2060018060a01b0382165f5260205260405f205482811061047b5761041992610474916109cb565b90336109d8565b60405162461bcd60e51b815260206004820152602360248201527f51534e3a2064656372656173656420616c6c6f77616e63652062656c6f77207a60448201526265726f60e81b6064820152608490fd5b346101b1575f3660031901126101b1576105096040516104ed6040826108f5565b600381526228a9a760e91b60208201526040519182918261092b565b0390f35b346101b1575f3660031901126101b1576001546040516001600160a01b039091168152602090f35b346101b15760203660031901126101b1576001600160a01b03610556610955565b165f526004602052602060405f2054604051908152f35b346101b15760403660031901126101b157610352610589610955565b60243590610598823383610ab5565b610cb5565b346101b1575f3660031901126101b1576001545f6001600160a01b0382166105c633821461098e565b7f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08280a36001600160a01b031916600155005b346101b15760203660031901126101b1576001600160a01b0361061a610955565b165f526002602052602060405f2054604051908152f35b346101b15760203660031901126101b15761035260043533610cb5565b346101b15760403660031901126101b157610667610955565b6024359061068060018060a01b0360015416331461098e565b6001600160a01b0316908115610746575f54906b033b2e3c9fd0803ce80000006106aa8284610981565b11610701576020816106de7fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef935f95610981565b845584845260028252604084206106f6828254610981565b9055604051908152a3005b60405162461bcd60e51b815260206004820152601760248201527f51534e3a2065786365656473206d617820737570706c790000000000000000006044820152606490fd5b60405162461bcd60e51b815260206004820152601160248201527051534e3a206d696e7420746f207a65726f60781b6044820152606490fd5b346101b15760403660031901126101b15761041961079b610955565b335f52600360205260405f2060018060a01b0382165f5260205261047460405f206024359054610981565b346101b1575f3660031901126101b1576020600554604051908152f35b346101b1575f3660031901126101b15760206040516b033b2e3c9fd0803ce80000008152f35b346101b1575f3660031901126101b157602060405160128152f35b346101b15760603660031901126101b157610419610840610955565b61084861096b565b60443591610857833383610ab5565b610b65565b346101b1575f3660031901126101b15760205f54604051908152f35b346101b15760403660031901126101b157610419610894610955565b60243590336109d8565b346101b1575f3660031901126101b1576105096040516108bf6040826108f5565b601881527f5175616e74756d205365637572697479204e6574776f726b000000000000000060208201526040519182918261092b565b90601f8019910116810190811067ffffffffffffffff82111761091757604052565b634e487b7160e01b5f52604160045260245ffd5b602060409281835280519182918282860152018484015e5f828201840152601f01601f1916010190565b600435906001600160a01b03821682036101b157565b602435906001600160a01b03821682036101b157565b919082018092116103a457565b1561099557565b60405162461bcd60e51b815260206004820152600e60248201526d28a9a71d103737ba1037bbb732b960911b6044820152606490fd5b919082039182116103a457565b6001600160a01b0316908115610a77576001600160a01b0316918215610a3b5760207f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591835f526003825260405f20855f5282528060405f2055604051908152a3565b60405162461bcd60e51b815260206004820152601460248201527351534e3a20617070726f766520746f207a65726f60601b6044820152606490fd5b60405162461bcd60e51b815260206004820152601660248201527551534e3a20617070726f76652066726f6d207a65726f60501b6044820152606490fd5b6001600160a01b039081165f8181526003602090815260408083209486168352939052919091205492919060018401610aef575b50505050565b828410610b20575f52600360205260405f209060018060a01b03165f5260205260405f20910390555f808080610ae9565b60405162461bcd60e51b815260206004820152601b60248201527f51534e3a20696e73756666696369656e7420616c6c6f77616e636500000000006044820152606490fd5b6001600160a01b0316908115610c70576001600160a01b0316918215610c3357815f5260026020528060405f205410610bee5760207fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91835f526002825260405f20818154039055845f526002825260405f20610be3828254610981565b9055604051908152a3565b60405162461bcd60e51b815260206004820152601960248201527f51534e3a20696e73756666696369656e742062616c616e6365000000000000006044820152606490fd5b60405162461bcd60e51b815260206004820152601560248201527451534e3a207472616e7366657220746f207a65726f60581b6044820152606490fd5b60405162461bcd60e51b815260206004820152601760248201527f51534e3a207472616e736665722066726f6d207a65726f0000000000000000006044820152606490fd5b6001600160a01b03168015610d6857805f5260026020528160405f205410610d23577fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60205f938385526002825260408520818154039055610d188186546109cb565b8555604051908152a3565b60405162461bcd60e51b815260206004820152601960248201527f51534e3a206275726e20657863656564732062616c616e6365000000000000006044820152606490fd5b60405162461bcd60e51b815260206004820152601360248201527251534e3a206275726e2066726f6d207a65726f60681b6044820152606490fdfea2646970667358221220c0a3483c7fbf716b10d98c54d22b74f1584f6d096d205508edda1680f3aee94364736f6c634300081c0033