Transactions
Token Transfers
Tokens
Internal Transactions
Coin Balance History
Logs
Code
Read Contract
Write Contract
Warning! Contract bytecode has been changed and doesn't match the verified one. Therefore, interaction with this smart contract may be risky.
This contract has been partially verified via Sourcify.
View contract in Sourcify repository
- Contract name:
- PlaygroundToken
- Optimization enabled
- false
- Compiler version
- v0.8.20+commit.a1b79de6
- EVM Version
- shanghai
- Verified at
- 2026-02-26T19:29:40.420101Z
Constructor Arguments
00000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000100000000000000000000000000abef2874c5ef165fc2194c180e06894871724b050000000000000000000000009af7d71f8f0eff488623c8b952ec38f0d7e611240000000000000000000000000000000000000000000000000000000000000140000000000000000000000000000000000000000c9f2c9cd04674edea40000000000000000000000000000000000000000000000000000000000000000000000b4555524f444f4c4c4152530000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006454444494553000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001ef4555524f444f4c4c41525320697320746865206368696c6420746f6b656e20746f2047656e65736973204d696e647365742c20657874656e64696e672074686520474d414e207370696e6520746f2062726964676520746865204d616e64616c61204d61747269782077697468207468652053637265616d696e672048616e642045636f73797374656d2e2054686973206c696e6b20656e61626c65732064656570206c697175696469747920666c6f77207468726f75676820636f7265204174726f706120746f6b656e732c20696e636c7564696e67207265666c656374696f6e20746f6b656e733a204f7961797562692c204869746f7361736869797562692c204e616b61797562692c204b7573757269797562692c204b6f797562692c20616e642050616c6d2028e6898be381aee381b2e38289292c20616c6c20616e63686f72656420746f2050756c736520446f6c6c61722028245044292e0a0a53637265616d696e672048616e642043413a203078303436633263376363613137616236653434343464356534303234663761386463633065626266610a0a54686520436f6e6e656374696f6e3a204d617472697820e2869420474d414e20e286942047656e65736973204d696e6473657420e286942045444449455320e286942053637265616d696e672048616e640000000000000000000000000000000000
Arg [0] (string) : EURODOLLARS
Arg [1] (string) : EDDIES
Arg [2] (address) : 0xabef2874c5ef165fc2194c180e06894871724b05
Arg [3] (address) : 0x9af7d71f8f0eff488623c8b952ec38f0d7e61124
Arg [4] (string) : EURODOLLARS is the child token to Genesis Mindset, extending the GMAN spine to bridge the Mandala Matrix with the Screaming Hand Ecosystem. This link enables deep liquidity flow through core Atropa tokens, including reflection tokens: Oyayubi, Hitosashiyubi, Nakayubi, Kusuriyubi, Koyubi, and Palm (手のひら), all anchored to Pulse Dollar ($PD).
Screaming Hand CA: 0x046c2c7cca17ab6e4444d5e4024f7a8dcc0ebbfa
The Connection: Matrix ↔ GMAN ↔ Genesis Mindset ↔ EDDIES ↔ Screaming Hand
Arg [5] (uint256) : 1000000000000000000000000000000
contracts/PlaygroundToken.sol
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.20;
import "@openzeppelin/contracts/token/ERC20/ERC20.sol";
import "@openzeppelin/contracts/access/Ownable.sol";
import "@openzeppelin/contracts/utils/ReentrancyGuard.sol";
import "@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol";
import "@openzeppelin/contracts/token/ERC20/IERC20.sol";
/**
* @title PlaygroundToken
* @dev ERC20 token with wrap/unwrap functionality using parent tokens
* @notice Users can wrap parent tokens to receive PlaygroundTokens (burn function)
* and unwrap PlaygroundTokens to get back parent tokens (claim function)
*/
contract PlaygroundToken is ERC20, Ownable, ReentrancyGuard {
using SafeERC20 for IERC20;
/// @dev Parent token address used for wrapping/unwrapping
address public parent;
/// @dev Token description
string public description;
/// @dev Maximum supply cap (immutable)
uint256 public immutable maxSupply;
/// @dev Factory address that can mint tokens (immutable)
address public immutable factory;
/**
* @dev Constructor
* @param name ERC20 token name
* @param symbol ERC20 token symbol
* @param factoryAddress Factory contract address (for minting access control)
* @param parentToken Parent token address for wrapping/unwrapping
* @param tokenDescription Token description
* @param maxTokenSupply Maximum supply cap (must be >= 1 billion tokens)
*/
constructor(
string memory name,
string memory symbol,
address factoryAddress,
address parentToken,
string memory tokenDescription,
uint256 maxTokenSupply
) ERC20(name, symbol) Ownable(msg.sender) {
require(parentToken != address(0), "PlaygroundToken: parent token cannot be zero address");
require(
maxTokenSupply >= 1_000_000_000 * 10**18,
"PlaygroundToken: maxSupply must be at least 1 billion tokens"
);
parent = parentToken;
description = tokenDescription;
maxSupply = maxTokenSupply;
factory = factoryAddress;
}
/**
* @dev Wrap parent tokens into PlaygroundTokens
* @notice Transfers parent tokens from user and mints PlaygroundTokens
* @param amount Amount of parent tokens to wrap
*/
function burn(uint256 amount) external {
require(amount > 0, "PlaygroundToken: amount must be greater than zero");
// Transfer parent tokens from user to this contract
IERC20(parent).safeTransferFrom(msg.sender, address(this), amount);
// Check max supply constraint
require(
totalSupply() + amount <= maxSupply,
"PlaygroundToken: would exceed max supply"
);
// Mint PlaygroundTokens to user
_mint(msg.sender, amount);
}
/**
* @dev Unwrap PlaygroundTokens back to parent tokens
* @notice Burns PlaygroundTokens and transfers parent tokens to user
* @param amount Amount of PlaygroundTokens to unwrap
*/
function claim(uint256 amount) external nonReentrant {
require(amount > 0, "PlaygroundToken: amount must be greater than zero");
// Burn PlaygroundTokens from user
_burn(msg.sender, amount);
// Transfer parent tokens from contract to user
IERC20(parent).safeTransfer(msg.sender, amount);
}
/**
* @dev Mint tokens (only callable by factory)
* @notice Used by factory during token creation and for future minting logic
* @param to Address to mint tokens to
* @param amount Amount of tokens to mint
*/
function mint(address to, uint256 amount) external {
require(msg.sender == factory, "PlaygroundToken: only factory can mint");
require(amount > 0, "PlaygroundToken: amount must be greater than zero");
require(
totalSupply() + amount <= maxSupply,
"PlaygroundToken: would exceed max supply"
);
_mint(to, amount);
}
}
/IERC165.sol
// SPDX-License-Identifier: MIT
pragma solidity >=0.4.16;
interface IERC165 {
function supportsInterface(bytes4 interfaceId) external view returns (bool);
}
/
// SPDX-License-Identifier: MIT
pragma solidity >=0.4.16;
import {IERC20} from "../token/ERC20/IERC20.sol";
/
// SPDX-License-Identifier: MIT
pragma solidity >=0.4.16;
import {IERC165} from "../utils/introspection/IERC165.sol";
/IERC20.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v5.4.0) (token/ERC20/IERC20.sol)
pragma solidity >=0.4.16;
interface IERC20 {
event Transfer(address indexed from, address indexed to, uint256 value);
event Approval(address indexed owner, address indexed spender, uint256 value);
function totalSupply() external view returns (uint256);
function balanceOf(address account) external view returns (uint256);
function transfer(address to, uint256 value) external returns (bool);
function allowance(address owner, address spender) external view returns (uint256);
function approve(address spender, uint256 value) external returns (bool);
function transferFrom(address from, address to, uint256 value) external returns (bool);
}
/
// SPDX-License-Identifier: MIT
pragma solidity >=0.8.4;
interface IERC20Errors {
error ERC20InsufficientBalance(address sender, uint256 balance, uint256 needed);
error ERC20InvalidSender(address sender);
error ERC20InvalidReceiver(address receiver);
error ERC20InsufficientAllowance(address spender, uint256 allowance, uint256 needed);
error ERC20InvalidApprover(address approver);
error ERC20InvalidSpender(address spender);
}
interface IERC721Errors {
error ERC721InvalidOwner(address owner);
error ERC721NonexistentToken(uint256 tokenId);
error ERC721IncorrectOwner(address sender, uint256 tokenId, address owner);
error ERC721InvalidSender(address sender);
error ERC721InvalidReceiver(address receiver);
error ERC721InsufficientApproval(address operator, uint256 tokenId);
error ERC721InvalidApprover(address approver);
error ERC721InvalidOperator(address operator);
}
interface IERC1155Errors {
error ERC1155InsufficientBalance(address sender, uint256 balance, uint256 needed, uint256 tokenId);
error ERC1155InvalidSender(address sender);
error ERC1155InvalidReceiver(address receiver);
error ERC1155MissingApprovalForAll(address operator, address owner);
error ERC1155InvalidApprover(address approver);
error ERC1155InvalidOperator(address operator);
error ERC1155InvalidArrayLength(uint256 idsLength, uint256 valuesLength);
}
/
// SPDX-License-Identifier: MIT
pragma solidity >=0.6.2;
import {IERC20} from "./IERC20.sol";
import {IERC165} from "./IERC165.sol";
interface IERC1363 is IERC20, IERC165 {
function transferAndCall(address to, uint256 value) external returns (bool);
function transferAndCall(address to, uint256 value, bytes calldata data) external returns (bool);
function transferFromAndCall(address from, address to, uint256 value) external returns (bool);
function transferFromAndCall(address from, address to, uint256 value, bytes calldata data) external returns (bool);
function approveAndCall(address spender, uint256 value) external returns (bool);
function approveAndCall(address spender, uint256 value, bytes calldata data) external returns (bool);
}
/
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.20;
abstract contract Context {
function _msgSender() internal view virtual returns (address) { return msg.sender; }
function _msgData() internal view virtual returns (bytes calldata) { return msg.data; }
function _contextSuffixLength() internal view virtual returns (uint256) { return 0; }
}
/
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.20;
import {Context} from "../utils/Context.sol";
abstract contract Ownable is Context {
address private _owner;
error OwnableUnauthorizedAccount(address account);
error OwnableInvalidOwner(address owner);
event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);
constructor(address initialOwner) {
if (initialOwner == address(0)) { revert OwnableInvalidOwner(address(0)); }
_transferOwnership(initialOwner);
}
modifier onlyOwner() { _checkOwner(); _; }
function owner() public view virtual returns (address) { return _owner; }
function _checkOwner() internal view virtual {
if (owner() != _msgSender()) { revert OwnableUnauthorizedAccount(_msgSender()); }
}
function renounceOwnership() public virtual onlyOwner { _transferOwnership(address(0)); }
function transferOwnership(address newOwner) public virtual onlyOwner {
if (newOwner == address(0)) { revert OwnableInvalidOwner(address(0)); }
_transferOwnership(newOwner);
}
function _transferOwnership(address newOwner) internal virtual {
address oldOwner = _owner;
_owner = newOwner;
emit OwnershipTransferred(oldOwner, newOwner);
}
}
/
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.20;
abstract contract ReentrancyGuard {
uint256 private constant NOT_ENTERED = 1;
uint256 private constant ENTERED = 2;
uint256 private _status;
error ReentrancyGuardReentrantCall();
constructor() { _status = NOT_ENTERED; }
modifier nonReentrant() {
_nonReentrantBefore();
_;
_nonReentrantAfter();
}
function _nonReentrantBefore() private {
if (_status == ENTERED) { revert ReentrancyGuardReentrantCall(); }
_status = ENTERED;
}
function _nonReentrantAfter() private { _status = NOT_ENTERED; }
function _reentrancyGuardEntered() internal view returns (bool) { return _status == ENTERED; }
}
/utils/SafeERC20.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v5.3.0) (token/ERC20/utils/SafeERC20.sol)
pragma solidity ^0.8.20;
import {IERC20} from "../IERC20.sol";
import {IERC1363} from "../../../interfaces/IERC1363.sol";
library SafeERC20 {
error SafeERC20FailedOperation(address token);
error SafeERC20FailedDecreaseAllowance(address spender, uint256 currentAllowance, uint256 requestedDecrease);
function safeTransfer(IERC20 token, address to, uint256 value) internal {
_callOptionalReturn(token, abi.encodeCall(token.transfer, (to, value)));
}
function safeTransferFrom(IERC20 token, address from, address to, uint256 value) internal {
_callOptionalReturn(token, abi.encodeCall(token.transferFrom, (from, to, value)));
}
function trySafeTransfer(IERC20 token, address to, uint256 value) internal returns (bool) {
return _callOptionalReturnBool(token, abi.encodeCall(token.transfer, (to, value)));
}
function trySafeTransferFrom(IERC20 token, address from, address to, uint256 value) internal returns (bool) {
return _callOptionalReturnBool(token, abi.encodeCall(token.transferFrom, (from, to, value)));
}
function safeIncreaseAllowance(IERC20 token, address spender, uint256 value) internal {
uint256 oldAllowance = token.allowance(address(this), spender);
forceApprove(token, spender, oldAllowance + value);
}
function safeDecreaseAllowance(IERC20 token, address spender, uint256 requestedDecrease) internal {
unchecked {
uint256 currentAllowance = token.allowance(address(this), spender);
if (currentAllowance < requestedDecrease) {
revert SafeERC20FailedDecreaseAllowance(spender, currentAllowance, requestedDecrease);
}
forceApprove(token, spender, currentAllowance - requestedDecrease);
}
}
function forceApprove(IERC20 token, address spender, uint256 value) internal {
bytes memory approvalCall = abi.encodeCall(token.approve, (spender, value));
if (!_callOptionalReturnBool(token, approvalCall)) {
_callOptionalReturn(token, abi.encodeCall(token.approve, (spender, 0)));
_callOptionalReturn(token, approvalCall);
}
}
function transferAndCallRelaxed(IERC1363 token, address to, uint256 value, bytes memory data) internal {
if (to.code.length == 0) { safeTransfer(token, to, value); }
else if (!token.transferAndCall(to, value, data)) { revert SafeERC20FailedOperation(address(token)); }
}
function transferFromAndCallRelaxed(IERC1363 token, address from, address to, uint256 value, bytes memory data) internal {
if (to.code.length == 0) { safeTransferFrom(token, from, to, value); }
else if (!token.transferFromAndCall(from, to, value, data)) { revert SafeERC20FailedOperation(address(token)); }
}
function approveAndCallRelaxed(IERC1363 token, address to, uint256 value, bytes memory data) internal {
if (to.code.length == 0) { forceApprove(token, to, value); }
else if (!token.approveAndCall(to, value, data)) { revert SafeERC20FailedOperation(address(token)); }
}
function _callOptionalReturn(IERC20 token, bytes memory data) private {
uint256 returnSize;
uint256 returnValue;
assembly ("memory-safe") {
let success := call(gas(), token, 0, add(data, 0x20), mload(data), 0, 0x20)
if iszero(success) {
let ptr := mload(0x40)
returndatacopy(ptr, 0, returndatasize())
revert(ptr, returndatasize())
}
returnSize := returndatasize()
returnValue := mload(0)
}
if (returnSize == 0 ? address(token).code.length == 0 : returnValue != 1) {
revert SafeERC20FailedOperation(address(token));
}
}
function _callOptionalReturnBool(IERC20 token, bytes memory data) private returns (bool) {
bool success;
uint256 returnSize;
uint256 returnValue;
assembly ("memory-safe") {
success := call(gas(), token, 0, add(data, 0x20), mload(data), 0, 0x20)
returnSize := returndatasize()
returnValue := mload(0)
}
return success && (returnSize == 0 ? address(token).code.length > 0 : returnValue == 1);
}
}
/extensions/IERC20Metadata.sol
// SPDX-License-Identifier: MIT
pragma solidity >=0.6.2;
import {IERC20} from "../IERC20.sol";
interface IERC20Metadata is IERC20 {
function name() external view returns (string memory);
function symbol() external view returns (string memory);
function decimals() external view returns (uint8);
}
/ERC20.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v5.4.0) (token/ERC20/ERC20.sol)
pragma solidity ^0.8.20;
import {IERC20} from "./IERC20.sol";
import {IERC20Metadata} from "./extensions/IERC20Metadata.sol";
import {Context} from "../../utils/Context.sol";
import {IERC20Errors} from "../../interfaces/draft-IERC6093.sol";
abstract contract ERC20 is Context, IERC20, IERC20Metadata, IERC20Errors {
mapping(address account => uint256) private _balances;
mapping(address account => mapping(address spender => uint256)) private _allowances;
uint256 private _totalSupply;
string private _name;
string private _symbol;
constructor(string memory name_, string memory symbol_) {
_name = name_;
_symbol = symbol_;
}
function name() public view virtual returns (string memory) { return _name; }
function symbol() public view virtual returns (string memory) { return _symbol; }
function decimals() public view virtual returns (uint8) { return 18; }
function totalSupply() public view virtual returns (uint256) { return _totalSupply; }
function balanceOf(address account) public view virtual returns (uint256) { return _balances[account]; }
function transfer(address to, uint256 value) public virtual returns (bool) {
address owner = _msgSender();
_transfer(owner, to, value);
return true;
}
function allowance(address owner, address spender) public view virtual returns (uint256) {
return _allowances[owner][spender];
}
function approve(address spender, uint256 value) public virtual returns (bool) {
address owner = _msgSender();
_approve(owner, spender, value);
return true;
}
function transferFrom(address from, address to, uint256 value) public virtual returns (bool) {
address spender = _msgSender();
_spendAllowance(from, spender, value);
_transfer(from, to, value);
return true;
}
function _transfer(address from, address to, uint256 value) internal {
if (from == address(0)) { revert ERC20InvalidSender(address(0)); }
if (to == address(0)) { revert ERC20InvalidReceiver(address(0)); }
_update(from, to, value);
}
function _update(address from, address to, uint256 value) internal virtual {
if (from == address(0)) {
_totalSupply += value;
} else {
uint256 fromBalance = _balances[from];
if (fromBalance < value) { revert ERC20InsufficientBalance(from, fromBalance, value); }
unchecked { _balances[from] = fromBalance - value; }
}
if (to == address(0)) {
unchecked { _totalSupply -= value; }
} else {
unchecked { _balances[to] += value; }
}
emit Transfer(from, to, value);
}
function _mint(address account, uint256 value) internal {
if (account == address(0)) { revert ERC20InvalidReceiver(address(0)); }
_update(address(0), account, value);
}
function _burn(address account, uint256 value) internal {
if (account == address(0)) { revert ERC20InvalidSender(address(0)); }
_update(account, address(0), value);
}
function _approve(address owner, address spender, uint256 value) internal {
_approve(owner, spender, value, true);
}
function _approve(address owner, address spender, uint256 value, bool emitEvent) internal virtual {
if (owner == address(0)) { revert ERC20InvalidApprover(address(0)); }
if (spender == address(0)) { revert ERC20InvalidSpender(address(0)); }
_allowances[owner][spender] = value;
if (emitEvent) { emit Approval(owner, spender, value); }
}
function _spendAllowance(address owner, address spender, uint256 value) internal virtual {
uint256 currentAllowance = allowance(owner, spender);
if (currentAllowance < type(uint256).max) {
if (currentAllowance < value) { revert ERC20InsufficientAllowance(spender, currentAllowance, value); }
unchecked { _approve(owner, spender, currentAllowance - value, false); }
}
}
}
Compiler Settings
{"remappings":[],"optimizer":{"runs":200,"enabled":false},"metadata":{"bytecodeHash":"ipfs"},"libraries":{},"evmVersion":"shanghai","compilationTarget":{"contracts/PlaygroundToken.sol":"PlaygroundToken"}}
Contract ABI
[{"type":"constructor","stateMutability":"nonpayable","inputs":[{"type":"string","name":"name","internalType":"string"},{"type":"string","name":"symbol","internalType":"string"},{"type":"address","name":"factoryAddress","internalType":"address"},{"type":"address","name":"parentToken","internalType":"address"},{"type":"string","name":"tokenDescription","internalType":"string"},{"type":"uint256","name":"maxTokenSupply","internalType":"uint256"}]},{"type":"error","name":"ERC20InsufficientAllowance","inputs":[{"type":"address","name":"spender","internalType":"address"},{"type":"uint256","name":"allowance","internalType":"uint256"},{"type":"uint256","name":"needed","internalType":"uint256"}]},{"type":"error","name":"ERC20InsufficientBalance","inputs":[{"type":"address","name":"sender","internalType":"address"},{"type":"uint256","name":"balance","internalType":"uint256"},{"type":"uint256","name":"needed","internalType":"uint256"}]},{"type":"error","name":"ERC20InvalidApprover","inputs":[{"type":"address","name":"approver","internalType":"address"}]},{"type":"error","name":"ERC20InvalidReceiver","inputs":[{"type":"address","name":"receiver","internalType":"address"}]},{"type":"error","name":"ERC20InvalidSender","inputs":[{"type":"address","name":"sender","internalType":"address"}]},{"type":"error","name":"ERC20InvalidSpender","inputs":[{"type":"address","name":"spender","internalType":"address"}]},{"type":"error","name":"OwnableInvalidOwner","inputs":[{"type":"address","name":"owner","internalType":"address"}]},{"type":"error","name":"OwnableUnauthorizedAccount","inputs":[{"type":"address","name":"account","internalType":"address"}]},{"type":"error","name":"ReentrancyGuardReentrantCall","inputs":[]},{"type":"error","name":"SafeERC20FailedOperation","inputs":[{"type":"address","name":"token","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":"uint256","name":"","internalType":"uint256"}],"name":"allowance","inputs":[{"type":"address","name":"owner","internalType":"address"},{"type":"address","name":"spender","internalType":"address"}]},{"type":"function","stateMutability":"nonpayable","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"approve","inputs":[{"type":"address","name":"spender","internalType":"address"},{"type":"uint256","name":"value","internalType":"uint256"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"balanceOf","inputs":[{"type":"address","name":"account","internalType":"address"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"burn","inputs":[{"type":"uint256","name":"amount","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"claim","inputs":[{"type":"uint256","name":"amount","internalType":"uint256"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint8","name":"","internalType":"uint8"}],"name":"decimals","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"string","name":"","internalType":"string"}],"name":"description","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address"}],"name":"factory","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"maxSupply","inputs":[]},{"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":"address","name":"","internalType":"address"}],"name":"owner","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address"}],"name":"parent","inputs":[]},{"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":"value","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":"value","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"transferOwnership","inputs":[{"type":"address","name":"newOwner","internalType":"address"}]}]
Contract Creation Code
0x60c060405234801562000010575f80fd5b50604051620025933803806200259383398181016040528101906200003691906200052a565b33868681600390816200004a91906200084d565b5080600490816200005c91906200084d565b5050505f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603620000d2575f6040517f1e4fbdf7000000000000000000000000000000000000000000000000000000008152600401620000c9919062000942565b60405180910390fd5b620000e3816200024960201b60201c565b5060016006819055505f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16036200015d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200015490620009e1565b60405180910390fd5b6b033b2e3c9fd0803ce8000000811015620001af576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620001a69062000a75565b60405180910390fd5b8260075f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555081600890816200020091906200084d565b5080608081815250508373ffffffffffffffffffffffffffffffffffffffff1660a08173ffffffffffffffffffffffffffffffffffffffff168152505050505050505062000a95565b5f60055f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508160055f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b5f604051905090565b5f80fd5b5f80fd5b5f80fd5b5f80fd5b5f601f19601f8301169050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b6200036d8262000325565b810181811067ffffffffffffffff821117156200038f576200038e62000335565b5b80604052505050565b5f620003a36200030c565b9050620003b1828262000362565b919050565b5f67ffffffffffffffff821115620003d357620003d262000335565b5b620003de8262000325565b9050602081019050919050565b5f5b838110156200040a578082015181840152602081019050620003ed565b5f8484015250505050565b5f6200042b6200042584620003b6565b62000398565b9050828152602081018484840111156200044a576200044962000321565b5b62000457848285620003eb565b509392505050565b5f82601f8301126200047657620004756200031d565b5b81516200048884826020860162000415565b91505092915050565b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f620004bc8262000491565b9050919050565b620004ce81620004b0565b8114620004d9575f80fd5b50565b5f81519050620004ec81620004c3565b92915050565b5f819050919050565b6200050681620004f2565b811462000511575f80fd5b50565b5f815190506200052481620004fb565b92915050565b5f805f805f8060c0878903121562000547576200054662000315565b5b5f87015167ffffffffffffffff81111562000567576200056662000319565b5b6200057589828a016200045f565b965050602087015167ffffffffffffffff81111562000599576200059862000319565b5b620005a789828a016200045f565b9550506040620005ba89828a01620004dc565b9450506060620005cd89828a01620004dc565b935050608087015167ffffffffffffffff811115620005f157620005f062000319565b5b620005ff89828a016200045f565b92505060a06200061289828a0162000514565b9150509295509295509295565b5f81519050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b5f60028204905060018216806200066e57607f821691505b60208210810362000684576200068362000629565b5b50919050565b5f819050815f5260205f209050919050565b5f6020601f8301049050919050565b5f82821b905092915050565b5f60088302620006e87fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82620006ab565b620006f48683620006ab565b95508019841693508086168417925050509392505050565b5f819050919050565b5f620007356200072f6200072984620004f2565b6200070c565b620004f2565b9050919050565b5f819050919050565b620007508362000715565b620007686200075f826200073c565b848454620006b7565b825550505050565b5f90565b6200077e62000770565b6200078b81848462000745565b505050565b5b81811015620007b257620007a65f8262000774565b60018101905062000791565b5050565b601f8211156200080157620007cb816200068a565b620007d6846200069c565b81016020851015620007e6578190505b620007fe620007f5856200069c565b83018262000790565b50505b505050565b5f82821c905092915050565b5f620008235f198460080262000806565b1980831691505092915050565b5f6200083d838362000812565b9150826002028217905092915050565b62000858826200061f565b67ffffffffffffffff81111562000874576200087362000335565b5b62000880825462000656565b6200088d828285620007b6565b5f60209050601f831160018114620008c3575f8415620008ae578287015190505b620008ba858262000830565b86555062000929565b601f198416620008d3866200068a565b5f5b82811015620008fc57848901518255600182019150602085019450602081019050620008d5565b868310156200091c578489015162000918601f89168262000812565b8355505b6001600288020188555050505b505050505050565b6200093c81620004b0565b82525050565b5f602082019050620009575f83018462000931565b92915050565b5f82825260208201905092915050565b7f506c617967726f756e64546f6b656e3a20706172656e7420746f6b656e2063615f8201527f6e6e6f74206265207a65726f2061646472657373000000000000000000000000602082015250565b5f620009c96034836200095d565b9150620009d6826200096d565b604082019050919050565b5f6020820190508181035f830152620009fa81620009bb565b9050919050565b7f506c617967726f756e64546f6b656e3a206d6178537570706c79206d757374205f8201527f6265206174206c6561737420312062696c6c696f6e20746f6b656e7300000000602082015250565b5f62000a5d603c836200095d565b915062000a6a8262000a01565b604082019050919050565b5f6020820190508181035f83015262000a8e8162000a4f565b9050919050565b60805160a051611ac762000acc5f395f8181610539015261098101525f81816106090152818161071c01526109a50152611ac75ff3fe608060405234801561000f575f80fd5b506004361061011f575f3560e01c806370a08231116100ab578063a9059cbb1161006f578063a9059cbb146102e3578063c45a015514610313578063d5abeb0114610331578063dd62ed3e1461034f578063f2fde38b1461037f5761011f565b806370a082311461024f578063715018a61461027f5780637284e416146102895780638da5cb5b146102a757806395d89b41146102c55761011f565b8063313ce567116100f2578063313ce567146101bf578063379607f5146101dd57806340c10f19146101f957806342966c681461021557806360f96a8f146102315761011f565b806306fdde0314610123578063095ea7b31461014157806318160ddd1461017157806323b872dd1461018f575b5f80fd5b61012b61039b565b604051610138919061150f565b60405180910390f35b61015b600480360381019061015691906115c0565b61042b565b6040516101689190611618565b60405180910390f35b61017961044d565b6040516101869190611640565b60405180910390f35b6101a960048036038101906101a49190611659565b610456565b6040516101b69190611618565b60405180910390f35b6101c7610484565b6040516101d491906116c4565b60405180910390f35b6101f760048036038101906101f291906116dd565b61048c565b005b610213600480360381019061020e91906115c0565b610537565b005b61022f600480360381019061022a91906116dd565b61068a565b005b61023961079c565b6040516102469190611717565b60405180910390f35b61026960048036038101906102649190611730565b6107c1565b6040516102769190611640565b60405180910390f35b610287610806565b005b610291610819565b60405161029e919061150f565b60405180910390f35b6102af6108a5565b6040516102bc9190611717565b60405180910390f35b6102cd6108cd565b6040516102da919061150f565b60405180910390f35b6102fd60048036038101906102f891906115c0565b61095d565b60405161030a9190611618565b60405180910390f35b61031b61097f565b6040516103289190611717565b60405180910390f35b6103396109a3565b6040516103469190611640565b60405180910390f35b6103696004803603810190610364919061175b565b6109c7565b6040516103769190611640565b60405180910390f35b61039960048036038101906103949190611730565b610a49565b005b6060600380546103aa906117c6565b80601f01602080910402602001604051908101604052809291908181526020018280546103d6906117c6565b80156104215780601f106103f857610100808354040283529160200191610421565b820191905f5260205f20905b81548152906001019060200180831161040457829003601f168201915b5050505050905090565b5f80610435610acd565b9050610442818585610ad4565b600191505092915050565b5f600254905090565b5f80610460610acd565b905061046d858285610ae6565b610478858585610b79565b60019150509392505050565b5f6012905090565b610494610c69565b5f81116104d6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016104cd90611866565b60405180910390fd5b6104e03382610caf565b61052c338260075f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16610d2e9092919063ffffffff16565b610534610dad565b50565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146105c5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016105bc906118f4565b60405180910390fd5b5f8111610607576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016105fe90611866565b60405180910390fd5b7f00000000000000000000000000000000000000000000000000000000000000008161063161044d565b61063b919061193f565b111561067c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610673906119e2565b60405180910390fd5b6106868282610db7565b5050565b5f81116106cc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016106c390611866565b60405180910390fd5b61071a33308360075f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16610e36909392919063ffffffff16565b7f00000000000000000000000000000000000000000000000000000000000000008161074461044d565b61074e919061193f565b111561078f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610786906119e2565b60405180910390fd5b6107993382610db7565b50565b60075f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b5f805f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20549050919050565b61080e610eb8565b6108175f610f3f565b565b60088054610826906117c6565b80601f0160208091040260200160405190810160405280929190818152602001828054610852906117c6565b801561089d5780601f106108745761010080835404028352916020019161089d565b820191905f5260205f20905b81548152906001019060200180831161088057829003601f168201915b505050505081565b5f60055f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6060600480546108dc906117c6565b80601f0160208091040260200160405190810160405280929190818152602001828054610908906117c6565b80156109535780601f1061092a57610100808354040283529160200191610953565b820191905f5260205f20905b81548152906001019060200180831161093657829003601f168201915b5050505050905090565b5f80610967610acd565b9050610974818585610b79565b600191505092915050565b7f000000000000000000000000000000000000000000000000000000000000000081565b7f000000000000000000000000000000000000000000000000000000000000000081565b5f60015f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054905092915050565b610a51610eb8565b5f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603610ac1575f6040517f1e4fbdf7000000000000000000000000000000000000000000000000000000008152600401610ab89190611717565b60405180910390fd5b610aca81610f3f565b50565b5f33905090565b610ae18383836001611002565b505050565b5f610af184846109c7565b90507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff811015610b735781811015610b64578281836040517ffb8f41b2000000000000000000000000000000000000000000000000000000008152600401610b5b93929190611a00565b60405180910390fd5b610b7284848484035f611002565b5b50505050565b5f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603610be9575f6040517f96c6fd1e000000000000000000000000000000000000000000000000000000008152600401610be09190611717565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610c59575f6040517fec442f05000000000000000000000000000000000000000000000000000000008152600401610c509190611717565b60405180910390fd5b610c648383836111d1565b505050565b600260065403610ca5576040517f3ee5aeb500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6002600681905550565b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610d1f575f6040517f96c6fd1e000000000000000000000000000000000000000000000000000000008152600401610d169190611717565b60405180910390fd5b610d2a825f836111d1565b5050565b610da8838473ffffffffffffffffffffffffffffffffffffffff1663a9059cbb8585604051602401610d61929190611a35565b604051602081830303815290604052915060e01b6020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff83818316178352505050506113ea565b505050565b6001600681905550565b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610e27575f6040517fec442f05000000000000000000000000000000000000000000000000000000008152600401610e1e9190611717565b60405180910390fd5b610e325f83836111d1565b5050565b610eb2848573ffffffffffffffffffffffffffffffffffffffff166323b872dd868686604051602401610e6b93929190611a5c565b604051602081830303815290604052915060e01b6020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff83818316178352505050506113ea565b50505050565b610ec0610acd565b73ffffffffffffffffffffffffffffffffffffffff16610ede6108a5565b73ffffffffffffffffffffffffffffffffffffffff1614610f3d57610f01610acd565b6040517f118cdaa7000000000000000000000000000000000000000000000000000000008152600401610f349190611717565b60405180910390fd5b565b5f60055f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508160055f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b5f73ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1603611072575f6040517fe602df050000000000000000000000000000000000000000000000000000000081526004016110699190611717565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16036110e2575f6040517f94280d620000000000000000000000000000000000000000000000000000000081526004016110d99190611717565b60405180910390fd5b8160015f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f208190555080156111cb578273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925846040516111c29190611640565b60405180910390a35b50505050565b5f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603611221578060025f828254611215919061193f565b925050819055506112ef565b5f805f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20549050818110156112aa578381836040517fe450d38c0000000000000000000000000000000000000000000000000000000081526004016112a193929190611a00565b60405180910390fd5b8181035f808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2081905550505b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611336578060025f8282540392505081905550611380565b805f808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f82825401925050819055505b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040516113dd9190611640565b60405180910390a3505050565b5f8060205f8451602086015f885af180611409576040513d5f823e3d81fd5b3d92505f519150505f821461142257600181141561143d565b5f8473ffffffffffffffffffffffffffffffffffffffff163b145b1561147f57836040517f5274afe70000000000000000000000000000000000000000000000000000000081526004016114769190611717565b60405180910390fd5b50505050565b5f81519050919050565b5f82825260208201905092915050565b5f5b838110156114bc5780820151818401526020810190506114a1565b5f8484015250505050565b5f601f19601f8301169050919050565b5f6114e182611485565b6114eb818561148f565b93506114fb81856020860161149f565b611504816114c7565b840191505092915050565b5f6020820190508181035f83015261152781846114d7565b905092915050565b5f80fd5b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f61155c82611533565b9050919050565b61156c81611552565b8114611576575f80fd5b50565b5f8135905061158781611563565b92915050565b5f819050919050565b61159f8161158d565b81146115a9575f80fd5b50565b5f813590506115ba81611596565b92915050565b5f80604083850312156115d6576115d561152f565b5b5f6115e385828601611579565b92505060206115f4858286016115ac565b9150509250929050565b5f8115159050919050565b611612816115fe565b82525050565b5f60208201905061162b5f830184611609565b92915050565b61163a8161158d565b82525050565b5f6020820190506116535f830184611631565b92915050565b5f805f606084860312156116705761166f61152f565b5b5f61167d86828701611579565b935050602061168e86828701611579565b925050604061169f868287016115ac565b9150509250925092565b5f60ff82169050919050565b6116be816116a9565b82525050565b5f6020820190506116d75f8301846116b5565b92915050565b5f602082840312156116f2576116f161152f565b5b5f6116ff848285016115ac565b91505092915050565b61171181611552565b82525050565b5f60208201905061172a5f830184611708565b92915050565b5f602082840312156117455761174461152f565b5b5f61175284828501611579565b91505092915050565b5f80604083850312156117715761177061152f565b5b5f61177e85828601611579565b925050602061178f85828601611579565b9150509250929050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b5f60028204905060018216806117dd57607f821691505b6020821081036117f0576117ef611799565b5b50919050565b7f506c617967726f756e64546f6b656e3a20616d6f756e74206d757374206265205f8201527f67726561746572207468616e207a65726f000000000000000000000000000000602082015250565b5f61185060318361148f565b915061185b826117f6565b604082019050919050565b5f6020820190508181035f83015261187d81611844565b9050919050565b7f506c617967726f756e64546f6b656e3a206f6e6c7920666163746f72792063615f8201527f6e206d696e740000000000000000000000000000000000000000000000000000602082015250565b5f6118de60268361148f565b91506118e982611884565b604082019050919050565b5f6020820190508181035f83015261190b816118d2565b9050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f6119498261158d565b91506119548361158d565b925082820190508082111561196c5761196b611912565b5b92915050565b7f506c617967726f756e64546f6b656e3a20776f756c6420657863656564206d615f8201527f7820737570706c79000000000000000000000000000000000000000000000000602082015250565b5f6119cc60288361148f565b91506119d782611972565b604082019050919050565b5f6020820190508181035f8301526119f9816119c0565b9050919050565b5f606082019050611a135f830186611708565b611a206020830185611631565b611a2d6040830184611631565b949350505050565b5f604082019050611a485f830185611708565b611a556020830184611631565b9392505050565b5f606082019050611a6f5f830186611708565b611a7c6020830185611708565b611a896040830184611631565b94935050505056fea2646970667358221220cabde4994c795c643bbb955bd85117b962eeb3fad39476b0777e61bff048578764736f6c6343000814003300000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000100000000000000000000000000abef2874c5ef165fc2194c180e06894871724b050000000000000000000000009af7d71f8f0eff488623c8b952ec38f0d7e611240000000000000000000000000000000000000000000000000000000000000140000000000000000000000000000000000000000c9f2c9cd04674edea40000000000000000000000000000000000000000000000000000000000000000000000b4555524f444f4c4c4152530000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006454444494553000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001ef4555524f444f4c4c41525320697320746865206368696c6420746f6b656e20746f2047656e65736973204d696e647365742c20657874656e64696e672074686520474d414e207370696e6520746f2062726964676520746865204d616e64616c61204d61747269782077697468207468652053637265616d696e672048616e642045636f73797374656d2e2054686973206c696e6b20656e61626c65732064656570206c697175696469747920666c6f77207468726f75676820636f7265204174726f706120746f6b656e732c20696e636c7564696e67207265666c656374696f6e20746f6b656e733a204f7961797562692c204869746f7361736869797562692c204e616b61797562692c204b7573757269797562692c204b6f797562692c20616e642050616c6d2028e6898be381aee381b2e38289292c20616c6c20616e63686f72656420746f2050756c736520446f6c6c61722028245044292e0a0a53637265616d696e672048616e642043413a203078303436633263376363613137616236653434343464356534303234663761386463633065626266610a0a54686520436f6e6e656374696f6e3a204d617472697820e2869420474d414e20e286942047656e65736973204d696e6473657420e286942045444449455320e286942053637265616d696e672048616e640000000000000000000000000000000000
Deployed ByteCode
0x608060405234801561000f575f80fd5b506004361061011f575f3560e01c806370a08231116100ab578063a9059cbb1161006f578063a9059cbb146102e3578063c45a015514610313578063d5abeb0114610331578063dd62ed3e1461034f578063f2fde38b1461037f5761011f565b806370a082311461024f578063715018a61461027f5780637284e416146102895780638da5cb5b146102a757806395d89b41146102c55761011f565b8063313ce567116100f2578063313ce567146101bf578063379607f5146101dd57806340c10f19146101f957806342966c681461021557806360f96a8f146102315761011f565b806306fdde0314610123578063095ea7b31461014157806318160ddd1461017157806323b872dd1461018f575b5f80fd5b61012b61039b565b604051610138919061150f565b60405180910390f35b61015b600480360381019061015691906115c0565b61042b565b6040516101689190611618565b60405180910390f35b61017961044d565b6040516101869190611640565b60405180910390f35b6101a960048036038101906101a49190611659565b610456565b6040516101b69190611618565b60405180910390f35b6101c7610484565b6040516101d491906116c4565b60405180910390f35b6101f760048036038101906101f291906116dd565b61048c565b005b610213600480360381019061020e91906115c0565b610537565b005b61022f600480360381019061022a91906116dd565b61068a565b005b61023961079c565b6040516102469190611717565b60405180910390f35b61026960048036038101906102649190611730565b6107c1565b6040516102769190611640565b60405180910390f35b610287610806565b005b610291610819565b60405161029e919061150f565b60405180910390f35b6102af6108a5565b6040516102bc9190611717565b60405180910390f35b6102cd6108cd565b6040516102da919061150f565b60405180910390f35b6102fd60048036038101906102f891906115c0565b61095d565b60405161030a9190611618565b60405180910390f35b61031b61097f565b6040516103289190611717565b60405180910390f35b6103396109a3565b6040516103469190611640565b60405180910390f35b6103696004803603810190610364919061175b565b6109c7565b6040516103769190611640565b60405180910390f35b61039960048036038101906103949190611730565b610a49565b005b6060600380546103aa906117c6565b80601f01602080910402602001604051908101604052809291908181526020018280546103d6906117c6565b80156104215780601f106103f857610100808354040283529160200191610421565b820191905f5260205f20905b81548152906001019060200180831161040457829003601f168201915b5050505050905090565b5f80610435610acd565b9050610442818585610ad4565b600191505092915050565b5f600254905090565b5f80610460610acd565b905061046d858285610ae6565b610478858585610b79565b60019150509392505050565b5f6012905090565b610494610c69565b5f81116104d6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016104cd90611866565b60405180910390fd5b6104e03382610caf565b61052c338260075f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16610d2e9092919063ffffffff16565b610534610dad565b50565b7f000000000000000000000000abef2874c5ef165fc2194c180e06894871724b0573ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146105c5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016105bc906118f4565b60405180910390fd5b5f8111610607576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016105fe90611866565b60405180910390fd5b7f000000000000000000000000000000000000000c9f2c9cd04674edea400000008161063161044d565b61063b919061193f565b111561067c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610673906119e2565b60405180910390fd5b6106868282610db7565b5050565b5f81116106cc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016106c390611866565b60405180910390fd5b61071a33308360075f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16610e36909392919063ffffffff16565b7f000000000000000000000000000000000000000c9f2c9cd04674edea400000008161074461044d565b61074e919061193f565b111561078f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610786906119e2565b60405180910390fd5b6107993382610db7565b50565b60075f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b5f805f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20549050919050565b61080e610eb8565b6108175f610f3f565b565b60088054610826906117c6565b80601f0160208091040260200160405190810160405280929190818152602001828054610852906117c6565b801561089d5780601f106108745761010080835404028352916020019161089d565b820191905f5260205f20905b81548152906001019060200180831161088057829003601f168201915b505050505081565b5f60055f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6060600480546108dc906117c6565b80601f0160208091040260200160405190810160405280929190818152602001828054610908906117c6565b80156109535780601f1061092a57610100808354040283529160200191610953565b820191905f5260205f20905b81548152906001019060200180831161093657829003601f168201915b5050505050905090565b5f80610967610acd565b9050610974818585610b79565b600191505092915050565b7f000000000000000000000000abef2874c5ef165fc2194c180e06894871724b0581565b7f000000000000000000000000000000000000000c9f2c9cd04674edea4000000081565b5f60015f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054905092915050565b610a51610eb8565b5f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603610ac1575f6040517f1e4fbdf7000000000000000000000000000000000000000000000000000000008152600401610ab89190611717565b60405180910390fd5b610aca81610f3f565b50565b5f33905090565b610ae18383836001611002565b505050565b5f610af184846109c7565b90507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff811015610b735781811015610b64578281836040517ffb8f41b2000000000000000000000000000000000000000000000000000000008152600401610b5b93929190611a00565b60405180910390fd5b610b7284848484035f611002565b5b50505050565b5f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603610be9575f6040517f96c6fd1e000000000000000000000000000000000000000000000000000000008152600401610be09190611717565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610c59575f6040517fec442f05000000000000000000000000000000000000000000000000000000008152600401610c509190611717565b60405180910390fd5b610c648383836111d1565b505050565b600260065403610ca5576040517f3ee5aeb500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6002600681905550565b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610d1f575f6040517f96c6fd1e000000000000000000000000000000000000000000000000000000008152600401610d169190611717565b60405180910390fd5b610d2a825f836111d1565b5050565b610da8838473ffffffffffffffffffffffffffffffffffffffff1663a9059cbb8585604051602401610d61929190611a35565b604051602081830303815290604052915060e01b6020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff83818316178352505050506113ea565b505050565b6001600681905550565b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610e27575f6040517fec442f05000000000000000000000000000000000000000000000000000000008152600401610e1e9190611717565b60405180910390fd5b610e325f83836111d1565b5050565b610eb2848573ffffffffffffffffffffffffffffffffffffffff166323b872dd868686604051602401610e6b93929190611a5c565b604051602081830303815290604052915060e01b6020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff83818316178352505050506113ea565b50505050565b610ec0610acd565b73ffffffffffffffffffffffffffffffffffffffff16610ede6108a5565b73ffffffffffffffffffffffffffffffffffffffff1614610f3d57610f01610acd565b6040517f118cdaa7000000000000000000000000000000000000000000000000000000008152600401610f349190611717565b60405180910390fd5b565b5f60055f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508160055f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b5f73ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1603611072575f6040517fe602df050000000000000000000000000000000000000000000000000000000081526004016110699190611717565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16036110e2575f6040517f94280d620000000000000000000000000000000000000000000000000000000081526004016110d99190611717565b60405180910390fd5b8160015f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f208190555080156111cb578273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925846040516111c29190611640565b60405180910390a35b50505050565b5f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603611221578060025f828254611215919061193f565b925050819055506112ef565b5f805f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20549050818110156112aa578381836040517fe450d38c0000000000000000000000000000000000000000000000000000000081526004016112a193929190611a00565b60405180910390fd5b8181035f808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2081905550505b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611336578060025f8282540392505081905550611380565b805f808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f82825401925050819055505b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040516113dd9190611640565b60405180910390a3505050565b5f8060205f8451602086015f885af180611409576040513d5f823e3d81fd5b3d92505f519150505f821461142257600181141561143d565b5f8473ffffffffffffffffffffffffffffffffffffffff163b145b1561147f57836040517f5274afe70000000000000000000000000000000000000000000000000000000081526004016114769190611717565b60405180910390fd5b50505050565b5f81519050919050565b5f82825260208201905092915050565b5f5b838110156114bc5780820151818401526020810190506114a1565b5f8484015250505050565b5f601f19601f8301169050919050565b5f6114e182611485565b6114eb818561148f565b93506114fb81856020860161149f565b611504816114c7565b840191505092915050565b5f6020820190508181035f83015261152781846114d7565b905092915050565b5f80fd5b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f61155c82611533565b9050919050565b61156c81611552565b8114611576575f80fd5b50565b5f8135905061158781611563565b92915050565b5f819050919050565b61159f8161158d565b81146115a9575f80fd5b50565b5f813590506115ba81611596565b92915050565b5f80604083850312156115d6576115d561152f565b5b5f6115e385828601611579565b92505060206115f4858286016115ac565b9150509250929050565b5f8115159050919050565b611612816115fe565b82525050565b5f60208201905061162b5f830184611609565b92915050565b61163a8161158d565b82525050565b5f6020820190506116535f830184611631565b92915050565b5f805f606084860312156116705761166f61152f565b5b5f61167d86828701611579565b935050602061168e86828701611579565b925050604061169f868287016115ac565b9150509250925092565b5f60ff82169050919050565b6116be816116a9565b82525050565b5f6020820190506116d75f8301846116b5565b92915050565b5f602082840312156116f2576116f161152f565b5b5f6116ff848285016115ac565b91505092915050565b61171181611552565b82525050565b5f60208201905061172a5f830184611708565b92915050565b5f602082840312156117455761174461152f565b5b5f61175284828501611579565b91505092915050565b5f80604083850312156117715761177061152f565b5b5f61177e85828601611579565b925050602061178f85828601611579565b9150509250929050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b5f60028204905060018216806117dd57607f821691505b6020821081036117f0576117ef611799565b5b50919050565b7f506c617967726f756e64546f6b656e3a20616d6f756e74206d757374206265205f8201527f67726561746572207468616e207a65726f000000000000000000000000000000602082015250565b5f61185060318361148f565b915061185b826117f6565b604082019050919050565b5f6020820190508181035f83015261187d81611844565b9050919050565b7f506c617967726f756e64546f6b656e3a206f6e6c7920666163746f72792063615f8201527f6e206d696e740000000000000000000000000000000000000000000000000000602082015250565b5f6118de60268361148f565b91506118e982611884565b604082019050919050565b5f6020820190508181035f83015261190b816118d2565b9050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f6119498261158d565b91506119548361158d565b925082820190508082111561196c5761196b611912565b5b92915050565b7f506c617967726f756e64546f6b656e3a20776f756c6420657863656564206d615f8201527f7820737570706c79000000000000000000000000000000000000000000000000602082015250565b5f6119cc60288361148f565b91506119d782611972565b604082019050919050565b5f6020820190508181035f8301526119f9816119c0565b9050919050565b5f606082019050611a135f830186611708565b611a206020830185611631565b611a2d6040830184611631565b949350505050565b5f604082019050611a485f830185611708565b611a556020830184611631565b9392505050565b5f606082019050611a6f5f830186611708565b611a7c6020830185611708565b611a896040830184611631565b94935050505056fea2646970667358221220cabde4994c795c643bbb955bd85117b962eeb3fad39476b0777e61bff048578764736f6c63430008140033