Overview
ETH Balance
0 ETH
Eth Value
$0.00More Info
Private Name Tags
ContractCreator
TokenTracker
Latest 25 from a total of 47 transactions
| Transaction Hash |
Method
|
Block
|
From
|
|
To
|
||||
|---|---|---|---|---|---|---|---|---|---|
| Transfer | 11556107 | 1858 days ago | IN | 0 ETH | 0.00383437 | ||||
| Transfer | 11556107 | 1858 days ago | IN | 0 ETH | 0.0058908 | ||||
| Transfer | 11552810 | 1859 days ago | IN | 0 ETH | 0.0055999 | ||||
| Transfer | 11552764 | 1859 days ago | IN | 0 ETH | 0.00358898 | ||||
| Transfer | 11552724 | 1859 days ago | IN | 0 ETH | 0.00491974 | ||||
| Transfer | 11405350 | 1881 days ago | IN | 0 ETH | 0.0022086 | ||||
| Transfer | 11405349 | 1881 days ago | IN | 0 ETH | 0.00238319 | ||||
| Transfer | 11405293 | 1881 days ago | IN | 0 ETH | 0.00112725 | ||||
| Transfer | 10969223 | 1949 days ago | IN | 0 ETH | 0.00193987 | ||||
| Transfer | 10969222 | 1949 days ago | IN | 0 ETH | 0.00420979 | ||||
| Transfer | 10270145 | 2056 days ago | IN | 0 ETH | 0.00079087 | ||||
| Transfer | 10250982 | 2059 days ago | IN | 0 ETH | 0.0013082 | ||||
| Transfer | 10231824 | 2062 days ago | IN | 0 ETH | 0.00130863 | ||||
| Transfer | 10205740 | 2066 days ago | IN | 0 ETH | 0.00112688 | ||||
| Transfer | 10186897 | 2069 days ago | IN | 0 ETH | 0.00184863 | ||||
| Transfer | 10182371 | 2070 days ago | IN | 0 ETH | 0.00049134 | ||||
| Transfer | 10113857 | 2081 days ago | IN | 0 ETH | 0.00094575 | ||||
| Transfer | 10064894 | 2088 days ago | IN | 0 ETH | 0.00181695 | ||||
| Transfer | 10059777 | 2089 days ago | IN | 0 ETH | 0.00085242 | ||||
| Transfer | 10045716 | 2091 days ago | IN | 0 ETH | 0.00154053 | ||||
| Transfer | 10019984 | 2095 days ago | IN | 0 ETH | 0.00123242 | ||||
| Transfer | 10017912 | 2096 days ago | IN | 0 ETH | 0.00068339 | ||||
| Transfer | 10017852 | 2096 days ago | IN | 0 ETH | 0.00092923 | ||||
| Transfer | 10015021 | 2096 days ago | IN | 0 ETH | 0.00035937 | ||||
| Transfer | 10013656 | 2096 days ago | IN | 0 ETH | 0.0004275 |
View more zero value Internal Transactions in Advanced View mode
Advanced mode:
Loading...
Loading
Loading...
Loading
Cross-Chain Transactions
Loading...
Loading
Contract Name:
InverseToken
Compiler Version
v0.5.16+commit.9c3226ce
Contract Source Code (Solidity)
/**
*Submitted for verification at Etherscan.io on 2020-05-04
*/
// File: contracts/Token/Sender.sol
pragma solidity ^0.5.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 GSN 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.
*/
contract Sender {
// Empty internal constructor, to prevent people from mistakenly deploying
// an instance of this contract, which should be used via inheritance.
constructor() internal {}
// solhint-disable-previous-line no-empty-blocks
function _msgSender() internal view returns (address payable) {
return msg.sender;
}
function _msgData() internal view returns (bytes memory) {
this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691
return msg.data;
}
}
// File: @openzeppelin/contracts-ethereum-package/contracts/token/ERC20/IERC20.sol
pragma solidity ^0.5.0;
/**
* @dev Interface of the ERC20 standard as defined in the EIP. Does not include
* the optional functions; to access them see {ERC20Detailed}.
*/
interface IERC20 {
/**
* @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 `recipient`.
*
* Returns a boolean value indicating whether the operation succeeded.
*
* Emits a {Transfer} event.
*/
function transfer(address recipient, 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 `sender` to `recipient` 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 sender, address recipient, uint256 amount) external returns (bool);
/**
* @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);
}
// File: @openzeppelin/upgrades/contracts/Initializable.sol
pragma solidity >=0.4.24 <0.6.0;
/**
* @title Initializable
*
* @dev Helper contract to support initializer functions. To use it, replace
* the constructor with a function that has the `initializer` modifier.
* WARNING: Unlike constructors, initializer functions must be manually
* invoked. This applies both to deploying an Initializable contract, as well
* as extending an Initializable contract via inheritance.
* WARNING: When used with inheritance, manual care must be taken to not invoke
* a parent initializer twice, or ensure that all initializers are idempotent,
* because this is not dealt with automatically as with constructors.
*/
contract Initializable {
/**
* @dev Indicates that the contract has been initialized.
*/
bool private initialized;
/**
* @dev Indicates that the contract is in the process of being initialized.
*/
bool private initializing;
/**
* @dev Modifier to use in the initializer function of a contract.
*/
modifier initializer() {
require(initializing || isConstructor() || !initialized, "Contract instance has already been initialized");
bool isTopLevelCall = !initializing;
if (isTopLevelCall) {
initializing = true;
initialized = true;
}
_;
if (isTopLevelCall) {
initializing = false;
}
}
/// @dev Returns true if and only if the function is running in the constructor
function isConstructor() private view returns (bool) {
// extcodesize checks the size of the code stored in an address, and
// address returns the current address. Since the code is still not
// deployed when running a constructor, any checks on its code size will
// yield zero, making it an effective way to detect if a contract is
// under construction or not.
uint256 cs;
assembly { cs := extcodesize(address) }
return cs == 0;
}
// Reserved storage space to allow for layout changes in the future.
uint256[50] private ______gap;
}
// File: @openzeppelin/contracts-ethereum-package/contracts/GSN/Context.sol
pragma solidity ^0.5.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 GSN 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.
*/
contract Context is Initializable {
// Empty internal constructor, to prevent people from mistakenly deploying
// an instance of this contract, which should be used via inheritance.
constructor () internal { }
// solhint-disable-previous-line no-empty-blocks
function _msgSender() internal view returns (address payable) {
return msg.sender;
}
function _msgData() internal view returns (bytes memory) {
this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691
return msg.data;
}
}
// File: @openzeppelin/contracts-ethereum-package/contracts/ownership/Ownable.sol
pragma solidity ^0.5.0;
/**
* @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.
*
* This module is used through inheritance. It will make available the modifier
* `onlyOwner`, which can be aplied to your functions to restrict their use to
* the owner.
*/
contract Ownable is Initializable, Context {
address private _owner;
event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);
/**
* @dev Initializes the contract setting the deployer as the initial owner.
*/
function initialize(address sender) public initializer {
_owner = sender;
emit OwnershipTransferred(address(0), _owner);
}
/**
* @dev Returns the address of the current owner.
*/
function owner() public view returns (address) {
return _owner;
}
/**
* @dev Throws if called by any account other than the owner.
*/
modifier onlyOwner() {
require(isOwner(), "Ownable: caller is not the owner");
_;
}
/**
* @dev Returns true if the caller is the current owner.
*/
function isOwner() public view returns (bool) {
return _msgSender() == _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 onlyOwner {
emit OwnershipTransferred(_owner, address(0));
_owner = 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 onlyOwner {
_transferOwnership(newOwner);
}
/**
* @dev Transfers ownership of the contract to a new account (`newOwner`).
*/
function _transferOwnership(address newOwner) internal {
require(newOwner != address(0), "Ownable: new owner is the zero address");
emit OwnershipTransferred(_owner, newOwner);
_owner = newOwner;
}
uint256[50] private ______gap;
}
// File: contracts/utils/DateTimeLibrary.sol
pragma solidity ^0.5.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 DateTimeLibrary {
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 daysFromDate(uint256 year, uint256 month, uint256 day)
internal
pure
returns (uint256 daysSinceDate)
{
daysSinceDate = _daysFromDate(year, month, 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;
}
}
// File: contracts/utils/Math.sol
/// Math.sol -- mixin for inline numerical wizardry
// This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
// You should have received a copy of the GNU General Public License
// along with this program. If not, see <http://www.gnu.org/licenses/>.
pragma solidity ^0.5.0;
library DSMath {
// --- Unsigned Math ----
function add(uint x, uint y) internal pure returns (uint z) {
require((z = x + y) >= x, "ds-math-add-overflow");
}
function sub(uint x, uint y) internal pure returns (uint z) {
require((z = x - y) <= x, "ds-math-sub-underflow");
}
function mul(uint x, uint y) internal pure returns (uint z) {
require(y == 0 || (z = x * y) / y == x, "ds-math-mul-overflow");
}
function min(uint x, uint y) internal pure returns (uint z) {
return x <= y ? x : y;
}
function max(uint x, uint y) internal pure returns (uint z) {
return x >= y ? x : y;
}
function imin(int x, int y) internal pure returns (int z) {
return x <= y ? x : y;
}
function imax(int x, int y) internal pure returns (int z) {
return x >= y ? x : y;
}
// --- Precise Math ---
uint public constant WAD = 10 ** 18;
uint public constant RAY = 10 ** 27;
function wmul(uint x, uint y) internal pure returns (uint z) {
z = add(mul(x, y), WAD / 2) / WAD;
}
function rmul(uint x, uint y) internal pure returns (uint z) {
z = add(mul(x, y), RAY / 2) / RAY;
}
function wdiv(uint x, uint y) internal pure returns (uint z) {
z = add(mul(x, WAD), y / 2) / y;
}
function rdiv(uint x, uint y) internal pure returns (uint z) {
z = add(mul(x, RAY), y / 2) / y;
}
function ray(uint _wad) internal pure returns (uint) {
return mul(_wad, uint(10 ** 9));
}
// This famous algorithm is called "exponentiation by squaring"
// and calculates x^n with x as fixed-point and n as regular unsigned.
//
// It's O(log n), instead of O(n) for naive repeated multiplication.
//
// These facts are why it works:
//
// If n is even, then x^n = (x^2)^(n/2).
// If n is odd, then x^n = x * x^(n-1),
// and applying the equation for even x gives
// x^n = x * (x^2)^((n-1) / 2).
//
// Also, EVM division is flooring and
// floor[(n-1) / 2] = floor[n / 2].
//
function rpow(uint x, uint n) internal pure returns (uint z) {
z = n % 2 != 0 ? x : RAY;
for (n /= 2; n != 0; n /= 2) {
x = rmul(x, x);
if (n % 2 != 0) {
z = rmul(z, x);
}
}
}
}
// File: contracts/PersistentStorage.sol
pragma solidity ^0.5.0;
contract PersistentStorage is Ownable {
address public tokenSwapManager;
address public bridge;
bool public isPaused;
bool public isShutdown;
struct Accounting {
uint256 price;
uint256 cashPositionPerTokenUnit;
uint256 balancePerTokenUnit;
uint256 lendingFee;
}
struct Order {
string orderType;
uint256 tokensGiven;
uint256 tokensRecieved;
uint256 avgBlendedFee;
}
uint256 public lastActivityDay;
uint256 public minRebalanceAmount;
uint256 public managementFee;
uint256 public minimumMintingFee;
uint256 public minimumTrade;
uint8 public balancePrecision;
mapping(uint256 => Accounting[]) private accounting;
uint256[] public mintingFeeBracket;
mapping(uint256 => uint256) public mintingFee;
Order[] public allOrders;
mapping(address => Order[]) public orderByUser;
mapping(address => uint256) public delayedRedemptionsByUser;
event AccountingValuesSet(uint256 today);
event RebalanceValuesSet(uint256 newMinRebalanceAmount);
event ManagementFeeValuesSet(uint256 newManagementFee);
function initialize(
address ownerAddress,
uint256 _managementFee,
uint256 _minRebalanceAmount,
uint8 _balancePrecision,
uint256 _lastMintingFee,
uint256 _minimumMintingFee,
uint256 _minimumTrade
) public initializer {
initialize(ownerAddress);
managementFee = _managementFee;
minRebalanceAmount = _minRebalanceAmount;
mintingFee[~uint256(0)] = _lastMintingFee;
balancePrecision = _balancePrecision;
minimumMintingFee = _minimumMintingFee;
minimumTrade = _minimumTrade;
}
function setTokenSwapManager(address _tokenSwapManager) public onlyOwner {
require(_tokenSwapManager != address(0), "adddress must not be empty");
tokenSwapManager = _tokenSwapManager;
}
function setBridge(address _bridge) public onlyOwner {
require(_bridge != address(0), "adddress must not be empty");
bridge = _bridge;
}
function setIsPaused(bool _isPaused) public onlyOwner {
isPaused = _isPaused;
}
function shutdown() public onlyOwner {
isShutdown = true;
}
/**
* @dev Throws if called by any account other than the owner.
*/
modifier onlyOwnerOrTokenSwap() {
require(
isOwner() || _msgSender() == tokenSwapManager,
"caller is not the owner or token swap manager"
);
_;
}
modifier onlyOwnerOrBridge() {
require(
isOwner() || _msgSender() == bridge,
"caller is not the owner or bridge"
);
_;
}
function setDelayedRedemptionsByUser(
uint256 amountToRedeem,
address whitelistedAddress
) public onlyOwnerOrTokenSwap {
delayedRedemptionsByUser[whitelistedAddress] = amountToRedeem;
}
/*
* Saves order in mapping (address => Order[]) orderByUser
* overwrite == false, append to Order[]
* overwrite == true, overwrite element at orderIndex
*/
function setOrderByUser(
address whitelistedAddress,
string memory orderType,
uint256 tokensGiven,
uint256 tokensRecieved,
uint256 avgBlendedFee,
uint256 orderIndex,
bool overwrite
) public onlyOwnerOrTokenSwap() {
Order memory newOrder = Order(
orderType,
tokensGiven,
tokensRecieved,
avgBlendedFee
);
if (!overwrite) {
orderByUser[whitelistedAddress].push(newOrder);
setOrder(
orderType,
tokensGiven,
tokensRecieved,
avgBlendedFee,
orderIndex,
overwrite
);
} else {
orderByUser[whitelistedAddress][orderIndex] = newOrder;
}
}
/*
* Gets Order[] For User Address
* Return order at Index in Order[]
*/
function getOrderByUser(address whitelistedAddress, uint256 orderIndex)
public
view
returns (
string memory orderType,
uint256 tokensGiven,
uint256 tokensRecieved,
uint256 avgBlendedFee
)
{
Order storage orderAtIndex
= orderByUser[whitelistedAddress][orderIndex];
return (
orderAtIndex.orderType,
orderAtIndex.tokensGiven,
orderAtIndex.tokensRecieved,
orderAtIndex.avgBlendedFee
);
}
/*
* Save order to allOrders array
* overwrite == false, append to allOrders array
* overwrite == true, overwrite element at orderIndex
*/
function setOrder(
string memory orderType,
uint256 tokensGiven,
uint256 tokensRecieved,
uint256 avgBlendedFee,
uint256 orderIndex,
bool overwrite
) public onlyOwnerOrTokenSwap() {
Order memory newOrder = Order(
orderType,
tokensGiven,
tokensRecieved,
avgBlendedFee
);
if (!overwrite) {
allOrders.push(newOrder);
} else {
allOrders[orderIndex] = newOrder;
}
}
/*
* Get Order
*/
function getOrder(uint256 index)
public
view
returns (
string memory orderType,
uint256 tokensGiven,
uint256 tokensRecieved,
uint256 avgBlendedFee
)
{
Order storage orderAtIndex = allOrders[index];
return (
orderAtIndex.orderType,
orderAtIndex.tokensGiven,
orderAtIndex.tokensRecieved,
orderAtIndex.avgBlendedFee
);
}
// @dev Get accounting values for a specific day
// @param date format as 20200123 for 23th of January 2020
function getAccounting(uint256 date)
public
view
returns (uint256, uint256, uint256, uint256)
{
return (
accounting[date][accounting[date].length - 1].price,
accounting[date][accounting[date].length - 1]
.cashPositionPerTokenUnit,
accounting[date][accounting[date].length - 1].balancePerTokenUnit,
accounting[date][accounting[date].length - 1].lendingFee
);
}
// @dev Set accounting values for the day
function setAccounting(
uint256 _price,
uint256 _cashPositionPerTokenUnit,
uint256 _balancePerTokenUnit,
uint256 _lendingFee
) external onlyOwnerOrTokenSwap() {
(uint256 year, uint256 month, uint256 day) = DateTimeLibrary
.timestampToDate(block.timestamp);
uint256 today = year * 10000 + month * 100 + day;
accounting[today].push(
Accounting(
_price,
_cashPositionPerTokenUnit,
_balancePerTokenUnit,
_lendingFee
)
);
lastActivityDay = today;
emit AccountingValuesSet(today);
}
// @dev Set accounting values for the day
function setAccountingForLastActivityDay(
uint256 _price,
uint256 _cashPositionPerTokenUnit,
uint256 _balancePerTokenUnit,
uint256 _lendingFee
) external onlyOwnerOrTokenSwap() {
accounting[lastActivityDay].push(
Accounting(
_price,
_cashPositionPerTokenUnit,
_balancePerTokenUnit,
_lendingFee
)
);
emit AccountingValuesSet(lastActivityDay);
}
// @dev Set last rebalance information
function setMinRebalanceAmount(uint256 _minRebalanceAmount)
external
onlyOwner
{
minRebalanceAmount = _minRebalanceAmount;
emit RebalanceValuesSet(minRebalanceAmount);
}
// @dev Set last rebalance information
function setManagementFee(uint256 _managementFee) external onlyOwner {
managementFee = _managementFee;
emit ManagementFeeValuesSet(managementFee);
}
// @dev Returns price
function getPrice() public view returns (uint256 price) {
return
accounting[lastActivityDay][accounting[lastActivityDay].length - 1]
.price;
}
// @dev Returns cash position amount
function getCashPositionPerTokenUnit()
public
view
returns (uint256 amount)
{
return
accounting[lastActivityDay][accounting[lastActivityDay].length - 1]
.cashPositionPerTokenUnit;
}
// @dev Returns borrowed crypto amount
function getBalancePerTokenUnit() public view returns (uint256 amount) {
return
accounting[lastActivityDay][accounting[lastActivityDay].length - 1]
.balancePerTokenUnit;
}
// @dev Returns lending fee
function getLendingFee() public view returns (uint256 lendingRate) {
return
accounting[lastActivityDay][accounting[lastActivityDay].length - 1]
.lendingFee;
}
// @dev Sets last minting fee
function setLastMintingFee(uint256 _mintingFee) public onlyOwner {
mintingFee[~uint256(0)] = _mintingFee;
}
// @dev Adds minting fee
function addMintingFeeBracket(uint256 _mintingFeeLimit, uint256 _mintingFee)
public
onlyOwner
{
require(
mintingFeeBracket.length == 0 ||
_mintingFeeLimit >
mintingFeeBracket[mintingFeeBracket.length - 1],
"New minting fee bracket needs to be bigger then last one"
);
mintingFeeBracket.push(_mintingFeeLimit);
mintingFee[_mintingFeeLimit] = _mintingFee;
}
// @dev Deletes last minting fee
function deleteLastMintingFeeBracket() public onlyOwner {
delete mintingFee[mintingFeeBracket[mintingFeeBracket.length - 1]];
mintingFeeBracket.length--;
}
// @dev Changes minting fee
function changeMintingLimit(
uint256 _position,
uint256 _mintingFeeLimit,
uint256 _mintingFee
) public onlyOwner {
require(
_mintingFeeLimit > mintingFeeBracket[mintingFeeBracket.length - 1],
"New minting fee bracket needs to be bigger then last one"
);
if (_position != 0) {
require(
_mintingFeeLimit > mintingFeeBracket[_position - 1],
"New minting fee bracket needs to be bigger then last one"
);
}
if (_position < mintingFeeBracket.length - 1) {
require(
_mintingFeeLimit < mintingFeeBracket[_position + 1],
"New minting fee bracket needs to be smaller then next one"
);
}
mintingFeeBracket[_position] = _mintingFeeLimit;
mintingFee[_mintingFeeLimit] = _mintingFee;
}
function getMintingFee(uint256 cash) public view returns (uint256) {
// Define Start + End Index
uint256 startIndex = 0;
uint256 endIndex = mintingFeeBracket.length - 1;
uint256 middleIndex = endIndex / 2;
if (cash <= mintingFeeBracket[middleIndex]) {
endIndex = middleIndex;
} else {
startIndex = middleIndex + 1;
}
for (uint256 i = startIndex; i <= endIndex; i++) {
if (cash <= mintingFeeBracket[i]) {
return mintingFee[mintingFeeBracket[i]];
}
}
return mintingFee[~uint256(0)];
}
// @dev Sets last balance precision
function setLastPrecision(uint8 _balancePrecision) public onlyOwner {
balancePrecision = _balancePrecision;
}
// @dev Sets minimum minting fee
function setMinimumMintingFee(uint256 _minimumMintingFee) public onlyOwner {
minimumMintingFee = _minimumMintingFee;
}
// @dev Sets minimum trade value
function setMinimumTrade(uint256 _minimumTrade) public onlyOwner {
minimumTrade = _minimumTrade;
}
}
// File: contracts/Token/ERC20Detailed.sol
pragma solidity ^0.5.0;
/**
* @dev Optional functions from the ERC20 standard.
*/
contract ERC20Detailed is IERC20, Initializable, Ownable {
string private _name;
string private _symbol;
uint8 private _decimals;
PersistentStorage public _persistenStorage;
/**
* @dev Sets the values for `name`, `symbol`, and `decimals`. All three of
* these values are immutable: they can only be set once during
* construction.
*/
function initialize(
string memory name,
string memory symbol,
uint8 decimals,
address persistenStorage,
address ownerAddress
) public initializer {
initialize(ownerAddress);
_name = name;
_symbol = symbol;
_decimals = decimals;
_persistenStorage = PersistentStorage(persistenStorage);
}
/**
* @dev Returns the name of the token.
*/
function name() public view returns (string memory) {
return _name;
}
/**
* @dev Returns the symbol of the token, usually a shorter version of the
* name.
*/
function symbol() public view returns (string memory) {
return _symbol;
}
/**
* @dev Returns the number of decimals used to get its user representation.
* For example, if `decimals` equals `2`, a balance of `505` tokens should
* be displayed to a user as `5,05` (`505 / 10 ** 2`).
*
* Tokens usually opt for a value of 18, imitating the relationship between
* Ether and Wei.
*
* NOTE: This information is only used for _display_ purposes: it in
* no way affects any of the arithmetic of the contract, including
* {IERC20-balanceOf} and {IERC20-transfer}.
*/
function decimals() public view returns (uint8) {
return _decimals;
}
}
// File: @openzeppelin/contracts-ethereum-package/contracts/math/SafeMath.sol
pragma solidity ^0.5.0;
/**
* @dev Wrappers over Solidity's arithmetic operations with added overflow
* checks.
*
* Arithmetic operations in Solidity wrap on overflow. This can easily result
* in bugs, because programmers usually assume that an overflow raises an
* error, which is the standard behavior in high level programming languages.
* `SafeMath` restores this intuition by reverting the transaction when an
* operation overflows.
*
* Using this library instead of the unchecked operations eliminates an entire
* class of bugs, so it's recommended to use it always.
*/
library SafeMath {
/**
* @dev Returns the addition of two unsigned integers, reverting on
* overflow.
*
* Counterpart to Solidity's `+` operator.
*
* Requirements:
* - Addition cannot overflow.
*/
function add(uint256 a, uint256 b) internal pure returns (uint256) {
uint256 c = a + b;
require(c >= a, "SafeMath: addition overflow");
return c;
}
/**
* @dev Returns the subtraction of two unsigned integers, reverting on
* overflow (when the result is negative).
*
* Counterpart to Solidity's `-` operator.
*
* Requirements:
* - Subtraction cannot overflow.
*/
function sub(uint256 a, uint256 b) internal pure returns (uint256) {
return sub(a, b, "SafeMath: subtraction overflow");
}
/**
* @dev Returns the subtraction of two unsigned integers, reverting with custom message on
* overflow (when the result is negative).
*
* Counterpart to Solidity's `-` operator.
*
* Requirements:
* - Subtraction cannot overflow.
*
* _Available since v2.4.0._
*/
function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
require(b <= a, errorMessage);
uint256 c = a - b;
return c;
}
/**
* @dev Returns the multiplication of two unsigned integers, reverting on
* overflow.
*
* Counterpart to Solidity's `*` operator.
*
* Requirements:
* - Multiplication cannot overflow.
*/
function mul(uint256 a, uint256 b) internal pure returns (uint256) {
// Gas optimization: this is cheaper than requiring 'a' not being zero, but the
// benefit is lost if 'b' is also tested.
// See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522
if (a == 0) {
return 0;
}
uint256 c = a * b;
require(c / a == b, "SafeMath: multiplication overflow");
return c;
}
/**
* @dev Returns the integer division of two unsigned integers. Reverts on
* division by zero. The result is rounded towards zero.
*
* Counterpart to Solidity's `/` operator. Note: this function uses a
* `revert` opcode (which leaves remaining gas untouched) while Solidity
* uses an invalid opcode to revert (consuming all remaining gas).
*
* Requirements:
* - The divisor cannot be zero.
*/
function div(uint256 a, uint256 b) internal pure returns (uint256) {
return div(a, b, "SafeMath: division by zero");
}
/**
* @dev Returns the integer division of two unsigned integers. Reverts with custom message on
* division by zero. The result is rounded towards zero.
*
* Counterpart to Solidity's `/` operator. Note: this function uses a
* `revert` opcode (which leaves remaining gas untouched) while Solidity
* uses an invalid opcode to revert (consuming all remaining gas).
*
* Requirements:
* - The divisor cannot be zero.
*
* _Available since v2.4.0._
*/
function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
// Solidity only automatically asserts when dividing by 0
require(b > 0, errorMessage);
uint256 c = a / b;
// assert(a == b * c + a % b); // There is no case in which this doesn't hold
return c;
}
/**
* @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
* Reverts when dividing by zero.
*
* Counterpart to Solidity's `%` operator. This function uses a `revert`
* opcode (which leaves remaining gas untouched) while Solidity uses an
* invalid opcode to revert (consuming all remaining gas).
*
* Requirements:
* - The divisor cannot be zero.
*/
function mod(uint256 a, uint256 b) internal pure returns (uint256) {
return mod(a, b, "SafeMath: modulo by zero");
}
/**
* @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
* Reverts with custom message when dividing by zero.
*
* Counterpart to Solidity's `%` operator. This function uses a `revert`
* opcode (which leaves remaining gas untouched) while Solidity uses an
* invalid opcode to revert (consuming all remaining gas).
*
* Requirements:
* - The divisor cannot be zero.
*
* _Available since v2.4.0._
*/
function mod(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
require(b != 0, errorMessage);
return a % b;
}
}
// File: contracts/Token/ERC20.sol
pragma solidity ^0.5.0;
/**
* @dev Implementation of the {IERC20} interface.
*
* This implementation is agnostic to the way tokens are created. This means
* that a supply mechanism has to be added in a derived contract using {_mint}.
* For a generic mechanism see {ERC20Mintable}.
*
* TIP: For a detailed writeup see our guide
* https://forum.zeppelin.solutions/t/how-to-implement-erc20-supply-mechanisms/226[How
* to implement supply mechanisms].
*
* We have followed general OpenZeppelin guidelines: functions revert instead
* of returning `false` on failure. This behavior is nonetheless conventional
* and does not conflict with the expectations of ERC20 applications.
*
* Additionally, an {Approval} event is emitted on calls to {transferFrom}.
* This allows applications to reconstruct the allowance for all accounts just
* by listening to said events. Other implementations of the EIP may not emit
* these events, as it isn't required by the specification.
*
* Finally, the non-standard {decreaseAllowance} and {increaseAllowance}
* functions have been added to mitigate the well-known issues around setting
* allowances. See {IERC20-approve}.
*/
contract ERC20 is Sender, ERC20Detailed {
using SafeMath for uint256;
mapping(address => uint256) private _balances;
mapping(address => mapping(address => uint256)) private _allowances;
uint256 private _totalSupply;
/**
* @dev See {IERC20-totalSupply}.
*/
function totalSupply() public view returns (uint256) {
return _totalSupply;
}
/**
* @dev See {IERC20-balanceOf}.
*/
function balanceOf(address account) public view returns (uint256) {
return _balances[account];
}
/**
* @dev See {IERC20-transfer}.
*
* Requirements:
*
* - `recipient` cannot be the zero address.
* - the caller must have a balance of at least `amount`.
*/
function transfer(address recipient, uint256 amount) public returns (bool) {
_transfer(_msgSender(), recipient, amount);
return true;
}
/**
* @dev See {IERC20-allowance}.
*/
function allowance(address owner, address spender)
public
view
returns (uint256)
{
return _allowances[owner][spender];
}
/**
* @dev See {IERC20-approve}.
*
* Requirements:
*
* - `spender` cannot be the zero address.
*/
function approve(address spender, uint256 amount) public returns (bool) {
_approve(_msgSender(), spender, amount);
return true;
}
/**
* @dev See {IERC20-transferFrom}.
*
* Emits an {Approval} event indicating the updated allowance. This is not
* required by the EIP. See the note at the beginning of {ERC20};
*
* Requirements:
* - `sender` and `recipient` cannot be the zero address.
* - `sender` must have a balance of at least `amount`.
* - the caller must have allowance for `sender`'s tokens of at least
* `amount`.
*/
function transferFrom(address sender, address recipient, uint256 amount)
public
returns (bool)
{
_transfer(sender, recipient, amount);
_approve(
sender,
_msgSender(),
_allowances[sender][_msgSender()].sub(
amount,
"ERC20: transfer amount exceeds allowance"
)
);
return true;
}
/**
* @dev Atomically increases the allowance granted to `spender` by the caller.
*
* This is an alternative to {approve} that can be used as a mitigation for
* problems described in {IERC20-approve}.
*
* Emits an {Approval} event indicating the updated allowance.
*
* Requirements:
*
* - `spender` cannot be the zero address.
*/
function increaseAllowance(address spender, uint256 addedValue)
public
returns (bool)
{
_approve(
_msgSender(),
spender,
_allowances[_msgSender()][spender].add(addedValue)
);
return true;
}
/**
* @dev Atomically decreases the allowance granted to `spender` by the caller.
*
* This is an alternative to {approve} that can be used as a mitigation for
* problems described in {IERC20-approve}.
*
* Emits an {Approval} event indicating the updated allowance.
*
* Requirements:
*
* - `spender` cannot be the zero address.
* - `spender` must have allowance for the caller of at least
* `subtractedValue`.
*/
function decreaseAllowance(address spender, uint256 subtractedValue)
public
returns (bool)
{
_approve(
_msgSender(),
spender,
_allowances[_msgSender()][spender].sub(
subtractedValue,
"ERC20: decreased allowance below zero"
)
);
return true;
}
/**
* @dev Moves tokens `amount` from `sender` to `recipient`.
*
* This is internal function is equivalent to {transfer}, and can be used to
* e.g. implement automatic token fees, slashing mechanisms, etc.
*
* Emits a {Transfer} event.
*
* Requirements:
*
* - `sender` cannot be the zero address.
* - `recipient` cannot be the zero address.
* - `sender` must have a balance of at least `amount`.
*/
function _transfer(address sender, address recipient, uint256 amount)
internal
{
require(sender != address(0), "ERC20: transfer from the zero address");
require(recipient != address(0), "ERC20: transfer to the zero address");
_balances[sender] = _balances[sender].sub(
amount,
"ERC20: transfer amount exceeds balance"
);
_balances[recipient] = _balances[recipient].add(amount);
emit Transfer(sender, recipient, amount);
}
/** @dev Creates `amount` tokens and assigns them to `account`, increasing
* the total supply.
*
* Emits a {Transfer} event with `from` set to the zero address.
*
* Requirements
*
* - `to` cannot be the zero address.
*/
function _mint(address account, uint256 amount) internal {
require(account != address(0), "ERC20: mint to the zero address");
_totalSupply = _totalSupply.add(amount);
_balances[account] = _balances[account].add(amount);
emit Transfer(address(0), account, amount);
}
/**
* @dev Destroys `amount` tokens from `account`, reducing the
* total supply.
*
* Emits a {Transfer} event with `to` set to the zero address.
*
* Requirements
*
* - `account` cannot be the zero address.
* - `account` must have at least `amount` tokens.
*/
function _burn(address account, uint256 amount) internal {
require(account != address(0), "ERC20: burn from the zero address");
_balances[account] = _balances[account].sub(
amount,
"ERC20: burn amount exceeds balance"
);
_totalSupply = _totalSupply.sub(amount);
emit Transfer(account, address(0), amount);
}
/**
* @dev Sets `amount` as the allowance of `spender` over the `owner`s tokens.
*
* This is internal function is equivalent to `approve`, and can be used to
* e.g. set automatic allowances for certain subsystems, etc.
*
* Emits an {Approval} event.
*
* Requirements:
*
* - `owner` cannot be the zero address.
* - `spender` cannot be the zero address.
*/
function _approve(address owner, address spender, uint256 amount) internal {
require(owner != address(0), "ERC20: approve from the zero address");
require(spender != address(0), "ERC20: approve to the zero address");
_allowances[owner][spender] = amount;
emit Approval(owner, spender, amount);
}
/**
* @dev Destroys `amount` tokens from `account`.`amount` is then deducted
* from the caller's allowance.
*
* See {_burn} and {_approve}.
*/
function _burnFrom(address account, uint256 amount) internal {
_burn(account, amount);
_approve(
account,
_msgSender(),
_allowances[account][_msgSender()].sub(
amount,
"ERC20: burn amount exceeds allowance"
)
);
}
}
// File: contracts/Token/InverseToken.sol
pragma solidity ^0.5.0;
contract InverseToken is ERC20 {
function mintTokens(address destinationAddress, uint256 amountToMint)
public
onlyOwnerOrTokenSwap()
returns (bool)
{
// Mint Tokens on Successful Creation order
_mint(destinationAddress, amountToMint);
return true;
}
function burnTokens(address fromAddress, uint256 amountToBurn)
public
onlyOwnerOrTokenSwap()
returns (bool)
{
// Burn Tokens on Successful Redemption Order
_burn(fromAddress, amountToBurn);
return true;
}
modifier onlyOwnerOrTokenSwap() {
require(
isOwner() || _msgSender() == _persistenStorage.tokenSwapManager(),
"caller is not the owner or token swap manager"
);
_;
}
uint256[50] private ______gap;
}Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
Contract ABI
API[{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"constant":true,"inputs":[],"name":"_persistenStorage","outputs":[{"internalType":"contract PersistentStorage","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"fromAddress","type":"address"},{"internalType":"uint256","name":"amountToBurn","type":"uint256"}],"name":"burnTokens","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"subtractedValue","type":"uint256"}],"name":"decreaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"addedValue","type":"uint256"}],"name":"increaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"sender","type":"address"}],"name":"initialize","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"string","name":"name","type":"string"},{"internalType":"string","name":"symbol","type":"string"},{"internalType":"uint8","name":"decimals","type":"uint8"},{"internalType":"address","name":"persistenStorage","type":"address"},{"internalType":"address","name":"ownerAddress","type":"address"}],"name":"initialize","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"isOwner","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"destinationAddress","type":"address"},{"internalType":"uint256","name":"amountToMint","type":"uint256"}],"name":"mintTokens","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"renounceOwnership","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"}]Contract Creation Code
6080604052612405806100136000396000f3fe608060405234801561001057600080fd5b506004361061012c5760003560e01c80638da5cb5b116100ad578063c4d66de811610071578063c4d66de814610615578063c820f14614610659578063dd62ed3e146107f8578063f0dda65c14610870578063f2fde38b146108d65761012c565b80638da5cb5b1461045a5780638f32d59b146104a457806395d89b41146104c6578063a457c2d714610549578063a9059cbb146105af5761012c565b8063313ce567116100f4578063313ce56714610324578063395093511461034857806370a08231146103ae578063715018a614610406578063883132b0146104105761012c565b806306fdde0314610131578063095ea7b3146101b45780630d1118ce1461021a57806318160ddd1461028057806323b872dd1461029e575b600080fd5b61013961091a565b6040518080602001828103825283818151815260200191508051906020019080838360005b8381101561017957808201518184015260208101905061015e565b50505050905090810190601f1680156101a65780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b610200600480360360408110156101ca57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291905050506109bc565b604051808215151515815260200191505060405180910390f35b6102666004803603604081101561023057600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291905050506109da565b604051808215151515815260200191505060405180910390f35b610288610b2c565b6040518082815260200191505060405180910390f35b61030a600480360360608110156102b457600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050610b36565b604051808215151515815260200191505060405180910390f35b61032c610c0f565b604051808260ff1660ff16815260200191505060405180910390f35b6103946004803603604081101561035e57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050610c26565b604051808215151515815260200191505060405180910390f35b6103f0600480360360208110156103c457600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050610cd9565b6040518082815260200191505060405180910390f35b61040e610d22565b005b610418610e5d565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b610462610e83565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b6104ac610ead565b604051808215151515815260200191505060405180910390f35b6104ce610f0c565b6040518080602001828103825283818151815260200191508051906020019080838360005b8381101561050e5780820151818401526020810190506104f3565b50505050905090810190601f16801561053b5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b6105956004803603604081101561055f57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050610fae565b604051808215151515815260200191505060405180910390f35b6105fb600480360360408110156105c557600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291908035906020019092919050505061107b565b604051808215151515815260200191505060405180910390f35b6106576004803603602081101561062b57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611099565b005b6107f6600480360360a081101561066f57600080fd5b810190808035906020019064010000000081111561068c57600080fd5b82018360208201111561069e57600080fd5b803590602001918460018302840111640100000000831117156106c057600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f8201169050808301925050505050505091929192908035906020019064010000000081111561072357600080fd5b82018360208201111561073557600080fd5b8035906020019184600183028401116401000000008311171561075757600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050509192919290803560ff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611257565b005b61085a6004803603604081101561080e57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506113ee565b6040518082815260200191505060405180910390f35b6108bc6004803603604081101561088657600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050611475565b604051808215151515815260200191505060405180910390f35b610918600480360360208110156108ec57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506115c7565b005b606060668054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156109b25780601f10610987576101008083540402835291602001916109b2565b820191906000526020600020905b81548152906001019060200180831161099557829003601f168201915b5050505050905090565b60006109d06109c961164d565b8484611655565b6001905092915050565b60006109e4610ead565b80610ac35750606860019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166395ffce6d6040518163ffffffff1660e01b815260040160206040518083038186803b158015610a5257600080fd5b505afa158015610a66573d6000803e3d6000fd5b505050506040513d6020811015610a7c57600080fd5b810190808051906020019092919050505073ffffffffffffffffffffffffffffffffffffffff16610aab61164d565b73ffffffffffffffffffffffffffffffffffffffff16145b610b18576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602d8152602001806122bf602d913960400191505060405180910390fd5b610b22838361184c565b6001905092915050565b6000606b54905090565b6000610b43848484611a06565b610c0484610b4f61164d565b610bff856040518060600160405280602881526020016122ec60289139606a60008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000610bb561164d565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054611cc09092919063ffffffff16565b611655565b600190509392505050565b6000606860009054906101000a900460ff16905090565b6000610ccf610c3361164d565b84610cca85606a6000610c4461164d565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054611d8090919063ffffffff16565b611655565b6001905092915050565b6000606960008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b610d2a610ead565b610d9c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff16603360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a36000603360006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b606860019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000603360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6000603360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16610ef061164d565b73ffffffffffffffffffffffffffffffffffffffff1614905090565b606060678054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015610fa45780601f10610f7957610100808354040283529160200191610fa4565b820191906000526020600020905b815481529060010190602001808311610f8757829003601f168201915b5050505050905090565b6000611071610fbb61164d565b8461106c856040518060600160405280602581526020016123ac60259139606a6000610fe561164d565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054611cc09092919063ffffffff16565b611655565b6001905092915050565b600061108f61108861164d565b8484611a06565b6001905092915050565b600060019054906101000a900460ff16806110b857506110b7611e08565b5b806110cf57506000809054906101000a900460ff16155b611124576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602e815260200180612314602e913960400191505060405180910390fd5b60008060019054906101000a900460ff161590508015611174576001600060016101000a81548160ff02191690831515021790555060016000806101000a81548160ff0219169083151502179055505b81603360006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550603360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a380156112535760008060016101000a81548160ff0219169083151502179055505b5050565b600060019054906101000a900460ff16806112765750611275611e08565b5b8061128d57506000809054906101000a900460ff16155b6112e2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602e815260200180612314602e913960400191505060405180910390fd5b60008060019054906101000a900460ff161590508015611332576001600060016101000a81548160ff02191690831515021790555060016000806101000a81548160ff0219169083151502179055505b61133b82611099565b8560669080519060200190611351929190612166565b508460679080519060200190611368929190612166565b5083606860006101000a81548160ff021916908360ff16021790555082606860016101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555080156113e65760008060016101000a81548160ff0219169083151502179055505b505050505050565b6000606a60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b600061147f610ead565b8061155e5750606860019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166395ffce6d6040518163ffffffff1660e01b815260040160206040518083038186803b1580156114ed57600080fd5b505afa158015611501573d6000803e3d6000fd5b505050506040513d602081101561151757600080fd5b810190808051906020019092919050505073ffffffffffffffffffffffffffffffffffffffff1661154661164d565b73ffffffffffffffffffffffffffffffffffffffff16145b6115b3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602d8152602001806122bf602d913960400191505060405180910390fd5b6115bd8383611e19565b6001905092915050565b6115cf610ead565b611641576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b61164a81611fd6565b50565b600033905090565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156116db576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260248152602001806123886024913960400191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611761576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260228152602001806122776022913960400191505060405180910390fd5b80606a60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925836040518082815260200191505060405180910390a3505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156118d2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260218152602001806123426021913960400191505060405180910390fd5b61193e8160405180606001604052806022815260200161222f60229139606960008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054611cc09092919063ffffffff16565b606960008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555061199681606b5461211c90919063ffffffff16565b606b81905550600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040518082815260200191505060405180910390a35050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415611a8c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260258152602001806123636025913960400191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611b12576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602381526020018061220c6023913960400191505060405180910390fd5b611b7e8160405180606001604052806026815260200161229960269139606960008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054611cc09092919063ffffffff16565b606960008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550611c1381606960008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054611d8090919063ffffffff16565b606960008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040518082815260200191505060405180910390a3505050565b6000838311158290611d6d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b83811015611d32578082015181840152602081019050611d17565b50505050905090810190601f168015611d5f5780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b5060008385039050809150509392505050565b600080828401905083811015611dfe576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601b8152602001807f536166654d6174683a206164646974696f6e206f766572666c6f77000000000081525060200191505060405180910390fd5b8091505092915050565b600080303b90506000811491505090565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611ebc576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601f8152602001807f45524332303a206d696e7420746f20746865207a65726f20616464726573730081525060200191505060405180910390fd5b611ed181606b54611d8090919063ffffffff16565b606b81905550611f2981606960008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054611d8090919063ffffffff16565b606960008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040518082815260200191505060405180910390a35050565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561205c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260268152602001806122516026913960400191505060405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16603360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a380603360006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600061215e83836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250611cc0565b905092915050565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f106121a757805160ff19168380011785556121d5565b828001600101855582156121d5579182015b828111156121d45782518255916020019190600101906121b9565b5b5090506121e291906121e6565b5090565b61220891905b808211156122045760008160009055506001016121ec565b5090565b9056fe45524332303a207472616e7366657220746f20746865207a65726f206164647265737345524332303a206275726e20616d6f756e7420657863656564732062616c616e63654f776e61626c653a206e6577206f776e657220697320746865207a65726f206164647265737345524332303a20617070726f766520746f20746865207a65726f206164647265737345524332303a207472616e7366657220616d6f756e7420657863656564732062616c616e636563616c6c6572206973206e6f7420746865206f776e6572206f7220746f6b656e2073776170206d616e6167657245524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e6365436f6e747261637420696e7374616e63652068617320616c7265616479206265656e20696e697469616c697a656445524332303a206275726e2066726f6d20746865207a65726f206164647265737345524332303a207472616e736665722066726f6d20746865207a65726f206164647265737345524332303a20617070726f76652066726f6d20746865207a65726f206164647265737345524332303a2064656372656173656420616c6c6f77616e63652062656c6f77207a65726fa265627a7a72315820909c8de0cb6895424e2b1e776cbad30de14d44da46a22ef31d79d8170086709c64736f6c63430005100032
Deployed Bytecode
0x608060405234801561001057600080fd5b506004361061012c5760003560e01c80638da5cb5b116100ad578063c4d66de811610071578063c4d66de814610615578063c820f14614610659578063dd62ed3e146107f8578063f0dda65c14610870578063f2fde38b146108d65761012c565b80638da5cb5b1461045a5780638f32d59b146104a457806395d89b41146104c6578063a457c2d714610549578063a9059cbb146105af5761012c565b8063313ce567116100f4578063313ce56714610324578063395093511461034857806370a08231146103ae578063715018a614610406578063883132b0146104105761012c565b806306fdde0314610131578063095ea7b3146101b45780630d1118ce1461021a57806318160ddd1461028057806323b872dd1461029e575b600080fd5b61013961091a565b6040518080602001828103825283818151815260200191508051906020019080838360005b8381101561017957808201518184015260208101905061015e565b50505050905090810190601f1680156101a65780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b610200600480360360408110156101ca57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291905050506109bc565b604051808215151515815260200191505060405180910390f35b6102666004803603604081101561023057600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291905050506109da565b604051808215151515815260200191505060405180910390f35b610288610b2c565b6040518082815260200191505060405180910390f35b61030a600480360360608110156102b457600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050610b36565b604051808215151515815260200191505060405180910390f35b61032c610c0f565b604051808260ff1660ff16815260200191505060405180910390f35b6103946004803603604081101561035e57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050610c26565b604051808215151515815260200191505060405180910390f35b6103f0600480360360208110156103c457600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050610cd9565b6040518082815260200191505060405180910390f35b61040e610d22565b005b610418610e5d565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b610462610e83565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b6104ac610ead565b604051808215151515815260200191505060405180910390f35b6104ce610f0c565b6040518080602001828103825283818151815260200191508051906020019080838360005b8381101561050e5780820151818401526020810190506104f3565b50505050905090810190601f16801561053b5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b6105956004803603604081101561055f57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050610fae565b604051808215151515815260200191505060405180910390f35b6105fb600480360360408110156105c557600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291908035906020019092919050505061107b565b604051808215151515815260200191505060405180910390f35b6106576004803603602081101561062b57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611099565b005b6107f6600480360360a081101561066f57600080fd5b810190808035906020019064010000000081111561068c57600080fd5b82018360208201111561069e57600080fd5b803590602001918460018302840111640100000000831117156106c057600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f8201169050808301925050505050505091929192908035906020019064010000000081111561072357600080fd5b82018360208201111561073557600080fd5b8035906020019184600183028401116401000000008311171561075757600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050509192919290803560ff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611257565b005b61085a6004803603604081101561080e57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506113ee565b6040518082815260200191505060405180910390f35b6108bc6004803603604081101561088657600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050611475565b604051808215151515815260200191505060405180910390f35b610918600480360360208110156108ec57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506115c7565b005b606060668054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156109b25780601f10610987576101008083540402835291602001916109b2565b820191906000526020600020905b81548152906001019060200180831161099557829003601f168201915b5050505050905090565b60006109d06109c961164d565b8484611655565b6001905092915050565b60006109e4610ead565b80610ac35750606860019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166395ffce6d6040518163ffffffff1660e01b815260040160206040518083038186803b158015610a5257600080fd5b505afa158015610a66573d6000803e3d6000fd5b505050506040513d6020811015610a7c57600080fd5b810190808051906020019092919050505073ffffffffffffffffffffffffffffffffffffffff16610aab61164d565b73ffffffffffffffffffffffffffffffffffffffff16145b610b18576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602d8152602001806122bf602d913960400191505060405180910390fd5b610b22838361184c565b6001905092915050565b6000606b54905090565b6000610b43848484611a06565b610c0484610b4f61164d565b610bff856040518060600160405280602881526020016122ec60289139606a60008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000610bb561164d565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054611cc09092919063ffffffff16565b611655565b600190509392505050565b6000606860009054906101000a900460ff16905090565b6000610ccf610c3361164d565b84610cca85606a6000610c4461164d565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054611d8090919063ffffffff16565b611655565b6001905092915050565b6000606960008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b610d2a610ead565b610d9c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff16603360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a36000603360006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b606860019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000603360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6000603360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16610ef061164d565b73ffffffffffffffffffffffffffffffffffffffff1614905090565b606060678054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015610fa45780601f10610f7957610100808354040283529160200191610fa4565b820191906000526020600020905b815481529060010190602001808311610f8757829003601f168201915b5050505050905090565b6000611071610fbb61164d565b8461106c856040518060600160405280602581526020016123ac60259139606a6000610fe561164d565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054611cc09092919063ffffffff16565b611655565b6001905092915050565b600061108f61108861164d565b8484611a06565b6001905092915050565b600060019054906101000a900460ff16806110b857506110b7611e08565b5b806110cf57506000809054906101000a900460ff16155b611124576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602e815260200180612314602e913960400191505060405180910390fd5b60008060019054906101000a900460ff161590508015611174576001600060016101000a81548160ff02191690831515021790555060016000806101000a81548160ff0219169083151502179055505b81603360006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550603360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a380156112535760008060016101000a81548160ff0219169083151502179055505b5050565b600060019054906101000a900460ff16806112765750611275611e08565b5b8061128d57506000809054906101000a900460ff16155b6112e2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602e815260200180612314602e913960400191505060405180910390fd5b60008060019054906101000a900460ff161590508015611332576001600060016101000a81548160ff02191690831515021790555060016000806101000a81548160ff0219169083151502179055505b61133b82611099565b8560669080519060200190611351929190612166565b508460679080519060200190611368929190612166565b5083606860006101000a81548160ff021916908360ff16021790555082606860016101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555080156113e65760008060016101000a81548160ff0219169083151502179055505b505050505050565b6000606a60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b600061147f610ead565b8061155e5750606860019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166395ffce6d6040518163ffffffff1660e01b815260040160206040518083038186803b1580156114ed57600080fd5b505afa158015611501573d6000803e3d6000fd5b505050506040513d602081101561151757600080fd5b810190808051906020019092919050505073ffffffffffffffffffffffffffffffffffffffff1661154661164d565b73ffffffffffffffffffffffffffffffffffffffff16145b6115b3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602d8152602001806122bf602d913960400191505060405180910390fd5b6115bd8383611e19565b6001905092915050565b6115cf610ead565b611641576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b61164a81611fd6565b50565b600033905090565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156116db576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260248152602001806123886024913960400191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611761576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260228152602001806122776022913960400191505060405180910390fd5b80606a60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925836040518082815260200191505060405180910390a3505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156118d2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260218152602001806123426021913960400191505060405180910390fd5b61193e8160405180606001604052806022815260200161222f60229139606960008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054611cc09092919063ffffffff16565b606960008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555061199681606b5461211c90919063ffffffff16565b606b81905550600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040518082815260200191505060405180910390a35050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415611a8c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260258152602001806123636025913960400191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611b12576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602381526020018061220c6023913960400191505060405180910390fd5b611b7e8160405180606001604052806026815260200161229960269139606960008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054611cc09092919063ffffffff16565b606960008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550611c1381606960008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054611d8090919063ffffffff16565b606960008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040518082815260200191505060405180910390a3505050565b6000838311158290611d6d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b83811015611d32578082015181840152602081019050611d17565b50505050905090810190601f168015611d5f5780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b5060008385039050809150509392505050565b600080828401905083811015611dfe576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601b8152602001807f536166654d6174683a206164646974696f6e206f766572666c6f77000000000081525060200191505060405180910390fd5b8091505092915050565b600080303b90506000811491505090565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611ebc576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601f8152602001807f45524332303a206d696e7420746f20746865207a65726f20616464726573730081525060200191505060405180910390fd5b611ed181606b54611d8090919063ffffffff16565b606b81905550611f2981606960008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054611d8090919063ffffffff16565b606960008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040518082815260200191505060405180910390a35050565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561205c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260268152602001806122516026913960400191505060405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16603360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a380603360006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600061215e83836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250611cc0565b905092915050565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f106121a757805160ff19168380011785556121d5565b828001600101855582156121d5579182015b828111156121d45782518255916020019190600101906121b9565b5b5090506121e291906121e6565b5090565b61220891905b808211156122045760008160009055506001016121ec565b5090565b9056fe45524332303a207472616e7366657220746f20746865207a65726f206164647265737345524332303a206275726e20616d6f756e7420657863656564732062616c616e63654f776e61626c653a206e6577206f776e657220697320746865207a65726f206164647265737345524332303a20617070726f766520746f20746865207a65726f206164647265737345524332303a207472616e7366657220616d6f756e7420657863656564732062616c616e636563616c6c6572206973206e6f7420746865206f776e6572206f7220746f6b656e2073776170206d616e6167657245524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e6365436f6e747261637420696e7374616e63652068617320616c7265616479206265656e20696e697469616c697a656445524332303a206275726e2066726f6d20746865207a65726f206164647265737345524332303a207472616e736665722066726f6d20746865207a65726f206164647265737345524332303a20617070726f76652066726f6d20746865207a65726f206164647265737345524332303a2064656372656173656420616c6c6f77616e63652062656c6f77207a65726fa265627a7a72315820909c8de0cb6895424e2b1e776cbad30de14d44da46a22ef31d79d8170086709c64736f6c63430005100032
Deployed Bytecode Sourcemap
58422:866:0:-;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;58422:866:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;43052:83;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;99:1;94:3;90:11;84:18;80:1;75:3;71:11;64:39;52:2;49:1;45:10;40:15;;8:100;;;12:14;43052:83:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;52098:152;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;52098:152:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;58748:268;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;58748:268:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;51087:91;;;:::i;:::-;;;;;;;;;;;;;;;;;;;52722:426;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;52722:426:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;43904:83;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;53557:283;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;53557:283:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;51241:110;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;51241:110:0;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;9239:140;;;:::i;:::-;;42355:42;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;8426:79;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;8792:94;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;43254:87;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;99:1;94:3;90:11;84:18;80:1;75:3;71:11;64:39;52:2;49:1;45:10;40:15;;8:100;;;12:14;43254:87:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;54343:383;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;54343:383:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;51564:158;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;51564:158:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;8200:145;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;8200:145:0;;;;;;;;;;;;;;;;;;;:::i;:::-;;42595:387;;;;;;13:3:-1;8;5:12;2:2;;;30:1;27;20:12;2:2;42595:387:0;;;;;;;;;;21:11:-1;8;5:28;2:2;;;46:1;43;36:12;2:2;42595:387:0;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;42595:387:0;;;;;;100:9:-1;95:1;81:12;77:20;67:8;63:35;60:50;39:11;25:12;22:29;11:107;8:2;;;131:1;128;121:12;8:2;42595:387:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;93:3;85:6;81:16;74:27;137:4;133:9;126:4;121:3;117:14;113:30;106:37;;169:3;161:6;157:16;147:26;;42595:387:0;;;;;;;;;;;;;;;;;21:11:-1;8;5:28;2:2;;;46:1;43;36:12;2:2;42595:387:0;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;42595:387:0;;;;;;100:9:-1;95:1;81:12;77:20;67:8;63:35;60:50;39:11;25:12;22:29;11:107;8:2;;;131:1;128;121:12;8:2;42595:387:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;93:3;85:6;81:16;74:27;137:4;133:9;126:4;121:3;117:14;113:30;106:37;;169:3;161:6;157:16;147:26;;42595:387:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;51785:166;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;51785:166:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;58460:280;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;58460:280:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;9534:109;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;9534:109:0;;;;;;;;;;;;;;;;;;;:::i;:::-;;43052:83;43089:13;43122:5;43115:12;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;43052:83;:::o;52098:152::-;52164:4;52181:39;52190:12;:10;:12::i;:::-;52204:7;52213:6;52181:8;:39::i;:::-;52238:4;52231:11;;52098:152;;;;:::o;58748:268::-;58877:4;59089:9;:7;:9::i;:::-;:65;;;;59118:17;;;;;;;;;;;:34;;;:36;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;59118:36:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;59118:36:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;59118:36:0;;;;;;;;;;;;;;;;59102:52;;:12;:10;:12::i;:::-;:52;;;59089:65;59067:160;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;58954:32;58960:11;58973:12;58954:5;:32::i;:::-;59004:4;58997:11;;58748:268;;;;:::o;51087:91::-;51131:7;51158:12;;51151:19;;51087:91;:::o;52722:426::-;52829:4;52851:36;52861:6;52869:9;52880:6;52851:9;:36::i;:::-;52898:220;52921:6;52942:12;:10;:12::i;:::-;52969:138;53025:6;52969:138;;;;;;;;;;;;;;;;;:11;:19;52981:6;52969:19;;;;;;;;;;;;;;;:33;52989:12;:10;:12::i;:::-;52969:33;;;;;;;;;;;;;;;;:37;;:138;;;;;:::i;:::-;52898:8;:220::i;:::-;53136:4;53129:11;;52722:426;;;;;:::o;43904:83::-;43945:5;43970:9;;;;;;;;;;;43963:16;;43904:83;:::o;53557:283::-;53655:4;53677:133;53700:12;:10;:12::i;:::-;53727:7;53749:50;53788:10;53749:11;:25;53761:12;:10;:12::i;:::-;53749:25;;;;;;;;;;;;;;;:34;53775:7;53749:34;;;;;;;;;;;;;;;;:38;;:50;;;;:::i;:::-;53677:8;:133::i;:::-;53828:4;53821:11;;53557:283;;;;:::o;51241:110::-;51298:7;51325:9;:18;51335:7;51325:18;;;;;;;;;;;;;;;;51318:25;;51241:110;;;:::o;9239:140::-;8638:9;:7;:9::i;:::-;8630:54;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9338:1;9301:40;;9322:6;;;;;;;;;;;9301:40;;;;;;;;;;;;9369:1;9352:6;;:19;;;;;;;;;;;;;;;;;;9239:140::o;42355:42::-;;;;;;;;;;;;;:::o;8426:79::-;8464:7;8491:6;;;;;;;;;;;8484:13;;8426:79;:::o;8792:94::-;8832:4;8872:6;;;;;;;;;;;8856:22;;:12;:10;:12::i;:::-;:22;;;8849:29;;8792:94;:::o;43254:87::-;43293:13;43326:7;43319:14;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;43254:87;:::o;54343:383::-;54446:4;54468:228;54491:12;:10;:12::i;:::-;54518:7;54540:145;54597:15;54540:145;;;;;;;;;;;;;;;;;:11;:25;54552:12;:10;:12::i;:::-;54540:25;;;;;;;;;;;;;;;:34;54566:7;54540:34;;;;;;;;;;;;;;;;:38;;:145;;;;;:::i;:::-;54468:8;:228::i;:::-;54714:4;54707:11;;54343:383;;;;:::o;51564:158::-;51633:4;51650:42;51660:12;:10;:12::i;:::-;51674:9;51685:6;51650:9;:42::i;:::-;51710:4;51703:11;;51564:158;;;;:::o;8200:145::-;5209:12;;;;;;;;;;;:31;;;;5225:15;:13;:15::i;:::-;5209:31;:47;;;;5245:11;;;;;;;;;;;5244:12;5209:47;5201:106;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5316:19;5339:12;;;;;;;;;;;5338:13;5316:35;;5362:14;5358:83;;;5402:4;5387:12;;:19;;;;;;;;;;;;;;;;;;5429:4;5415:11;;:18;;;;;;;;;;;;;;;;;;5358:83;8275:6;8266;;:15;;;;;;;;;;;;;;;;;;8330:6;;;;;;;;;;;8297:40;;8326:1;8297:40;;;;;;;;;;;;5463:14;5459:57;;;5503:5;5488:12;;:20;;;;;;;;;;;;;;;;;;5459:57;8200:145;;:::o;42595:387::-;5209:12;;;;;;;;;;;:31;;;;5225:15;:13;:15::i;:::-;5209:31;:47;;;;5245:11;;;;;;;;;;;5244:12;5209:47;5201:106;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5316:19;5339:12;;;;;;;;;;;5338:13;5316:35;;5362:14;5358:83;;;5402:4;5387:12;;:19;;;;;;;;;;;;;;;;;;5429:4;5415:11;;:18;;;;;;;;;;;;;;;;;;5358:83;42803:24;42814:12;42803:10;:24::i;:::-;42846:4;42838:5;:12;;;;;;;;;;;;:::i;:::-;;42871:6;42861:7;:16;;;;;;;;;;;;:::i;:::-;;42900:8;42888:9;;:20;;;;;;;;;;;;;;;;;;42957:16;42919:17;;:55;;;;;;;;;;;;;;;;;;5463:14;5459:57;;;5503:5;5488:12;;:20;;;;;;;;;;;;;;;;;;5459:57;42595:387;;;;;;:::o;51785:166::-;51884:7;51916:11;:18;51928:5;51916:18;;;;;;;;;;;;;;;:27;51935:7;51916:27;;;;;;;;;;;;;;;;51909:34;;51785:166;;;;:::o;58460:280::-;58596:4;59089:9;:7;:9::i;:::-;:65;;;;59118:17;;;;;;;;;;;:34;;;:36;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;59118:36:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;59118:36:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;59118:36:0;;;;;;;;;;;;;;;;59102:52;;:12;:10;:12::i;:::-;:52;;;59089:65;59067:160;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;58671:39;58677:18;58697:12;58671:5;:39::i;:::-;58728:4;58721:11;;58460:280;;;;:::o;9534:109::-;8638:9;:7;:9::i;:::-;8630:54;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9607:28;9626:8;9607:18;:28::i;:::-;9534:109;:::o;7105:98::-;7150:15;7185:10;7178:17;;7105:98;:::o;57484:338::-;57595:1;57578:19;;:5;:19;;;;57570:68;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;57676:1;57657:21;;:7;:21;;;;57649:68;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;57760:6;57730:11;:18;57742:5;57730:18;;;;;;;;;;;;;;;:27;57749:7;57730:27;;;;;;;;;;;;;;;:36;;;;57798:7;57782:32;;57791:5;57782:32;;;57807:6;57782:32;;;;;;;;;;;;;;;;;;57484:338;;;:::o;56659:385::-;56754:1;56735:21;;:7;:21;;;;56727:67;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;56828:105;56865:6;56828:105;;;;;;;;;;;;;;;;;:9;:18;56838:7;56828:18;;;;;;;;;;;;;;;;:22;;:105;;;;;:::i;:::-;56807:9;:18;56817:7;56807:18;;;;;;;;;;;;;;;:126;;;;56959:24;56976:6;56959:12;;:16;;:24;;;;:::i;:::-;56944:12;:39;;;;57025:1;56999:37;;57008:7;56999:37;;;57029:6;56999:37;;;;;;;;;;;;;;;;;;56659:385;;:::o;55216:522::-;55346:1;55328:20;;:6;:20;;;;55320:70;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;55430:1;55409:23;;:9;:23;;;;55401:71;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;55505:108;55541:6;55505:108;;;;;;;;;;;;;;;;;:9;:17;55515:6;55505:17;;;;;;;;;;;;;;;;:21;;:108;;;;;:::i;:::-;55485:9;:17;55495:6;55485:17;;;;;;;;;;;;;;;:128;;;;55647:32;55672:6;55647:9;:20;55657:9;55647:20;;;;;;;;;;;;;;;;:24;;:32;;;;:::i;:::-;55624:9;:20;55634:9;55624:20;;;;;;;;;;;;;;;:55;;;;55712:9;55695:35;;55704:6;55695:35;;;55723:6;55695:35;;;;;;;;;;;;;;;;;;55216:522;;;:::o;45863:192::-;45949:7;45982:1;45977;:6;;45985:12;45969:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;99:1;94:3;90:11;84:18;80:1;75:3;71:11;64:39;52:2;49:1;45:10;40:15;;8:100;;;12:14;45969:29:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;46009:9;46025:1;46021;:5;46009:17;;46046:1;46039:8;;;45863:192;;;;;:::o;44934:181::-;44992:7;45012:9;45028:1;45024;:5;45012:17;;45053:1;45048;:6;;45040:46;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;45106:1;45099:8;;;44934:181;;;;:::o;5610:476::-;5657:4;6004:10;6050:7;6038:20;6032:26;;6079:1;6073:2;:7;6066:14;;;5610:476;:::o;56019:308::-;56114:1;56095:21;;:7;:21;;;;56087:65;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;56180:24;56197:6;56180:12;;:16;;:24;;;;:::i;:::-;56165:12;:39;;;;56236:30;56259:6;56236:9;:18;56246:7;56236:18;;;;;;;;;;;;;;;;:22;;:30;;;;:::i;:::-;56215:9;:18;56225:7;56215:18;;;;;;;;;;;;;;;:51;;;;56303:7;56282:37;;56299:1;56282:37;;;56312:6;56282:37;;;;;;;;;;;;;;;;;;56019:308;;:::o;9749:229::-;9843:1;9823:22;;:8;:22;;;;9815:73;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9933:8;9904:38;;9925:6;;;;;;;;;;;9904:38;;;;;;;;;;;;9962:8;9953:6;;:17;;;;;;;;;;;;;;;;;;9749:229;:::o;45390:136::-;45448:7;45475:43;45479:1;45482;45475:43;;;;;;;;;;;;;;;;;:3;:43::i;:::-;45468:50;;45390:136;;;;:::o;58422:866::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o
Swarm Source
bzzr://909c8de0cb6895424e2b1e776cbad30de14d44da46a22ef31d79d8170086709c
Loading...
Loading
Loading...
Loading
OVERVIEW
BTCSHORT seeks to provide its target of -1x to the return of Bitcoin on a daily basis.Net Worth in USD
$0.00
Net Worth in ETH
0
Multichain Portfolio | 35 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.