Source Code
Latest 25 from a total of 217 transactions
| Transaction Hash |
Method
|
Block
|
From
|
|
To
|
||||
|---|---|---|---|---|---|---|---|---|---|
| Single Sell Into... | 24364257 | 53 days ago | IN | 0 ETH | 0.00005706 | ||||
| Single Sell Into... | 23649897 | 153 days ago | IN | 0 ETH | 0.0005559 | ||||
| Single Sell Into... | 23649895 | 153 days ago | IN | 0 ETH | 0.0005554 | ||||
| Single Sell Into... | 23649892 | 153 days ago | IN | 0 ETH | 0.00055487 | ||||
| Single Sell Into... | 23649890 | 153 days ago | IN | 0 ETH | 0.00055817 | ||||
| Single Sell Into... | 23649887 | 153 days ago | IN | 0 ETH | 0.00055605 | ||||
| Single Sell Into... | 23210827 | 214 days ago | IN | 0 ETH | 0.00030695 | ||||
| Single Sell Into... | 23102843 | 229 days ago | IN | 0 ETH | 0.00030199 | ||||
| Single Sell Into... | 23102840 | 229 days ago | IN | 0 ETH | 0.00030897 | ||||
| Single Sell Into... | 23102834 | 229 days ago | IN | 0 ETH | 0.00029897 | ||||
| Single Sell Into... | 23102828 | 229 days ago | IN | 0 ETH | 0.00084607 | ||||
| Single Sell Into... | 23076781 | 233 days ago | IN | 0 ETH | 0.00097453 | ||||
| Single Sell Into... | 23076739 | 233 days ago | IN | 0 ETH | 0.00028684 | ||||
| Single Sell Into... | 23076734 | 233 days ago | IN | 0 ETH | 0.00027272 | ||||
| Single Sell Into... | 23014064 | 242 days ago | IN | 0 ETH | 0.00058971 | ||||
| Single Sell Into... | 22997892 | 244 days ago | IN | 0 ETH | 0.00000972 | ||||
| Single Sell Into... | 22997892 | 244 days ago | IN | 0 ETH | 0.00000969 | ||||
| Single Sell Into... | 22997892 | 244 days ago | IN | 0 ETH | 0.00006628 | ||||
| Single Sell Into... | 22997892 | 244 days ago | IN | 0 ETH | 0.00007158 | ||||
| Single Sell Into... | 22995374 | 244 days ago | IN | 0 ETH | 0.00016799 | ||||
| Single Sell Into... | 22975827 | 247 days ago | IN | 0 ETH | 0.00068889 | ||||
| Single Sell Into... | 22975814 | 247 days ago | IN | 0 ETH | 0.00082793 | ||||
| Single Sell Into... | 22975436 | 247 days ago | IN | 0 ETH | 0.00041257 | ||||
| Single Sell Into... | 22975423 | 247 days ago | IN | 0 ETH | 0.00049854 | ||||
| Single Sell Into... | 22975414 | 247 days ago | IN | 0 ETH | 0.00048543 |
Latest 25 internal transactions (View All)
Advanced mode:
| Parent Transaction Hash | Method | Block |
From
|
|
To
|
||
|---|---|---|---|---|---|---|---|
| Transfer | 24364257 | 53 days ago | 0.03213852 ETH | ||||
| Transfer | 24364257 | 53 days ago | 0.03213852 ETH | ||||
| Transfer | 23649897 | 153 days ago | 0.03192662 ETH | ||||
| Transfer | 23649897 | 153 days ago | 0.03192662 ETH | ||||
| Transfer | 23649895 | 153 days ago | 0.03192662 ETH | ||||
| Transfer | 23649895 | 153 days ago | 0.03192662 ETH | ||||
| Transfer | 23649892 | 153 days ago | 0.03192662 ETH | ||||
| Transfer | 23649892 | 153 days ago | 0.03192662 ETH | ||||
| Transfer | 23649890 | 153 days ago | 0.03192662 ETH | ||||
| Transfer | 23649890 | 153 days ago | 0.03192662 ETH | ||||
| Transfer | 23649887 | 153 days ago | 0.03192662 ETH | ||||
| Transfer | 23649887 | 153 days ago | 0.03192662 ETH | ||||
| Transfer | 23210827 | 214 days ago | 0.03171618 ETH | ||||
| Transfer | 23210827 | 214 days ago | 0.03171618 ETH | ||||
| Transfer | 23102843 | 229 days ago | 0.03167582 ETH | ||||
| Transfer | 23102843 | 229 days ago | 0.03167582 ETH | ||||
| Transfer | 23102840 | 229 days ago | 0.03167583 ETH | ||||
| Transfer | 23102840 | 229 days ago | 0.03167583 ETH | ||||
| Transfer | 23102834 | 229 days ago | 0.03167586 ETH | ||||
| Transfer | 23102834 | 229 days ago | 0.03167586 ETH | ||||
| Transfer | 23102828 | 229 days ago | 0.03167586 ETH | ||||
| Transfer | 23102828 | 229 days ago | 0.03167586 ETH | ||||
| Transfer | 23076781 | 233 days ago | 0.0317005 ETH | ||||
| Transfer | 23076781 | 233 days ago | 0.0317005 ETH | ||||
| Transfer | 23076739 | 233 days ago | 0.03170053 ETH |
Loading...
Loading
Loading...
Loading
Cross-Chain Transactions
Loading...
Loading
Contract Name:
basePool
Compiler Version
v0.8.17+commit.8df45f5f
Optimization Enabled:
Yes with 200 runs
Other Settings:
london EvmVersion
Contract Source Code (Solidity Standard Json-Input format)
// SPDX-License-Identifier: AGPL-3.0
pragma solidity ^0.8.17;
import {IERC721} from "openzeppelin/token/ERC721/IERC721.sol";
import {SafeTransferLib} from "solmate/utils/SafeTransferLib.sol";
import {ReentrancyGuard} from "solmate/utils/ReentrancyGuard.sol";
import {curveSwap} from "./curveSwapV2.sol";
import {Ownable} from "openzeppelin/access/Ownable.sol";
contract basePool is curveSwap, ReentrancyGuard, Ownable {
IERC721 public smolMoney;
uint256 public fee = 3e4; // 3 %
uint256 public smolMoneyReserve1;
uint256 public maxNumberOfNfts;
bool public sellOn;
bool public buyOn;
uint256[] public smolIds;
///need acl for smol Fed
address public smolFed;
address public minting;
constructor(
address _token0,
address _token1,
uint256 numberOfNfts,
address curvePool
) curveSwap(_token0, curvePool) {
smolMoney = IERC721(_token1);
maxNumberOfNfts = numberOfNfts;
buyOn = false;
sellOn = false;
}
fallback() external payable override {
// Not Emiting an event to indicate Ether received
}
receive() external payable override {
// No custom function code
}
function addNfts(uint256 newMints) external {
require(msg.sender == smolFed || msg.sender == minting, "UNAUTHORIZED");
maxNumberOfNfts = maxNumberOfNfts + newMints;
}
function turnSale(bool sale) external onlyOwner {
sellOn = sale;
}
function turnBuy(bool buy) external onlyOwner {
buyOn = buy;
}
function changeFee(uint256 newFee) external onlyOwner {
fee = newFee;
}
function setSmolFed(address _smolFed) external onlyOwner {
smolFed = _smolFed;
}
function setMinting(address _minting) external onlyOwner {
minting = _minting;
}
function changeSlippage(uint256 amount) external onlyOwner {
_changeSlippage(amount);
}
function exchangeETH(uint256 amount) external onlyOwner {
EthToStETHSlippage(amount);
}
function getTotalLiquidity() public view returns (uint256 totalLiquidity) {
uint256 a = maxNumberOfNfts - smolMoney.balanceOf(address(this));
uint256 v = a > 0 ? a : 1;
return (stEth.balanceOf(address(this)) * maxNumberOfNfts) / v;
}
/// these functions take a 3% fee to account for minmal changing exchange rate (ETH : STETH) and Pool Fees
/// it assumes that poolfees + price difference < 1%
function getPriceBuy() public view returns (uint256 price) {
return getPrice() + _scaleAmountByPercentage(getPrice(), fee);
}
function getPrice() public view returns (uint256 price) {
uint256 _price = getTotalLiquidity() / maxNumberOfNfts;
return _price;
}
function getLastId() public view returns (uint256 price) {
return smolIds[smolIds.length - 1];
}
function singleSellIntoReserveSTETH(uint256 id) external nonReentrant {
require(smolMoney.ownerOf(id) == msg.sender, "NOT_AUTHORIZED");
//require sell on
require(sellOn == true, "SELL_NOT_ON");
//get price
uint256 _price = getPrice();
//check if we have a price
require(_price > 0, "NOT_INITALIZED");
//recive ERC721
smolMoney.transferFrom(msg.sender, address(this), id);
//send steth to sender
stEth.transfer(msg.sender, _price);
// pushes id to array
smolIds.push(id);
}
function singleBuyFromReserveSTETH() external nonReentrant {
//get price
uint256 _price = getPriceBuy();
//require buy on
require(buyOn == true, "BUY_NOT_ON");
//check if we have a price
require(_price > 0, "NOT_INITALIZED");
//does the reserve has NFTS left
require(smolIds.length > 0, "NO_NFTS_IN_RESERVE");
//get NFT ID
uint256 id = smolIds[smolIds.length - 1];
//recive steth from sender
stEth.transferFrom(msg.sender, address(this), _price);
//send ERC721
smolMoney.transferFrom(address(this), msg.sender, id);
//pop ID
smolIds.pop();
}
function singleSellIntoReserve(uint256 id) external nonReentrant {
require(smolMoney.ownerOf(id) == msg.sender, "NOT_AUTHORIZED");
//require sell on
require(sellOn == true, "SELL_NOT_ON");
//get price
uint256 _price = getPrice();
//check if we have a price
require(_price > 0, "NOT_INITALIZED");
//recive ERC721
smolMoney.transferFrom(msg.sender, address(this), id);
//curvePool Swap
uint256 result = StETHToEthSlippage(_price);
//send eth to sender
SafeTransferLib.safeTransferETH(msg.sender, result);
// pushes id to array
smolIds.push(id);
}
function singleBuyFromReserve() external payable nonReentrant {
//get price
uint256 _price = getPriceBuy();
uint256 _priceNeed = getPrice();
//require buy on
require(buyOn == true, "BUY_NOT_ON");
//check if we have a price
require(_price > 0, "NOT_INITALIZED");
//does the reserve has NFTS left
require(smolIds.length > 0, "NO_NFTS_IN_RESERVE");
//is it paid
require(msg.value == _price, "NOT_PAID");
//get NFT ID
uint256 id = smolIds[smolIds.length - 1];
//curvePool Swap
EthToStEthSlippagePrice(_price, _priceNeed);
//send ERC721
smolMoney.transferFrom(address(this), msg.sender, id);
//pop ID
smolIds.pop();
}
// function to migrate to new pool address
function setNewPool(address pool) external onlyOwner {
_setNewPool(pool);
}
// function to set new Approval Limit for Pool
function setApprovalPool(uint256 maxAmount) external onlyOwner {
_setApproval(maxAmount);
}
// function to get nfts out in order
function emergencyDrainNFT(uint256 numberOfNfts) external onlyOwner {
for (uint256 i = 0; i < numberOfNfts; i++) {
smolMoney.transferFrom(
address(this),
msg.sender,
smolIds[smolIds.length - 1]
);
smolIds.pop();
}
}
/// Emergency funtion to get Steteh out of the contract
function emergencyDrainSTETH() external onlyOwner {
uint256 sum = stEth.balanceOf(address(this));
stEth.transfer(msg.sender, sum);
}
function emergencyDrainETH() external onlyOwner {
uint256 sum = payable(address(this)).balance;
SafeTransferLib.safeTransferETH(msg.sender, sum);
}
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.8.0) (token/ERC721/IERC721.sol)
pragma solidity ^0.8.0;
import "../../utils/introspection/IERC165.sol";
/**
* @dev Required interface of an ERC721 compliant contract.
*/
interface IERC721 is IERC165 {
/**
* @dev Emitted when `tokenId` token is transferred from `from` to `to`.
*/
event Transfer(address indexed from, address indexed to, uint256 indexed tokenId);
/**
* @dev Emitted when `owner` enables `approved` to manage the `tokenId` token.
*/
event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId);
/**
* @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets.
*/
event ApprovalForAll(address indexed owner, address indexed operator, bool approved);
/**
* @dev Returns the number of tokens in ``owner``'s account.
*/
function balanceOf(address owner) external view returns (uint256 balance);
/**
* @dev Returns the owner of the `tokenId` token.
*
* Requirements:
*
* - `tokenId` must exist.
*/
function ownerOf(uint256 tokenId) external view returns (address owner);
/**
* @dev Safely transfers `tokenId` token from `from` to `to`.
*
* Requirements:
*
* - `from` cannot be the zero address.
* - `to` cannot be the zero address.
* - `tokenId` token must exist and be owned by `from`.
* - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}.
* - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
*
* Emits a {Transfer} event.
*/
function safeTransferFrom(
address from,
address to,
uint256 tokenId,
bytes calldata data
) external;
/**
* @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients
* are aware of the ERC721 protocol to prevent tokens from being forever locked.
*
* Requirements:
*
* - `from` cannot be the zero address.
* - `to` cannot be the zero address.
* - `tokenId` token must exist and be owned by `from`.
* - If the caller is not `from`, it must have been allowed to move this token by either {approve} or {setApprovalForAll}.
* - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
*
* Emits a {Transfer} event.
*/
function safeTransferFrom(
address from,
address to,
uint256 tokenId
) external;
/**
* @dev Transfers `tokenId` token from `from` to `to`.
*
* WARNING: Note that the caller is responsible to confirm that the recipient is capable of receiving ERC721
* or else they may be permanently lost. Usage of {safeTransferFrom} prevents loss, though the caller must
* understand this adds an external call which potentially creates a reentrancy vulnerability.
*
* Requirements:
*
* - `from` cannot be the zero address.
* - `to` cannot be the zero address.
* - `tokenId` token must be owned by `from`.
* - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}.
*
* Emits a {Transfer} event.
*/
function transferFrom(
address from,
address to,
uint256 tokenId
) external;
/**
* @dev Gives permission to `to` to transfer `tokenId` token to another account.
* The approval is cleared when the token is transferred.
*
* Only a single account can be approved at a time, so approving the zero address clears previous approvals.
*
* Requirements:
*
* - The caller must own the token or be an approved operator.
* - `tokenId` must exist.
*
* Emits an {Approval} event.
*/
function approve(address to, uint256 tokenId) external;
/**
* @dev Approve or remove `operator` as an operator for the caller.
* Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller.
*
* Requirements:
*
* - The `operator` cannot be the caller.
*
* Emits an {ApprovalForAll} event.
*/
function setApprovalForAll(address operator, bool _approved) external;
/**
* @dev Returns the account approved for `tokenId` token.
*
* Requirements:
*
* - `tokenId` must exist.
*/
function getApproved(uint256 tokenId) external view returns (address operator);
/**
* @dev Returns if the `operator` is allowed to manage all of the assets of `owner`.
*
* See {setApprovalForAll}
*/
function isApprovedForAll(address owner, address operator) external view returns (bool);
}// SPDX-License-Identifier: AGPL-3.0-only
pragma solidity >=0.8.0;
import {ERC20} from "../tokens/ERC20.sol";
/// @notice Safe ETH and ERC20 transfer library that gracefully handles missing return values.
/// @author Solmate (https://github.com/Rari-Capital/solmate/blob/main/src/utils/SafeTransferLib.sol)
/// @dev Use with caution! Some functions in this library knowingly create dirty bits at the destination of the free memory pointer.
/// @dev Note that none of the functions in this library check that a token has code at all! That responsibility is delegated to the caller.
library SafeTransferLib {
/*//////////////////////////////////////////////////////////////
ETH OPERATIONS
//////////////////////////////////////////////////////////////*/
function safeTransferETH(address to, uint256 amount) internal {
bool success;
assembly {
// Transfer the ETH and store if it succeeded or not.
success := call(gas(), to, amount, 0, 0, 0, 0)
}
require(success, "ETH_TRANSFER_FAILED");
}
/*//////////////////////////////////////////////////////////////
ERC20 OPERATIONS
//////////////////////////////////////////////////////////////*/
function safeTransferFrom(
ERC20 token,
address from,
address to,
uint256 amount
) internal {
bool success;
assembly {
// Get a pointer to some free memory.
let freeMemoryPointer := mload(0x40)
// Write the abi-encoded calldata into memory, beginning with the function selector.
mstore(freeMemoryPointer, 0x23b872dd00000000000000000000000000000000000000000000000000000000)
mstore(add(freeMemoryPointer, 4), from) // Append the "from" argument.
mstore(add(freeMemoryPointer, 36), to) // Append the "to" argument.
mstore(add(freeMemoryPointer, 68), amount) // Append the "amount" argument.
success := and(
// Set success to whether the call reverted, if not we check it either
// returned exactly 1 (can't just be non-zero data), or had no return data.
or(and(eq(mload(0), 1), gt(returndatasize(), 31)), iszero(returndatasize())),
// We use 100 because the length of our calldata totals up like so: 4 + 32 * 3.
// We use 0 and 32 to copy up to 32 bytes of return data into the scratch space.
// Counterintuitively, this call must be positioned second to the or() call in the
// surrounding and() call or else returndatasize() will be zero during the computation.
call(gas(), token, 0, freeMemoryPointer, 100, 0, 32)
)
}
require(success, "TRANSFER_FROM_FAILED");
}
function safeTransfer(
ERC20 token,
address to,
uint256 amount
) internal {
bool success;
assembly {
// Get a pointer to some free memory.
let freeMemoryPointer := mload(0x40)
// Write the abi-encoded calldata into memory, beginning with the function selector.
mstore(freeMemoryPointer, 0xa9059cbb00000000000000000000000000000000000000000000000000000000)
mstore(add(freeMemoryPointer, 4), to) // Append the "to" argument.
mstore(add(freeMemoryPointer, 36), amount) // Append the "amount" argument.
success := and(
// Set success to whether the call reverted, if not we check it either
// returned exactly 1 (can't just be non-zero data), or had no return data.
or(and(eq(mload(0), 1), gt(returndatasize(), 31)), iszero(returndatasize())),
// We use 68 because the length of our calldata totals up like so: 4 + 32 * 2.
// We use 0 and 32 to copy up to 32 bytes of return data into the scratch space.
// Counterintuitively, this call must be positioned second to the or() call in the
// surrounding and() call or else returndatasize() will be zero during the computation.
call(gas(), token, 0, freeMemoryPointer, 68, 0, 32)
)
}
require(success, "TRANSFER_FAILED");
}
function safeApprove(
ERC20 token,
address to,
uint256 amount
) internal {
bool success;
assembly {
// Get a pointer to some free memory.
let freeMemoryPointer := mload(0x40)
// Write the abi-encoded calldata into memory, beginning with the function selector.
mstore(freeMemoryPointer, 0x095ea7b300000000000000000000000000000000000000000000000000000000)
mstore(add(freeMemoryPointer, 4), to) // Append the "to" argument.
mstore(add(freeMemoryPointer, 36), amount) // Append the "amount" argument.
success := and(
// Set success to whether the call reverted, if not we check it either
// returned exactly 1 (can't just be non-zero data), or had no return data.
or(and(eq(mload(0), 1), gt(returndatasize(), 31)), iszero(returndatasize())),
// We use 68 because the length of our calldata totals up like so: 4 + 32 * 2.
// We use 0 and 32 to copy up to 32 bytes of return data into the scratch space.
// Counterintuitively, this call must be positioned second to the or() call in the
// surrounding and() call or else returndatasize() will be zero during the computation.
call(gas(), token, 0, freeMemoryPointer, 68, 0, 32)
)
}
require(success, "APPROVE_FAILED");
}
}// SPDX-License-Identifier: AGPL-3.0-only
pragma solidity >=0.8.0;
/// @notice Gas optimized reentrancy protection for smart contracts.
/// @author Solmate (https://github.com/Rari-Capital/solmate/blob/main/src/utils/ReentrancyGuard.sol)
/// @author Modified from OpenZeppelin (https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/security/ReentrancyGuard.sol)
abstract contract ReentrancyGuard {
uint256 private locked = 1;
modifier nonReentrant() virtual {
require(locked == 1, "REENTRANCY");
locked = 2;
_;
locked = 1;
}
}// SPDX-License-Identifier: MIT
pragma solidity ^0.8.17;
import {IERC20} from "openzeppelin/token/ERC20/IERC20.sol";
// curvePool: 0xDC24316b9AE028F1497c275EB9192a3Ea0f67022
// 0:eth
// 1:Lido 0xae7ab96520DE3A18E5e111B5EaAb095312D7fE84
interface STABLESWAP {
function exchange(
int128 i,
int128 j,
uint256 dx,
uint256 min_dy
) external payable;
function get_dy(
int128 i,
int128 j,
uint256 dx
) external view returns (uint256);
}
contract curveSwap {
IERC20 public stEth;
STABLESWAP public curve;
address public poolAddress;
uint256 public constant PERCENTAGE_SCALE = 1e6;
uint256 public slippage = 2e4; // 2 % wtf is this curve srysly
//we take approval here out for test reasons - need to be done manualy
constructor(address _stEth, address _curve) {
stEth = IERC20(_stEth);
curve = STABLESWAP(_curve);
poolAddress = _curve;
//_setApproval(30e18);
}
fallback() external payable virtual {
// Not Emiting an event to indicate Ether received
}
receive() external payable virtual {
// No custom function code
}
///change slippage
function _changeSlippage(uint256 amount) internal{
slippage = amount;
}
function _setApproval(uint256 maxAmount) internal {
stEth.approve(poolAddress, maxAmount);
}
function _setNewPool(address pool) internal {
curve = STABLESWAP(pool);
poolAddress = pool;
}
function _setSlippage(uint256 newSlippage) internal {
slippage = newSlippage;
}
function EthToStEthSlippagePrice(uint256 amount, uint256 price) internal {
uint256 b = stEth.balanceOf(address(this));
uint256 min = addSlippage(curve.get_dy(0, 1, amount));
curve.exchange{value: amount}(0, 1, amount, min);
uint256 result = stEth.balanceOf(address(this)) - b;
require(result >= price, "CURVE_POOL_GIVES_WRONG_PRICE");
}
function EthToStETHSlippage(uint256 amount) internal {
uint256 min = addSlippage(curve.get_dy(0, 1, amount));
curve.exchange{value: amount}(0, 1, amount, min);
}
function StETHToEthSlippage(
uint256 amount
) internal returns (uint256 result) {
uint256 b = payable(address(this)).balance;
uint256 min = addSlippage(curve.get_dy(1, 0, amount));
curve.exchange(1, 0, amount, min);
result = payable(address(this)).balance - b;
}
function addSlippage(
uint256 amount
) internal view returns (uint256 withSlippage) {
withSlippage = amount - _scaleAmountByPercentage(amount, slippage);
}
function _scaleAmountByPercentage(
uint256 amount,
uint256 scaledPercent
) internal pure returns (uint256 scaledAmount) {
// use assembly to bypass checking for overflow & division by 0
// scaledPercent has been validated to be < PERCENTAGE_SCALE)
// & PERCENTAGE_SCALE will never be 0
// pernicious ERC20s may cause overflow, but results do not affect ETH & other ERC20 balances
assembly {
/* eg (100 * 2*1e4) / (1e6) */
scaledAmount := div(mul(amount, scaledPercent), PERCENTAGE_SCALE)
}
}
}// 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 v4.4.1 (utils/introspection/IERC165.sol)
pragma solidity ^0.8.0;
/**
* @dev Interface of the ERC165 standard, as defined in the
* https://eips.ethereum.org/EIPS/eip-165[EIP].
*
* Implementers can declare support of contract interfaces, which can then be
* queried by others ({ERC165Checker}).
*
* For an implementation, see {ERC165}.
*/
interface IERC165 {
/**
* @dev Returns true if this contract implements the interface defined by
* `interfaceId`. See the corresponding
* https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section]
* to learn more about how these ids are created.
*
* This function call must use less than 30 000 gas.
*/
function supportsInterface(bytes4 interfaceId) external view returns (bool);
}// SPDX-License-Identifier: AGPL-3.0-only
pragma solidity >=0.8.0;
/// @notice Modern and gas efficient ERC20 + EIP-2612 implementation.
/// @author Solmate (https://github.com/Rari-Capital/solmate/blob/main/src/tokens/ERC20.sol)
/// @author Modified from Uniswap (https://github.com/Uniswap/uniswap-v2-core/blob/master/contracts/UniswapV2ERC20.sol)
/// @dev Do not manually set balances without updating totalSupply, as the sum of all user balances must not exceed it.
abstract contract ERC20 {
/*//////////////////////////////////////////////////////////////
EVENTS
//////////////////////////////////////////////////////////////*/
event Transfer(address indexed from, address indexed to, uint256 amount);
event Approval(address indexed owner, address indexed spender, uint256 amount);
/*//////////////////////////////////////////////////////////////
METADATA STORAGE
//////////////////////////////////////////////////////////////*/
string public name;
string public symbol;
uint8 public immutable decimals;
/*//////////////////////////////////////////////////////////////
ERC20 STORAGE
//////////////////////////////////////////////////////////////*/
uint256 public totalSupply;
mapping(address => uint256) public balanceOf;
mapping(address => mapping(address => uint256)) public allowance;
/*//////////////////////////////////////////////////////////////
EIP-2612 STORAGE
//////////////////////////////////////////////////////////////*/
uint256 internal immutable INITIAL_CHAIN_ID;
bytes32 internal immutable INITIAL_DOMAIN_SEPARATOR;
mapping(address => uint256) public nonces;
/*//////////////////////////////////////////////////////////////
CONSTRUCTOR
//////////////////////////////////////////////////////////////*/
constructor(
string memory _name,
string memory _symbol,
uint8 _decimals
) {
name = _name;
symbol = _symbol;
decimals = _decimals;
INITIAL_CHAIN_ID = block.chainid;
INITIAL_DOMAIN_SEPARATOR = computeDomainSeparator();
}
/*//////////////////////////////////////////////////////////////
ERC20 LOGIC
//////////////////////////////////////////////////////////////*/
function approve(address spender, uint256 amount) public virtual returns (bool) {
allowance[msg.sender][spender] = amount;
emit Approval(msg.sender, spender, amount);
return true;
}
function transfer(address to, uint256 amount) public virtual returns (bool) {
balanceOf[msg.sender] -= amount;
// Cannot overflow because the sum of all user
// balances can't exceed the max uint256 value.
unchecked {
balanceOf[to] += amount;
}
emit Transfer(msg.sender, to, amount);
return true;
}
function transferFrom(
address from,
address to,
uint256 amount
) public virtual returns (bool) {
uint256 allowed = allowance[from][msg.sender]; // Saves gas for limited approvals.
if (allowed != type(uint256).max) allowance[from][msg.sender] = allowed - amount;
balanceOf[from] -= amount;
// Cannot overflow because the sum of all user
// balances can't exceed the max uint256 value.
unchecked {
balanceOf[to] += amount;
}
emit Transfer(from, to, amount);
return true;
}
/*//////////////////////////////////////////////////////////////
EIP-2612 LOGIC
//////////////////////////////////////////////////////////////*/
function permit(
address owner,
address spender,
uint256 value,
uint256 deadline,
uint8 v,
bytes32 r,
bytes32 s
) public virtual {
require(deadline >= block.timestamp, "PERMIT_DEADLINE_EXPIRED");
// Unchecked because the only math done is incrementing
// the owner's nonce which cannot realistically overflow.
unchecked {
address recoveredAddress = ecrecover(
keccak256(
abi.encodePacked(
"\x19\x01",
DOMAIN_SEPARATOR(),
keccak256(
abi.encode(
keccak256(
"Permit(address owner,address spender,uint256 value,uint256 nonce,uint256 deadline)"
),
owner,
spender,
value,
nonces[owner]++,
deadline
)
)
)
),
v,
r,
s
);
require(recoveredAddress != address(0) && recoveredAddress == owner, "INVALID_SIGNER");
allowance[recoveredAddress][spender] = value;
}
emit Approval(owner, spender, value);
}
function DOMAIN_SEPARATOR() public view virtual returns (bytes32) {
return block.chainid == INITIAL_CHAIN_ID ? INITIAL_DOMAIN_SEPARATOR : computeDomainSeparator();
}
function computeDomainSeparator() internal view virtual returns (bytes32) {
return
keccak256(
abi.encode(
keccak256("EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)"),
keccak256(bytes(name)),
keccak256("1"),
block.chainid,
address(this)
)
);
}
/*//////////////////////////////////////////////////////////////
INTERNAL MINT/BURN LOGIC
//////////////////////////////////////////////////////////////*/
function _mint(address to, uint256 amount) internal virtual {
totalSupply += amount;
// Cannot overflow because the sum of all user
// balances can't exceed the max uint256 value.
unchecked {
balanceOf[to] += amount;
}
emit Transfer(address(0), to, amount);
}
function _burn(address from, uint256 amount) internal virtual {
balanceOf[from] -= amount;
// Cannot underflow because a user's balance
// will never be larger than the total supply.
unchecked {
totalSupply -= amount;
}
emit Transfer(from, address(0), amount);
}
}// 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 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;
}
}{
"remappings": [
"forge-std/=lib/forge-std/src/",
"solmate/=lib/solmate/src/",
"ds-test/=lib/forge-std/lib/ds-test/src/",
"openzeppelin/=lib/openzeppelin-contracts/contracts/",
"openzeppelin-contracts-upgradeable/=lib/openzeppelin-contracts-upgradeable/contracts/",
"solady/=lib/solady/src/",
"closedsea/=lib/closedsea/",
"erc721a-upgradeable/=lib/ERC721A-Upgradeable/",
"operator-filter-registry/=lib/closedsea/lib/operator-filter-registry/",
"ERC721A-Upgradeable/=lib/ERC721A-Upgradeable/contracts/",
"erc4626-tests/=lib/openzeppelin-contracts-upgradeable/lib/erc4626-tests/",
"erc721a/=lib/closedsea/lib/erc721a/contracts/",
"openzeppelin-contracts/=lib/openzeppelin-contracts/",
"openzeppelin-upgrades/=lib/openzeppelin-upgrades/"
],
"optimizer": {
"enabled": true,
"runs": 200
},
"metadata": {
"useLiteralContent": false,
"bytecodeHash": "ipfs"
},
"outputSelection": {
"*": {
"*": [
"evm.bytecode",
"evm.deployedBytecode",
"devdoc",
"userdoc",
"metadata",
"abi"
]
}
},
"evmVersion": "london",
"viaIR": true,
"libraries": {}
}Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
Contract ABI
API[{"inputs":[{"internalType":"address","name":"_token0","type":"address"},{"internalType":"address","name":"_token1","type":"address"},{"internalType":"uint256","name":"numberOfNfts","type":"uint256"},{"internalType":"address","name":"curvePool","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"stateMutability":"payable","type":"fallback"},{"inputs":[],"name":"PERCENTAGE_SCALE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"newMints","type":"uint256"}],"name":"addNfts","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"buyOn","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"newFee","type":"uint256"}],"name":"changeFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"changeSlippage","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"curve","outputs":[{"internalType":"contract STABLESWAP","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"emergencyDrainETH","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"numberOfNfts","type":"uint256"}],"name":"emergencyDrainNFT","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"emergencyDrainSTETH","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"exchangeETH","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"fee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getLastId","outputs":[{"internalType":"uint256","name":"price","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getPrice","outputs":[{"internalType":"uint256","name":"price","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getPriceBuy","outputs":[{"internalType":"uint256","name":"price","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getTotalLiquidity","outputs":[{"internalType":"uint256","name":"totalLiquidity","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxNumberOfNfts","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"minting","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"poolAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"sellOn","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"maxAmount","type":"uint256"}],"name":"setApprovalPool","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_minting","type":"address"}],"name":"setMinting","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"pool","type":"address"}],"name":"setNewPool","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_smolFed","type":"address"}],"name":"setSmolFed","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"singleBuyFromReserve","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"singleBuyFromReserveSTETH","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"id","type":"uint256"}],"name":"singleSellIntoReserve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"id","type":"uint256"}],"name":"singleSellIntoReserveSTETH","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"slippage","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"smolFed","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"smolIds","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"smolMoney","outputs":[{"internalType":"contract IERC721","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"smolMoneyReserve1","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"stEth","outputs":[{"internalType":"contract IERC20","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"buy","type":"bool"}],"name":"turnBuy","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"sale","type":"bool"}],"name":"turnSale","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]Contract Creation Code
6080346200011057601f62001d8638819003918201601f19168301916001600160401b03831184841017620001155780849260809460405283398101031262000110576200004d816200012b565b906200005c602082016200012b565b91620000706060604084015193016200012b565b614e2060035560018060a01b0380918160018060a01b031994168460005416176000551680836001541617600155826002541617600255600160045560055493338386161760055560405194823391167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0600080a36175306007551690600654161760065560095561ffff19600a5416600a55611c459081620001418239f35b600080fd5b634e487b7160e01b600052604160045260246000fd5b51906001600160a01b0382168203620001105756fe60806040526004361015610018575b361561001657005b005b60003560e01c8063019d0b37146103105780630875a2f9146103075780631755ff21146102fe57806322895c0d146102f55780632a6b53cb146102ec5780632f9e1f16146102e357806335c7e925146102da5780633e032a3b146102d15780633eed17c7146102c85780633f26479e146102bf5780633f9367ee146102b657806343ed4e56146102ad578063483d3d7e146102a45780634f6bc8681461029b57806364528791146102925780636a1db1bf146102895780636c084f8814610280578063715018a6146102775780637165485d1461026e5780637dc2268c14610265578063894242811461025c5780638da5cb5b1461025357806398d5fdca1461024a57806399940ece146102415780639ea6fa0014610238578063a34e24751461022f578063a8e5862d14610226578063af795a8d1461021d578063bec872b014610214578063c4d916381461020b578063d09d3b7014610202578063d2217780146101f9578063dc8530ca146101f0578063ddca3f43146101e7578063e45ee2ed146101de578063efa659b2146101d5578063f2fde38b146101cc5763fb4352650361000e576101c7611334565b61000e565b506101c7611266565b506101c761123f565b506101c76111ea565b506101c76111cb565b506101c76111af565b506101c761118b565b506101c7611161565b506101c761109e565b506101c7611082565b506101c7610f6d565b506101c7610ef7565b506101c7610eab565b506101c7610dbf565b506101c7610d95565b506101c7610d6d565b506101c7610d43565b506101c7610d01565b506101c7610ccd565b506101c7610ca3565b506101c7610c44565b506101c7610b3e565b506101c7610b22565b506101c761096c565b506101c7610942565b506101c76108b0565b506101c7610868565b506101c7610849565b506101c761082a565b506101c7610806565b506101c76107e7565b506101c76107c3565b506101c7610688565b506101c7610558565b506101c7610539565b506101c761050f565b506101c7610389565b506101c761032f565b6001600160a01b0381160361032a57565b600080fd5b503461032a57602036600319011261032a5760043561034d81610319565b61035561136f565b600d80546001600160a01b0319166001600160a01b0392909216919091179055005b602090600319011261032a5760043590565b503461032a5761039836610377565b6103a6600160045414611606565b60026004556006546103c8906001600160a01b03165b6001600160a01b031690565b6040516331a9108f60e11b81526004810183905290919061040d90602081602481875afa9081156104f7575b6000916104c9575b506001600160a01b03163314611654565b610426600161041e600a5460ff1690565b151514611691565b61042e6115fb565b6104398115156116cb565b823b1561032a576040516323b872dd60e01b815233600482015230602482015260448101839052610499936104949261048e9290916000908290606490829084905af180156104bc575b6104a3575b50611b4d565b33611868565b61171d565b6100166001600455565b806104b06104b6926113f5565b80610504565b38610488565b6104c4611447565b610483565b6104ea915060203d81116104f0575b6104e28183611416565b81019061163f565b386103fc565b503d6104d8565b6104ff611447565b6103f4565b600091031261032a57565b503461032a57600036600319011261032a576002546040516001600160a01b039091168152602090f35b503461032a57600036600319011261032a576020600854604051908152f35b5060008060031936011261068557610574600160045414611606565b6002600455806105826115bd565b6105f161058d6115fb565b6105aa60016105a2600a5460ff9060081c1690565b151514611786565b6105b58315156116cb565b6105eb6105e16105dc600b546105cc8115156117bf565b6105d78734146118b3565b611454565b610e66565b90549060031b1c90565b92611952565b600654610606906001600160a01b03166103bc565b90813b15610681576040516323b872dd60e01b8152306004820152336024820152604481019190915291908290818381606481015b03925af18015610674575b610661575b50610654611800565b61065e6001600455565b80f35b806104b061066e926113f5565b3861064b565b61067c611447565b610646565b5050fd5b80fd5b503461032a57600080600319360112610685576106a9600160045414611606565b60026004556106b66115bd565b6106cb60016105a2600a5460ff9060081c1690565b6106d68115156116cb565b816106ee6105e16105dc600b546105d78115156117bf565b8154610702906001600160a01b03166103bc565b6040516323b872dd60e01b8082523360048301523060248301526044820195909552906020908290606490829087905af180156107b6575b610788575b50600654610755906001600160a01b03166103bc565b803b1561078457604051938452306004850152336024850152604484019190915282908183816064810161063b565b8280fd5b6107a89060203d81116107af575b6107a08183611416565b810190611708565b503861073f565b503d610796565b6107be611447565b61073a565b503461032a57600036600319011261032a5760206107df6114ad565b604051908152f35b503461032a57600036600319011261032a576020600354604051908152f35b503461032a57600036600319011261032a57602060ff600a54166040519015158152f35b503461032a57600036600319011261032a576020604051620f42408152f35b503461032a57600036600319011261032a576020600954604051908152f35b503461032a57602036600319011261032a5760043561088681610319565b61088e61136f565b600c80546001600160a01b0319166001600160a01b0392909216919091179055005b503461032a576108bf36610377565b600c54336001600160a01b0391821614908115610934575b501561090057610016906009549081018091116108f357600955565b6108fb6113c7565b600955565b60405162461bcd60e51b815260206004820152600c60248201526b15539055551213d49256915160a21b6044820152606490fd5b9050600d54163314386108d7565b503461032a57600036600319011261032a57600c546040516001600160a01b039091168152602090f35b503461032a5761097b36610377565b610989600160045414611606565b60026004556006546109a3906001600160a01b03166103bc565b6040516331a9108f60e11b8152600481018390529091906020906109e9908281602481885afa908115610b15575b600091610afe57506001600160a01b03163314611654565b6109fa600161041e600a5460ff1690565b610a026115fb565b92610a0e8415156116cb565b803b1561032a576040516323b872dd60e01b815233600482015230602482015260448101849052610499946000928492610a9c929185908290606490829084905af18015610af1575b610ade575b508354610a71906001600160a01b03166103bc565b60405163a9059cbb60e01b815233600482015260248101929092529093849283919082906044820190565b03925af18015610ad1575b610ab3575b505061171d565b81610ac992903d106107af576107a08183611416565b503880610aac565b610ad9611447565b610aa7565b806104b0610aeb926113f5565b38610a5c565b610af9611447565b610a57565b6104ea9150833d85116104f0576104e28183611416565b610b1d611447565b6109d1565b503461032a57610b3136610377565b610b3961136f565b600755005b503461032a5760008060031936011261068557610b5961136f565b8054610b6d906001600160a01b03166103bc565b6040516370a0823160e01b815230600482015260209183918391610bcd918381602481855afa908115610c37575b8591610c0a575b5060405163a9059cbb60e01b8152336004820152602481019190915293849283919082906044820190565b03925af18015610bfd575b610be0578280f35b81610bf692903d106107af576107a08183611416565b5038808280f35b610c05611447565b610bd8565b610c2a9150843d8611610c30575b610c228183611416565b810190611438565b38610ba2565b503d610c18565b610c3f611447565b610b9b565b503461032a5760008060031936011261068557610c5f61136f565b600580546001600160a01b0319811690915581906001600160a01b03167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08280a380f35b503461032a57600036600319011261032a576001546040516001600160a01b039091168152602090f35b503461032a57600036600319011261032a57600d546040516001600160a01b039091168152602090f35b8015150361032a57565b503461032a57602036600319011261032a57600435610d1f81610cf7565b610d2761136f565b61ff00600a5491151560081b169061ff00191617600a55600080f35b503461032a57600036600319011261032a576005546040516001600160a01b039091168152602090f35b503461032a57600036600319011261032a5760206107df610d8c6114ad565b6009549061148d565b503461032a57600036600319011261032a576000546040516001600160a01b039091168152602090f35b503461032a57610e1a6020610dd336610377565b610ddb61136f565b6000805460025460405163095ea7b360e01b81526001600160a01b03918216600482015260248101949094529294859390911691839182906044820190565b03925af18015610e42575b610e2b57005b6100169060203d81116107af576107a08183611416565b610e4a611447565b610e25565b50634e487b7160e01b600052603260045260246000fd5b600b54811015610e9e575b600b6000527f0175b7a638427703f0dbe7bb9bbf987a2551717b34e79f33b5b1008d1fa01db90190600090565b610ea6610e4f565b610e71565b503461032a57610eba36610377565b600b5481101561032a57602090600b6000527f0175b7a638427703f0dbe7bb9bbf987a2551717b34e79f33b5b1008d1fa01db90154604051908152f35b503461032a57600036600319011261032a5760207f0175b7a638427703f0dbe7bb9bbf987a2551717b34e79f33b5b1008d1fa01db8600b54806000198101818111610f60575b1015610f53575b600b6000520154604051908152f35b610f5b610e4f565b610f44565b610f686113c7565b610f3d565b503461032a57610f7c36610377565b610f8461136f565b600154610f99906001600160a01b03166103bc565b604051635e0d443f60e01b8152600060048201526001602482015260448101839052610ff09060208180606481015b0381865afa908115611075575b600091611057575b50600354620f4240908202045b9061146d565b813b1561032a57604051630f7c084960e21b81526000600482018190526001602483015260448201859052606482019290925292909183916084918391905af1801561104a575b61103d57005b806104b0610016926113f5565b611052611447565b611037565b61106f915060203d8111610c3057610c228183611416565b38610fdd565b61107d611447565b610fd5565b503461032a5761109136610377565b61109961136f565b600355005b503461032a576110ad36610377565b6110b561136f565b60005b8181106110c157005b6006546110d6906001600160a01b03166103bc565b906110e86105e16105dc600b54611454565b823b1561032a576040516323b872dd60e01b8152306004820152336024820152604481019190915261113c926000908290606490829084905af18015611154575b611141575b50611137611800565b6118ea565b6110b8565b806104b061114e926113f5565b3861112e565b61115c611447565b611129565b503461032a57600036600319011261032a576006546040516001600160a01b039091168152602090f35b503461032a57600036600319011261032a576111a561136f565b6100164733611868565b503461032a57600036600319011261032a5760206107df6115bd565b503461032a57600036600319011261032a576020600754604051908152f35b503461032a57602036600319011261032a5760043561120881610319565b61121061136f565b60018060a01b03166bffffffffffffffffffffffff60a01b818160015416176001556002541617600255600080f35b503461032a57600036600319011261032a57602060ff600a5460081c166040519015158152f35b503461032a57602036600319011261032a5760043561128481610319565b61128c61136f565b6001600160a01b039081169081156112e057600554826bffffffffffffffffffffffff60a01b821617600555167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0600080a3005b60405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608490fd5b503461032a57602036600319011261032a5760043561135281610cf7565b61135a61136f565b60ff8019600a54169115151617600a55600080f35b6005546001600160a01b0316330361138357565b606460405162461bcd60e51b815260206004820152602060248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152fd5b50634e487b7160e01b600052601160045260246000fd5b50634e487b7160e01b600052604160045260246000fd5b67ffffffffffffffff811161140957604052565b6114116113de565b604052565b90601f8019910116810190811067ffffffffffffffff82111761140957604052565b9081602091031261032a575190565b506040513d6000823e3d90fd5b60001981019190821161146357565b61146b6113c7565b565b9190820391821161146357565b8181029291811591840414171561146357565b8115611497570490565b634e487b7160e01b600052601260045260246000fd5b60095460065461155d9190611558906114ce906001600160a01b03166103bc565b6040516370a0823160e01b808252306004830152939160209161150d918390829060249082905afa9081156115b0575b600091611593575b508361146d565b801561158a57935b600054829061152c906001600160a01b03166103bc565b604051928352306004840152829060249082905afa91821561157d575b600092611560575b505061147a565b61148d565b90565b6115769250803d10610c3057610c228183611416565b3880611551565b611585611447565b611549565b50600193611515565b6115aa9150833d8511610c3057610c228183611416565b38611506565b6115b8611447565b6114fe565b6115c56114ad565b620f42406115e26115d9600954809461148d565b926115586114ad565b600754020481018091116115f35790565b61155d6113c7565b61155d610d8c6114ad565b1561160d57565b60405162461bcd60e51b815260206004820152600a6024820152695245454e5452414e435960b01b6044820152606490fd5b9081602091031261032a575161155d81610319565b1561165b57565b60405162461bcd60e51b815260206004820152600e60248201526d1393d517d055551213d49256915160921b6044820152606490fd5b1561169857565b60405162461bcd60e51b815260206004820152600b60248201526a29a2a6262fa727aa2fa7a760a91b6044820152606490fd5b156116d257565b60405162461bcd60e51b815260206004820152600e60248201526d1393d517d253925510531256915160921b6044820152606490fd5b9081602091031261032a575161155d81610cf7565b600b5468010000000000000000811015611779575b6001810180600b5581101561176c575b600b6000527f0175b7a638427703f0dbe7bb9bbf987a2551717b34e79f33b5b1008d1fa01db90155565b611774610e4f565b611742565b6117816113de565b611732565b1561178d57565b60405162461bcd60e51b815260206004820152600a602482015269212aacafa727aa2fa7a760b11b6044820152606490fd5b156117c657565b60405162461bcd60e51b81526020600482015260126024820152714e4f5f4e4654535f494e5f5245534552564560701b6044820152606490fd5b600b5480156118525760007f0175b7a638427703f0dbe7bb9bbf987a2551717b34e79f33b5b1008d1fa01db8811983019280841015611845575b600b83520155600b55565b61184d610e4f565b61183a565b634e487b7160e01b600052603160045260246000fd5b600080809381935af11561187857565b60405162461bcd60e51b815260206004820152601360248201527211551217d514905394d1915497d19052531151606a1b6044820152606490fd5b156118ba57565b60405162461bcd60e51b81526020600482015260086024820152671393d517d410525160c21b6044820152606490fd5b60019060001981146118fa570190565b6119026113c7565b0190565b1561190d57565b60405162461bcd60e51b815260206004820152601c60248201527f43555256455f504f4f4c5f47495645535f57524f4e475f5052494345000000006044820152606490fd5b60008054909392919061196d906001600160a01b03166103bc565b6040516370a0823160e01b80825230600483015290929091602091908290859060249082905afa938415611b40575b8794611b21575b506001546119b9906001600160a01b03166103bc565b604051635e0d443f60e01b8152600060048201526001602482015260448101839052611a06908481606481865afa908115611b14575b8a91611afd5750600354620f424090820204610fea565b813b15611af9579188611a5761146b999a9593611aa8989795604051948580948193630f7c084960e21b83528360048401606090939291936080810194600082526001602083015260408201520152565b03925af18015611aec575b611ad9575b5082548190611a7e906001600160a01b03166103bc565b604051938452306004850152839060249082905afa928315611acc575b92611aaf575b505061146d565b1015611906565b611ac59250803d10610c3057610c228183611416565b3880611aa1565b611ad4611447565b611a9b565b806104b0611ae6926113f5565b38611a67565b611af4611447565b611a62565b8880fd5b61106f9150853d8711610c3057610c228183611416565b611b1c611447565b6119ef565b611b39919450823d8411610c3057610c228183611416565b92386119a3565b611b48611447565b61199c565b6001544790611b64906001600160a01b03166103bc565b604051635e0d443f60e01b8152600160048201526000602482015260448101849052611b97906020818060648101610fc8565b92813b1561032a57604051630f7c084960e21b8152600160048201526000602482018190526044820192909252606481019490945261155d93918290608490829084905af18015611c02575b611bef575b504761146d565b806104b0611bfc926113f5565b38611be8565b611c0a611447565b611be356fea26469706673582212208d6daf4bb33821861f879ca3519abc349fd4ac6b7c2a023ea3f0f368cc3d3d9564736f6c63430008110033000000000000000000000000ae7ab96520de3a18e5e111b5eaab095312d7fe84000000000000000000000000f9267911480fb5ce2ff2b4deb1295d9b2ab5bb690000000000000000000000000000000000000000000000000000000000000221000000000000000000000000dc24316b9ae028f1497c275eb9192a3ea0f67022
Deployed Bytecode
0x60806040526004361015610018575b361561001657005b005b60003560e01c8063019d0b37146103105780630875a2f9146103075780631755ff21146102fe57806322895c0d146102f55780632a6b53cb146102ec5780632f9e1f16146102e357806335c7e925146102da5780633e032a3b146102d15780633eed17c7146102c85780633f26479e146102bf5780633f9367ee146102b657806343ed4e56146102ad578063483d3d7e146102a45780634f6bc8681461029b57806364528791146102925780636a1db1bf146102895780636c084f8814610280578063715018a6146102775780637165485d1461026e5780637dc2268c14610265578063894242811461025c5780638da5cb5b1461025357806398d5fdca1461024a57806399940ece146102415780639ea6fa0014610238578063a34e24751461022f578063a8e5862d14610226578063af795a8d1461021d578063bec872b014610214578063c4d916381461020b578063d09d3b7014610202578063d2217780146101f9578063dc8530ca146101f0578063ddca3f43146101e7578063e45ee2ed146101de578063efa659b2146101d5578063f2fde38b146101cc5763fb4352650361000e576101c7611334565b61000e565b506101c7611266565b506101c761123f565b506101c76111ea565b506101c76111cb565b506101c76111af565b506101c761118b565b506101c7611161565b506101c761109e565b506101c7611082565b506101c7610f6d565b506101c7610ef7565b506101c7610eab565b506101c7610dbf565b506101c7610d95565b506101c7610d6d565b506101c7610d43565b506101c7610d01565b506101c7610ccd565b506101c7610ca3565b506101c7610c44565b506101c7610b3e565b506101c7610b22565b506101c761096c565b506101c7610942565b506101c76108b0565b506101c7610868565b506101c7610849565b506101c761082a565b506101c7610806565b506101c76107e7565b506101c76107c3565b506101c7610688565b506101c7610558565b506101c7610539565b506101c761050f565b506101c7610389565b506101c761032f565b6001600160a01b0381160361032a57565b600080fd5b503461032a57602036600319011261032a5760043561034d81610319565b61035561136f565b600d80546001600160a01b0319166001600160a01b0392909216919091179055005b602090600319011261032a5760043590565b503461032a5761039836610377565b6103a6600160045414611606565b60026004556006546103c8906001600160a01b03165b6001600160a01b031690565b6040516331a9108f60e11b81526004810183905290919061040d90602081602481875afa9081156104f7575b6000916104c9575b506001600160a01b03163314611654565b610426600161041e600a5460ff1690565b151514611691565b61042e6115fb565b6104398115156116cb565b823b1561032a576040516323b872dd60e01b815233600482015230602482015260448101839052610499936104949261048e9290916000908290606490829084905af180156104bc575b6104a3575b50611b4d565b33611868565b61171d565b6100166001600455565b806104b06104b6926113f5565b80610504565b38610488565b6104c4611447565b610483565b6104ea915060203d81116104f0575b6104e28183611416565b81019061163f565b386103fc565b503d6104d8565b6104ff611447565b6103f4565b600091031261032a57565b503461032a57600036600319011261032a576002546040516001600160a01b039091168152602090f35b503461032a57600036600319011261032a576020600854604051908152f35b5060008060031936011261068557610574600160045414611606565b6002600455806105826115bd565b6105f161058d6115fb565b6105aa60016105a2600a5460ff9060081c1690565b151514611786565b6105b58315156116cb565b6105eb6105e16105dc600b546105cc8115156117bf565b6105d78734146118b3565b611454565b610e66565b90549060031b1c90565b92611952565b600654610606906001600160a01b03166103bc565b90813b15610681576040516323b872dd60e01b8152306004820152336024820152604481019190915291908290818381606481015b03925af18015610674575b610661575b50610654611800565b61065e6001600455565b80f35b806104b061066e926113f5565b3861064b565b61067c611447565b610646565b5050fd5b80fd5b503461032a57600080600319360112610685576106a9600160045414611606565b60026004556106b66115bd565b6106cb60016105a2600a5460ff9060081c1690565b6106d68115156116cb565b816106ee6105e16105dc600b546105d78115156117bf565b8154610702906001600160a01b03166103bc565b6040516323b872dd60e01b8082523360048301523060248301526044820195909552906020908290606490829087905af180156107b6575b610788575b50600654610755906001600160a01b03166103bc565b803b1561078457604051938452306004850152336024850152604484019190915282908183816064810161063b565b8280fd5b6107a89060203d81116107af575b6107a08183611416565b810190611708565b503861073f565b503d610796565b6107be611447565b61073a565b503461032a57600036600319011261032a5760206107df6114ad565b604051908152f35b503461032a57600036600319011261032a576020600354604051908152f35b503461032a57600036600319011261032a57602060ff600a54166040519015158152f35b503461032a57600036600319011261032a576020604051620f42408152f35b503461032a57600036600319011261032a576020600954604051908152f35b503461032a57602036600319011261032a5760043561088681610319565b61088e61136f565b600c80546001600160a01b0319166001600160a01b0392909216919091179055005b503461032a576108bf36610377565b600c54336001600160a01b0391821614908115610934575b501561090057610016906009549081018091116108f357600955565b6108fb6113c7565b600955565b60405162461bcd60e51b815260206004820152600c60248201526b15539055551213d49256915160a21b6044820152606490fd5b9050600d54163314386108d7565b503461032a57600036600319011261032a57600c546040516001600160a01b039091168152602090f35b503461032a5761097b36610377565b610989600160045414611606565b60026004556006546109a3906001600160a01b03166103bc565b6040516331a9108f60e11b8152600481018390529091906020906109e9908281602481885afa908115610b15575b600091610afe57506001600160a01b03163314611654565b6109fa600161041e600a5460ff1690565b610a026115fb565b92610a0e8415156116cb565b803b1561032a576040516323b872dd60e01b815233600482015230602482015260448101849052610499946000928492610a9c929185908290606490829084905af18015610af1575b610ade575b508354610a71906001600160a01b03166103bc565b60405163a9059cbb60e01b815233600482015260248101929092529093849283919082906044820190565b03925af18015610ad1575b610ab3575b505061171d565b81610ac992903d106107af576107a08183611416565b503880610aac565b610ad9611447565b610aa7565b806104b0610aeb926113f5565b38610a5c565b610af9611447565b610a57565b6104ea9150833d85116104f0576104e28183611416565b610b1d611447565b6109d1565b503461032a57610b3136610377565b610b3961136f565b600755005b503461032a5760008060031936011261068557610b5961136f565b8054610b6d906001600160a01b03166103bc565b6040516370a0823160e01b815230600482015260209183918391610bcd918381602481855afa908115610c37575b8591610c0a575b5060405163a9059cbb60e01b8152336004820152602481019190915293849283919082906044820190565b03925af18015610bfd575b610be0578280f35b81610bf692903d106107af576107a08183611416565b5038808280f35b610c05611447565b610bd8565b610c2a9150843d8611610c30575b610c228183611416565b810190611438565b38610ba2565b503d610c18565b610c3f611447565b610b9b565b503461032a5760008060031936011261068557610c5f61136f565b600580546001600160a01b0319811690915581906001600160a01b03167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08280a380f35b503461032a57600036600319011261032a576001546040516001600160a01b039091168152602090f35b503461032a57600036600319011261032a57600d546040516001600160a01b039091168152602090f35b8015150361032a57565b503461032a57602036600319011261032a57600435610d1f81610cf7565b610d2761136f565b61ff00600a5491151560081b169061ff00191617600a55600080f35b503461032a57600036600319011261032a576005546040516001600160a01b039091168152602090f35b503461032a57600036600319011261032a5760206107df610d8c6114ad565b6009549061148d565b503461032a57600036600319011261032a576000546040516001600160a01b039091168152602090f35b503461032a57610e1a6020610dd336610377565b610ddb61136f565b6000805460025460405163095ea7b360e01b81526001600160a01b03918216600482015260248101949094529294859390911691839182906044820190565b03925af18015610e42575b610e2b57005b6100169060203d81116107af576107a08183611416565b610e4a611447565b610e25565b50634e487b7160e01b600052603260045260246000fd5b600b54811015610e9e575b600b6000527f0175b7a638427703f0dbe7bb9bbf987a2551717b34e79f33b5b1008d1fa01db90190600090565b610ea6610e4f565b610e71565b503461032a57610eba36610377565b600b5481101561032a57602090600b6000527f0175b7a638427703f0dbe7bb9bbf987a2551717b34e79f33b5b1008d1fa01db90154604051908152f35b503461032a57600036600319011261032a5760207f0175b7a638427703f0dbe7bb9bbf987a2551717b34e79f33b5b1008d1fa01db8600b54806000198101818111610f60575b1015610f53575b600b6000520154604051908152f35b610f5b610e4f565b610f44565b610f686113c7565b610f3d565b503461032a57610f7c36610377565b610f8461136f565b600154610f99906001600160a01b03166103bc565b604051635e0d443f60e01b8152600060048201526001602482015260448101839052610ff09060208180606481015b0381865afa908115611075575b600091611057575b50600354620f4240908202045b9061146d565b813b1561032a57604051630f7c084960e21b81526000600482018190526001602483015260448201859052606482019290925292909183916084918391905af1801561104a575b61103d57005b806104b0610016926113f5565b611052611447565b611037565b61106f915060203d8111610c3057610c228183611416565b38610fdd565b61107d611447565b610fd5565b503461032a5761109136610377565b61109961136f565b600355005b503461032a576110ad36610377565b6110b561136f565b60005b8181106110c157005b6006546110d6906001600160a01b03166103bc565b906110e86105e16105dc600b54611454565b823b1561032a576040516323b872dd60e01b8152306004820152336024820152604481019190915261113c926000908290606490829084905af18015611154575b611141575b50611137611800565b6118ea565b6110b8565b806104b061114e926113f5565b3861112e565b61115c611447565b611129565b503461032a57600036600319011261032a576006546040516001600160a01b039091168152602090f35b503461032a57600036600319011261032a576111a561136f565b6100164733611868565b503461032a57600036600319011261032a5760206107df6115bd565b503461032a57600036600319011261032a576020600754604051908152f35b503461032a57602036600319011261032a5760043561120881610319565b61121061136f565b60018060a01b03166bffffffffffffffffffffffff60a01b818160015416176001556002541617600255600080f35b503461032a57600036600319011261032a57602060ff600a5460081c166040519015158152f35b503461032a57602036600319011261032a5760043561128481610319565b61128c61136f565b6001600160a01b039081169081156112e057600554826bffffffffffffffffffffffff60a01b821617600555167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0600080a3005b60405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608490fd5b503461032a57602036600319011261032a5760043561135281610cf7565b61135a61136f565b60ff8019600a54169115151617600a55600080f35b6005546001600160a01b0316330361138357565b606460405162461bcd60e51b815260206004820152602060248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152fd5b50634e487b7160e01b600052601160045260246000fd5b50634e487b7160e01b600052604160045260246000fd5b67ffffffffffffffff811161140957604052565b6114116113de565b604052565b90601f8019910116810190811067ffffffffffffffff82111761140957604052565b9081602091031261032a575190565b506040513d6000823e3d90fd5b60001981019190821161146357565b61146b6113c7565b565b9190820391821161146357565b8181029291811591840414171561146357565b8115611497570490565b634e487b7160e01b600052601260045260246000fd5b60095460065461155d9190611558906114ce906001600160a01b03166103bc565b6040516370a0823160e01b808252306004830152939160209161150d918390829060249082905afa9081156115b0575b600091611593575b508361146d565b801561158a57935b600054829061152c906001600160a01b03166103bc565b604051928352306004840152829060249082905afa91821561157d575b600092611560575b505061147a565b61148d565b90565b6115769250803d10610c3057610c228183611416565b3880611551565b611585611447565b611549565b50600193611515565b6115aa9150833d8511610c3057610c228183611416565b38611506565b6115b8611447565b6114fe565b6115c56114ad565b620f42406115e26115d9600954809461148d565b926115586114ad565b600754020481018091116115f35790565b61155d6113c7565b61155d610d8c6114ad565b1561160d57565b60405162461bcd60e51b815260206004820152600a6024820152695245454e5452414e435960b01b6044820152606490fd5b9081602091031261032a575161155d81610319565b1561165b57565b60405162461bcd60e51b815260206004820152600e60248201526d1393d517d055551213d49256915160921b6044820152606490fd5b1561169857565b60405162461bcd60e51b815260206004820152600b60248201526a29a2a6262fa727aa2fa7a760a91b6044820152606490fd5b156116d257565b60405162461bcd60e51b815260206004820152600e60248201526d1393d517d253925510531256915160921b6044820152606490fd5b9081602091031261032a575161155d81610cf7565b600b5468010000000000000000811015611779575b6001810180600b5581101561176c575b600b6000527f0175b7a638427703f0dbe7bb9bbf987a2551717b34e79f33b5b1008d1fa01db90155565b611774610e4f565b611742565b6117816113de565b611732565b1561178d57565b60405162461bcd60e51b815260206004820152600a602482015269212aacafa727aa2fa7a760b11b6044820152606490fd5b156117c657565b60405162461bcd60e51b81526020600482015260126024820152714e4f5f4e4654535f494e5f5245534552564560701b6044820152606490fd5b600b5480156118525760007f0175b7a638427703f0dbe7bb9bbf987a2551717b34e79f33b5b1008d1fa01db8811983019280841015611845575b600b83520155600b55565b61184d610e4f565b61183a565b634e487b7160e01b600052603160045260246000fd5b600080809381935af11561187857565b60405162461bcd60e51b815260206004820152601360248201527211551217d514905394d1915497d19052531151606a1b6044820152606490fd5b156118ba57565b60405162461bcd60e51b81526020600482015260086024820152671393d517d410525160c21b6044820152606490fd5b60019060001981146118fa570190565b6119026113c7565b0190565b1561190d57565b60405162461bcd60e51b815260206004820152601c60248201527f43555256455f504f4f4c5f47495645535f57524f4e475f5052494345000000006044820152606490fd5b60008054909392919061196d906001600160a01b03166103bc565b6040516370a0823160e01b80825230600483015290929091602091908290859060249082905afa938415611b40575b8794611b21575b506001546119b9906001600160a01b03166103bc565b604051635e0d443f60e01b8152600060048201526001602482015260448101839052611a06908481606481865afa908115611b14575b8a91611afd5750600354620f424090820204610fea565b813b15611af9579188611a5761146b999a9593611aa8989795604051948580948193630f7c084960e21b83528360048401606090939291936080810194600082526001602083015260408201520152565b03925af18015611aec575b611ad9575b5082548190611a7e906001600160a01b03166103bc565b604051938452306004850152839060249082905afa928315611acc575b92611aaf575b505061146d565b1015611906565b611ac59250803d10610c3057610c228183611416565b3880611aa1565b611ad4611447565b611a9b565b806104b0611ae6926113f5565b38611a67565b611af4611447565b611a62565b8880fd5b61106f9150853d8711610c3057610c228183611416565b611b1c611447565b6119ef565b611b39919450823d8411610c3057610c228183611416565b92386119a3565b611b48611447565b61199c565b6001544790611b64906001600160a01b03166103bc565b604051635e0d443f60e01b8152600160048201526000602482015260448101849052611b97906020818060648101610fc8565b92813b1561032a57604051630f7c084960e21b8152600160048201526000602482018190526044820192909252606481019490945261155d93918290608490829084905af18015611c02575b611bef575b504761146d565b806104b0611bfc926113f5565b38611be8565b611c0a611447565b611be356fea26469706673582212208d6daf4bb33821861f879ca3519abc349fd4ac6b7c2a023ea3f0f368cc3d3d9564736f6c63430008110033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
000000000000000000000000ae7ab96520de3a18e5e111b5eaab095312d7fe84000000000000000000000000f9267911480fb5ce2ff2b4deb1295d9b2ab5bb690000000000000000000000000000000000000000000000000000000000000221000000000000000000000000dc24316b9ae028f1497c275eb9192a3ea0f67022
-----Decoded View---------------
Arg [0] : _token0 (address): 0xae7ab96520DE3A18E5e111B5EaAb095312D7fE84
Arg [1] : _token1 (address): 0xF9267911480fb5ce2fF2B4DEb1295d9b2AB5BB69
Arg [2] : numberOfNfts (uint256): 545
Arg [3] : curvePool (address): 0xDC24316b9AE028F1497c275EB9192a3Ea0f67022
-----Encoded View---------------
4 Constructor Arguments found :
Arg [0] : 000000000000000000000000ae7ab96520de3a18e5e111b5eaab095312d7fe84
Arg [1] : 000000000000000000000000f9267911480fb5ce2ff2b4deb1295d9b2ab5bb69
Arg [2] : 0000000000000000000000000000000000000000000000000000000000000221
Arg [3] : 000000000000000000000000dc24316b9ae028f1497c275eb9192a3ea0f67022
Loading...
Loading
Loading...
Loading
Net Worth in USD
$21,884.29
Net Worth in ETH
10.70374
Token Allocations
STETH
100.00%
Multichain Portfolio | 32 Chains
| Chain | Token | Portfolio % | Price | Amount | Value |
|---|---|---|---|---|---|
| ETH | 100.00% | $2,043.47 | 10.7094 | $21,884.29 |
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.