Source Code
Overview
ETH Balance
0 ETH
Eth Value
$0.00Latest 12 from a total of 12 transactions
| Transaction Hash |
Method
|
Block
|
From
|
|
To
|
||||
|---|---|---|---|---|---|---|---|---|---|
| Withdraw Tokens | 15168979 | 1331 days ago | IN | 0 ETH | 0.00116892 | ||||
| Claim Tokens | 14174986 | 1490 days ago | IN | 0 ETH | 0.00883964 | ||||
| Grant Vesting To... | 13973458 | 1521 days ago | IN | 0 ETH | 0.01232425 | ||||
| Grant Vesting To... | 13973458 | 1521 days ago | IN | 0 ETH | 0.01232425 | ||||
| Grant Vesting To... | 13973453 | 1521 days ago | IN | 0 ETH | 0.01168533 | ||||
| Grant Vesting To... | 13973451 | 1521 days ago | IN | 0 ETH | 0.0129445 | ||||
| Grant Vesting To... | 13973445 | 1521 days ago | IN | 0 ETH | 0.01072952 | ||||
| Grant Vesting To... | 13973444 | 1521 days ago | IN | 0 ETH | 0.00955332 | ||||
| Grant Vesting To... | 13973438 | 1521 days ago | IN | 0 ETH | 0.01095084 | ||||
| Grant Vesting To... | 13973431 | 1521 days ago | IN | 0 ETH | 0.01130015 | ||||
| Transfer Ownersh... | 13961099 | 1523 days ago | IN | 0 ETH | 0.00378988 | ||||
| Transfer Ownersh... | 13949694 | 1525 days ago | IN | 0 ETH | 0.00295169 |
View more zero value Internal Transactions in Advanced View mode
Advanced mode:
Loading...
Loading
Loading...
Loading
Cross-Chain Transactions
Loading...
Loading
Contract Name:
Vesting
Compiler Version
v0.8.6+commit.11564f7e
Optimization Enabled:
No with 200 runs
Other Settings:
default evmVersion
Contract Source Code (Solidity Standard Json-Input format)
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.6;
import "@openzeppelin/contracts/access/Ownable.sol";
import "@openzeppelin/contracts/token/ERC1155/IERC1155.sol";
import "@openzeppelin/contracts/token/ERC1155/utils/ERC1155Receiver.sol";
import "@openzeppelin/contracts/utils/math/Math.sol";
import "./DateTime.sol";
/* ========== ERRORS ========== */
library Errors {
string internal constant InvalidTimestamp = "invalid timestamp";
string internal constant InvalidInput = "invalid input provided";
string internal constant NoVestingSchedule =
"sender has not been registered for a vesting schedule";
string internal constant InsufficientTokenBalance =
"contract does not have enough tokens to distribute";
}
/* ========== DATA STRUCTURES ========== */
// @notice A vesting schedule for an individual address.
struct VestingSchedule {
uint256 lastClaim;
uint16 monthsRemaining;
uint32 tokensPerMonth;
}
contract Vesting is Ownable, ERC1155Receiver {
/* ========== EVENTS ========== */
event VestingTokensGranted(
address indexed to,
uint256 totalMonths,
uint256 tokensPerMonth
);
event VestedTokensClaimed(
address indexed by,
uint256 monthsClaimed,
uint256 amount
);
event VestingTokensRevoked(address indexed from);
event RewardTokenSet(address tokenAddress, uint256 tokenId);
event TokensWithdrawnFromContract(address indexed to, uint256 amount);
/* ========== STATE VARIABLES ========== */
address private _tokenAddress;
uint256 private _tokenId;
mapping(address => VestingSchedule) private _vestingSchedules;
/* ========== CONSTRUCTOR ========== */
constructor(address tokenAddress, uint256 tokenId) ERC1155Receiver() {
_tokenAddress = tokenAddress;
_tokenId = tokenId;
}
/* ========== MUTATIVE FUNCTIONS ========== */
// @notice Claim your vested tokens since last claiming timestamp.
function claimTokens() external returns (uint256 tokensToClaim) {
VestingSchedule storage userVestingSchedule = _vestingSchedules[msg.sender];
uint256 monthsPassed = DateTime.diffMonths(
_vestingSchedules[msg.sender].lastClaim,
block.timestamp
);
// use uint16 because we can not claim more than the months remaining. avoid overflow later when assumptions are more complex.
// explicit conversion here should be fine, since we already min() with a upscaled uint16 (monthsRemaining), so the range should fall within a single uint16
uint16 monthsClaimed = uint16(
Math.min(userVestingSchedule.monthsRemaining, monthsPassed)
);
if (monthsClaimed == 0) {
return 0;
} else {
tokensToClaim =
uint256(userVestingSchedule.tokensPerMonth) *
monthsClaimed;
}
IERC1155 token = IERC1155(_tokenAddress);
require(
token.balanceOf(address(this), _tokenId) >= tokensToClaim,
Errors.InsufficientTokenBalance
);
_vestingSchedules[msg.sender].lastClaim = block.timestamp;
_vestingSchedules[msg.sender].monthsRemaining =
_vestingSchedules[msg.sender].monthsRemaining -
monthsClaimed;
token.safeTransferFrom(
address(this),
msg.sender,
_tokenId,
tokensToClaim,
"Claiming vested tokens"
);
emit VestedTokensClaimed(msg.sender, monthsClaimed, tokensToClaim);
}
// @notice Grant vesting tokens to a specified address.
// @param toGrant Address to receive tokens on a vesting schedule.
// @param numberOfMonths Number of months to grant tokens for.
// @param tokensPerMonth Number of tokens to grant per month.
function grantVestingTokens(
address toGrant,
uint16 numberOfMonths,
uint32 tokensPerMonth
) external onlyOwner {
require(toGrant != address(0), Errors.InvalidInput);
_vestingSchedules[toGrant] = VestingSchedule(
block.timestamp,
numberOfMonths,
tokensPerMonth
);
emit VestingTokensGranted(toGrant, numberOfMonths, tokensPerMonth);
}
// @notice Owner can withdraw tokens deposited into the contract.
// @param count The number of tokens to withdraw.
function withdrawTokens(uint256 count) external onlyOwner {
IERC1155 token = IERC1155(_tokenAddress);
require(
token.balanceOf(address(this), _tokenId) >= count,
Errors.InsufficientTokenBalance
);
token.safeTransferFrom(
address(this),
msg.sender,
_tokenId,
count,
"Withdrawing tokens"
);
emit TokensWithdrawnFromContract(msg.sender, count);
}
// @notice Revoke vesting tokens from specified address.
// @param revokeAddress The address to revoke tokens from.
function revokeVestingTokens(address revokeAddress) external onlyOwner {
_vestingSchedules[revokeAddress].tokensPerMonth = 0;
_vestingSchedules[revokeAddress].monthsRemaining = 0;
emit VestingTokensRevoked(revokeAddress);
}
/*
* @notice Set the token to be used for vesting rewards.
* @dev Token must implement ERC1155.
* @param tokenAddress The address of the token contract.
* @param tokenId The id of the token.
*/
function setToken(address tokenAddress, uint256 id) external onlyOwner {
_tokenAddress = tokenAddress;
_tokenId = id;
emit RewardTokenSet(tokenAddress, id);
}
/* ========== VIEW FUNCTIONS ========== */
/*
* @notice Get the vested token address and ID.
*/
function getToken() external view returns (address, uint256) {
return (_tokenAddress, _tokenId);
}
/*
* @notice Get the vesting schedule for a specified address.
* @param addr The address to get the schedule for.
*/
function getVestingSchedule(address addr)
external
view
returns (
uint256 timestamp,
uint16 monthsRemaining,
uint32 tokensPerMonth
)
{
VestingSchedule storage _vestingSchedule = _vestingSchedules[addr];
return (
_vestingSchedule.lastClaim,
_vestingSchedule.monthsRemaining,
_vestingSchedule.tokensPerMonth
);
}
function onERC1155Received(
address operator,
address from,
uint256 id,
uint256 value,
bytes calldata data
) external pure override returns (bytes4) {
return
bytes4(
keccak256("onERC1155Received(address,address,uint256,uint256,bytes)")
);
}
function onERC1155BatchReceived(
address operator,
address from,
uint256[] calldata ids,
uint256[] calldata values,
bytes calldata data
) external pure override returns (bytes4) {
return
bytes4(
keccak256("onERC1155Received(address,address,uint256,uint256,bytes)")
);
}
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (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 Returns the address of the current owner.
*/
function owner() public view virtual returns (address) {
return _owner;
}
/**
* @dev Throws if called by any account other than the owner.
*/
modifier onlyOwner() {
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 (token/ERC1155/IERC1155.sol)
pragma solidity ^0.8.0;
import "../../utils/introspection/IERC165.sol";
/**
* @dev Required interface of an ERC1155 compliant contract, as defined in the
* https://eips.ethereum.org/EIPS/eip-1155[EIP].
*
* _Available since v3.1._
*/
interface IERC1155 is IERC165 {
/**
* @dev Emitted when `value` tokens of token type `id` are transferred from `from` to `to` by `operator`.
*/
event TransferSingle(address indexed operator, address indexed from, address indexed to, uint256 id, uint256 value);
/**
* @dev Equivalent to multiple {TransferSingle} events, where `operator`, `from` and `to` are the same for all
* transfers.
*/
event TransferBatch(
address indexed operator,
address indexed from,
address indexed to,
uint256[] ids,
uint256[] values
);
/**
* @dev Emitted when `account` grants or revokes permission to `operator` to transfer their tokens, according to
* `approved`.
*/
event ApprovalForAll(address indexed account, address indexed operator, bool approved);
/**
* @dev Emitted when the URI for token type `id` changes to `value`, if it is a non-programmatic URI.
*
* If an {URI} event was emitted for `id`, the standard
* https://eips.ethereum.org/EIPS/eip-1155#metadata-extensions[guarantees] that `value` will equal the value
* returned by {IERC1155MetadataURI-uri}.
*/
event URI(string value, uint256 indexed id);
/**
* @dev Returns the amount of tokens of token type `id` owned by `account`.
*
* Requirements:
*
* - `account` cannot be the zero address.
*/
function balanceOf(address account, uint256 id) external view returns (uint256);
/**
* @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {balanceOf}.
*
* Requirements:
*
* - `accounts` and `ids` must have the same length.
*/
function balanceOfBatch(address[] calldata accounts, uint256[] calldata ids)
external
view
returns (uint256[] memory);
/**
* @dev Grants or revokes permission to `operator` to transfer the caller's tokens, according to `approved`,
*
* Emits an {ApprovalForAll} event.
*
* Requirements:
*
* - `operator` cannot be the caller.
*/
function setApprovalForAll(address operator, bool approved) external;
/**
* @dev Returns true if `operator` is approved to transfer ``account``'s tokens.
*
* See {setApprovalForAll}.
*/
function isApprovedForAll(address account, address operator) external view returns (bool);
/**
* @dev Transfers `amount` tokens of token type `id` from `from` to `to`.
*
* Emits a {TransferSingle} event.
*
* Requirements:
*
* - `to` cannot be the zero address.
* - If the caller is not `from`, it must be have been approved to spend ``from``'s tokens via {setApprovalForAll}.
* - `from` must have a balance of tokens of type `id` of at least `amount`.
* - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155Received} and return the
* acceptance magic value.
*/
function safeTransferFrom(
address from,
address to,
uint256 id,
uint256 amount,
bytes calldata data
) external;
/**
* @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {safeTransferFrom}.
*
* Emits a {TransferBatch} event.
*
* Requirements:
*
* - `ids` and `amounts` must have the same length.
* - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155BatchReceived} and return the
* acceptance magic value.
*/
function safeBatchTransferFrom(
address from,
address to,
uint256[] calldata ids,
uint256[] calldata amounts,
bytes calldata data
) external;
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (token/ERC1155/utils/ERC1155Receiver.sol)
pragma solidity ^0.8.0;
import "../IERC1155Receiver.sol";
import "../../../utils/introspection/ERC165.sol";
/**
* @dev _Available since v3.1._
*/
abstract contract ERC1155Receiver is ERC165, IERC1155Receiver {
/**
* @dev See {IERC165-supportsInterface}.
*/
function supportsInterface(bytes4 interfaceId) public view virtual override(ERC165, IERC165) returns (bool) {
return interfaceId == type(IERC1155Receiver).interfaceId || super.supportsInterface(interfaceId);
}
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (utils/math/Math.sol)
pragma solidity ^0.8.0;
/**
* @dev Standard math utilities missing in the Solidity language.
*/
library Math {
/**
* @dev Returns the largest of two numbers.
*/
function max(uint256 a, uint256 b) internal pure returns (uint256) {
return a >= b ? a : b;
}
/**
* @dev Returns the smallest of two numbers.
*/
function min(uint256 a, uint256 b) internal pure returns (uint256) {
return a < b ? a : b;
}
/**
* @dev Returns the average of two numbers. The result is rounded towards
* zero.
*/
function average(uint256 a, uint256 b) internal pure returns (uint256) {
// (a + b) / 2 can overflow.
return (a & b) + (a ^ b) / 2;
}
/**
* @dev Returns the ceiling of the division of two numbers.
*
* This differs from standard division with `/` in that it rounds up instead
* of rounding down.
*/
function ceilDiv(uint256 a, uint256 b) internal pure returns (uint256) {
// (a + b - 1) / b can overflow on addition, so we distribute.
return a / b + (a % b == 0 ? 0 : 1);
}
}// SPDX-License-Identifier: MIT
pragma solidity >=0.6.0 <0.9.0;
// ----------------------------------------------------------------------------
// BokkyPooBah's DateTime Library v1.01
//
// A gas-efficient Solidity date and time library
//
// https://github.com/bokkypoobah/BokkyPooBahsDateTimeLibrary
//
// Tested date range 1970/01/01 to 2345/12/31
//
// Conventions:
// Unit | Range | Notes
// :-------- |:-------------:|:-----
// timestamp | >= 0 | Unix timestamp, number of seconds since 1970/01/01 00:00:00 UTC
// year | 1970 ... 2345 |
// month | 1 ... 12 |
// day | 1 ... 31 |
// hour | 0 ... 23 |
// minute | 0 ... 59 |
// second | 0 ... 59 |
// dayOfWeek | 1 ... 7 | 1 = Monday, ..., 7 = Sunday
//
//
// Enjoy. (c) BokkyPooBah / Bok Consulting Pty Ltd 2018-2019. The MIT Licence.
// ----------------------------------------------------------------------------
library DateTime {
uint256 constant SECONDS_PER_DAY = 24 * 60 * 60;
uint256 constant SECONDS_PER_HOUR = 60 * 60;
uint256 constant SECONDS_PER_MINUTE = 60;
int256 constant OFFSET19700101 = 2440588;
uint256 constant DOW_MON = 1;
uint256 constant DOW_TUE = 2;
uint256 constant DOW_WED = 3;
uint256 constant DOW_THU = 4;
uint256 constant DOW_FRI = 5;
uint256 constant DOW_SAT = 6;
uint256 constant DOW_SUN = 7;
// ------------------------------------------------------------------------
// Calculate the number of days from 1970/01/01 to year/month/day using
// the date conversion algorithm from
// http://aa.usno.navy.mil/faq/docs/JD_Formula.php
// and subtracting the offset 2440588 so that 1970/01/01 is day 0
//
// days = day
// - 32075
// + 1461 * (year + 4800 + (month - 14) / 12) / 4
// + 367 * (month - 2 - (month - 14) / 12 * 12) / 12
// - 3 * ((year + 4900 + (month - 14) / 12) / 100) / 4
// - offset
// ------------------------------------------------------------------------
function _daysFromDate(
uint256 year,
uint256 month,
uint256 day
) internal pure returns (uint256 _days) {
// require(year >= 1970);
int256 _year = int256(year);
int256 _month = int256(month);
int256 _day = int256(day);
int256 __days = _day -
32075 +
(1461 * (_year + 4800 + (_month - 14) / 12)) /
4 +
(367 * (_month - 2 - ((_month - 14) / 12) * 12)) /
12 -
(3 * ((_year + 4900 + (_month - 14) / 12) / 100)) /
4 -
OFFSET19700101;
_days = uint256(__days);
}
// ------------------------------------------------------------------------
// Calculate year/month/day from the number of days since 1970/01/01 using
// the date conversion algorithm from
// http://aa.usno.navy.mil/faq/docs/JD_Formula.php
// and adding the offset 2440588 so that 1970/01/01 is day 0
//
// int L = days + 68569 + offset
// int N = 4 * L / 146097
// L = L - (146097 * N + 3) / 4
// year = 4000 * (L + 1) / 1461001
// L = L - 1461 * year / 4 + 31
// month = 80 * L / 2447
// dd = L - 2447 * month / 80
// L = month / 11
// month = month + 2 - 12 * L
// year = 100 * (N - 49) + year + L
// ------------------------------------------------------------------------
function _daysToDate(uint256 _days)
internal
pure
returns (
uint256 year,
uint256 month,
uint256 day
)
{
int256 __days = int256(_days);
int256 L = __days + 68569 + OFFSET19700101;
int256 N = (4 * L) / 146097;
L = L - (146097 * N + 3) / 4;
int256 _year = (4000 * (L + 1)) / 1461001;
L = L - (1461 * _year) / 4 + 31;
int256 _month = (80 * L) / 2447;
int256 _day = L - (2447 * _month) / 80;
L = _month / 11;
_month = _month + 2 - 12 * L;
_year = 100 * (N - 49) + _year + L;
year = uint256(_year);
month = uint256(_month);
day = uint256(_day);
}
function timestampFromDate(
uint256 year,
uint256 month,
uint256 day
) internal pure returns (uint256 timestamp) {
timestamp = _daysFromDate(year, month, day) * SECONDS_PER_DAY;
}
function timestampFromDateTime(
uint256 year,
uint256 month,
uint256 day,
uint256 hour,
uint256 minute,
uint256 second
) internal pure returns (uint256 timestamp) {
timestamp =
_daysFromDate(year, month, day) *
SECONDS_PER_DAY +
hour *
SECONDS_PER_HOUR +
minute *
SECONDS_PER_MINUTE +
second;
}
function timestampToDate(uint256 timestamp)
internal
pure
returns (
uint256 year,
uint256 month,
uint256 day
)
{
(year, month, day) = _daysToDate(timestamp / SECONDS_PER_DAY);
}
function timestampToDateTime(uint256 timestamp)
internal
pure
returns (
uint256 year,
uint256 month,
uint256 day,
uint256 hour,
uint256 minute,
uint256 second
)
{
(year, month, day) = _daysToDate(timestamp / SECONDS_PER_DAY);
uint256 secs = timestamp % SECONDS_PER_DAY;
hour = secs / SECONDS_PER_HOUR;
secs = secs % SECONDS_PER_HOUR;
minute = secs / SECONDS_PER_MINUTE;
second = secs % SECONDS_PER_MINUTE;
}
function isValidDate(
uint256 year,
uint256 month,
uint256 day
) internal pure returns (bool valid) {
if (year >= 1970 && month > 0 && month <= 12) {
uint256 daysInMonth = _getDaysInMonth(year, month);
if (day > 0 && day <= daysInMonth) {
valid = true;
}
}
}
function isValidDateTime(
uint256 year,
uint256 month,
uint256 day,
uint256 hour,
uint256 minute,
uint256 second
) internal pure returns (bool valid) {
if (isValidDate(year, month, day)) {
if (hour < 24 && minute < 60 && second < 60) {
valid = true;
}
}
}
function isLeapYear(uint256 timestamp) internal pure returns (bool leapYear) {
(uint256 year, , ) = _daysToDate(timestamp / SECONDS_PER_DAY);
leapYear = _isLeapYear(year);
}
function _isLeapYear(uint256 year) internal pure returns (bool leapYear) {
leapYear = ((year % 4 == 0) && (year % 100 != 0)) || (year % 400 == 0);
}
function isWeekDay(uint256 timestamp) internal pure returns (bool weekDay) {
weekDay = getDayOfWeek(timestamp) <= DOW_FRI;
}
function isWeekEnd(uint256 timestamp) internal pure returns (bool weekEnd) {
weekEnd = getDayOfWeek(timestamp) >= DOW_SAT;
}
function getDaysInMonth(uint256 timestamp)
internal
pure
returns (uint256 daysInMonth)
{
(uint256 year, uint256 month, ) = _daysToDate(timestamp / SECONDS_PER_DAY);
daysInMonth = _getDaysInMonth(year, month);
}
function _getDaysInMonth(uint256 year, uint256 month)
internal
pure
returns (uint256 daysInMonth)
{
if (
month == 1 ||
month == 3 ||
month == 5 ||
month == 7 ||
month == 8 ||
month == 10 ||
month == 12
) {
daysInMonth = 31;
} else if (month != 2) {
daysInMonth = 30;
} else {
daysInMonth = _isLeapYear(year) ? 29 : 28;
}
}
// 1 = Monday, 7 = Sunday
function getDayOfWeek(uint256 timestamp)
internal
pure
returns (uint256 dayOfWeek)
{
uint256 _days = timestamp / SECONDS_PER_DAY;
dayOfWeek = ((_days + 3) % 7) + 1;
}
function getYear(uint256 timestamp) internal pure returns (uint256 year) {
(year, , ) = _daysToDate(timestamp / SECONDS_PER_DAY);
}
function getMonth(uint256 timestamp) internal pure returns (uint256 month) {
(, month, ) = _daysToDate(timestamp / SECONDS_PER_DAY);
}
function getDay(uint256 timestamp) internal pure returns (uint256 day) {
(, , day) = _daysToDate(timestamp / SECONDS_PER_DAY);
}
function getHour(uint256 timestamp) internal pure returns (uint256 hour) {
uint256 secs = timestamp % SECONDS_PER_DAY;
hour = secs / SECONDS_PER_HOUR;
}
function getMinute(uint256 timestamp) internal pure returns (uint256 minute) {
uint256 secs = timestamp % SECONDS_PER_HOUR;
minute = secs / SECONDS_PER_MINUTE;
}
function getSecond(uint256 timestamp) internal pure returns (uint256 second) {
second = timestamp % SECONDS_PER_MINUTE;
}
function addYears(uint256 timestamp, uint256 _years)
internal
pure
returns (uint256 newTimestamp)
{
(uint256 year, uint256 month, uint256 day) = _daysToDate(
timestamp / SECONDS_PER_DAY
);
year += _years;
uint256 daysInMonth = _getDaysInMonth(year, month);
if (day > daysInMonth) {
day = daysInMonth;
}
newTimestamp =
_daysFromDate(year, month, day) *
SECONDS_PER_DAY +
(timestamp % SECONDS_PER_DAY);
require(newTimestamp >= timestamp);
}
function addMonths(uint256 timestamp, uint256 _months)
internal
pure
returns (uint256 newTimestamp)
{
(uint256 year, uint256 month, uint256 day) = _daysToDate(
timestamp / SECONDS_PER_DAY
);
month += _months;
year += (month - 1) / 12;
month = ((month - 1) % 12) + 1;
uint256 daysInMonth = _getDaysInMonth(year, month);
if (day > daysInMonth) {
day = daysInMonth;
}
newTimestamp =
_daysFromDate(year, month, day) *
SECONDS_PER_DAY +
(timestamp % SECONDS_PER_DAY);
require(newTimestamp >= timestamp);
}
function addDays(uint256 timestamp, uint256 _days)
internal
pure
returns (uint256 newTimestamp)
{
newTimestamp = timestamp + _days * SECONDS_PER_DAY;
require(newTimestamp >= timestamp);
}
function addHours(uint256 timestamp, uint256 _hours)
internal
pure
returns (uint256 newTimestamp)
{
newTimestamp = timestamp + _hours * SECONDS_PER_HOUR;
require(newTimestamp >= timestamp);
}
function addMinutes(uint256 timestamp, uint256 _minutes)
internal
pure
returns (uint256 newTimestamp)
{
newTimestamp = timestamp + _minutes * SECONDS_PER_MINUTE;
require(newTimestamp >= timestamp);
}
function addSeconds(uint256 timestamp, uint256 _seconds)
internal
pure
returns (uint256 newTimestamp)
{
newTimestamp = timestamp + _seconds;
require(newTimestamp >= timestamp);
}
function subYears(uint256 timestamp, uint256 _years)
internal
pure
returns (uint256 newTimestamp)
{
(uint256 year, uint256 month, uint256 day) = _daysToDate(
timestamp / SECONDS_PER_DAY
);
year -= _years;
uint256 daysInMonth = _getDaysInMonth(year, month);
if (day > daysInMonth) {
day = daysInMonth;
}
newTimestamp =
_daysFromDate(year, month, day) *
SECONDS_PER_DAY +
(timestamp % SECONDS_PER_DAY);
require(newTimestamp <= timestamp);
}
function subMonths(uint256 timestamp, uint256 _months)
internal
pure
returns (uint256 newTimestamp)
{
(uint256 year, uint256 month, uint256 day) = _daysToDate(
timestamp / SECONDS_PER_DAY
);
uint256 yearMonth = year * 12 + (month - 1) - _months;
year = yearMonth / 12;
month = (yearMonth % 12) + 1;
uint256 daysInMonth = _getDaysInMonth(year, month);
if (day > daysInMonth) {
day = daysInMonth;
}
newTimestamp =
_daysFromDate(year, month, day) *
SECONDS_PER_DAY +
(timestamp % SECONDS_PER_DAY);
require(newTimestamp <= timestamp);
}
function subDays(uint256 timestamp, uint256 _days)
internal
pure
returns (uint256 newTimestamp)
{
newTimestamp = timestamp - _days * SECONDS_PER_DAY;
require(newTimestamp <= timestamp);
}
function subHours(uint256 timestamp, uint256 _hours)
internal
pure
returns (uint256 newTimestamp)
{
newTimestamp = timestamp - _hours * SECONDS_PER_HOUR;
require(newTimestamp <= timestamp);
}
function subMinutes(uint256 timestamp, uint256 _minutes)
internal
pure
returns (uint256 newTimestamp)
{
newTimestamp = timestamp - _minutes * SECONDS_PER_MINUTE;
require(newTimestamp <= timestamp);
}
function subSeconds(uint256 timestamp, uint256 _seconds)
internal
pure
returns (uint256 newTimestamp)
{
newTimestamp = timestamp - _seconds;
require(newTimestamp <= timestamp);
}
function diffYears(uint256 fromTimestamp, uint256 toTimestamp)
internal
pure
returns (uint256 _years)
{
require(fromTimestamp <= toTimestamp);
(uint256 fromYear, , ) = _daysToDate(fromTimestamp / SECONDS_PER_DAY);
(uint256 toYear, , ) = _daysToDate(toTimestamp / SECONDS_PER_DAY);
_years = toYear - fromYear;
}
function diffMonths(uint256 fromTimestamp, uint256 toTimestamp)
internal
pure
returns (uint256 _months)
{
require(fromTimestamp <= toTimestamp);
(uint256 fromYear, uint256 fromMonth, ) = _daysToDate(
fromTimestamp / SECONDS_PER_DAY
);
(uint256 toYear, uint256 toMonth, ) = _daysToDate(
toTimestamp / SECONDS_PER_DAY
);
_months = toYear * 12 + toMonth - fromYear * 12 - fromMonth;
}
function diffDays(uint256 fromTimestamp, uint256 toTimestamp)
internal
pure
returns (uint256 _days)
{
require(fromTimestamp <= toTimestamp);
_days = (toTimestamp - fromTimestamp) / SECONDS_PER_DAY;
}
function diffHours(uint256 fromTimestamp, uint256 toTimestamp)
internal
pure
returns (uint256 _hours)
{
require(fromTimestamp <= toTimestamp);
_hours = (toTimestamp - fromTimestamp) / SECONDS_PER_HOUR;
}
function diffMinutes(uint256 fromTimestamp, uint256 toTimestamp)
internal
pure
returns (uint256 _minutes)
{
require(fromTimestamp <= toTimestamp);
_minutes = (toTimestamp - fromTimestamp) / SECONDS_PER_MINUTE;
}
function diffSeconds(uint256 fromTimestamp, uint256 toTimestamp)
internal
pure
returns (uint256 _seconds)
{
require(fromTimestamp <= toTimestamp);
_seconds = toTimestamp - fromTimestamp;
}
}// 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 (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: MIT
// OpenZeppelin Contracts v4.4.1 (token/ERC1155/IERC1155Receiver.sol)
pragma solidity ^0.8.0;
import "../../utils/introspection/IERC165.sol";
/**
* @dev _Available since v3.1._
*/
interface IERC1155Receiver is IERC165 {
/**
@dev Handles the receipt of a single ERC1155 token type. This function is
called at the end of a `safeTransferFrom` after the balance has been updated.
To accept the transfer, this must return
`bytes4(keccak256("onERC1155Received(address,address,uint256,uint256,bytes)"))`
(i.e. 0xf23a6e61, or its own function selector).
@param operator The address which initiated the transfer (i.e. msg.sender)
@param from The address which previously owned the token
@param id The ID of the token being transferred
@param value The amount of tokens being transferred
@param data Additional data with no specified format
@return `bytes4(keccak256("onERC1155Received(address,address,uint256,uint256,bytes)"))` if transfer is allowed
*/
function onERC1155Received(
address operator,
address from,
uint256 id,
uint256 value,
bytes calldata data
) external returns (bytes4);
/**
@dev Handles the receipt of a multiple ERC1155 token types. This function
is called at the end of a `safeBatchTransferFrom` after the balances have
been updated. To accept the transfer(s), this must return
`bytes4(keccak256("onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)"))`
(i.e. 0xbc197c81, or its own function selector).
@param operator The address which initiated the batch transfer (i.e. msg.sender)
@param from The address which previously owned the token
@param ids An array containing ids of each token being transferred (order and length must match values array)
@param values An array containing amounts of each token being transferred (order and length must match ids array)
@param data Additional data with no specified format
@return `bytes4(keccak256("onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)"))` if transfer is allowed
*/
function onERC1155BatchReceived(
address operator,
address from,
uint256[] calldata ids,
uint256[] calldata values,
bytes calldata data
) external returns (bytes4);
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (utils/introspection/ERC165.sol)
pragma solidity ^0.8.0;
import "./IERC165.sol";
/**
* @dev Implementation of the {IERC165} interface.
*
* Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check
* for the additional interface id that will be supported. For example:
*
* ```solidity
* function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
* return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId);
* }
* ```
*
* Alternatively, {ERC165Storage} provides an easier to use but more expensive implementation.
*/
abstract contract ERC165 is IERC165 {
/**
* @dev See {IERC165-supportsInterface}.
*/
function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
return interfaceId == type(IERC165).interfaceId;
}
}{
"optimizer": {
"enabled": false,
"runs": 200
},
"outputSelection": {
"*": {
"*": [
"evm.bytecode",
"evm.deployedBytecode",
"devdoc",
"userdoc",
"metadata",
"abi"
]
}
},
"libraries": {}
}Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
Contract ABI
API[{"inputs":[{"internalType":"address","name":"tokenAddress","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"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"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"tokenAddress","type":"address"},{"indexed":false,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"RewardTokenSet","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"TokensWithdrawnFromContract","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"by","type":"address"},{"indexed":false,"internalType":"uint256","name":"monthsClaimed","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"VestedTokensClaimed","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"totalMonths","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"tokensPerMonth","type":"uint256"}],"name":"VestingTokensGranted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"}],"name":"VestingTokensRevoked","type":"event"},{"inputs":[],"name":"claimTokens","outputs":[{"internalType":"uint256","name":"tokensToClaim","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"getToken","outputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"addr","type":"address"}],"name":"getVestingSchedule","outputs":[{"internalType":"uint256","name":"timestamp","type":"uint256"},{"internalType":"uint16","name":"monthsRemaining","type":"uint16"},{"internalType":"uint32","name":"tokensPerMonth","type":"uint32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"toGrant","type":"address"},{"internalType":"uint16","name":"numberOfMonths","type":"uint16"},{"internalType":"uint32","name":"tokensPerMonth","type":"uint32"}],"name":"grantVestingTokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"address","name":"from","type":"address"},{"internalType":"uint256[]","name":"ids","type":"uint256[]"},{"internalType":"uint256[]","name":"values","type":"uint256[]"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"onERC1155BatchReceived","outputs":[{"internalType":"bytes4","name":"","type":"bytes4"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"address","name":"from","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"uint256","name":"value","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"onERC1155Received","outputs":[{"internalType":"bytes4","name":"","type":"bytes4"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"revokeAddress","type":"address"}],"name":"revokeVestingTokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"tokenAddress","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"}],"name":"setToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"count","type":"uint256"}],"name":"withdrawTokens","outputs":[],"stateMutability":"nonpayable","type":"function"}]Contract Creation Code
60806040523480156200001157600080fd5b5060405162002522380380620025228339818101604052810190620000379190620001a1565b620000576200004b620000a760201b60201c565b620000af60201b60201c565b81600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508060028190555050506200025f565b600033905090565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b60008151905062000184816200022b565b92915050565b6000815190506200019b8162000245565b92915050565b60008060408385031215620001bb57620001ba62000226565b5b6000620001cb8582860162000173565b9250506020620001de858286016200018a565b9150509250929050565b6000620001f582620001fc565b9050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600080fd5b6200023681620001e8565b81146200024257600080fd5b50565b62000250816200021c565b81146200025c57600080fd5b50565b6122b3806200026f6000396000f3fe608060405234801561001057600080fd5b50600436106100cf5760003560e01c80638da5cb5b1161008c578063bc197c8111610066578063bc197c81146101ef578063f23a6e611461021f578063f2fde38b1461024f578063ff44d2d51461026b576100cf565b80638da5cb5b146101835780639f829063146101a1578063b25a0436146101d3576100cf565b806301ffc9a7146100d457806321df0da714610104578063315a095d1461012357806348c54b9d1461013f578063715018a61461015d57806378bf2b5314610167575b600080fd5b6100ee60048036038101906100e99190611780565b610287565b6040516100fb9190611a38565b60405180910390f35b61010c610301565b60405161011a929190611a0f565b60405180910390f35b61013d600480360381019061013891906117ad565b610332565b005b610147610584565b6040516101549190611b22565b60405180910390f35b61016561095c565b005b610181600480360381019061017c9190611740565b6109e4565b005b61018b610ae5565b6040516101989190611944565b60405180910390f35b6101bb60048036038101906101b6919061154a565b610b0e565b6040516101ca93929190611b3d565b60405180910390f35b6101ed60048036038101906101e891906116ed565b610b90565b005b61020960048036038101906102049190611577565b610dc5565b6040516102169190611a53565b60405180910390f35b61023960048036038101906102349190611653565b610df6565b6040516102469190611a53565b60405180910390f35b6102696004803603810190610264919061154a565b610e25565b005b6102856004803603810190610280919061154a565b610f1d565b005b60007f4e2312e0000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806102fa57506102f98261109f565b5b9050919050565b600080600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600254915091509091565b61033a611109565b73ffffffffffffffffffffffffffffffffffffffff16610358610ae5565b73ffffffffffffffffffffffffffffffffffffffff16146103ae576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016103a590611ab0565b60405180910390fd5b6000600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050818173ffffffffffffffffffffffffffffffffffffffff1662fdd58e306002546040518363ffffffff1660e01b8152600401610412929190611a0f565b60206040518083038186803b15801561042a57600080fd5b505afa15801561043e573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061046291906117da565b101560405180606001604052806032815260200161224c60329139906104be576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016104b59190611a6e565b60405180910390fd5b508073ffffffffffffffffffffffffffffffffffffffff1663f242432a3033600254866040518563ffffffff1660e01b8152600401610500949392919061195f565b600060405180830381600087803b15801561051a57600080fd5b505af115801561052e573d6000803e3d6000fd5b505050503373ffffffffffffffffffffffffffffffffffffffff167fc7e0e250f8197642ea6e80d30271909724cd6266bbe3bd7d1b2d4f4ed4fddf25836040516105789190611b22565b60405180910390a25050565b600080600360003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002090506000610616600360003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000015442611111565b9050600061063a8360010160009054906101000a900461ffff1661ffff16836111a4565b905060008161ffff1614156106555760009350505050610959565b8061ffff168360010160029054906101000a900463ffffffff1663ffffffff1661067f9190611e3d565b93506000600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050848173ffffffffffffffffffffffffffffffffffffffff1662fdd58e306002546040518363ffffffff1660e01b81526004016106e5929190611a0f565b60206040518083038186803b1580156106fd57600080fd5b505afa158015610711573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061073591906117da565b101560405180606001604052806032815260200161224c6032913990610791576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107889190611a6e565b60405180910390fd5b5042600360003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000018190555081600360003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010160009054906101000a900461ffff166108359190611f2b565b600360003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010160006101000a81548161ffff021916908361ffff1602179055508073ffffffffffffffffffffffffffffffffffffffff1663f242432a3033600254896040518563ffffffff1660e01b81526004016108d294939291906119b7565b600060405180830381600087803b1580156108ec57600080fd5b505af1158015610900573d6000803e3d6000fd5b505050503373ffffffffffffffffffffffffffffffffffffffff167f6c4474f5353aa538dd7698fa19be2149fc1d9fee5ab8a6af3de07ca84b7f28c7838760405161094c929190611ad0565b60405180910390a2505050505b90565b610964611109565b73ffffffffffffffffffffffffffffffffffffffff16610982610ae5565b73ffffffffffffffffffffffffffffffffffffffff16146109d8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109cf90611ab0565b60405180910390fd5b6109e260006111bd565b565b6109ec611109565b73ffffffffffffffffffffffffffffffffffffffff16610a0a610ae5565b73ffffffffffffffffffffffffffffffffffffffff1614610a60576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a5790611ab0565b60405180910390fd5b81600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550806002819055507f699da1ad32a331acc89644abfd5a2d9960170bd81cde59bda93fe7f53d3c1f318282604051610ad9929190611a0f565b60405180910390a15050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b600080600080600360008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020905080600001548160010160009054906101000a900461ffff168260010160029054906101000a900463ffffffff16935093509350509193909250565b610b98611109565b73ffffffffffffffffffffffffffffffffffffffff16610bb6610ae5565b73ffffffffffffffffffffffffffffffffffffffff1614610c0c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c0390611ab0565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156040518060400160405280601681526020017f696e76616c696420696e7075742070726f76696465640000000000000000000081525090610cb4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cab9190611a6e565b60405180910390fd5b5060405180606001604052804281526020018361ffff1681526020018263ffffffff16815250600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000820151816000015560208201518160010160006101000a81548161ffff021916908361ffff16021790555060408201518160010160026101000a81548163ffffffff021916908363ffffffff1602179055509050508273ffffffffffffffffffffffffffffffffffffffff167fd4d6d82bf6e034534952089abb98bc3e058454f1219d797ae62275271a8eedc48383604051610db8929190611af9565b60405180910390a2505050565b60007ff23a6e612e1ff4830e658fe43f4e3cb4a5f8170bd5d9e69fb5d7a7fa9e4fdf97905098975050505050505050565b60007ff23a6e612e1ff4830e658fe43f4e3cb4a5f8170bd5d9e69fb5d7a7fa9e4fdf9790509695505050505050565b610e2d611109565b73ffffffffffffffffffffffffffffffffffffffff16610e4b610ae5565b73ffffffffffffffffffffffffffffffffffffffff1614610ea1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e9890611ab0565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415610f11576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f0890611a90565b60405180910390fd5b610f1a816111bd565b50565b610f25611109565b73ffffffffffffffffffffffffffffffffffffffff16610f43610ae5565b73ffffffffffffffffffffffffffffffffffffffff1614610f99576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f9090611ab0565b60405180910390fd5b6000600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010160026101000a81548163ffffffff021916908363ffffffff1602179055506000600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010160006101000a81548161ffff021916908361ffff1602179055508073ffffffffffffffffffffffffffffffffffffffff167ffc7554584290e326e8b3ebbc5464271d706c6622b3cc65912952c229fb5bd31b60405160405180910390a250565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b600033905090565b60008183111561112057600080fd5b60008061113a62015180866111359190611cf5565b611281565b509150915060008061115962015180876111549190611cf5565b611281565b509150915082600c8561116c9190611e3d565b82600c8561117a9190611e3d565b6111849190611c35565b61118e9190611f5f565b6111989190611f5f565b94505050505092915050565b60008183106111b357816111b5565b825b905092915050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600080600080849050600062253d8c62010bd98361129f9190611ba1565b6112a99190611ba1565b9050600062023ab18260046112be9190611d26565b6112c89190611c8b565b9050600460038262023ab16112dd9190611d26565b6112e79190611ba1565b6112f19190611c8b565b826112fc9190611e97565b9150600062164b096001846113119190611ba1565b610fa061131e9190611d26565b6113289190611c8b565b9050601f6004826105b561133c9190611d26565b6113469190611c8b565b846113519190611e97565b61135b9190611ba1565b9250600061098f84605061136f9190611d26565b6113799190611c8b565b9050600060508261098f61138d9190611d26565b6113979190611c8b565b856113a29190611e97565b9050600b826113b19190611c8b565b945084600c6113c09190611d26565b6002836113cd9190611ba1565b6113d79190611e97565b915084836031866113e89190611e97565b60646113f49190611d26565b6113fe9190611ba1565b6114089190611ba1565b92508298508197508096505050505050509193909250565b60008135905061142f816121d8565b92915050565b60008083601f84011261144b5761144a6120e9565b5b8235905067ffffffffffffffff811115611468576114676120e4565b5b602083019150836020820283011115611484576114836120ee565b5b9250929050565b60008135905061149a816121ef565b92915050565b60008083601f8401126114b6576114b56120e9565b5b8235905067ffffffffffffffff8111156114d3576114d26120e4565b5b6020830191508360018202830111156114ef576114ee6120ee565b5b9250929050565b60008135905061150581612206565b92915050565b60008135905061151a8161221d565b92915050565b60008151905061152f8161221d565b92915050565b60008135905061154481612234565b92915050565b6000602082840312156115605761155f6120f8565b5b600061156e84828501611420565b91505092915050565b60008060008060008060008060a0898b031215611597576115966120f8565b5b60006115a58b828c01611420565b98505060206115b68b828c01611420565b975050604089013567ffffffffffffffff8111156115d7576115d66120f3565b5b6115e38b828c01611435565b9650965050606089013567ffffffffffffffff811115611606576116056120f3565b5b6116128b828c01611435565b9450945050608089013567ffffffffffffffff811115611635576116346120f3565b5b6116418b828c016114a0565b92509250509295985092959890939650565b60008060008060008060a087890312156116705761166f6120f8565b5b600061167e89828a01611420565b965050602061168f89828a01611420565b95505060406116a089828a0161150b565b94505060606116b189828a0161150b565b935050608087013567ffffffffffffffff8111156116d2576116d16120f3565b5b6116de89828a016114a0565b92509250509295509295509295565b600080600060608486031215611706576117056120f8565b5b600061171486828701611420565b9350506020611725868287016114f6565b925050604061173686828701611535565b9150509250925092565b60008060408385031215611757576117566120f8565b5b600061176585828601611420565b92505060206117768582860161150b565b9150509250929050565b600060208284031215611796576117956120f8565b5b60006117a48482850161148b565b91505092915050565b6000602082840312156117c3576117c26120f8565b5b60006117d18482850161150b565b91505092915050565b6000602082840312156117f0576117ef6120f8565b5b60006117fe84828501611520565b91505092915050565b61181081611f93565b82525050565b61181f81611fa5565b82525050565b61182e81611fb1565b82525050565b600061183f82611b74565b6118498185611b90565b9350611859818560208601612053565b611862816120fd565b840191505092915050565b600061187a601283611b7f565b91506118858261210e565b602082019050919050565b600061189d602683611b90565b91506118a882612137565b604082019050919050565b60006118c0602083611b90565b91506118cb82612186565b602082019050919050565b60006118e3601683611b7f565b91506118ee826121af565b602082019050919050565b61190281611fe7565b82525050565b6119118161202f565b82525050565b61192081612015565b82525050565b61192f81612041565b82525050565b61193e8161201f565b82525050565b60006020820190506119596000830184611807565b92915050565b600060a0820190506119746000830187611807565b6119816020830186611807565b61198e6040830185611917565b61199b6060830184611917565b81810360808301526119ac8161186d565b905095945050505050565b600060a0820190506119cc6000830187611807565b6119d96020830186611807565b6119e66040830185611917565b6119f36060830184611917565b8181036080830152611a04816118d6565b905095945050505050565b6000604082019050611a246000830185611807565b611a316020830184611917565b9392505050565b6000602082019050611a4d6000830184611816565b92915050565b6000602082019050611a686000830184611825565b92915050565b60006020820190508181036000830152611a888184611834565b905092915050565b60006020820190508181036000830152611aa981611890565b9050919050565b60006020820190508181036000830152611ac9816118b3565b9050919050565b6000604082019050611ae56000830185611908565b611af26020830184611917565b9392505050565b6000604082019050611b0e6000830185611908565b611b1b6020830184611926565b9392505050565b6000602082019050611b376000830184611917565b92915050565b6000606082019050611b526000830186611917565b611b5f60208301856118f9565b611b6c6040830184611935565b949350505050565b600081519050919050565b600082825260208201905092915050565b600082825260208201905092915050565b6000611bac82611fdd565b9150611bb783611fdd565b9250817f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03831360008312151615611bf257611bf1612086565b5b817f8000000000000000000000000000000000000000000000000000000000000000038312600083121615611c2a57611c29612086565b5b828201905092915050565b6000611c4082612015565b9150611c4b83612015565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115611c8057611c7f612086565b5b828201905092915050565b6000611c9682611fdd565b9150611ca183611fdd565b925082611cb157611cb06120b5565b5b600160000383147f800000000000000000000000000000000000000000000000000000000000000083141615611cea57611ce9612086565b5b828205905092915050565b6000611d0082612015565b9150611d0b83612015565b925082611d1b57611d1a6120b5565b5b828204905092915050565b6000611d3182611fdd565b9150611d3c83611fdd565b9250827f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0482116000841360008413161615611d7b57611d7a612086565b5b817f80000000000000000000000000000000000000000000000000000000000000000583126000841260008413161615611db857611db7612086565b5b827f80000000000000000000000000000000000000000000000000000000000000000582126000841360008412161615611df557611df4612086565b5b827f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0582126000841260008412161615611e3257611e31612086565b5b828202905092915050565b6000611e4882612015565b9150611e5383612015565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615611e8c57611e8b612086565b5b828202905092915050565b6000611ea282611fdd565b9150611ead83611fdd565b9250827f800000000000000000000000000000000000000000000000000000000000000001821260008412151615611ee857611ee7612086565b5b827f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff018213600084121615611f2057611f1f612086565b5b828203905092915050565b6000611f3682611fe7565b9150611f4183611fe7565b925082821015611f5457611f53612086565b5b828203905092915050565b6000611f6a82612015565b9150611f7583612015565b925082821015611f8857611f87612086565b5b828203905092915050565b6000611f9e82611ff5565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b6000819050919050565b600061ffff82169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600063ffffffff82169050919050565b600061203a82611fe7565b9050919050565b600061204c8261201f565b9050919050565b60005b83811015612071578082015181840152602081019050612056565b83811115612080576000848401525b50505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f5769746864726177696e6720746f6b656e730000000000000000000000000000600082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f436c61696d696e672076657374656420746f6b656e7300000000000000000000600082015250565b6121e181611f93565b81146121ec57600080fd5b50565b6121f881611fb1565b811461220357600080fd5b50565b61220f81611fe7565b811461221a57600080fd5b50565b61222681612015565b811461223157600080fd5b50565b61223d8161201f565b811461224857600080fd5b5056fe636f6e747261637420646f6573206e6f74206861766520656e6f75676820746f6b656e7320746f2064697374726962757465a26469706673582212207fa76aef702a293d25d25b68f7acf0f5ff5d5612ea7429e0d04b1bc924436f1d64736f6c634300080600330000000000000000000000007eef591a6cc0403b9652e98e88476fe1bf31ddeb000000000000000000000000000000000000000000000000000000000000002a
Deployed Bytecode
0x608060405234801561001057600080fd5b50600436106100cf5760003560e01c80638da5cb5b1161008c578063bc197c8111610066578063bc197c81146101ef578063f23a6e611461021f578063f2fde38b1461024f578063ff44d2d51461026b576100cf565b80638da5cb5b146101835780639f829063146101a1578063b25a0436146101d3576100cf565b806301ffc9a7146100d457806321df0da714610104578063315a095d1461012357806348c54b9d1461013f578063715018a61461015d57806378bf2b5314610167575b600080fd5b6100ee60048036038101906100e99190611780565b610287565b6040516100fb9190611a38565b60405180910390f35b61010c610301565b60405161011a929190611a0f565b60405180910390f35b61013d600480360381019061013891906117ad565b610332565b005b610147610584565b6040516101549190611b22565b60405180910390f35b61016561095c565b005b610181600480360381019061017c9190611740565b6109e4565b005b61018b610ae5565b6040516101989190611944565b60405180910390f35b6101bb60048036038101906101b6919061154a565b610b0e565b6040516101ca93929190611b3d565b60405180910390f35b6101ed60048036038101906101e891906116ed565b610b90565b005b61020960048036038101906102049190611577565b610dc5565b6040516102169190611a53565b60405180910390f35b61023960048036038101906102349190611653565b610df6565b6040516102469190611a53565b60405180910390f35b6102696004803603810190610264919061154a565b610e25565b005b6102856004803603810190610280919061154a565b610f1d565b005b60007f4e2312e0000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806102fa57506102f98261109f565b5b9050919050565b600080600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600254915091509091565b61033a611109565b73ffffffffffffffffffffffffffffffffffffffff16610358610ae5565b73ffffffffffffffffffffffffffffffffffffffff16146103ae576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016103a590611ab0565b60405180910390fd5b6000600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050818173ffffffffffffffffffffffffffffffffffffffff1662fdd58e306002546040518363ffffffff1660e01b8152600401610412929190611a0f565b60206040518083038186803b15801561042a57600080fd5b505afa15801561043e573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061046291906117da565b101560405180606001604052806032815260200161224c60329139906104be576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016104b59190611a6e565b60405180910390fd5b508073ffffffffffffffffffffffffffffffffffffffff1663f242432a3033600254866040518563ffffffff1660e01b8152600401610500949392919061195f565b600060405180830381600087803b15801561051a57600080fd5b505af115801561052e573d6000803e3d6000fd5b505050503373ffffffffffffffffffffffffffffffffffffffff167fc7e0e250f8197642ea6e80d30271909724cd6266bbe3bd7d1b2d4f4ed4fddf25836040516105789190611b22565b60405180910390a25050565b600080600360003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002090506000610616600360003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000015442611111565b9050600061063a8360010160009054906101000a900461ffff1661ffff16836111a4565b905060008161ffff1614156106555760009350505050610959565b8061ffff168360010160029054906101000a900463ffffffff1663ffffffff1661067f9190611e3d565b93506000600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050848173ffffffffffffffffffffffffffffffffffffffff1662fdd58e306002546040518363ffffffff1660e01b81526004016106e5929190611a0f565b60206040518083038186803b1580156106fd57600080fd5b505afa158015610711573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061073591906117da565b101560405180606001604052806032815260200161224c6032913990610791576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107889190611a6e565b60405180910390fd5b5042600360003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000018190555081600360003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010160009054906101000a900461ffff166108359190611f2b565b600360003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010160006101000a81548161ffff021916908361ffff1602179055508073ffffffffffffffffffffffffffffffffffffffff1663f242432a3033600254896040518563ffffffff1660e01b81526004016108d294939291906119b7565b600060405180830381600087803b1580156108ec57600080fd5b505af1158015610900573d6000803e3d6000fd5b505050503373ffffffffffffffffffffffffffffffffffffffff167f6c4474f5353aa538dd7698fa19be2149fc1d9fee5ab8a6af3de07ca84b7f28c7838760405161094c929190611ad0565b60405180910390a2505050505b90565b610964611109565b73ffffffffffffffffffffffffffffffffffffffff16610982610ae5565b73ffffffffffffffffffffffffffffffffffffffff16146109d8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109cf90611ab0565b60405180910390fd5b6109e260006111bd565b565b6109ec611109565b73ffffffffffffffffffffffffffffffffffffffff16610a0a610ae5565b73ffffffffffffffffffffffffffffffffffffffff1614610a60576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a5790611ab0565b60405180910390fd5b81600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550806002819055507f699da1ad32a331acc89644abfd5a2d9960170bd81cde59bda93fe7f53d3c1f318282604051610ad9929190611a0f565b60405180910390a15050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b600080600080600360008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020905080600001548160010160009054906101000a900461ffff168260010160029054906101000a900463ffffffff16935093509350509193909250565b610b98611109565b73ffffffffffffffffffffffffffffffffffffffff16610bb6610ae5565b73ffffffffffffffffffffffffffffffffffffffff1614610c0c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c0390611ab0565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156040518060400160405280601681526020017f696e76616c696420696e7075742070726f76696465640000000000000000000081525090610cb4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cab9190611a6e565b60405180910390fd5b5060405180606001604052804281526020018361ffff1681526020018263ffffffff16815250600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000820151816000015560208201518160010160006101000a81548161ffff021916908361ffff16021790555060408201518160010160026101000a81548163ffffffff021916908363ffffffff1602179055509050508273ffffffffffffffffffffffffffffffffffffffff167fd4d6d82bf6e034534952089abb98bc3e058454f1219d797ae62275271a8eedc48383604051610db8929190611af9565b60405180910390a2505050565b60007ff23a6e612e1ff4830e658fe43f4e3cb4a5f8170bd5d9e69fb5d7a7fa9e4fdf97905098975050505050505050565b60007ff23a6e612e1ff4830e658fe43f4e3cb4a5f8170bd5d9e69fb5d7a7fa9e4fdf9790509695505050505050565b610e2d611109565b73ffffffffffffffffffffffffffffffffffffffff16610e4b610ae5565b73ffffffffffffffffffffffffffffffffffffffff1614610ea1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e9890611ab0565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415610f11576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f0890611a90565b60405180910390fd5b610f1a816111bd565b50565b610f25611109565b73ffffffffffffffffffffffffffffffffffffffff16610f43610ae5565b73ffffffffffffffffffffffffffffffffffffffff1614610f99576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f9090611ab0565b60405180910390fd5b6000600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010160026101000a81548163ffffffff021916908363ffffffff1602179055506000600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010160006101000a81548161ffff021916908361ffff1602179055508073ffffffffffffffffffffffffffffffffffffffff167ffc7554584290e326e8b3ebbc5464271d706c6622b3cc65912952c229fb5bd31b60405160405180910390a250565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b600033905090565b60008183111561112057600080fd5b60008061113a62015180866111359190611cf5565b611281565b509150915060008061115962015180876111549190611cf5565b611281565b509150915082600c8561116c9190611e3d565b82600c8561117a9190611e3d565b6111849190611c35565b61118e9190611f5f565b6111989190611f5f565b94505050505092915050565b60008183106111b357816111b5565b825b905092915050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600080600080849050600062253d8c62010bd98361129f9190611ba1565b6112a99190611ba1565b9050600062023ab18260046112be9190611d26565b6112c89190611c8b565b9050600460038262023ab16112dd9190611d26565b6112e79190611ba1565b6112f19190611c8b565b826112fc9190611e97565b9150600062164b096001846113119190611ba1565b610fa061131e9190611d26565b6113289190611c8b565b9050601f6004826105b561133c9190611d26565b6113469190611c8b565b846113519190611e97565b61135b9190611ba1565b9250600061098f84605061136f9190611d26565b6113799190611c8b565b9050600060508261098f61138d9190611d26565b6113979190611c8b565b856113a29190611e97565b9050600b826113b19190611c8b565b945084600c6113c09190611d26565b6002836113cd9190611ba1565b6113d79190611e97565b915084836031866113e89190611e97565b60646113f49190611d26565b6113fe9190611ba1565b6114089190611ba1565b92508298508197508096505050505050509193909250565b60008135905061142f816121d8565b92915050565b60008083601f84011261144b5761144a6120e9565b5b8235905067ffffffffffffffff811115611468576114676120e4565b5b602083019150836020820283011115611484576114836120ee565b5b9250929050565b60008135905061149a816121ef565b92915050565b60008083601f8401126114b6576114b56120e9565b5b8235905067ffffffffffffffff8111156114d3576114d26120e4565b5b6020830191508360018202830111156114ef576114ee6120ee565b5b9250929050565b60008135905061150581612206565b92915050565b60008135905061151a8161221d565b92915050565b60008151905061152f8161221d565b92915050565b60008135905061154481612234565b92915050565b6000602082840312156115605761155f6120f8565b5b600061156e84828501611420565b91505092915050565b60008060008060008060008060a0898b031215611597576115966120f8565b5b60006115a58b828c01611420565b98505060206115b68b828c01611420565b975050604089013567ffffffffffffffff8111156115d7576115d66120f3565b5b6115e38b828c01611435565b9650965050606089013567ffffffffffffffff811115611606576116056120f3565b5b6116128b828c01611435565b9450945050608089013567ffffffffffffffff811115611635576116346120f3565b5b6116418b828c016114a0565b92509250509295985092959890939650565b60008060008060008060a087890312156116705761166f6120f8565b5b600061167e89828a01611420565b965050602061168f89828a01611420565b95505060406116a089828a0161150b565b94505060606116b189828a0161150b565b935050608087013567ffffffffffffffff8111156116d2576116d16120f3565b5b6116de89828a016114a0565b92509250509295509295509295565b600080600060608486031215611706576117056120f8565b5b600061171486828701611420565b9350506020611725868287016114f6565b925050604061173686828701611535565b9150509250925092565b60008060408385031215611757576117566120f8565b5b600061176585828601611420565b92505060206117768582860161150b565b9150509250929050565b600060208284031215611796576117956120f8565b5b60006117a48482850161148b565b91505092915050565b6000602082840312156117c3576117c26120f8565b5b60006117d18482850161150b565b91505092915050565b6000602082840312156117f0576117ef6120f8565b5b60006117fe84828501611520565b91505092915050565b61181081611f93565b82525050565b61181f81611fa5565b82525050565b61182e81611fb1565b82525050565b600061183f82611b74565b6118498185611b90565b9350611859818560208601612053565b611862816120fd565b840191505092915050565b600061187a601283611b7f565b91506118858261210e565b602082019050919050565b600061189d602683611b90565b91506118a882612137565b604082019050919050565b60006118c0602083611b90565b91506118cb82612186565b602082019050919050565b60006118e3601683611b7f565b91506118ee826121af565b602082019050919050565b61190281611fe7565b82525050565b6119118161202f565b82525050565b61192081612015565b82525050565b61192f81612041565b82525050565b61193e8161201f565b82525050565b60006020820190506119596000830184611807565b92915050565b600060a0820190506119746000830187611807565b6119816020830186611807565b61198e6040830185611917565b61199b6060830184611917565b81810360808301526119ac8161186d565b905095945050505050565b600060a0820190506119cc6000830187611807565b6119d96020830186611807565b6119e66040830185611917565b6119f36060830184611917565b8181036080830152611a04816118d6565b905095945050505050565b6000604082019050611a246000830185611807565b611a316020830184611917565b9392505050565b6000602082019050611a4d6000830184611816565b92915050565b6000602082019050611a686000830184611825565b92915050565b60006020820190508181036000830152611a888184611834565b905092915050565b60006020820190508181036000830152611aa981611890565b9050919050565b60006020820190508181036000830152611ac9816118b3565b9050919050565b6000604082019050611ae56000830185611908565b611af26020830184611917565b9392505050565b6000604082019050611b0e6000830185611908565b611b1b6020830184611926565b9392505050565b6000602082019050611b376000830184611917565b92915050565b6000606082019050611b526000830186611917565b611b5f60208301856118f9565b611b6c6040830184611935565b949350505050565b600081519050919050565b600082825260208201905092915050565b600082825260208201905092915050565b6000611bac82611fdd565b9150611bb783611fdd565b9250817f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03831360008312151615611bf257611bf1612086565b5b817f8000000000000000000000000000000000000000000000000000000000000000038312600083121615611c2a57611c29612086565b5b828201905092915050565b6000611c4082612015565b9150611c4b83612015565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115611c8057611c7f612086565b5b828201905092915050565b6000611c9682611fdd565b9150611ca183611fdd565b925082611cb157611cb06120b5565b5b600160000383147f800000000000000000000000000000000000000000000000000000000000000083141615611cea57611ce9612086565b5b828205905092915050565b6000611d0082612015565b9150611d0b83612015565b925082611d1b57611d1a6120b5565b5b828204905092915050565b6000611d3182611fdd565b9150611d3c83611fdd565b9250827f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0482116000841360008413161615611d7b57611d7a612086565b5b817f80000000000000000000000000000000000000000000000000000000000000000583126000841260008413161615611db857611db7612086565b5b827f80000000000000000000000000000000000000000000000000000000000000000582126000841360008412161615611df557611df4612086565b5b827f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0582126000841260008412161615611e3257611e31612086565b5b828202905092915050565b6000611e4882612015565b9150611e5383612015565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615611e8c57611e8b612086565b5b828202905092915050565b6000611ea282611fdd565b9150611ead83611fdd565b9250827f800000000000000000000000000000000000000000000000000000000000000001821260008412151615611ee857611ee7612086565b5b827f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff018213600084121615611f2057611f1f612086565b5b828203905092915050565b6000611f3682611fe7565b9150611f4183611fe7565b925082821015611f5457611f53612086565b5b828203905092915050565b6000611f6a82612015565b9150611f7583612015565b925082821015611f8857611f87612086565b5b828203905092915050565b6000611f9e82611ff5565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b6000819050919050565b600061ffff82169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600063ffffffff82169050919050565b600061203a82611fe7565b9050919050565b600061204c8261201f565b9050919050565b60005b83811015612071578082015181840152602081019050612056565b83811115612080576000848401525b50505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f5769746864726177696e6720746f6b656e730000000000000000000000000000600082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f436c61696d696e672076657374656420746f6b656e7300000000000000000000600082015250565b6121e181611f93565b81146121ec57600080fd5b50565b6121f881611fb1565b811461220357600080fd5b50565b61220f81611fe7565b811461221a57600080fd5b50565b61222681612015565b811461223157600080fd5b50565b61223d8161201f565b811461224857600080fd5b5056fe636f6e747261637420646f6573206e6f74206861766520656e6f75676820746f6b656e7320746f2064697374726962757465a26469706673582212207fa76aef702a293d25d25b68f7acf0f5ff5d5612ea7429e0d04b1bc924436f1d64736f6c63430008060033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
0000000000000000000000007eef591a6cc0403b9652e98e88476fe1bf31ddeb000000000000000000000000000000000000000000000000000000000000002a
-----Decoded View---------------
Arg [0] : tokenAddress (address): 0x7EeF591A6CC0403b9652E98E88476fe1bF31dDeb
Arg [1] : tokenId (uint256): 42
-----Encoded View---------------
2 Constructor Arguments found :
Arg [0] : 0000000000000000000000007eef591a6cc0403b9652e98e88476fe1bf31ddeb
Arg [1] : 000000000000000000000000000000000000000000000000000000000000002a
Loading...
Loading
Loading...
Loading
Net Worth in USD
$0.00
Net Worth in ETH
0
Multichain Portfolio | 33 Chains
| Chain | Token | Portfolio % | Price | Amount | Value |
|---|
Loading...
Loading
Loading...
Loading
Loading...
Loading
[ 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.