Overview
ETH Balance
0 ETH
Eth Value
$0.00More Info
Private Name Tags
ContractCreator
View more zero value Internal Transactions in Advanced View mode
Advanced mode:
Loading...
Loading
Contract Source Code Verified (Exact Match)
Contract Name:
sTokenfy
Compiler Version
v0.8.11+commit.d7f03943
Contract Source Code (Solidity Standard Json-Input format)
// SPDX-License-Identifier: MIT pragma solidity 0.8.11; import "@openzeppelin/contracts/token/ERC20/IERC20.sol"; import "@openzeppelin/contracts-upgradeable/token/ERC20/ERC20Upgradeable.sol"; import "@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol"; import "@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol"; contract sTokenfy is ERC20Upgradeable, OwnableUpgradeable { using SafeERC20 for IERC20; uint256 public rewardsEnd; uint256 public rewardsStart; uint256 public stakingRewards; IERC20 public tokenfyToken; function initialize( address tokenfy ) public initializer { __ERC20_init("sTokenfy", "sTKNFY"); __Ownable_init_unchained(); tokenfyToken = IERC20(tokenfy); } /* * @dev starts staking */ function stake(uint256 tokenfyAmount) external { require(tokenfyAmount > 0, "sTokenfy: invalid amount"); uint256 tokenfyPool = totalTokenfy(); uint256 totalShares = totalSupply(); tokenfyToken.safeTransferFrom(msg.sender, address(this), tokenfyAmount); if (totalShares == 0 || tokenfyPool == 0) { _mint(msg.sender, tokenfyAmount); } else { uint256 share = tokenfyAmount * totalShares / tokenfyPool; _mint(msg.sender, share); } } /* * @dev stops staking, withdraws share and rewards for share */ function unstake(uint256 share) external { require(share > 0, "sTokenfy: invalid share"); uint256 tokenfyPool = totalTokenfy(); uint256 totalShares = totalSupply(); _burn(msg.sender, share); uint256 tokenfyAmount = share * tokenfyPool / totalShares; tokenfyToken.safeTransfer(msg.sender, tokenfyAmount); } /* * @dev adds staking rewards */ function addStakingRewards(uint256 tokenfyAmount) external { require(block.timestamp < rewardsEnd, "sTokenfy: can't add rewards"); tokenfyToken.safeTransferFrom(msg.sender, address(this), tokenfyAmount); stakingRewards += tokenfyAmount; } /* * @dev starts new staking period */ function startPeriod(uint256 newStart, uint256 newDuration) public onlyOwner { require(newStart >= block.timestamp, "sTokenfy: invalid start"); require(newDuration > 0, "sTokenfy: invalid duration"); require(rewardsEnd < block.timestamp, "sTokenfy: last reward period not ended"); uint256 newRewardsEnd = newStart + newDuration; rewardsStart = newStart; rewardsEnd = newRewardsEnd; stakingRewards = 0; } /* * @dev calculates total tokenfy for distribution */ function totalTokenfy() public view returns(uint256) { return tokenfyToken.balanceOf(address(this)) - remainingRewards(); } /* * @dev calculates locked tokenfy */ function remainingRewards() public view returns(uint256) { uint256 time = block.timestamp; uint256 remainingTime; uint256 duration = rewardsEnd - rewardsStart; if (time <= rewardsStart) { remainingTime = duration; } else if (time >= rewardsEnd) { remainingTime = 0; } else { remainingTime = rewardsEnd - time; } return remainingTime * stakingRewards / duration; } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; /** * @dev Interface of the ERC20 standard as defined in the EIP. */ 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); }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; import "./IERC20Upgradeable.sol"; import "./extensions/IERC20MetadataUpgradeable.sol"; import "../../utils/ContextUpgradeable.sol"; import "../../proxy/utils/Initializable.sol"; /** * @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 {ERC20PresetMinterPauser}. * * 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 ERC20Upgradeable is Initializable, ContextUpgradeable, IERC20Upgradeable, IERC20MetadataUpgradeable { mapping (address => uint256) private _balances; mapping (address => mapping (address => uint256)) private _allowances; uint256 private _totalSupply; string private _name; string private _symbol; /** * @dev Sets the values for {name} and {symbol}. * * The defaut value of {decimals} is 18. To select a different value for * {decimals} you should overload it. * * All two of these values are immutable: they can only be set once during * construction. */ function __ERC20_init(string memory name_, string memory symbol_) internal initializer { __Context_init_unchained(); __ERC20_init_unchained(name_, symbol_); } function __ERC20_init_unchained(string memory name_, string memory symbol_) internal initializer { _name = name_; _symbol = symbol_; } /** * @dev Returns the name of the token. */ function name() public view virtual override returns (string memory) { return _name; } /** * @dev Returns the symbol of the token, usually a shorter version of the * name. */ function symbol() public view virtual override returns (string memory) { return _symbol; } /** * @dev Returns the number of decimals used to get its user representation. * For example, if `decimals` equals `2`, a balance of `505` tokens should * be displayed to a user as `5,05` (`505 / 10 ** 2`). * * Tokens usually opt for a value of 18, imitating the relationship between * Ether and Wei. This is the value {ERC20} uses, unless this function is * overridden; * * NOTE: This information is only used for _display_ purposes: it in * no way affects any of the arithmetic of the contract, including * {IERC20-balanceOf} and {IERC20-transfer}. */ function decimals() public view virtual override returns (uint8) { return 18; } /** * @dev See {IERC20-totalSupply}. */ function totalSupply() public view virtual override returns (uint256) { return _totalSupply; } /** * @dev See {IERC20-balanceOf}. */ function balanceOf(address account) public view virtual override 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 virtual override returns (bool) { _transfer(_msgSender(), recipient, amount); return true; } /** * @dev See {IERC20-allowance}. */ function allowance(address owner, address spender) public view virtual override returns (uint256) { return _allowances[owner][spender]; } /** * @dev See {IERC20-approve}. * * Requirements: * * - `spender` cannot be the zero address. */ function approve(address spender, uint256 amount) public virtual override 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 virtual override returns (bool) { _transfer(sender, recipient, amount); uint256 currentAllowance = _allowances[sender][_msgSender()]; require(currentAllowance >= amount, "ERC20: transfer amount exceeds allowance"); _approve(sender, _msgSender(), currentAllowance - amount); 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 virtual returns (bool) { _approve(_msgSender(), spender, _allowances[_msgSender()][spender] + 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 virtual returns (bool) { uint256 currentAllowance = _allowances[_msgSender()][spender]; require(currentAllowance >= subtractedValue, "ERC20: decreased allowance below zero"); _approve(_msgSender(), spender, currentAllowance - subtractedValue); 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 virtual { require(sender != address(0), "ERC20: transfer from the zero address"); require(recipient != address(0), "ERC20: transfer to the zero address"); _beforeTokenTransfer(sender, recipient, amount); uint256 senderBalance = _balances[sender]; require(senderBalance >= amount, "ERC20: transfer amount exceeds balance"); _balances[sender] = senderBalance - amount; _balances[recipient] += 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 virtual { require(account != address(0), "ERC20: mint to the zero address"); _beforeTokenTransfer(address(0), account, amount); _totalSupply += amount; _balances[account] += 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 virtual { require(account != address(0), "ERC20: burn from the zero address"); _beforeTokenTransfer(account, address(0), amount); uint256 accountBalance = _balances[account]; require(accountBalance >= amount, "ERC20: burn amount exceeds balance"); _balances[account] = accountBalance - amount; _totalSupply -= amount; emit Transfer(account, address(0), amount); } /** * @dev Sets `amount` as the allowance of `spender` over the `owner` s tokens. * * This internal function is equivalent to `approve`, and can be used to * e.g. set automatic allowances for certain subsystems, etc. * * Emits an {Approval} event. * * Requirements: * * - `owner` cannot be the zero address. * - `spender` cannot be the zero address. */ function _approve(address owner, address spender, uint256 amount) internal virtual { 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 Hook that is called before any transfer of tokens. This includes * minting and burning. * * Calling conditions: * * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens * will be to transferred to `to`. * - when `from` is zero, `amount` tokens will be minted for `to`. * - when `to` is zero, `amount` of ``from``'s tokens will be burned. * - `from` and `to` are never both zero. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _beforeTokenTransfer(address from, address to, uint256 amount) internal virtual { } uint256[45] private __gap; }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; /** * @dev Interface of the ERC20 standard as defined in the EIP. */ interface IERC20Upgradeable { /** * @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); }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; import "../IERC20Upgradeable.sol"; /** * @dev Interface for the optional metadata functions from the ERC20 standard. * * _Available since v4.1._ */ interface IERC20MetadataUpgradeable is IERC20Upgradeable { /** * @dev Returns the name of the token. */ function name() external view returns (string memory); /** * @dev Returns the symbol of the token. */ function symbol() external view returns (string memory); /** * @dev Returns the decimals places of the token. */ function decimals() external view returns (uint8); }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; import "../proxy/utils/Initializable.sol"; /* * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract ContextUpgradeable is Initializable { function __Context_init() internal initializer { __Context_init_unchained(); } function __Context_init_unchained() internal initializer { } function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691 return msg.data; } uint256[50] private __gap; }
// SPDX-License-Identifier: MIT // solhint-disable-next-line compiler-version pragma solidity ^0.8.0; /** * @dev This is a base contract to aid in writing upgradeable contracts, or any kind of contract that will be deployed * behind a proxy. Since a proxied contract can't have a constructor, it's common to move constructor logic to an * external initializer function, usually called `initialize`. It then becomes necessary to protect this initializer * function so it can only be called once. The {initializer} modifier provided by this contract will have this effect. * * TIP: To avoid leaving the proxy in an uninitialized state, the initializer function should be called as early as * possible by providing the encoded function call as the `_data` argument to {ERC1967Proxy-constructor}. * * CAUTION: When used with inheritance, manual care must be taken to not invoke a parent initializer twice, or to ensure * that all initializers are idempotent. This is not verified automatically as constructors are by Solidity. */ abstract 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 protect an initializer function from being invoked twice. */ modifier initializer() { require(_initializing || !_initialized, "Initializable: contract is already initialized"); bool isTopLevelCall = !_initializing; if (isTopLevelCall) { _initializing = true; _initialized = true; } _; if (isTopLevelCall) { _initializing = false; } } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; import "../IERC20.sol"; import "../../../utils/Address.sol"; /** * @title SafeERC20 * @dev Wrappers around ERC20 operations that throw on failure (when the token * contract returns false). Tokens that return no value (and instead revert or * throw on failure) are also supported, non-reverting calls are assumed to be * successful. * To use this library you can add a `using SafeERC20 for IERC20;` statement to your contract, * which allows you to call the safe operations as `token.safeTransfer(...)`, etc. */ library SafeERC20 { using Address for address; function safeTransfer(IERC20 token, address to, uint256 value) internal { _callOptionalReturn(token, abi.encodeWithSelector(token.transfer.selector, to, value)); } function safeTransferFrom(IERC20 token, address from, address to, uint256 value) internal { _callOptionalReturn(token, abi.encodeWithSelector(token.transferFrom.selector, from, to, value)); } /** * @dev Deprecated. This function has issues similar to the ones found in * {IERC20-approve}, and its usage is discouraged. * * Whenever possible, use {safeIncreaseAllowance} and * {safeDecreaseAllowance} instead. */ function safeApprove(IERC20 token, address spender, uint256 value) internal { // safeApprove should only be called when setting an initial allowance, // or when resetting it to zero. To increase and decrease it, use // 'safeIncreaseAllowance' and 'safeDecreaseAllowance' // solhint-disable-next-line max-line-length require((value == 0) || (token.allowance(address(this), spender) == 0), "SafeERC20: approve from non-zero to non-zero allowance" ); _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, value)); } function safeIncreaseAllowance(IERC20 token, address spender, uint256 value) internal { uint256 newAllowance = token.allowance(address(this), spender) + value; _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance)); } function safeDecreaseAllowance(IERC20 token, address spender, uint256 value) internal { unchecked { uint256 oldAllowance = token.allowance(address(this), spender); require(oldAllowance >= value, "SafeERC20: decreased allowance below zero"); uint256 newAllowance = oldAllowance - value; _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance)); } } /** * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement * on the return value: the return value is optional (but if data is returned, it must not be false). * @param token The token targeted by the call. * @param data The call data (encoded using abi.encode or one of its variants). */ function _callOptionalReturn(IERC20 token, bytes memory data) private { // We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since // we're implementing it ourselves. We use {Address.functionCall} to perform this call, which verifies that // the target address contains contract code and also asserts for success in the low-level call. bytes memory returndata = address(token).functionCall(data, "SafeERC20: low-level call failed"); if (returndata.length > 0) { // Return data is optional // solhint-disable-next-line max-line-length require(abi.decode(returndata, (bool)), "SafeERC20: ERC20 operation did not succeed"); } } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; /** * @dev Collection of functions related to the address type */ library Address { /** * @dev Returns true if `account` is a contract. * * [IMPORTANT] * ==== * It is unsafe to assume that an address for which this function returns * false is an externally-owned account (EOA) and not a contract. * * Among others, `isContract` will return false for the following * types of addresses: * * - an externally-owned account * - a contract in construction * - an address where a contract will be created * - an address where a contract lived, but was destroyed * ==== */ function isContract(address account) internal view returns (bool) { // This method relies on extcodesize, which returns 0 for contracts in // construction, since the code is only stored at the end of the // constructor execution. uint256 size; // solhint-disable-next-line no-inline-assembly assembly { size := extcodesize(account) } return size > 0; } /** * @dev Replacement for Solidity's `transfer`: sends `amount` wei to * `recipient`, forwarding all available gas and reverting on errors. * * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by `transfer`, making them unable to receive funds via * `transfer`. {sendValue} removes this limitation. * * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. * * IMPORTANT: because control is transferred to `recipient`, care must be * taken to not create reentrancy vulnerabilities. Consider using * {ReentrancyGuard} or the * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { require(address(this).balance >= amount, "Address: insufficient balance"); // solhint-disable-next-line avoid-low-level-calls, avoid-call-value (bool success, ) = recipient.call{ value: amount }(""); require(success, "Address: unable to send value, recipient may have reverted"); } /** * @dev Performs a Solidity function call using a low level `call`. A * plain`call` is an unsafe replacement for a function call: use this * function instead. * * If `target` reverts with a revert reason, it is bubbled up by this * function (like regular Solidity function calls). * * Returns the raw returned data. To convert to the expected return value, * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. * * Requirements: * * - `target` must be a contract. * - calling `target` with `data` must not revert. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCall(target, data, "Address: low-level call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with * `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data, string memory errorMessage) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but also transferring `value` wei to `target`. * * Requirements: * * - the calling contract must have an ETH balance of at least `value`. * - the called Solidity function must be `payable`. * * _Available since v3.1._ */ function functionCallWithValue(address target, bytes memory data, uint256 value) internal returns (bytes memory) { return functionCallWithValue(target, data, value, "Address: low-level call with value failed"); } /** * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but * with `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCallWithValue(address target, bytes memory data, uint256 value, string memory errorMessage) internal returns (bytes memory) { require(address(this).balance >= value, "Address: insufficient balance for call"); require(isContract(target), "Address: call to non-contract"); // solhint-disable-next-line avoid-low-level-calls (bool success, bytes memory returndata) = target.call{ value: value }(data); return _verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) { return functionStaticCall(target, data, "Address: low-level static call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall(address target, bytes memory data, string memory errorMessage) internal view returns (bytes memory) { require(isContract(target), "Address: static call to non-contract"); // solhint-disable-next-line avoid-low-level-calls (bool success, bytes memory returndata) = target.staticcall(data); return _verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { return functionDelegateCall(target, data, "Address: low-level delegate call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall(address target, bytes memory data, string memory errorMessage) internal returns (bytes memory) { require(isContract(target), "Address: delegate call to non-contract"); // solhint-disable-next-line avoid-low-level-calls (bool success, bytes memory returndata) = target.delegatecall(data); return _verifyCallResult(success, returndata, errorMessage); } function _verifyCallResult(bool success, bytes memory returndata, string memory errorMessage) private pure returns(bytes memory) { if (success) { return returndata; } else { // Look for revert reason and bubble it up if present if (returndata.length > 0) { // The easiest way to bubble the revert reason is using memory via assembly // solhint-disable-next-line no-inline-assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; import "../utils/ContextUpgradeable.sol"; import "../proxy/utils/Initializable.sol"; /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * By default, the owner account will be the one that deploys the contract. This * can later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ abstract contract OwnableUpgradeable is Initializable, ContextUpgradeable { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ function __Ownable_init() internal initializer { __Context_init_unchained(); __Ownable_init_unchained(); } function __Ownable_init_unchained() internal initializer { address msgSender = _msgSender(); _owner = msgSender; emit OwnershipTransferred(address(0), msgSender); } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { require(owner() == _msgSender(), "Ownable: caller is not the owner"); _; } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions anymore. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby removing any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { 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 virtual onlyOwner { require(newOwner != address(0), "Ownable: new owner is the zero address"); emit OwnershipTransferred(_owner, newOwner); _owner = newOwner; } uint256[49] private __gap; }
{ "metadata": { "useLiteralContent": true }, "optimizer": { "enabled": true, "runs": 200 }, "outputSelection": { "*": { "*": [ "evm.bytecode", "evm.deployedBytecode", "abi" ] } } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"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"},{"inputs":[{"internalType":"uint256","name":"tokenfyAmount","type":"uint256"}],"name":"addStakingRewards","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"subtractedValue","type":"uint256"}],"name":"decreaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"addedValue","type":"uint256"}],"name":"increaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"tokenfy","type":"address"}],"name":"initialize","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"remainingRewards","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"rewardsEnd","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"rewardsStart","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenfyAmount","type":"uint256"}],"name":"stake","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"stakingRewards","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"newStart","type":"uint256"},{"internalType":"uint256","name":"newDuration","type":"uint256"}],"name":"startPeriod","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tokenfyToken","outputs":[{"internalType":"contract IERC20","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalTokenfy","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"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"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"share","type":"uint256"}],"name":"unstake","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
608060405234801561001057600080fd5b50611a38806100206000396000f3fe608060405234801561001057600080fd5b50600436106101735760003560e01c80638da5cb5b116100de578063afb62e5611610097578063d9c51cd411610071578063d9c51cd414610308578063dd62ed3e1461031b578063f2fde38b14610354578063f9d29b681461036757600080fd5b8063afb62e56146102da578063c4d66de8146102e2578063c8e99ee1146102f557600080fd5b80638da5cb5b1461026b57806395d89b4114610290578063a457c2d714610298578063a694fc3a146102ab578063a6d14d69146102be578063a9059cbb146102c757600080fd5b8063313ce56711610130578063313ce56714610206578063395093511461021557806364b87a701461022857806365af3a2f1461023157806370a082311461023a578063715018a61461026357600080fd5b806306fdde0314610178578063095ea7b314610196578063107d1d55146101b957806318160ddd146101ce57806323b872dd146101e05780632e17de78146101f3575b600080fd5b61018061036f565b60405161018d9190611729565b60405180910390f35b6101a96101a4366004611778565b610401565b604051901515815260200161018d565b6101cc6101c73660046117a2565b610417565b005b6035545b60405190815260200161018d565b6101a96101ee3660046117c4565b610568565b6101cc610201366004611800565b61061b565b6040516012815260200161018d565b6101a9610223366004611778565b6106c5565b6101d260995481565b6101d260985481565b6101d2610248366004611819565b6001600160a01b031660009081526033602052604090205490565b6101cc6106fc565b6065546001600160a01b03165b6040516001600160a01b03909116815260200161018d565b610180610770565b6101a96102a6366004611778565b61077f565b6101cc6102b9366004611800565b61081a565b6101d260975481565b6101a96102d5366004611778565b6108de565b6101d26108eb565b6101cc6102f0366004611819565b61095b565b609a54610278906001600160a01b031681565b6101cc610316366004611800565b610a33565b6101d2610329366004611834565b6001600160a01b03918216600090815260346020908152604080832093909416825291909152205490565b6101cc610362366004611819565b610ab6565b6101d2610ba1565b60606036805461037e90611867565b80601f01602080910402602001604051908101604052809291908181526020018280546103aa90611867565b80156103f75780601f106103cc576101008083540402835291602001916103f7565b820191906000526020600020905b8154815290600101906020018083116103da57829003601f168201915b5050505050905090565b600061040e338484610c26565b50600192915050565b6065546001600160a01b0316331461044a5760405162461bcd60e51b8152600401610441906118a2565b60405180910390fd5b4282101561049a5760405162461bcd60e51b815260206004820152601760248201527f73546f6b656e66793a20696e76616c69642073746172740000000000000000006044820152606401610441565b600081116104ea5760405162461bcd60e51b815260206004820152601a60248201527f73546f6b656e66793a20696e76616c6964206475726174696f6e0000000000006044820152606401610441565b426097541061054a5760405162461bcd60e51b815260206004820152602660248201527f73546f6b656e66793a206c6173742072657761726420706572696f64206e6f7460448201526508195b99195960d21b6064820152608401610441565b600061055682846118ed565b60989390935550506097556000609955565b6000610575848484610d4b565b6001600160a01b0384166000908152603460209081526040808320338452909152902054828110156105fa5760405162461bcd60e51b815260206004820152602860248201527f45524332303a207472616e7366657220616d6f756e74206578636565647320616044820152676c6c6f77616e636560c01b6064820152608401610441565b61060e85336106098685611905565b610c26565b60019150505b9392505050565b6000811161066b5760405162461bcd60e51b815260206004820152601760248201527f73546f6b656e66793a20696e76616c69642073686172650000000000000000006044820152606401610441565b6000610675610ba1565b9050600061068260355490565b905061068e3384610f23565b60008161069b848661191c565b6106a5919061193b565b609a549091506106bf906001600160a01b03163383611072565b50505050565b3360008181526034602090815260408083206001600160a01b0387168452909152812054909161040e9185906106099086906118ed565b6065546001600160a01b031633146107265760405162461bcd60e51b8152600401610441906118a2565b6065546040516000916001600160a01b0316907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3606580546001600160a01b0319169055565b60606037805461037e90611867565b3360009081526034602090815260408083206001600160a01b0386168452909152812054828110156108015760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77604482015264207a65726f60d81b6064820152608401610441565b61081033856106098685611905565b5060019392505050565b6000811161086a5760405162461bcd60e51b815260206004820152601860248201527f73546f6b656e66793a20696e76616c696420616d6f756e7400000000000000006044820152606401610441565b6000610874610ba1565b9050600061088160355490565b609a5490915061089c906001600160a01b03163330866110d5565b8015806108a7575081155b156108bb576108b6338461110d565b505050565b6000826108c8838661191c565b6108d2919061193b565b90506106bf338261110d565b600061040e338484610d4b565b6000804290506000806098546097546109049190611905565b905060985483116109175780915061093a565b6097548310610929576000915061093a565b826097546109379190611905565b91505b8060995483610949919061191c565b610953919061193b565b935050505090565b600054610100900460ff1680610974575060005460ff16155b6109905760405162461bcd60e51b81526004016104419061195d565b600054610100900460ff161580156109b2576000805461ffff19166101011790555b6109fa6040518060400160405280600881526020016773546f6b656e667960c01b8152506040518060400160405280600681526020016573544b4e465960d01b8152506111ec565b610a0261126b565b609a80546001600160a01b0319166001600160a01b0384161790558015610a2f576000805461ff00191690555b5050565b6097544210610a845760405162461bcd60e51b815260206004820152601b60248201527f73546f6b656e66793a2063616e277420616464207265776172647300000000006044820152606401610441565b609a54610a9c906001600160a01b03163330846110d5565b8060996000828254610aae91906118ed565b909155505050565b6065546001600160a01b03163314610ae05760405162461bcd60e51b8152600401610441906118a2565b6001600160a01b038116610b455760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610441565b6065546040516001600160a01b038084169216907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3606580546001600160a01b0319166001600160a01b0392909216919091179055565b6000610bab6108eb565b609a546040516370a0823160e01b81523060048201526001600160a01b03909116906370a0823190602401602060405180830381865afa158015610bf3573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c1791906119ab565b610c219190611905565b905090565b6001600160a01b038316610c885760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b6064820152608401610441565b6001600160a01b038216610ce95760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b6064820152608401610441565b6001600160a01b0383811660008181526034602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591015b60405180910390a3505050565b6001600160a01b038316610daf5760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b6064820152608401610441565b6001600160a01b038216610e115760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201526265737360e81b6064820152608401610441565b6001600160a01b03831660009081526033602052604090205481811015610e895760405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e7420657863656564732062604482015265616c616e636560d01b6064820152608401610441565b610e938282611905565b6001600160a01b038086166000908152603360205260408082209390935590851681529081208054849290610ec99084906118ed565b92505081905550826001600160a01b0316846001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef84604051610f1591815260200190565b60405180910390a350505050565b6001600160a01b038216610f835760405162461bcd60e51b815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f206164647265736044820152607360f81b6064820152608401610441565b6001600160a01b03821660009081526033602052604090205481811015610ff75760405162461bcd60e51b815260206004820152602260248201527f45524332303a206275726e20616d6f756e7420657863656564732062616c616e604482015261636560f01b6064820152608401610441565b6110018282611905565b6001600160a01b0384166000908152603360205260408120919091556035805484929061102f908490611905565b90915550506040518281526000906001600160a01b038516907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef90602001610d3e565b6040516001600160a01b0383166024820152604481018290526108b690849063a9059cbb60e01b906064015b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b03199093169290921790915261131a565b6040516001600160a01b03808516602483015283166044820152606481018290526106bf9085906323b872dd60e01b9060840161109e565b6001600160a01b0382166111635760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f2061646472657373006044820152606401610441565b806035600082825461117591906118ed565b90915550506001600160a01b038216600090815260336020526040812080548392906111a29084906118ed565b90915550506040518181526001600160a01b038316906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a35050565b600054610100900460ff1680611205575060005460ff16155b6112215760405162461bcd60e51b81526004016104419061195d565b600054610100900460ff16158015611243576000805461ffff19166101011790555b61124b6113ec565b6112558383611457565b80156108b6576000805461ff0019169055505050565b600054610100900460ff1680611284575060005460ff16155b6112a05760405162461bcd60e51b81526004016104419061195d565b600054610100900460ff161580156112c2576000805461ffff19166101011790555b606580546001600160a01b0319163390811790915560405181906000907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a3508015611317576000805461ff00191690555b50565b600061136f826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b03166114ec9092919063ffffffff16565b8051909150156108b6578080602001905181019061138d91906119c4565b6108b65760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b6064820152608401610441565b600054610100900460ff1680611405575060005460ff16155b6114215760405162461bcd60e51b81526004016104419061195d565b600054610100900460ff16158015611443576000805461ffff19166101011790555b8015611317576000805461ff001916905550565b600054610100900460ff1680611470575060005460ff16155b61148c5760405162461bcd60e51b81526004016104419061195d565b600054610100900460ff161580156114ae576000805461ffff19166101011790555b82516114c1906036906020860190611664565b5081516114d5906037906020850190611664565b5080156108b6576000805461ff0019169055505050565b60606114fb8484600085611503565b949350505050565b6060824710156115645760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b6064820152608401610441565b843b6115b25760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610441565b600080866001600160a01b031685876040516115ce91906119e6565b60006040518083038185875af1925050503d806000811461160b576040519150601f19603f3d011682016040523d82523d6000602084013e611610565b606091505b509150915061162082828661162b565b979650505050505050565b6060831561163a575081610614565b82511561164a5782518084602001fd5b8160405162461bcd60e51b81526004016104419190611729565b82805461167090611867565b90600052602060002090601f01602090048101928261169257600085556116d8565b82601f106116ab57805160ff19168380011785556116d8565b828001600101855582156116d8579182015b828111156116d85782518255916020019190600101906116bd565b506116e49291506116e8565b5090565b5b808211156116e457600081556001016116e9565b60005b83811015611718578181015183820152602001611700565b838111156106bf5750506000910152565b60208152600082518060208401526117488160408501602087016116fd565b601f01601f19169190910160400192915050565b80356001600160a01b038116811461177357600080fd5b919050565b6000806040838503121561178b57600080fd5b6117948361175c565b946020939093013593505050565b600080604083850312156117b557600080fd5b50508035926020909101359150565b6000806000606084860312156117d957600080fd5b6117e28461175c565b92506117f06020850161175c565b9150604084013590509250925092565b60006020828403121561181257600080fd5b5035919050565b60006020828403121561182b57600080fd5b6106148261175c565b6000806040838503121561184757600080fd5b6118508361175c565b915061185e6020840161175c565b90509250929050565b600181811c9082168061187b57607f821691505b6020821081141561189c57634e487b7160e01b600052602260045260246000fd5b50919050565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b634e487b7160e01b600052601160045260246000fd5b60008219821115611900576119006118d7565b500190565b600082821015611917576119176118d7565b500390565b6000816000190483118215151615611936576119366118d7565b500290565b60008261195857634e487b7160e01b600052601260045260246000fd5b500490565b6020808252602e908201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160408201526d191e481a5b9a5d1a585b1a5e995960921b606082015260800190565b6000602082840312156119bd57600080fd5b5051919050565b6000602082840312156119d657600080fd5b8151801515811461061457600080fd5b600082516119f88184602087016116fd565b919091019291505056fea26469706673582212205349c6fa043af1eea60f954ee45436508256a88c592f0decefbc41dc02185f4d64736f6c634300080b0033
Deployed Bytecode
0x608060405234801561001057600080fd5b50600436106101735760003560e01c80638da5cb5b116100de578063afb62e5611610097578063d9c51cd411610071578063d9c51cd414610308578063dd62ed3e1461031b578063f2fde38b14610354578063f9d29b681461036757600080fd5b8063afb62e56146102da578063c4d66de8146102e2578063c8e99ee1146102f557600080fd5b80638da5cb5b1461026b57806395d89b4114610290578063a457c2d714610298578063a694fc3a146102ab578063a6d14d69146102be578063a9059cbb146102c757600080fd5b8063313ce56711610130578063313ce56714610206578063395093511461021557806364b87a701461022857806365af3a2f1461023157806370a082311461023a578063715018a61461026357600080fd5b806306fdde0314610178578063095ea7b314610196578063107d1d55146101b957806318160ddd146101ce57806323b872dd146101e05780632e17de78146101f3575b600080fd5b61018061036f565b60405161018d9190611729565b60405180910390f35b6101a96101a4366004611778565b610401565b604051901515815260200161018d565b6101cc6101c73660046117a2565b610417565b005b6035545b60405190815260200161018d565b6101a96101ee3660046117c4565b610568565b6101cc610201366004611800565b61061b565b6040516012815260200161018d565b6101a9610223366004611778565b6106c5565b6101d260995481565b6101d260985481565b6101d2610248366004611819565b6001600160a01b031660009081526033602052604090205490565b6101cc6106fc565b6065546001600160a01b03165b6040516001600160a01b03909116815260200161018d565b610180610770565b6101a96102a6366004611778565b61077f565b6101cc6102b9366004611800565b61081a565b6101d260975481565b6101a96102d5366004611778565b6108de565b6101d26108eb565b6101cc6102f0366004611819565b61095b565b609a54610278906001600160a01b031681565b6101cc610316366004611800565b610a33565b6101d2610329366004611834565b6001600160a01b03918216600090815260346020908152604080832093909416825291909152205490565b6101cc610362366004611819565b610ab6565b6101d2610ba1565b60606036805461037e90611867565b80601f01602080910402602001604051908101604052809291908181526020018280546103aa90611867565b80156103f75780601f106103cc576101008083540402835291602001916103f7565b820191906000526020600020905b8154815290600101906020018083116103da57829003601f168201915b5050505050905090565b600061040e338484610c26565b50600192915050565b6065546001600160a01b0316331461044a5760405162461bcd60e51b8152600401610441906118a2565b60405180910390fd5b4282101561049a5760405162461bcd60e51b815260206004820152601760248201527f73546f6b656e66793a20696e76616c69642073746172740000000000000000006044820152606401610441565b600081116104ea5760405162461bcd60e51b815260206004820152601a60248201527f73546f6b656e66793a20696e76616c6964206475726174696f6e0000000000006044820152606401610441565b426097541061054a5760405162461bcd60e51b815260206004820152602660248201527f73546f6b656e66793a206c6173742072657761726420706572696f64206e6f7460448201526508195b99195960d21b6064820152608401610441565b600061055682846118ed565b60989390935550506097556000609955565b6000610575848484610d4b565b6001600160a01b0384166000908152603460209081526040808320338452909152902054828110156105fa5760405162461bcd60e51b815260206004820152602860248201527f45524332303a207472616e7366657220616d6f756e74206578636565647320616044820152676c6c6f77616e636560c01b6064820152608401610441565b61060e85336106098685611905565b610c26565b60019150505b9392505050565b6000811161066b5760405162461bcd60e51b815260206004820152601760248201527f73546f6b656e66793a20696e76616c69642073686172650000000000000000006044820152606401610441565b6000610675610ba1565b9050600061068260355490565b905061068e3384610f23565b60008161069b848661191c565b6106a5919061193b565b609a549091506106bf906001600160a01b03163383611072565b50505050565b3360008181526034602090815260408083206001600160a01b0387168452909152812054909161040e9185906106099086906118ed565b6065546001600160a01b031633146107265760405162461bcd60e51b8152600401610441906118a2565b6065546040516000916001600160a01b0316907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3606580546001600160a01b0319169055565b60606037805461037e90611867565b3360009081526034602090815260408083206001600160a01b0386168452909152812054828110156108015760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77604482015264207a65726f60d81b6064820152608401610441565b61081033856106098685611905565b5060019392505050565b6000811161086a5760405162461bcd60e51b815260206004820152601860248201527f73546f6b656e66793a20696e76616c696420616d6f756e7400000000000000006044820152606401610441565b6000610874610ba1565b9050600061088160355490565b609a5490915061089c906001600160a01b03163330866110d5565b8015806108a7575081155b156108bb576108b6338461110d565b505050565b6000826108c8838661191c565b6108d2919061193b565b90506106bf338261110d565b600061040e338484610d4b565b6000804290506000806098546097546109049190611905565b905060985483116109175780915061093a565b6097548310610929576000915061093a565b826097546109379190611905565b91505b8060995483610949919061191c565b610953919061193b565b935050505090565b600054610100900460ff1680610974575060005460ff16155b6109905760405162461bcd60e51b81526004016104419061195d565b600054610100900460ff161580156109b2576000805461ffff19166101011790555b6109fa6040518060400160405280600881526020016773546f6b656e667960c01b8152506040518060400160405280600681526020016573544b4e465960d01b8152506111ec565b610a0261126b565b609a80546001600160a01b0319166001600160a01b0384161790558015610a2f576000805461ff00191690555b5050565b6097544210610a845760405162461bcd60e51b815260206004820152601b60248201527f73546f6b656e66793a2063616e277420616464207265776172647300000000006044820152606401610441565b609a54610a9c906001600160a01b03163330846110d5565b8060996000828254610aae91906118ed565b909155505050565b6065546001600160a01b03163314610ae05760405162461bcd60e51b8152600401610441906118a2565b6001600160a01b038116610b455760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610441565b6065546040516001600160a01b038084169216907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3606580546001600160a01b0319166001600160a01b0392909216919091179055565b6000610bab6108eb565b609a546040516370a0823160e01b81523060048201526001600160a01b03909116906370a0823190602401602060405180830381865afa158015610bf3573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c1791906119ab565b610c219190611905565b905090565b6001600160a01b038316610c885760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b6064820152608401610441565b6001600160a01b038216610ce95760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b6064820152608401610441565b6001600160a01b0383811660008181526034602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591015b60405180910390a3505050565b6001600160a01b038316610daf5760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b6064820152608401610441565b6001600160a01b038216610e115760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201526265737360e81b6064820152608401610441565b6001600160a01b03831660009081526033602052604090205481811015610e895760405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e7420657863656564732062604482015265616c616e636560d01b6064820152608401610441565b610e938282611905565b6001600160a01b038086166000908152603360205260408082209390935590851681529081208054849290610ec99084906118ed565b92505081905550826001600160a01b0316846001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef84604051610f1591815260200190565b60405180910390a350505050565b6001600160a01b038216610f835760405162461bcd60e51b815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f206164647265736044820152607360f81b6064820152608401610441565b6001600160a01b03821660009081526033602052604090205481811015610ff75760405162461bcd60e51b815260206004820152602260248201527f45524332303a206275726e20616d6f756e7420657863656564732062616c616e604482015261636560f01b6064820152608401610441565b6110018282611905565b6001600160a01b0384166000908152603360205260408120919091556035805484929061102f908490611905565b90915550506040518281526000906001600160a01b038516907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef90602001610d3e565b6040516001600160a01b0383166024820152604481018290526108b690849063a9059cbb60e01b906064015b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b03199093169290921790915261131a565b6040516001600160a01b03808516602483015283166044820152606481018290526106bf9085906323b872dd60e01b9060840161109e565b6001600160a01b0382166111635760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f2061646472657373006044820152606401610441565b806035600082825461117591906118ed565b90915550506001600160a01b038216600090815260336020526040812080548392906111a29084906118ed565b90915550506040518181526001600160a01b038316906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a35050565b600054610100900460ff1680611205575060005460ff16155b6112215760405162461bcd60e51b81526004016104419061195d565b600054610100900460ff16158015611243576000805461ffff19166101011790555b61124b6113ec565b6112558383611457565b80156108b6576000805461ff0019169055505050565b600054610100900460ff1680611284575060005460ff16155b6112a05760405162461bcd60e51b81526004016104419061195d565b600054610100900460ff161580156112c2576000805461ffff19166101011790555b606580546001600160a01b0319163390811790915560405181906000907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a3508015611317576000805461ff00191690555b50565b600061136f826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b03166114ec9092919063ffffffff16565b8051909150156108b6578080602001905181019061138d91906119c4565b6108b65760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b6064820152608401610441565b600054610100900460ff1680611405575060005460ff16155b6114215760405162461bcd60e51b81526004016104419061195d565b600054610100900460ff16158015611443576000805461ffff19166101011790555b8015611317576000805461ff001916905550565b600054610100900460ff1680611470575060005460ff16155b61148c5760405162461bcd60e51b81526004016104419061195d565b600054610100900460ff161580156114ae576000805461ffff19166101011790555b82516114c1906036906020860190611664565b5081516114d5906037906020850190611664565b5080156108b6576000805461ff0019169055505050565b60606114fb8484600085611503565b949350505050565b6060824710156115645760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b6064820152608401610441565b843b6115b25760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610441565b600080866001600160a01b031685876040516115ce91906119e6565b60006040518083038185875af1925050503d806000811461160b576040519150601f19603f3d011682016040523d82523d6000602084013e611610565b606091505b509150915061162082828661162b565b979650505050505050565b6060831561163a575081610614565b82511561164a5782518084602001fd5b8160405162461bcd60e51b81526004016104419190611729565b82805461167090611867565b90600052602060002090601f01602090048101928261169257600085556116d8565b82601f106116ab57805160ff19168380011785556116d8565b828001600101855582156116d8579182015b828111156116d85782518255916020019190600101906116bd565b506116e49291506116e8565b5090565b5b808211156116e457600081556001016116e9565b60005b83811015611718578181015183820152602001611700565b838111156106bf5750506000910152565b60208152600082518060208401526117488160408501602087016116fd565b601f01601f19169190910160400192915050565b80356001600160a01b038116811461177357600080fd5b919050565b6000806040838503121561178b57600080fd5b6117948361175c565b946020939093013593505050565b600080604083850312156117b557600080fd5b50508035926020909101359150565b6000806000606084860312156117d957600080fd5b6117e28461175c565b92506117f06020850161175c565b9150604084013590509250925092565b60006020828403121561181257600080fd5b5035919050565b60006020828403121561182b57600080fd5b6106148261175c565b6000806040838503121561184757600080fd5b6118508361175c565b915061185e6020840161175c565b90509250929050565b600181811c9082168061187b57607f821691505b6020821081141561189c57634e487b7160e01b600052602260045260246000fd5b50919050565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b634e487b7160e01b600052601160045260246000fd5b60008219821115611900576119006118d7565b500190565b600082821015611917576119176118d7565b500390565b6000816000190483118215151615611936576119366118d7565b500290565b60008261195857634e487b7160e01b600052601260045260246000fd5b500490565b6020808252602e908201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160408201526d191e481a5b9a5d1a585b1a5e995960921b606082015260800190565b6000602082840312156119bd57600080fd5b5051919050565b6000602082840312156119d657600080fd5b8151801515811461061457600080fd5b600082516119f88184602087016116fd565b919091019291505056fea26469706673582212205349c6fa043af1eea60f954ee45436508256a88c592f0decefbc41dc02185f4d64736f6c634300080b0033
Deployed Bytecode Sourcemap
336:3039:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2439:98:3;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;4536:166;;;;;;:::i;:::-;;:::i;:::-;;;1267:14:10;;1260:22;1242:41;;1230:2;1215:18;4536:166:3;1102:187:10;2165:465:0;;;;;;:::i;:::-;;:::i;:::-;;3527:106:3;3614:12;;3527:106;;;1693:25:10;;;1681:2;1666:18;3527:106:3;1547:177:10;5169:414:3;;;;;;:::i;:::-;;:::i;1425:360:0:-;;;;;;:::i;:::-;;:::i;3376:91:3:-;;;3458:2;2389:36:10;;2377:2;2362:18;3376:91:3;2247:184:10;5978:212:3;;;;;;:::i;:::-;;:::i;498:29:0:-;;;;;;464:27;;;;;;3691:125:3;;;;;;:::i;:::-;-1:-1:-1;;;;;3791:18:3;3765:7;3791:18;;;:9;:18;;;;;;;3691:125;1965:145:1;;;:::i;1333:85::-;1405:6;;-1:-1:-1;;;;;1405:6:1;1333:85;;;-1:-1:-1;;;;;2791:32:10;;;2773:51;;2761:2;2746:18;1333:85:1;2627:203:10;2650:102:3;;;:::i;6677:371::-;;;;;;:::i;:::-;;:::i;812:527:0:-;;;;;;:::i;:::-;;:::i;433:25::-;;;;;;4019:172:3;;;;;;:::i;:::-;;:::i;2899:469:0:-;;;:::i;567:197::-;;;;;;:::i;:::-;;:::i;534:26::-;;;;;-1:-1:-1;;;;;534:26:0;;;1839:267;;;;;;:::i;:::-;;:::i;4249:149:3:-;;;;;;:::i;:::-;-1:-1:-1;;;;;4364:18:3;;;4338:7;4364:18;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;4249:149;2259:240:1;;;;;;:::i;:::-;;:::i;2705:135:0:-;;;:::i;2439:98:3:-;2493:13;2525:5;2518:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2439:98;:::o;4536:166::-;4619:4;4635:39;901:10:6;4658:7:3;4667:6;4635:8;:39::i;:::-;-1:-1:-1;4691:4:3;4536:166;;;;:::o;2165:465:0:-;1405:6:1;;-1:-1:-1;;;;;1405:6:1;901:10:6;1545:23:1;1537:68;;;;-1:-1:-1;;;1537:68:1;;;;;;;:::i;:::-;;;;;;;;;2272:15:0::1;2260:8;:27;;2252:63;;;::::0;-1:-1:-1;;;2252:63:0;;4271:2:10;2252:63:0::1;::::0;::::1;4253:21:10::0;4310:2;4290:18;;;4283:30;4349:25;4329:18;;;4322:53;4392:18;;2252:63:0::1;4069:347:10::0;2252:63:0::1;2347:1;2333:11;:15;2325:54;;;::::0;-1:-1:-1;;;2325:54:0;;4623:2:10;2325:54:0::1;::::0;::::1;4605:21:10::0;4662:2;4642:18;;;4635:30;4701:28;4681:18;;;4674:56;4747:18;;2325:54:0::1;4421:350:10::0;2325:54:0::1;2411:15;2398:10;;:28;2390:79;;;::::0;-1:-1:-1;;;2390:79:0;;4978:2:10;2390:79:0::1;::::0;::::1;4960:21:10::0;5017:2;4997:18;;;4990:30;5056:34;5036:18;;;5029:62;-1:-1:-1;;;5107:18:10;;;5100:36;5153:19;;2390:79:0::1;4776:402:10::0;2390:79:0::1;2480:21;2504:22;2515:11:::0;2504:8;:22:::1;:::i;:::-;2536:12;:23:::0;;;;-1:-1:-1;;2569:10:0::1;:26:::0;-1:-1:-1;2605:14:0::1;:18:::0;2165:465::o;5169:414:3:-;5275:4;5291:36;5301:6;5309:9;5320:6;5291:9;:36::i;:::-;-1:-1:-1;;;;;5365:19:3;;5338:24;5365:19;;;:11;:19;;;;;;;;901:10:6;5365:33:3;;;;;;;;5416:26;;;;5408:79;;;;-1:-1:-1;;;5408:79:3;;5650:2:10;5408:79:3;;;5632:21:10;5689:2;5669:18;;;5662:30;5728:34;5708:18;;;5701:62;-1:-1:-1;;;5779:18:10;;;5772:38;5827:19;;5408:79:3;5448:404:10;5408:79:3;5497:57;5506:6;901:10:6;5528:25:3;5547:6;5528:16;:25;:::i;:::-;5497:8;:57::i;:::-;5572:4;5565:11;;;5169:414;;;;;;:::o;1425:360:0:-;1492:1;1484:5;:9;1476:45;;;;-1:-1:-1;;;1476:45:0;;6189:2:10;1476:45:0;;;6171:21:10;6228:2;6208:18;;;6201:30;6267:25;6247:18;;;6240:53;6310:18;;1476:45:0;5987:347:10;1476:45:0;1532:19;1554:14;:12;:14::i;:::-;1532:36;;1578:19;1600:13;3614:12:3;;;3527:106;1600:13:0;1578:35;;1624:24;1630:10;1642:5;1624;:24::i;:::-;1659:21;1705:11;1683:19;1691:11;1683:5;:19;:::i;:::-;:33;;;;:::i;:::-;1726:12;;1659:57;;-1:-1:-1;1726:52:0;;-1:-1:-1;;;;;1726:12:0;1752:10;1659:57;1726:25;:52::i;:::-;1466:319;;;1425:360;:::o;5978:212:3:-;901:10:6;6066:4:3;6114:25;;;:11;:25;;;;;;;;-1:-1:-1;;;;;6114:34:3;;;;;;;;;;6066:4;;6082:80;;6105:7;;6114:47;;6151:10;;6114:47;:::i;1965:145:1:-;1405:6;;-1:-1:-1;;;;;1405:6:1;901:10:6;1545:23:1;1537:68;;;;-1:-1:-1;;;1537:68:1;;;;;;;:::i;:::-;2055:6:::1;::::0;2034:40:::1;::::0;2071:1:::1;::::0;-1:-1:-1;;;;;2055:6:1::1;::::0;2034:40:::1;::::0;2071:1;;2034:40:::1;2084:6;:19:::0;;-1:-1:-1;;;;;;2084:19:1::1;::::0;;1965:145::o;2650:102:3:-;2706:13;2738:7;2731:14;;;;;:::i;6677:371::-;901:10:6;6770:4:3;6813:25;;;:11;:25;;;;;;;;-1:-1:-1;;;;;6813:34:3;;;;;;;;;;6865:35;;;;6857:85;;;;-1:-1:-1;;;6857:85:3;;6936:2:10;6857:85:3;;;6918:21:10;6975:2;6955:18;;;6948:30;7014:34;6994:18;;;6987:62;-1:-1:-1;;;7065:18:10;;;7058:35;7110:19;;6857:85:3;6734:401:10;6857:85:3;6952:67;901:10:6;6975:7:3;6984:34;7003:15;6984:16;:34;:::i;6952:67::-;-1:-1:-1;7037:4:3;;6677:371;-1:-1:-1;;;6677:371:3:o;812:527:0:-;893:1;877:13;:17;869:54;;;;-1:-1:-1;;;869:54:0;;7342:2:10;869:54:0;;;7324:21:10;7381:2;7361:18;;;7354:30;7420:26;7400:18;;;7393:54;7464:18;;869:54:0;7140:348:10;869:54:0;934:19;956:14;:12;:14::i;:::-;934:36;;980:19;1002:13;3614:12:3;;;3527:106;1002:13:0;1026:12;;980:35;;-1:-1:-1;1026:71:0;;-1:-1:-1;;;;;1026:12:0;1056:10;1076:4;1083:13;1026:29;:71::i;:::-;1112:16;;;:36;;-1:-1:-1;1132:16:0;;1112:36;1108:225;;;1164:32;1170:10;1182:13;1164:5;:32::i;:::-;859:480;;812:527;:::o;1108:225::-;1227:13;1273:11;1243:27;1259:11;1243:13;:27;:::i;:::-;:41;;;;:::i;:::-;1227:57;;1298:24;1304:10;1316:5;1298;:24::i;4019:172:3:-;4105:4;4121:42;901:10:6;4145:9:3;4156:6;4121:9;:42::i;2899:469:0:-;2947:7;2966:12;2981:15;2966:30;;3006:21;3037:16;3069:12;;3056:10;;:25;;;;:::i;:::-;3037:44;;3104:12;;3096:4;:20;3092:211;;3148:8;3132:24;;3092:211;;;3185:10;;3177:4;:18;3173:130;;3227:1;3211:17;;3173:130;;;3288:4;3275:10;;:17;;;;:::i;:::-;3259:33;;3173:130;3353:8;3336:14;;3320:13;:30;;;;:::i;:::-;:41;;;;:::i;:::-;3313:48;;;;;2899:469;:::o;567:197::-;1456:13:2;;;;;;;;:30;;-1:-1:-1;1474:12:2;;;;1473:13;1456:30;1448:89;;;;-1:-1:-1;;;1448:89:2;;;;;;;:::i;:::-;1548:19;1571:13;;;;;;1570:14;1594:98;;;;1628:13;:20;;-1:-1:-1;;1662:19:2;;;;;1594:98;647:34:0::1;;;;;;;;;;;;;;-1:-1:-1::0;;;647:34:0::1;;::::0;::::1;;;;;;;;;;;;;-1:-1:-1::0;;;647:34:0::1;;::::0;:12:::1;:34::i;:::-;691:26;:24;:26::i;:::-;727:12;:30:::0;;-1:-1:-1;;;;;;727:30:0::1;-1:-1:-1::0;;;;;727:30:0;::::1;;::::0;;1714:66:2;;;;1764:5;1748:21;;-1:-1:-1;;1748:21:2;;;1714:66;1438:348;567:197:0;:::o;1839:267::-;1934:10;;1916:15;:28;1908:68;;;;-1:-1:-1;;;1908:68:0;;8110:2:10;1908:68:0;;;8092:21:10;8149:2;8129:18;;;8122:30;8188:29;8168:18;;;8161:57;8235:18;;1908:68:0;7908:351:10;1908:68:0;1987:12;;:71;;-1:-1:-1;;;;;1987:12:0;2017:10;2037:4;2044:13;1987:29;:71::i;:::-;2086:13;2068:14;;:31;;;;;;;:::i;:::-;;;;-1:-1:-1;;;1839:267:0:o;2259:240:1:-;1405:6;;-1:-1:-1;;;;;1405:6:1;901:10:6;1545:23:1;1537:68;;;;-1:-1:-1;;;1537:68:1;;;;;;;:::i;:::-;-1:-1:-1;;;;;2347:22:1;::::1;2339:73;;;::::0;-1:-1:-1;;;2339:73:1;;8466:2:10;2339:73:1::1;::::0;::::1;8448:21:10::0;8505:2;8485:18;;;8478:30;8544:34;8524:18;;;8517:62;-1:-1:-1;;;8595:18:10;;;8588:36;8641:19;;2339:73:1::1;8264:402:10::0;2339:73:1::1;2448:6;::::0;2427:38:::1;::::0;-1:-1:-1;;;;;2427:38:1;;::::1;::::0;2448:6:::1;::::0;2427:38:::1;::::0;2448:6:::1;::::0;2427:38:::1;2475:6;:17:::0;;-1:-1:-1;;;;;;2475:17:1::1;-1:-1:-1::0;;;;;2475:17:1;;;::::1;::::0;;;::::1;::::0;;2259:240::o;2705:135:0:-;2749:7;2815:18;:16;:18::i;:::-;2775:12;;:37;;-1:-1:-1;;;2775:37:0;;2806:4;2775:37;;;2773:51:10;-1:-1:-1;;;;;2775:12:0;;;;:22;;2746:18:10;;2775:37:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:58;;;;:::i;:::-;2768:65;;2705:135;:::o;9941:340:3:-;-1:-1:-1;;;;;10042:19:3;;10034:68;;;;-1:-1:-1;;;10034:68:3;;9062:2:10;10034:68:3;;;9044:21:10;9101:2;9081:18;;;9074:30;9140:34;9120:18;;;9113:62;-1:-1:-1;;;9191:18:10;;;9184:34;9235:19;;10034:68:3;8860:400:10;10034:68:3;-1:-1:-1;;;;;10120:21:3;;10112:68;;;;-1:-1:-1;;;10112:68:3;;9467:2:10;10112:68:3;;;9449:21:10;9506:2;9486:18;;;9479:30;9545:34;9525:18;;;9518:62;-1:-1:-1;;;9596:18:10;;;9589:32;9638:19;;10112:68:3;9265:398:10;10112:68:3;-1:-1:-1;;;;;10191:18:3;;;;;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;:36;;;10242:32;;1693:25:10;;;10242:32:3;;1666:18:10;10242:32:3;;;;;;;;9941:340;;;:::o;7522:592::-;-1:-1:-1;;;;;7627:20:3;;7619:70;;;;-1:-1:-1;;;7619:70:3;;9870:2:10;7619:70:3;;;9852:21:10;9909:2;9889:18;;;9882:30;9948:34;9928:18;;;9921:62;-1:-1:-1;;;9999:18:10;;;9992:35;10044:19;;7619:70:3;9668:401:10;7619:70:3;-1:-1:-1;;;;;7707:23:3;;7699:71;;;;-1:-1:-1;;;7699:71:3;;10276:2:10;7699:71:3;;;10258:21:10;10315:2;10295:18;;;10288:30;10354:34;10334:18;;;10327:62;-1:-1:-1;;;10405:18:10;;;10398:33;10448:19;;7699:71:3;10074:399:10;7699:71:3;-1:-1:-1;;;;;7863:17:3;;7839:21;7863:17;;;:9;:17;;;;;;7898:23;;;;7890:74;;;;-1:-1:-1;;;7890:74:3;;10680:2:10;7890:74:3;;;10662:21:10;10719:2;10699:18;;;10692:30;10758:34;10738:18;;;10731:62;-1:-1:-1;;;10809:18:10;;;10802:36;10855:19;;7890:74:3;10478:402:10;7890:74:3;7994:22;8010:6;7994:13;:22;:::i;:::-;-1:-1:-1;;;;;7974:17:3;;;;;;;:9;:17;;;;;;:42;;;;8026:20;;;;;;;;:30;;8050:6;;7974:17;8026:30;;8050:6;;8026:30;:::i;:::-;;;;;;;;8089:9;-1:-1:-1;;;;;8072:35:3;8081:6;-1:-1:-1;;;;;8072:35:3;;8100:6;8072:35;;;;1693:25:10;;1681:2;1666:18;;1547:177;8072:35:3;;;;;;;;7609:505;7522:592;;;:::o;9035:483::-;-1:-1:-1;;;;;9118:21:3;;9110:67;;;;-1:-1:-1;;;9110:67:3;;11087:2:10;9110:67:3;;;11069:21:10;11126:2;11106:18;;;11099:30;11165:34;11145:18;;;11138:62;-1:-1:-1;;;11216:18:10;;;11209:31;11257:19;;9110:67:3;10885:397:10;9110:67:3;-1:-1:-1;;;;;9273:18:3;;9248:22;9273:18;;;:9;:18;;;;;;9309:24;;;;9301:71;;;;-1:-1:-1;;;9301:71:3;;11489:2:10;9301:71:3;;;11471:21:10;11528:2;11508:18;;;11501:30;11567:34;11547:18;;;11540:62;-1:-1:-1;;;11618:18:10;;;11611:32;11660:19;;9301:71:3;11287:398:10;9301:71:3;9403:23;9420:6;9403:14;:23;:::i;:::-;-1:-1:-1;;;;;9382:18:3;;;;;;:9;:18;;;;;:44;;;;9436:12;:22;;9452:6;;9382:18;9436:22;;9452:6;;9436:22;:::i;:::-;;;;-1:-1:-1;;9474:37:3;;1693:25:10;;;9500:1:3;;-1:-1:-1;;;;;9474:37:3;;;;;1681:2:10;1666:18;9474:37:3;1547:177:10;634:175:8;743:58;;-1:-1:-1;;;;;11882:32:10;;743:58:8;;;11864:51:10;11931:18;;;11924:34;;;716:86:8;;736:5;;-1:-1:-1;;;766:23:8;11837:18:10;;743:58:8;;;;-1:-1:-1;;743:58:8;;;;;;;;;;;;;;-1:-1:-1;;;;;743:58:8;-1:-1:-1;;;;;;743:58:8;;;;;;;;;;716:19;:86::i;815:203::-;942:68;;-1:-1:-1;;;;;12227:15:10;;;942:68:8;;;12209:34:10;12279:15;;12259:18;;;12252:43;12311:18;;;12304:34;;;915:96:8;;935:5;;-1:-1:-1;;;965:27:8;12144:18:10;;942:68:8;11969:375:10;8385:330:3;-1:-1:-1;;;;;8468:21:3;;8460:65;;;;-1:-1:-1;;;8460:65:3;;12551:2:10;8460:65:3;;;12533:21:10;12590:2;12570:18;;;12563:30;12629:33;12609:18;;;12602:61;12680:18;;8460:65:3;12349:355:10;8460:65:3;8612:6;8596:12;;:22;;;;;;;:::i;:::-;;;;-1:-1:-1;;;;;;;8628:18:3;;;;;;:9;:18;;;;;:28;;8650:6;;8628:18;:28;;8650:6;;8628:28;:::i;:::-;;;;-1:-1:-1;;8671:37:3;;1693:25:10;;;-1:-1:-1;;;;;8671:37:3;;;8688:1;;8671:37;;1681:2:10;1666:18;8671:37:3;;;;;;;8385:330;;:::o;2036:178::-;1456:13:2;;;;;;;;:30;;-1:-1:-1;1474:12:2;;;;1473:13;1456:30;1448:89;;;;-1:-1:-1;;;1448:89:2;;;;;;;:::i;:::-;1548:19;1571:13;;;;;;1570:14;1594:98;;;;1628:13;:20;;-1:-1:-1;;1662:19:2;;;;;1594:98;2133:26:3::1;:24;:26::i;:::-;2169:38;2192:5;2199:7;2169:22;:38::i;:::-;1718:14:2::0;1714:66;;;1764:5;1748:21;;-1:-1:-1;;1748:21:2;;;1438:348;2036:178:3;;:::o;1065:192:1:-;1456:13:2;;;;;;;;:30;;-1:-1:-1;1474:12:2;;;;1473:13;1456:30;1448:89;;;;-1:-1:-1;;;1448:89:2;;;;;;;:::i;:::-;1548:19;1571:13;;;;;;1570:14;1594:98;;;;1628:13;:20;;-1:-1:-1;;1662:19:2;;;;;1594:98;1174:6:1::1;:18:::0;;-1:-1:-1;;;;;;1174:18:1::1;901:10:6::0;1174:18:1;;::::1;::::0;;;1207:43:::1;::::0;901:10:6;;1132:17:1::1;::::0;1207:43:::1;::::0;1132:17;;1207:43:::1;1122:135;1718:14:2::0;1714:66;;;1764:5;1748:21;;-1:-1:-1;;1748:21:2;;;1714:66;1438:348;1065:192:1:o;3022:751:8:-;3441:23;3467:69;3495:4;3467:69;;;;;;;;;;;;;;;;;3475:5;-1:-1:-1;;;;;3467:27:8;;;:69;;;;;:::i;:::-;3550:17;;3441:95;;-1:-1:-1;3550:21:8;3546:221;;3690:10;3679:30;;;;;;;;;;;;:::i;:::-;3671:85;;;;-1:-1:-1;;;3671:85:8;;13193:2:10;3671:85:8;;;13175:21:10;13232:2;13212:18;;;13205:30;13271:34;13251:18;;;13244:62;-1:-1:-1;;;13322:18:10;;;13315:40;13372:19;;3671:85:8;12991:406:10;753:64:6;1456:13:2;;;;;;;;:30;;-1:-1:-1;1474:12:2;;;;1473:13;1456:30;1448:89;;;;-1:-1:-1;;;1448:89:2;;;;;;;:::i;:::-;1548:19;1571:13;;;;;;1570:14;1594:98;;;;1628:13;:20;;-1:-1:-1;;1662:19:2;;;;;1594:98;1718:14;1714:66;;;1764:5;1748:21;;-1:-1:-1;;1748:21:2;;;1438:348;753:64:6:o;2220:154:3:-;1456:13:2;;;;;;;;:30;;-1:-1:-1;1474:12:2;;;;1473:13;1456:30;1448:89;;;;-1:-1:-1;;;1448:89:2;;;;;;;:::i;:::-;1548:19;1571:13;;;;;;1570:14;1594:98;;;;1628:13;:20;;-1:-1:-1;;1662:19:2;;;;;1594:98;2327:13:3;;::::1;::::0;:5:::1;::::0;:13:::1;::::0;::::1;::::0;::::1;:::i;:::-;-1:-1:-1::0;2350:17:3;;::::1;::::0;:7:::1;::::0;:17:::1;::::0;::::1;::::0;::::1;:::i;:::-;;1718:14:2::0;1714:66;;;1764:5;1748:21;;-1:-1:-1;;1748:21:2;;;1438:348;2220:154:3;;:::o;3573:193:9:-;3676:12;3707:52;3729:6;3737:4;3743:1;3746:12;3707:21;:52::i;:::-;3700:59;3573:193;-1:-1:-1;;;;3573:193:9:o;4600:523::-;4727:12;4784:5;4759:21;:30;;4751:81;;;;-1:-1:-1;;;4751:81:9;;13604:2:10;4751:81:9;;;13586:21:10;13643:2;13623:18;;;13616:30;13682:34;13662:18;;;13655:62;-1:-1:-1;;;13733:18:10;;;13726:36;13779:19;;4751:81:9;13402:402:10;4751:81:9;1078:20;;4842:60;;;;-1:-1:-1;;;4842:60:9;;14011:2:10;4842:60:9;;;13993:21:10;14050:2;14030:18;;;14023:30;14089:31;14069:18;;;14062:59;14138:18;;4842:60:9;13809:353:10;4842:60:9;4973:12;4987:23;5014:6;-1:-1:-1;;;;;5014:11:9;5034:5;5042:4;5014:33;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4972:75;;;;5064:52;5082:7;5091:10;5103:12;5064:17;:52::i;:::-;5057:59;4600:523;-1:-1:-1;;;;;;;4600:523:9:o;7083:725::-;7198:12;7226:7;7222:580;;;-1:-1:-1;7256:10:9;7249:17;;7222:580;7367:17;;:21;7363:429;;7625:10;7619:17;7685:15;7672:10;7668:2;7664:19;7657:44;7363:429;7764:12;7757:20;;-1:-1:-1;;;7757:20:9;;;;;;;;:::i;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;14:258:10;86:1;96:113;110:6;107:1;104:13;96:113;;;186:11;;;180:18;167:11;;;160:39;132:2;125:10;96:113;;;227:6;224:1;221:13;218:48;;;-1:-1:-1;;262:1:10;244:16;;237:27;14:258::o;277:383::-;426:2;415:9;408:21;389:4;458:6;452:13;501:6;496:2;485:9;481:18;474:34;517:66;576:6;571:2;560:9;556:18;551:2;543:6;539:15;517:66;:::i;:::-;644:2;623:15;-1:-1:-1;;619:29:10;604:45;;;;651:2;600:54;;277:383;-1:-1:-1;;277:383:10:o;665:173::-;733:20;;-1:-1:-1;;;;;782:31:10;;772:42;;762:70;;828:1;825;818:12;762:70;665:173;;;:::o;843:254::-;911:6;919;972:2;960:9;951:7;947:23;943:32;940:52;;;988:1;985;978:12;940:52;1011:29;1030:9;1011:29;:::i;:::-;1001:39;1087:2;1072:18;;;;1059:32;;-1:-1:-1;;;843:254:10:o;1294:248::-;1362:6;1370;1423:2;1411:9;1402:7;1398:23;1394:32;1391:52;;;1439:1;1436;1429:12;1391:52;-1:-1:-1;;1462:23:10;;;1532:2;1517:18;;;1504:32;;-1:-1:-1;1294:248:10:o;1729:328::-;1806:6;1814;1822;1875:2;1863:9;1854:7;1850:23;1846:32;1843:52;;;1891:1;1888;1881:12;1843:52;1914:29;1933:9;1914:29;:::i;:::-;1904:39;;1962:38;1996:2;1985:9;1981:18;1962:38;:::i;:::-;1952:48;;2047:2;2036:9;2032:18;2019:32;2009:42;;1729:328;;;;;:::o;2062:180::-;2121:6;2174:2;2162:9;2153:7;2149:23;2145:32;2142:52;;;2190:1;2187;2180:12;2142:52;-1:-1:-1;2213:23:10;;2062:180;-1:-1:-1;2062:180:10:o;2436:186::-;2495:6;2548:2;2536:9;2527:7;2523:23;2519:32;2516:52;;;2564:1;2561;2554:12;2516:52;2587:29;2606:9;2587:29;:::i;3058:260::-;3126:6;3134;3187:2;3175:9;3166:7;3162:23;3158:32;3155:52;;;3203:1;3200;3193:12;3155:52;3226:29;3245:9;3226:29;:::i;:::-;3216:39;;3274:38;3308:2;3297:9;3293:18;3274:38;:::i;:::-;3264:48;;3058:260;;;;;:::o;3323:380::-;3402:1;3398:12;;;;3445;;;3466:61;;3520:4;3512:6;3508:17;3498:27;;3466:61;3573:2;3565:6;3562:14;3542:18;3539:38;3536:161;;;3619:10;3614:3;3610:20;3607:1;3600:31;3654:4;3651:1;3644:15;3682:4;3679:1;3672:15;3536:161;;3323:380;;;:::o;3708:356::-;3910:2;3892:21;;;3929:18;;;3922:30;3988:34;3983:2;3968:18;;3961:62;4055:2;4040:18;;3708:356::o;5183:127::-;5244:10;5239:3;5235:20;5232:1;5225:31;5275:4;5272:1;5265:15;5299:4;5296:1;5289:15;5315:128;5355:3;5386:1;5382:6;5379:1;5376:13;5373:39;;;5392:18;;:::i;:::-;-1:-1:-1;5428:9:10;;5315:128::o;5857:125::-;5897:4;5925:1;5922;5919:8;5916:34;;;5930:18;;:::i;:::-;-1:-1:-1;5967:9:10;;5857:125::o;6339:168::-;6379:7;6445:1;6441;6437:6;6433:14;6430:1;6427:21;6422:1;6415:9;6408:17;6404:45;6401:71;;;6452:18;;:::i;:::-;-1:-1:-1;6492:9:10;;6339:168::o;6512:217::-;6552:1;6578;6568:132;;6622:10;6617:3;6613:20;6610:1;6603:31;6657:4;6654:1;6647:15;6685:4;6682:1;6675:15;6568:132;-1:-1:-1;6714:9:10;;6512:217::o;7493:410::-;7695:2;7677:21;;;7734:2;7714:18;;;7707:30;7773:34;7768:2;7753:18;;7746:62;-1:-1:-1;;;7839:2:10;7824:18;;7817:44;7893:3;7878:19;;7493:410::o;8671:184::-;8741:6;8794:2;8782:9;8773:7;8769:23;8765:32;8762:52;;;8810:1;8807;8800:12;8762:52;-1:-1:-1;8833:16:10;;8671:184;-1:-1:-1;8671:184:10:o;12709:277::-;12776:6;12829:2;12817:9;12808:7;12804:23;12800:32;12797:52;;;12845:1;12842;12835:12;12797:52;12877:9;12871:16;12930:5;12923:13;12916:21;12909:5;12906:32;12896:60;;12952:1;12949;12942:12;14167:274;14296:3;14334:6;14328:13;14350:53;14396:6;14391:3;14384:4;14376:6;14372:17;14350:53;:::i;:::-;14419:16;;;;;14167:274;-1:-1:-1;;14167:274:10:o
Swarm Source
ipfs://5349c6fa043af1eea60f954ee45436508256a88c592f0decefbc41dc02185f4d
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 30 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
Loading...
Loading
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.