Source Code
More Info
Private Name Tags
ContractCreator
TokenTracker
Latest 25 from a total of 417 transactions
| Transaction Hash |
|
Block
|
From
|
To
|
|||||
|---|---|---|---|---|---|---|---|---|---|
| Approve | 39679666 | 54 days ago | IN | 0 ETH | 0.0000001 | ||||
| Approve | 39319541 | 62 days ago | IN | 0 ETH | 0.00000471 | ||||
| Approve | 38183719 | 88 days ago | IN | 0 ETH | 0.00000013 | ||||
| Approve | 36086115 | 137 days ago | IN | 0 ETH | 0.0000001 | ||||
| Approve | 32600763 | 218 days ago | IN | 0 ETH | 0.00000049 | ||||
| Approve | 31959370 | 232 days ago | IN | 0 ETH | 0.00000032 | ||||
| Approve | 31936261 | 233 days ago | IN | 0 ETH | 0.00000012 | ||||
| Approve | 31488377 | 243 days ago | IN | 0 ETH | 0.00000054 | ||||
| Approve | 31419219 | 245 days ago | IN | 0 ETH | 0.00000033 | ||||
| Approve | 31324959 | 247 days ago | IN | 0 ETH | 0.00000014 | ||||
| Approve | 31231892 | 249 days ago | IN | 0 ETH | 0.00000009 | ||||
| Approve | 31100598 | 252 days ago | IN | 0 ETH | 0.00000011 | ||||
| Approve | 30769518 | 260 days ago | IN | 0 ETH | 0.00000011 | ||||
| Approve | 30681809 | 262 days ago | IN | 0 ETH | 0.00000054 | ||||
| Approve | 30170016 | 274 days ago | IN | 0 ETH | 0.00000048 | ||||
| Approve | 30009393 | 277 days ago | IN | 0 ETH | 0.00000016 | ||||
| Approve | 30004708 | 278 days ago | IN | 0 ETH | 0.00000021 | ||||
| Approve | 29862657 | 281 days ago | IN | 0 ETH | 0.00000046 | ||||
| Approve | 29862526 | 281 days ago | IN | 0 ETH | 0.00000056 | ||||
| Approve | 29860816 | 281 days ago | IN | 0 ETH | 0.00000033 | ||||
| Approve | 29860701 | 281 days ago | IN | 0 ETH | 0.00000032 | ||||
| Approve | 29407966 | 291 days ago | IN | 0 ETH | 0.00000131 | ||||
| Approve | 29393438 | 292 days ago | IN | 0 ETH | 0.00000624 | ||||
| Transfer | 29393412 | 292 days ago | IN | 0 ETH | 0.00000174 | ||||
| Approve | 29369259 | 292 days ago | IN | 0 ETH | 0.00000011 |
Latest 25 internal transactions (View All)
| Parent Transaction Hash | Block | From | To | |||
|---|---|---|---|---|---|---|
| 29279499 | 294 days ago | 0.55206608 ETH | ||||
| 29279469 | 294 days ago | 0.00000049 ETH | ||||
| 29279469 | 294 days ago | 0.0000015 ETH | ||||
| 29279469 | 294 days ago | 0.0001 ETH | ||||
| 29219246 | 296 days ago | 0.00000021 ETH | ||||
| 29219246 | 296 days ago | 0.00000066 ETH | ||||
| 29073351 | 299 days ago | 0.00000021 ETH | ||||
| 29073351 | 299 days ago | 0.00000066 ETH | ||||
| 29073294 | 299 days ago | 0.00000034 ETH | ||||
| 29073294 | 299 days ago | 0.00000105 ETH | ||||
| 29073294 | 299 days ago | 0.00007 ETH | ||||
| 29045646 | 300 days ago | 0.00000021 ETH | ||||
| 29045646 | 300 days ago | 0.00000066 ETH | ||||
| 29045551 | 300 days ago | 0.00000021 ETH | ||||
| 29045551 | 300 days ago | 0.00000066 ETH | ||||
| 29042815 | 300 days ago | 0.00000021 ETH | ||||
| 29042815 | 300 days ago | 0.00000066 ETH | ||||
| 29034915 | 300 days ago | 0.00000014 ETH | ||||
| 29034915 | 300 days ago | 0.00000044 ETH | ||||
| 29034897 | 300 days ago | 0.0000099 ETH | ||||
| 29034897 | 300 days ago | 0.00003 ETH | ||||
| 29034897 | 300 days ago | 0.002 ETH | ||||
| 29018076 | 300 days ago | 0.00000049 ETH | ||||
| 29018076 | 300 days ago | 0.0000015 ETH | ||||
| 29018076 | 300 days ago | 0.0001 ETH |
Cross-Chain Transactions
Loading...
Loading
Similar Match Source Code This contract matches the deployed Bytecode of the Source Code for Contract 0x3eeE5446...156628886 The constructor portion of the code might be different and could alter the actual behaviour of the contract
Contract Name:
IdeaToken
Compiler Version
v0.8.20+commit.a1b79de6
Optimization Enabled:
Yes with 200 runs
Other Settings:
shanghai EvmVersion
Contract Source Code (Solidity Standard Json-Input format)
// SPDX-License-Identifier: UNLICENSED
pragma solidity 0.8.20;
import {ERC20} from "./ERC20.sol";
import {IWETH} from "../interfaces/IWETH.sol";
import {IIdeaFactory} from "../interfaces/IIdeaFactory.sol";
import {IOnlyUpToken} from "../interfaces/IOnlyUpToken.sol";
import {Ownable} from "@openzeppelin/contracts/access/Ownable.sol";
/**
* @title IdeaToken - A Self-Contained Liquidity Token
* @notice A token that acts as its own liquidity pool before evolving to Uniswap V3
* @dev Implements:
* 1. Internal liquidity pool before evolution
* 2. Configurable buy/sell taxes (max 25%)
* 3. Fee distribution between owner (40%) and treasury (60%)
* 4. Manual evolution to Uniswap V3 initiated by graduator
* 5. Tax burning mechanism to benefit holders
* @author Robert M.C. Forster, Chiranjibi Poudyal
*/
contract IdeaToken is ERC20, IOnlyUpToken, Ownable {
/* ================================ CONSTANTS ================================ */
uint256 constant DIVISOR = 10_000;
uint256 constant BUFFER = 1e18;
uint256 constant INITIAL_ETH_PER_TOKEN = 1e13;
int24 constant TICK_SPACING = 200;
uint256 constant INITIAL_LIQUIDITY_MINT_RATIO = 4;
/* ================================ STATE VARIABLES ================================ */
IWETH private weth;
IIdeaFactory public factory;
bool public disabled;
uint256 public genesis;
address public token0;
address public token1;
bool private locked;
uint256 private reserve1;
uint256 private reserve0;
uint256 private blockTimestampLast;
/* ================================ CONSTRUCTOR ================================ */
/// @notice Initializes the contract with a owner, token name, and symbol.
/// @dev Sets up initial references, disables airdrop and accumulation periods by default.
/// @param _owner The address designated as the owner of the contract.
/// @param _name The name of the ERC20 token.
/// @param _symbol The symbol of the ERC20 token.
/// @param _weth The address of the WETH contract.
constructor(address _owner, string memory _name, string memory _symbol, address _weth)
ERC20(_name, _symbol)
Ownable(_owner)
{
factory = IIdeaFactory(msg.sender);
genesis = block.timestamp;
weth = IWETH(_weth);
token0 = address(this);
token1 = _weth;
}
/* ================================ MODIFIERS ================================ */
/// @dev Reverts if the contract is disabled (after a certain period).
modifier notDisabled() {
if (disabled) revert MintingDisabled();
_;
}
/// @dev Prevents reentrant calls.
modifier nonReentrant() {
if (locked) revert NoReentrancy();
locked = true;
_;
locked = false;
}
/// @dev Prevents calls from anything other than the factory
modifier onlyFactory() {
if (msg.sender != address(factory)) revert OnlyFactory();
_;
}
/* =========================== EXTERNAL - MAIN FUNCTIONS =========================== */
/// @notice Buys tokens by depositing Ether or WETH, converting them into token shares.
/// @dev Applies buy fees and updates reserves after minting shares.
/// If no Ether is sent, it uses excess WETH reserve in the contract as input.
/// @param _receiver The address receiving the newly minted tokens.
function mint(address _receiver) public payable notDisabled nonReentrant {
uint256 value = msg.value;
if (value > 0) weth.deposit{value: value}();
uint256 ethAmount = weth.balanceOf(address(this)) - reserve1;
uint256 fee = ethAmount * factory.tradeFee() / DIVISOR;
uint256 ethAmtAfterFee = ethAmount - fee;
_sendFees(fee);
uint256 shares = convertToShares(ethAmtAfterFee);
_mint(_receiver, shares);
_updateReserves();
emit Swap(msg.sender, 0, ethAmtAfterFee, shares, 0, _receiver);
}
/// @notice Redeems tokens for Ether or WETH, reducing the caller’s token balance.
/// @dev Applies sell fees and taxes, then withdraws Ether if called directly or
/// transfers WETH if called via a router. Only works when the token is not disabled.
/// @param _receiver The address receiving the redeemed Ether or WETH.
/// @param _tokenAmount The amount of tokens to redeem. If zero, uses the contract’s token balance.
function redeem(address _receiver, uint256 _tokenAmount) public nonReentrant notDisabled {
uint256 tokenAmount = _tokenAmount > 0 ? _tokenAmount : balanceOf(address(this));
address burnFrom = _tokenAmount == 0 ? address(this) : msg.sender;
if (_receiver == address(this)) revert InvalidReceiver();
if (tokenAmount == 0) revert InvalidTokenAmount();
uint256 preTaxEthAmount = convertToAssets(tokenAmount);
uint256 tax = (tokenAmount * factory.mainFromTax()) / DIVISOR;
_burn(burnFrom, tax);
uint256 tokenAmountAfterTax = tokenAmount - tax;
// fee is based on the pre-tax eth amount
uint256 fee = preTaxEthAmount * factory.tradeFee() / DIVISOR;
_sendFees(fee);
// actual eth amout to redeem
uint256 ethAmount = convertToAssets(tokenAmountAfterTax);
ethAmount -= fee;
_burn(burnFrom, tokenAmount - tax);
// helps with attackers
ethAmount += weth.balanceOf(address(this)) + fee - reserve1;
if (_tokenAmount == 0) {
weth.transfer(_receiver, ethAmount);
} else {
weth.withdraw(ethAmount);
payable(_receiver).transfer(ethAmount);
}
_updateReserves();
emit Swap(msg.sender, tokenAmountAfterTax, 0, 0, ethAmount, _receiver);
}
/* =========================== EXTERNAL - UNI V2 COMPATIBILITY =========================== */
/// @notice Uni V2 style swap function.
/// @dev If amount1Out > 0 and amount0Out == 0, acts as a buy (mint). If reversed, acts as a sell (redeem).
/// @param amount0Out The token amount (OnlyUpToken) to send out.
/// @param amount1Out The token amount (Ether-based) to send out.
/// @param to The address receiving the output tokens.
function swap(uint256 amount0Out, uint256 amount1Out, address to, bytes calldata) external payable {
if (amount1Out > 0 && amount0Out == 0) {
mint(to);
} else if (amount0Out > 0 && amount1Out == 0) {
redeem(to, amount0Out);
} else {
revert InvalidSwapParameters();
}
}
receive() external payable {}
/* ================================ VIEW FUNCTIONS ================================ */
/// @notice Converts a given token amount into its underlying Ether value.
/// @param _tokenAmount The amount of tokens.
/// @return ethAmount The corresponding amount of Ether-based assets.
function convertToAssets(uint256 _tokenAmount) public view returns (uint256 ethAmount) {
uint256 ethPerToken = _totalSupply == 0 ? INITIAL_ETH_PER_TOKEN : (reserve1 * BUFFER) / _totalSupply;
ethAmount = (_tokenAmount * ethPerToken) / BUFFER;
}
/// @notice Converts a given Ether amount into token shares.
/// @param _ethAmount The amount of Ether-based assets.
/// @return tokenAmount The corresponding token share amount.
function convertToShares(uint256 _ethAmount) public view returns (uint256 tokenAmount) {
uint256 ethPerToken = _totalSupply == 0 ? INITIAL_ETH_PER_TOKEN : ((reserve1 * BUFFER) / _totalSupply);
tokenAmount = (_ethAmount * BUFFER) / ethPerToken;
}
/// @notice Returns the current reserves and last block timestamp.
/// @return _reserve0 The reserve of the main token supply.
/// @return _reserve1 The reserve of the Ether-based asset (WETH).
/// @return _blockTimestampLast The last timestamp the reserves were updated.
function getReserves() public view returns (uint112 _reserve0, uint112 _reserve1, uint32 _blockTimestampLast) {
_reserve0 = uint112(reserve0);
_reserve1 = uint112(reserve1);
_blockTimestampLast = uint32(blockTimestampLast);
}
/// @notice Calculates the tax amount for a token transfer between two addresses
/// @dev This is a public wrapper around the internal _determineTax function
function determineTax(address _from, address _to, uint256 _value) public view returns (uint256) {
return _determineTax(_from, _to, _value);
}
/* =========================== VIEW - UNI V2 COMPATIBILITY =========================== */
/// @notice Returns the output amount for a given input, emulating Uni V2 `getAmountOut`.
/// @param _amountIn The input amount.
/// @param _reserveIn The reserve corresponding to the input token.
/// @return amountOut The output amount after taxes and fees.
function getAmountOut(uint256 _amountIn, uint256 _reserveIn, uint256) public view returns (uint256 amountOut) {
if (_reserveIn != reserve1 && _reserveIn != reserve0) revert InvalidReserveIn();
address tokenIn = _reserveIn == reserve1 ? address(weth) : address(this);
if (tokenIn == address(this)) {
uint256 preTaxEthAmount = convertToAssets(_amountIn);
uint256 taxAmt = (_amountIn * factory.mainToTax()) / DIVISOR;
uint256 actualAmt = _amountIn - taxAmt;
uint256 ethPerToken =
_totalSupply == 0 ? INITIAL_ETH_PER_TOKEN : (reserve1 * BUFFER) / (_totalSupply - taxAmt);
uint256 ethAmount = (actualAmt * ethPerToken) / BUFFER;
uint256 fee = (preTaxEthAmount * factory.tradeFee()) / DIVISOR;
amountOut = ethAmount - fee;
} else {
uint256 taxAmt = (_amountIn * factory.mainFromTax()) / DIVISOR;
uint256 actualAmt = _amountIn - taxAmt;
uint256 tokenAmount = convertToShares(actualAmt); // converts WETH -> mainTokenShares
uint256 fee = (tokenAmount * factory.tradeFee()) / DIVISOR;
amountOut = tokenAmount - fee;
}
}
/// @notice Returns the input amount required for a given output, emulating Uni V2 `getAmountIn`.
/// @notice when tokenIn is Asset, the function overestimates the amountIn, else it's correct
/// @notice (this function is just for uni v2 compatibility)
/// @param _amountOut The desired output amount.
/// @param _reserveIn The reserve corresponding to the input token.
/// @return amountIn The input amount required to achieve the given output after taxes and fees.
function getAmountIn(uint256 _amountOut, uint256 _reserveIn, uint256) public view returns (uint256 amountIn) {
if (_reserveIn != reserve1 && _reserveIn != reserve0) revert InvalidReserveIn();
address tokenIn = _reserveIn == reserve1 ? address(weth) : address(this);
uint256 tradeFee = factory.tradeFee();
uint256 mainFromTax = factory.mainFromTax();
uint256 mainToTax = factory.mainToTax();
if (tokenIn == address(this)) {
uint256 assetsNeeded = (_amountOut * DIVISOR) / (DIVISOR - tradeFee);
uint256 sharesNeeded = convertToShares(assetsNeeded); // converts WETH -> mainTokenShares
amountIn = (sharesNeeded * DIVISOR) / (DIVISOR - mainToTax);
} else {
uint256 sharesNeeded = (_amountOut * DIVISOR) / (DIVISOR - tradeFee);
uint256 assetsNeeded = convertToAssets(sharesNeeded); // converts mainTokenShares -> WETH
amountIn = (assetsNeeded * DIVISOR) / (DIVISOR - mainFromTax);
}
}
/* ================================ INTERNAL FUNCTIONS ================================ */
/// @dev Sends fees to the owner and treasury according to the factory’s fee distribution.
/// @param _amount The amount of Ether-based fees to distribute.
function _sendFees(uint256 _amount) internal {
weth.withdraw(_amount);
(address treasury,, uint256 treasuryShare) = factory.feeShares();
payable(treasury).transfer((_amount * treasuryShare) / DIVISOR);
}
/// @dev Updates the internal reserves and timestamp. Called after minting/burning.
function _updateReserves() internal {
reserve1 = weth.balanceOf(address(this));
reserve0 = _totalSupply;
blockTimestampLast = block.timestamp;
}
/// @dev Internal accounting hook overriding `_update` in ERC20. Applies taxes and points updates on transfers.
/// @param from The sender address.
/// @param to The recipient address.
/// @param value The transferred amount.
function _update(address from, address to, uint256 value) internal virtual override {
uint256 tax;
if (!disabled) {
tax = _determineTax(from, to, value);
// burn the taxes so that holders get benefited from the tax
if (tax > 0) {
_awardTaxes(from, tax);
}
}
// Final value to be received by address.
uint256 receiveValue = value - tax;
if (from == address(0)) {
_totalSupply += receiveValue;
} else {
uint256 fromBalance = _balances[from];
if (fromBalance < receiveValue) revert ERC20InsufficientBalance(from, fromBalance, receiveValue);
unchecked {
_balances[from] = fromBalance - receiveValue;
}
}
if (to == address(0)) {
unchecked {
_totalSupply -= receiveValue;
}
} else {
unchecked {
_balances[to] += receiveValue;
}
}
emit Transfer(from, to, receiveValue);
}
/// @dev Determines the tax amount for a given transfer.
/// @param _from The sender address.
/// @param _to The recipient address.
/// @param _value The transfer amount.
/// @return taxAmount The calculated tax.
function _determineTax(address _from, address _to, uint256 _value) internal view returns (uint256 taxAmount) {
if (_to == address(this)) return 0;
(uint256 fromTax, uint256 toTax) = factory.getTaxes(_from, _to);
taxAmount += (_value * fromTax) / DIVISOR;
taxAmount += (_value * toTax) / DIVISOR;
}
/// @dev Burns the taxed amount and updates reserves, benefiting holders by increasing asset per share.
/// @param _from The address from which tax is collected.
/// @param _amount The tax amount to burn.
function _awardTaxes(address _from, uint256 _amount) internal {
address to = address(this);
if (_from != address(0)) {
_balances[_from] -= _amount;
_totalSupply -= _amount;
emit Transfer(_from, to, _amount);
emit Transfer(to, _from, _amount);
} else {
emit Transfer(address(0), to, _amount);
emit Transfer(to, address(0), _amount);
}
}
/// @notice Simplified buyback and burn mechanism. Converts Ether to WETH and updates reserves.
function buybackAndBurn() external payable onlyOwner {
if (msg.value > 0) weth.deposit{value: msg.value}();
_updateReserves();
}
/**
* @notice Graduates token to Uniswap V3 liquidity positions
* @dev External function that:
* 1. Disables further minting/redeeming
* 2. Mints additional supply based on graduationMintRatio
* 3. Sends collected fees to the builder
* 4. Transfers all WETH to factory
* 5. Creates two Uniswap V3 positions:
* - Token-only position with price buffer
* - WETH-only position for concentrated liquidity
* @param _builder The address to send the fees to
* @param _builderGraduationMintShare The percentage of the minted tokens to send to the builder
* @param _ideaPersonGraduationMintShare The percentage of the minted tokens to send to the idea person
*/
function graduate(
address payable _builder,
uint256 _builderGraduationMintShare,
uint256 _ideaPersonGraduationMintShare
) external onlyFactory {
disabled = true;
emit Disable(address(this), block.timestamp);
// send all `eth` balance of this contract to the builder
(bool success,) = _builder.call{value: address(this).balance}("");
if (!success) revert BuilderTransferFailed();
uint256 mintAmount = (_totalSupply * factory.graduationMintRatio()) / DIVISOR;
uint256 ideaPersonAmount = (mintAmount * _ideaPersonGraduationMintShare) / DIVISOR;
uint256 builderAmount = (mintAmount * _builderGraduationMintShare) / DIVISOR;
uint256 liquidityAmount = mintAmount - ideaPersonAmount - builderAmount;
// mint graduationMintRatio * current supply to factory
_mint(address(factory), liquidityAmount);
_mint(owner(), ideaPersonAmount);
_mint(_builder, builderAmount);
// add liquidity to Sushiswap V3 Pool
uint256 wethAmount = weth.balanceOf(address(this));
weth.transfer(address(factory), wethAmount);
factory.addInitialLiquidity(mintAmount, wethAmount, _builder);
// renounce ownership
_transferOwnership(address(0));
emit Evolve(address(this), block.timestamp);
}
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v5.0.0) (token/ERC20/ERC20.sol)
pragma solidity 0.8.20;
import {IERC20} from "@openzeppelin/contracts/token/ERC20/IERC20.sol";
import {IERC20Metadata} from "@openzeppelin/contracts/token/ERC20/extensions/IERC20Metadata.sol";
import {Context} from "@openzeppelin/contracts/utils/Context.sol";
interface IERC20Errors {
error ERC20InvalidSender(address sender);
error ERC20InvalidReceiver(address receiver);
error ERC20InvalidApprover(address approver);
error ERC20InvalidSpender(address spender);
error ERC20InsufficientBalance(address owner, uint256 balance, uint256 value);
error ERC20InsufficientAllowance(address spender, uint256 allowance, uint256 value);
}
/**
* @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) internal _balances;
mapping(address account => mapping(address spender => uint256)) private _allowances;
uint256 internal _totalSupply;
string private _name;
string private _symbol;
/**
* @dev Sets the values for {name} and {symbol}.
*
* All two of these 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;
}
/**
* @dev See {IERC20-totalSupply}.
*/
function totalSupply() public view virtual returns (uint256) {
return _totalSupply;
}
/**
* @dev See {IERC20-balanceOf}.
*/
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;
}
/**
* @dev See {IERC20-allowance}.
*/
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
pragma solidity 0.8.20;
interface IWETH {
function deposit() external payable;
function transfer(address to, uint256 value) external returns (bool);
function withdraw(uint256) external;
function balanceOf(address) external view returns (uint256);
}// SPDX-License-Identifier: UNLICENSED
pragma solidity ^0.8.20;
interface IIdeaFactory {
function createToken(string memory name, string memory symbol) external returns (address token);
function tradeFee() external view returns (uint256);
function mainToTax() external view returns (uint256);
function mainFromTax() external view returns (uint256);
function creatorShare() external view returns (uint256);
function treasuryShare() external view returns (uint256);
function ownerGraduationMintShare() external view returns (uint256);
function feeShares() external view returns (address treasury, uint256 creatorShare, uint256 treasuryShare);
function getTaxes(address _from, address _to) external view returns (uint256 fromTax, uint256 toTax);
function addInitialLiquidity(uint256 _reserve0, uint256 _reserve1, address _builder) external;
function tokenPriceBuffer() external view returns (int256);
function graduationMintRatio() external view returns (uint256);
function minWethToGraduate() external view returns (uint256);
}// SPDX-License-Identifier: UNLICENSED
pragma solidity 0.8.20;
interface IOnlyUpToken {
/// @notice Thrown when minting is disabled
error MintingDisabled();
/// @notice Thrown when reentrancy is detected
error NoReentrancy();
/// @notice Thrown when token is not yet eligible for disabling
error DisableTimeNotReached();
/// @notice Thrown when airdrop token is invalid
error InvalidAirdropToken();
/// @notice Thrown when token must be disabled before airdrop
error TokenNotDisabled();
/// @notice Thrown when token amount is invalid
error InvalidTokenAmount();
/// @notice Thrown when minimum amount of WETH to graduate is not met
error MinWethToGraduate();
/// @notice Thrown when receiver is invalid
error InvalidReceiver();
/// @notice Thrown when swap parameters are invalid
error InvalidSwapParameters();
/// @notice Thrown when airdrop is not initiated
error AirdropNotInitiated();
/// @notice Thrown when transfer is restricted
error RestrictedTransfer();
/// @notice Thrown when airdrop period is invalid
error InvalidAirdropPeriod();
/// @notice Thrown when reserve is invalid
error InvalidReserveIn();
/// @notice Thrown when sender is invalid
error InvalidSender();
/// @notice thrown when caller is not the factory
error OnlyFactory();
/// @notice Thrown when builder transfer fails
error BuilderTransferFailed();
/* ================================ EVENTS ================================ */
/// @notice Emitted when the owner burns tokens.
/// @param sender The address that initiated the burn.
/// @param amount The amount of tokens burned.
event OwnerBurn(address indexed sender, uint256 amount);
/// @notice Emitted when the token evolves to a normal ERC20.
/// @param token The address of the token.
/// @param timestamp The timestamp of the evolve.
event Evolve(address indexed token, uint256 timestamp);
/// @notice Emitted on swaps, mimicking a Uni V2 pool interface.
/// @param sender The address initiating the swap.
/// @param amount0In The amount of Ether-based asset input.
/// @param amount1In The amount of token input.
/// @param amount0Out The amount of Ether-based asset output.
/// @param amount1Out The amount of token output.
/// @param to The recipient address of the output.
event Swap(
address indexed sender,
uint256 amount0In,
uint256 amount1In,
uint256 amount0Out,
uint256 amount1Out,
address indexed to
);
/// @notice Emitted when liquidity is minted (not traditionally used here, but for Uni V2 compatibility).
/// @param sender The address minting liquidity.
/// @param amount0 The amount of Ether-based liquidity added.
/// @param amount1 The amount of token liquidity added.
event Mint(address indexed sender, uint256 amount0, uint256 amount1);
/// @notice Emitted when liquidity is burned (not traditionally used here, but for Uni V2 compatibility).
/// @param sender The address burning liquidity.
/// @param amount0 The amount of Ether-based liquidity removed.
/// @param amount1 The amount of token liquidity removed.
event Burn(address indexed sender, uint256 amount0, uint256 amount1);
/// @notice Emitted when the token is disabled.
/// @param sender The address that initiated the disable.
/// @param timestamp The timestamp of the disable.
event Disable(address indexed sender, uint256 timestamp);
/* ================================ FUNCTIONS ================================ */
/// @notice Mints new tokens by depositing ETH or WETH
/// @dev Converts the input ETH/WETH to token shares based on current ratio
/// @param _receiver The address that will receive the minted tokens
function mint(address _receiver) external payable;
/// @notice Redeems tokens for ETH/WETH
/// @dev Burns tokens and returns corresponding ETH/WETH amount minus fees
/// @param _receiver The address that will receive the ETH/WETH
/// @param _tokenAmount The amount of tokens to redeem
function redeem(address _receiver, uint256 _tokenAmount) external;
/// @notice Performs a swap operation (UniswapV2 compatibility)
/// @dev Handles both token minting and redemption based on output parameters
/// @param amount0Out The amount of ETH/WETH to output
/// @param amount1Out The amount of tokens to output
/// @param to The recipient address
/// @param data Additional calldata (unused, for V2 compatibility)
function swap(uint256 amount0Out, uint256 amount1Out, address to, bytes calldata data) external payable;
/// @notice Calculates the tax amount for a transfer
/// @dev Uses factory tax settings to determine the tax
/// @param _from Source address
/// @param _to Destination address
/// @param _value Transfer amount
/// @return The calculated tax amount
function determineTax(address _from, address _to, uint256 _value) external view returns (uint256);
/// @notice Gets the current reserves of the token and WETH
/// @dev Used for price calculations and V2 compatibility
/// @return reserve0 The token reserve
/// @return reserve1 The WETH reserve
/// @return blockTimestampLast The timestamp of the last update
function getReserves() external view returns (uint112 reserve0, uint112 reserve1, uint32 blockTimestampLast);
/// @notice Calculates the amount of tokens to receive for a given ETH input
/// @param _amountIn The amount of ETH to swap
/// @param _reserve0 Current token reserve
/// @param _reserve1 Current WETH reserve
/// @return The amount of tokens to receive
function getAmountOut(uint256 _amountIn, uint256 _reserve0, uint256 _reserve1) external view returns (uint256);
/// @notice Calculates the amount of ETH needed for a given token output
/// @param _amountOut The desired amount of tokens
/// @param _reserve0 Current token reserve
/// @param _reserve1 Current WETH reserve
/// @return The amount of ETH needed
function getAmountIn(uint256 _amountOut, uint256 _reserve0, uint256 _reserve1) external view returns (uint256);
}// 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.0.0) (token/ERC20/IERC20.sol)
pragma solidity ^0.8.20;
/**
* @dev Interface of the ERC20 standard as defined in the EIP.
*/
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.0.0) (token/ERC20/extensions/IERC20Metadata.sol)
pragma solidity ^0.8.20;
import {IERC20} from "../IERC20.sol";
/**
* @dev Interface for the optional metadata functions from the ERC20 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.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;
}
}{
"remappings": [
"@openzeppelin/contracts/=lib/openzeppelin-contracts/contracts/",
"@openzeppelin/contracts-upgradeable/=lib/openzeppelin-contracts-upgradeable/contracts/",
"forge-std/=lib/forge-std/src/",
"solmate/=lib/solmate/src/",
"@chainlink/contracts/=lib/chainlink-brownie-contracts/contracts/",
"chainlink-brownie-contracts/=lib/chainlink-brownie-contracts/",
"ds-test/=lib/solmate/lib/ds-test/src/",
"erc4626-tests/=lib/openzeppelin-contracts-upgradeable/lib/erc4626-tests/",
"openzeppelin-contracts-upgradeable/=lib/openzeppelin-contracts-upgradeable/",
"openzeppelin-contracts/=lib/openzeppelin-contracts/"
],
"optimizer": {
"enabled": true,
"runs": 200
},
"metadata": {
"useLiteralContent": false,
"bytecodeHash": "ipfs",
"appendCBOR": true
},
"outputSelection": {
"*": {
"*": [
"evm.bytecode",
"evm.deployedBytecode",
"devdoc",
"userdoc",
"metadata",
"abi"
]
}
},
"evmVersion": "shanghai",
"viaIR": false,
"libraries": {}
}Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
Contract ABI
API[{"inputs":[{"internalType":"address","name":"_owner","type":"address"},{"internalType":"string","name":"_name","type":"string"},{"internalType":"string","name":"_symbol","type":"string"},{"internalType":"address","name":"_weth","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"AirdropNotInitiated","type":"error"},{"inputs":[],"name":"BuilderTransferFailed","type":"error"},{"inputs":[],"name":"DisableTimeNotReached","type":"error"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"allowance","type":"uint256"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"ERC20InsufficientAllowance","type":"error"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"balance","type":"uint256"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"ERC20InsufficientBalance","type":"error"},{"inputs":[{"internalType":"address","name":"approver","type":"address"}],"name":"ERC20InvalidApprover","type":"error"},{"inputs":[{"internalType":"address","name":"receiver","type":"address"}],"name":"ERC20InvalidReceiver","type":"error"},{"inputs":[{"internalType":"address","name":"sender","type":"address"}],"name":"ERC20InvalidSender","type":"error"},{"inputs":[{"internalType":"address","name":"spender","type":"address"}],"name":"ERC20InvalidSpender","type":"error"},{"inputs":[],"name":"InvalidAirdropPeriod","type":"error"},{"inputs":[],"name":"InvalidAirdropToken","type":"error"},{"inputs":[],"name":"InvalidReceiver","type":"error"},{"inputs":[],"name":"InvalidReserveIn","type":"error"},{"inputs":[],"name":"InvalidSender","type":"error"},{"inputs":[],"name":"InvalidSwapParameters","type":"error"},{"inputs":[],"name":"InvalidTokenAmount","type":"error"},{"inputs":[],"name":"MinWethToGraduate","type":"error"},{"inputs":[],"name":"MintingDisabled","type":"error"},{"inputs":[],"name":"NoReentrancy","type":"error"},{"inputs":[],"name":"OnlyFactory","type":"error"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"OwnableInvalidOwner","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"OwnableUnauthorizedAccount","type":"error"},{"inputs":[],"name":"RestrictedTransfer","type":"error"},{"inputs":[],"name":"TokenNotDisabled","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"sender","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount0","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amount1","type":"uint256"}],"name":"Burn","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"sender","type":"address"},{"indexed":false,"internalType":"uint256","name":"timestamp","type":"uint256"}],"name":"Disable","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"token","type":"address"},{"indexed":false,"internalType":"uint256","name":"timestamp","type":"uint256"}],"name":"Evolve","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"sender","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount0","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amount1","type":"uint256"}],"name":"Mint","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"sender","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"OwnerBurn","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"sender","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount0In","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amount1In","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amount0Out","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amount1Out","type":"uint256"},{"indexed":true,"internalType":"address","name":"to","type":"address"}],"name":"Swap","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"buybackAndBurn","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenAmount","type":"uint256"}],"name":"convertToAssets","outputs":[{"internalType":"uint256","name":"ethAmount","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_ethAmount","type":"uint256"}],"name":"convertToShares","outputs":[{"internalType":"uint256","name":"tokenAmount","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_from","type":"address"},{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_value","type":"uint256"}],"name":"determineTax","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"disabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"factory","outputs":[{"internalType":"contract IIdeaFactory","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"genesis","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amountOut","type":"uint256"},{"internalType":"uint256","name":"_reserveIn","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"getAmountIn","outputs":[{"internalType":"uint256","name":"amountIn","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amountIn","type":"uint256"},{"internalType":"uint256","name":"_reserveIn","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"getAmountOut","outputs":[{"internalType":"uint256","name":"amountOut","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getReserves","outputs":[{"internalType":"uint112","name":"_reserve0","type":"uint112"},{"internalType":"uint112","name":"_reserve1","type":"uint112"},{"internalType":"uint32","name":"_blockTimestampLast","type":"uint32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address payable","name":"_builder","type":"address"},{"internalType":"uint256","name":"_builderGraduationMintShare","type":"uint256"},{"internalType":"uint256","name":"_ideaPersonGraduationMintShare","type":"uint256"}],"name":"graduate","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_receiver","type":"address"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_receiver","type":"address"},{"internalType":"uint256","name":"_tokenAmount","type":"uint256"}],"name":"redeem","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount0Out","type":"uint256"},{"internalType":"uint256","name":"amount1Out","type":"uint256"},{"internalType":"address","name":"to","type":"address"},{"internalType":"bytes","name":"","type":"bytes"}],"name":"swap","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"token0","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"token1","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]Contract Creation Code
0x608060405234801562000010575f80fd5b50604051620027ca380380620027ca83398101604081905262000033916200020b565b838383600362000044838262000322565b50600462000053828262000322565b5050506001600160a01b0381166200008457604051631e4fbdf760e01b81525f600482015260240160405180910390fd5b6200008f81620000e0565b50600780546001600160a01b0319908116331790915542600855600680546001600160a01b03939093169282168317905560098054821630179055600a8054909116909117905550620003ea915050565b600580546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a35050565b80516001600160a01b038116811462000148575f80fd5b919050565b634e487b7160e01b5f52604160045260245ffd5b5f82601f83011262000171575f80fd5b81516001600160401b03808211156200018e576200018e6200014d565b604051601f8301601f19908116603f01168101908282118183101715620001b957620001b96200014d565b81604052838152602092508683858801011115620001d5575f80fd5b5f91505b83821015620001f85785820183015181830184015290820190620001d9565b5f93810190920192909252949350505050565b5f805f80608085870312156200021f575f80fd5b6200022a8562000131565b60208601519094506001600160401b038082111562000247575f80fd5b620002558883890162000161565b945060408701519150808211156200026b575f80fd5b506200027a8782880162000161565b9250506200028b6060860162000131565b905092959194509250565b600181811c90821680620002ab57607f821691505b602082108103620002ca57634e487b7160e01b5f52602260045260245ffd5b50919050565b601f8211156200031d575f81815260208120601f850160051c81016020861015620002f85750805b601f850160051c820191505b81811015620003195782815560010162000304565b5050505b505050565b81516001600160401b038111156200033e576200033e6200014d565b62000356816200034f845462000296565b84620002d0565b602080601f8311600181146200038c575f8415620003745750858301515b5f19600386901b1c1916600185901b17855562000319565b5f85815260208120601f198616915b82811015620003bc578886015182559484019460019091019084016200039b565b5085821015620003da57878501515f19600388901b60f8161c191681555b5050505050600190811b01905550565b6123d280620003f85f395ff3fe6080604052600436106101b2575f3560e01c806385f8c259116100e7578063c6e6f59211610087578063dd62ed3e11610062578063dd62ed3e146104d9578063ee0708051461051d578063f2fde38b1461053d578063fb210b201461055c575f80fd5b8063c6e6f5921461047c578063cff733f61461049b578063d21220a7146104ba575f80fd5b80639ca31bfb116100c25780639ca31bfb1461040a578063a7f0b3de14610429578063a9059cbb1461043e578063c45a01551461045d575f80fd5b806385f8c259146103ba5780638da5cb5b146103d957806395d89b41146103f6575f80fd5b806318160ddd11610152578063313ce5671161012d578063313ce567146103445780636a6278421461035f57806370a0823114610372578063715018a6146103a6575f80fd5b806318160ddd146102f25780631e9a69501461030657806323b872dd14610325575f80fd5b806307a2d13a1161018d57806307a2d13a146102255780630902f1ac14610244578063095ea7b31461028c5780630dfe1681146102bb575f80fd5b8063022c0d9f146101bd578063054d50d4146101d257806306fdde0314610204575f80fd5b366101b957005b5f80fd5b6101d06101cb366004612043565b610564565b005b3480156101dd575f80fd5b506101f16101ec3660046120d1565b6105c0565b6040519081526020015b60405180910390f35b34801561020f575f80fd5b50610218610923565b6040516101fb91906120fa565b348015610230575f80fd5b506101f161023f366004612145565b6109b3565b34801561024f575f80fd5b50600c54600b54600d54604080516dffffffffffffffffffffffffffff948516815293909216602084015263ffffffff16908201526060016101fb565b348015610297575f80fd5b506102ab6102a636600461215c565b610a14565b60405190151581526020016101fb565b3480156102c6575f80fd5b506009546102da906001600160a01b031681565b6040516001600160a01b0390911681526020016101fb565b3480156102fd575f80fd5b506002546101f1565b348015610311575f80fd5b506101d061032036600461215c565b610a2d565b348015610330575f80fd5b506102ab61033f366004612186565b610e8f565b34801561034f575f80fd5b50604051601281526020016101fb565b6101d061036d3660046121c4565b610eb2565b34801561037d575f80fd5b506101f161038c3660046121c4565b6001600160a01b03165f9081526020819052604090205490565b3480156103b1575f80fd5b506101d061112b565b3480156103c5575f80fd5b506101f16103d43660046120d1565b61113e565b3480156103e4575f80fd5b506005546001600160a01b03166102da565b348015610401575f80fd5b506102186113c4565b348015610415575f80fd5b506101f1610424366004612186565b6113d3565b348015610434575f80fd5b506101f160085481565b348015610449575f80fd5b506102ab61045836600461215c565b6113e7565b348015610468575f80fd5b506007546102da906001600160a01b031681565b348015610487575f80fd5b506101f1610496366004612145565b6113f4565b3480156104a6575f80fd5b506101d06104b53660046121df565b611444565b3480156104c5575f80fd5b50600a546102da906001600160a01b031681565b3480156104e4575f80fd5b506101f16104f3366004612211565b6001600160a01b039182165f90815260016020908152604080832093909416825291909152205490565b348015610528575f80fd5b506007546102ab90600160a01b900460ff1681565b348015610548575f80fd5b506101d06105573660046121c4565b6117db565b6101d061181d565b5f84118015610571575084155b156105845761057f83610eb2565b6105b9565b5f85118015610591575083155b156105a05761057f8386610a2d565b604051635adaa95f60e01b815260040160405180910390fd5b5050505050565b5f600b5483141580156105d55750600c548314155b156105f3576040516308aea2cb60e11b815260040160405180910390fd5b5f600b5484146106035730610610565b6006546001600160a01b03165b9050306001600160a01b038216036107d5575f61062c866109b3565b90505f61271060075f9054906101000a90046001600160a01b03166001600160a01b031663d55deabb6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610682573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906106a69190612248565b6106b09089612273565b6106ba919061228a565b90505f6106c782896122a9565b90505f6002545f1461070657826002546106e191906122a9565b670de0b6b3a7640000600b546106f79190612273565b610701919061228a565b61070e565b6509184e72a0005b90505f670de0b6b3a76400006107248385612273565b61072e919061228a565b90505f61271060075f9054906101000a90046001600160a01b03166001600160a01b03166324bcdfbd6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610784573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906107a89190612248565b6107b29088612273565b6107bc919061228a565b90506107c881836122a9565b975050505050505061091b565b5f61271060075f9054906101000a90046001600160a01b03166001600160a01b03166372417fc26040518163ffffffff1660e01b8152600401602060405180830381865afa158015610829573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061084d9190612248565b6108579088612273565b610861919061228a565b90505f61086e82886122a9565b90505f61087a826113f4565b90505f61271060075f9054906101000a90046001600160a01b03166001600160a01b03166324bcdfbd6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156108d0573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906108f49190612248565b6108fe9084612273565b610908919061228a565b905061091481836122a9565b9550505050505b509392505050565b606060038054610932906122bc565b80601f016020809104026020016040519081016040528092919081815260200182805461095e906122bc565b80156109a95780601f10610980576101008083540402835291602001916109a9565b820191905f5260205f20905b81548152906001019060200180831161098c57829003601f168201915b5050505050905090565b5f806002545f146109e657600254670de0b6b3a7640000600b546109d79190612273565b6109e1919061228a565b6109ee565b6509184e72a0005b9050670de0b6b3a7640000610a038285612273565b610a0d919061228a565b9392505050565b5f33610a21818585611898565b60019150505b92915050565b600a54600160a01b900460ff1615610a5857604051632c1ff44360e11b815260040160405180910390fd5b600a805460ff60a01b1916600160a01b9081179091556007540460ff1615610a935760405163af79b43760e01b815260040160405180910390fd5b5f808211610aaf57305f90815260208190526040902054610ab1565b815b90505f8215610ac05733610ac2565b305b9050306001600160a01b03851603610aed57604051631e4ec46b60e01b815260040160405180910390fd5b815f03610b0d57604051632160733960e01b815260040160405180910390fd5b5f610b17836109b3565b90505f61271060075f9054906101000a90046001600160a01b03166001600160a01b03166372417fc26040518163ffffffff1660e01b8152600401602060405180830381865afa158015610b6d573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610b919190612248565b610b9b9086612273565b610ba5919061228a565b9050610bb183826118aa565b5f610bbc82866122a9565b90505f61271060075f9054906101000a90046001600160a01b03166001600160a01b03166324bcdfbd6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610c12573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610c369190612248565b610c409086612273565b610c4a919061228a565b9050610c55816118e2565b5f610c5f836109b3565b9050610c6b82826122a9565b9050610c8086610c7b868a6122a9565b6118aa565b600b546006546040516370a0823160e01b815230600482015284916001600160a01b0316906370a0823190602401602060405180830381865afa158015610cc9573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610ced9190612248565b610cf791906122f4565b610d0191906122a9565b610d0b90826122f4565b9050875f03610d8e5760065460405163a9059cbb60e01b81526001600160a01b038b81166004830152602482018490529091169063a9059cbb906044016020604051808303815f875af1158015610d64573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610d889190612307565b50610e1c565b600654604051632e1a7d4d60e01b8152600481018390526001600160a01b0390911690632e1a7d4d906024015f604051808303815f87803b158015610dd1575f80fd5b505af1158015610de3573d5f803e3d5ffd5b50506040516001600160a01b038c16925083156108fc02915083905f818181858888f19350505050158015610e1a573d5f803e3d5ffd5b505b610e24611a07565b604080518481525f60208201819052818301526060810183905290516001600160a01b038b169133917fd78ad95fa46c994b6551d0da85fc275fe613ce37657fb8d5e3d130840159d8229181900360800190a35050600a805460ff60a01b1916905550505050505050565b5f33610e9c858285611a80565b610ea7858585611af5565b506001949350505050565b600754600160a01b900460ff1615610edd5760405163af79b43760e01b815260040160405180910390fd5b600a54600160a01b900460ff1615610f0857604051632c1ff44360e11b815260040160405180910390fd5b600a805460ff60a01b1916600160a01b179055348015610f875760065f9054906101000a90046001600160a01b03166001600160a01b031663d0e30db0826040518263ffffffff1660e01b81526004015f604051808303818588803b158015610f6f575f80fd5b505af1158015610f81573d5f803e3d5ffd5b50505050505b600b546006546040516370a0823160e01b81523060048201525f92916001600160a01b0316906370a0823190602401602060405180830381865afa158015610fd1573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610ff59190612248565b610fff91906122a9565b90505f61271060075f9054906101000a90046001600160a01b03166001600160a01b03166324bcdfbd6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611055573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906110799190612248565b6110839084612273565b61108d919061228a565b90505f61109a82846122a9565b90506110a5826118e2565b5f6110af826113f4565b90506110bb8682611b52565b6110c3611a07565b604080515f80825260208201859052818301849052606082015290516001600160a01b0388169133917fd78ad95fa46c994b6551d0da85fc275fe613ce37657fb8d5e3d130840159d8229181900360800190a35050600a805460ff60a01b1916905550505050565b611133611b86565b61113c5f611bb3565b565b5f600b5483141580156111535750600c548314155b15611171576040516308aea2cb60e11b815260040160405180910390fd5b5f600b548414611181573061118e565b6006546001600160a01b03165b90505f60075f9054906101000a90046001600160a01b03166001600160a01b03166324bcdfbd6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156111e1573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906112059190612248565b90505f60075f9054906101000a90046001600160a01b03166001600160a01b03166372417fc26040518163ffffffff1660e01b8152600401602060405180830381865afa158015611258573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061127c9190612248565b90505f60075f9054906101000a90046001600160a01b03166001600160a01b031663d55deabb6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156112cf573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906112f39190612248565b9050306001600160a01b03851603611361575f611312846127106122a9565b61131e6127108b612273565b611328919061228a565b90505f611334826113f4565b9050611342836127106122a9565b61134e61271083612273565b611358919061228a565b965050506113b9565b5f61136e846127106122a9565b61137a6127108b612273565b611384919061228a565b90505f611390826109b3565b905061139e846127106122a9565b6113aa61271083612273565b6113b4919061228a565b965050505b505050509392505050565b606060048054610932906122bc565b5f6113df848484611c04565b949350505050565b5f33610a21818585611af5565b5f806002545f1461142757600254670de0b6b3a7640000600b546114189190612273565b611422919061228a565b61142f565b6509184e72a0005b905080610a03670de0b6b3a764000085612273565b6007546001600160a01b0316331461146f57604051630636a15760e11b815260040160405180910390fd5b6007805460ff60a01b1916600160a01b17905560405130907f4f0f085b63912ac6b8aebbd52cd6afde1dc2091bb7ebaabf1baf300237bff27d906114b69042815260200190565b60405180910390a25f836001600160a01b0316476040515f6040518083038185875af1925050503d805f8114611507576040519150601f19603f3d011682016040523d82523d5f602084013e61150c565b606091505b505090508061152e576040516341688c3b60e11b815260040160405180910390fd5b5f61271060075f9054906101000a90046001600160a01b03166001600160a01b031663a512583a6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611582573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906115a69190612248565b6002546115b39190612273565b6115bd919061228a565b90505f6127106115cd8584612273565b6115d7919061228a565b90505f6127106115e78785612273565b6115f1919061228a565b90505f816115ff84866122a9565b61160991906122a9565b600754909150611622906001600160a01b031682611b52565b61163d6116376005546001600160a01b031690565b84611b52565b6116478883611b52565b6006546040516370a0823160e01b81523060048201525f916001600160a01b0316906370a0823190602401602060405180830381865afa15801561168d573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906116b19190612248565b60065460075460405163a9059cbb60e01b81526001600160a01b03918216600482015260248101849052929350169063a9059cbb906044016020604051808303815f875af1158015611705573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906117299190612307565b506007546040516311d0decd60e11b815260048101879052602481018390526001600160a01b038b81166044830152909116906323a1bd9a906064015f604051808303815f87803b15801561177c575f80fd5b505af115801561178e573d5f803e3d5ffd5b5050505061179b5f611bb3565b60405142815230907fc09feda7adb0a8bbe69c92dbe769d478537a966979f11dff2dda8bc034dba19d9060200160405180910390a2505050505050505050565b6117e3611b86565b6001600160a01b03811661181157604051631e4fbdf760e01b81525f60048201526024015b60405180910390fd5b61181a81611bb3565b50565b611825611b86565b34156118905760065f9054906101000a90046001600160a01b03166001600160a01b031663d0e30db0346040518263ffffffff1660e01b81526004015f604051808303818588803b158015611878575f80fd5b505af115801561188a573d5f803e3d5ffd5b50505050505b61113c611a07565b6118a58383836001611ce5565b505050565b6001600160a01b0382166118d357604051634b637e8f60e11b81525f6004820152602401611808565b6118de825f83611db7565b5050565b600654604051632e1a7d4d60e01b8152600481018390526001600160a01b0390911690632e1a7d4d906024015f604051808303815f87803b158015611925575f80fd5b505af1158015611937573d5f803e3d5ffd5b505050505f8060075f9054906101000a90046001600160a01b03166001600160a01b031663caf6cbd56040518163ffffffff1660e01b8152600401606060405180830381865afa15801561198d573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906119b19190612326565b9250509150816001600160a01b03166108fc61271083866119d29190612273565b6119dc919061228a565b6040518115909202915f818181858888f19350505050158015611a01573d5f803e3d5ffd5b50505050565b6006546040516370a0823160e01b81523060048201526001600160a01b03909116906370a0823190602401602060405180830381865afa158015611a4d573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611a719190612248565b600b55600254600c5542600d55565b6001600160a01b038381165f908152600160209081526040808320938616835292905220545f198114611a015781811015611ae757604051637dc7a0d960e11b81526001600160a01b03841660048201526024810182905260448101839052606401611808565b611a0184848484035f611ce5565b6001600160a01b038316611b1e57604051634b637e8f60e11b81525f6004820152602401611808565b6001600160a01b038216611b475760405163ec442f0560e01b81525f6004820152602401611808565b6118a5838383611db7565b6001600160a01b038216611b7b5760405163ec442f0560e01b81525f6004820152602401611808565b6118de5f8383611db7565b6005546001600160a01b0316331461113c5760405163118cdaa760e01b8152336004820152602401611808565b600580546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a35050565b5f306001600160a01b03841603611c1c57505f610a0d565b60075460405163752e068b60e11b81526001600160a01b03868116600483015285811660248301525f92839291169063ea5c0d16906044016040805180830381865afa158015611c6e573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611c92919061235a565b9092509050612710611ca48386612273565b611cae919061228a565b611cb890846122f4565b9250612710611cc78286612273565b611cd1919061228a565b611cdb90846122f4565b9695505050505050565b6001600160a01b038416611d0e5760405163e602df0560e01b81525f6004820152602401611808565b6001600160a01b038316611d3757604051634a1406b160e11b81525f6004820152602401611808565b6001600160a01b038085165f9081526001602090815260408083209387168352929052208290558015611a0157826001600160a01b0316846001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92584604051611da991815260200190565b60405180910390a350505050565b6007545f90600160a01b900460ff16611de757611dd5848484611c04565b90508015611de757611de78482611f09565b5f611df282846122a9565b90506001600160a01b038516611e1e578060025f828254611e1391906122f4565b90915550611e8e9050565b6001600160a01b0385165f9081526020819052604090205481811015611e705760405163391434e360e21b81526001600160a01b03871660048201526024810182905260448101839052606401611808565b6001600160a01b0386165f9081526020819052604090209082900390555b6001600160a01b038416611eaa57600280548290039055611ec8565b6001600160a01b0384165f9081526020819052604090208054820190555b836001600160a01b0316856001600160a01b03165f8051602061237d83398151915283604051611efa91815260200190565b60405180910390a35050505050565b306001600160a01b03831615611fd8576001600160a01b0383165f9081526020819052604081208054849290611f409084906122a9565b925050819055508160025f828254611f5891906122a9565b92505081905550806001600160a01b0316836001600160a01b03165f8051602061237d83398151915284604051611f9191815260200190565b60405180910390a3826001600160a01b0316816001600160a01b03165f8051602061237d83398151915284604051611fcb91815260200190565b60405180910390a3505050565b6040518281526001600160a01b038216905f905f8051602061237d8339815191529060200160405180910390a36040518281525f906001600160a01b038316905f8051602061237d83398151915290602001611fcb565b6001600160a01b038116811461181a575f80fd5b5f805f805f60808688031215612057575f80fd5b853594506020860135935060408601356120708161202f565b9250606086013567ffffffffffffffff8082111561208c575f80fd5b818801915088601f83011261209f575f80fd5b8135818111156120ad575f80fd5b8960208285010111156120be575f80fd5b9699959850939650602001949392505050565b5f805f606084860312156120e3575f80fd5b505081359360208301359350604090920135919050565b5f6020808352835180828501525f5b8181101561212557858101830151858201604001528201612109565b505f604082860101526040601f19601f8301168501019250505092915050565b5f60208284031215612155575f80fd5b5035919050565b5f806040838503121561216d575f80fd5b82356121788161202f565b946020939093013593505050565b5f805f60608486031215612198575f80fd5b83356121a38161202f565b925060208401356121b38161202f565b929592945050506040919091013590565b5f602082840312156121d4575f80fd5b8135610a0d8161202f565b5f805f606084860312156121f1575f80fd5b83356121fc8161202f565b95602085013595506040909401359392505050565b5f8060408385031215612222575f80fd5b823561222d8161202f565b9150602083013561223d8161202f565b809150509250929050565b5f60208284031215612258575f80fd5b5051919050565b634e487b7160e01b5f52601160045260245ffd5b8082028115828204841417610a2757610a2761225f565b5f826122a457634e487b7160e01b5f52601260045260245ffd5b500490565b81810381811115610a2757610a2761225f565b600181811c908216806122d057607f821691505b6020821081036122ee57634e487b7160e01b5f52602260045260245ffd5b50919050565b80820180821115610a2757610a2761225f565b5f60208284031215612317575f80fd5b81518015158114610a0d575f80fd5b5f805f60608486031215612338575f80fd5b83516123438161202f565b602085015160409095015190969495509392505050565b5f806040838503121561236b575f80fd5b50508051602090910151909290915056feddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3efa26469706673582212207f4bd5f13f1dda29a14528faa154e86d1177ed559a0e816613d7f973664aa12d64736f6c63430008140033000000000000000000000000fa760444a229e78a50ca9b3779f4ce4cce10e170000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000004200000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000d4d75736520496e666f20426f740000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000034d49420000000000000000000000000000000000000000000000000000000000
Deployed Bytecode
0x6080604052600436106101b2575f3560e01c806385f8c259116100e7578063c6e6f59211610087578063dd62ed3e11610062578063dd62ed3e146104d9578063ee0708051461051d578063f2fde38b1461053d578063fb210b201461055c575f80fd5b8063c6e6f5921461047c578063cff733f61461049b578063d21220a7146104ba575f80fd5b80639ca31bfb116100c25780639ca31bfb1461040a578063a7f0b3de14610429578063a9059cbb1461043e578063c45a01551461045d575f80fd5b806385f8c259146103ba5780638da5cb5b146103d957806395d89b41146103f6575f80fd5b806318160ddd11610152578063313ce5671161012d578063313ce567146103445780636a6278421461035f57806370a0823114610372578063715018a6146103a6575f80fd5b806318160ddd146102f25780631e9a69501461030657806323b872dd14610325575f80fd5b806307a2d13a1161018d57806307a2d13a146102255780630902f1ac14610244578063095ea7b31461028c5780630dfe1681146102bb575f80fd5b8063022c0d9f146101bd578063054d50d4146101d257806306fdde0314610204575f80fd5b366101b957005b5f80fd5b6101d06101cb366004612043565b610564565b005b3480156101dd575f80fd5b506101f16101ec3660046120d1565b6105c0565b6040519081526020015b60405180910390f35b34801561020f575f80fd5b50610218610923565b6040516101fb91906120fa565b348015610230575f80fd5b506101f161023f366004612145565b6109b3565b34801561024f575f80fd5b50600c54600b54600d54604080516dffffffffffffffffffffffffffff948516815293909216602084015263ffffffff16908201526060016101fb565b348015610297575f80fd5b506102ab6102a636600461215c565b610a14565b60405190151581526020016101fb565b3480156102c6575f80fd5b506009546102da906001600160a01b031681565b6040516001600160a01b0390911681526020016101fb565b3480156102fd575f80fd5b506002546101f1565b348015610311575f80fd5b506101d061032036600461215c565b610a2d565b348015610330575f80fd5b506102ab61033f366004612186565b610e8f565b34801561034f575f80fd5b50604051601281526020016101fb565b6101d061036d3660046121c4565b610eb2565b34801561037d575f80fd5b506101f161038c3660046121c4565b6001600160a01b03165f9081526020819052604090205490565b3480156103b1575f80fd5b506101d061112b565b3480156103c5575f80fd5b506101f16103d43660046120d1565b61113e565b3480156103e4575f80fd5b506005546001600160a01b03166102da565b348015610401575f80fd5b506102186113c4565b348015610415575f80fd5b506101f1610424366004612186565b6113d3565b348015610434575f80fd5b506101f160085481565b348015610449575f80fd5b506102ab61045836600461215c565b6113e7565b348015610468575f80fd5b506007546102da906001600160a01b031681565b348015610487575f80fd5b506101f1610496366004612145565b6113f4565b3480156104a6575f80fd5b506101d06104b53660046121df565b611444565b3480156104c5575f80fd5b50600a546102da906001600160a01b031681565b3480156104e4575f80fd5b506101f16104f3366004612211565b6001600160a01b039182165f90815260016020908152604080832093909416825291909152205490565b348015610528575f80fd5b506007546102ab90600160a01b900460ff1681565b348015610548575f80fd5b506101d06105573660046121c4565b6117db565b6101d061181d565b5f84118015610571575084155b156105845761057f83610eb2565b6105b9565b5f85118015610591575083155b156105a05761057f8386610a2d565b604051635adaa95f60e01b815260040160405180910390fd5b5050505050565b5f600b5483141580156105d55750600c548314155b156105f3576040516308aea2cb60e11b815260040160405180910390fd5b5f600b5484146106035730610610565b6006546001600160a01b03165b9050306001600160a01b038216036107d5575f61062c866109b3565b90505f61271060075f9054906101000a90046001600160a01b03166001600160a01b031663d55deabb6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610682573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906106a69190612248565b6106b09089612273565b6106ba919061228a565b90505f6106c782896122a9565b90505f6002545f1461070657826002546106e191906122a9565b670de0b6b3a7640000600b546106f79190612273565b610701919061228a565b61070e565b6509184e72a0005b90505f670de0b6b3a76400006107248385612273565b61072e919061228a565b90505f61271060075f9054906101000a90046001600160a01b03166001600160a01b03166324bcdfbd6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610784573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906107a89190612248565b6107b29088612273565b6107bc919061228a565b90506107c881836122a9565b975050505050505061091b565b5f61271060075f9054906101000a90046001600160a01b03166001600160a01b03166372417fc26040518163ffffffff1660e01b8152600401602060405180830381865afa158015610829573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061084d9190612248565b6108579088612273565b610861919061228a565b90505f61086e82886122a9565b90505f61087a826113f4565b90505f61271060075f9054906101000a90046001600160a01b03166001600160a01b03166324bcdfbd6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156108d0573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906108f49190612248565b6108fe9084612273565b610908919061228a565b905061091481836122a9565b9550505050505b509392505050565b606060038054610932906122bc565b80601f016020809104026020016040519081016040528092919081815260200182805461095e906122bc565b80156109a95780601f10610980576101008083540402835291602001916109a9565b820191905f5260205f20905b81548152906001019060200180831161098c57829003601f168201915b5050505050905090565b5f806002545f146109e657600254670de0b6b3a7640000600b546109d79190612273565b6109e1919061228a565b6109ee565b6509184e72a0005b9050670de0b6b3a7640000610a038285612273565b610a0d919061228a565b9392505050565b5f33610a21818585611898565b60019150505b92915050565b600a54600160a01b900460ff1615610a5857604051632c1ff44360e11b815260040160405180910390fd5b600a805460ff60a01b1916600160a01b9081179091556007540460ff1615610a935760405163af79b43760e01b815260040160405180910390fd5b5f808211610aaf57305f90815260208190526040902054610ab1565b815b90505f8215610ac05733610ac2565b305b9050306001600160a01b03851603610aed57604051631e4ec46b60e01b815260040160405180910390fd5b815f03610b0d57604051632160733960e01b815260040160405180910390fd5b5f610b17836109b3565b90505f61271060075f9054906101000a90046001600160a01b03166001600160a01b03166372417fc26040518163ffffffff1660e01b8152600401602060405180830381865afa158015610b6d573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610b919190612248565b610b9b9086612273565b610ba5919061228a565b9050610bb183826118aa565b5f610bbc82866122a9565b90505f61271060075f9054906101000a90046001600160a01b03166001600160a01b03166324bcdfbd6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610c12573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610c369190612248565b610c409086612273565b610c4a919061228a565b9050610c55816118e2565b5f610c5f836109b3565b9050610c6b82826122a9565b9050610c8086610c7b868a6122a9565b6118aa565b600b546006546040516370a0823160e01b815230600482015284916001600160a01b0316906370a0823190602401602060405180830381865afa158015610cc9573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610ced9190612248565b610cf791906122f4565b610d0191906122a9565b610d0b90826122f4565b9050875f03610d8e5760065460405163a9059cbb60e01b81526001600160a01b038b81166004830152602482018490529091169063a9059cbb906044016020604051808303815f875af1158015610d64573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610d889190612307565b50610e1c565b600654604051632e1a7d4d60e01b8152600481018390526001600160a01b0390911690632e1a7d4d906024015f604051808303815f87803b158015610dd1575f80fd5b505af1158015610de3573d5f803e3d5ffd5b50506040516001600160a01b038c16925083156108fc02915083905f818181858888f19350505050158015610e1a573d5f803e3d5ffd5b505b610e24611a07565b604080518481525f60208201819052818301526060810183905290516001600160a01b038b169133917fd78ad95fa46c994b6551d0da85fc275fe613ce37657fb8d5e3d130840159d8229181900360800190a35050600a805460ff60a01b1916905550505050505050565b5f33610e9c858285611a80565b610ea7858585611af5565b506001949350505050565b600754600160a01b900460ff1615610edd5760405163af79b43760e01b815260040160405180910390fd5b600a54600160a01b900460ff1615610f0857604051632c1ff44360e11b815260040160405180910390fd5b600a805460ff60a01b1916600160a01b179055348015610f875760065f9054906101000a90046001600160a01b03166001600160a01b031663d0e30db0826040518263ffffffff1660e01b81526004015f604051808303818588803b158015610f6f575f80fd5b505af1158015610f81573d5f803e3d5ffd5b50505050505b600b546006546040516370a0823160e01b81523060048201525f92916001600160a01b0316906370a0823190602401602060405180830381865afa158015610fd1573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610ff59190612248565b610fff91906122a9565b90505f61271060075f9054906101000a90046001600160a01b03166001600160a01b03166324bcdfbd6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611055573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906110799190612248565b6110839084612273565b61108d919061228a565b90505f61109a82846122a9565b90506110a5826118e2565b5f6110af826113f4565b90506110bb8682611b52565b6110c3611a07565b604080515f80825260208201859052818301849052606082015290516001600160a01b0388169133917fd78ad95fa46c994b6551d0da85fc275fe613ce37657fb8d5e3d130840159d8229181900360800190a35050600a805460ff60a01b1916905550505050565b611133611b86565b61113c5f611bb3565b565b5f600b5483141580156111535750600c548314155b15611171576040516308aea2cb60e11b815260040160405180910390fd5b5f600b548414611181573061118e565b6006546001600160a01b03165b90505f60075f9054906101000a90046001600160a01b03166001600160a01b03166324bcdfbd6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156111e1573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906112059190612248565b90505f60075f9054906101000a90046001600160a01b03166001600160a01b03166372417fc26040518163ffffffff1660e01b8152600401602060405180830381865afa158015611258573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061127c9190612248565b90505f60075f9054906101000a90046001600160a01b03166001600160a01b031663d55deabb6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156112cf573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906112f39190612248565b9050306001600160a01b03851603611361575f611312846127106122a9565b61131e6127108b612273565b611328919061228a565b90505f611334826113f4565b9050611342836127106122a9565b61134e61271083612273565b611358919061228a565b965050506113b9565b5f61136e846127106122a9565b61137a6127108b612273565b611384919061228a565b90505f611390826109b3565b905061139e846127106122a9565b6113aa61271083612273565b6113b4919061228a565b965050505b505050509392505050565b606060048054610932906122bc565b5f6113df848484611c04565b949350505050565b5f33610a21818585611af5565b5f806002545f1461142757600254670de0b6b3a7640000600b546114189190612273565b611422919061228a565b61142f565b6509184e72a0005b905080610a03670de0b6b3a764000085612273565b6007546001600160a01b0316331461146f57604051630636a15760e11b815260040160405180910390fd5b6007805460ff60a01b1916600160a01b17905560405130907f4f0f085b63912ac6b8aebbd52cd6afde1dc2091bb7ebaabf1baf300237bff27d906114b69042815260200190565b60405180910390a25f836001600160a01b0316476040515f6040518083038185875af1925050503d805f8114611507576040519150601f19603f3d011682016040523d82523d5f602084013e61150c565b606091505b505090508061152e576040516341688c3b60e11b815260040160405180910390fd5b5f61271060075f9054906101000a90046001600160a01b03166001600160a01b031663a512583a6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611582573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906115a69190612248565b6002546115b39190612273565b6115bd919061228a565b90505f6127106115cd8584612273565b6115d7919061228a565b90505f6127106115e78785612273565b6115f1919061228a565b90505f816115ff84866122a9565b61160991906122a9565b600754909150611622906001600160a01b031682611b52565b61163d6116376005546001600160a01b031690565b84611b52565b6116478883611b52565b6006546040516370a0823160e01b81523060048201525f916001600160a01b0316906370a0823190602401602060405180830381865afa15801561168d573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906116b19190612248565b60065460075460405163a9059cbb60e01b81526001600160a01b03918216600482015260248101849052929350169063a9059cbb906044016020604051808303815f875af1158015611705573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906117299190612307565b506007546040516311d0decd60e11b815260048101879052602481018390526001600160a01b038b81166044830152909116906323a1bd9a906064015f604051808303815f87803b15801561177c575f80fd5b505af115801561178e573d5f803e3d5ffd5b5050505061179b5f611bb3565b60405142815230907fc09feda7adb0a8bbe69c92dbe769d478537a966979f11dff2dda8bc034dba19d9060200160405180910390a2505050505050505050565b6117e3611b86565b6001600160a01b03811661181157604051631e4fbdf760e01b81525f60048201526024015b60405180910390fd5b61181a81611bb3565b50565b611825611b86565b34156118905760065f9054906101000a90046001600160a01b03166001600160a01b031663d0e30db0346040518263ffffffff1660e01b81526004015f604051808303818588803b158015611878575f80fd5b505af115801561188a573d5f803e3d5ffd5b50505050505b61113c611a07565b6118a58383836001611ce5565b505050565b6001600160a01b0382166118d357604051634b637e8f60e11b81525f6004820152602401611808565b6118de825f83611db7565b5050565b600654604051632e1a7d4d60e01b8152600481018390526001600160a01b0390911690632e1a7d4d906024015f604051808303815f87803b158015611925575f80fd5b505af1158015611937573d5f803e3d5ffd5b505050505f8060075f9054906101000a90046001600160a01b03166001600160a01b031663caf6cbd56040518163ffffffff1660e01b8152600401606060405180830381865afa15801561198d573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906119b19190612326565b9250509150816001600160a01b03166108fc61271083866119d29190612273565b6119dc919061228a565b6040518115909202915f818181858888f19350505050158015611a01573d5f803e3d5ffd5b50505050565b6006546040516370a0823160e01b81523060048201526001600160a01b03909116906370a0823190602401602060405180830381865afa158015611a4d573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611a719190612248565b600b55600254600c5542600d55565b6001600160a01b038381165f908152600160209081526040808320938616835292905220545f198114611a015781811015611ae757604051637dc7a0d960e11b81526001600160a01b03841660048201526024810182905260448101839052606401611808565b611a0184848484035f611ce5565b6001600160a01b038316611b1e57604051634b637e8f60e11b81525f6004820152602401611808565b6001600160a01b038216611b475760405163ec442f0560e01b81525f6004820152602401611808565b6118a5838383611db7565b6001600160a01b038216611b7b5760405163ec442f0560e01b81525f6004820152602401611808565b6118de5f8383611db7565b6005546001600160a01b0316331461113c5760405163118cdaa760e01b8152336004820152602401611808565b600580546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a35050565b5f306001600160a01b03841603611c1c57505f610a0d565b60075460405163752e068b60e11b81526001600160a01b03868116600483015285811660248301525f92839291169063ea5c0d16906044016040805180830381865afa158015611c6e573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611c92919061235a565b9092509050612710611ca48386612273565b611cae919061228a565b611cb890846122f4565b9250612710611cc78286612273565b611cd1919061228a565b611cdb90846122f4565b9695505050505050565b6001600160a01b038416611d0e5760405163e602df0560e01b81525f6004820152602401611808565b6001600160a01b038316611d3757604051634a1406b160e11b81525f6004820152602401611808565b6001600160a01b038085165f9081526001602090815260408083209387168352929052208290558015611a0157826001600160a01b0316846001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92584604051611da991815260200190565b60405180910390a350505050565b6007545f90600160a01b900460ff16611de757611dd5848484611c04565b90508015611de757611de78482611f09565b5f611df282846122a9565b90506001600160a01b038516611e1e578060025f828254611e1391906122f4565b90915550611e8e9050565b6001600160a01b0385165f9081526020819052604090205481811015611e705760405163391434e360e21b81526001600160a01b03871660048201526024810182905260448101839052606401611808565b6001600160a01b0386165f9081526020819052604090209082900390555b6001600160a01b038416611eaa57600280548290039055611ec8565b6001600160a01b0384165f9081526020819052604090208054820190555b836001600160a01b0316856001600160a01b03165f8051602061237d83398151915283604051611efa91815260200190565b60405180910390a35050505050565b306001600160a01b03831615611fd8576001600160a01b0383165f9081526020819052604081208054849290611f409084906122a9565b925050819055508160025f828254611f5891906122a9565b92505081905550806001600160a01b0316836001600160a01b03165f8051602061237d83398151915284604051611f9191815260200190565b60405180910390a3826001600160a01b0316816001600160a01b03165f8051602061237d83398151915284604051611fcb91815260200190565b60405180910390a3505050565b6040518281526001600160a01b038216905f905f8051602061237d8339815191529060200160405180910390a36040518281525f906001600160a01b038316905f8051602061237d83398151915290602001611fcb565b6001600160a01b038116811461181a575f80fd5b5f805f805f60808688031215612057575f80fd5b853594506020860135935060408601356120708161202f565b9250606086013567ffffffffffffffff8082111561208c575f80fd5b818801915088601f83011261209f575f80fd5b8135818111156120ad575f80fd5b8960208285010111156120be575f80fd5b9699959850939650602001949392505050565b5f805f606084860312156120e3575f80fd5b505081359360208301359350604090920135919050565b5f6020808352835180828501525f5b8181101561212557858101830151858201604001528201612109565b505f604082860101526040601f19601f8301168501019250505092915050565b5f60208284031215612155575f80fd5b5035919050565b5f806040838503121561216d575f80fd5b82356121788161202f565b946020939093013593505050565b5f805f60608486031215612198575f80fd5b83356121a38161202f565b925060208401356121b38161202f565b929592945050506040919091013590565b5f602082840312156121d4575f80fd5b8135610a0d8161202f565b5f805f606084860312156121f1575f80fd5b83356121fc8161202f565b95602085013595506040909401359392505050565b5f8060408385031215612222575f80fd5b823561222d8161202f565b9150602083013561223d8161202f565b809150509250929050565b5f60208284031215612258575f80fd5b5051919050565b634e487b7160e01b5f52601160045260245ffd5b8082028115828204841417610a2757610a2761225f565b5f826122a457634e487b7160e01b5f52601260045260245ffd5b500490565b81810381811115610a2757610a2761225f565b600181811c908216806122d057607f821691505b6020821081036122ee57634e487b7160e01b5f52602260045260245ffd5b50919050565b80820180821115610a2757610a2761225f565b5f60208284031215612317575f80fd5b81518015158114610a0d575f80fd5b5f805f60608486031215612338575f80fd5b83516123438161202f565b602085015160409095015190969495509392505050565b5f806040838503121561236b575f80fd5b50508051602090910151909290915056feddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3efa26469706673582212207f4bd5f13f1dda29a14528faa154e86d1177ed559a0e816613d7f973664aa12d64736f6c63430008140033
Loading...
Loading
Loading...
Loading
Loading...
Loading
Net Worth in USD
$0.00
Net Worth in ETH
0
Multichain Portfolio | 34 Chains
| Chain | Token | Portfolio % | Price | Amount | Value |
|---|
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.