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