Source Code
Overview
S Balance
S Value
Less Than $0.01 (@ $0.07/S)Latest 5 from a total of 5 transactions
Latest 5 internal transactions
Advanced mode:
| Parent Transaction Hash | Block | From | To | |||
|---|---|---|---|---|---|---|
| 58868303 | 32 days ago | Contract Creation | 0 S | |||
| 58868235 | 32 days ago | Contract Creation | 0 S | |||
| 58866020 | 32 days ago | 0.002 S | ||||
| 58800543 | 33 days ago | Contract Creation | 0 S | |||
| 58787985 | 33 days ago | Contract Creation | 0 S |
Cross-Chain Transactions
Loading...
Loading
Contract Name:
BondingCurveFactory
Compiler Version
v0.8.20+commit.a1b79de6
Optimization Enabled:
No with 200 runs
Other Settings:
default evmVersion
Contract Source Code (Solidity Standard Json-Input format)
// 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";
// WETH interface
interface IWETH {
function deposit() external payable;
function balanceOf(address) external view returns (uint);
}
// Uniswap Factory interface - FOURMEME PATTERN
interface IUniswapV2Factory {
function getPair(address tokenA, address tokenB) external view returns (address pair);
}
// SushiSwap Router interface - FOURMEME PATTERN
interface ISushiSwapRouter {
function factory() external pure returns (address);
function WETH() external pure returns (address);
function addLiquidityETH(
address token,
uint amountTokenDesired,
uint amountTokenMin,
uint amountETHMin,
address to,
uint deadline
) external payable returns (uint amountToken, uint amountETH, uint liquidity);
}
// IERC20 interface for LP tokens
interface IERC20Token {
function balanceOf(address account) external view returns (uint256);
function transfer(address to, uint256 value) external returns (bool);
}
contract BondingCurveToken is ERC20, ReentrancyGuard {
using SafeERC20 for IERC20;
struct TokenConfig {
string description;
string imageURI;
uint256 slope;
uint256 initialPrice;
}
TokenConfig public config;
uint256 public reserveBalance;
address public immutable creator;
// Graduation system
bool public graduated;
uint256 public immutable graduationThreshold;
address public immutable dexRouter;
address public immutable factory;
// Trading fees
uint256 public immutable tradingFeePercent;
address public immutable feeCollector;
uint256 public collectedFees;
uint256 constant SCALE = 1e18;
event Bought(address indexed buyer, uint256 tokens, uint256 cost);
event Sold(address indexed seller, uint256 tokens, uint256 refund);
event Graduated(address indexed token, uint256 ethAmount, uint256 tokenAmount);
constructor(
string memory name_,
string memory symbol_,
string memory _description,
string memory _imageURI,
uint256 _slope,
uint256 _initialPrice,
address _creator,
uint256 _tradingFeePercent,
address _feeCollector,
uint256 _graduationThreshold,
address _dexRouter
) ERC20(name_, symbol_) {
require(_slope > 0, "Slope must be positive");
require(_initialPrice > 0, "Initial price must be positive");
require(_tradingFeePercent <= 1000, "Fee max 10%");
require(_feeCollector != address(0), "Invalid fee collector");
require(_dexRouter != address(0), "Invalid router");
creator = _creator;
config = TokenConfig(_description, _imageURI, _slope, _initialPrice);
tradingFeePercent = _tradingFeePercent;
feeCollector = _feeCollector;
graduationThreshold = _graduationThreshold;
dexRouter = _dexRouter;
factory = msg.sender;
}
// Bonding curve math (linear)
function tokensForAmount(uint256 ethAmount) public view returns (uint256) {
uint256 currentSupply = totalSupply();
uint256 slope = config.slope;
uint256 initialPrice = config.initialPrice;
uint256 a = slope;
uint256 b = 2 * initialPrice + slope * currentSupply / SCALE;
uint256 c = 2 * ethAmount;
require(b * b / SCALE + c * a / SCALE >= (b * b) / SCALE, "Math overflow");
uint256 sqrtTerm = sqrt((b * b * SCALE + c * a * SCALE) / SCALE);
require(sqrtTerm >= b, "Sqrt less than b");
uint256 numerator = (sqrtTerm - b) * SCALE;
uint256 denominator = a;
require(denominator > 0, "Slope cannot be zero");
return numerator / denominator;
}
function costToMint(uint256 tokenAmount) public view returns (uint256) {
uint256 currentSupply = totalSupply();
uint256 slope = config.slope;
uint256 initialPrice = config.initialPrice;
uint256 term1 = initialPrice * tokenAmount;
uint256 term2 = (slope * currentSupply * tokenAmount) / SCALE;
uint256 term3 = (slope * tokenAmount * tokenAmount) / (2 * SCALE);
return (term1 + term2 + term3) / SCALE;
}
function refundForBurn(uint256 tokenAmount) public view returns (uint256) {
uint256 currentSupply = totalSupply();
require(currentSupply >= tokenAmount, "Exceeds supply");
uint256 slope = config.slope;
uint256 initialPrice = config.initialPrice;
uint256 newSupply = currentSupply - tokenAmount;
uint256 term1 = initialPrice * tokenAmount;
uint256 term2 = (slope * newSupply * tokenAmount) / SCALE;
uint256 term3 = (slope * tokenAmount * tokenAmount) / (2 * SCALE);
return (term1 + term2 + term3) / SCALE;
}
function sqrt(uint256 x) internal pure returns (uint256 y) {
if (x == 0) return 0;
uint256 z = (x + 1) / 2;
y = x;
while (z < y) {
y = z;
z = (x / z + z) / 2;
}
}
// Buy tokens
function buyTokens(uint256 minTokensOut) external payable nonReentrant {
require(msg.value > 0, "No ETH sent");
uint256 fee = (msg.value * tradingFeePercent) / 10000;
uint256 amountAfterFee = msg.value - fee;
uint256 tokensToMint = tokensForAmount(amountAfterFee);
require(tokensToMint >= minTokensOut, "Slippage: Too few tokens out");
uint256 cost = costToMint(tokensToMint);
require(cost <= amountAfterFee, "Cost exceeds sent value");
_mint(msg.sender, tokensToMint);
collectedFees += fee;
uint256 refund = amountAfterFee - cost;
reserveBalance += (msg.value - refund);
if (refund > 0) {
(bool sent, ) = payable(msg.sender).call{value: refund}("");
require(sent, "Refund failed");
}
emit Bought(msg.sender, tokensToMint, cost);
_checkGraduation();
}
// Sell tokens
function sellTokens(uint256 amount, uint256 minEthOut) external nonReentrant {
require(balanceOf(msg.sender) >= amount, "Insufficient balance");
uint256 refund = refundForBurn(amount);
uint256 fee = (refund * tradingFeePercent) / 10000;
uint256 amountAfterFee = refund - fee;
require(amountAfterFee >= minEthOut, "Slippage: Too little ETH out");
_burn(msg.sender, amount);
reserveBalance -= refund;
collectedFees += fee;
(bool sent, ) = payable(msg.sender).call{value: amountAfterFee}("");
require(sent, "ETH transfer failed");
emit Sold(msg.sender, amount, amountAfterFee);
}
// FOURMEME PATTERN: Auto-graduation check
function _checkGraduation() private {
if (graduated || reserveBalance < graduationThreshold) return;
_addLiquidityAndBurn();
}
// FOURMEME PATTERN: Add liquidity and burn LP
function _addLiquidityAndBurn() private {
graduated = true;
// FOURMEME: Use actual contract balance
uint256 contractBalance = address(this).balance;
uint256 availableEth = contractBalance - collectedFees;
uint256 graduationFee = (availableEth * 500) / 10000; // 5%
uint256 ethForLiquidity = availableEth - graduationFee;
uint256 tokenAmount = totalSupply() / 2;
_mint(address(this), tokenAmount);
// Send fee to feeCollector (same as trading fees)
(bool feeSuccess, ) = payable(feeCollector).call{value: graduationFee}("");
require(feeSuccess, "Fee transfer failed");
_approve(address(this), dexRouter, tokenAmount);
// FOURMEME: Add liquidity and get LP amount
(,, uint256 liquidity) = ISushiSwapRouter(dexRouter).addLiquidityETH{value: ethForLiquidity}(
address(this),
tokenAmount,
0,
0,
address(this), // LP to contract
block.timestamp + 300
);
// FOURMEME: Burn LP tokens to dead address
address routerAddr = dexRouter;
address factoryAddr = ISushiSwapRouter(routerAddr).factory();
address weth = ISushiSwapRouter(routerAddr).WETH();
address pair = IUniswapV2Factory(factoryAddr).getPair(address(this), weth);
if (pair != address(0) && liquidity > 0) {
IERC20Token(pair).transfer(address(0xdead), liquidity);
}
reserveBalance = 0;
emit Graduated(address(this), ethForLiquidity, tokenAmount);
}
function withdrawFees() external {
require(msg.sender == feeCollector, "Only fee collector");
uint256 amount = collectedFees;
require(amount > 0, "No fees to withdraw");
collectedFees = 0;
(bool sent, ) = payable(feeCollector).call{value: amount}("");
require(sent, "Fee withdrawal failed");
}
receive() external payable {}
}
contract BondingCurveFactory is Ownable, ReentrancyGuard {
using SafeERC20 for IERC20;
struct TokenInfo {
address tokenAddress;
string name;
string symbol;
}
mapping(address => TokenInfo[]) public userTokens;
uint256 public creationFee = 0.001 ether;
uint256 public tradingFeePercent = 100; // 1%
address public feeCollector;
uint256 public graduationThreshold = 1 ether; // 1 SONIC
address public dexRouter = 0x9B3336186a38E1b6c21955d112dbb0343Ee061eE;
constructor() Ownable(msg.sender) {
feeCollector = msg.sender;
}
event TokenCreated(
address indexed tokenAddress,
string name,
string symbol,
address creator
);
function createToken(
string memory name,
string memory symbol,
string memory description,
string memory imageURI,
uint256 slope,
uint256 initialPrice
) external payable nonReentrant returns (address) {
require(msg.value >= creationFee, "Pay creation fee");
BondingCurveToken newToken = new BondingCurveToken(
name,
symbol,
description,
imageURI,
slope,
initialPrice,
msg.sender,
tradingFeePercent,
feeCollector,
graduationThreshold,
dexRouter
);
emit TokenCreated(address(newToken), name, symbol, msg.sender);
return address(newToken);
}
function setCreationFee(uint256 newFee) external onlyOwner {
creationFee = newFee;
}
function setTradingFee(uint256 newFeePercent) external onlyOwner {
require(newFeePercent <= 1000, "Max 10%");
tradingFeePercent = newFeePercent;
}
function setFeeCollector(address newCollector) external onlyOwner {
require(newCollector != address(0), "Invalid address");
feeCollector = newCollector;
}
function setGraduationThreshold(uint256 newThreshold) external onlyOwner {
graduationThreshold = newThreshold;
}
function setDexRouter(address newRouter) external onlyOwner {
require(newRouter != address(0), "Invalid address");
dexRouter = newRouter;
}
function withdrawFees() external onlyOwner {
payable(owner()).transfer(address(this).balance);
}
receive() external payable {}
}// 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";
/**
* @title SafeERC20
* @dev Wrappers around ERC-20 operations that throw on failure (when the token
* contract returns false). Tokens that return no value (and instead revert or
* throw on failure) are also supported, non-reverting calls are assumed to be
* successful.
* To use this library you can add a `using SafeERC20 for IERC20;` statement to your contract,
* which allows you to call the safe operations as `token.safeTransfer(...)`, etc.
*/
library SafeERC20 {
/**
* @dev An operation with an ERC-20 token failed.
*/
error SafeERC20FailedOperation(address token);
/**
* @dev Indicates a failed `decreaseAllowance` request.
*/
error SafeERC20FailedDecreaseAllowance(address spender, uint256 currentAllowance, uint256 requestedDecrease);
/**
* @dev Transfer `value` amount of `token` from the calling contract to `to`. If `token` returns no value,
* non-reverting calls are assumed to be successful.
*/
function safeTransfer(IERC20 token, address to, uint256 value) internal {
_callOptionalReturn(token, abi.encodeCall(token.transfer, (to, value)));
}
/**
* @dev Transfer `value` amount of `token` from `from` to `to`, spending the approval given by `from` to the
* calling contract. If `token` returns no value, non-reverting calls are assumed to be successful.
*/
function safeTransferFrom(IERC20 token, address from, address to, uint256 value) internal {
_callOptionalReturn(token, abi.encodeCall(token.transferFrom, (from, to, value)));
}
/**
* @dev Variant of {safeTransfer} that returns a bool instead of reverting if the operation is not successful.
*/
function trySafeTransfer(IERC20 token, address to, uint256 value) internal returns (bool) {
return _callOptionalReturnBool(token, abi.encodeCall(token.transfer, (to, value)));
}
/**
* @dev Variant of {safeTransferFrom} that returns a bool instead of reverting if the operation is not successful.
*/
function trySafeTransferFrom(IERC20 token, address from, address to, uint256 value) internal returns (bool) {
return _callOptionalReturnBool(token, abi.encodeCall(token.transferFrom, (from, to, value)));
}
/**
* @dev Increase the calling contract's allowance toward `spender` by `value`. If `token` returns no value,
* non-reverting calls are assumed to be successful.
*
* IMPORTANT: If the token implements ERC-7674 (ERC-20 with temporary allowance), and if the "client"
* smart contract uses ERC-7674 to set temporary allowances, then the "client" smart contract should avoid using
* this function. Performing a {safeIncreaseAllowance} or {safeDecreaseAllowance} operation on a token contract
* that has a non-zero temporary allowance (for that particular owner-spender) will result in unexpected behavior.
*/
function safeIncreaseAllowance(IERC20 token, address spender, uint256 value) internal {
uint256 oldAllowance = token.allowance(address(this), spender);
forceApprove(token, spender, oldAllowance + value);
}
/**
* @dev Decrease the calling contract's allowance toward `spender` by `requestedDecrease`. If `token` returns no
* value, non-reverting calls are assumed to be successful.
*
* IMPORTANT: If the token implements ERC-7674 (ERC-20 with temporary allowance), and if the "client"
* smart contract uses ERC-7674 to set temporary allowances, then the "client" smart contract should avoid using
* this function. Performing a {safeIncreaseAllowance} or {safeDecreaseAllowance} operation on a token contract
* that has a non-zero temporary allowance (for that particular owner-spender) will result in unexpected behavior.
*/
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);
}
}
/**
* @dev Set the calling contract's allowance toward `spender` to `value`. If `token` returns no value,
* non-reverting calls are assumed to be successful. Meant to be used with tokens that require the approval
* to be set to zero before setting it to a non-zero value, such as USDT.
*
* NOTE: If the token implements ERC-7674, this function will not modify any temporary allowance. This function
* only sets the "standard" allowance. Any temporary allowance will remain active, in addition to the value being
* set here.
*/
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);
}
}
/**
* @dev Performs an {ERC1363} transferAndCall, with a fallback to the simple {ERC20} transfer if the target has no
* code. This can be used to implement an {ERC721}-like safe transfer that rely on {ERC1363} checks when
* targeting contracts.
*
* Reverts if the returned value is other than `true`.
*/
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));
}
}
/**
* @dev Performs an {ERC1363} transferFromAndCall, with a fallback to the simple {ERC20} transferFrom if the target
* has no code. This can be used to implement an {ERC721}-like safe transfer that rely on {ERC1363} checks when
* targeting contracts.
*
* Reverts if the returned value is other than `true`.
*/
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));
}
}
/**
* @dev Performs an {ERC1363} approveAndCall, with a fallback to the simple {ERC20} approve if the target has no
* code. This can be used to implement an {ERC721}-like safe transfer that rely on {ERC1363} checks when
* targeting contracts.
*
* NOTE: When the recipient address (`to`) has no code (i.e. is an EOA), this function behaves as {forceApprove}.
* Opposedly, when the recipient address (`to`) has code, this function only attempts to call {ERC1363-approveAndCall}
* once without retrying, and relies on the returned value to be true.
*
* Reverts if the returned value is other than `true`.
*/
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));
}
}
/**
* @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement
* on the return value: the return value is optional (but if data is returned, it must not be false).
* @param token The token targeted by the call.
* @param data The call data (encoded using abi.encode or one of its variants).
*
* This is a variant of {_callOptionalReturnBool} that reverts if call fails to meet the requirements.
*/
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)
// bubble errors
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));
}
}
/**
* @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement
* on the return value: the return value is optional (but if data is returned, it must not be false).
* @param token The token targeted by the call.
* @param data The call data (encoded using abi.encode or one of its variants).
*
* This is a variant of {_callOptionalReturn} that silently catches all reverts and returns a bool instead.
*/
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);
}
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v5.1.0) (utils/ReentrancyGuard.sol)
pragma solidity ^0.8.20;
/**
* @dev Contract module that helps prevent reentrant calls to a function.
*
* Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier
* available, which can be applied to functions to make sure there are no nested
* (reentrant) calls to them.
*
* Note that because there is a single `nonReentrant` guard, functions marked as
* `nonReentrant` may not call one another. This can be worked around by making
* those functions `private`, and then adding `external` `nonReentrant` entry
* points to them.
*
* TIP: If EIP-1153 (transient storage) is available on the chain you're deploying at,
* consider using {ReentrancyGuardTransient} instead.
*
* TIP: If you would like to learn more about reentrancy and alternative ways
* to protect against it, check out our blog post
* https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul].
*/
abstract contract ReentrancyGuard {
// Booleans are more expensive than uint256 or any type that takes up a full
// word because each write operation emits an extra SLOAD to first read the
// slot's contents, replace the bits taken up by the boolean, and then write
// back. This is the compiler's defense against contract upgrades and
// pointer aliasing, and it cannot be disabled.
// The values being non-zero value makes deployment a bit more expensive,
// but in exchange the refund on every call to nonReentrant will be lower in
// amount. Since refunds are capped to a percentage of the total
// transaction's gas, it is best to keep them low in cases like this one, to
// increase the likelihood of the full refund coming into effect.
uint256 private constant NOT_ENTERED = 1;
uint256 private constant ENTERED = 2;
uint256 private _status;
/**
* @dev Unauthorized reentrant call.
*/
error ReentrancyGuardReentrantCall();
constructor() {
_status = NOT_ENTERED;
}
/**
* @dev Prevents a contract from calling itself, directly or indirectly.
* Calling a `nonReentrant` function from another `nonReentrant`
* function is not supported. It is possible to prevent this from happening
* by making the `nonReentrant` function external, and making it call a
* `private` function that does the actual work.
*/
modifier nonReentrant() {
_nonReentrantBefore();
_;
_nonReentrantAfter();
}
function _nonReentrantBefore() private {
// On the first call to nonReentrant, _status will be NOT_ENTERED
if (_status == ENTERED) {
revert ReentrancyGuardReentrantCall();
}
// Any calls to nonReentrant after this point will fail
_status = ENTERED;
}
function _nonReentrantAfter() private {
// By storing the original value once again, a refund is triggered (see
// https://eips.ethereum.org/EIPS/eip-2200)
_status = NOT_ENTERED;
}
/**
* @dev Returns true if the reentrancy guard is currently set to "entered", which indicates there is a
* `nonReentrant` function in the call stack.
*/
function _reentrancyGuardEntered() internal view returns (bool) {
return _status == ENTERED;
}
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v5.0.0) (access/Ownable.sol)
pragma solidity ^0.8.20;
import {Context} from "../utils/Context.sol";
/**
* @dev Contract module which provides a basic access control mechanism, where
* there is an account (an owner) that can be granted exclusive access to
* specific functions.
*
* The initial owner is set to the address provided by the deployer. This can
* later be changed with {transferOwnership}.
*
* This module is used through inheritance. It will make available the modifier
* `onlyOwner`, which can be applied to your functions to restrict their use to
* the owner.
*/
abstract contract Ownable is Context {
address private _owner;
/**
* @dev The caller account is not authorized to perform an operation.
*/
error OwnableUnauthorizedAccount(address account);
/**
* @dev The owner is not a valid owner account. (eg. `address(0)`)
*/
error OwnableInvalidOwner(address owner);
event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);
/**
* @dev Initializes the contract setting the address provided by the deployer as the initial owner.
*/
constructor(address initialOwner) {
if (initialOwner == address(0)) {
revert OwnableInvalidOwner(address(0));
}
_transferOwnership(initialOwner);
}
/**
* @dev Throws if called by any account other than the owner.
*/
modifier onlyOwner() {
_checkOwner();
_;
}
/**
* @dev Returns the address of the current owner.
*/
function owner() public view virtual returns (address) {
return _owner;
}
/**
* @dev Throws if the sender is not the owner.
*/
function _checkOwner() internal view virtual {
if (owner() != _msgSender()) {
revert OwnableUnauthorizedAccount(_msgSender());
}
}
/**
* @dev Leaves the contract without owner. It will not be possible to call
* `onlyOwner` functions. Can only be called by the current owner.
*
* NOTE: Renouncing ownership will leave the contract without an owner,
* thereby disabling any functionality that is only available to the owner.
*/
function renounceOwnership() public virtual onlyOwner {
_transferOwnership(address(0));
}
/**
* @dev Transfers ownership of the contract to a new account (`newOwner`).
* Can only be called by the current owner.
*/
function transferOwnership(address newOwner) public virtual onlyOwner {
if (newOwner == address(0)) {
revert OwnableInvalidOwner(address(0));
}
_transferOwnership(newOwner);
}
/**
* @dev Transfers ownership of the contract to a new account (`newOwner`).
* Internal function without access restriction.
*/
function _transferOwnership(address newOwner) internal virtual {
address oldOwner = _owner;
_owner = newOwner;
emit OwnershipTransferred(oldOwner, newOwner);
}
}// 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";
/**
* @dev Implementation of the {IERC20} interface.
*
* This implementation is agnostic to the way tokens are created. This means
* that a supply mechanism has to be added in a derived contract using {_mint}.
*
* TIP: For a detailed writeup see our guide
* https://forum.openzeppelin.com/t/how-to-implement-erc20-supply-mechanisms/226[How
* to implement supply mechanisms].
*
* The default value of {decimals} is 18. To change this, you should override
* this function so it returns a different value.
*
* We have followed general OpenZeppelin Contracts guidelines: functions revert
* instead returning `false` on failure. This behavior is nonetheless
* conventional and does not conflict with the expectations of ERC-20
* applications.
*/
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;
/**
* @dev Sets the values for {name} and {symbol}.
*
* Both values are immutable: they can only be set once during construction.
*/
constructor(string memory name_, string memory symbol_) {
_name = name_;
_symbol = symbol_;
}
/**
* @dev Returns the name of the token.
*/
function name() public view virtual returns (string memory) {
return _name;
}
/**
* @dev Returns the symbol of the token, usually a shorter version of the
* name.
*/
function symbol() public view virtual returns (string memory) {
return _symbol;
}
/**
* @dev Returns the number of decimals used to get its user representation.
* For example, if `decimals` equals `2`, a balance of `505` tokens should
* be displayed to a user as `5.05` (`505 / 10 ** 2`).
*
* Tokens usually opt for a value of 18, imitating the relationship between
* Ether and Wei. This is the default value returned by this function, unless
* it's overridden.
*
* NOTE: This information is only used for _display_ purposes: it in
* no way affects any of the arithmetic of the contract, including
* {IERC20-balanceOf} and {IERC20-transfer}.
*/
function decimals() public view virtual returns (uint8) {
return 18;
}
/// @inheritdoc IERC20
function totalSupply() public view virtual returns (uint256) {
return _totalSupply;
}
/// @inheritdoc IERC20
function balanceOf(address account) public view virtual returns (uint256) {
return _balances[account];
}
/**
* @dev See {IERC20-transfer}.
*
* Requirements:
*
* - `to` cannot be the zero address.
* - the caller must have a balance of at least `value`.
*/
function transfer(address to, uint256 value) public virtual returns (bool) {
address owner = _msgSender();
_transfer(owner, to, value);
return true;
}
/// @inheritdoc IERC20
function allowance(address owner, address spender) public view virtual returns (uint256) {
return _allowances[owner][spender];
}
/**
* @dev See {IERC20-approve}.
*
* NOTE: If `value` is the maximum `uint256`, the allowance is not updated on
* `transferFrom`. This is semantically equivalent to an infinite approval.
*
* Requirements:
*
* - `spender` cannot be the zero address.
*/
function approve(address spender, uint256 value) public virtual returns (bool) {
address owner = _msgSender();
_approve(owner, spender, value);
return true;
}
/**
* @dev See {IERC20-transferFrom}.
*
* Skips emitting an {Approval} event indicating an allowance update. This is not
* required by the ERC. See {xref-ERC20-_approve-address-address-uint256-bool-}[_approve].
*
* NOTE: Does not update the allowance if the current allowance
* is the maximum `uint256`.
*
* Requirements:
*
* - `from` and `to` cannot be the zero address.
* - `from` must have a balance of at least `value`.
* - the caller must have allowance for ``from``'s tokens of at least
* `value`.
*/
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;
}
/**
* @dev Moves a `value` amount of tokens from `from` to `to`.
*
* This internal function is equivalent to {transfer}, and can be used to
* e.g. implement automatic token fees, slashing mechanisms, etc.
*
* Emits a {Transfer} event.
*
* NOTE: This function is not virtual, {_update} should be overridden instead.
*/
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);
}
/**
* @dev Transfers a `value` amount of tokens from `from` to `to`, or alternatively mints (or burns) if `from`
* (or `to`) is the zero address. All customizations to transfers, mints, and burns should be done by overriding
* this function.
*
* Emits a {Transfer} event.
*/
function _update(address from, address to, uint256 value) internal virtual {
if (from == address(0)) {
// Overflow check required: The rest of the code assumes that totalSupply never overflows
_totalSupply += value;
} else {
uint256 fromBalance = _balances[from];
if (fromBalance < value) {
revert ERC20InsufficientBalance(from, fromBalance, value);
}
unchecked {
// Overflow not possible: value <= fromBalance <= totalSupply.
_balances[from] = fromBalance - value;
}
}
if (to == address(0)) {
unchecked {
// Overflow not possible: value <= totalSupply or value <= fromBalance <= totalSupply.
_totalSupply -= value;
}
} else {
unchecked {
// Overflow not possible: balance + value is at most totalSupply, which we know fits into a uint256.
_balances[to] += value;
}
}
emit Transfer(from, to, value);
}
/**
* @dev Creates a `value` amount of tokens and assigns them to `account`, by transferring it from address(0).
* Relies on the `_update` mechanism
*
* Emits a {Transfer} event with `from` set to the zero address.
*
* NOTE: This function is not virtual, {_update} should be overridden instead.
*/
function _mint(address account, uint256 value) internal {
if (account == address(0)) {
revert ERC20InvalidReceiver(address(0));
}
_update(address(0), account, value);
}
/**
* @dev Destroys a `value` amount of tokens from `account`, lowering the total supply.
* Relies on the `_update` mechanism.
*
* Emits a {Transfer} event with `to` set to the zero address.
*
* NOTE: This function is not virtual, {_update} should be overridden instead
*/
function _burn(address account, uint256 value) internal {
if (account == address(0)) {
revert ERC20InvalidSender(address(0));
}
_update(account, address(0), value);
}
/**
* @dev Sets `value` as the allowance of `spender` over the `owner`'s tokens.
*
* This internal function is equivalent to `approve`, and can be used to
* e.g. set automatic allowances for certain subsystems, etc.
*
* Emits an {Approval} event.
*
* Requirements:
*
* - `owner` cannot be the zero address.
* - `spender` cannot be the zero address.
*
* Overrides to this logic should be done to the variant with an additional `bool emitEvent` argument.
*/
function _approve(address owner, address spender, uint256 value) internal {
_approve(owner, spender, value, true);
}
/**
* @dev Variant of {_approve} with an optional flag to enable or disable the {Approval} event.
*
* By default (when calling {_approve}) the flag is set to true. On the other hand, approval changes made by
* `_spendAllowance` during the `transferFrom` operation set the flag to false. This saves gas by not emitting any
* `Approval` event during `transferFrom` operations.
*
* Anyone who wishes to continue emitting `Approval` events on the`transferFrom` operation can force the flag to
* true using the following override:
*
* ```solidity
* function _approve(address owner, address spender, uint256 value, bool) internal virtual override {
* super._approve(owner, spender, value, true);
* }
* ```
*
* Requirements are the same as {_approve}.
*/
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);
}
}
/**
* @dev Updates `owner`'s allowance for `spender` based on spent `value`.
*
* Does not update the allowance value in case of infinite allowance.
* Revert if not enough allowance is available.
*
* Does not emit an {Approval} event.
*/
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);
}
}
}
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v5.4.0) (interfaces/IERC1363.sol)
pragma solidity >=0.6.2;
import {IERC20} from "./IERC20.sol";
import {IERC165} from "./IERC165.sol";
/**
* @title IERC1363
* @dev Interface of the ERC-1363 standard as defined in the https://eips.ethereum.org/EIPS/eip-1363[ERC-1363].
*
* Defines an extension interface for ERC-20 tokens that supports executing code on a recipient contract
* after `transfer` or `transferFrom`, or code on a spender contract after `approve`, in a single transaction.
*/
interface IERC1363 is IERC20, IERC165 {
/*
* Note: the ERC-165 identifier for this interface is 0xb0202a11.
* 0xb0202a11 ===
* bytes4(keccak256('transferAndCall(address,uint256)')) ^
* bytes4(keccak256('transferAndCall(address,uint256,bytes)')) ^
* bytes4(keccak256('transferFromAndCall(address,address,uint256)')) ^
* bytes4(keccak256('transferFromAndCall(address,address,uint256,bytes)')) ^
* bytes4(keccak256('approveAndCall(address,uint256)')) ^
* bytes4(keccak256('approveAndCall(address,uint256,bytes)'))
*/
/**
* @dev Moves a `value` amount of tokens from the caller's account to `to`
* and then calls {IERC1363Receiver-onTransferReceived} on `to`.
* @param to The address which you want to transfer to.
* @param value The amount of tokens to be transferred.
* @return A boolean value indicating whether the operation succeeded unless throwing.
*/
function transferAndCall(address to, uint256 value) external returns (bool);
/**
* @dev Moves a `value` amount of tokens from the caller's account to `to`
* and then calls {IERC1363Receiver-onTransferReceived} on `to`.
* @param to The address which you want to transfer to.
* @param value The amount of tokens to be transferred.
* @param data Additional data with no specified format, sent in call to `to`.
* @return A boolean value indicating whether the operation succeeded unless throwing.
*/
function transferAndCall(address to, uint256 value, bytes calldata data) external returns (bool);
/**
* @dev Moves a `value` amount of tokens from `from` to `to` using the allowance mechanism
* and then calls {IERC1363Receiver-onTransferReceived} on `to`.
* @param from The address which you want to send tokens from.
* @param to The address which you want to transfer to.
* @param value The amount of tokens to be transferred.
* @return A boolean value indicating whether the operation succeeded unless throwing.
*/
function transferFromAndCall(address from, address to, uint256 value) external returns (bool);
/**
* @dev Moves a `value` amount of tokens from `from` to `to` using the allowance mechanism
* and then calls {IERC1363Receiver-onTransferReceived} on `to`.
* @param from The address which you want to send tokens from.
* @param to The address which you want to transfer to.
* @param value The amount of tokens to be transferred.
* @param data Additional data with no specified format, sent in call to `to`.
* @return A boolean value indicating whether the operation succeeded unless throwing.
*/
function transferFromAndCall(address from, address to, uint256 value, bytes calldata data) external returns (bool);
/**
* @dev Sets a `value` amount of tokens as the allowance of `spender` over the
* caller's tokens and then calls {IERC1363Spender-onApprovalReceived} on `spender`.
* @param spender The address which will spend the funds.
* @param value The amount of tokens to be spent.
* @return A boolean value indicating whether the operation succeeded unless throwing.
*/
function approveAndCall(address spender, uint256 value) external returns (bool);
/**
* @dev Sets a `value` amount of tokens as the allowance of `spender` over the
* caller's tokens and then calls {IERC1363Spender-onApprovalReceived} on `spender`.
* @param spender The address which will spend the funds.
* @param value The amount of tokens to be spent.
* @param data Additional data with no specified format, sent in call to `spender`.
* @return A boolean value indicating whether the operation succeeded unless throwing.
*/
function approveAndCall(address spender, uint256 value, bytes calldata data) external returns (bool);
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v5.4.0) (token/ERC20/IERC20.sol)
pragma solidity >=0.4.16;
/**
* @dev Interface of the ERC-20 standard as defined in the ERC.
*/
interface IERC20 {
/**
* @dev Emitted when `value` tokens are moved from one account (`from`) to
* another (`to`).
*
* Note that `value` may be zero.
*/
event Transfer(address indexed from, address indexed to, uint256 value);
/**
* @dev Emitted when the allowance of a `spender` for an `owner` is set by
* a call to {approve}. `value` is the new allowance.
*/
event Approval(address indexed owner, address indexed spender, uint256 value);
/**
* @dev Returns the value of tokens in existence.
*/
function totalSupply() external view returns (uint256);
/**
* @dev Returns the value of tokens owned by `account`.
*/
function balanceOf(address account) external view returns (uint256);
/**
* @dev Moves a `value` amount of tokens from the caller's account to `to`.
*
* Returns a boolean value indicating whether the operation succeeded.
*
* Emits a {Transfer} event.
*/
function transfer(address to, uint256 value) external returns (bool);
/**
* @dev Returns the remaining number of tokens that `spender` will be
* allowed to spend on behalf of `owner` through {transferFrom}. This is
* zero by default.
*
* This value changes when {approve} or {transferFrom} are called.
*/
function allowance(address owner, address spender) external view returns (uint256);
/**
* @dev Sets a `value` amount of tokens as the allowance of `spender` over the
* caller's tokens.
*
* Returns a boolean value indicating whether the operation succeeded.
*
* IMPORTANT: Beware that changing an allowance with this method brings the risk
* that someone may use both the old and the new allowance by unfortunate
* transaction ordering. One possible solution to mitigate this race
* condition is to first reduce the spender's allowance to 0 and set the
* desired value afterwards:
* https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729
*
* Emits an {Approval} event.
*/
function approve(address spender, uint256 value) external returns (bool);
/**
* @dev Moves a `value` amount of tokens from `from` to `to` using the
* allowance mechanism. `value` is then deducted from the caller's
* allowance.
*
* Returns a boolean value indicating whether the operation succeeded.
*
* Emits a {Transfer} event.
*/
function transferFrom(address from, address to, uint256 value) external returns (bool);
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v5.4.0) (interfaces/draft-IERC6093.sol)
pragma solidity >=0.8.4;
/**
* @dev Standard ERC-20 Errors
* Interface of the https://eips.ethereum.org/EIPS/eip-6093[ERC-6093] custom errors for ERC-20 tokens.
*/
interface IERC20Errors {
/**
* @dev Indicates an error related to the current `balance` of a `sender`. Used in transfers.
* @param sender Address whose tokens are being transferred.
* @param balance Current balance for the interacting account.
* @param needed Minimum amount required to perform a transfer.
*/
error ERC20InsufficientBalance(address sender, uint256 balance, uint256 needed);
/**
* @dev Indicates a failure with the token `sender`. Used in transfers.
* @param sender Address whose tokens are being transferred.
*/
error ERC20InvalidSender(address sender);
/**
* @dev Indicates a failure with the token `receiver`. Used in transfers.
* @param receiver Address to which tokens are being transferred.
*/
error ERC20InvalidReceiver(address receiver);
/**
* @dev Indicates a failure with the `spender`’s `allowance`. Used in transfers.
* @param spender Address that may be allowed to operate on tokens without being their owner.
* @param allowance Amount of tokens a `spender` is allowed to operate with.
* @param needed Minimum amount required to perform a transfer.
*/
error ERC20InsufficientAllowance(address spender, uint256 allowance, uint256 needed);
/**
* @dev Indicates a failure with the `approver` of a token to be approved. Used in approvals.
* @param approver Address initiating an approval operation.
*/
error ERC20InvalidApprover(address approver);
/**
* @dev Indicates a failure with the `spender` to be approved. Used in approvals.
* @param spender Address that may be allowed to operate on tokens without being their owner.
*/
error ERC20InvalidSpender(address spender);
}
/**
* @dev Standard ERC-721 Errors
* Interface of the https://eips.ethereum.org/EIPS/eip-6093[ERC-6093] custom errors for ERC-721 tokens.
*/
interface IERC721Errors {
/**
* @dev Indicates that an address can't be an owner. For example, `address(0)` is a forbidden owner in ERC-20.
* Used in balance queries.
* @param owner Address of the current owner of a token.
*/
error ERC721InvalidOwner(address owner);
/**
* @dev Indicates a `tokenId` whose `owner` is the zero address.
* @param tokenId Identifier number of a token.
*/
error ERC721NonexistentToken(uint256 tokenId);
/**
* @dev Indicates an error related to the ownership over a particular token. Used in transfers.
* @param sender Address whose tokens are being transferred.
* @param tokenId Identifier number of a token.
* @param owner Address of the current owner of a token.
*/
error ERC721IncorrectOwner(address sender, uint256 tokenId, address owner);
/**
* @dev Indicates a failure with the token `sender`. Used in transfers.
* @param sender Address whose tokens are being transferred.
*/
error ERC721InvalidSender(address sender);
/**
* @dev Indicates a failure with the token `receiver`. Used in transfers.
* @param receiver Address to which tokens are being transferred.
*/
error ERC721InvalidReceiver(address receiver);
/**
* @dev Indicates a failure with the `operator`’s approval. Used in transfers.
* @param operator Address that may be allowed to operate on tokens without being their owner.
* @param tokenId Identifier number of a token.
*/
error ERC721InsufficientApproval(address operator, uint256 tokenId);
/**
* @dev Indicates a failure with the `approver` of a token to be approved. Used in approvals.
* @param approver Address initiating an approval operation.
*/
error ERC721InvalidApprover(address approver);
/**
* @dev Indicates a failure with the `operator` to be approved. Used in approvals.
* @param operator Address that may be allowed to operate on tokens without being their owner.
*/
error ERC721InvalidOperator(address operator);
}
/**
* @dev Standard ERC-1155 Errors
* Interface of the https://eips.ethereum.org/EIPS/eip-6093[ERC-6093] custom errors for ERC-1155 tokens.
*/
interface IERC1155Errors {
/**
* @dev Indicates an error related to the current `balance` of a `sender`. Used in transfers.
* @param sender Address whose tokens are being transferred.
* @param balance Current balance for the interacting account.
* @param needed Minimum amount required to perform a transfer.
* @param tokenId Identifier number of a token.
*/
error ERC1155InsufficientBalance(address sender, uint256 balance, uint256 needed, uint256 tokenId);
/**
* @dev Indicates a failure with the token `sender`. Used in transfers.
* @param sender Address whose tokens are being transferred.
*/
error ERC1155InvalidSender(address sender);
/**
* @dev Indicates a failure with the token `receiver`. Used in transfers.
* @param receiver Address to which tokens are being transferred.
*/
error ERC1155InvalidReceiver(address receiver);
/**
* @dev Indicates a failure with the `operator`’s approval. Used in transfers.
* @param operator Address that may be allowed to operate on tokens without being their owner.
* @param owner Address of the current owner of a token.
*/
error ERC1155MissingApprovalForAll(address operator, address owner);
/**
* @dev Indicates a failure with the `approver` of a token to be approved. Used in approvals.
* @param approver Address initiating an approval operation.
*/
error ERC1155InvalidApprover(address approver);
/**
* @dev Indicates a failure with the `operator` to be approved. Used in approvals.
* @param operator Address that may be allowed to operate on tokens without being their owner.
*/
error ERC1155InvalidOperator(address operator);
/**
* @dev Indicates an array length mismatch between ids and values in a safeBatchTransferFrom operation.
* Used in batch transfers.
* @param idsLength Length of the array of token identifiers
* @param valuesLength Length of the array of token amounts
*/
error ERC1155InvalidArrayLength(uint256 idsLength, uint256 valuesLength);
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v5.0.1) (utils/Context.sol)
pragma solidity ^0.8.20;
/**
* @dev Provides information about the current execution context, including the
* sender of the transaction and its data. While these are generally available
* via msg.sender and msg.data, they should not be accessed in such a direct
* manner, since when dealing with meta-transactions the account sending and
* paying for execution may not be the actual sender (as far as an application
* is concerned).
*
* This contract is only required for intermediate, library-like contracts.
*/
abstract contract Context {
function _msgSender() internal view virtual returns (address) {
return msg.sender;
}
function _msgData() internal view virtual returns (bytes calldata) {
return msg.data;
}
function _contextSuffixLength() internal view virtual returns (uint256) {
return 0;
}
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v5.4.0) (token/ERC20/extensions/IERC20Metadata.sol)
pragma solidity >=0.6.2;
import {IERC20} from "../IERC20.sol";
/**
* @dev Interface for the optional metadata functions from the ERC-20 standard.
*/
interface IERC20Metadata is IERC20 {
/**
* @dev Returns the name of the token.
*/
function name() external view returns (string memory);
/**
* @dev Returns the symbol of the token.
*/
function symbol() external view returns (string memory);
/**
* @dev Returns the decimals places of the token.
*/
function decimals() external view returns (uint8);
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v5.4.0) (interfaces/IERC165.sol)
pragma solidity >=0.4.16;
import {IERC165} from "../utils/introspection/IERC165.sol";// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v5.4.0) (interfaces/IERC20.sol)
pragma solidity >=0.4.16;
import {IERC20} from "../token/ERC20/IERC20.sol";// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v5.4.0) (utils/introspection/IERC165.sol)
pragma solidity >=0.4.16;
/**
* @dev Interface of the ERC-165 standard, as defined in the
* https://eips.ethereum.org/EIPS/eip-165[ERC].
*
* Implementers can declare support of contract interfaces, which can then be
* queried by others ({ERC165Checker}).
*
* For an implementation, see {ERC165}.
*/
interface IERC165 {
/**
* @dev Returns true if this contract implements the interface defined by
* `interfaceId`. See the corresponding
* https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[ERC section]
* to learn more about how these ids are created.
*
* This function call must use less than 30 000 gas.
*/
function supportsInterface(bytes4 interfaceId) external view returns (bool);
}{
"optimizer": {
"enabled": false,
"runs": 200
},
"outputSelection": {
"*": {
"*": [
"evm.bytecode",
"evm.deployedBytecode",
"devdoc",
"userdoc",
"metadata",
"abi"
]
}
},
"remappings": []
}Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
Contract ABI
API[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"OwnableInvalidOwner","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"OwnableUnauthorizedAccount","type":"error"},{"inputs":[],"name":"ReentrancyGuardReentrantCall","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"tokenAddress","type":"address"},{"indexed":false,"internalType":"string","name":"name","type":"string"},{"indexed":false,"internalType":"string","name":"symbol","type":"string"},{"indexed":false,"internalType":"address","name":"creator","type":"address"}],"name":"TokenCreated","type":"event"},{"inputs":[{"internalType":"string","name":"name","type":"string"},{"internalType":"string","name":"symbol","type":"string"},{"internalType":"string","name":"description","type":"string"},{"internalType":"string","name":"imageURI","type":"string"},{"internalType":"uint256","name":"slope","type":"uint256"},{"internalType":"uint256","name":"initialPrice","type":"uint256"}],"name":"createToken","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"creationFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"dexRouter","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"feeCollector","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"graduationThreshold","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newFee","type":"uint256"}],"name":"setCreationFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newRouter","type":"address"}],"name":"setDexRouter","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newCollector","type":"address"}],"name":"setFeeCollector","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newThreshold","type":"uint256"}],"name":"setGraduationThreshold","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newFeePercent","type":"uint256"}],"name":"setTradingFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"tradingFeePercent","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"userTokens","outputs":[{"internalType":"address","name":"tokenAddress","type":"address"},{"internalType":"string","name":"name","type":"string"},{"internalType":"string","name":"symbol","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdrawFees","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]Contract Creation Code
608060405266038d7ea4c680006003556064600455670de0b6b3a7640000600655739b3336186a38e1b6c21955d112dbb0343ee061ee60075f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555034801562000080575f80fd5b50335f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603620000f5575f6040517f1e4fbdf7000000000000000000000000000000000000000000000000000000008152600401620000ec919062000258565b60405180910390fd5b62000106816200015460201b60201c565b50600180819055503360055f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555062000273565b5f805f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050815f806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f620002408262000215565b9050919050565b620002528162000234565b82525050565b5f6020820190506200026d5f83018462000247565b92915050565b61503080620002815f395ff3fe6080604052600436106200010e575f3560e01c8063b0d54bcf1162000096578063eabc223f1162000060578063eabc223f146200031a578063f2fde38b1462000350578063f72f863b146200037d578063f9f411d814620003aa5762000116565b8063b0d54bcf1462000262578063b7d86225146200028f578063c415b95c14620002bc578063dce0b4e414620002eb5762000116565b8063715018a611620000d8578063715018a614620001be5780638b0bc50114620001d75780638da5cb5b1462000206578063a42dce8014620002355762000116565b80630758d924146200011a5780632a3240271462000149578063476343ee146200017857806352f5b3ef14620001915762000116565b366200011657005b5f80fd5b34801562000126575f80fd5b5062000131620003ef565b60405162000140919062000c35565b60405180910390f35b34801562000155575f80fd5b506200016062000414565b6040516200016f919062000c6a565b60405180910390f35b34801562000184575f80fd5b506200018f6200041a565b005b3480156200019d575f80fd5b50620001bc6004803603810190620001b6919062000cc5565b62000474565b005b348015620001ca575f80fd5b50620001d562000488565b005b348015620001e3575f80fd5b50620001ee6200049f565b604051620001fd919062000c6a565b60405180910390f35b34801562000212575f80fd5b506200021d620004a5565b6040516200022c919062000c35565b60405180910390f35b34801562000241575f80fd5b506200026060048036038101906200025a919062000d24565b620004cc565b005b3480156200026e575f80fd5b506200028d600480360381019062000287919062000cc5565b6200058a565b005b3480156200029b575f80fd5b50620002ba6004803603810190620002b4919062000cc5565b620005e6565b005b348015620002c8575f80fd5b50620002d3620005fa565b604051620002e2919062000c35565b60405180910390f35b348015620002f7575f80fd5b50620003026200061f565b60405162000311919062000c6a565b60405180910390f35b62000338600480360381019062000332919062000eac565b62000625565b60405162000347919062000c35565b60405180910390f35b3480156200035c575f80fd5b506200037b600480360381019062000375919062000d24565b62000777565b005b34801562000389575f80fd5b50620003a86004803603810190620003a2919062000d24565b62000802565b005b348015620003b6575f80fd5b50620003d56004803603810190620003cf919062000fc0565b620008c0565b604051620003e69392919062001089565b60405180910390f35b60075f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60045481565b6200042462000a3c565b6200042e620004a5565b73ffffffffffffffffffffffffffffffffffffffff166108fc4790811502906040515f60405180830381858888f1935050505015801562000471573d5f803e3d5ffd5b50565b6200047e62000a3c565b8060068190555050565b6200049262000a3c565b6200049d5f62000acc565b565b60065481565b5f805f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b620004d662000a3c565b5f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff160362000547576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200053e9062001120565b60405180910390fd5b8060055f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6200059462000a3c565b6103e8811115620005dc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620005d3906200118e565b60405180910390fd5b8060048190555050565b620005f062000a3c565b8060038190555050565b60055f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60035481565b5f6200063062000b8d565b60035434101562000678576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200066f90620011fc565b60405180910390fd5b5f8787878787873360045460055f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1660065460075f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16604051620006d89062000be4565b620006ee9b9a999897969594939291906200121c565b604051809103905ff08015801562000708573d5f803e3d5ffd5b5090508073ffffffffffffffffffffffffffffffffffffffff167f6596c1670eb3390048d23721809c3da5d3f531375ac0e2cab0f77a808ed643318989336040516200075793929190620012f7565b60405180910390a2809150506200076d62000bd4565b9695505050505050565b6200078162000a3c565b5f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603620007f4575f6040517f1e4fbdf7000000000000000000000000000000000000000000000000000000008152600401620007eb919062000c35565b60405180910390fd5b620007ff8162000acc565b50565b6200080c62000a3c565b5f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036200087d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620008749062001120565b60405180910390fd5b8060075f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6002602052815f5260405f208181548110620008da575f80fd5b905f5260205f2090600302015f9150915050805f015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff169080600101805462000921906200136d565b80601f01602080910402602001604051908101604052809291908181526020018280546200094f906200136d565b80156200099e5780601f1062000974576101008083540402835291602001916200099e565b820191905f5260205f20905b8154815290600101906020018083116200098057829003601f168201915b505050505090806002018054620009b5906200136d565b80601f0160208091040260200160405190810160405280929190818152602001828054620009e3906200136d565b801562000a325780601f1062000a085761010080835404028352916020019162000a32565b820191905f5260205f20905b81548152906001019060200180831162000a1457829003601f168201915b5050505050905083565b62000a4662000bdd565b73ffffffffffffffffffffffffffffffffffffffff1662000a66620004a5565b73ffffffffffffffffffffffffffffffffffffffff161462000aca5762000a8c62000bdd565b6040517f118cdaa700000000000000000000000000000000000000000000000000000000815260040162000ac1919062000c35565b60405180910390fd5b565b5f805f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050815f806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b60026001540362000bca576040517f3ee5aeb500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6002600181905550565b60018081905550565b5f33905090565b613c5980620013a283390190565b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f62000c1d8262000bf2565b9050919050565b62000c2f8162000c11565b82525050565b5f60208201905062000c4a5f83018462000c24565b92915050565b5f819050919050565b62000c648162000c50565b82525050565b5f60208201905062000c7f5f83018462000c59565b92915050565b5f604051905090565b5f80fd5b5f80fd5b62000ca18162000c50565b811462000cac575f80fd5b50565b5f8135905062000cbf8162000c96565b92915050565b5f6020828403121562000cdd5762000cdc62000c8e565b5b5f62000cec8482850162000caf565b91505092915050565b62000d008162000c11565b811462000d0b575f80fd5b50565b5f8135905062000d1e8162000cf5565b92915050565b5f6020828403121562000d3c5762000d3b62000c8e565b5b5f62000d4b8482850162000d0e565b91505092915050565b5f80fd5b5f80fd5b5f601f19601f8301169050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b62000da48262000d5c565b810181811067ffffffffffffffff8211171562000dc65762000dc562000d6c565b5b80604052505050565b5f62000dda62000c85565b905062000de8828262000d99565b919050565b5f67ffffffffffffffff82111562000e0a5762000e0962000d6c565b5b62000e158262000d5c565b9050602081019050919050565b828183375f83830152505050565b5f62000e4662000e408462000ded565b62000dcf565b90508281526020810184848401111562000e655762000e6462000d58565b5b62000e7284828562000e22565b509392505050565b5f82601f83011262000e915762000e9062000d54565b5b813562000ea384826020860162000e30565b91505092915050565b5f805f805f8060c0878903121562000ec95762000ec862000c8e565b5b5f87013567ffffffffffffffff81111562000ee95762000ee862000c92565b5b62000ef789828a0162000e7a565b965050602087013567ffffffffffffffff81111562000f1b5762000f1a62000c92565b5b62000f2989828a0162000e7a565b955050604087013567ffffffffffffffff81111562000f4d5762000f4c62000c92565b5b62000f5b89828a0162000e7a565b945050606087013567ffffffffffffffff81111562000f7f5762000f7e62000c92565b5b62000f8d89828a0162000e7a565b935050608062000fa089828a0162000caf565b92505060a062000fb389828a0162000caf565b9150509295509295509295565b5f806040838503121562000fd95762000fd862000c8e565b5b5f62000fe88582860162000d0e565b925050602062000ffb8582860162000caf565b9150509250929050565b5f81519050919050565b5f82825260208201905092915050565b5f5b838110156200103e57808201518184015260208101905062001021565b5f8484015250505050565b5f620010558262001005565b6200106181856200100f565b9350620010738185602086016200101f565b6200107e8162000d5c565b840191505092915050565b5f6060820190506200109e5f83018662000c24565b8181036020830152620010b2818562001049565b90508181036040830152620010c8818462001049565b9050949350505050565b7f496e76616c6964206164647265737300000000000000000000000000000000005f82015250565b5f62001108600f836200100f565b91506200111582620010d2565b602082019050919050565b5f6020820190508181035f8301526200113981620010fa565b9050919050565b7f4d617820313025000000000000000000000000000000000000000000000000005f82015250565b5f620011766007836200100f565b9150620011838262001140565b602082019050919050565b5f6020820190508181035f830152620011a78162001168565b9050919050565b7f506179206372656174696f6e20666565000000000000000000000000000000005f82015250565b5f620011e46010836200100f565b9150620011f182620011ae565b602082019050919050565b5f6020820190508181035f8301526200121581620011d6565b9050919050565b5f610160820190508181035f83015262001237818e62001049565b905081810360208301526200124d818d62001049565b9050818103604083015262001263818c62001049565b9050818103606083015262001279818b62001049565b90506200128a608083018a62000c59565b6200129960a083018962000c59565b620012a860c083018862000c24565b620012b760e083018762000c59565b620012c761010083018662000c24565b620012d761012083018562000c59565b620012e761014083018462000c24565b9c9b505050505050505050505050565b5f6060820190508181035f83015262001311818662001049565b9050818103602083015262001327818562001049565b905062001338604083018462000c24565b949350505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b5f60028204905060018216806200138557607f821691505b6020821081036200139b576200139a62001340565b5b5091905056fe61014060405234801562000011575f80fd5b5060405162003c5938038062003c59833981810160405281019062000037919062000594565b8a8a81600390816200004a919062000944565b5080600490816200005c919062000944565b50505060016005819055505f8711620000ac576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620000a39062000a86565b60405180910390fd5b5f8611620000f1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620000e89062000af4565b60405180910390fd5b6103e884111562000139576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620001309062000b62565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603620001aa576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620001a19062000bd0565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036200021b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620002129062000c3e565b60405180910390fd5b8473ffffffffffffffffffffffffffffffffffffffff1660808173ffffffffffffffffffffffffffffffffffffffff168152505060405180608001604052808a81526020018981526020018881526020018781525060065f820151815f01908162000287919062000944565b5060208201518160010190816200029f919062000944565b5060408201518160020155606082015181600301559050508361010081815250508273ffffffffffffffffffffffffffffffffffffffff166101208173ffffffffffffffffffffffffffffffffffffffff16815250508160a081815250508073ffffffffffffffffffffffffffffffffffffffff1660c08173ffffffffffffffffffffffffffffffffffffffff16815250503373ffffffffffffffffffffffffffffffffffffffff1660e08173ffffffffffffffffffffffffffffffffffffffff1681525050505050505050505050505062000c5e565b5f604051905090565b5f80fd5b5f80fd5b5f80fd5b5f80fd5b5f601f19601f8301169050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b620003d7826200038f565b810181811067ffffffffffffffff82111715620003f957620003f86200039f565b5b80604052505050565b5f6200040d62000376565b90506200041b8282620003cc565b919050565b5f67ffffffffffffffff8211156200043d576200043c6200039f565b5b62000448826200038f565b9050602081019050919050565b5f5b838110156200047457808201518184015260208101905062000457565b5f8484015250505050565b5f620004956200048f8462000420565b62000402565b905082815260208101848484011115620004b457620004b36200038b565b5b620004c184828562000455565b509392505050565b5f82601f830112620004e057620004df62000387565b5b8151620004f28482602086016200047f565b91505092915050565b5f819050919050565b6200050f81620004fb565b81146200051a575f80fd5b50565b5f815190506200052d8162000504565b92915050565b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f6200055e8262000533565b9050919050565b620005708162000552565b81146200057b575f80fd5b50565b5f815190506200058e8162000565565b92915050565b5f805f805f805f805f805f6101608c8e031215620005b757620005b66200037f565b5b5f8c015167ffffffffffffffff811115620005d757620005d662000383565b5b620005e58e828f01620004c9565b9b505060208c015167ffffffffffffffff81111562000609576200060862000383565b5b620006178e828f01620004c9565b9a505060408c015167ffffffffffffffff8111156200063b576200063a62000383565b5b620006498e828f01620004c9565b99505060608c015167ffffffffffffffff8111156200066d576200066c62000383565b5b6200067b8e828f01620004c9565b98505060806200068e8e828f016200051d565b97505060a0620006a18e828f016200051d565b96505060c0620006b48e828f016200057e565b95505060e0620006c78e828f016200051d565b945050610100620006db8e828f016200057e565b935050610120620006ef8e828f016200051d565b925050610140620007038e828f016200057e565b9150509295989b509295989b9093969950565b5f81519050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b5f60028204905060018216806200076557607f821691505b6020821081036200077b576200077a62000720565b5b50919050565b5f819050815f5260205f209050919050565b5f6020601f8301049050919050565b5f82821b905092915050565b5f60088302620007df7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82620007a2565b620007eb8683620007a2565b95508019841693508086168417925050509392505050565b5f819050919050565b5f6200082c620008266200082084620004fb565b62000803565b620004fb565b9050919050565b5f819050919050565b62000847836200080c565b6200085f620008568262000833565b848454620007ae565b825550505050565b5f90565b6200087562000867565b620008828184846200083c565b505050565b5b81811015620008a9576200089d5f826200086b565b60018101905062000888565b5050565b601f821115620008f857620008c28162000781565b620008cd8462000793565b81016020851015620008dd578190505b620008f5620008ec8562000793565b83018262000887565b50505b505050565b5f82821c905092915050565b5f6200091a5f1984600802620008fd565b1980831691505092915050565b5f62000934838362000909565b9150826002028217905092915050565b6200094f8262000716565b67ffffffffffffffff8111156200096b576200096a6200039f565b5b6200097782546200074d565b62000984828285620008ad565b5f60209050601f831160018114620009ba575f8415620009a5578287015190505b620009b1858262000927565b86555062000a20565b601f198416620009ca8662000781565b5f5b82811015620009f357848901518255600182019150602085019450602081019050620009cc565b8683101562000a13578489015162000a0f601f89168262000909565b8355505b6001600288020188555050505b505050505050565b5f82825260208201905092915050565b7f536c6f7065206d75737420626520706f736974697665000000000000000000005f82015250565b5f62000a6e60168362000a28565b915062000a7b8262000a38565b602082019050919050565b5f6020820190508181035f83015262000a9f8162000a60565b9050919050565b7f496e697469616c207072696365206d75737420626520706f73697469766500005f82015250565b5f62000adc601e8362000a28565b915062000ae98262000aa6565b602082019050919050565b5f6020820190508181035f83015262000b0d8162000ace565b9050919050565b7f466565206d6178203130250000000000000000000000000000000000000000005f82015250565b5f62000b4a600b8362000a28565b915062000b578262000b14565b602082019050919050565b5f6020820190508181035f83015262000b7b8162000b3c565b9050919050565b7f496e76616c69642066656520636f6c6c6563746f7200000000000000000000005f82015250565b5f62000bb860158362000a28565b915062000bc58262000b82565b602082019050919050565b5f6020820190508181035f83015262000be98162000baa565b9050919050565b7f496e76616c696420726f757465720000000000000000000000000000000000005f82015250565b5f62000c26600e8362000a28565b915062000c338262000bf0565b602082019050919050565b5f6020820190508181035f83015262000c578162000c18565b9050919050565b60805160a05160c05160e0516101005161012051612f7462000ce55f395f81816109fd01528181610adb0152818161102e0152611d2601525f8181610730015281816107aa015261128a01525f61105201525f81816106b301528181611df101528181611e190152611ed001525f8181610f4c015261179601525f6105ff0152612f745ff3fe608060405260043610610169575f3560e01c806385e83f03116100d0578063c415b95c11610089578063e7c2b77211610063578063e7c2b77214610533578063ea41ac051461055d578063ed9772b614610599578063f5ad797c146105c157610170565b8063c415b95c146104a3578063c45a0155146104cd578063dd62ed3e146104f757610170565b806385e83f03146103835780638b0bc501146103bf5780639003adfe146103e957806395d89b4114610413578063a10954fe1461043d578063a9059cbb1461046757610170565b80632a324027116101225780632a32402714610294578063313ce567146102be5780633610724e146102e8578063476343ee1461030457806370a082311461031a57806379502c551461035657610170565b806302d05d3f1461017457806306fdde031461019e5780630758d924146101c8578063095ea7b3146101f257806318160ddd1461022e57806323b872dd1461025857610170565b3661017057005b5f80fd5b34801561017f575f80fd5b506101886105fd565b60405161019591906121b0565b60405180910390f35b3480156101a9575f80fd5b506101b2610621565b6040516101bf9190612253565b60405180910390f35b3480156101d3575f80fd5b506101dc6106b1565b6040516101e991906121b0565b60405180910390f35b3480156101fd575f80fd5b50610218600480360381019061021391906122d4565b6106d5565b604051610225919061232c565b60405180910390f35b348015610239575f80fd5b506102426106f7565b60405161024f9190612354565b60405180910390f35b348015610263575f80fd5b5061027e6004803603810190610279919061236d565b610700565b60405161028b919061232c565b60405180910390f35b34801561029f575f80fd5b506102a861072e565b6040516102b59190612354565b60405180910390f35b3480156102c9575f80fd5b506102d2610752565b6040516102df91906123d8565b60405180910390f35b61030260048036038101906102fd91906123f1565b61075a565b005b34801561030f575f80fd5b506103186109fb565b005b348015610325575f80fd5b50610340600480360381019061033b919061241c565b610ba4565b60405161034d9190612354565b60405180910390f35b348015610361575f80fd5b5061036a610be9565b60405161037a9493929190612447565b60405180910390f35b34801561038e575f80fd5b506103a960048036038101906103a491906123f1565b610d12565b6040516103b69190612354565b60405180910390f35b3480156103ca575f80fd5b506103d3610f4a565b6040516103e09190612354565b60405180910390f35b3480156103f4575f80fd5b506103fd610f6e565b60405161040a9190612354565b60405180910390f35b34801561041e575f80fd5b50610427610f74565b6040516104349190612253565b60405180910390f35b348015610448575f80fd5b50610451611004565b60405161045e9190612354565b60405180910390f35b348015610472575f80fd5b5061048d600480360381019061048891906122d4565b61100a565b60405161049a919061232c565b60405180910390f35b3480156104ae575f80fd5b506104b761102c565b6040516104c491906121b0565b60405180910390f35b3480156104d8575f80fd5b506104e1611050565b6040516104ee91906121b0565b60405180910390f35b348015610502575f80fd5b5061051d60048036038101906105189190612498565b611074565b60405161052a9190612354565b60405180910390f35b34801561053e575f80fd5b506105476110f6565b604051610554919061232c565b60405180910390f35b348015610568575f80fd5b50610583600480360381019061057e91906123f1565b611108565b6040516105909190612354565b60405180910390f35b3480156105a4575f80fd5b506105bf60048036038101906105ba91906124d6565b611225565b005b3480156105cc575f80fd5b506105e760048036038101906105e291906123f1565b611454565b6040516105f49190612354565b60405180910390f35b7f000000000000000000000000000000000000000000000000000000000000000081565b60606003805461063090612541565b80601f016020809104026020016040519081016040528092919081815260200182805461065c90612541565b80156106a75780601f1061067e576101008083540402835291602001916106a7565b820191905f5260205f20905b81548152906001019060200180831161068a57829003601f168201915b5050505050905090565b7f000000000000000000000000000000000000000000000000000000000000000081565b5f806106df61151e565b90506106ec818585611525565b600191505092915050565b5f600254905090565b5f8061070a61151e565b9050610717858285611537565b6107228585856115ca565b60019150509392505050565b7f000000000000000000000000000000000000000000000000000000000000000081565b5f6012905090565b6107626116ba565b5f34116107a4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161079b906125bb565b60405180910390fd5b5f6127107f0000000000000000000000000000000000000000000000000000000000000000346107d49190612606565b6107de9190612674565b90505f81346107ed91906126a4565b90505f6107f982610d12565b90508381101561083e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161083590612721565b60405180910390fd5b5f61084882611454565b90508281111561088d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161088490612789565b60405180910390fd5b6108973383611700565b83600c5f8282546108a891906127a7565b925050819055505f81846108bc91906126a4565b905080346108ca91906126a4565b600a5f8282546108da91906127a7565b925050819055505f811115610993575f3373ffffffffffffffffffffffffffffffffffffffff168260405161090e90612807565b5f6040518083038185875af1925050503d805f8114610948576040519150601f19603f3d011682016040523d82523d5f602084013e61094d565b606091505b5050905080610991576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161098890612865565b60405180910390fd5b505b3373ffffffffffffffffffffffffffffffffffffffff167fa9a40dec7a304e5915d11358b968c1e8d365992abf20f82285d1df1b30c8e24c84846040516109db929190612883565b60405180910390a26109eb61177f565b50505050506109f86117c9565b50565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610a89576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a80906128f4565b60405180910390fd5b5f600c5490505f8111610ad1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ac89061295c565b60405180910390fd5b5f600c819055505f7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1682604051610b1d90612807565b5f6040518083038185875af1925050503d805f8114610b57576040519150601f19603f3d011682016040523d82523d5f602084013e610b5c565b606091505b5050905080610ba0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b97906129c4565b60405180910390fd5b5050565b5f805f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20549050919050565b6006805f018054610bf990612541565b80601f0160208091040260200160405190810160405280929190818152602001828054610c2590612541565b8015610c705780601f10610c4757610100808354040283529160200191610c70565b820191905f5260205f20905b815481529060010190602001808311610c5357829003601f168201915b505050505090806001018054610c8590612541565b80601f0160208091040260200160405190810160405280929190818152602001828054610cb190612541565b8015610cfc5780601f10610cd357610100808354040283529160200191610cfc565b820191905f5260205f20905b815481529060010190602001808311610cdf57829003601f168201915b5050505050908060020154908060030154905084565b5f80610d1c6106f7565b90505f60066002015490505f60066003015490505f8290505f670de0b6b3a76400008585610d4a9190612606565b610d549190612674565b836002610d619190612606565b610d6b91906127a7565b90505f876002610d7b9190612606565b9050670de0b6b3a76400008283610d929190612606565b610d9c9190612674565b670de0b6b3a76400008483610db19190612606565b610dbb9190612674565b670de0b6b3a76400008485610dd09190612606565b610dda9190612674565b610de491906127a7565b1015610e25576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e1c90612a2c565b60405180910390fd5b5f610e81670de0b6b3a7640000808685610e3f9190612606565b610e499190612606565b670de0b6b3a76400008687610e5e9190612606565b610e689190612606565b610e7291906127a7565b610e7c9190612674565b6117d3565b905082811015610ec6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ebd90612a94565b60405180910390fd5b5f670de0b6b3a76400008483610edc91906126a4565b610ee69190612606565b90505f8590505f8111610f2e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f2590612afc565b60405180910390fd5b8082610f3a9190612674565b9950505050505050505050919050565b7f000000000000000000000000000000000000000000000000000000000000000081565b600c5481565b606060048054610f8390612541565b80601f0160208091040260200160405190810160405280929190818152602001828054610faf90612541565b8015610ffa5780601f10610fd157610100808354040283529160200191610ffa565b820191905f5260205f20905b815481529060010190602001808311610fdd57829003601f168201915b5050505050905090565b600a5481565b5f8061101461151e565b90506110218185856115ca565b600191505092915050565b7f000000000000000000000000000000000000000000000000000000000000000081565b7f000000000000000000000000000000000000000000000000000000000000000081565b5f60015f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054905092915050565b600b5f9054906101000a900460ff1681565b5f806111126106f7565b905082811015611157576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161114e90612b64565b60405180910390fd5b5f60066002015490505f60066003015490505f858461117691906126a4565b90505f86836111859190612606565b90505f670de0b6b3a764000088848761119e9190612606565b6111a89190612606565b6111b29190612674565b90505f670de0b6b3a764000060026111ca9190612606565b898a886111d79190612606565b6111e19190612606565b6111eb9190612674565b9050670de0b6b3a764000081838561120391906127a7565b61120d91906127a7565b6112179190612674565b975050505050505050919050565b61122d6116ba565b8161123733610ba4565b1015611278576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161126f90612bcc565b60405180910390fd5b5f61128283611108565b90505f6127107f0000000000000000000000000000000000000000000000000000000000000000836112b49190612606565b6112be9190612674565b90505f81836112cd91906126a4565b905083811015611312576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161130990612c34565b60405180910390fd5b61131c338661183f565b82600a5f82825461132d91906126a4565b9250508190555081600c5f82825461134591906127a7565b925050819055505f3373ffffffffffffffffffffffffffffffffffffffff168260405161137190612807565b5f6040518083038185875af1925050503d805f81146113ab576040519150601f19603f3d011682016040523d82523d5f602084013e6113b0565b606091505b50509050806113f4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113eb90612c9c565b60405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff167fbac9694ac0daa55169abd117086fe32c89401d9a3b15dd1d34e55e0aa4e47a9d878460405161143c929190612883565b60405180910390a2505050506114506117c9565b5050565b5f8061145e6106f7565b90505f60066002015490505f60066003015490505f858261147f9190612606565b90505f670de0b6b3a76400008786866114989190612606565b6114a29190612606565b6114ac9190612674565b90505f670de0b6b3a764000060026114c49190612606565b8889876114d19190612606565b6114db9190612606565b6114e59190612674565b9050670de0b6b3a76400008183856114fd91906127a7565b61150791906127a7565b6115119190612674565b9650505050505050919050565b5f33905090565b61153283838360016118be565b505050565b5f6115428484611074565b90507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8110156115c457818110156115b5578281836040517ffb8f41b20000000000000000000000000000000000000000000000000000000081526004016115ac93929190612cba565b60405180910390fd5b6115c384848484035f6118be565b5b50505050565b5f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff160361163a575f6040517f96c6fd1e00000000000000000000000000000000000000000000000000000000815260040161163191906121b0565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036116aa575f6040517fec442f050000000000000000000000000000000000000000000000000000000081526004016116a191906121b0565b60405180910390fd5b6116b5838383611a8d565b505050565b6002600554036116f6576040517f3ee5aeb500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6002600581905550565b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611770575f6040517fec442f0500000000000000000000000000000000000000000000000000000000815260040161176791906121b0565b60405180910390fd5b61177b5f8383611a8d565b5050565b600b5f9054906101000a900460ff16806117ba57507f0000000000000000000000000000000000000000000000000000000000000000600a54105b6117c7576117c6611ca6565b5b565b6001600581905550565b5f8082036117e3575f905061183a565b5f60026001846117f391906127a7565b6117fd9190612674565b90508291505b8181101561183857809150600281828561181d9190612674565b61182791906127a7565b6118319190612674565b9050611803565b505b919050565b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036118af575f6040517f96c6fd1e0000000000000000000000000000000000000000000000000000000081526004016118a691906121b0565b60405180910390fd5b6118ba825f83611a8d565b5050565b5f73ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff160361192e575f6040517fe602df0500000000000000000000000000000000000000000000000000000000815260040161192591906121b0565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff160361199e575f6040517f94280d6200000000000000000000000000000000000000000000000000000000815260040161199591906121b0565b60405180910390fd5b8160015f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20819055508015611a87578273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92584604051611a7e9190612354565b60405180910390a35b50505050565b5f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603611add578060025f828254611ad191906127a7565b92505081905550611bab565b5f805f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054905081811015611b66578381836040517fe450d38c000000000000000000000000000000000000000000000000000000008152600401611b5d93929190612cba565b60405180910390fd5b8181035f808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2081905550505b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611bf2578060025f8282540392505081905550611c3c565b805f808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f82825401925050819055505b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef83604051611c999190612354565b60405180910390a3505050565b6001600b5f6101000a81548160ff0219169083151502179055505f4790505f600c5482611cd391906126a4565b90505f6127106101f483611ce79190612606565b611cf19190612674565b90505f8183611d0091906126a4565b90505f6002611d0d6106f7565b611d179190612674565b9050611d233082611700565b5f7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1684604051611d6890612807565b5f6040518083038185875af1925050503d805f8114611da2576040519150601f19603f3d011682016040523d82523d5f602084013e611da7565b606091505b5050905080611deb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611de290612d39565b60405180910390fd5b611e16307f000000000000000000000000000000000000000000000000000000000000000084611525565b5f7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663f305d7198530865f803061012c42611e6791906127a7565b6040518863ffffffff1660e01b8152600401611e8896959493929190612d99565b60606040518083038185885af1158015611ea4573d5f803e3d5ffd5b50505050506040513d601f19601f82011682018060405250810190611ec99190612e0c565b925050505f7f000000000000000000000000000000000000000000000000000000000000000090505f8173ffffffffffffffffffffffffffffffffffffffff1663c45a01556040518163ffffffff1660e01b8152600401602060405180830381865afa158015611f3b573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611f5f9190612e70565b90505f8273ffffffffffffffffffffffffffffffffffffffff1663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015611fab573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611fcf9190612e70565b90505f8273ffffffffffffffffffffffffffffffffffffffff1663e6a4390530846040518363ffffffff1660e01b815260040161200d929190612e9b565b602060405180830381865afa158015612028573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061204c9190612e70565b90505f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415801561208957505f85115b1561210d578073ffffffffffffffffffffffffffffffffffffffff1663a9059cbb61dead876040518363ffffffff1660e01b81526004016120cb929190612ec2565b6020604051808303815f875af11580156120e7573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061210b9190612f13565b505b5f600a819055503073ffffffffffffffffffffffffffffffffffffffff167f1c858049e704460ab9455025be4078f9e746e3fd426a56040d06389edb8197db898960405161215c929190612883565b60405180910390a25050505050505050505050565b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f61219a82612171565b9050919050565b6121aa81612190565b82525050565b5f6020820190506121c35f8301846121a1565b92915050565b5f81519050919050565b5f82825260208201905092915050565b5f5b838110156122005780820151818401526020810190506121e5565b5f8484015250505050565b5f601f19601f8301169050919050565b5f612225826121c9565b61222f81856121d3565b935061223f8185602086016121e3565b6122488161220b565b840191505092915050565b5f6020820190508181035f83015261226b818461221b565b905092915050565b5f80fd5b61228081612190565b811461228a575f80fd5b50565b5f8135905061229b81612277565b92915050565b5f819050919050565b6122b3816122a1565b81146122bd575f80fd5b50565b5f813590506122ce816122aa565b92915050565b5f80604083850312156122ea576122e9612273565b5b5f6122f78582860161228d565b9250506020612308858286016122c0565b9150509250929050565b5f8115159050919050565b61232681612312565b82525050565b5f60208201905061233f5f83018461231d565b92915050565b61234e816122a1565b82525050565b5f6020820190506123675f830184612345565b92915050565b5f805f6060848603121561238457612383612273565b5b5f6123918682870161228d565b93505060206123a28682870161228d565b92505060406123b3868287016122c0565b9150509250925092565b5f60ff82169050919050565b6123d2816123bd565b82525050565b5f6020820190506123eb5f8301846123c9565b92915050565b5f6020828403121561240657612405612273565b5b5f612413848285016122c0565b91505092915050565b5f6020828403121561243157612430612273565b5b5f61243e8482850161228d565b91505092915050565b5f6080820190508181035f83015261245f818761221b565b90508181036020830152612473818661221b565b90506124826040830185612345565b61248f6060830184612345565b95945050505050565b5f80604083850312156124ae576124ad612273565b5b5f6124bb8582860161228d565b92505060206124cc8582860161228d565b9150509250929050565b5f80604083850312156124ec576124eb612273565b5b5f6124f9858286016122c0565b925050602061250a858286016122c0565b9150509250929050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b5f600282049050600182168061255857607f821691505b60208210810361256b5761256a612514565b5b50919050565b7f4e6f204554482073656e740000000000000000000000000000000000000000005f82015250565b5f6125a5600b836121d3565b91506125b082612571565b602082019050919050565b5f6020820190508181035f8301526125d281612599565b9050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f612610826122a1565b915061261b836122a1565b9250828202612629816122a1565b915082820484148315176126405761263f6125d9565b5b5092915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b5f61267e826122a1565b9150612689836122a1565b92508261269957612698612647565b5b828204905092915050565b5f6126ae826122a1565b91506126b9836122a1565b92508282039050818111156126d1576126d06125d9565b5b92915050565b7f536c6970706167653a20546f6f2066657720746f6b656e73206f7574000000005f82015250565b5f61270b601c836121d3565b9150612716826126d7565b602082019050919050565b5f6020820190508181035f830152612738816126ff565b9050919050565b7f436f737420657863656564732073656e742076616c75650000000000000000005f82015250565b5f6127736017836121d3565b915061277e8261273f565b602082019050919050565b5f6020820190508181035f8301526127a081612767565b9050919050565b5f6127b1826122a1565b91506127bc836122a1565b92508282019050808211156127d4576127d36125d9565b5b92915050565b5f81905092915050565b50565b5f6127f25f836127da565b91506127fd826127e4565b5f82019050919050565b5f612811826127e7565b9150819050919050565b7f526566756e64206661696c6564000000000000000000000000000000000000005f82015250565b5f61284f600d836121d3565b915061285a8261281b565b602082019050919050565b5f6020820190508181035f83015261287c81612843565b9050919050565b5f6040820190506128965f830185612345565b6128a36020830184612345565b9392505050565b7f4f6e6c792066656520636f6c6c6563746f7200000000000000000000000000005f82015250565b5f6128de6012836121d3565b91506128e9826128aa565b602082019050919050565b5f6020820190508181035f83015261290b816128d2565b9050919050565b7f4e6f206665657320746f207769746864726177000000000000000000000000005f82015250565b5f6129466013836121d3565b915061295182612912565b602082019050919050565b5f6020820190508181035f8301526129738161293a565b9050919050565b7f466565207769746864726177616c206661696c656400000000000000000000005f82015250565b5f6129ae6015836121d3565b91506129b98261297a565b602082019050919050565b5f6020820190508181035f8301526129db816129a2565b9050919050565b7f4d617468206f766572666c6f77000000000000000000000000000000000000005f82015250565b5f612a16600d836121d3565b9150612a21826129e2565b602082019050919050565b5f6020820190508181035f830152612a4381612a0a565b9050919050565b7f53717274206c657373207468616e2062000000000000000000000000000000005f82015250565b5f612a7e6010836121d3565b9150612a8982612a4a565b602082019050919050565b5f6020820190508181035f830152612aab81612a72565b9050919050565b7f536c6f70652063616e6e6f74206265207a65726f0000000000000000000000005f82015250565b5f612ae66014836121d3565b9150612af182612ab2565b602082019050919050565b5f6020820190508181035f830152612b1381612ada565b9050919050565b7f4578636565647320737570706c790000000000000000000000000000000000005f82015250565b5f612b4e600e836121d3565b9150612b5982612b1a565b602082019050919050565b5f6020820190508181035f830152612b7b81612b42565b9050919050565b7f496e73756666696369656e742062616c616e63650000000000000000000000005f82015250565b5f612bb66014836121d3565b9150612bc182612b82565b602082019050919050565b5f6020820190508181035f830152612be381612baa565b9050919050565b7f536c6970706167653a20546f6f206c6974746c6520455448206f7574000000005f82015250565b5f612c1e601c836121d3565b9150612c2982612bea565b602082019050919050565b5f6020820190508181035f830152612c4b81612c12565b9050919050565b7f455448207472616e73666572206661696c6564000000000000000000000000005f82015250565b5f612c866013836121d3565b9150612c9182612c52565b602082019050919050565b5f6020820190508181035f830152612cb381612c7a565b9050919050565b5f606082019050612ccd5f8301866121a1565b612cda6020830185612345565b612ce76040830184612345565b949350505050565b7f466565207472616e73666572206661696c6564000000000000000000000000005f82015250565b5f612d236013836121d3565b9150612d2e82612cef565b602082019050919050565b5f6020820190508181035f830152612d5081612d17565b9050919050565b5f819050919050565b5f819050919050565b5f612d83612d7e612d7984612d57565b612d60565b6122a1565b9050919050565b612d9381612d69565b82525050565b5f60c082019050612dac5f8301896121a1565b612db96020830188612345565b612dc66040830187612d8a565b612dd36060830186612d8a565b612de060808301856121a1565b612ded60a0830184612345565b979650505050505050565b5f81519050612e06816122aa565b92915050565b5f805f60608486031215612e2357612e22612273565b5b5f612e3086828701612df8565b9350506020612e4186828701612df8565b9250506040612e5286828701612df8565b9150509250925092565b5f81519050612e6a81612277565b92915050565b5f60208284031215612e8557612e84612273565b5b5f612e9284828501612e5c565b91505092915050565b5f604082019050612eae5f8301856121a1565b612ebb60208301846121a1565b9392505050565b5f604082019050612ed55f8301856121a1565b612ee26020830184612345565b9392505050565b612ef281612312565b8114612efc575f80fd5b50565b5f81519050612f0d81612ee9565b92915050565b5f60208284031215612f2857612f27612273565b5b5f612f3584828501612eff565b9150509291505056fea2646970667358221220c41dd574089a89090bfd96e01d0051ae093900e39452e3afd4c4fd610cb0a81764736f6c63430008140033a26469706673582212207865e9defcc652663f2c9db310b10144ea7b93dac065fb8976579f2a81cc12c664736f6c63430008140033
Deployed Bytecode
0x6080604052600436106200010e575f3560e01c8063b0d54bcf1162000096578063eabc223f1162000060578063eabc223f146200031a578063f2fde38b1462000350578063f72f863b146200037d578063f9f411d814620003aa5762000116565b8063b0d54bcf1462000262578063b7d86225146200028f578063c415b95c14620002bc578063dce0b4e414620002eb5762000116565b8063715018a611620000d8578063715018a614620001be5780638b0bc50114620001d75780638da5cb5b1462000206578063a42dce8014620002355762000116565b80630758d924146200011a5780632a3240271462000149578063476343ee146200017857806352f5b3ef14620001915762000116565b366200011657005b5f80fd5b34801562000126575f80fd5b5062000131620003ef565b60405162000140919062000c35565b60405180910390f35b34801562000155575f80fd5b506200016062000414565b6040516200016f919062000c6a565b60405180910390f35b34801562000184575f80fd5b506200018f6200041a565b005b3480156200019d575f80fd5b50620001bc6004803603810190620001b6919062000cc5565b62000474565b005b348015620001ca575f80fd5b50620001d562000488565b005b348015620001e3575f80fd5b50620001ee6200049f565b604051620001fd919062000c6a565b60405180910390f35b34801562000212575f80fd5b506200021d620004a5565b6040516200022c919062000c35565b60405180910390f35b34801562000241575f80fd5b506200026060048036038101906200025a919062000d24565b620004cc565b005b3480156200026e575f80fd5b506200028d600480360381019062000287919062000cc5565b6200058a565b005b3480156200029b575f80fd5b50620002ba6004803603810190620002b4919062000cc5565b620005e6565b005b348015620002c8575f80fd5b50620002d3620005fa565b604051620002e2919062000c35565b60405180910390f35b348015620002f7575f80fd5b50620003026200061f565b60405162000311919062000c6a565b60405180910390f35b62000338600480360381019062000332919062000eac565b62000625565b60405162000347919062000c35565b60405180910390f35b3480156200035c575f80fd5b506200037b600480360381019062000375919062000d24565b62000777565b005b34801562000389575f80fd5b50620003a86004803603810190620003a2919062000d24565b62000802565b005b348015620003b6575f80fd5b50620003d56004803603810190620003cf919062000fc0565b620008c0565b604051620003e69392919062001089565b60405180910390f35b60075f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60045481565b6200042462000a3c565b6200042e620004a5565b73ffffffffffffffffffffffffffffffffffffffff166108fc4790811502906040515f60405180830381858888f1935050505015801562000471573d5f803e3d5ffd5b50565b6200047e62000a3c565b8060068190555050565b6200049262000a3c565b6200049d5f62000acc565b565b60065481565b5f805f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b620004d662000a3c565b5f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff160362000547576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200053e9062001120565b60405180910390fd5b8060055f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6200059462000a3c565b6103e8811115620005dc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620005d3906200118e565b60405180910390fd5b8060048190555050565b620005f062000a3c565b8060038190555050565b60055f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60035481565b5f6200063062000b8d565b60035434101562000678576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200066f90620011fc565b60405180910390fd5b5f8787878787873360045460055f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1660065460075f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16604051620006d89062000be4565b620006ee9b9a999897969594939291906200121c565b604051809103905ff08015801562000708573d5f803e3d5ffd5b5090508073ffffffffffffffffffffffffffffffffffffffff167f6596c1670eb3390048d23721809c3da5d3f531375ac0e2cab0f77a808ed643318989336040516200075793929190620012f7565b60405180910390a2809150506200076d62000bd4565b9695505050505050565b6200078162000a3c565b5f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603620007f4575f6040517f1e4fbdf7000000000000000000000000000000000000000000000000000000008152600401620007eb919062000c35565b60405180910390fd5b620007ff8162000acc565b50565b6200080c62000a3c565b5f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036200087d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620008749062001120565b60405180910390fd5b8060075f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6002602052815f5260405f208181548110620008da575f80fd5b905f5260205f2090600302015f9150915050805f015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff169080600101805462000921906200136d565b80601f01602080910402602001604051908101604052809291908181526020018280546200094f906200136d565b80156200099e5780601f1062000974576101008083540402835291602001916200099e565b820191905f5260205f20905b8154815290600101906020018083116200098057829003601f168201915b505050505090806002018054620009b5906200136d565b80601f0160208091040260200160405190810160405280929190818152602001828054620009e3906200136d565b801562000a325780601f1062000a085761010080835404028352916020019162000a32565b820191905f5260205f20905b81548152906001019060200180831162000a1457829003601f168201915b5050505050905083565b62000a4662000bdd565b73ffffffffffffffffffffffffffffffffffffffff1662000a66620004a5565b73ffffffffffffffffffffffffffffffffffffffff161462000aca5762000a8c62000bdd565b6040517f118cdaa700000000000000000000000000000000000000000000000000000000815260040162000ac1919062000c35565b60405180910390fd5b565b5f805f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050815f806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b60026001540362000bca576040517f3ee5aeb500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6002600181905550565b60018081905550565b5f33905090565b613c5980620013a283390190565b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f62000c1d8262000bf2565b9050919050565b62000c2f8162000c11565b82525050565b5f60208201905062000c4a5f83018462000c24565b92915050565b5f819050919050565b62000c648162000c50565b82525050565b5f60208201905062000c7f5f83018462000c59565b92915050565b5f604051905090565b5f80fd5b5f80fd5b62000ca18162000c50565b811462000cac575f80fd5b50565b5f8135905062000cbf8162000c96565b92915050565b5f6020828403121562000cdd5762000cdc62000c8e565b5b5f62000cec8482850162000caf565b91505092915050565b62000d008162000c11565b811462000d0b575f80fd5b50565b5f8135905062000d1e8162000cf5565b92915050565b5f6020828403121562000d3c5762000d3b62000c8e565b5b5f62000d4b8482850162000d0e565b91505092915050565b5f80fd5b5f80fd5b5f601f19601f8301169050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b62000da48262000d5c565b810181811067ffffffffffffffff8211171562000dc65762000dc562000d6c565b5b80604052505050565b5f62000dda62000c85565b905062000de8828262000d99565b919050565b5f67ffffffffffffffff82111562000e0a5762000e0962000d6c565b5b62000e158262000d5c565b9050602081019050919050565b828183375f83830152505050565b5f62000e4662000e408462000ded565b62000dcf565b90508281526020810184848401111562000e655762000e6462000d58565b5b62000e7284828562000e22565b509392505050565b5f82601f83011262000e915762000e9062000d54565b5b813562000ea384826020860162000e30565b91505092915050565b5f805f805f8060c0878903121562000ec95762000ec862000c8e565b5b5f87013567ffffffffffffffff81111562000ee95762000ee862000c92565b5b62000ef789828a0162000e7a565b965050602087013567ffffffffffffffff81111562000f1b5762000f1a62000c92565b5b62000f2989828a0162000e7a565b955050604087013567ffffffffffffffff81111562000f4d5762000f4c62000c92565b5b62000f5b89828a0162000e7a565b945050606087013567ffffffffffffffff81111562000f7f5762000f7e62000c92565b5b62000f8d89828a0162000e7a565b935050608062000fa089828a0162000caf565b92505060a062000fb389828a0162000caf565b9150509295509295509295565b5f806040838503121562000fd95762000fd862000c8e565b5b5f62000fe88582860162000d0e565b925050602062000ffb8582860162000caf565b9150509250929050565b5f81519050919050565b5f82825260208201905092915050565b5f5b838110156200103e57808201518184015260208101905062001021565b5f8484015250505050565b5f620010558262001005565b6200106181856200100f565b9350620010738185602086016200101f565b6200107e8162000d5c565b840191505092915050565b5f6060820190506200109e5f83018662000c24565b8181036020830152620010b2818562001049565b90508181036040830152620010c8818462001049565b9050949350505050565b7f496e76616c6964206164647265737300000000000000000000000000000000005f82015250565b5f62001108600f836200100f565b91506200111582620010d2565b602082019050919050565b5f6020820190508181035f8301526200113981620010fa565b9050919050565b7f4d617820313025000000000000000000000000000000000000000000000000005f82015250565b5f620011766007836200100f565b9150620011838262001140565b602082019050919050565b5f6020820190508181035f830152620011a78162001168565b9050919050565b7f506179206372656174696f6e20666565000000000000000000000000000000005f82015250565b5f620011e46010836200100f565b9150620011f182620011ae565b602082019050919050565b5f6020820190508181035f8301526200121581620011d6565b9050919050565b5f610160820190508181035f83015262001237818e62001049565b905081810360208301526200124d818d62001049565b9050818103604083015262001263818c62001049565b9050818103606083015262001279818b62001049565b90506200128a608083018a62000c59565b6200129960a083018962000c59565b620012a860c083018862000c24565b620012b760e083018762000c59565b620012c761010083018662000c24565b620012d761012083018562000c59565b620012e761014083018462000c24565b9c9b505050505050505050505050565b5f6060820190508181035f83015262001311818662001049565b9050818103602083015262001327818562001049565b905062001338604083018462000c24565b949350505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b5f60028204905060018216806200138557607f821691505b6020821081036200139b576200139a62001340565b5b5091905056fe61014060405234801562000011575f80fd5b5060405162003c5938038062003c59833981810160405281019062000037919062000594565b8a8a81600390816200004a919062000944565b5080600490816200005c919062000944565b50505060016005819055505f8711620000ac576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620000a39062000a86565b60405180910390fd5b5f8611620000f1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620000e89062000af4565b60405180910390fd5b6103e884111562000139576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620001309062000b62565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603620001aa576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620001a19062000bd0565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036200021b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620002129062000c3e565b60405180910390fd5b8473ffffffffffffffffffffffffffffffffffffffff1660808173ffffffffffffffffffffffffffffffffffffffff168152505060405180608001604052808a81526020018981526020018881526020018781525060065f820151815f01908162000287919062000944565b5060208201518160010190816200029f919062000944565b5060408201518160020155606082015181600301559050508361010081815250508273ffffffffffffffffffffffffffffffffffffffff166101208173ffffffffffffffffffffffffffffffffffffffff16815250508160a081815250508073ffffffffffffffffffffffffffffffffffffffff1660c08173ffffffffffffffffffffffffffffffffffffffff16815250503373ffffffffffffffffffffffffffffffffffffffff1660e08173ffffffffffffffffffffffffffffffffffffffff1681525050505050505050505050505062000c5e565b5f604051905090565b5f80fd5b5f80fd5b5f80fd5b5f80fd5b5f601f19601f8301169050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b620003d7826200038f565b810181811067ffffffffffffffff82111715620003f957620003f86200039f565b5b80604052505050565b5f6200040d62000376565b90506200041b8282620003cc565b919050565b5f67ffffffffffffffff8211156200043d576200043c6200039f565b5b62000448826200038f565b9050602081019050919050565b5f5b838110156200047457808201518184015260208101905062000457565b5f8484015250505050565b5f620004956200048f8462000420565b62000402565b905082815260208101848484011115620004b457620004b36200038b565b5b620004c184828562000455565b509392505050565b5f82601f830112620004e057620004df62000387565b5b8151620004f28482602086016200047f565b91505092915050565b5f819050919050565b6200050f81620004fb565b81146200051a575f80fd5b50565b5f815190506200052d8162000504565b92915050565b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f6200055e8262000533565b9050919050565b620005708162000552565b81146200057b575f80fd5b50565b5f815190506200058e8162000565565b92915050565b5f805f805f805f805f805f6101608c8e031215620005b757620005b66200037f565b5b5f8c015167ffffffffffffffff811115620005d757620005d662000383565b5b620005e58e828f01620004c9565b9b505060208c015167ffffffffffffffff81111562000609576200060862000383565b5b620006178e828f01620004c9565b9a505060408c015167ffffffffffffffff8111156200063b576200063a62000383565b5b620006498e828f01620004c9565b99505060608c015167ffffffffffffffff8111156200066d576200066c62000383565b5b6200067b8e828f01620004c9565b98505060806200068e8e828f016200051d565b97505060a0620006a18e828f016200051d565b96505060c0620006b48e828f016200057e565b95505060e0620006c78e828f016200051d565b945050610100620006db8e828f016200057e565b935050610120620006ef8e828f016200051d565b925050610140620007038e828f016200057e565b9150509295989b509295989b9093969950565b5f81519050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b5f60028204905060018216806200076557607f821691505b6020821081036200077b576200077a62000720565b5b50919050565b5f819050815f5260205f209050919050565b5f6020601f8301049050919050565b5f82821b905092915050565b5f60088302620007df7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82620007a2565b620007eb8683620007a2565b95508019841693508086168417925050509392505050565b5f819050919050565b5f6200082c620008266200082084620004fb565b62000803565b620004fb565b9050919050565b5f819050919050565b62000847836200080c565b6200085f620008568262000833565b848454620007ae565b825550505050565b5f90565b6200087562000867565b620008828184846200083c565b505050565b5b81811015620008a9576200089d5f826200086b565b60018101905062000888565b5050565b601f821115620008f857620008c28162000781565b620008cd8462000793565b81016020851015620008dd578190505b620008f5620008ec8562000793565b83018262000887565b50505b505050565b5f82821c905092915050565b5f6200091a5f1984600802620008fd565b1980831691505092915050565b5f62000934838362000909565b9150826002028217905092915050565b6200094f8262000716565b67ffffffffffffffff8111156200096b576200096a6200039f565b5b6200097782546200074d565b62000984828285620008ad565b5f60209050601f831160018114620009ba575f8415620009a5578287015190505b620009b1858262000927565b86555062000a20565b601f198416620009ca8662000781565b5f5b82811015620009f357848901518255600182019150602085019450602081019050620009cc565b8683101562000a13578489015162000a0f601f89168262000909565b8355505b6001600288020188555050505b505050505050565b5f82825260208201905092915050565b7f536c6f7065206d75737420626520706f736974697665000000000000000000005f82015250565b5f62000a6e60168362000a28565b915062000a7b8262000a38565b602082019050919050565b5f6020820190508181035f83015262000a9f8162000a60565b9050919050565b7f496e697469616c207072696365206d75737420626520706f73697469766500005f82015250565b5f62000adc601e8362000a28565b915062000ae98262000aa6565b602082019050919050565b5f6020820190508181035f83015262000b0d8162000ace565b9050919050565b7f466565206d6178203130250000000000000000000000000000000000000000005f82015250565b5f62000b4a600b8362000a28565b915062000b578262000b14565b602082019050919050565b5f6020820190508181035f83015262000b7b8162000b3c565b9050919050565b7f496e76616c69642066656520636f6c6c6563746f7200000000000000000000005f82015250565b5f62000bb860158362000a28565b915062000bc58262000b82565b602082019050919050565b5f6020820190508181035f83015262000be98162000baa565b9050919050565b7f496e76616c696420726f757465720000000000000000000000000000000000005f82015250565b5f62000c26600e8362000a28565b915062000c338262000bf0565b602082019050919050565b5f6020820190508181035f83015262000c578162000c18565b9050919050565b60805160a05160c05160e0516101005161012051612f7462000ce55f395f81816109fd01528181610adb0152818161102e0152611d2601525f8181610730015281816107aa015261128a01525f61105201525f81816106b301528181611df101528181611e190152611ed001525f8181610f4c015261179601525f6105ff0152612f745ff3fe608060405260043610610169575f3560e01c806385e83f03116100d0578063c415b95c11610089578063e7c2b77211610063578063e7c2b77214610533578063ea41ac051461055d578063ed9772b614610599578063f5ad797c146105c157610170565b8063c415b95c146104a3578063c45a0155146104cd578063dd62ed3e146104f757610170565b806385e83f03146103835780638b0bc501146103bf5780639003adfe146103e957806395d89b4114610413578063a10954fe1461043d578063a9059cbb1461046757610170565b80632a324027116101225780632a32402714610294578063313ce567146102be5780633610724e146102e8578063476343ee1461030457806370a082311461031a57806379502c551461035657610170565b806302d05d3f1461017457806306fdde031461019e5780630758d924146101c8578063095ea7b3146101f257806318160ddd1461022e57806323b872dd1461025857610170565b3661017057005b5f80fd5b34801561017f575f80fd5b506101886105fd565b60405161019591906121b0565b60405180910390f35b3480156101a9575f80fd5b506101b2610621565b6040516101bf9190612253565b60405180910390f35b3480156101d3575f80fd5b506101dc6106b1565b6040516101e991906121b0565b60405180910390f35b3480156101fd575f80fd5b50610218600480360381019061021391906122d4565b6106d5565b604051610225919061232c565b60405180910390f35b348015610239575f80fd5b506102426106f7565b60405161024f9190612354565b60405180910390f35b348015610263575f80fd5b5061027e6004803603810190610279919061236d565b610700565b60405161028b919061232c565b60405180910390f35b34801561029f575f80fd5b506102a861072e565b6040516102b59190612354565b60405180910390f35b3480156102c9575f80fd5b506102d2610752565b6040516102df91906123d8565b60405180910390f35b61030260048036038101906102fd91906123f1565b61075a565b005b34801561030f575f80fd5b506103186109fb565b005b348015610325575f80fd5b50610340600480360381019061033b919061241c565b610ba4565b60405161034d9190612354565b60405180910390f35b348015610361575f80fd5b5061036a610be9565b60405161037a9493929190612447565b60405180910390f35b34801561038e575f80fd5b506103a960048036038101906103a491906123f1565b610d12565b6040516103b69190612354565b60405180910390f35b3480156103ca575f80fd5b506103d3610f4a565b6040516103e09190612354565b60405180910390f35b3480156103f4575f80fd5b506103fd610f6e565b60405161040a9190612354565b60405180910390f35b34801561041e575f80fd5b50610427610f74565b6040516104349190612253565b60405180910390f35b348015610448575f80fd5b50610451611004565b60405161045e9190612354565b60405180910390f35b348015610472575f80fd5b5061048d600480360381019061048891906122d4565b61100a565b60405161049a919061232c565b60405180910390f35b3480156104ae575f80fd5b506104b761102c565b6040516104c491906121b0565b60405180910390f35b3480156104d8575f80fd5b506104e1611050565b6040516104ee91906121b0565b60405180910390f35b348015610502575f80fd5b5061051d60048036038101906105189190612498565b611074565b60405161052a9190612354565b60405180910390f35b34801561053e575f80fd5b506105476110f6565b604051610554919061232c565b60405180910390f35b348015610568575f80fd5b50610583600480360381019061057e91906123f1565b611108565b6040516105909190612354565b60405180910390f35b3480156105a4575f80fd5b506105bf60048036038101906105ba91906124d6565b611225565b005b3480156105cc575f80fd5b506105e760048036038101906105e291906123f1565b611454565b6040516105f49190612354565b60405180910390f35b7f000000000000000000000000000000000000000000000000000000000000000081565b60606003805461063090612541565b80601f016020809104026020016040519081016040528092919081815260200182805461065c90612541565b80156106a75780601f1061067e576101008083540402835291602001916106a7565b820191905f5260205f20905b81548152906001019060200180831161068a57829003601f168201915b5050505050905090565b7f000000000000000000000000000000000000000000000000000000000000000081565b5f806106df61151e565b90506106ec818585611525565b600191505092915050565b5f600254905090565b5f8061070a61151e565b9050610717858285611537565b6107228585856115ca565b60019150509392505050565b7f000000000000000000000000000000000000000000000000000000000000000081565b5f6012905090565b6107626116ba565b5f34116107a4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161079b906125bb565b60405180910390fd5b5f6127107f0000000000000000000000000000000000000000000000000000000000000000346107d49190612606565b6107de9190612674565b90505f81346107ed91906126a4565b90505f6107f982610d12565b90508381101561083e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161083590612721565b60405180910390fd5b5f61084882611454565b90508281111561088d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161088490612789565b60405180910390fd5b6108973383611700565b83600c5f8282546108a891906127a7565b925050819055505f81846108bc91906126a4565b905080346108ca91906126a4565b600a5f8282546108da91906127a7565b925050819055505f811115610993575f3373ffffffffffffffffffffffffffffffffffffffff168260405161090e90612807565b5f6040518083038185875af1925050503d805f8114610948576040519150601f19603f3d011682016040523d82523d5f602084013e61094d565b606091505b5050905080610991576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161098890612865565b60405180910390fd5b505b3373ffffffffffffffffffffffffffffffffffffffff167fa9a40dec7a304e5915d11358b968c1e8d365992abf20f82285d1df1b30c8e24c84846040516109db929190612883565b60405180910390a26109eb61177f565b50505050506109f86117c9565b50565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610a89576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a80906128f4565b60405180910390fd5b5f600c5490505f8111610ad1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ac89061295c565b60405180910390fd5b5f600c819055505f7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1682604051610b1d90612807565b5f6040518083038185875af1925050503d805f8114610b57576040519150601f19603f3d011682016040523d82523d5f602084013e610b5c565b606091505b5050905080610ba0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b97906129c4565b60405180910390fd5b5050565b5f805f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20549050919050565b6006805f018054610bf990612541565b80601f0160208091040260200160405190810160405280929190818152602001828054610c2590612541565b8015610c705780601f10610c4757610100808354040283529160200191610c70565b820191905f5260205f20905b815481529060010190602001808311610c5357829003601f168201915b505050505090806001018054610c8590612541565b80601f0160208091040260200160405190810160405280929190818152602001828054610cb190612541565b8015610cfc5780601f10610cd357610100808354040283529160200191610cfc565b820191905f5260205f20905b815481529060010190602001808311610cdf57829003601f168201915b5050505050908060020154908060030154905084565b5f80610d1c6106f7565b90505f60066002015490505f60066003015490505f8290505f670de0b6b3a76400008585610d4a9190612606565b610d549190612674565b836002610d619190612606565b610d6b91906127a7565b90505f876002610d7b9190612606565b9050670de0b6b3a76400008283610d929190612606565b610d9c9190612674565b670de0b6b3a76400008483610db19190612606565b610dbb9190612674565b670de0b6b3a76400008485610dd09190612606565b610dda9190612674565b610de491906127a7565b1015610e25576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e1c90612a2c565b60405180910390fd5b5f610e81670de0b6b3a7640000808685610e3f9190612606565b610e499190612606565b670de0b6b3a76400008687610e5e9190612606565b610e689190612606565b610e7291906127a7565b610e7c9190612674565b6117d3565b905082811015610ec6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ebd90612a94565b60405180910390fd5b5f670de0b6b3a76400008483610edc91906126a4565b610ee69190612606565b90505f8590505f8111610f2e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f2590612afc565b60405180910390fd5b8082610f3a9190612674565b9950505050505050505050919050565b7f000000000000000000000000000000000000000000000000000000000000000081565b600c5481565b606060048054610f8390612541565b80601f0160208091040260200160405190810160405280929190818152602001828054610faf90612541565b8015610ffa5780601f10610fd157610100808354040283529160200191610ffa565b820191905f5260205f20905b815481529060010190602001808311610fdd57829003601f168201915b5050505050905090565b600a5481565b5f8061101461151e565b90506110218185856115ca565b600191505092915050565b7f000000000000000000000000000000000000000000000000000000000000000081565b7f000000000000000000000000000000000000000000000000000000000000000081565b5f60015f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054905092915050565b600b5f9054906101000a900460ff1681565b5f806111126106f7565b905082811015611157576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161114e90612b64565b60405180910390fd5b5f60066002015490505f60066003015490505f858461117691906126a4565b90505f86836111859190612606565b90505f670de0b6b3a764000088848761119e9190612606565b6111a89190612606565b6111b29190612674565b90505f670de0b6b3a764000060026111ca9190612606565b898a886111d79190612606565b6111e19190612606565b6111eb9190612674565b9050670de0b6b3a764000081838561120391906127a7565b61120d91906127a7565b6112179190612674565b975050505050505050919050565b61122d6116ba565b8161123733610ba4565b1015611278576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161126f90612bcc565b60405180910390fd5b5f61128283611108565b90505f6127107f0000000000000000000000000000000000000000000000000000000000000000836112b49190612606565b6112be9190612674565b90505f81836112cd91906126a4565b905083811015611312576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161130990612c34565b60405180910390fd5b61131c338661183f565b82600a5f82825461132d91906126a4565b9250508190555081600c5f82825461134591906127a7565b925050819055505f3373ffffffffffffffffffffffffffffffffffffffff168260405161137190612807565b5f6040518083038185875af1925050503d805f81146113ab576040519150601f19603f3d011682016040523d82523d5f602084013e6113b0565b606091505b50509050806113f4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113eb90612c9c565b60405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff167fbac9694ac0daa55169abd117086fe32c89401d9a3b15dd1d34e55e0aa4e47a9d878460405161143c929190612883565b60405180910390a2505050506114506117c9565b5050565b5f8061145e6106f7565b90505f60066002015490505f60066003015490505f858261147f9190612606565b90505f670de0b6b3a76400008786866114989190612606565b6114a29190612606565b6114ac9190612674565b90505f670de0b6b3a764000060026114c49190612606565b8889876114d19190612606565b6114db9190612606565b6114e59190612674565b9050670de0b6b3a76400008183856114fd91906127a7565b61150791906127a7565b6115119190612674565b9650505050505050919050565b5f33905090565b61153283838360016118be565b505050565b5f6115428484611074565b90507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8110156115c457818110156115b5578281836040517ffb8f41b20000000000000000000000000000000000000000000000000000000081526004016115ac93929190612cba565b60405180910390fd5b6115c384848484035f6118be565b5b50505050565b5f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff160361163a575f6040517f96c6fd1e00000000000000000000000000000000000000000000000000000000815260040161163191906121b0565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036116aa575f6040517fec442f050000000000000000000000000000000000000000000000000000000081526004016116a191906121b0565b60405180910390fd5b6116b5838383611a8d565b505050565b6002600554036116f6576040517f3ee5aeb500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6002600581905550565b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611770575f6040517fec442f0500000000000000000000000000000000000000000000000000000000815260040161176791906121b0565b60405180910390fd5b61177b5f8383611a8d565b5050565b600b5f9054906101000a900460ff16806117ba57507f0000000000000000000000000000000000000000000000000000000000000000600a54105b6117c7576117c6611ca6565b5b565b6001600581905550565b5f8082036117e3575f905061183a565b5f60026001846117f391906127a7565b6117fd9190612674565b90508291505b8181101561183857809150600281828561181d9190612674565b61182791906127a7565b6118319190612674565b9050611803565b505b919050565b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036118af575f6040517f96c6fd1e0000000000000000000000000000000000000000000000000000000081526004016118a691906121b0565b60405180910390fd5b6118ba825f83611a8d565b5050565b5f73ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff160361192e575f6040517fe602df0500000000000000000000000000000000000000000000000000000000815260040161192591906121b0565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff160361199e575f6040517f94280d6200000000000000000000000000000000000000000000000000000000815260040161199591906121b0565b60405180910390fd5b8160015f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20819055508015611a87578273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92584604051611a7e9190612354565b60405180910390a35b50505050565b5f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603611add578060025f828254611ad191906127a7565b92505081905550611bab565b5f805f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054905081811015611b66578381836040517fe450d38c000000000000000000000000000000000000000000000000000000008152600401611b5d93929190612cba565b60405180910390fd5b8181035f808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2081905550505b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611bf2578060025f8282540392505081905550611c3c565b805f808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f82825401925050819055505b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef83604051611c999190612354565b60405180910390a3505050565b6001600b5f6101000a81548160ff0219169083151502179055505f4790505f600c5482611cd391906126a4565b90505f6127106101f483611ce79190612606565b611cf19190612674565b90505f8183611d0091906126a4565b90505f6002611d0d6106f7565b611d179190612674565b9050611d233082611700565b5f7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1684604051611d6890612807565b5f6040518083038185875af1925050503d805f8114611da2576040519150601f19603f3d011682016040523d82523d5f602084013e611da7565b606091505b5050905080611deb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611de290612d39565b60405180910390fd5b611e16307f000000000000000000000000000000000000000000000000000000000000000084611525565b5f7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663f305d7198530865f803061012c42611e6791906127a7565b6040518863ffffffff1660e01b8152600401611e8896959493929190612d99565b60606040518083038185885af1158015611ea4573d5f803e3d5ffd5b50505050506040513d601f19601f82011682018060405250810190611ec99190612e0c565b925050505f7f000000000000000000000000000000000000000000000000000000000000000090505f8173ffffffffffffffffffffffffffffffffffffffff1663c45a01556040518163ffffffff1660e01b8152600401602060405180830381865afa158015611f3b573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611f5f9190612e70565b90505f8273ffffffffffffffffffffffffffffffffffffffff1663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015611fab573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611fcf9190612e70565b90505f8273ffffffffffffffffffffffffffffffffffffffff1663e6a4390530846040518363ffffffff1660e01b815260040161200d929190612e9b565b602060405180830381865afa158015612028573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061204c9190612e70565b90505f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415801561208957505f85115b1561210d578073ffffffffffffffffffffffffffffffffffffffff1663a9059cbb61dead876040518363ffffffff1660e01b81526004016120cb929190612ec2565b6020604051808303815f875af11580156120e7573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061210b9190612f13565b505b5f600a819055503073ffffffffffffffffffffffffffffffffffffffff167f1c858049e704460ab9455025be4078f9e746e3fd426a56040d06389edb8197db898960405161215c929190612883565b60405180910390a25050505050505050505050565b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f61219a82612171565b9050919050565b6121aa81612190565b82525050565b5f6020820190506121c35f8301846121a1565b92915050565b5f81519050919050565b5f82825260208201905092915050565b5f5b838110156122005780820151818401526020810190506121e5565b5f8484015250505050565b5f601f19601f8301169050919050565b5f612225826121c9565b61222f81856121d3565b935061223f8185602086016121e3565b6122488161220b565b840191505092915050565b5f6020820190508181035f83015261226b818461221b565b905092915050565b5f80fd5b61228081612190565b811461228a575f80fd5b50565b5f8135905061229b81612277565b92915050565b5f819050919050565b6122b3816122a1565b81146122bd575f80fd5b50565b5f813590506122ce816122aa565b92915050565b5f80604083850312156122ea576122e9612273565b5b5f6122f78582860161228d565b9250506020612308858286016122c0565b9150509250929050565b5f8115159050919050565b61232681612312565b82525050565b5f60208201905061233f5f83018461231d565b92915050565b61234e816122a1565b82525050565b5f6020820190506123675f830184612345565b92915050565b5f805f6060848603121561238457612383612273565b5b5f6123918682870161228d565b93505060206123a28682870161228d565b92505060406123b3868287016122c0565b9150509250925092565b5f60ff82169050919050565b6123d2816123bd565b82525050565b5f6020820190506123eb5f8301846123c9565b92915050565b5f6020828403121561240657612405612273565b5b5f612413848285016122c0565b91505092915050565b5f6020828403121561243157612430612273565b5b5f61243e8482850161228d565b91505092915050565b5f6080820190508181035f83015261245f818761221b565b90508181036020830152612473818661221b565b90506124826040830185612345565b61248f6060830184612345565b95945050505050565b5f80604083850312156124ae576124ad612273565b5b5f6124bb8582860161228d565b92505060206124cc8582860161228d565b9150509250929050565b5f80604083850312156124ec576124eb612273565b5b5f6124f9858286016122c0565b925050602061250a858286016122c0565b9150509250929050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b5f600282049050600182168061255857607f821691505b60208210810361256b5761256a612514565b5b50919050565b7f4e6f204554482073656e740000000000000000000000000000000000000000005f82015250565b5f6125a5600b836121d3565b91506125b082612571565b602082019050919050565b5f6020820190508181035f8301526125d281612599565b9050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f612610826122a1565b915061261b836122a1565b9250828202612629816122a1565b915082820484148315176126405761263f6125d9565b5b5092915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b5f61267e826122a1565b9150612689836122a1565b92508261269957612698612647565b5b828204905092915050565b5f6126ae826122a1565b91506126b9836122a1565b92508282039050818111156126d1576126d06125d9565b5b92915050565b7f536c6970706167653a20546f6f2066657720746f6b656e73206f7574000000005f82015250565b5f61270b601c836121d3565b9150612716826126d7565b602082019050919050565b5f6020820190508181035f830152612738816126ff565b9050919050565b7f436f737420657863656564732073656e742076616c75650000000000000000005f82015250565b5f6127736017836121d3565b915061277e8261273f565b602082019050919050565b5f6020820190508181035f8301526127a081612767565b9050919050565b5f6127b1826122a1565b91506127bc836122a1565b92508282019050808211156127d4576127d36125d9565b5b92915050565b5f81905092915050565b50565b5f6127f25f836127da565b91506127fd826127e4565b5f82019050919050565b5f612811826127e7565b9150819050919050565b7f526566756e64206661696c6564000000000000000000000000000000000000005f82015250565b5f61284f600d836121d3565b915061285a8261281b565b602082019050919050565b5f6020820190508181035f83015261287c81612843565b9050919050565b5f6040820190506128965f830185612345565b6128a36020830184612345565b9392505050565b7f4f6e6c792066656520636f6c6c6563746f7200000000000000000000000000005f82015250565b5f6128de6012836121d3565b91506128e9826128aa565b602082019050919050565b5f6020820190508181035f83015261290b816128d2565b9050919050565b7f4e6f206665657320746f207769746864726177000000000000000000000000005f82015250565b5f6129466013836121d3565b915061295182612912565b602082019050919050565b5f6020820190508181035f8301526129738161293a565b9050919050565b7f466565207769746864726177616c206661696c656400000000000000000000005f82015250565b5f6129ae6015836121d3565b91506129b98261297a565b602082019050919050565b5f6020820190508181035f8301526129db816129a2565b9050919050565b7f4d617468206f766572666c6f77000000000000000000000000000000000000005f82015250565b5f612a16600d836121d3565b9150612a21826129e2565b602082019050919050565b5f6020820190508181035f830152612a4381612a0a565b9050919050565b7f53717274206c657373207468616e2062000000000000000000000000000000005f82015250565b5f612a7e6010836121d3565b9150612a8982612a4a565b602082019050919050565b5f6020820190508181035f830152612aab81612a72565b9050919050565b7f536c6f70652063616e6e6f74206265207a65726f0000000000000000000000005f82015250565b5f612ae66014836121d3565b9150612af182612ab2565b602082019050919050565b5f6020820190508181035f830152612b1381612ada565b9050919050565b7f4578636565647320737570706c790000000000000000000000000000000000005f82015250565b5f612b4e600e836121d3565b9150612b5982612b1a565b602082019050919050565b5f6020820190508181035f830152612b7b81612b42565b9050919050565b7f496e73756666696369656e742062616c616e63650000000000000000000000005f82015250565b5f612bb66014836121d3565b9150612bc182612b82565b602082019050919050565b5f6020820190508181035f830152612be381612baa565b9050919050565b7f536c6970706167653a20546f6f206c6974746c6520455448206f7574000000005f82015250565b5f612c1e601c836121d3565b9150612c2982612bea565b602082019050919050565b5f6020820190508181035f830152612c4b81612c12565b9050919050565b7f455448207472616e73666572206661696c6564000000000000000000000000005f82015250565b5f612c866013836121d3565b9150612c9182612c52565b602082019050919050565b5f6020820190508181035f830152612cb381612c7a565b9050919050565b5f606082019050612ccd5f8301866121a1565b612cda6020830185612345565b612ce76040830184612345565b949350505050565b7f466565207472616e73666572206661696c6564000000000000000000000000005f82015250565b5f612d236013836121d3565b9150612d2e82612cef565b602082019050919050565b5f6020820190508181035f830152612d5081612d17565b9050919050565b5f819050919050565b5f819050919050565b5f612d83612d7e612d7984612d57565b612d60565b6122a1565b9050919050565b612d9381612d69565b82525050565b5f60c082019050612dac5f8301896121a1565b612db96020830188612345565b612dc66040830187612d8a565b612dd36060830186612d8a565b612de060808301856121a1565b612ded60a0830184612345565b979650505050505050565b5f81519050612e06816122aa565b92915050565b5f805f60608486031215612e2357612e22612273565b5b5f612e3086828701612df8565b9350506020612e4186828701612df8565b9250506040612e5286828701612df8565b9150509250925092565b5f81519050612e6a81612277565b92915050565b5f60208284031215612e8557612e84612273565b5b5f612e9284828501612e5c565b91505092915050565b5f604082019050612eae5f8301856121a1565b612ebb60208301846121a1565b9392505050565b5f604082019050612ed55f8301856121a1565b612ee26020830184612345565b9392505050565b612ef281612312565b8114612efc575f80fd5b50565b5f81519050612f0d81612ee9565b92915050565b5f60208284031215612f2857612f27612273565b5b5f612f3584828501612eff565b9150509291505056fea2646970667358221220c41dd574089a89090bfd96e01d0051ae093900e39452e3afd4c4fd610cb0a81764736f6c63430008140033a26469706673582212207865e9defcc652663f2c9db310b10144ea7b93dac065fb8976579f2a81cc12c664736f6c63430008140033
Loading...
Loading
Loading...
Loading
Loading...
Loading
Net Worth in USD
$0.00
Net Worth in S
Token Allocations
S
100.00%
Multichain Portfolio | 35 Chains
| Chain | Token | Portfolio % | Price | Amount | Value |
|---|---|---|---|---|---|
| SONIC | 100.00% | $0.067351 | 0.002 | $0.000135 |
Loading...
Loading
Loading...
Loading
Loading...
Loading
[ Download: CSV Export ]
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.