Source Code
Latest 25 from a total of 1,559 transactions
| Transaction Hash |
Method
|
Block
|
From
|
|
To
|
||||
|---|---|---|---|---|---|---|---|---|---|
| Claim Tokens | 23546203 | 67 days ago | IN | 0 ETH | 0.00018332 | ||||
| Claim Tokens | 23482012 | 76 days ago | IN | 0 ETH | 0.00025872 | ||||
| Claim Tokens | 23446324 | 81 days ago | IN | 0 ETH | 0.00027114 | ||||
| Claim Tokens | 23438987 | 82 days ago | IN | 0 ETH | 0.00026677 | ||||
| Claim Tokens | 23430566 | 83 days ago | IN | 0 ETH | 0.00034519 | ||||
| Claim Tokens | 23420211 | 84 days ago | IN | 0 ETH | 0.00039923 | ||||
| Claim Tokens | 23417818 | 85 days ago | IN | 0 ETH | 0.00047188 | ||||
| Claim Tokens | 23414941 | 85 days ago | IN | 0 ETH | 0.00008805 | ||||
| Claim Tokens | 23411303 | 85 days ago | IN | 0 ETH | 0.00003706 | ||||
| Claim Tokens | 23405463 | 86 days ago | IN | 0 ETH | 0.00006113 | ||||
| Claim Tokens | 23404849 | 86 days ago | IN | 0 ETH | 0.0003751 | ||||
| Claim Tokens | 23404755 | 86 days ago | IN | 0 ETH | 0.00040359 | ||||
| Claim Tokens | 23403514 | 87 days ago | IN | 0 ETH | 0.00005853 | ||||
| Claim Tokens | 23402432 | 87 days ago | IN | 0 ETH | 0.00003942 | ||||
| Claim Tokens | 23400274 | 87 days ago | IN | 0 ETH | 0.00032473 | ||||
| Claim Tokens | 23398544 | 87 days ago | IN | 0 ETH | 0.0001961 | ||||
| Claim Tokens | 23398499 | 87 days ago | IN | 0 ETH | 0.00039119 | ||||
| Claim Tokens | 23397468 | 87 days ago | IN | 0 ETH | 0.00037515 | ||||
| Claim Tokens | 23397006 | 87 days ago | IN | 0 ETH | 0.00016394 | ||||
| Claim Tokens | 23395973 | 88 days ago | IN | 0 ETH | 0.00038937 | ||||
| Claim Tokens | 23393776 | 88 days ago | IN | 0 ETH | 0.00022637 | ||||
| Claim Tokens | 23393654 | 88 days ago | IN | 0 ETH | 0.00034044 | ||||
| Claim Tokens | 23393467 | 88 days ago | IN | 0 ETH | 0.00005329 | ||||
| Claim Tokens | 23391762 | 88 days ago | IN | 0 ETH | 0.00045404 | ||||
| Claim Tokens | 23391663 | 88 days ago | IN | 0 ETH | 0.00074894 |
Latest 25 internal transactions (View All)
Advanced mode:
| Parent Transaction Hash | Method | Block |
From
|
|
To
|
||
|---|---|---|---|---|---|---|---|
| Transfer | 23546203 | 67 days ago | 0.06455523 ETH | ||||
| Transfer | 23482012 | 76 days ago | 0.03524446 ETH | ||||
| Transfer | 23446324 | 81 days ago | 0.00896827 ETH | ||||
| Transfer | 23438987 | 82 days ago | 0.01353669 ETH | ||||
| Transfer | 23430566 | 83 days ago | 0.01032125 ETH | ||||
| Transfer | 23420211 | 84 days ago | 0.02002608 ETH | ||||
| Transfer | 23417818 | 85 days ago | 0.00990116 ETH | ||||
| Transfer | 23414941 | 85 days ago | 0.0517603 ETH | ||||
| Transfer | 23411303 | 85 days ago | 0.02475622 ETH | ||||
| Transfer | 23405463 | 86 days ago | 0.0008617 ETH | ||||
| Transfer | 23404849 | 86 days ago | 0.00003394 ETH | ||||
| Transfer | 23404755 | 86 days ago | 0.00093599 ETH | ||||
| Transfer | 23403514 | 87 days ago | 0.01892206 ETH | ||||
| Transfer | 23402432 | 87 days ago | 0.00132632 ETH | ||||
| Transfer | 23400274 | 87 days ago | 0.04409358 ETH | ||||
| Transfer | 23398499 | 87 days ago | 0.01286779 ETH | ||||
| Transfer | 23397468 | 87 days ago | 0.00952052 ETH | ||||
| Transfer | 23397006 | 87 days ago | 0.00979012 ETH | ||||
| Transfer | 23395973 | 88 days ago | 0.00403073 ETH | ||||
| Transfer | 23393776 | 88 days ago | 0.00000011 ETH | ||||
| Transfer | 23393654 | 88 days ago | 0.00009889 ETH | ||||
| Transfer | 23393467 | 88 days ago | 0.01781543 ETH | ||||
| Transfer | 23391762 | 88 days ago | 0.00565213 ETH | ||||
| Transfer | 23391663 | 88 days ago | 0.00356271 ETH | ||||
| Transfer | 23391595 | 88 days ago | 0.05475166 ETH |
Loading...
Loading
Cross-Chain Transactions
Loading...
Loading
Contract Name:
Raise
Compiler Version
v0.8.19+commit.7dd6d404
Optimization Enabled:
Yes with 200 runs
Other Settings:
paris EvmVersion
Contract Source Code (Solidity Standard Json-Input format)
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
/*
☞ https://ethos.vision
𝕏 https://x.com/Ethereum_OS
✌︎ https://t.me/ethosportal
Welcome to the Ethereum Operating System — the first-of-its-kind revenue generating DeFi pumpware
built as a social DeFi sandbox that is filled with composable elements so you can create, trade,
communicate, and participate—all in one place.
Sounds interesting? Participate in our Fair Sale today at 3 PM UTC!
@
@@:
@@@::
==@@@::::
===@@@:::::
===+@@+::::::
====@@@::::::::
=====@@@:::::::::
======@@@::::::::::
=======@@@:::::::::::
=======*@@+::::::::::::
========@@@::::::::::::::
==========@@@::::::::::::::::
===========@@@:::::::::::::::::
============@@@::::::::::::::::::
============*@@=:::::::::::::::::::
=============@@@:::::::::::::::::::::
=====@@@======@@@::::::::@@@:::::::::::
======@@@======@@@::::::::@@@::::::::::::
=======@@@======@@@::::::::@@@:::::::::::::
=================@@=:::::::::::::::::::::::::
==================%@@::::::::::::::::::::::::::::
===================@@@:::::::::::::::::::::::::::::
====================@@@::::::::::::::::::::::::::::::
=====================@@@:::::::::::::::::::::::::::::::
=====================+@@-::::::::::::::::::::::::::::::::
======================@@@@@@@@@@@@@@*::::::::::::::::::::::
=======================@@@@@@@@@@@@@@::::::::::::::::::::::::
===================================@@@:::::::::::::::::::::::::
=================================@@@:::::::::::::::::::::::
=========@@@@===================@@@::::::::@@@*::::::::::
=========@@@@@@@==============*@@:::::%@@@@@:::::::::::
===========@@@@@@@@@@@#*+=+*@@@@@@@@@@@-:::::::::::
==============+@@@@@@@@@@@@@@@@@@@:::::::::::::::
==========================@@@::::::::::::::::::
========================@@@::::::::::::::::
======================@@@::::::::::::::::
=====================@@@:::::::::::::::
===================@@@:::::::::::::
==================@@@::::::::::::
================*@@=:::::::::::
==============@@@::::::::::
=============@@@:::::::::
============@@@::::::::
==========@@#::::::
========@@@::::::
=======@@@:::::
=====@@@:::
====@@@::
==*@@-:
=@@@:
@
@@@
@@@@@@@@@@@@@@@@@@@ @@@@@@@ ======= ========
@@@@@@@@@@@@@@@@@@ @@@@@ ==== ===== ===== =====
@@@@@ @@ @@@@ ===== ==== ==== ===
@@@@@ @ @@@@ ==== ===== ==== ===
@@@@@ @@@@ ==== ===== ==== ==
@@@@@ @@ @@@@ ===== ===== =====
@@@@@ @ @@@@ @@@@ @ ===== ===== =======
@@@@@ @@ @@@@@@@@@@@@ @@@@ @@@@@@@@ ===== ===== =========
@@@@@@@@@@@@@ @@@@ @@@@@@ @@@@@ ===== ===== =========
@@@@@ @@ @@@@ @@@@@ @@@@@ ===== ===== =========
@@@@@ @@ @@@@ @@@@ @@@@ ===== ===== ========
@@@@@ @@@@ @@@@ @@@@ ====== ===== ======
@@@@@ @@@@ @@@@ @@@@ ===== ===== =====
@@@@@ @@@@ @@@@ @@@@ ===== ===== == =====
@@@@@ @@ @@@@ @@@@ @@@@ ==== ===== === =====
@@@@@ @@@ @@@@@ @@@@ @@@@ ===== ==== ==== ====
@@@@@@@@@@@@@@@@@@ @@@@@@@@@@ @@@@@@ @@@@@@ ===== ==== ===== =====
@@@@@@@@@@@@@@@@@@@@ @@@@@@ @@@@@@@@@ @@@@@@@@@ ========== =========
*/
import "@openzeppelin/contracts/access/Ownable.sol";
import "@openzeppelin/contracts/security/ReentrancyGuard.sol";
import "@openzeppelin/contracts/security/Pausable.sol";
import "@openzeppelin/contracts/token/ERC20/IERC20.sol";
import "@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol";
import "../interfaces/IWETH.sol";
import "../interfaces/IEOS20.sol";
contract Raise is Ownable, ReentrancyGuard, Pausable {
using SafeERC20 for IERC20;
using SafeERC20 for IWETH;
// Contracts
IEOS20 public token;
IWETH public weth;
// Structs
struct RaiseInfo {
address owner;
address token;
uint256 tokensVirtualReserve;
uint256 ethVirtualReserve;
uint256 weightTokensStart;
uint256 weightTokensEnd;
uint256 weightEthStart;
uint256 weightEthEnd;
uint256 startTime;
uint256 duration;
uint256 totalTrades;
uint256 FEE_BASIS_POINTS;
uint256 BASIS_POINTS;
uint256 viewEndTime;
uint256 timeElapsed;
uint256 timeLeft;
uint256 weightTokens;
uint256 weightEth;
uint256 tokensWeighted;
uint256 ethWeighted;
uint256 tokensPerWei;
uint256 getTokensOut;
uint256 getEthOut;
uint256 getEthOutWithFee;
uint256 getEthIn;
uint256 getTokensIn;
uint lastTradeTimeStamp;
uint firstTradeTimeStamp;
uint wethBalanceUser;
uint wethBalanceRaise;
uint userTokensBalance;
uint allowanceWeth;
uint ethBalanceUser;
uint purchasedTokens;
uint totalPurchased;
uint totalClaimed;
uint claimDelay;
uint viewClaimAllowedTimeStamp;
uint ethFees;
uint tokenFees;
uint securedEthFromTokenFees;
}
// State
uint public constant FEE_BASIS_POINTS = 200; // 2%
uint public constant BASIS_POINTS = 10000;
uint public constant PRECISION = 1e18;
uint public tokensVirtualReserve = 75_000_000e18;
uint public ethVirtualReserve; // Initialized via fundInitial
uint public weightTokensStart = 1e16;
uint public weightTokensEnd = 90e16;
uint public weightEthStart = 99e16;
uint public weightEthEnd = 10e16;
uint public startTime;
uint public duration;
uint public claimDelay = 48 hours;
uint public pauseTimeStamp;
uint public maxTradesForChart = 72;
uint public totalTrades;
uint public lastTradeTimeStamp;
uint public firstTradeTimeStamp;
uint public totalPurchased;
uint public totalClaimed;
uint public ethFees;
uint public tokenFees;
uint public securedEthFromTokenFees;
// Mappings
mapping (address => uint) public purchasedTokens;
mapping (uint => uint) public tradePrice;
// Events
event Invest(address indexed user, uint amount, uint tokensReceived, uint feePaid);
event Sell(address indexed user, uint amount, uint ethReceived, uint securedEth);
event Withdrawn(address indexed user, uint amount);
event Funded(uint amount);
// View functions
function multicall(address user) public view returns (RaiseInfo memory) {
return RaiseInfo({
owner: owner(),
token: address(token),
tokensVirtualReserve: tokensVirtualReserve,
ethVirtualReserve: ethVirtualReserve,
weightTokensStart: weightTokensStart,
weightTokensEnd: weightTokensEnd,
weightEthStart: weightEthStart,
weightEthEnd: weightEthEnd,
startTime: startTime,
duration: duration,
totalTrades: totalTrades,
FEE_BASIS_POINTS: FEE_BASIS_POINTS,
BASIS_POINTS: BASIS_POINTS,
viewEndTime: viewEndTime(),
timeElapsed: timeElapsed(),
timeLeft: timeLeft(),
weightTokens: weightTokens(),
weightEth: weightEth(),
tokensWeighted: tokensWeighted(),
ethWeighted: ethWeighted(),
tokensPerWei: tokensPerWei(),
getTokensOut: getTokensOut(1e18),
getEthOut: getEthOut(1e18),
getEthOutWithFee: getEthOutWithFee(1e18),
getEthIn: getEthIn(1e18),
getTokensIn: getTokensIn(1e18),
lastTradeTimeStamp: lastTradeTimeStamp,
firstTradeTimeStamp: firstTradeTimeStamp,
ethBalanceUser: user.balance,
wethBalanceUser: weth.balanceOf(user),
wethBalanceRaise: weth.balanceOf(address(this)),
userTokensBalance: token.balanceOf(user),
allowanceWeth: weth.allowance(user, address(this)),
purchasedTokens: purchasedTokens[user],
totalPurchased: totalPurchased,
totalClaimed: totalClaimed,
claimDelay: claimDelay,
viewClaimAllowedTimeStamp: viewClaimAllowedTimeStamp(),
ethFees: ethFees,
tokenFees: tokenFees,
securedEthFromTokenFees: securedEthFromTokenFees
});
}
function balanceOf(address user) public view returns (uint) {
return 0;
}
function fetchTrades() public view returns (uint256[] memory) {
return viewChart(0, totalTrades);
}
function fetchTradesCustomTime(uint256 tradesPerCandle) public view returns (uint256[] memory) {
return viewChartCustomTime(tradesPerCandle);
}
function viewEndTime() public view returns (uint) {
if (startTime == 0) return 0;
return startTime + duration;
}
function timeElapsed() public view returns (uint) {
if (startTime == 0) return 0;
if (block.timestamp - startTime > duration) return duration;
return block.timestamp - startTime;
}
function timeLeft() public view returns (uint) {
if (startTime == 0 || timeElapsed() >= duration) return 0;
return duration - timeElapsed();
}
function viewClaimAllowedTimeStamp() public view returns (uint) {
return startTime + duration + claimDelay;
}
function viewChart(uint start, uint end) public view returns (uint[] memory) {
require(end > start && end - start <= 1000, "Invalid range");
uint[] memory prices = new uint[](end - start);
for (uint i = start; i < end; i++) {
prices[i - start] = tradePrice[i];
}
return prices;
}
function viewChartCustomTime(uint tradesPerCandle) public view returns (uint[] memory) {
require(tradesPerCandle > 0, "Invalid candle size");
uint numCandles = (totalTrades + tradesPerCandle - 1) / tradesPerCandle; // Ceiling division
uint[] memory prices = new uint[](numCandles);
for (uint i = 0; i < numCandles; i++) {
uint tradeIndex = i * tradesPerCandle;
if (tradeIndex < totalTrades) {
prices[i] = tradePrice[tradeIndex];
}
}
return prices;
}
function viewChartPro() public view returns (uint[] memory) {
if (totalTrades == 0) return new uint[](0);
if (totalTrades > maxTradesForChart * 2) {
uint decimator = totalTrades / maxTradesForChart;
uint numPoints = (totalTrades / decimator) + 1; // +1 for last price
uint[] memory prices = new uint[](numPoints);
for (uint i = 0; i < numPoints - 1; i++) {
prices[i] = tradePrice[i * decimator];
}
prices[numPoints - 1] = tradePrice[totalTrades - 1];
return prices;
} else {
return viewChart(0, totalTrades);
}
}
// Start
function initialize(uint _duration, address _wethAddress) external onlyOwner {
// require(_duration > 1 days && _duration < 5 days, "Invalid duration");
duration = _duration;
weth = IWETH(payable(_wethAddress));
}
function setToken(address _tokenAddress) external onlyOwner {
token = IEOS20(payable(_tokenAddress));
}
function fundInitial(uint amount) external onlyOwner {
ethVirtualReserve = amount;
emit Funded(amount);
}
function beginRaise() external onlyOwner whenNotPaused {
require(startTime == 0, "Auction already started");
require(ethVirtualReserve > 0, "Must fund initial reserve");
startTime = block.timestamp;
}
// Core view
function weightTokens() public view returns (uint) {
if (startTime == 0 || duration == 0) return 0;
uint fraction = timeElapsed() * PRECISION / duration;
uint delta = weightTokensEnd - weightTokensStart;
return weightTokensStart + ((delta * fraction + PRECISION - 1) / PRECISION);
}
function weightEth() public view returns (uint) {
if (startTime == 0 || duration == 0) return 0;
uint fraction = timeElapsed() * PRECISION / duration;
uint delta = weightEthStart - weightEthEnd;
return weightEthStart - ((delta * fraction + PRECISION - 1) / PRECISION);
}
function tokensWeighted() public view returns (uint) {
return tokensVirtualReserve * weightTokens() / PRECISION;
}
function ethWeighted() public view returns (uint) {
return ethVirtualReserve * weightEth() / PRECISION;
}
function tokensPerWei() public view returns (uint) {
uint eW = ethWeighted();
if (eW == 0) return type(uint).max;
return tokensWeighted() * 1e18 / eW;
}
function getTokensOut(uint amountEth) public view returns (uint) {
uint reserveToken = tokensWeighted();
uint reserveEth = ethWeighted();
if (reserveEth == 0 || reserveToken == 0 || amountEth == 0) return 0;
uint amountInWithFee = amountEth * (BASIS_POINTS - FEE_BASIS_POINTS) / BASIS_POINTS;
uint denominator = reserveEth + amountInWithFee;
uint numerator = amountInWithFee * reserveToken;
return (numerator + denominator) / denominator; // Ceiling division
}
function getEthOut(uint amountTokens) public view returns (uint) {
uint reserveToken = tokensWeighted();
uint reserveEth = ethWeighted();
if (reserveToken == 0 || reserveEth == 0 || amountTokens == 0) return 0;
uint denominator = reserveToken + amountTokens;
uint numerator = amountTokens * reserveEth;
return (numerator + denominator) / denominator; // Ceiling for symmetry
}
function getEthOutWithFee(uint amountTokens) public view returns (uint) {
return getEthOut(amountTokens) * (BASIS_POINTS - FEE_BASIS_POINTS) / BASIS_POINTS;
}
function getEthIn(uint tokensDesired) public view returns (uint) {
uint reserveToken = tokensWeighted();
uint reserveEth = ethWeighted();
if (reserveToken <= tokensDesired || reserveEth == 0 || tokensDesired == 0) return type(uint).max;
uint numerator = reserveEth * tokensDesired * BASIS_POINTS;
uint denominator = (reserveToken - tokensDesired) * (BASIS_POINTS - FEE_BASIS_POINTS);
uint amountEth = numerator / denominator;
if (numerator % denominator != 0) {
amountEth += 1;
}
return amountEth;
}
function getTokensIn(uint ethDesired) public view returns (uint) {
uint reserveToken = tokensWeighted();
uint reserveEth = ethWeighted();
if (reserveEth <= ethDesired || reserveToken == 0 || ethDesired == 0) return type(uint).max;
uint numerator = reserveToken * ethDesired * BASIS_POINTS;
uint denominator = (reserveEth - ethDesired) * (BASIS_POINTS - FEE_BASIS_POINTS);
uint amountTokens = numerator / denominator;
if (numerator % denominator != 0) {
amountTokens += 1;
}
return amountTokens;
}
function tokenFeesInEth() public view returns (uint) {
return getEthOut(tokenFees);
}
function totalFeesInEth() public view returns (uint) {
return ethFees + getEthOut(tokenFees);
}
// Core
function invest(uint ethAmount, uint minTokensOut, uint deadline) external nonReentrant whenNotPaused {
require(block.timestamp <= deadline, "Expired transaction");
require(startTime > 0 && timeElapsed() < duration, "Auction not active");
require(ethAmount > 0, "No ETH sent");
require(weth.balanceOf(msg.sender) >= ethAmount, "Not sufficient balance.");
uint tW = tokensWeighted();
uint eW = ethWeighted();
require(tW > 0 && eW > 0, "Invalid weights");
uint tokensToSend = getTokensOut(ethAmount);
require(tokensToSend >= minTokensOut, "Slippage exceeded");
require(tokensToSend > 0, "No tokens to send");
// Calculate and accumulate fee (extra ETH paid)
uint fee = ethAmount * FEE_BASIS_POINTS / BASIS_POINTS;
ethFees += fee;
IERC20(address(weth)).safeTransferFrom(msg.sender, address(this), ethAmount);
uint amountInWithFee = ethAmount * (BASIS_POINTS - FEE_BASIS_POINTS) / BASIS_POINTS;
ethVirtualReserve += amountInWithFee; // Use effective amount, not full amount
tokensVirtualReserve -= tokensToSend;
if (firstTradeTimeStamp == 0) {
firstTradeTimeStamp = block.timestamp;
}
purchasedTokens[msg.sender] += tokensToSend;
totalPurchased += tokensToSend;
tradePrice[totalTrades] = getEthIn(1e18);
lastTradeTimeStamp = block.timestamp;
totalTrades++;
emit Invest(msg.sender, ethAmount, tokensToSend, fee);
}
function sell(uint amountTokens, uint minEthOut, uint deadline) external nonReentrant whenNotPaused {
require(block.timestamp <= deadline, "Expired transaction");
require(startTime > 0 && timeElapsed() < duration, "Auction not active");
require(amountTokens > 0, "No tokens sent");
require(purchasedTokens[msg.sender] >= amountTokens, "Not sufficient balance.");
uint reserveToken = tokensWeighted();
uint reserveEth = ethWeighted();
uint tW = tokensWeighted();
uint eW = ethWeighted();
require(tW > 0 && eW > 0, "Invalid weights");
uint ethOutNoFee = getEthOut(amountTokens);
uint ethToSend = getEthOutWithFee(amountTokens);
require(ethToSend >= minEthOut, "Slippage exceeded");
require(ethToSend > 0, "No ETH to send");
require(ethVirtualReserve >= ethToSend && weth.balanceOf(address(this)) >= ethToSend, "Insufficient ETH in contract");
uint fee = amountTokens * FEE_BASIS_POINTS / BASIS_POINTS;
tokenFees += fee;
uint securedEth = ethOutNoFee - ethToSend;
securedEthFromTokenFees += securedEth;
purchasedTokens[msg.sender] -= amountTokens;
totalPurchased -= amountTokens;
tokensVirtualReserve += amountTokens;
ethVirtualReserve -= ethOutNoFee;
tradePrice[totalTrades] = getEthIn(1e18);
lastTradeTimeStamp = block.timestamp;
totalTrades++;
IERC20(address(weth)).safeTransfer(msg.sender, ethToSend);
emit Sell(msg.sender, amountTokens, ethToSend, securedEth);
}
function claimTokens() public afterAuction nonReentrant whenNotPaused() {
require(block.timestamp > startTime + duration + claimDelay, "Claim not allowed yet.");
require(token.balanceOf(address(this)) > 0, "Tokens not funded yet");
require(purchasedTokens[msg.sender] > 0, "Nothing to claim.");
uint userTokens = purchasedTokens[msg.sender];
totalClaimed += userTokens;
purchasedTokens[msg.sender] = 0;
IERC20(address(token)).safeTransfer(msg.sender, userTokens);
}
// Owner
function setMaxTradesForChart(uint _maxTradesForChart) external onlyOwner {
maxTradesForChart = _maxTradesForChart;
}
modifier afterAuction() {
require(startTime > 0 && timeElapsed() >= duration, "Auction active");
_;
}
function withdraw() external afterAuction onlyOwner {
uint balance = weth.balanceOf(address(this));
IERC20(address(weth)).safeTransfer(owner(), balance);
emit Withdrawn(owner(), balance);
}
function withdrawFeesWETH() external afterAuction onlyOwner {
require(weth.balanceOf(address(this)) >= ethFees +
securedEthFromTokenFees, "Insufficient fees");
IERC20(address(weth)).safeTransfer(owner(), ethFees + securedEthFromTokenFees);
ethFees = 0;
securedEthFromTokenFees = 0;
}
function withdrawFeesToken() external afterAuction onlyOwner {
IERC20(address(token)).safeTransfer(owner(), tokenFees);
tokenFees = 0;
}
function setWethAddress(address _wethAddress) external onlyOwner {
weth = IWETH(payable(_wethAddress));
}
function pause() external onlyOwner {
_pause();
pauseTimeStamp = block.timestamp;
}
function unpause() external onlyOwner {
_unpause();
if(startTime != 0) {
startTime += (block.timestamp - pauseTimeStamp);
}
}
function setDelay(uint _claimDelay) external onlyOwner {
claimDelay = _claimDelay;
}
function recoverEth(uint amount) external onlyOwner {
(bool success, ) = owner().call{value: amount}("");
require(success, "Transfer failed");
}
function recoverTokens(address tokenAddress, uint amount) external onlyOwner {
IERC20(tokenAddress).safeTransfer(owner(), amount);
}
// No receive
receive() external payable {
revert("No direct ETH accepted");
}
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.7.0) (access/Ownable.sol)
pragma solidity ^0.8.0;
import "../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.
*
* By default, the owner account will be the one that deploys the contract. 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;
event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);
/**
* @dev Initializes the contract setting the deployer as the initial owner.
*/
constructor() {
_transferOwnership(_msgSender());
}
/**
* @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 {
require(owner() == _msgSender(), "Ownable: caller is not the owner");
}
/**
* @dev Leaves the contract without owner. It will not be possible to call
* `onlyOwner` functions anymore. Can only be called by the current owner.
*
* NOTE: Renouncing ownership will leave the contract without an owner,
* thereby removing 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 {
require(newOwner != address(0), "Ownable: new owner is the zero address");
_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 v4.8.0) (security/ReentrancyGuard.sol)
pragma solidity ^0.8.0;
/**
* @dev Contract module that helps prevent reentrant calls to a function.
*
* Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier
* available, which can be applied to functions to make sure there are no nested
* (reentrant) calls to them.
*
* Note that because there is a single `nonReentrant` guard, functions marked as
* `nonReentrant` may not call one another. This can be worked around by making
* those functions `private`, and then adding `external` `nonReentrant` entry
* points to them.
*
* TIP: If you would like to learn more about reentrancy and alternative ways
* to protect against it, check out our blog post
* https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul].
*/
abstract contract ReentrancyGuard {
// Booleans are more expensive than uint256 or any type that takes up a full
// word because each write operation emits an extra SLOAD to first read the
// slot's contents, replace the bits taken up by the boolean, and then write
// back. This is the compiler's defense against contract upgrades and
// pointer aliasing, and it cannot be disabled.
// The values being non-zero value makes deployment a bit more expensive,
// but in exchange the refund on every call to nonReentrant will be lower in
// amount. Since refunds are capped to a percentage of the total
// transaction's gas, it is best to keep them low in cases like this one, to
// increase the likelihood of the full refund coming into effect.
uint256 private constant _NOT_ENTERED = 1;
uint256 private constant _ENTERED = 2;
uint256 private _status;
constructor() {
_status = _NOT_ENTERED;
}
/**
* @dev Prevents a contract from calling itself, directly or indirectly.
* Calling a `nonReentrant` function from another `nonReentrant`
* function is not supported. It is possible to prevent this from happening
* by making the `nonReentrant` function external, and making it call a
* `private` function that does the actual work.
*/
modifier nonReentrant() {
_nonReentrantBefore();
_;
_nonReentrantAfter();
}
function _nonReentrantBefore() private {
// On the first call to nonReentrant, _status will be _NOT_ENTERED
require(_status != _ENTERED, "ReentrancyGuard: reentrant call");
// Any calls to nonReentrant after this point will fail
_status = _ENTERED;
}
function _nonReentrantAfter() private {
// By storing the original value once again, a refund is triggered (see
// https://eips.ethereum.org/EIPS/eip-2200)
_status = _NOT_ENTERED;
}
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.7.0) (security/Pausable.sol)
pragma solidity ^0.8.0;
import "../utils/Context.sol";
/**
* @dev Contract module which allows children to implement an emergency stop
* mechanism that can be triggered by an authorized account.
*
* This module is used through inheritance. It will make available the
* modifiers `whenNotPaused` and `whenPaused`, which can be applied to
* the functions of your contract. Note that they will not be pausable by
* simply including this module, only once the modifiers are put in place.
*/
abstract contract Pausable is Context {
/**
* @dev Emitted when the pause is triggered by `account`.
*/
event Paused(address account);
/**
* @dev Emitted when the pause is lifted by `account`.
*/
event Unpaused(address account);
bool private _paused;
/**
* @dev Initializes the contract in unpaused state.
*/
constructor() {
_paused = false;
}
/**
* @dev Modifier to make a function callable only when the contract is not paused.
*
* Requirements:
*
* - The contract must not be paused.
*/
modifier whenNotPaused() {
_requireNotPaused();
_;
}
/**
* @dev Modifier to make a function callable only when the contract is paused.
*
* Requirements:
*
* - The contract must be paused.
*/
modifier whenPaused() {
_requirePaused();
_;
}
/**
* @dev Returns true if the contract is paused, and false otherwise.
*/
function paused() public view virtual returns (bool) {
return _paused;
}
/**
* @dev Throws if the contract is paused.
*/
function _requireNotPaused() internal view virtual {
require(!paused(), "Pausable: paused");
}
/**
* @dev Throws if the contract is not paused.
*/
function _requirePaused() internal view virtual {
require(paused(), "Pausable: not paused");
}
/**
* @dev Triggers stopped state.
*
* Requirements:
*
* - The contract must not be paused.
*/
function _pause() internal virtual whenNotPaused {
_paused = true;
emit Paused(_msgSender());
}
/**
* @dev Returns to normal state.
*
* Requirements:
*
* - The contract must be paused.
*/
function _unpause() internal virtual whenPaused {
_paused = false;
emit Unpaused(_msgSender());
}
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.6.0) (token/ERC20/IERC20.sol)
pragma solidity ^0.8.0;
/**
* @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 amount of tokens in existence.
*/
function totalSupply() external view returns (uint256);
/**
* @dev Returns the amount of tokens owned by `account`.
*/
function balanceOf(address account) external view returns (uint256);
/**
* @dev Moves `amount` 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 amount) 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 `amount` 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 amount) external returns (bool);
/**
* @dev Moves `amount` tokens from `from` to `to` using the
* allowance mechanism. `amount` 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 amount
) external returns (bool);
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.8.0) (token/ERC20/utils/SafeERC20.sol)
pragma solidity ^0.8.0;
import "../IERC20.sol";
import "../extensions/draft-IERC20Permit.sol";
import "../../../utils/Address.sol";
/**
* @title SafeERC20
* @dev Wrappers around ERC20 operations that throw on failure (when the token
* contract returns false). Tokens that return no value (and instead revert or
* throw on failure) are also supported, non-reverting calls are assumed to be
* successful.
* To use this library you can add a `using SafeERC20 for IERC20;` statement to your contract,
* which allows you to call the safe operations as `token.safeTransfer(...)`, etc.
*/
library SafeERC20 {
using Address for address;
function safeTransfer(
IERC20 token,
address to,
uint256 value
) internal {
_callOptionalReturn(token, abi.encodeWithSelector(token.transfer.selector, to, value));
}
function safeTransferFrom(
IERC20 token,
address from,
address to,
uint256 value
) internal {
_callOptionalReturn(token, abi.encodeWithSelector(token.transferFrom.selector, from, to, value));
}
/**
* @dev Deprecated. This function has issues similar to the ones found in
* {IERC20-approve}, and its usage is discouraged.
*
* Whenever possible, use {safeIncreaseAllowance} and
* {safeDecreaseAllowance} instead.
*/
function safeApprove(
IERC20 token,
address spender,
uint256 value
) internal {
// safeApprove should only be called when setting an initial allowance,
// or when resetting it to zero. To increase and decrease it, use
// 'safeIncreaseAllowance' and 'safeDecreaseAllowance'
require(
(value == 0) || (token.allowance(address(this), spender) == 0),
"SafeERC20: approve from non-zero to non-zero allowance"
);
_callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, value));
}
function safeIncreaseAllowance(
IERC20 token,
address spender,
uint256 value
) internal {
uint256 newAllowance = token.allowance(address(this), spender) + value;
_callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance));
}
function safeDecreaseAllowance(
IERC20 token,
address spender,
uint256 value
) internal {
unchecked {
uint256 oldAllowance = token.allowance(address(this), spender);
require(oldAllowance >= value, "SafeERC20: decreased allowance below zero");
uint256 newAllowance = oldAllowance - value;
_callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance));
}
}
function safePermit(
IERC20Permit token,
address owner,
address spender,
uint256 value,
uint256 deadline,
uint8 v,
bytes32 r,
bytes32 s
) internal {
uint256 nonceBefore = token.nonces(owner);
token.permit(owner, spender, value, deadline, v, r, s);
uint256 nonceAfter = token.nonces(owner);
require(nonceAfter == nonceBefore + 1, "SafeERC20: permit did not succeed");
}
/**
* @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement
* on the return value: the return value is optional (but if data is returned, it must not be false).
* @param token The token targeted by the call.
* @param data The call data (encoded using abi.encode or one of its variants).
*/
function _callOptionalReturn(IERC20 token, bytes memory data) private {
// We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since
// we're implementing it ourselves. We use {Address-functionCall} to perform this call, which verifies that
// the target address contains contract code and also asserts for success in the low-level call.
bytes memory returndata = address(token).functionCall(data, "SafeERC20: low-level call failed");
if (returndata.length > 0) {
// Return data is optional
require(abi.decode(returndata, (bool)), "SafeERC20: ERC20 operation did not succeed");
}
}
}pragma solidity >=0.6.2;
interface IWETH {
event Approval(address indexed src, address indexed guy, uint256 wad);
event Deposit(address indexed dst, uint256 wad);
event Transfer(address indexed src, address indexed dst, uint256 wad);
event Withdrawal(address indexed src, uint256 wad);
fallback() external payable;
receive() external payable;
function allowance(address, address) external view returns (uint256);
function approve(address guy, uint256 wad) external returns (bool);
function balanceOf(address) external view returns (uint256);
function decimals() external view returns (uint8);
function deposit(uint256) external payable;
function name() external view returns (string memory);
function symbol() external view returns (string memory);
function totalSupply() external view returns (uint256);
function transfer(address dst, uint256 wad) external returns (bool);
function transferFrom(address src, address dst, uint256 wad) external returns (bool);
function withdraw(uint256 wad) external;
}pragma solidity ^0.8.0;
interface IEOS20 {
// FOR ETH OS
// Deploy
function initializeToken(address owner, address router, address deployer, uint256 _devDeadline) external;
function setSpecs(
uint256 _devFeePercent,
uint256 _maxDailyPumpRate,
uint256 _reflectionsPercent,
uint256 _liquidityPercent,
uint256 _reaperDeathTime,
uint256 _cooldown,
uint256 _winAmountPercent,
uint256 _apy,
uint256 _burnPercentBuy,
uint256 _burnPercentSell
) external;
function setBurnPercentages(uint256 _burnPercentBuy, uint256 _burnPercentSell) external;
function setDescription(string memory description) external;
function setWebsite(string memory website) external;
function setSocials(string memory socials) external;
function setImage(string memory image) external;
function setChat(string memory chat) external;
function transferOwnershipOfTheToken(address) external;
function playWithDeath(address _user, bool _alive) external;
function openTrading(bool _tradingOpen) external;
function immortal(address _user) external view returns (bool);
function deathStartedTimestamp() external view returns (uint256);
function maxReflectionSwapPercent() external view returns (uint256);
function minReflectionSwapPercent() external view returns (uint256);
function savedPonziTokens(address _user) external view returns (uint256);
function antiBot() external view returns (bool);
function maxWalletPercent() external view returns (uint);
function settingLockTime() external view returns (uint256);
// Addresses
function owner() external view returns (address);
function uniswapV2Pair() external view returns (address);
function uniswapV2Router() external view returns (address);
function projectWallet() external view returns (address);
// ERC20
function totalSupply() external view returns (uint256);
function balanceOf(address account) external view returns (uint256);
function allowance(address owner, address spender) external view returns (uint256);
function transfer(address _to, uint256 _value) external returns (bool success);
function transferFrom(address _from, address _to, uint256 _value) external returns (bool success);
function approve(address _spender, uint256 _value) external returns (bool success);
// EOS20
function timeCreated() external view returns (uint256);
function getOwnerProgressLeft() external view returns (uint256);
function devDeadline() external view returns (uint);
function totalShares() external view returns (uint256);
function burn(uint256 _amount) external;
function getReserves() external view returns (uint112, uint112);
function getQuote(uint256 amountA, uint256 reserveA, uint256 reserveB) external view returns (uint256);
function burnForBoost(address, uint256) external;
function lastBuyTimestamp() external view returns (uint256);
// FOR MULTICALL
// Info
function name() external view returns (string memory);
function symbol() external view returns (string memory);
function Description() external view returns (string memory);
function Website() external view returns (string memory);
function Socials() external view returns (string memory);
function Image() external view returns (string memory);
function Chat() external view returns (string memory);
function deploymentBlock() external view returns (uint);
// Specs
function reflectionsPercent() external view returns (uint256);
function liquidityPercent() external view returns (uint256);
function winAmountPercent() external view returns (uint256);
// Shares
function share(address user) external view returns (uint256);
function shares(address user) external view returns (uint256);
function ethAccumulated(address user) external view returns (uint256);
function ethAccumulatedForUi(address _user) external view returns (uint256);
function ethWithdrawn(address user) external view returns (uint256);
function totalEthDistributed() external view returns (uint256);
// Pump
function calculatePump() external view returns (uint256 burnAmount, uint256 pumpAmount, uint256 pumpPerSecond, uint256 desiredPriceNow);
function lastPumpTimestamp() external view returns (uint256);
function maxDailyPumpRate() external view returns (uint256);
// Toggles
function togglePump(bool toggle) external;
function toggleYield(bool toggle) external;
function tradingOpen() external view returns (bool);
function yieldOn() external view returns (bool);
function gambleOn() external view returns (bool);
function autoLpOn() external view returns (bool);
function reaperOn() external view returns (bool);
// Reaper
function isAlive(address _user) external view returns (bool);
function firstReceivedBlockTimeStamp(address) external view returns (uint256);
function checkDeathTimeStamp(address _user) external view returns (uint256);
function deathTime() external view returns (uint256);
// Gamble
function cooldown() external view returns (uint256);
function winAmount() external view returns (uint256);
function getTimeLeft() external view returns (uint256);
function currentWinner() external view returns (address);
function minBuy() external view returns (uint256);
// Ponzi
function apy() external view returns (uint256);
function pendingPonziTokens(address _user) external view returns (uint256);
function claimPonziTokens(address _user) external;
// Dev
function devFeePercent() external view returns (uint256);
function devClaimableEth() external view returns (uint256);
function devWithdrawn() external view returns (uint256);
function ETH_OS() external view returns (address);
// LP
function lpAdded() external view returns (uint256);
function ethWithdrawnForUi(address user) external view returns (uint256);
//BONUS
function lastTimeClaimed(address _user) external view returns (uint256);
function ponziStart() external view returns (uint256);
function mintBonus(uint256 amount, address _user) external;
function maxWallet() external view returns (uint256);
function burnPercentageBuy() external view returns (uint256);
function burnPercentageSell() external view returns (uint256);
function setMaxWallet(bool _antiBot, uint256 _maxWallet) external;
function volumeAmount() external view returns (uint256);
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (utils/Context.sol)
pragma solidity ^0.8.0;
/**
* @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;
}
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (token/ERC20/extensions/draft-IERC20Permit.sol)
pragma solidity ^0.8.0;
/**
* @dev Interface of the ERC20 Permit extension allowing approvals to be made via signatures, as defined in
* https://eips.ethereum.org/EIPS/eip-2612[EIP-2612].
*
* Adds the {permit} method, which can be used to change an account's ERC20 allowance (see {IERC20-allowance}) by
* presenting a message signed by the account. By not relying on {IERC20-approve}, the token holder account doesn't
* need to send a transaction, and thus is not required to hold Ether at all.
*/
interface IERC20Permit {
/**
* @dev Sets `value` as the allowance of `spender` over ``owner``'s tokens,
* given ``owner``'s signed approval.
*
* IMPORTANT: The same issues {IERC20-approve} has related to transaction
* ordering also apply here.
*
* Emits an {Approval} event.
*
* Requirements:
*
* - `spender` cannot be the zero address.
* - `deadline` must be a timestamp in the future.
* - `v`, `r` and `s` must be a valid `secp256k1` signature from `owner`
* over the EIP712-formatted function arguments.
* - the signature must use ``owner``'s current nonce (see {nonces}).
*
* For more information on the signature format, see the
* https://eips.ethereum.org/EIPS/eip-2612#specification[relevant EIP
* section].
*/
function permit(
address owner,
address spender,
uint256 value,
uint256 deadline,
uint8 v,
bytes32 r,
bytes32 s
) external;
/**
* @dev Returns the current nonce for `owner`. This value must be
* included whenever a signature is generated for {permit}.
*
* Every successful call to {permit} increases ``owner``'s nonce by one. This
* prevents a signature from being used multiple times.
*/
function nonces(address owner) external view returns (uint256);
/**
* @dev Returns the domain separator used in the encoding of the signature for {permit}, as defined by {EIP712}.
*/
// solhint-disable-next-line func-name-mixedcase
function DOMAIN_SEPARATOR() external view returns (bytes32);
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.8.0) (utils/Address.sol)
pragma solidity ^0.8.1;
/**
* @dev Collection of functions related to the address type
*/
library Address {
/**
* @dev Returns true if `account` is a contract.
*
* [IMPORTANT]
* ====
* It is unsafe to assume that an address for which this function returns
* false is an externally-owned account (EOA) and not a contract.
*
* Among others, `isContract` will return false for the following
* types of addresses:
*
* - an externally-owned account
* - a contract in construction
* - an address where a contract will be created
* - an address where a contract lived, but was destroyed
* ====
*
* [IMPORTANT]
* ====
* You shouldn't rely on `isContract` to protect against flash loan attacks!
*
* Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets
* like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract
* constructor.
* ====
*/
function isContract(address account) internal view returns (bool) {
// This method relies on extcodesize/address.code.length, which returns 0
// for contracts in construction, since the code is only stored at the end
// of the constructor execution.
return account.code.length > 0;
}
/**
* @dev Replacement for Solidity's `transfer`: sends `amount` wei to
* `recipient`, forwarding all available gas and reverting on errors.
*
* https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost
* of certain opcodes, possibly making contracts go over the 2300 gas limit
* imposed by `transfer`, making them unable to receive funds via
* `transfer`. {sendValue} removes this limitation.
*
* https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more].
*
* IMPORTANT: because control is transferred to `recipient`, care must be
* taken to not create reentrancy vulnerabilities. Consider using
* {ReentrancyGuard} or the
* https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].
*/
function sendValue(address payable recipient, uint256 amount) internal {
require(address(this).balance >= amount, "Address: insufficient balance");
(bool success, ) = recipient.call{value: amount}("");
require(success, "Address: unable to send value, recipient may have reverted");
}
/**
* @dev Performs a Solidity function call using a low level `call`. A
* plain `call` is an unsafe replacement for a function call: use this
* function instead.
*
* If `target` reverts with a revert reason, it is bubbled up by this
* function (like regular Solidity function calls).
*
* Returns the raw returned data. To convert to the expected return value,
* use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`].
*
* Requirements:
*
* - `target` must be a contract.
* - calling `target` with `data` must not revert.
*
* _Available since v3.1._
*/
function functionCall(address target, bytes memory data) internal returns (bytes memory) {
return functionCallWithValue(target, data, 0, "Address: low-level call failed");
}
/**
* @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with
* `errorMessage` as a fallback revert reason when `target` reverts.
*
* _Available since v3.1._
*/
function functionCall(
address target,
bytes memory data,
string memory errorMessage
) internal returns (bytes memory) {
return functionCallWithValue(target, data, 0, errorMessage);
}
/**
* @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
* but also transferring `value` wei to `target`.
*
* Requirements:
*
* - the calling contract must have an ETH balance of at least `value`.
* - the called Solidity function must be `payable`.
*
* _Available since v3.1._
*/
function functionCallWithValue(
address target,
bytes memory data,
uint256 value
) internal returns (bytes memory) {
return functionCallWithValue(target, data, value, "Address: low-level call with value failed");
}
/**
* @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but
* with `errorMessage` as a fallback revert reason when `target` reverts.
*
* _Available since v3.1._
*/
function functionCallWithValue(
address target,
bytes memory data,
uint256 value,
string memory errorMessage
) internal returns (bytes memory) {
require(address(this).balance >= value, "Address: insufficient balance for call");
(bool success, bytes memory returndata) = target.call{value: value}(data);
return verifyCallResultFromTarget(target, success, returndata, errorMessage);
}
/**
* @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
* but performing a static call.
*
* _Available since v3.3._
*/
function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {
return functionStaticCall(target, data, "Address: low-level static call failed");
}
/**
* @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
* but performing a static call.
*
* _Available since v3.3._
*/
function functionStaticCall(
address target,
bytes memory data,
string memory errorMessage
) internal view returns (bytes memory) {
(bool success, bytes memory returndata) = target.staticcall(data);
return verifyCallResultFromTarget(target, success, returndata, errorMessage);
}
/**
* @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
* but performing a delegate call.
*
* _Available since v3.4._
*/
function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) {
return functionDelegateCall(target, data, "Address: low-level delegate call failed");
}
/**
* @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
* but performing a delegate call.
*
* _Available since v3.4._
*/
function functionDelegateCall(
address target,
bytes memory data,
string memory errorMessage
) internal returns (bytes memory) {
(bool success, bytes memory returndata) = target.delegatecall(data);
return verifyCallResultFromTarget(target, success, returndata, errorMessage);
}
/**
* @dev Tool to verify that a low level call to smart-contract was successful, and revert (either by bubbling
* the revert reason or using the provided one) in case of unsuccessful call or if target was not a contract.
*
* _Available since v4.8._
*/
function verifyCallResultFromTarget(
address target,
bool success,
bytes memory returndata,
string memory errorMessage
) internal view returns (bytes memory) {
if (success) {
if (returndata.length == 0) {
// only check isContract if the call was successful and the return data is empty
// otherwise we already know that it was a contract
require(isContract(target), "Address: call to non-contract");
}
return returndata;
} else {
_revert(returndata, errorMessage);
}
}
/**
* @dev Tool to verify that a low level call was successful, and revert if it wasn't, either by bubbling the
* revert reason or using the provided one.
*
* _Available since v4.3._
*/
function verifyCallResult(
bool success,
bytes memory returndata,
string memory errorMessage
) internal pure returns (bytes memory) {
if (success) {
return returndata;
} else {
_revert(returndata, errorMessage);
}
}
function _revert(bytes memory returndata, string memory errorMessage) private pure {
// Look for revert reason and bubble it up if present
if (returndata.length > 0) {
// The easiest way to bubble the revert reason is using memory via assembly
/// @solidity memory-safe-assembly
assembly {
let returndata_size := mload(returndata)
revert(add(32, returndata), returndata_size)
}
} else {
revert(errorMessage);
}
}
}{
"remappings": [
"forge-std/=lib/forge-std/src/",
"@openzeppelin/=lib/openzeppelin-contracts/",
"@ensdomains/=lib/v4-core/node_modules/@ensdomains/",
"@uniswap/=lib/universal-router/node_modules/@uniswap/",
"ds-test/=lib/forge-std/lib/ds-test/src/",
"erc4626-tests/=lib/v4-core/lib/openzeppelin-contracts/lib/erc4626-tests/",
"forge-gas-snapshot/=lib/permit2/lib/forge-gas-snapshot/src/",
"hardhat/=lib/v4-core/node_modules/hardhat/",
"openzeppelin-contracts/=lib/openzeppelin-contracts/",
"permit2/=lib/permit2/",
"solmate/=lib/universal-router/lib/solmate/",
"universal-router/=lib/universal-router/",
"v4-core/=lib/v4-core/src/",
"v4-periphery/=lib/v4-periphery/"
],
"optimizer": {
"enabled": true,
"runs": 200
},
"metadata": {
"useLiteralContent": false,
"bytecodeHash": "ipfs",
"appendCBOR": true
},
"outputSelection": {
"*": {
"*": [
"evm.bytecode",
"evm.deployedBytecode",
"devdoc",
"userdoc",
"metadata",
"abi"
]
}
},
"evmVersion": "paris",
"viaIR": false
}Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
Contract ABI
API[{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Funded","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"tokensReceived","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"feePaid","type":"uint256"}],"name":"Invest","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":false,"internalType":"address","name":"account","type":"address"}],"name":"Paused","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"ethReceived","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"securedEth","type":"uint256"}],"name":"Sell","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Unpaused","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Withdrawn","type":"event"},{"inputs":[],"name":"BASIS_POINTS","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"FEE_BASIS_POINTS","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PRECISION","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"user","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"beginRaise","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"claimDelay","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"claimTokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"duration","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"ethFees","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"ethVirtualReserve","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"ethWeighted","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"fetchTrades","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tradesPerCandle","type":"uint256"}],"name":"fetchTradesCustomTime","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"firstTradeTimeStamp","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"fundInitial","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokensDesired","type":"uint256"}],"name":"getEthIn","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountTokens","type":"uint256"}],"name":"getEthOut","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountTokens","type":"uint256"}],"name":"getEthOutWithFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"ethDesired","type":"uint256"}],"name":"getTokensIn","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountEth","type":"uint256"}],"name":"getTokensOut","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_duration","type":"uint256"},{"internalType":"address","name":"_wethAddress","type":"address"}],"name":"initialize","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"ethAmount","type":"uint256"},{"internalType":"uint256","name":"minTokensOut","type":"uint256"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"invest","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"lastTradeTimeStamp","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxTradesForChart","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"user","type":"address"}],"name":"multicall","outputs":[{"components":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"tokensVirtualReserve","type":"uint256"},{"internalType":"uint256","name":"ethVirtualReserve","type":"uint256"},{"internalType":"uint256","name":"weightTokensStart","type":"uint256"},{"internalType":"uint256","name":"weightTokensEnd","type":"uint256"},{"internalType":"uint256","name":"weightEthStart","type":"uint256"},{"internalType":"uint256","name":"weightEthEnd","type":"uint256"},{"internalType":"uint256","name":"startTime","type":"uint256"},{"internalType":"uint256","name":"duration","type":"uint256"},{"internalType":"uint256","name":"totalTrades","type":"uint256"},{"internalType":"uint256","name":"FEE_BASIS_POINTS","type":"uint256"},{"internalType":"uint256","name":"BASIS_POINTS","type":"uint256"},{"internalType":"uint256","name":"viewEndTime","type":"uint256"},{"internalType":"uint256","name":"timeElapsed","type":"uint256"},{"internalType":"uint256","name":"timeLeft","type":"uint256"},{"internalType":"uint256","name":"weightTokens","type":"uint256"},{"internalType":"uint256","name":"weightEth","type":"uint256"},{"internalType":"uint256","name":"tokensWeighted","type":"uint256"},{"internalType":"uint256","name":"ethWeighted","type":"uint256"},{"internalType":"uint256","name":"tokensPerWei","type":"uint256"},{"internalType":"uint256","name":"getTokensOut","type":"uint256"},{"internalType":"uint256","name":"getEthOut","type":"uint256"},{"internalType":"uint256","name":"getEthOutWithFee","type":"uint256"},{"internalType":"uint256","name":"getEthIn","type":"uint256"},{"internalType":"uint256","name":"getTokensIn","type":"uint256"},{"internalType":"uint256","name":"lastTradeTimeStamp","type":"uint256"},{"internalType":"uint256","name":"firstTradeTimeStamp","type":"uint256"},{"internalType":"uint256","name":"wethBalanceUser","type":"uint256"},{"internalType":"uint256","name":"wethBalanceRaise","type":"uint256"},{"internalType":"uint256","name":"userTokensBalance","type":"uint256"},{"internalType":"uint256","name":"allowanceWeth","type":"uint256"},{"internalType":"uint256","name":"ethBalanceUser","type":"uint256"},{"internalType":"uint256","name":"purchasedTokens","type":"uint256"},{"internalType":"uint256","name":"totalPurchased","type":"uint256"},{"internalType":"uint256","name":"totalClaimed","type":"uint256"},{"internalType":"uint256","name":"claimDelay","type":"uint256"},{"internalType":"uint256","name":"viewClaimAllowedTimeStamp","type":"uint256"},{"internalType":"uint256","name":"ethFees","type":"uint256"},{"internalType":"uint256","name":"tokenFees","type":"uint256"},{"internalType":"uint256","name":"securedEthFromTokenFees","type":"uint256"}],"internalType":"struct Raise.RaiseInfo","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"pauseTimeStamp","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"purchasedTokens","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"recoverEth","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"tokenAddress","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"recoverTokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"securedEthFromTokenFees","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountTokens","type":"uint256"},{"internalType":"uint256","name":"minEthOut","type":"uint256"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"sell","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_claimDelay","type":"uint256"}],"name":"setDelay","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_maxTradesForChart","type":"uint256"}],"name":"setMaxTradesForChart","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_tokenAddress","type":"address"}],"name":"setToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_wethAddress","type":"address"}],"name":"setWethAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"startTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"timeElapsed","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"timeLeft","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"token","outputs":[{"internalType":"contract IEOS20","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tokenFees","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tokenFeesInEth","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tokensPerWei","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tokensVirtualReserve","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tokensWeighted","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalClaimed","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalFeesInEth","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalPurchased","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalTrades","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"tradePrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"unpause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"start","type":"uint256"},{"internalType":"uint256","name":"end","type":"uint256"}],"name":"viewChart","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tradesPerCandle","type":"uint256"}],"name":"viewChartCustomTime","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"viewChartPro","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"viewClaimAllowedTimeStamp","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"viewEndTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"weightEth","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"weightEthEnd","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"weightEthStart","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"weightTokens","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"weightTokensEnd","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"weightTokensStart","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"weth","outputs":[{"internalType":"contract IWETH","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdrawFeesToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdrawFeesWETH","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]Contract Creation Code
60806040526a3e09de2596099e2b000000600455662386f26fc10000600655670c7d713b49da0000600755670dbd2fc137a3000060085567016345785d8a00006009556202a300600c556048600e553480156200005b57600080fd5b5062000067336200007b565b600180556002805460ff19169055620000cb565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6134ab80620000db6000396000f3fe6080604052600436106104095760003560e01c80638a7cd19911610213578063bd06b5f411610123578063e1f1c4a7116100ab578063f28b75511161007a578063f28b755114610b27578063f2fde38b14610b3c578063f9c58ce014610b5c578063fc0c546a14610b89578063fc4e449514610bae57600080fd5b8063e1f1c4a714610acf578063e275c99714610ae5578063e632c2f314610afb578063f27e3b2714610b1157600080fd5b8063d752f2ad116100f2578063d752f2ad14610a50578063da35a26f14610a65578063dc2cf3f514610a85578063e177246e14610a9a578063e198824214610aba57600080fd5b8063bd06b5f4146109ef578063c35f1d4914610a05578063d3c9727c14610a1a578063d54ad2a114610a3a57600080fd5b8063a525ad3c116101a6578063af2f2fbe11610175578063af2f2fbe1461096e578063af7118b914610984578063b0f66ab7146109a4578063b2ff2410146109ba578063b8f4b46e146109da57600080fd5b8063a525ad3c14610907578063a96e24231461091c578063aaf5eb681461093c578063ab731cfa1461095857600080fd5b80638fe44729116101e25780638fe447291461088f57806397541e9f146108a557806398cf549d146108d2578063a4428856146108e757600080fd5b80638a7cd1991461081b5780638b7dd3c41461083b5780638b81d62e146108515780638da5cb5b1461087157600080fd5b80633fc8cef3116103195780636fa476a4116102a15780637814ba81116102705780637814ba81146107a457806378e97925146107ba57806379aba36d146107d05780638456cb59146107f05780638a7b4d561461080557600080fd5b80636fa476a4146107435780636fbf9f881461075857806370a082311461076e578063715018a61461078f57600080fd5b80634e25b08b116102e85780634e25b08b146106b55780635a3afecf146106d55780635c975abb146106ea57806366771e971461070d578063698230b71461072d57600080fd5b80633fc8cef3146106255780634558ea2f1461065d57806348c54b9d146106735780634bae6f3f1461068857600080fd5b80631c8ec2991161039c57806322d60d171161036b57806322d60d17146105b1578063281a320f146105c65780633accaf10146105e65780633ccfd60b146105fb5780633f4ba83a1461061057600080fd5b80631c8ec299146105505780631d66ad6a146105665780631f35355d1461057b5780631f5f3b2f1461059157600080fd5b80630fb5a6b4116103d85780630fb5a6b4146104f05780631300a6d114610506578063144fa6d71461051b57806316f8ae611461053b57600080fd5b8063069c9fae14610459578063089a122c1461047b5780630a24005e146104ae5780630b90c55d146104c357600080fd5b366104545760405162461bcd60e51b8152602060048201526016602482015275139bc8191a5c9958dd08115512081858d8d95c1d195960521b60448201526064015b60405180910390fd5b600080fd5b34801561046557600080fd5b50610479610474366004612fcb565b610bc3565b005b34801561048757600080fd5b5061049b610496366004612ff5565b610bf5565b6040519081526020015b60405180910390f35b3480156104ba57600080fd5b50610479610ca9565b3480156104cf57600080fd5b506104e36104de36600461300e565b610d61565b6040516104a59190613030565b3480156104fc57600080fd5b5061049b600b5481565b34801561051257600080fd5b5061049b610e64565b34801561052757600080fd5b50610479610536366004613074565b610ea5565b34801561054757600080fd5b5061049b610ed5565b34801561055c57600080fd5b5061049b600c5481565b34801561057257600080fd5b5061049b610eff565b34801561058757600080fd5b5061049b60075481565b34801561059d57600080fd5b5061049b6105ac366004612ff5565b610f21565b3480156105bd57600080fd5b5061049b610f94565b3480156105d257600080fd5b5061049b6105e1366004612ff5565b610fdd565b3480156105f257600080fd5b5061049b61107b565b34801561060757600080fd5b50610479611095565b34801561061c57600080fd5b506104796111bc565b34801561063157600080fd5b50600354610645906001600160a01b031681565b6040516001600160a01b0390911681526020016104a5565b34801561066957600080fd5b5061049b60065481565b34801561067f57600080fd5b506104796111fa565b34801561069457600080fd5b5061049b6106a3366004613074565b60176020526000908152604090205481565b3480156106c157600080fd5b506104796106d0366004612ff5565b61140b565b3480156106e157600080fd5b506104796114a8565b3480156106f657600080fd5b5060025460ff1660405190151581526020016104a5565b34801561071957600080fd5b50610479610728366004612ff5565b6115e9565b34801561073957600080fd5b5061049b60115481565b34801561074f57600080fd5b5061049b61162c565b34801561076457600080fd5b5061049b600e5481565b34801561077a57600080fd5b5061049b610789366004613074565b50600090565b34801561079b57600080fd5b50610479611639565b3480156107b057600080fd5b5061049b60165481565b3480156107c657600080fd5b5061049b600a5481565b3480156107dc57600080fd5b506104796107eb366004613096565b61164b565b3480156107fc57600080fd5b50610479611a69565b34801561081157600080fd5b5061049b600d5481565b34801561082757600080fd5b50610479610836366004612ff5565b611a7f565b34801561084757600080fd5b5061049b60085481565b34801561085d57600080fd5b506104e361086c366004612ff5565b611a8c565b34801561087d57600080fd5b506000546001600160a01b0316610645565b34801561089b57600080fd5b5061049b60145481565b3480156108b157600080fd5b506108c56108c0366004613074565b611bb2565b6040516104a591906130c2565b3480156108de57600080fd5b506104796120c3565b3480156108f357600080fd5b506104e3610902366004612ff5565b612139565b34801561091357600080fd5b5061049b60c881565b34801561092857600080fd5b50610479610937366004613074565b612144565b34801561094857600080fd5b5061049b670de0b6b3a764000081565b34801561096457600080fd5b5061049b60155481565b34801561097a57600080fd5b5061049b60105481565b34801561099057600080fd5b5061049b61099f366004612ff5565b61216e565b3480156109b057600080fd5b5061049b60055481565b3480156109c657600080fd5b5061049b6109d5366004612ff5565b61219b565b3480156109e657600080fd5b5061049b612208565b3480156109fb57600080fd5b5061049b60095481565b348015610a1157600080fd5b506104e3612228565b348015610a2657600080fd5b50610479610a35366004613096565b612397565b348015610a4657600080fd5b5061049b60135481565b348015610a5c57600080fd5b5061049b612837565b348015610a7157600080fd5b50610479610a8036600461329d565b6128dd565b348015610a9157600080fd5b5061049b61290c565b348015610aa657600080fd5b50610479610ab5366004612ff5565b612948565b348015610ac657600080fd5b5061049b612955565b348015610adb57600080fd5b5061049b61271081565b348015610af157600080fd5b5061049b600f5481565b348015610b0757600080fd5b5061049b60125481565b348015610b1d57600080fd5b5061049b60045481565b348015610b3357600080fd5b5061049b612974565b348015610b4857600080fd5b50610479610b57366004613074565b612a13565b348015610b6857600080fd5b5061049b610b77366004612ff5565b60186020526000908152604090205481565b348015610b9557600080fd5b506002546106459061010090046001600160a01b031681565b348015610bba57600080fd5b506104e3612a8c565b610bcb612a9b565b610bf1610be06000546001600160a01b031690565b6001600160a01b0384169083612af5565b5050565b600080610c00612208565b90506000610c0c610ed5565b90508382111580610c1b575080155b80610c24575083155b15610c3457506000199392505050565b6000612710610c4386846132df565b610c4d91906132df565b90506000610c5e60c86127106132f6565b610c6887866132f6565b610c7291906132df565b90506000610c80828461331f565b9050610c8c8284613333565b15610c9f57610c9c600182613347565b90505b9695505050505050565b610cb1612a9b565b610cb9612b58565b600a5415610d095760405162461bcd60e51b815260206004820152601760248201527f41756374696f6e20616c72656164792073746172746564000000000000000000604482015260640161044b565b600060055411610d5b5760405162461bcd60e51b815260206004820152601960248201527f4d7573742066756e6420696e697469616c207265736572766500000000000000604482015260640161044b565b42600a55565b60608282118015610d7d57506103e8610d7a84846132f6565b11155b610db95760405162461bcd60e51b815260206004820152600d60248201526c496e76616c69642072616e676560981b604482015260640161044b565b6000610dc584846132f6565b67ffffffffffffffff811115610ddd57610ddd61335a565b604051908082528060200260200182016040528015610e06578160200160208202803683370190505b509050835b83811015610e5a5760008181526018602052604090205482610e2d87846132f6565b81518110610e3d57610e3d613370565b602090810291909101015280610e5281613386565b915050610e0b565b5090505b92915050565b6000600a5460001480610e805750600b54610e7d61290c565b10155b15610e8b5750600090565b610e9361290c565b600b54610ea091906132f6565b905090565b610ead612a9b565b600280546001600160a01b0390921661010002610100600160a81b0319909216919091179055565b6000670de0b6b3a7640000610ee8612837565b600554610ef591906132df565b610ea0919061331f565b6000600a54600003610f115750600090565b600b54600a54610ea09190613347565b600080610f2c612208565b90506000610f38610ed5565b90508381111580610f47575081155b80610f50575083155b15610f6057506000199392505050565b6000612710610f6f86856132df565b610f7991906132df565b90506000610f8a60c86127106132f6565b610c6887856132f6565b600080610f9f610ed5565b905080600003610fb25760001991505090565b80610fbb612208565b610fcd90670de0b6b3a76400006132df565b610fd7919061331f565b91505090565b600080610fe8612208565b90506000610ff4610ed5565b9050801580611001575081155b8061100a575083155b15611019575060009392505050565b600061271061102960c8826132f6565b61103390876132df565b61103d919061331f565b9050600061104b8284613347565b9050600061105985846132df565b9050816110668183613347565b611070919061331f565b979650505050505050565b600061108860155461219b565b601454610ea09190613347565b6000600a541180156110b05750600b546110ad61290c565b10155b6110cc5760405162461bcd60e51b815260040161044b9061339f565b6110d4612a9b565b6003546040516370a0823160e01b81523060048201526000916001600160a01b0316906370a0823190602401602060405180830381865afa15801561111d573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061114191906133c7565b905061116b6111586000546001600160a01b031690565b6003546001600160a01b03169083612af5565b6000546001600160a01b03166001600160a01b03167f7084f5476618d8e60b11ef0d7d3f06914655adb8793e28ff7f018d4c76d505d5826040516111b191815260200190565b60405180910390a250565b6111c4612a9b565b6111cc612b9e565b600a54156111f857600d546111e190426132f6565b600a60008282546111f29190613347565b90915550505b565b6000600a541180156112155750600b5461121261290c565b10155b6112315760405162461bcd60e51b815260040161044b9061339f565b611239612bf0565b611241612b58565b600c54600b54600a546112549190613347565b61125e9190613347565b42116112a55760405162461bcd60e51b815260206004820152601660248201527521b630b4b6903737ba1030b63637bbb2b2103cb2ba1760511b604482015260640161044b565b6002546040516370a0823160e01b815230600482015260009161010090046001600160a01b0316906370a0823190602401602060405180830381865afa1580156112f3573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061131791906133c7565b1161135c5760405162461bcd60e51b8152602060048201526015602482015274151bdad95b9cc81b9bdd08199d5b991959081e595d605a1b604482015260640161044b565b336000908152601760205260409020546113ac5760405162461bcd60e51b81526020600482015260116024820152702737ba3434b733903a379031b630b4b69760791b604482015260640161044b565b3360009081526017602052604081205460138054919283926113cf908490613347565b909155505033600081815260176020526040812055600254611401916101009091046001600160a01b03169083612af5565b506111f860018055565b611413612a9b565b600080546040516001600160a01b039091169083908381818185875af1925050503d8060008114611460576040519150601f19603f3d011682016040523d82523d6000602084013e611465565b606091505b5050905080610bf15760405162461bcd60e51b815260206004820152600f60248201526e151c985b9cd9995c8819985a5b1959608a1b604482015260640161044b565b6000600a541180156114c35750600b546114c061290c565b10155b6114df5760405162461bcd60e51b815260040161044b9061339f565b6114e7612a9b565b6016546014546114f79190613347565b6003546040516370a0823160e01b81523060048201526001600160a01b03909116906370a0823190602401602060405180830381865afa15801561153f573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061156391906133c7565b10156115a55760405162461bcd60e51b8152602060048201526011602482015270496e73756666696369656e74206665657360781b604482015260640161044b565b6115dd6115ba6000546001600160a01b031690565b6016546014546115ca9190613347565b6003546001600160a01b03169190612af5565b60006014819055601655565b6115f1612a9b565b60058190556040518181527fc4c14883ae9fd8e26d5d59e3485ed29fd126d781d7e498a4ca5c54c8268e49369060200160405180910390a150565b6000610ea060155461219b565b611641612a9b565b6111f86000612c49565b611653612bf0565b61165b612b58565b804211156116a15760405162461bcd60e51b815260206004820152601360248201527222bc3834b932b2103a3930b739b0b1ba34b7b760691b604482015260640161044b565b6000600a541180156116bb5750600b546116b961290c565b105b6116fc5760405162461bcd60e51b815260206004820152601260248201527141756374696f6e206e6f742061637469766560701b604482015260640161044b565b6000831161173a5760405162461bcd60e51b815260206004820152600b60248201526a139bc8115512081cd95b9d60aa1b604482015260640161044b565b6003546040516370a0823160e01b815233600482015284916001600160a01b0316906370a0823190602401602060405180830381865afa158015611782573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117a691906133c7565b10156117ee5760405162461bcd60e51b81526020600482015260176024820152762737ba1039bab33334b1b4b2b73a103130b630b731b29760491b604482015260640161044b565b60006117f8612208565b90506000611804610ed5565b90506000821180156118165750600081115b6118545760405162461bcd60e51b815260206004820152600f60248201526e496e76616c6964207765696768747360881b604482015260640161044b565b600061185f86610fdd565b9050848110156118a55760405162461bcd60e51b815260206004820152601160248201527014db1a5c1c1859d948195e18d959591959607a1b604482015260640161044b565b600081116118e95760405162461bcd60e51b8152602060048201526011602482015270139bc81d1bdad95b9cc81d1bc81cd95b99607a1b604482015260640161044b565b60006127106118f960c8896132df565b611903919061331f565b905080601460008282546119179190613347565b9091555050600354611934906001600160a01b031633308a612c99565b600061271061194460c8826132f6565b61194e908a6132df565b611958919061331f565b9050806005600082825461196c9190613347565b92505081905550826004600082825461198591906132f6565b909155505060115460000361199957426011555b33600090815260176020526040812080548592906119b8908490613347565b9250508190555082601260008282546119d19190613347565b909155506119e89050670de0b6b3a7640000610bf5565b600f805460009081526018602052604081209290925542601055805491611a0e83613386565b9091555050604080518981526020810185905290810183905233907f4df9cbfa66cbbabb528375b3af00207b446225af5a96b8a4b5c413b18226fb959060600160405180910390a25050505050611a6460018055565b505050565b611a71612a9b565b611a79612cd7565b42600d55565b611a87612a9b565b600e55565b606060008211611ad45760405162461bcd60e51b8152602060048201526013602482015272496e76616c69642063616e646c652073697a6560681b604482015260640161044b565b600082600184600f54611ae79190613347565b611af191906132f6565b611afb919061331f565b905060008167ffffffffffffffff811115611b1857611b1861335a565b604051908082528060200260200182016040528015611b41578160200160208202803683370190505b50905060005b82811015611baa576000611b5b86836132df565b9050600f54811015611b97576000818152601860205260409020548351849084908110611b8a57611b8a613370565b6020026020010181815250505b5080611ba281613386565b915050611b47565b509392505050565b611cf360405180610520016040528060006001600160a01b0316815260200160006001600160a01b031681526020016000815260200160008152602001600081526020016000815260200160008152602001600081526020016000815260200160008152602001600081526020016000815260200160008152602001600081526020016000815260200160008152602001600081526020016000815260200160008152602001600081526020016000815260200160008152602001600081526020016000815260200160008152602001600081526020016000815260200160008152602001600081526020016000815260200160008152602001600081526020016000815260200160008152602001600081526020016000815260200160008152602001600081526020016000815260200160008152602001600081525090565b604051806105200160405280611d116000546001600160a01b031690565b6001600160a01b03908116825260025461010090819004909116602083015260045460408301526005546060830152600654608083015260075460a083015260085460c083015260095460e0830152600a5490820152600b54610120820152600f5461014082015260c86101608201526127106101808201526101a001611d96610eff565b8152602001611da361290c565b8152602001611db0610e64565b8152602001611dbd612974565b8152602001611dca612837565b8152602001611dd7612208565b8152602001611de4610ed5565b8152602001611df1610f94565b8152602001611e07670de0b6b3a7640000610fdd565b8152602001611e1d670de0b6b3a764000061219b565b8152602001611e33670de0b6b3a764000061216e565b8152602001611e49670de0b6b3a7640000610bf5565b8152602001611e5f670de0b6b3a7640000610f21565b8152601054602082015260115460408083019190915260035490516370a0823160e01b81526001600160a01b038681166004830152606090930192909116906370a0823190602401602060405180830381865afa158015611ec4573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611ee891906133c7565b81526003546040516370a0823160e01b81523060048201526020909201916001600160a01b03909116906370a0823190602401602060405180830381865afa158015611f38573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611f5c91906133c7565b81526002546040516370a0823160e01b81526001600160a01b038681166004830152602090930192610100909204909116906370a0823190602401602060405180830381865afa158015611fb4573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611fd891906133c7565b8152600354604051636eb1769f60e11b81526001600160a01b0386811660048301523060248301526020909301929091169063dd62ed3e90604401602060405180830381865afa158015612030573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061205491906133c7565b81526001600160a01b0384168031602080840191909152600091825260179052604090819020549082015260125460608201526013546080820152600c5460a082015260c0016120a2612955565b81526014546020820152601554604082015260165460609091015292915050565b6000600a541180156120de5750600b546120db61290c565b10155b6120fa5760405162461bcd60e51b815260040161044b9061339f565b612102612a9b565b6121326121176000546001600160a01b031690565b60155460025461010090046001600160a01b03169190612af5565b6000601555565b6060610e5e82611a8c565b61214c612a9b565b600380546001600160a01b0319166001600160a01b0392909216919091179055565b600061271061217e60c8826132f6565b6121878461219b565b61219191906132df565b610e5e919061331f565b6000806121a6612208565b905060006121b2610ed5565b90508115806121bf575080155b806121c8575083155b156121d7575060009392505050565b60006121e38584613347565b905060006121f183876132df565b9050816121fe8183613347565b610c9f919061331f565b6000670de0b6b3a764000061221b612974565b600454610ef591906132df565b6060600f54600003612247575060408051600081526020810190915290565b600e546122559060026132df565b600f54111561238a576000600e54600f54612270919061331f565b9050600081600f54612282919061331f565b61228d906001613347565b905060008167ffffffffffffffff8111156122aa576122aa61335a565b6040519080825280602002602001820160405280156122d3578160200160208202803683370190505b50905060005b6122e46001846132f6565b81101561233757601860006122f986846132df565b81526020019081526020016000205482828151811061231a5761231a613370565b60209081029190910101528061232f81613386565b9150506122d9565b50601860006001600f5461234b91906132f6565b8152602001908152602001600020548160018461236891906132f6565b8151811061237857612378613370565b60209081029190910101529392505050565b610ea06000600f54610d61565b61239f612bf0565b6123a7612b58565b804211156123ed5760405162461bcd60e51b815260206004820152601360248201527222bc3834b932b2103a3930b739b0b1ba34b7b760691b604482015260640161044b565b6000600a541180156124075750600b5461240561290c565b105b6124485760405162461bcd60e51b815260206004820152601260248201527141756374696f6e206e6f742061637469766560701b604482015260640161044b565b600083116124895760405162461bcd60e51b815260206004820152600e60248201526d139bc81d1bdad95b9cc81cd95b9d60921b604482015260640161044b565b336000908152601760205260409020548311156124e25760405162461bcd60e51b81526020600482015260176024820152762737ba1039bab33334b1b4b2b73a103130b630b731b29760491b604482015260640161044b565b60006124ec612208565b905060006124f8610ed5565b90506000612504612208565b90506000612510610ed5565b90506000821180156125225750600081115b6125605760405162461bcd60e51b815260206004820152600f60248201526e496e76616c6964207765696768747360881b604482015260640161044b565b600061256b8861219b565b905060006125788961216e565b9050878110156125be5760405162461bcd60e51b815260206004820152601160248201527014db1a5c1c1859d948195e18d959591959607a1b604482015260640161044b565b600081116125ff5760405162461bcd60e51b815260206004820152600e60248201526d139bc8115512081d1bc81cd95b9960921b604482015260640161044b565b806005541015801561267b57506003546040516370a0823160e01b815230600482015282916001600160a01b0316906370a0823190602401602060405180830381865afa158015612654573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061267891906133c7565b10155b6126c75760405162461bcd60e51b815260206004820152601c60248201527f496e73756666696369656e742045544820696e20636f6e747261637400000000604482015260640161044b565b60006127106126d760c88c6132df565b6126e1919061331f565b905080601560008282546126f59190613347565b909155506000905061270783856132f6565b9050806016600082825461271b9190613347565b909155505033600090815260176020526040812080548d929061273f9084906132f6565b925050819055508a6012600082825461275891906132f6565b925050819055508a600460008282546127719190613347565b92505081905550836005600082825461278a91906132f6565b909155506127a19050670de0b6b3a7640000610bf5565b600f8054600090815260186020526040812092909255426010558054916127c783613386565b90915550506003546127e3906001600160a01b03163385612af5565b604080518c81526020810185905290810182905233907f846c37eef631e0943682d87352ec117c20008eb7f425c9b85ac011a6d4774cc09060600160405180910390a25050505050505050611a6460018055565b6000600a546000148061284a5750600b54155b156128555750600090565b6000600b54670de0b6b3a764000061286b61290c565b61287591906132df565b61287f919061331f565b9050600060095460085461289391906132f6565b9050670de0b6b3a76400006001816128ab85856132df565b6128b59190613347565b6128bf91906132f6565b6128c9919061331f565b6008546128d691906132f6565b9250505090565b6128e5612a9b565b600b91909155600380546001600160a01b0319166001600160a01b03909216919091179055565b6000600a5460000361291e5750600090565b600b54600a5461292e90426132f6565b111561293b5750600b5490565b600a54610ea090426132f6565b612950612a9b565b600c55565b6000600c54600b54600a5461296a9190613347565b610ea09190613347565b6000600a54600014806129875750600b54155b156129925750600090565b6000600b54670de0b6b3a76400006129a861290c565b6129b291906132df565b6129bc919061331f565b905060006006546007546129d091906132f6565b9050670de0b6b3a76400006001816129e885856132df565b6129f29190613347565b6129fc91906132f6565b612a06919061331f565b6006546128d69190613347565b612a1b612a9b565b6001600160a01b038116612a805760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b606482015260840161044b565b612a8981612c49565b50565b6060610ea06000600f54610d61565b6000546001600160a01b031633146111f85760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161044b565b6040516001600160a01b038316602482015260448101829052611a6490849063a9059cbb60e01b906064015b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b031990931692909217909152612d14565b60025460ff16156111f85760405162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b604482015260640161044b565b612ba6612de6565b6002805460ff191690557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa335b6040516001600160a01b03909116815260200160405180910390a1565b600260015403612c425760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604482015260640161044b565b6002600155565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6040516001600160a01b0380851660248301528316604482015260648101829052612cd19085906323b872dd60e01b90608401612b21565b50505050565b612cdf612b58565b6002805460ff191660011790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a258612bd33390565b6000612d69826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b0316612e2f9092919063ffffffff16565b805190915015611a645780806020019051810190612d8791906133e0565b611a645760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b606482015260840161044b565b60025460ff166111f85760405162461bcd60e51b815260206004820152601460248201527314185d5cd8589b194e881b9bdd081c185d5cd95960621b604482015260640161044b565b6060612e3e8484600085612e46565b949350505050565b606082471015612ea75760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b606482015260840161044b565b600080866001600160a01b03168587604051612ec39190613426565b60006040518083038185875af1925050503d8060008114612f00576040519150601f19603f3d011682016040523d82523d6000602084013e612f05565b606091505b50915091506110708783838760608315612f80578251600003612f79576001600160a01b0385163b612f795760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015260640161044b565b5081612e3e565b612e3e8383815115612f955781518083602001fd5b8060405162461bcd60e51b815260040161044b9190613442565b80356001600160a01b0381168114612fc657600080fd5b919050565b60008060408385031215612fde57600080fd5b612fe783612faf565b946020939093013593505050565b60006020828403121561300757600080fd5b5035919050565b6000806040838503121561302157600080fd5b50508035926020909101359150565b6020808252825182820181905260009190848201906040850190845b818110156130685783518352928401929184019160010161304c565b50909695505050505050565b60006020828403121561308657600080fd5b61308f82612faf565b9392505050565b6000806000606084860312156130ab57600080fd5b505081359360208301359350604090920135919050565b81516001600160a01b03168152610520810160208301516130ee60208401826001600160a01b03169052565b5060408381015190830152606080840151908301526080808401519083015260a0808401519083015260c0808401519083015260e08084015190830152610100808401519083015261012080840151908301526101408084015190830152610160808401519083015261018080840151908301526101a080840151908301526101c080840151908301526101e08084015190830152610200808401519083015261022080840151908301526102408084015190830152610260808401519083015261028080840151908301526102a080840151908301526102c080840151908301526102e08084015190830152610300808401519083015261032080840151908301526103408084015190830152610360808401519083015261038080840151908301526103a080840151908301526103c080840151908301526103e08084015190830152610400808401519083015261042080840151908301526104408084015190830152610460808401519083015261048080840151908301526104a080840151908301526104c080840151908301526104e0808401519083015261050092830151929091019190915290565b600080604083850312156132b057600080fd5b823591506132c060208401612faf565b90509250929050565b634e487b7160e01b600052601160045260246000fd5b8082028115828204841417610e5e57610e5e6132c9565b81810381811115610e5e57610e5e6132c9565b634e487b7160e01b600052601260045260246000fd5b60008261332e5761332e613309565b500490565b60008261334257613342613309565b500690565b80820180821115610e5e57610e5e6132c9565b634e487b7160e01b600052604160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b600060018201613398576133986132c9565b5060010190565b6020808252600e908201526d41756374696f6e2061637469766560901b604082015260600190565b6000602082840312156133d957600080fd5b5051919050565b6000602082840312156133f257600080fd5b8151801515811461308f57600080fd5b60005b8381101561341d578181015183820152602001613405565b50506000910152565b60008251613438818460208701613402565b9190910192915050565b6020815260008251806020840152613461816040850160208701613402565b601f01601f1916919091016040019291505056fea26469706673582212206156efb7cfe859850029af01c752ae1597cd03872b2235cc4c0001ddf2a3403b64736f6c63430008130033
Deployed Bytecode
0x6080604052600436106104095760003560e01c80638a7cd19911610213578063bd06b5f411610123578063e1f1c4a7116100ab578063f28b75511161007a578063f28b755114610b27578063f2fde38b14610b3c578063f9c58ce014610b5c578063fc0c546a14610b89578063fc4e449514610bae57600080fd5b8063e1f1c4a714610acf578063e275c99714610ae5578063e632c2f314610afb578063f27e3b2714610b1157600080fd5b8063d752f2ad116100f2578063d752f2ad14610a50578063da35a26f14610a65578063dc2cf3f514610a85578063e177246e14610a9a578063e198824214610aba57600080fd5b8063bd06b5f4146109ef578063c35f1d4914610a05578063d3c9727c14610a1a578063d54ad2a114610a3a57600080fd5b8063a525ad3c116101a6578063af2f2fbe11610175578063af2f2fbe1461096e578063af7118b914610984578063b0f66ab7146109a4578063b2ff2410146109ba578063b8f4b46e146109da57600080fd5b8063a525ad3c14610907578063a96e24231461091c578063aaf5eb681461093c578063ab731cfa1461095857600080fd5b80638fe44729116101e25780638fe447291461088f57806397541e9f146108a557806398cf549d146108d2578063a4428856146108e757600080fd5b80638a7cd1991461081b5780638b7dd3c41461083b5780638b81d62e146108515780638da5cb5b1461087157600080fd5b80633fc8cef3116103195780636fa476a4116102a15780637814ba81116102705780637814ba81146107a457806378e97925146107ba57806379aba36d146107d05780638456cb59146107f05780638a7b4d561461080557600080fd5b80636fa476a4146107435780636fbf9f881461075857806370a082311461076e578063715018a61461078f57600080fd5b80634e25b08b116102e85780634e25b08b146106b55780635a3afecf146106d55780635c975abb146106ea57806366771e971461070d578063698230b71461072d57600080fd5b80633fc8cef3146106255780634558ea2f1461065d57806348c54b9d146106735780634bae6f3f1461068857600080fd5b80631c8ec2991161039c57806322d60d171161036b57806322d60d17146105b1578063281a320f146105c65780633accaf10146105e65780633ccfd60b146105fb5780633f4ba83a1461061057600080fd5b80631c8ec299146105505780631d66ad6a146105665780631f35355d1461057b5780631f5f3b2f1461059157600080fd5b80630fb5a6b4116103d85780630fb5a6b4146104f05780631300a6d114610506578063144fa6d71461051b57806316f8ae611461053b57600080fd5b8063069c9fae14610459578063089a122c1461047b5780630a24005e146104ae5780630b90c55d146104c357600080fd5b366104545760405162461bcd60e51b8152602060048201526016602482015275139bc8191a5c9958dd08115512081858d8d95c1d195960521b60448201526064015b60405180910390fd5b600080fd5b34801561046557600080fd5b50610479610474366004612fcb565b610bc3565b005b34801561048757600080fd5b5061049b610496366004612ff5565b610bf5565b6040519081526020015b60405180910390f35b3480156104ba57600080fd5b50610479610ca9565b3480156104cf57600080fd5b506104e36104de36600461300e565b610d61565b6040516104a59190613030565b3480156104fc57600080fd5b5061049b600b5481565b34801561051257600080fd5b5061049b610e64565b34801561052757600080fd5b50610479610536366004613074565b610ea5565b34801561054757600080fd5b5061049b610ed5565b34801561055c57600080fd5b5061049b600c5481565b34801561057257600080fd5b5061049b610eff565b34801561058757600080fd5b5061049b60075481565b34801561059d57600080fd5b5061049b6105ac366004612ff5565b610f21565b3480156105bd57600080fd5b5061049b610f94565b3480156105d257600080fd5b5061049b6105e1366004612ff5565b610fdd565b3480156105f257600080fd5b5061049b61107b565b34801561060757600080fd5b50610479611095565b34801561061c57600080fd5b506104796111bc565b34801561063157600080fd5b50600354610645906001600160a01b031681565b6040516001600160a01b0390911681526020016104a5565b34801561066957600080fd5b5061049b60065481565b34801561067f57600080fd5b506104796111fa565b34801561069457600080fd5b5061049b6106a3366004613074565b60176020526000908152604090205481565b3480156106c157600080fd5b506104796106d0366004612ff5565b61140b565b3480156106e157600080fd5b506104796114a8565b3480156106f657600080fd5b5060025460ff1660405190151581526020016104a5565b34801561071957600080fd5b50610479610728366004612ff5565b6115e9565b34801561073957600080fd5b5061049b60115481565b34801561074f57600080fd5b5061049b61162c565b34801561076457600080fd5b5061049b600e5481565b34801561077a57600080fd5b5061049b610789366004613074565b50600090565b34801561079b57600080fd5b50610479611639565b3480156107b057600080fd5b5061049b60165481565b3480156107c657600080fd5b5061049b600a5481565b3480156107dc57600080fd5b506104796107eb366004613096565b61164b565b3480156107fc57600080fd5b50610479611a69565b34801561081157600080fd5b5061049b600d5481565b34801561082757600080fd5b50610479610836366004612ff5565b611a7f565b34801561084757600080fd5b5061049b60085481565b34801561085d57600080fd5b506104e361086c366004612ff5565b611a8c565b34801561087d57600080fd5b506000546001600160a01b0316610645565b34801561089b57600080fd5b5061049b60145481565b3480156108b157600080fd5b506108c56108c0366004613074565b611bb2565b6040516104a591906130c2565b3480156108de57600080fd5b506104796120c3565b3480156108f357600080fd5b506104e3610902366004612ff5565b612139565b34801561091357600080fd5b5061049b60c881565b34801561092857600080fd5b50610479610937366004613074565b612144565b34801561094857600080fd5b5061049b670de0b6b3a764000081565b34801561096457600080fd5b5061049b60155481565b34801561097a57600080fd5b5061049b60105481565b34801561099057600080fd5b5061049b61099f366004612ff5565b61216e565b3480156109b057600080fd5b5061049b60055481565b3480156109c657600080fd5b5061049b6109d5366004612ff5565b61219b565b3480156109e657600080fd5b5061049b612208565b3480156109fb57600080fd5b5061049b60095481565b348015610a1157600080fd5b506104e3612228565b348015610a2657600080fd5b50610479610a35366004613096565b612397565b348015610a4657600080fd5b5061049b60135481565b348015610a5c57600080fd5b5061049b612837565b348015610a7157600080fd5b50610479610a8036600461329d565b6128dd565b348015610a9157600080fd5b5061049b61290c565b348015610aa657600080fd5b50610479610ab5366004612ff5565b612948565b348015610ac657600080fd5b5061049b612955565b348015610adb57600080fd5b5061049b61271081565b348015610af157600080fd5b5061049b600f5481565b348015610b0757600080fd5b5061049b60125481565b348015610b1d57600080fd5b5061049b60045481565b348015610b3357600080fd5b5061049b612974565b348015610b4857600080fd5b50610479610b57366004613074565b612a13565b348015610b6857600080fd5b5061049b610b77366004612ff5565b60186020526000908152604090205481565b348015610b9557600080fd5b506002546106459061010090046001600160a01b031681565b348015610bba57600080fd5b506104e3612a8c565b610bcb612a9b565b610bf1610be06000546001600160a01b031690565b6001600160a01b0384169083612af5565b5050565b600080610c00612208565b90506000610c0c610ed5565b90508382111580610c1b575080155b80610c24575083155b15610c3457506000199392505050565b6000612710610c4386846132df565b610c4d91906132df565b90506000610c5e60c86127106132f6565b610c6887866132f6565b610c7291906132df565b90506000610c80828461331f565b9050610c8c8284613333565b15610c9f57610c9c600182613347565b90505b9695505050505050565b610cb1612a9b565b610cb9612b58565b600a5415610d095760405162461bcd60e51b815260206004820152601760248201527f41756374696f6e20616c72656164792073746172746564000000000000000000604482015260640161044b565b600060055411610d5b5760405162461bcd60e51b815260206004820152601960248201527f4d7573742066756e6420696e697469616c207265736572766500000000000000604482015260640161044b565b42600a55565b60608282118015610d7d57506103e8610d7a84846132f6565b11155b610db95760405162461bcd60e51b815260206004820152600d60248201526c496e76616c69642072616e676560981b604482015260640161044b565b6000610dc584846132f6565b67ffffffffffffffff811115610ddd57610ddd61335a565b604051908082528060200260200182016040528015610e06578160200160208202803683370190505b509050835b83811015610e5a5760008181526018602052604090205482610e2d87846132f6565b81518110610e3d57610e3d613370565b602090810291909101015280610e5281613386565b915050610e0b565b5090505b92915050565b6000600a5460001480610e805750600b54610e7d61290c565b10155b15610e8b5750600090565b610e9361290c565b600b54610ea091906132f6565b905090565b610ead612a9b565b600280546001600160a01b0390921661010002610100600160a81b0319909216919091179055565b6000670de0b6b3a7640000610ee8612837565b600554610ef591906132df565b610ea0919061331f565b6000600a54600003610f115750600090565b600b54600a54610ea09190613347565b600080610f2c612208565b90506000610f38610ed5565b90508381111580610f47575081155b80610f50575083155b15610f6057506000199392505050565b6000612710610f6f86856132df565b610f7991906132df565b90506000610f8a60c86127106132f6565b610c6887856132f6565b600080610f9f610ed5565b905080600003610fb25760001991505090565b80610fbb612208565b610fcd90670de0b6b3a76400006132df565b610fd7919061331f565b91505090565b600080610fe8612208565b90506000610ff4610ed5565b9050801580611001575081155b8061100a575083155b15611019575060009392505050565b600061271061102960c8826132f6565b61103390876132df565b61103d919061331f565b9050600061104b8284613347565b9050600061105985846132df565b9050816110668183613347565b611070919061331f565b979650505050505050565b600061108860155461219b565b601454610ea09190613347565b6000600a541180156110b05750600b546110ad61290c565b10155b6110cc5760405162461bcd60e51b815260040161044b9061339f565b6110d4612a9b565b6003546040516370a0823160e01b81523060048201526000916001600160a01b0316906370a0823190602401602060405180830381865afa15801561111d573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061114191906133c7565b905061116b6111586000546001600160a01b031690565b6003546001600160a01b03169083612af5565b6000546001600160a01b03166001600160a01b03167f7084f5476618d8e60b11ef0d7d3f06914655adb8793e28ff7f018d4c76d505d5826040516111b191815260200190565b60405180910390a250565b6111c4612a9b565b6111cc612b9e565b600a54156111f857600d546111e190426132f6565b600a60008282546111f29190613347565b90915550505b565b6000600a541180156112155750600b5461121261290c565b10155b6112315760405162461bcd60e51b815260040161044b9061339f565b611239612bf0565b611241612b58565b600c54600b54600a546112549190613347565b61125e9190613347565b42116112a55760405162461bcd60e51b815260206004820152601660248201527521b630b4b6903737ba1030b63637bbb2b2103cb2ba1760511b604482015260640161044b565b6002546040516370a0823160e01b815230600482015260009161010090046001600160a01b0316906370a0823190602401602060405180830381865afa1580156112f3573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061131791906133c7565b1161135c5760405162461bcd60e51b8152602060048201526015602482015274151bdad95b9cc81b9bdd08199d5b991959081e595d605a1b604482015260640161044b565b336000908152601760205260409020546113ac5760405162461bcd60e51b81526020600482015260116024820152702737ba3434b733903a379031b630b4b69760791b604482015260640161044b565b3360009081526017602052604081205460138054919283926113cf908490613347565b909155505033600081815260176020526040812055600254611401916101009091046001600160a01b03169083612af5565b506111f860018055565b611413612a9b565b600080546040516001600160a01b039091169083908381818185875af1925050503d8060008114611460576040519150601f19603f3d011682016040523d82523d6000602084013e611465565b606091505b5050905080610bf15760405162461bcd60e51b815260206004820152600f60248201526e151c985b9cd9995c8819985a5b1959608a1b604482015260640161044b565b6000600a541180156114c35750600b546114c061290c565b10155b6114df5760405162461bcd60e51b815260040161044b9061339f565b6114e7612a9b565b6016546014546114f79190613347565b6003546040516370a0823160e01b81523060048201526001600160a01b03909116906370a0823190602401602060405180830381865afa15801561153f573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061156391906133c7565b10156115a55760405162461bcd60e51b8152602060048201526011602482015270496e73756666696369656e74206665657360781b604482015260640161044b565b6115dd6115ba6000546001600160a01b031690565b6016546014546115ca9190613347565b6003546001600160a01b03169190612af5565b60006014819055601655565b6115f1612a9b565b60058190556040518181527fc4c14883ae9fd8e26d5d59e3485ed29fd126d781d7e498a4ca5c54c8268e49369060200160405180910390a150565b6000610ea060155461219b565b611641612a9b565b6111f86000612c49565b611653612bf0565b61165b612b58565b804211156116a15760405162461bcd60e51b815260206004820152601360248201527222bc3834b932b2103a3930b739b0b1ba34b7b760691b604482015260640161044b565b6000600a541180156116bb5750600b546116b961290c565b105b6116fc5760405162461bcd60e51b815260206004820152601260248201527141756374696f6e206e6f742061637469766560701b604482015260640161044b565b6000831161173a5760405162461bcd60e51b815260206004820152600b60248201526a139bc8115512081cd95b9d60aa1b604482015260640161044b565b6003546040516370a0823160e01b815233600482015284916001600160a01b0316906370a0823190602401602060405180830381865afa158015611782573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117a691906133c7565b10156117ee5760405162461bcd60e51b81526020600482015260176024820152762737ba1039bab33334b1b4b2b73a103130b630b731b29760491b604482015260640161044b565b60006117f8612208565b90506000611804610ed5565b90506000821180156118165750600081115b6118545760405162461bcd60e51b815260206004820152600f60248201526e496e76616c6964207765696768747360881b604482015260640161044b565b600061185f86610fdd565b9050848110156118a55760405162461bcd60e51b815260206004820152601160248201527014db1a5c1c1859d948195e18d959591959607a1b604482015260640161044b565b600081116118e95760405162461bcd60e51b8152602060048201526011602482015270139bc81d1bdad95b9cc81d1bc81cd95b99607a1b604482015260640161044b565b60006127106118f960c8896132df565b611903919061331f565b905080601460008282546119179190613347565b9091555050600354611934906001600160a01b031633308a612c99565b600061271061194460c8826132f6565b61194e908a6132df565b611958919061331f565b9050806005600082825461196c9190613347565b92505081905550826004600082825461198591906132f6565b909155505060115460000361199957426011555b33600090815260176020526040812080548592906119b8908490613347565b9250508190555082601260008282546119d19190613347565b909155506119e89050670de0b6b3a7640000610bf5565b600f805460009081526018602052604081209290925542601055805491611a0e83613386565b9091555050604080518981526020810185905290810183905233907f4df9cbfa66cbbabb528375b3af00207b446225af5a96b8a4b5c413b18226fb959060600160405180910390a25050505050611a6460018055565b505050565b611a71612a9b565b611a79612cd7565b42600d55565b611a87612a9b565b600e55565b606060008211611ad45760405162461bcd60e51b8152602060048201526013602482015272496e76616c69642063616e646c652073697a6560681b604482015260640161044b565b600082600184600f54611ae79190613347565b611af191906132f6565b611afb919061331f565b905060008167ffffffffffffffff811115611b1857611b1861335a565b604051908082528060200260200182016040528015611b41578160200160208202803683370190505b50905060005b82811015611baa576000611b5b86836132df565b9050600f54811015611b97576000818152601860205260409020548351849084908110611b8a57611b8a613370565b6020026020010181815250505b5080611ba281613386565b915050611b47565b509392505050565b611cf360405180610520016040528060006001600160a01b0316815260200160006001600160a01b031681526020016000815260200160008152602001600081526020016000815260200160008152602001600081526020016000815260200160008152602001600081526020016000815260200160008152602001600081526020016000815260200160008152602001600081526020016000815260200160008152602001600081526020016000815260200160008152602001600081526020016000815260200160008152602001600081526020016000815260200160008152602001600081526020016000815260200160008152602001600081526020016000815260200160008152602001600081526020016000815260200160008152602001600081526020016000815260200160008152602001600081525090565b604051806105200160405280611d116000546001600160a01b031690565b6001600160a01b03908116825260025461010090819004909116602083015260045460408301526005546060830152600654608083015260075460a083015260085460c083015260095460e0830152600a5490820152600b54610120820152600f5461014082015260c86101608201526127106101808201526101a001611d96610eff565b8152602001611da361290c565b8152602001611db0610e64565b8152602001611dbd612974565b8152602001611dca612837565b8152602001611dd7612208565b8152602001611de4610ed5565b8152602001611df1610f94565b8152602001611e07670de0b6b3a7640000610fdd565b8152602001611e1d670de0b6b3a764000061219b565b8152602001611e33670de0b6b3a764000061216e565b8152602001611e49670de0b6b3a7640000610bf5565b8152602001611e5f670de0b6b3a7640000610f21565b8152601054602082015260115460408083019190915260035490516370a0823160e01b81526001600160a01b038681166004830152606090930192909116906370a0823190602401602060405180830381865afa158015611ec4573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611ee891906133c7565b81526003546040516370a0823160e01b81523060048201526020909201916001600160a01b03909116906370a0823190602401602060405180830381865afa158015611f38573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611f5c91906133c7565b81526002546040516370a0823160e01b81526001600160a01b038681166004830152602090930192610100909204909116906370a0823190602401602060405180830381865afa158015611fb4573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611fd891906133c7565b8152600354604051636eb1769f60e11b81526001600160a01b0386811660048301523060248301526020909301929091169063dd62ed3e90604401602060405180830381865afa158015612030573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061205491906133c7565b81526001600160a01b0384168031602080840191909152600091825260179052604090819020549082015260125460608201526013546080820152600c5460a082015260c0016120a2612955565b81526014546020820152601554604082015260165460609091015292915050565b6000600a541180156120de5750600b546120db61290c565b10155b6120fa5760405162461bcd60e51b815260040161044b9061339f565b612102612a9b565b6121326121176000546001600160a01b031690565b60155460025461010090046001600160a01b03169190612af5565b6000601555565b6060610e5e82611a8c565b61214c612a9b565b600380546001600160a01b0319166001600160a01b0392909216919091179055565b600061271061217e60c8826132f6565b6121878461219b565b61219191906132df565b610e5e919061331f565b6000806121a6612208565b905060006121b2610ed5565b90508115806121bf575080155b806121c8575083155b156121d7575060009392505050565b60006121e38584613347565b905060006121f183876132df565b9050816121fe8183613347565b610c9f919061331f565b6000670de0b6b3a764000061221b612974565b600454610ef591906132df565b6060600f54600003612247575060408051600081526020810190915290565b600e546122559060026132df565b600f54111561238a576000600e54600f54612270919061331f565b9050600081600f54612282919061331f565b61228d906001613347565b905060008167ffffffffffffffff8111156122aa576122aa61335a565b6040519080825280602002602001820160405280156122d3578160200160208202803683370190505b50905060005b6122e46001846132f6565b81101561233757601860006122f986846132df565b81526020019081526020016000205482828151811061231a5761231a613370565b60209081029190910101528061232f81613386565b9150506122d9565b50601860006001600f5461234b91906132f6565b8152602001908152602001600020548160018461236891906132f6565b8151811061237857612378613370565b60209081029190910101529392505050565b610ea06000600f54610d61565b61239f612bf0565b6123a7612b58565b804211156123ed5760405162461bcd60e51b815260206004820152601360248201527222bc3834b932b2103a3930b739b0b1ba34b7b760691b604482015260640161044b565b6000600a541180156124075750600b5461240561290c565b105b6124485760405162461bcd60e51b815260206004820152601260248201527141756374696f6e206e6f742061637469766560701b604482015260640161044b565b600083116124895760405162461bcd60e51b815260206004820152600e60248201526d139bc81d1bdad95b9cc81cd95b9d60921b604482015260640161044b565b336000908152601760205260409020548311156124e25760405162461bcd60e51b81526020600482015260176024820152762737ba1039bab33334b1b4b2b73a103130b630b731b29760491b604482015260640161044b565b60006124ec612208565b905060006124f8610ed5565b90506000612504612208565b90506000612510610ed5565b90506000821180156125225750600081115b6125605760405162461bcd60e51b815260206004820152600f60248201526e496e76616c6964207765696768747360881b604482015260640161044b565b600061256b8861219b565b905060006125788961216e565b9050878110156125be5760405162461bcd60e51b815260206004820152601160248201527014db1a5c1c1859d948195e18d959591959607a1b604482015260640161044b565b600081116125ff5760405162461bcd60e51b815260206004820152600e60248201526d139bc8115512081d1bc81cd95b9960921b604482015260640161044b565b806005541015801561267b57506003546040516370a0823160e01b815230600482015282916001600160a01b0316906370a0823190602401602060405180830381865afa158015612654573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061267891906133c7565b10155b6126c75760405162461bcd60e51b815260206004820152601c60248201527f496e73756666696369656e742045544820696e20636f6e747261637400000000604482015260640161044b565b60006127106126d760c88c6132df565b6126e1919061331f565b905080601560008282546126f59190613347565b909155506000905061270783856132f6565b9050806016600082825461271b9190613347565b909155505033600090815260176020526040812080548d929061273f9084906132f6565b925050819055508a6012600082825461275891906132f6565b925050819055508a600460008282546127719190613347565b92505081905550836005600082825461278a91906132f6565b909155506127a19050670de0b6b3a7640000610bf5565b600f8054600090815260186020526040812092909255426010558054916127c783613386565b90915550506003546127e3906001600160a01b03163385612af5565b604080518c81526020810185905290810182905233907f846c37eef631e0943682d87352ec117c20008eb7f425c9b85ac011a6d4774cc09060600160405180910390a25050505050505050611a6460018055565b6000600a546000148061284a5750600b54155b156128555750600090565b6000600b54670de0b6b3a764000061286b61290c565b61287591906132df565b61287f919061331f565b9050600060095460085461289391906132f6565b9050670de0b6b3a76400006001816128ab85856132df565b6128b59190613347565b6128bf91906132f6565b6128c9919061331f565b6008546128d691906132f6565b9250505090565b6128e5612a9b565b600b91909155600380546001600160a01b0319166001600160a01b03909216919091179055565b6000600a5460000361291e5750600090565b600b54600a5461292e90426132f6565b111561293b5750600b5490565b600a54610ea090426132f6565b612950612a9b565b600c55565b6000600c54600b54600a5461296a9190613347565b610ea09190613347565b6000600a54600014806129875750600b54155b156129925750600090565b6000600b54670de0b6b3a76400006129a861290c565b6129b291906132df565b6129bc919061331f565b905060006006546007546129d091906132f6565b9050670de0b6b3a76400006001816129e885856132df565b6129f29190613347565b6129fc91906132f6565b612a06919061331f565b6006546128d69190613347565b612a1b612a9b565b6001600160a01b038116612a805760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b606482015260840161044b565b612a8981612c49565b50565b6060610ea06000600f54610d61565b6000546001600160a01b031633146111f85760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161044b565b6040516001600160a01b038316602482015260448101829052611a6490849063a9059cbb60e01b906064015b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b031990931692909217909152612d14565b60025460ff16156111f85760405162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b604482015260640161044b565b612ba6612de6565b6002805460ff191690557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa335b6040516001600160a01b03909116815260200160405180910390a1565b600260015403612c425760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604482015260640161044b565b6002600155565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6040516001600160a01b0380851660248301528316604482015260648101829052612cd19085906323b872dd60e01b90608401612b21565b50505050565b612cdf612b58565b6002805460ff191660011790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a258612bd33390565b6000612d69826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b0316612e2f9092919063ffffffff16565b805190915015611a645780806020019051810190612d8791906133e0565b611a645760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b606482015260840161044b565b60025460ff166111f85760405162461bcd60e51b815260206004820152601460248201527314185d5cd8589b194e881b9bdd081c185d5cd95960621b604482015260640161044b565b6060612e3e8484600085612e46565b949350505050565b606082471015612ea75760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b606482015260840161044b565b600080866001600160a01b03168587604051612ec39190613426565b60006040518083038185875af1925050503d8060008114612f00576040519150601f19603f3d011682016040523d82523d6000602084013e612f05565b606091505b50915091506110708783838760608315612f80578251600003612f79576001600160a01b0385163b612f795760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015260640161044b565b5081612e3e565b612e3e8383815115612f955781518083602001fd5b8060405162461bcd60e51b815260040161044b9190613442565b80356001600160a01b0381168114612fc657600080fd5b919050565b60008060408385031215612fde57600080fd5b612fe783612faf565b946020939093013593505050565b60006020828403121561300757600080fd5b5035919050565b6000806040838503121561302157600080fd5b50508035926020909101359150565b6020808252825182820181905260009190848201906040850190845b818110156130685783518352928401929184019160010161304c565b50909695505050505050565b60006020828403121561308657600080fd5b61308f82612faf565b9392505050565b6000806000606084860312156130ab57600080fd5b505081359360208301359350604090920135919050565b81516001600160a01b03168152610520810160208301516130ee60208401826001600160a01b03169052565b5060408381015190830152606080840151908301526080808401519083015260a0808401519083015260c0808401519083015260e08084015190830152610100808401519083015261012080840151908301526101408084015190830152610160808401519083015261018080840151908301526101a080840151908301526101c080840151908301526101e08084015190830152610200808401519083015261022080840151908301526102408084015190830152610260808401519083015261028080840151908301526102a080840151908301526102c080840151908301526102e08084015190830152610300808401519083015261032080840151908301526103408084015190830152610360808401519083015261038080840151908301526103a080840151908301526103c080840151908301526103e08084015190830152610400808401519083015261042080840151908301526104408084015190830152610460808401519083015261048080840151908301526104a080840151908301526104c080840151908301526104e0808401519083015261050092830151929091019190915290565b600080604083850312156132b057600080fd5b823591506132c060208401612faf565b90509250929050565b634e487b7160e01b600052601160045260246000fd5b8082028115828204841417610e5e57610e5e6132c9565b81810381811115610e5e57610e5e6132c9565b634e487b7160e01b600052601260045260246000fd5b60008261332e5761332e613309565b500490565b60008261334257613342613309565b500690565b80820180821115610e5e57610e5e6132c9565b634e487b7160e01b600052604160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b600060018201613398576133986132c9565b5060010190565b6020808252600e908201526d41756374696f6e2061637469766560901b604082015260600190565b6000602082840312156133d957600080fd5b5051919050565b6000602082840312156133f257600080fd5b8151801515811461308f57600080fd5b60005b8381101561341d578181015183820152602001613405565b50506000910152565b60008251613438818460208701613402565b9190910192915050565b6020815260008251806020840152613461816040850160208701613402565b601f01601f1916919091016040019291505056fea26469706673582212206156efb7cfe859850029af01c752ae1597cd03872b2235cc4c0001ddf2a3403b64736f6c63430008130033
Loading...
Loading
Loading...
Loading
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.