Feature Tip: Add private address tag to any address under My Name Tag !
Source Code
Latest 25 from a total of 939 transactions
| Transaction Hash |
Method
|
Block
|
From
|
|
To
|
||||
|---|---|---|---|---|---|---|---|---|---|
| Unstake | 21774718 | 383 days ago | IN | 0 ETH | 0.00042568 | ||||
| Unstake | 21774714 | 383 days ago | IN | 0 ETH | 0.00047353 | ||||
| Unstake | 21774712 | 383 days ago | IN | 0 ETH | 0.00052241 | ||||
| Unstake | 21774709 | 383 days ago | IN | 0 ETH | 0.00055202 | ||||
| Stake | 21049433 | 484 days ago | IN | 0 ETH | 0.00074774 | ||||
| Unstake | 21049364 | 484 days ago | IN | 0 ETH | 0.0006223 | ||||
| Unstake | 21049359 | 484 days ago | IN | 0 ETH | 0.00096347 | ||||
| Stake | 20648974 | 540 days ago | IN | 0 ETH | 0.00018759 | ||||
| Unstake | 19933308 | 640 days ago | IN | 0 ETH | 0.00398069 | ||||
| Unstake | 18313147 | 867 days ago | IN | 0 ETH | 0.00183993 | ||||
| Unstake | 18283911 | 871 days ago | IN | 0 ETH | 0.00132805 | ||||
| Unstake | 18283908 | 871 days ago | IN | 0 ETH | 0.00116362 | ||||
| Unstake | 18283905 | 871 days ago | IN | 0 ETH | 0.00116143 | ||||
| Unstake | 18283900 | 871 days ago | IN | 0 ETH | 0.00142467 | ||||
| Payout Reward | 18283896 | 871 days ago | IN | 0 ETH | 0.0016335 | ||||
| Payout All Rewar... | 17833790 | 934 days ago | IN | 0 ETH | 0.00365697 | ||||
| Unstake | 17806024 | 938 days ago | IN | 0 ETH | 0.00279406 | ||||
| Unstake | 17806021 | 938 days ago | IN | 0 ETH | 0.00284288 | ||||
| Unstake | 17806018 | 938 days ago | IN | 0 ETH | 0.00272775 | ||||
| Payout Reward | 17806015 | 938 days ago | IN | 0 ETH | 0.00303988 | ||||
| Unstake | 17554280 | 973 days ago | IN | 0 ETH | 0.0021517 | ||||
| Payout Reward | 17244218 | 1017 days ago | IN | 0 ETH | 0.01136065 | ||||
| Payout All Rewar... | 16996488 | 1052 days ago | IN | 0 ETH | 0.00451507 | ||||
| Stake | 16943322 | 1059 days ago | IN | 0 ETH | 0.00414162 | ||||
| Stake | 16861587 | 1071 days ago | IN | 0 ETH | 0.00402864 |
View more zero value Internal Transactions in Advanced View mode
Advanced mode:
Loading...
Loading
Loading...
Loading
Cross-Chain Transactions
Loading...
Loading
Contract Name:
ANCDanceStake
Compiler Version
v0.8.15+commit.e14f2714
Optimization Enabled:
Yes with 100 runs
Other Settings:
default evmVersion
Contract Source Code (Solidity Standard Json-Input format)
// SPDX-License-Identifier: MIT
/***
* .';:c:,.
* ;0NNNNNNX. lNNNNNNK; .XNNNNN. .:d0XWWWWWWWWXOo'
* lXWWWWWWWWO XWWWWWWWWO. :WWWWWK ;0WWWWWWWWWWWWWWWWWK,
* .dNWWWWWWWWWWc ,WWWWWWWWWWNo kWWWWWo .0WWWWWNkc,...;oXWWXxc.
* ,kWWWWWWXWWWWWW. dWWWWWXNWWWWWX; .NWWWWW. KWWWWW0. ;.
* :KWWWWWNd.lWWWWWO XWWWWW:.xWWWWWWOdWWWWW0 cWWWWWW.
* lXWWWWWXl. 0WWWWW: ,WWWWWN '0WWWWWWWWWWWl oWWWWWW; :,
* .dNWWWWW0; 'WWWWWN. xWWWWWx :XWWWWWWWWW. .NWWWWWWkc,'';ckNWWNOc.
* 'kWWWWWWx' oWWWWWk NWWWWW, oWWWWWWW0 '0WWWWWWWWWWWWWWWWWO;
* .d000000o. k00000; ,00000k .x00000: .lkKNWWWWWWNKko;.
* .,;;'.
*/
pragma solidity ^0.8.15;
import "@openzeppelin/contracts/token/ERC721/IERC721.sol";
import "@openzeppelin/contracts/token/ERC721/IERC721Receiver.sol";
import "@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol";
import "./ANCStake.sol";
import "./IERC20F.sol";
contract ANCDanceStake is ANCStake{
struct StakedDance {
uint128 stakingStartWeek;
uint32 coins;
uint32 stakingDuration;
uint32 paidDuration;
}
uint96 public immutable TOKENS_PER_COIN = 1e18; // 1 full coin = 10^18
IERC20F private _dance;
mapping(address => StakedDance[]) private _stakes;
constructor(uint256 percentPerWeek) ANCStake(percentPerWeek){ }
/* External Functions */
function stake(uint32 coins, uint16 stakingDuration) external stakingGate(stakingDuration){
require(coins > 0, "Need to stake at least 1 DANCE");
uint256 amount = uint256(coins) * TOKENS_PER_COIN;
uint256 allowance = _dance.allowance(msg.sender, address(this));
require(allowance >= amount, "Check the token allowance");
uint256 currentWeek = getCurrentWeek();
_dance.transferFromNoFee(msg.sender, address(this), amount);
_stakes[msg.sender].push(StakedDance(uint128(currentWeek), coins, stakingDuration, 0));
addSharesToWeeks(currentWeek, stakingDuration, getShares(coins, stakingDuration));
}
function unstake(uint256 id) external {
require(_stakes[msg.sender].length > id, "Invalid ID");
uint256 refund = _stakes[msg.sender][id].coins * TOKENS_PER_COIN;
uint256 payout = _unstakeDance(id);
_reservedTokens -= payout;
_danceSplitter.proxySend(msg.sender, payout);
_dance.transferNoFee(msg.sender, refund);
}
function unstakeAll() external {
require(_stakes[msg.sender].length > 0, "No Dance Tokens staked");
uint256 currentWeek = getCurrentWeek();
uint256 payout = 0;
uint256 refund = 0;
// While required since array length changes in _unstakeDance
uint256 i = 0;
while (i < _stakes[msg.sender].length) {
uint256 stakingStartWeek = _stakes[msg.sender][i].stakingStartWeek;
if(currentWeek - stakingStartWeek >= _stakes[msg.sender][i].stakingDuration){
refund += _stakes[msg.sender][i].coins * TOKENS_PER_COIN;
payout += _unstakeDance(i);
} else {
i += 1;
}
}
// require here so pre-computation will save you.
require(payout > 0, "No staking period over");
_reservedTokens -= payout;
_danceSplitter.proxySend(msg.sender, payout);
_dance.transferNoFee(msg.sender, refund);
}
function payoutReward(uint256 id) external override {
require(_stakes[msg.sender].length > id, "Invalid ID");
StakedDance memory mstake = _stakes[msg.sender][id];
uint256 currentWeek = getCurrentWeek();
require(currentWeek - mstake.stakingStartWeek < mstake.stakingDuration, "Staking period is over, use unstake function instead");
require(mstake.stakingStartWeek + mstake.paidDuration < currentWeek, "Nothing to pay out");
reserveForPastWeeks(currentWeek);
uint256 payout = _getReward(currentWeek, mstake);
_stakes[msg.sender][id].paidDuration = uint16(min(currentWeek - mstake.stakingStartWeek, mstake.stakingDuration));
require(payout > 0, "No reward to pay out");
_reservedTokens -= payout;
_danceSplitter.proxySend(msg.sender, payout);
}
function payoutAllRewards() external {
StakedDance[] memory mstakes= _stakes[msg.sender];
require(mstakes.length > 0, "No Dance Tokens staked");
uint256 currentWeek = getCurrentWeek();
reserveForPastWeeks(currentWeek);
uint256 payout = 0;
uint256 stakingStartWeek;
uint256 duration;
uint256 paidDuration;
for (uint256 id = 0; id < mstakes.length; id++) {
stakingStartWeek = mstakes[id].stakingStartWeek;
duration = mstakes[id].stakingDuration;
paidDuration = mstakes[id].paidDuration;
if (currentWeek - stakingStartWeek < duration
&& stakingStartWeek + paidDuration < currentWeek){
payout += _getReward(currentWeek, mstakes[id]);
_stakes[msg.sender][id].paidDuration = uint16(min(currentWeek - stakingStartWeek, duration));
}
}
// require here so pre-computation will save you.
require(payout > 0, "No reward to pay out");
_reservedTokens -= payout;
_danceSplitter.proxySend(msg.sender, payout);
}
function setRewardToken(address tokenAddress) external onlyOwner {
require(_dance == IERC20F(address(0)), "dance token is already set");
require(tokenAddress != address(0), "dance token cannot be 0 address");
_dance = IERC20F(tokenAddress);
}
/* Public Functions */
function getNumStaked(address address_) public view override returns(uint256){
return _stakes[address_].length;
}
function getStakeInfo(address address_, uint256 id_) public view returns(StakedDance memory){
return _stakes[address_][id_];
}
function getAvailablePayout(address address_, uint256 id_) public view returns(uint256){
uint256 currentWeek = getCurrentWeek();
StakedDance memory mstake = _stakes[address_][id_];
uint256 endWeek = mstake.stakingStartWeek + mstake.stakingDuration;
uint256 startWeek = mstake.stakingStartWeek + mstake.paidDuration;
uint256 shares = getShares(mstake.coins, mstake.stakingDuration);
return _getAvailablePayout(startWeek, endWeek, currentWeek, shares);
}
function getStakedIDs(address address_) public view override returns(uint256[] memory){
uint256 numStaked = getNumStaked(address_);
uint256[] memory stakedIDs = new uint256[](numStaked);
for (uint256 id = 0; id < numStaked; id++) {
stakedIDs[id] = id;
}
return stakedIDs;
}
function getShares(uint32 coins, uint32 stakingDuration) public pure returns(uint256){
// max shares per coin < (2^32 -1)/21000000 = 204
uint256 sD = stakingDuration;
uint256 base = 50;
uint256 linear = 30 * sD / MAX_STAKING_DURATION;
uint256 quadratic = 20 * sD * sD / (MAX_STAKING_DURATION*MAX_STAKING_DURATION);
return coins * (base + linear + quadratic);
}
/* Internal Functions */
function _unstakeDance(uint256 id) internal returns(uint256) {
StakedDance memory mstake = _stakes[msg.sender][id];
uint256 currentWeek = getCurrentWeek();
require(currentWeek - mstake.stakingStartWeek >= mstake.stakingDuration, "Staking period not over");
reserveForPastWeeks(currentWeek); // reserve reward tokens
uint256 payout = _getReward(currentWeek, mstake);
_stakes[msg.sender][id] = _stakes[msg.sender][_stakes[msg.sender].length - 1];
_stakes[msg.sender].pop();
return payout;
}
function _getReward(uint256 currentWeek, StakedDance memory mstake) internal view returns(uint256){
require(mstake.stakingStartWeek > 0, "ID is not staked");
uint256 payout = getStakingReward(
mstake.stakingStartWeek,
currentWeek,
mstake.stakingDuration,
mstake.paidDuration,
getShares(mstake.coins, uint16(mstake.stakingDuration))
);
// need to update state (paidDuration) in next step
return payout;
}
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.7.0) (token/ERC721/IERC721.sol)
pragma solidity ^0.8.0;
import "../../utils/introspection/IERC165.sol";
/**
* @dev Required interface of an ERC721 compliant contract.
*/
interface IERC721 is IERC165 {
/**
* @dev Emitted when `tokenId` token is transferred from `from` to `to`.
*/
event Transfer(address indexed from, address indexed to, uint256 indexed tokenId);
/**
* @dev Emitted when `owner` enables `approved` to manage the `tokenId` token.
*/
event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId);
/**
* @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets.
*/
event ApprovalForAll(address indexed owner, address indexed operator, bool approved);
/**
* @dev Returns the number of tokens in ``owner``'s account.
*/
function balanceOf(address owner) external view returns (uint256 balance);
/**
* @dev Returns the owner of the `tokenId` token.
*
* Requirements:
*
* - `tokenId` must exist.
*/
function ownerOf(uint256 tokenId) external view returns (address owner);
/**
* @dev Safely transfers `tokenId` token from `from` to `to`.
*
* Requirements:
*
* - `from` cannot be the zero address.
* - `to` cannot be the zero address.
* - `tokenId` token must exist and be owned by `from`.
* - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}.
* - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
*
* Emits a {Transfer} event.
*/
function safeTransferFrom(
address from,
address to,
uint256 tokenId,
bytes calldata data
) external;
/**
* @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients
* are aware of the ERC721 protocol to prevent tokens from being forever locked.
*
* Requirements:
*
* - `from` cannot be the zero address.
* - `to` cannot be the zero address.
* - `tokenId` token must exist and be owned by `from`.
* - If the caller is not `from`, it must have been allowed to move this token by either {approve} or {setApprovalForAll}.
* - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
*
* Emits a {Transfer} event.
*/
function safeTransferFrom(
address from,
address to,
uint256 tokenId
) external;
/**
* @dev Transfers `tokenId` token from `from` to `to`.
*
* WARNING: Usage of this method is discouraged, use {safeTransferFrom} whenever possible.
*
* Requirements:
*
* - `from` cannot be the zero address.
* - `to` cannot be the zero address.
* - `tokenId` token must be owned by `from`.
* - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}.
*
* Emits a {Transfer} event.
*/
function transferFrom(
address from,
address to,
uint256 tokenId
) external;
/**
* @dev Gives permission to `to` to transfer `tokenId` token to another account.
* The approval is cleared when the token is transferred.
*
* Only a single account can be approved at a time, so approving the zero address clears previous approvals.
*
* Requirements:
*
* - The caller must own the token or be an approved operator.
* - `tokenId` must exist.
*
* Emits an {Approval} event.
*/
function approve(address to, uint256 tokenId) external;
/**
* @dev Approve or remove `operator` as an operator for the caller.
* Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller.
*
* Requirements:
*
* - The `operator` cannot be the caller.
*
* Emits an {ApprovalForAll} event.
*/
function setApprovalForAll(address operator, bool _approved) external;
/**
* @dev Returns the account approved for `tokenId` token.
*
* Requirements:
*
* - `tokenId` must exist.
*/
function getApproved(uint256 tokenId) external view returns (address operator);
/**
* @dev Returns if the `operator` is allowed to manage all of the assets of `owner`.
*
* See {setApprovalForAll}
*/
function isApprovedForAll(address owner, address operator) external view returns (bool);
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.6.0) (token/ERC721/IERC721Receiver.sol)
pragma solidity ^0.8.0;
/**
* @title ERC721 token receiver interface
* @dev Interface for any contract that wants to support safeTransfers
* from ERC721 asset contracts.
*/
interface IERC721Receiver {
/**
* @dev Whenever an {IERC721} `tokenId` token is transferred to this contract via {IERC721-safeTransferFrom}
* by `operator` from `from`, this function is called.
*
* It must return its Solidity selector to confirm the token transfer.
* If any other value is returned or the interface is not implemented by the recipient, the transfer will be reverted.
*
* The selector can be obtained in Solidity with `IERC721Receiver.onERC721Received.selector`.
*/
function onERC721Received(
address operator,
address from,
uint256 tokenId,
bytes calldata data
) external returns (bytes4);
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.7.0) (token/ERC20/utils/SafeERC20.sol)
pragma solidity ^0.8.0;
import "../IERC20.sol";
import "../extensions/draft-IERC20Permit.sol";
import "../../../utils/Address.sol";
/**
* @title SafeERC20
* @dev Wrappers around ERC20 operations that throw on failure (when the token
* contract returns false). Tokens that return no value (and instead revert or
* throw on failure) are also supported, non-reverting calls are assumed to be
* successful.
* To use this library you can add a `using SafeERC20 for IERC20;` statement to your contract,
* which allows you to call the safe operations as `token.safeTransfer(...)`, etc.
*/
library SafeERC20 {
using Address for address;
function safeTransfer(
IERC20 token,
address to,
uint256 value
) internal {
_callOptionalReturn(token, abi.encodeWithSelector(token.transfer.selector, to, value));
}
function safeTransferFrom(
IERC20 token,
address from,
address to,
uint256 value
) internal {
_callOptionalReturn(token, abi.encodeWithSelector(token.transferFrom.selector, from, to, value));
}
/**
* @dev Deprecated. This function has issues similar to the ones found in
* {IERC20-approve}, and its usage is discouraged.
*
* Whenever possible, use {safeIncreaseAllowance} and
* {safeDecreaseAllowance} instead.
*/
function safeApprove(
IERC20 token,
address spender,
uint256 value
) internal {
// safeApprove should only be called when setting an initial allowance,
// or when resetting it to zero. To increase and decrease it, use
// 'safeIncreaseAllowance' and 'safeDecreaseAllowance'
require(
(value == 0) || (token.allowance(address(this), spender) == 0),
"SafeERC20: approve from non-zero to non-zero allowance"
);
_callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, value));
}
function safeIncreaseAllowance(
IERC20 token,
address spender,
uint256 value
) internal {
uint256 newAllowance = token.allowance(address(this), spender) + value;
_callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance));
}
function safeDecreaseAllowance(
IERC20 token,
address spender,
uint256 value
) internal {
unchecked {
uint256 oldAllowance = token.allowance(address(this), spender);
require(oldAllowance >= value, "SafeERC20: decreased allowance below zero");
uint256 newAllowance = oldAllowance - value;
_callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance));
}
}
function safePermit(
IERC20Permit token,
address owner,
address spender,
uint256 value,
uint256 deadline,
uint8 v,
bytes32 r,
bytes32 s
) internal {
uint256 nonceBefore = token.nonces(owner);
token.permit(owner, spender, value, deadline, v, r, s);
uint256 nonceAfter = token.nonces(owner);
require(nonceAfter == nonceBefore + 1, "SafeERC20: permit did not succeed");
}
/**
* @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement
* on the return value: the return value is optional (but if data is returned, it must not be false).
* @param token The token targeted by the call.
* @param data The call data (encoded using abi.encode or one of its variants).
*/
function _callOptionalReturn(IERC20 token, bytes memory data) private {
// We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since
// we're implementing it ourselves. We use {Address.functionCall} to perform this call, which verifies that
// the target address contains contract code and also asserts for success in the low-level call.
bytes memory returndata = address(token).functionCall(data, "SafeERC20: low-level call failed");
if (returndata.length > 0) {
// Return data is optional
require(abi.decode(returndata, (bool)), "SafeERC20: ERC20 operation did not succeed");
}
}
}// SPDX-License-Identifier: MIT
/***
* .';:c:,.
* ;0NNNNNNX. lNNNNNNK; .XNNNNN. .:d0XWWWWWWWWXOo'
* lXWWWWWWWWO XWWWWWWWWO. :WWWWWK ;0WWWWWWWWWWWWWWWWWK,
* .dNWWWWWWWWWWc ,WWWWWWWWWWNo kWWWWWo .0WWWWWNkc,...;oXWWXxc.
* ,kWWWWWWXWWWWWW. dWWWWWXNWWWWWX; .NWWWWW. KWWWWW0. ;.
* :KWWWWWNd.lWWWWWO XWWWWW:.xWWWWWWOdWWWWW0 cWWWWWW.
* lXWWWWWXl. 0WWWWW: ,WWWWWN '0WWWWWWWWWWWl oWWWWWW; :,
* .dNWWWWW0; 'WWWWWN. xWWWWWx :XWWWWWWWWW. .NWWWWWWkc,'';ckNWWNOc.
* 'kWWWWWWx' oWWWWWk NWWWWW, oWWWWWWW0 '0WWWWWWWWWWWWWWWWWO;
* .d000000o. k00000; ,00000k .x00000: .lkKNWWWWWWNKko;.
* .,;;'.
*/
pragma solidity ^0.8.15;
import "@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol";
import "@openzeppelin/contracts/access/Ownable.sol";
import "./FeeSplitter.sol";
abstract contract ANCStake is Ownable{
struct TwoWeekInfo{
uint96 tokensEvenWeek;
uint32 totalSharesEvenWeek;
uint96 tokensOddWeek;
uint32 totalSharesOddWeek;
}
uint256 public constant MAX_STAKING_DURATION = 52;
uint256 public constant ONE_WEEK = 604800; // 1 week = 604800
uint256 public tenthPercentPerWeek;
uint256 public stakingStart;
FeeSplitter internal _danceSplitter;
uint256 internal _reservedTokens;
mapping(uint256 => TwoWeekInfo) private _weeklyInfo;
constructor(uint256 tenthPercentPerWeek_){
tenthPercentPerWeek = tenthPercentPerWeek_;
}
modifier stakingGate(uint32 duration){
require(stakingStart > 0, "Staking has not started");
require(duration >= 1, "Minimum staking period 1 week");
require(duration <= MAX_STAKING_DURATION, "Maximum staking period 1 year");
_;
}
/* External Functions */
function payoutReward(uint256) virtual external;
function setRewardSplitter(address splitterAddress) external onlyOwner {
require(_danceSplitter == FeeSplitter(address(0)), "Splitter already set");
require(splitterAddress != address(0), "splitter cannot be 0 address");
_danceSplitter = FeeSplitter(splitterAddress);
}
function setStakingStart() external onlyOwner {
require(stakingStart == 0, "Staking has already started.");
stakingStart = block.timestamp;
}
function setTenthPercentPerWeek(uint256 tenthPercentPerWeek_) external onlyOwner {
require(tenthPercentPerWeek_ > 0, "Value must be bigger than 0");
tenthPercentPerWeek = tenthPercentPerWeek_;
}
function getFundsForWeeksLowerBound(uint256 startWeek, uint256 endWeek) external view returns(uint256){
uint256 currentWeek = getCurrentWeek();
uint256 currentFunds = getAvailableFunds();
uint256 lastUnreservedWeek = findLastUnreservedWeek(currentWeek);
uint256 fundsForWeeks = 0;
for (uint256 week = startWeek; week < lastUnreservedWeek; week++) {
fundsForWeeks += getBasePayoutForWeek(week);
}
uint256 basePayoutForWeek;
for (uint256 week = lastUnreservedWeek; week < currentWeek; week++) {
if (getSharesForWeek(week) > 0) {
basePayoutForWeek = currentFunds * tenthPercentPerWeek / 1000;
currentFunds -= basePayoutForWeek;
fundsForWeeks += basePayoutForWeek;
}
}
for (uint256 week = currentWeek; week < endWeek; week++) {
basePayoutForWeek = currentFunds * tenthPercentPerWeek / 1000;
currentFunds -= basePayoutForWeek;
fundsForWeeks += basePayoutForWeek;
}
return fundsForWeeks;
}
/* Public Functions */
function getStakedIDs(address) public view virtual returns(uint256[] memory);
function getNumStaked(address) public view virtual returns(uint256);
function getAvailableFunds() public view returns(uint256){
return _danceSplitter.balanceOf(address(this)) - _reservedTokens;
}
function getBasePayoutForWeek(uint256 week) public view returns(uint256){
if(week & 1 == 0){
return _weeklyInfo[week].tokensEvenWeek;
}else{
return _weeklyInfo[week-1].tokensOddWeek;
}
}
function getSharesForWeek(uint256 week) public view returns(uint256){
if(week & 1 == 0){
return _weeklyInfo[week].totalSharesEvenWeek;
}else{
return _weeklyInfo[week-1].totalSharesOddWeek;
}
}
function getCurrentWeek() public view returns(uint256){
return timestamp2week(block.timestamp);
}
/* Internal Functions */
function addSharesToWeeks(uint256 startWeek, uint256 duration, uint256 amount) internal{
for (uint256 i = startWeek; i < startWeek+duration; i++) {
if(i & 1 == 0){
_weeklyInfo[i].totalSharesEvenWeek += uint32(amount);
}else{
_weeklyInfo[i-1].totalSharesOddWeek += uint32(amount);
}
}
}
function reserveAndGetTokens(uint256 balance) internal returns(uint256){
//console.log("balance:", _dance.balanceOf(address(this)));
uint256 newReserved = (balance - _reservedTokens) * tenthPercentPerWeek / 1000;
_reservedTokens += newReserved;
//console.log("reserved tokens:", _reservedTokens);
return newReserved;
}
function reserveForPastWeeks(uint256 currentWeek) internal{
// find last reserved Week
uint256 lastUnreservedWeek = findLastUnreservedWeek(currentWeek);
//console.log("current week", currentWeek);
//console.log("last unreserved week ", lastUnreservedWeek);
if (lastUnreservedWeek >= currentWeek) return;
// reserved unclaimed weeks
uint256 balance = _danceSplitter.balanceOf(address(this));
for (uint256 week = lastUnreservedWeek; week < currentWeek; week++) {
if(week & 1 == 0){
if (_weeklyInfo[week].totalSharesEvenWeek > 0) {
_weeklyInfo[week].tokensEvenWeek = uint96(reserveAndGetTokens(balance));
//console.log("tokens for week", week, _weeklyInfo[week].tokensEvenWeek);
}
} else {
if (_weeklyInfo[week-1].totalSharesOddWeek > 0) {
_weeklyInfo[week-1].tokensOddWeek = uint96(reserveAndGetTokens(balance));
//console.log("tokens for week", week, _weeklyInfo[week-1].tokensOddWeek);
}
}
}
}
function findLastUnreservedWeek(uint256 currentWeek) internal view returns(uint256){
uint256 week = currentWeek;
uint256 tokensForWeek;
while(week > 1) {
week -= 1;
if(week & 1 == 0){
tokensForWeek = _weeklyInfo[week].tokensEvenWeek;
} else {
tokensForWeek = _weeklyInfo[week-1].tokensOddWeek;
}
if (tokensForWeek > 0) return week+1;
}
return 0;
}
function getStakingReward(
uint256 stakingStartWeek,
uint256 currentWeek,
uint256 duration,
uint256 paidDuration,
uint256 shares
) internal view returns(uint256){
if (stakingStartWeek + paidDuration >= currentWeek) return 0; // no weeks to pay out
return _getStakingReward(stakingStartWeek+paidDuration, min(currentWeek, stakingStartWeek+duration), shares);
}
function _getStakingReward(uint256 startWeek, uint256 endWeek, uint256 shares) internal view returns(uint256){
uint256 payout = 0;
uint256 weeklyShares;
for(uint256 i = startWeek; i < endWeek; i++){
if(i & 1 == 0){
weeklyShares = _weeklyInfo[i].totalSharesEvenWeek;
} else {
weeklyShares = _weeklyInfo[i-1].totalSharesOddWeek;
}
payout += (getBasePayoutForWeek(i) * shares) / weeklyShares;
}
return payout;
}
function _getAvailablePayout(uint256 startWeek, uint256 endWeek, uint256 currentWeek, uint256 shares)
internal
view
returns (uint256)
{
uint256 currentFunds = getAvailableFunds();
endWeek = min(endWeek, currentWeek);
uint256 lastUnreservedWeek = findLastUnreservedWeek(currentWeek);
uint256 payout = 0;
uint256 basePayoutForWeek;
uint256 sharesForWeek;
for (uint256 week = startWeek; week < endWeek; week++) {
sharesForWeek = getSharesForWeek(week);
if (sharesForWeek > 0) {
if (week < lastUnreservedWeek) { // week has funds reserved
basePayoutForWeek = getBasePayoutForWeek(week);
} else { // week does not have funds reserved
basePayoutForWeek = currentFunds * tenthPercentPerWeek / 1000;
currentFunds -= basePayoutForWeek;
}
payout += (basePayoutForWeek * shares) / sharesForWeek;
}
}
return payout;
}
function timestamp2week (uint256 timestamp) internal view returns(uint256) {
return ((timestamp - stakingStart) / ONE_WEEK)+1;
}
function min(uint256 a, uint256 b) internal pure returns (uint256) {
return (a <= b) ? a : b;
}
}// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
import "@openzeppelin/contracts/token/ERC20/IERC20.sol";
interface IERC20F is IERC20 {
function transferNoFee(address to, uint256 amount) external returns (bool);
function transferFromNoFee(address from, address to, uint256 amount) external returns (bool);
function fee() external view returns(uint256[2] memory);
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol)
pragma solidity ^0.8.0;
/**
* @dev Interface of the ERC165 standard, as defined in the
* https://eips.ethereum.org/EIPS/eip-165[EIP].
*
* Implementers can declare support of contract interfaces, which can then be
* queried by others ({ERC165Checker}).
*
* For an implementation, see {ERC165}.
*/
interface IERC165 {
/**
* @dev Returns true if this contract implements the interface defined by
* `interfaceId`. See the corresponding
* https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section]
* to learn more about how these ids are created.
*
* This function call must use less than 30 000 gas.
*/
function supportsInterface(bytes4 interfaceId) external view returns (bool);
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.6.0) (token/ERC20/IERC20.sol)
pragma solidity ^0.8.0;
/**
* @dev Interface of the ERC20 standard as defined in the EIP.
*/
interface IERC20 {
/**
* @dev Emitted when `value` tokens are moved from one account (`from`) to
* another (`to`).
*
* Note that `value` may be zero.
*/
event Transfer(address indexed from, address indexed to, uint256 value);
/**
* @dev Emitted when the allowance of a `spender` for an `owner` is set by
* a call to {approve}. `value` is the new allowance.
*/
event Approval(address indexed owner, address indexed spender, uint256 value);
/**
* @dev Returns the amount of tokens in existence.
*/
function totalSupply() external view returns (uint256);
/**
* @dev Returns the amount of tokens owned by `account`.
*/
function balanceOf(address account) external view returns (uint256);
/**
* @dev Moves `amount` tokens from the caller's account to `to`.
*
* Returns a boolean value indicating whether the operation succeeded.
*
* Emits a {Transfer} event.
*/
function transfer(address to, uint256 amount) external returns (bool);
/**
* @dev Returns the remaining number of tokens that `spender` will be
* allowed to spend on behalf of `owner` through {transferFrom}. This is
* zero by default.
*
* This value changes when {approve} or {transferFrom} are called.
*/
function allowance(address owner, address spender) external view returns (uint256);
/**
* @dev Sets `amount` as the allowance of `spender` over the caller's tokens.
*
* Returns a boolean value indicating whether the operation succeeded.
*
* IMPORTANT: Beware that changing an allowance with this method brings the risk
* that someone may use both the old and the new allowance by unfortunate
* transaction ordering. One possible solution to mitigate this race
* condition is to first reduce the spender's allowance to 0 and set the
* desired value afterwards:
* https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729
*
* Emits an {Approval} event.
*/
function approve(address spender, uint256 amount) external returns (bool);
/**
* @dev Moves `amount` tokens from `from` to `to` using the
* allowance mechanism. `amount` is then deducted from the caller's
* allowance.
*
* Returns a boolean value indicating whether the operation succeeded.
*
* Emits a {Transfer} event.
*/
function transferFrom(
address from,
address to,
uint256 amount
) external returns (bool);
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (token/ERC20/extensions/draft-IERC20Permit.sol)
pragma solidity ^0.8.0;
/**
* @dev Interface of the ERC20 Permit extension allowing approvals to be made via signatures, as defined in
* https://eips.ethereum.org/EIPS/eip-2612[EIP-2612].
*
* Adds the {permit} method, which can be used to change an account's ERC20 allowance (see {IERC20-allowance}) by
* presenting a message signed by the account. By not relying on {IERC20-approve}, the token holder account doesn't
* need to send a transaction, and thus is not required to hold Ether at all.
*/
interface IERC20Permit {
/**
* @dev Sets `value` as the allowance of `spender` over ``owner``'s tokens,
* given ``owner``'s signed approval.
*
* IMPORTANT: The same issues {IERC20-approve} has related to transaction
* ordering also apply here.
*
* Emits an {Approval} event.
*
* Requirements:
*
* - `spender` cannot be the zero address.
* - `deadline` must be a timestamp in the future.
* - `v`, `r` and `s` must be a valid `secp256k1` signature from `owner`
* over the EIP712-formatted function arguments.
* - the signature must use ``owner``'s current nonce (see {nonces}).
*
* For more information on the signature format, see the
* https://eips.ethereum.org/EIPS/eip-2612#specification[relevant EIP
* section].
*/
function permit(
address owner,
address spender,
uint256 value,
uint256 deadline,
uint8 v,
bytes32 r,
bytes32 s
) external;
/**
* @dev Returns the current nonce for `owner`. This value must be
* included whenever a signature is generated for {permit}.
*
* Every successful call to {permit} increases ``owner``'s nonce by one. This
* prevents a signature from being used multiple times.
*/
function nonces(address owner) external view returns (uint256);
/**
* @dev Returns the domain separator used in the encoding of the signature for {permit}, as defined by {EIP712}.
*/
// solhint-disable-next-line func-name-mixedcase
function DOMAIN_SEPARATOR() external view returns (bytes32);
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.7.0) (utils/Address.sol)
pragma solidity ^0.8.1;
/**
* @dev Collection of functions related to the address type
*/
library Address {
/**
* @dev Returns true if `account` is a contract.
*
* [IMPORTANT]
* ====
* It is unsafe to assume that an address for which this function returns
* false is an externally-owned account (EOA) and not a contract.
*
* Among others, `isContract` will return false for the following
* types of addresses:
*
* - an externally-owned account
* - a contract in construction
* - an address where a contract will be created
* - an address where a contract lived, but was destroyed
* ====
*
* [IMPORTANT]
* ====
* You shouldn't rely on `isContract` to protect against flash loan attacks!
*
* Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets
* like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract
* constructor.
* ====
*/
function isContract(address account) internal view returns (bool) {
// This method relies on extcodesize/address.code.length, which returns 0
// for contracts in construction, since the code is only stored at the end
// of the constructor execution.
return account.code.length > 0;
}
/**
* @dev Replacement for Solidity's `transfer`: sends `amount` wei to
* `recipient`, forwarding all available gas and reverting on errors.
*
* https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost
* of certain opcodes, possibly making contracts go over the 2300 gas limit
* imposed by `transfer`, making them unable to receive funds via
* `transfer`. {sendValue} removes this limitation.
*
* https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more].
*
* IMPORTANT: because control is transferred to `recipient`, care must be
* taken to not create reentrancy vulnerabilities. Consider using
* {ReentrancyGuard} or the
* https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].
*/
function sendValue(address payable recipient, uint256 amount) internal {
require(address(this).balance >= amount, "Address: insufficient balance");
(bool success, ) = recipient.call{value: amount}("");
require(success, "Address: unable to send value, recipient may have reverted");
}
/**
* @dev Performs a Solidity function call using a low level `call`. A
* plain `call` is an unsafe replacement for a function call: use this
* function instead.
*
* If `target` reverts with a revert reason, it is bubbled up by this
* function (like regular Solidity function calls).
*
* Returns the raw returned data. To convert to the expected return value,
* use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`].
*
* Requirements:
*
* - `target` must be a contract.
* - calling `target` with `data` must not revert.
*
* _Available since v3.1._
*/
function functionCall(address target, bytes memory data) internal returns (bytes memory) {
return 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");
(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");
(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");
(bool success, bytes memory returndata) = target.delegatecall(data);
return verifyCallResult(success, returndata, errorMessage);
}
/**
* @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the
* revert reason using the provided one.
*
* _Available since v4.3._
*/
function verifyCallResult(
bool success,
bytes memory returndata,
string memory errorMessage
) internal pure returns (bytes memory) {
if (success) {
return returndata;
} else {
// Look for revert reason and bubble it up if present
if (returndata.length > 0) {
// The easiest way to bubble the revert reason is using memory via assembly
/// @solidity memory-safe-assembly
assembly {
let returndata_size := mload(returndata)
revert(add(32, returndata), returndata_size)
}
} else {
revert(errorMessage);
}
}
}
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.7.0) (access/Ownable.sol)
pragma solidity ^0.8.0;
import "../utils/Context.sol";
/**
* @dev Contract module which provides a basic access control mechanism, where
* there is an account (an owner) that can be granted exclusive access to
* specific functions.
*
* By default, the owner account will be the one that deploys the contract. This
* can later be changed with {transferOwnership}.
*
* This module is used through inheritance. It will make available the modifier
* `onlyOwner`, which can be applied to your functions to restrict their use to
* the owner.
*/
abstract contract Ownable is Context {
address private _owner;
event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);
/**
* @dev Initializes the contract setting the deployer as the initial owner.
*/
constructor() {
_transferOwnership(_msgSender());
}
/**
* @dev Throws if called by any account other than the owner.
*/
modifier onlyOwner() {
_checkOwner();
_;
}
/**
* @dev Returns the address of the current owner.
*/
function owner() public view virtual returns (address) {
return _owner;
}
/**
* @dev Throws if the sender is not the owner.
*/
function _checkOwner() internal view virtual {
require(owner() == _msgSender(), "Ownable: caller is not the owner");
}
/**
* @dev Leaves the contract without owner. It will not be possible to call
* `onlyOwner` functions anymore. Can only be called by the current owner.
*
* NOTE: Renouncing ownership will leave the contract without an owner,
* thereby removing any functionality that is only available to the owner.
*/
function renounceOwnership() public virtual onlyOwner {
_transferOwnership(address(0));
}
/**
* @dev Transfers ownership of the contract to a new account (`newOwner`).
* Can only be called by the current owner.
*/
function transferOwnership(address newOwner) public virtual onlyOwner {
require(newOwner != address(0), "Ownable: new owner is the zero address");
_transferOwnership(newOwner);
}
/**
* @dev Transfers ownership of the contract to a new account (`newOwner`).
* Internal function without access restriction.
*/
function _transferOwnership(address newOwner) internal virtual {
address oldOwner = _owner;
_owner = newOwner;
emit OwnershipTransferred(oldOwner, newOwner);
}
}// SPDX-License-Identifier: MIT
pragma solidity ^0.8.15;
interface FeeSplitter {
function proxySend(address to, uint256 amount) external;
function balanceOf(address account) external view returns (uint256);
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (utils/Context.sol)
pragma solidity ^0.8.0;
/**
* @dev Provides information about the current execution context, including the
* sender of the transaction and its data. While these are generally available
* via msg.sender and msg.data, they should not be accessed in such a direct
* manner, since when dealing with meta-transactions the account sending and
* paying for execution may not be the actual sender (as far as an application
* is concerned).
*
* This contract is only required for intermediate, library-like contracts.
*/
abstract contract Context {
function _msgSender() internal view virtual returns (address) {
return msg.sender;
}
function _msgData() internal view virtual returns (bytes calldata) {
return msg.data;
}
}{
"optimizer": {
"enabled": true,
"runs": 100
},
"outputSelection": {
"*": {
"*": [
"evm.bytecode",
"evm.deployedBytecode",
"devdoc",
"userdoc",
"metadata",
"abi"
]
}
},
"libraries": {}
}Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
Contract ABI
API[{"inputs":[{"internalType":"uint256","name":"percentPerWeek","type":"uint256"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"inputs":[],"name":"MAX_STAKING_DURATION","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"ONE_WEEK","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"TOKENS_PER_COIN","outputs":[{"internalType":"uint96","name":"","type":"uint96"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getAvailableFunds","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"address_","type":"address"},{"internalType":"uint256","name":"id_","type":"uint256"}],"name":"getAvailablePayout","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"week","type":"uint256"}],"name":"getBasePayoutForWeek","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getCurrentWeek","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"startWeek","type":"uint256"},{"internalType":"uint256","name":"endWeek","type":"uint256"}],"name":"getFundsForWeeksLowerBound","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"address_","type":"address"}],"name":"getNumStaked","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint32","name":"coins","type":"uint32"},{"internalType":"uint32","name":"stakingDuration","type":"uint32"}],"name":"getShares","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"uint256","name":"week","type":"uint256"}],"name":"getSharesForWeek","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"address_","type":"address"},{"internalType":"uint256","name":"id_","type":"uint256"}],"name":"getStakeInfo","outputs":[{"components":[{"internalType":"uint128","name":"stakingStartWeek","type":"uint128"},{"internalType":"uint32","name":"coins","type":"uint32"},{"internalType":"uint32","name":"stakingDuration","type":"uint32"},{"internalType":"uint32","name":"paidDuration","type":"uint32"}],"internalType":"struct ANCDanceStake.StakedDance","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"address_","type":"address"}],"name":"getStakedIDs","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"payoutAllRewards","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"id","type":"uint256"}],"name":"payoutReward","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"splitterAddress","type":"address"}],"name":"setRewardSplitter","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"tokenAddress","type":"address"}],"name":"setRewardToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"setStakingStart","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tenthPercentPerWeek_","type":"uint256"}],"name":"setTenthPercentPerWeek","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint32","name":"coins","type":"uint32"},{"internalType":"uint16","name":"stakingDuration","type":"uint16"}],"name":"stake","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"stakingStart","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tenthPercentPerWeek","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"id","type":"uint256"}],"name":"unstake","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"unstakeAll","outputs":[],"stateMutability":"nonpayable","type":"function"}]Contract Creation Code
60a0604052670de0b6b3a76400006080523480156200001d57600080fd5b50604051620027b4380380620027b48339810160408190526200004091620000a6565b806200004c3362000056565b60015550620000c0565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b600060208284031215620000b957600080fd5b5051919050565b6080516126c3620000f16000396000818161018d015281816106df0152818161092d0152610c6801526126c36000f3fe608060405234801561001057600080fd5b50600436106101795760003560e01c80638aee8127116100d9578063bc57b45e11610087578063bc57b45e14610363578063bfa17ace1461036b578063d6c5693614610374578063d771b0a614610387578063f15ff12714610390578063f2fde38b146103a3578063f96690b5146103b657600080fd5b80638aee8127146102d65780638da5cb5b146102e95780638e6f6b771461030257806398d92aa91461030c5780639dcb6c871461031f578063a1ec3eac14610332578063abcfd9641461033a57600080fd5b80633b521efe116101365780633b521efe1461021b5780634e6311ba146102785780635195bd291461028b578063596be7cd146102935780635c7fd297146102a65780636eb227ce146102c6578063715018a6146102ce57600080fd5b80630c7cd9821461017e57806328e36cf8146101885780632e17de78146101cc57806335322f37146101df57806336e53b6d146101e75780633a17428d146101fa575b600080fd5b6101866103c9565b005b6101af7f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160601b0390911681526020015b60405180910390f35b6101866101da3660046122e9565b61069e565b610186610841565b6101866101f5366004612316565b610b04565b61020d610208366004612354565b610ebe565b6040519081526020016101c3565b61022e61022936600461239e565b610f42565b6040516101c3919081516001600160801b0316815260208083015163ffffffff90811691830191909152604080840151821690830152606092830151169181019190915260800190565b61020d6102863660046123c8565b610fed565b61020d61110b565b6101866102a13660046122e9565b611190565b6102b96102b43660046123ea565b61146b565b6040516101c39190612405565b61020d61151a565b610186611525565b6101866102e43660046123ea565b611539565b6000546001600160a01b03166040516101c39190612449565b61020d62093a8081565b61018661031a3660046123ea565b611612565b61020d61032d36600461239e565b6116e2565b61020d603481565b61020d6103483660046123ea565b6001600160a01b031660009081526007602052604090205490565b6101866117e2565b61020d60015481565b6101866103823660046122e9565b611840565b61020d60025481565b61020d61039e3660046122e9565b61189d565b6101866103b13660046123ea565b611901565b61020d6103c43660046122e9565b61197a565b33600090815260076020908152604080832080548251818502810185019093528083529192909190849084015b8282101561046057600084815260209081902060408051608081018252918501546001600160801b038116835263ffffffff600160801b8204811684860152600160a01b8204811692840192909252600160c01b90041660608201528252600190920191016103f6565b50505050905060008151116104905760405162461bcd60e51b81526004016104879061245d565b60405180910390fd5b600061049a61151a565b90506104a5816119da565b6000808080805b86518110156105fa578681815181106104c7576104c761248d565b6020026020010151600001516001600160801b031693508681815181106104f0576104f061248d565b60200260200101516040015163ffffffff1692508681815181106105165761051661248d565b60200260200101516060015163ffffffff16915082848761053791906124b9565b10801561054c57508561054a83866124d0565b105b156105e857610574868883815181106105675761056761248d565b6020026020010151611b70565b61057e90866124d0565b945061059361058d85886124b9565b84611c0a565b336000908152600760205260409020805461ffff9290921691839081106105bc576105bc61248d565b9060005260206000200160000160186101000a81548163ffffffff021916908363ffffffff1602179055505b806105f2816124e8565b9150506104ac565b506000841161061b5760405162461bcd60e51b815260040161048790612501565b836004600082825461062d91906124b9565b9091555050600354604051637e90cb8960e11b81526001600160a01b039091169063fd21971290610664903390889060040161252f565b600060405180830381600087803b15801561067e57600080fd5b505af1158015610692573d6000803e3d6000fd5b50505050505050505050565b3360009081526007602052604090205481106106cc5760405162461bcd60e51b815260040161048790612548565b33600090815260076020526040812080547f00000000000000000000000000000000000000000000000000000000000000009190849081106107105761071061248d565b6000918252602090912001546107339190600160801b900463ffffffff1661256c565b6001600160601b03169050600061074983611c23565b9050806004600082825461075d91906124b9565b9091555050600354604051637e90cb8960e11b81526001600160a01b039091169063fd21971290610794903390859060040161252f565b600060405180830381600087803b1580156107ae57600080fd5b505af11580156107c2573d6000803e3d6000fd5b505060065460405163823b416760e01b81526001600160a01b03909116925063823b416791506107f8903390869060040161252f565b6020604051808303816000875af1158015610817573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061083b919061259b565b50505050565b3360009081526007602052604090205461086d5760405162461bcd60e51b81526004016104879061245d565b600061087761151a565b905060008060005b336000908152600760205260409020548110156109c4573360009081526007602052604081208054839081106108b7576108b761248d565b60009182526020808320909101543383526007909152604090912080546001600160801b03909216925090839081106108f2576108f261248d565b600091825260209091200154600160a01b900463ffffffff1661091582876124b9565b106109b05733600090815260076020526040902080547f000000000000000000000000000000000000000000000000000000000000000091908490811061095e5761095e61248d565b6000918252602090912001546109819190600160801b900463ffffffff1661256c565b610994906001600160601b0316846124d0565b925061099f82611c23565b6109a990856124d0565b93506109be565b6109bb6001836124d0565b91505b5061087f565b60008311610a0d5760405162461bcd60e51b815260206004820152601660248201527527379039ba30b5b4b733903832b934b7b21037bb32b960511b6044820152606401610487565b8260046000828254610a1f91906124b9565b9091555050600354604051637e90cb8960e11b81526001600160a01b039091169063fd21971290610a56903390879060040161252f565b600060405180830381600087803b158015610a7057600080fd5b505af1158015610a84573d6000803e3d6000fd5b505060065460405163823b416760e01b81526001600160a01b03909116925063823b41679150610aba903390869060040161252f565b6020604051808303816000875af1158015610ad9573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610afd919061259b565b5050505050565b8061ffff16600060025411610b555760405162461bcd60e51b815260206004820152601760248201527614dd185ada5b99c81a185cc81b9bdd081cdd185c9d1959604a1b6044820152606401610487565b60018163ffffffff161015610bac5760405162461bcd60e51b815260206004820152601d60248201527f4d696e696d756d207374616b696e6720706572696f642031207765656b0000006044820152606401610487565b60348163ffffffff161115610c035760405162461bcd60e51b815260206004820152601d60248201527f4d6178696d756d207374616b696e6720706572696f64203120796561720000006044820152606401610487565b60008363ffffffff1611610c595760405162461bcd60e51b815260206004820152601e60248201527f4e65656420746f207374616b65206174206c6561737420312044414e434500006044820152606401610487565b6000610c946001600160601b037f00000000000000000000000000000000000000000000000000000000000000001663ffffffff86166125bd565b600654604051636eb1769f60e11b81523360048201523060248201529192506000916001600160a01b039091169063dd62ed3e90604401602060405180830381865afa158015610ce8573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d0c91906125dc565b905081811015610d5a5760405162461bcd60e51b8152602060048201526019602482015278436865636b2074686520746f6b656e20616c6c6f77616e636560381b6044820152606401610487565b6000610d6461151a565b600654604051630650fe7d60e01b8152336004820152306024820152604481018690529192506001600160a01b031690630650fe7d906064016020604051808303816000875af1158015610dbc573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610de0919061259b565b5033600090815260076020908152604080832081516080810183526001600160801b03808716825263ffffffff808d1683870190815261ffff8d16958401868152606085018981528654600181018855968a529790982093519390940180549451975196518216600160c01b0263ffffffff60c01b19978316600160a01b029790971667ffffffffffffffff60a01b1998909216600160801b026001600160a01b0319909516939092169290921792909217949094169390931791909117909155610eb6908290610eb18982610ebe565b611e87565b505050505050565b600063ffffffff82166032826034610ed784601e6125bd565b610ee191906125f5565b90506000610ef06034806125bd565b84610efc8160146125bd565b610f0691906125bd565b610f1091906125f5565b905080610f1d83856124d0565b610f2791906124d0565b610f379063ffffffff89166125bd565b979650505050505050565b6040805160808101825260008082526020808301829052828401829052606083018290526001600160a01b03861682526007905291909120805483908110610f8c57610f8c61248d565b60009182526020918290206040805160808101825292909101546001600160801b038116835263ffffffff600160801b8204811694840194909452600160a01b8104841691830191909152600160c01b900490911660608201529392505050565b600080610ff861151a565b9050600061100461110b565b9050600061101183611f64565b90506000865b82811015611046576110288161189d565b61103290836124d0565b91508061103e816124e8565b915050611017565b506000825b858110156110ac57600061105e8261197a565b111561109a576103e86001548661107591906125bd565b61107f91906125f5565b915061108b82866124b9565b945061109782846124d0565b92505b806110a4816124e8565b91505061104b565b50845b878110156110fe576103e8600154866110c891906125bd565b6110d291906125f5565b91506110de82866124b9565b94506110ea82846124d0565b9250806110f6816124e8565b9150506110af565b5090979650505050505050565b600480546003546040516370a0823160e01b81526000936001600160a01b03909216916370a082319161114091309101612449565b602060405180830381865afa15801561115d573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061118191906125dc565b61118b91906124b9565b905090565b3360009081526007602052604090205481106111be5760405162461bcd60e51b815260040161048790612548565b3360009081526007602052604081208054839081106111df576111df61248d565b600091825260208083206040805160808101825291909301546001600160801b038116825263ffffffff600160801b8204811693830193909352600160a01b8104831693820193909352600160c01b909204166060820152915061124161151a565b6040830151835191925063ffffffff1690611265906001600160801b0316836124b9565b106112cf5760405162461bcd60e51b815260206004820152603460248201527f5374616b696e6720706572696f64206973206f7665722c2075736520756e7374604482015273185ad948199d5b98dd1a5bdb881a5b9cdd19585960621b6064820152608401610487565b80826060015163ffffffff1683600001516112ea9190612617565b6001600160801b0316106113355760405162461bcd60e51b8152602060048201526012602482015271139bdd1a1a5b99c81d1bc81c185e481bdd5d60721b6044820152606401610487565b61133e816119da565b600061134a8284611b70565b835190915061137690611366906001600160801b0316846124b9565b846040015163ffffffff16611c0a565b336000908152600760205260409020805461ffff92909216918690811061139f5761139f61248d565b9060005260206000200160000160186101000a81548163ffffffff021916908363ffffffff160217905550600081116113ea5760405162461bcd60e51b815260040161048790612501565b80600460008282546113fc91906124b9565b9091555050600354604051637e90cb8960e11b81526001600160a01b039091169063fd21971290611433903390859060040161252f565b600060405180830381600087803b15801561144d57600080fd5b505af1158015611461573d6000803e3d6000fd5b5050505050505050565b6060600061148e836001600160a01b031660009081526007602052604090205490565b905060008167ffffffffffffffff8111156114ab576114ab612642565b6040519080825280602002602001820160405280156114d4578160200160208202803683370190505b50905060005b8281101561151257808282815181106114f5576114f561248d565b60209081029190910101528061150a816124e8565b9150506114da565b509392505050565b600061118b42611ffb565b61152d61202a565b6115376000612084565b565b61154161202a565b6006546001600160a01b03161561159a5760405162461bcd60e51b815260206004820152601a60248201527f64616e636520746f6b656e20697320616c7265616479207365740000000000006044820152606401610487565b6001600160a01b0381166115f05760405162461bcd60e51b815260206004820152601f60248201527f64616e636520746f6b656e2063616e6e6f7420626520302061646472657373006044820152606401610487565b600680546001600160a01b0319166001600160a01b0392909216919091179055565b61161a61202a565b6003546001600160a01b03161561166a5760405162461bcd60e51b815260206004820152601460248201527314dc1b1a5d1d195c88185b1c9958591e481cd95d60621b6044820152606401610487565b6001600160a01b0381166116c05760405162461bcd60e51b815260206004820152601c60248201527f73706c69747465722063616e6e6f7420626520302061646472657373000000006044820152606401610487565b600380546001600160a01b0319166001600160a01b0392909216919091179055565b6000806116ed61151a565b6001600160a01b0385166000908152600760205260408120805492935090918590811061171c5761171c61248d565b600091825260208083206040805160808101825291909301546001600160801b03811680835263ffffffff600160801b8304811694840194909452600160a01b82048416948301859052600160c01b909104909216606082015293506117829190612617565b6001600160801b031690506000826060015163ffffffff1683600001516117a99190612617565b6001600160801b0316905060006117c884602001518560400151610ebe565b90506117d6828487846120d4565b98975050505050505050565b6117ea61202a565b6002541561183a5760405162461bcd60e51b815260206004820152601c60248201527f5374616b696e672068617320616c726561647920737461727465642e000000006044820152606401610487565b42600255565b61184861202a565b600081116118985760405162461bcd60e51b815260206004820152601b60248201527f56616c7565206d75737420626520626967676572207468616e203000000000006044820152606401610487565b600155565b6000816001166000036118c657506000908152600560205260409020546001600160601b031690565b600560006118d56001856124b9565b8152602081019190915260400160002054600160801b90046001600160601b031692915050565b919050565b61190961202a565b6001600160a01b03811661196e5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610487565b61197781612084565b50565b6000816001166000036119a75750600090815260056020526040902054600160601b900463ffffffff1690565b600560006119b66001856124b9565b8152602081019190915260400160002054600160e01b900463ffffffff1692915050565b60006119e582611f64565b90508181106119f2575050565b6003546040516370a0823160e01b81526000916001600160a01b0316906370a0823190611a23903090600401612449565b602060405180830381865afa158015611a40573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a6491906125dc565b9050815b8381101561083b5780600116600003611adc57600081815260056020526040902054600160601b900463ffffffff1615611ad757611aa58261219e565b600082815260056020526040902080546bffffffffffffffffffffffff19166001600160601b03929092169190911790555b611b5e565b6000600581611aec6001856124b9565b8152602081019190915260400160002054600160e01b900463ffffffff161115611b5e57611b198261219e565b60056000611b286001856124b9565b815260200190815260200160002060000160106101000a8154816001600160601b0302191690836001600160601b031602179055505b80611b68816124e8565b915050611a68565b80516000906001600160801b0316611bbd5760405162461bcd60e51b815260206004820152601060248201526f1251081a5cc81b9bdd081cdd185ad95960821b6044820152606401610487565b6000611c0283600001516001600160801b031685856040015163ffffffff16866060015163ffffffff16611bfd8860200151896040015161ffff16610ebe565b6121e9565b949350505050565b600081831115611c1a5781611c1c565b825b9392505050565b336000908152600760205260408120805482919084908110611c4757611c4761248d565b600091825260208083206040805160808101825291909301546001600160801b038116825263ffffffff600160801b8204811693830193909352600160a01b8104831693820193909352600160c01b9092041660608201529150611ca961151a565b6040830151835191925063ffffffff1690611ccd906001600160801b0316836124b9565b1015611d155760405162461bcd60e51b815260206004820152601760248201527629ba30b5b4b733903832b934b7b2103737ba1037bb32b960491b6044820152606401610487565b611d1e816119da565b6000611d2a8284611b70565b336000908152600760205260409020805491925090611d4b906001906124b9565b81548110611d5b57611d5b61248d565b9060005260206000200160076000336001600160a01b03166001600160a01b031681526020019081526020016000208681548110611d9b57611d9b61248d565b600091825260208083208454920180546001600160801b031981166001600160801b039094169384178255855463ffffffff600160801b9182900481169091026001600160a01b0319909216909417178082558554600160a01b9081900485160263ffffffff60a01b198216811783559554600160c01b9081900490941690930263ffffffff60c01b1990951667ffffffffffffffff60a01b1990931692909217939093179055338152600790915260409020805480611e5d57611e5d612658565b600082815260209020810160001990810180546001600160e01b0319169055019055949350505050565b825b611e9383856124d0565b81101561083b5780600116600003611ef65760008181526005602052604090208054839190600c90611ed3908490600160601b900463ffffffff1661266e565b92506101000a81548163ffffffff021916908363ffffffff160217905550611f52565b8160056000611f066001856124b9565b815260208101919091526040016000208054601c90611f33908490600160e01b900463ffffffff1661266e565b92506101000a81548163ffffffff021916908363ffffffff1602179055505b80611f5c816124e8565b915050611e89565b600081815b6001821115611ff157611f7d6001836124b9565b915081600116600003611fa857506000818152600560205260409020546001600160601b0316611fdb565b60056000611fb76001856124b9565b8152602081019190915260400160002054600160801b90046001600160601b031690505b8015611fec57611c028260016124d0565b611f69565b5060009392505050565b600062093a806002548361200f91906124b9565b61201991906125f5565b6120249060016124d0565b92915050565b6000546001600160a01b031633146115375760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610487565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6000806120df61110b565b90506120eb8585611c0a565b945060006120f885611f64565b905060008080895b8981101561218f576121118161197a565b9150811561217d57848110156121315761212a8161189d565b925061215b565b6103e86001548761214291906125bd565b61214c91906125f5565b925061215883876124b9565b95505b8161216689856125bd565b61217091906125f5565b61217a90856124d0565b93505b80612187816124e8565b915050612100565b50919998505050505050505050565b6000806103e8600154600454856121b591906124b9565b6121bf91906125bd565b6121c991906125f5565b905080600460008282546121dd91906124d0565b90915550909392505050565b6000846121f684886124d0565b106122035750600061222c565b61222961221084886124d0565b6122238761221e888b6124d0565b611c0a565b84612235565b90505b95945050505050565b60008080855b858110156122de578060011660000361227157600081815260056020526040902054600160601b900463ffffffff1691506122a1565b600560006122806001846124b9565b8152602081019190915260400160002054600160e01b900463ffffffff1691505b81856122ac8361189d565b6122b691906125bd565b6122c091906125f5565b6122ca90846124d0565b9250806122d6816124e8565b91505061223b565b509095945050505050565b6000602082840312156122fb57600080fd5b5035919050565b803563ffffffff811681146118fc57600080fd5b6000806040838503121561232957600080fd5b61233283612302565b9150602083013561ffff8116811461234957600080fd5b809150509250929050565b6000806040838503121561236757600080fd5b61237083612302565b915061237e60208401612302565b90509250929050565b80356001600160a01b03811681146118fc57600080fd5b600080604083850312156123b157600080fd5b6123ba83612387565b946020939093013593505050565b600080604083850312156123db57600080fd5b50508035926020909101359150565b6000602082840312156123fc57600080fd5b611c1c82612387565b6020808252825182820181905260009190848201906040850190845b8181101561243d57835183529284019291840191600101612421565b50909695505050505050565b6001600160a01b0391909116815260200190565b602080825260169082015275139bc811185b98d948151bdad95b9cc81cdd185ad95960521b604082015260600190565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b6000828210156124cb576124cb6124a3565b500390565b600082198211156124e3576124e36124a3565b500190565b6000600182016124fa576124fa6124a3565b5060010190565b602080825260149082015273139bc81c995dd85c99081d1bc81c185e481bdd5d60621b604082015260600190565b6001600160a01b03929092168252602082015260400190565b6020808252600a9082015269125b9d985b1a5908125160b21b604082015260600190565b60006001600160601b0380831681851681830481118215151615612592576125926124a3565b02949350505050565b6000602082840312156125ad57600080fd5b81518015158114611c1c57600080fd5b60008160001904831182151516156125d7576125d76124a3565b500290565b6000602082840312156125ee57600080fd5b5051919050565b60008261261257634e487b7160e01b600052601260045260246000fd5b500490565b60006001600160801b03828116848216808303821115612639576126396124a3565b01949350505050565b634e487b7160e01b600052604160045260246000fd5b634e487b7160e01b600052603160045260246000fd5b600063ffffffff808316818516808303821115612639576126396124a356fea264697066735822122098215fd0a64096a14f1573d800aea6c78c8f9079d9487e49f00f43c9fd85708764736f6c634300080f00330000000000000000000000000000000000000000000000000000000000000014
Deployed Bytecode
0x608060405234801561001057600080fd5b50600436106101795760003560e01c80638aee8127116100d9578063bc57b45e11610087578063bc57b45e14610363578063bfa17ace1461036b578063d6c5693614610374578063d771b0a614610387578063f15ff12714610390578063f2fde38b146103a3578063f96690b5146103b657600080fd5b80638aee8127146102d65780638da5cb5b146102e95780638e6f6b771461030257806398d92aa91461030c5780639dcb6c871461031f578063a1ec3eac14610332578063abcfd9641461033a57600080fd5b80633b521efe116101365780633b521efe1461021b5780634e6311ba146102785780635195bd291461028b578063596be7cd146102935780635c7fd297146102a65780636eb227ce146102c6578063715018a6146102ce57600080fd5b80630c7cd9821461017e57806328e36cf8146101885780632e17de78146101cc57806335322f37146101df57806336e53b6d146101e75780633a17428d146101fa575b600080fd5b6101866103c9565b005b6101af7f0000000000000000000000000000000000000000000000000de0b6b3a764000081565b6040516001600160601b0390911681526020015b60405180910390f35b6101866101da3660046122e9565b61069e565b610186610841565b6101866101f5366004612316565b610b04565b61020d610208366004612354565b610ebe565b6040519081526020016101c3565b61022e61022936600461239e565b610f42565b6040516101c3919081516001600160801b0316815260208083015163ffffffff90811691830191909152604080840151821690830152606092830151169181019190915260800190565b61020d6102863660046123c8565b610fed565b61020d61110b565b6101866102a13660046122e9565b611190565b6102b96102b43660046123ea565b61146b565b6040516101c39190612405565b61020d61151a565b610186611525565b6101866102e43660046123ea565b611539565b6000546001600160a01b03166040516101c39190612449565b61020d62093a8081565b61018661031a3660046123ea565b611612565b61020d61032d36600461239e565b6116e2565b61020d603481565b61020d6103483660046123ea565b6001600160a01b031660009081526007602052604090205490565b6101866117e2565b61020d60015481565b6101866103823660046122e9565b611840565b61020d60025481565b61020d61039e3660046122e9565b61189d565b6101866103b13660046123ea565b611901565b61020d6103c43660046122e9565b61197a565b33600090815260076020908152604080832080548251818502810185019093528083529192909190849084015b8282101561046057600084815260209081902060408051608081018252918501546001600160801b038116835263ffffffff600160801b8204811684860152600160a01b8204811692840192909252600160c01b90041660608201528252600190920191016103f6565b50505050905060008151116104905760405162461bcd60e51b81526004016104879061245d565b60405180910390fd5b600061049a61151a565b90506104a5816119da565b6000808080805b86518110156105fa578681815181106104c7576104c761248d565b6020026020010151600001516001600160801b031693508681815181106104f0576104f061248d565b60200260200101516040015163ffffffff1692508681815181106105165761051661248d565b60200260200101516060015163ffffffff16915082848761053791906124b9565b10801561054c57508561054a83866124d0565b105b156105e857610574868883815181106105675761056761248d565b6020026020010151611b70565b61057e90866124d0565b945061059361058d85886124b9565b84611c0a565b336000908152600760205260409020805461ffff9290921691839081106105bc576105bc61248d565b9060005260206000200160000160186101000a81548163ffffffff021916908363ffffffff1602179055505b806105f2816124e8565b9150506104ac565b506000841161061b5760405162461bcd60e51b815260040161048790612501565b836004600082825461062d91906124b9565b9091555050600354604051637e90cb8960e11b81526001600160a01b039091169063fd21971290610664903390889060040161252f565b600060405180830381600087803b15801561067e57600080fd5b505af1158015610692573d6000803e3d6000fd5b50505050505050505050565b3360009081526007602052604090205481106106cc5760405162461bcd60e51b815260040161048790612548565b33600090815260076020526040812080547f0000000000000000000000000000000000000000000000000de0b6b3a76400009190849081106107105761071061248d565b6000918252602090912001546107339190600160801b900463ffffffff1661256c565b6001600160601b03169050600061074983611c23565b9050806004600082825461075d91906124b9565b9091555050600354604051637e90cb8960e11b81526001600160a01b039091169063fd21971290610794903390859060040161252f565b600060405180830381600087803b1580156107ae57600080fd5b505af11580156107c2573d6000803e3d6000fd5b505060065460405163823b416760e01b81526001600160a01b03909116925063823b416791506107f8903390869060040161252f565b6020604051808303816000875af1158015610817573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061083b919061259b565b50505050565b3360009081526007602052604090205461086d5760405162461bcd60e51b81526004016104879061245d565b600061087761151a565b905060008060005b336000908152600760205260409020548110156109c4573360009081526007602052604081208054839081106108b7576108b761248d565b60009182526020808320909101543383526007909152604090912080546001600160801b03909216925090839081106108f2576108f261248d565b600091825260209091200154600160a01b900463ffffffff1661091582876124b9565b106109b05733600090815260076020526040902080547f0000000000000000000000000000000000000000000000000de0b6b3a764000091908490811061095e5761095e61248d565b6000918252602090912001546109819190600160801b900463ffffffff1661256c565b610994906001600160601b0316846124d0565b925061099f82611c23565b6109a990856124d0565b93506109be565b6109bb6001836124d0565b91505b5061087f565b60008311610a0d5760405162461bcd60e51b815260206004820152601660248201527527379039ba30b5b4b733903832b934b7b21037bb32b960511b6044820152606401610487565b8260046000828254610a1f91906124b9565b9091555050600354604051637e90cb8960e11b81526001600160a01b039091169063fd21971290610a56903390879060040161252f565b600060405180830381600087803b158015610a7057600080fd5b505af1158015610a84573d6000803e3d6000fd5b505060065460405163823b416760e01b81526001600160a01b03909116925063823b41679150610aba903390869060040161252f565b6020604051808303816000875af1158015610ad9573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610afd919061259b565b5050505050565b8061ffff16600060025411610b555760405162461bcd60e51b815260206004820152601760248201527614dd185ada5b99c81a185cc81b9bdd081cdd185c9d1959604a1b6044820152606401610487565b60018163ffffffff161015610bac5760405162461bcd60e51b815260206004820152601d60248201527f4d696e696d756d207374616b696e6720706572696f642031207765656b0000006044820152606401610487565b60348163ffffffff161115610c035760405162461bcd60e51b815260206004820152601d60248201527f4d6178696d756d207374616b696e6720706572696f64203120796561720000006044820152606401610487565b60008363ffffffff1611610c595760405162461bcd60e51b815260206004820152601e60248201527f4e65656420746f207374616b65206174206c6561737420312044414e434500006044820152606401610487565b6000610c946001600160601b037f0000000000000000000000000000000000000000000000000de0b6b3a76400001663ffffffff86166125bd565b600654604051636eb1769f60e11b81523360048201523060248201529192506000916001600160a01b039091169063dd62ed3e90604401602060405180830381865afa158015610ce8573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d0c91906125dc565b905081811015610d5a5760405162461bcd60e51b8152602060048201526019602482015278436865636b2074686520746f6b656e20616c6c6f77616e636560381b6044820152606401610487565b6000610d6461151a565b600654604051630650fe7d60e01b8152336004820152306024820152604481018690529192506001600160a01b031690630650fe7d906064016020604051808303816000875af1158015610dbc573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610de0919061259b565b5033600090815260076020908152604080832081516080810183526001600160801b03808716825263ffffffff808d1683870190815261ffff8d16958401868152606085018981528654600181018855968a529790982093519390940180549451975196518216600160c01b0263ffffffff60c01b19978316600160a01b029790971667ffffffffffffffff60a01b1998909216600160801b026001600160a01b0319909516939092169290921792909217949094169390931791909117909155610eb6908290610eb18982610ebe565b611e87565b505050505050565b600063ffffffff82166032826034610ed784601e6125bd565b610ee191906125f5565b90506000610ef06034806125bd565b84610efc8160146125bd565b610f0691906125bd565b610f1091906125f5565b905080610f1d83856124d0565b610f2791906124d0565b610f379063ffffffff89166125bd565b979650505050505050565b6040805160808101825260008082526020808301829052828401829052606083018290526001600160a01b03861682526007905291909120805483908110610f8c57610f8c61248d565b60009182526020918290206040805160808101825292909101546001600160801b038116835263ffffffff600160801b8204811694840194909452600160a01b8104841691830191909152600160c01b900490911660608201529392505050565b600080610ff861151a565b9050600061100461110b565b9050600061101183611f64565b90506000865b82811015611046576110288161189d565b61103290836124d0565b91508061103e816124e8565b915050611017565b506000825b858110156110ac57600061105e8261197a565b111561109a576103e86001548661107591906125bd565b61107f91906125f5565b915061108b82866124b9565b945061109782846124d0565b92505b806110a4816124e8565b91505061104b565b50845b878110156110fe576103e8600154866110c891906125bd565b6110d291906125f5565b91506110de82866124b9565b94506110ea82846124d0565b9250806110f6816124e8565b9150506110af565b5090979650505050505050565b600480546003546040516370a0823160e01b81526000936001600160a01b03909216916370a082319161114091309101612449565b602060405180830381865afa15801561115d573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061118191906125dc565b61118b91906124b9565b905090565b3360009081526007602052604090205481106111be5760405162461bcd60e51b815260040161048790612548565b3360009081526007602052604081208054839081106111df576111df61248d565b600091825260208083206040805160808101825291909301546001600160801b038116825263ffffffff600160801b8204811693830193909352600160a01b8104831693820193909352600160c01b909204166060820152915061124161151a565b6040830151835191925063ffffffff1690611265906001600160801b0316836124b9565b106112cf5760405162461bcd60e51b815260206004820152603460248201527f5374616b696e6720706572696f64206973206f7665722c2075736520756e7374604482015273185ad948199d5b98dd1a5bdb881a5b9cdd19585960621b6064820152608401610487565b80826060015163ffffffff1683600001516112ea9190612617565b6001600160801b0316106113355760405162461bcd60e51b8152602060048201526012602482015271139bdd1a1a5b99c81d1bc81c185e481bdd5d60721b6044820152606401610487565b61133e816119da565b600061134a8284611b70565b835190915061137690611366906001600160801b0316846124b9565b846040015163ffffffff16611c0a565b336000908152600760205260409020805461ffff92909216918690811061139f5761139f61248d565b9060005260206000200160000160186101000a81548163ffffffff021916908363ffffffff160217905550600081116113ea5760405162461bcd60e51b815260040161048790612501565b80600460008282546113fc91906124b9565b9091555050600354604051637e90cb8960e11b81526001600160a01b039091169063fd21971290611433903390859060040161252f565b600060405180830381600087803b15801561144d57600080fd5b505af1158015611461573d6000803e3d6000fd5b5050505050505050565b6060600061148e836001600160a01b031660009081526007602052604090205490565b905060008167ffffffffffffffff8111156114ab576114ab612642565b6040519080825280602002602001820160405280156114d4578160200160208202803683370190505b50905060005b8281101561151257808282815181106114f5576114f561248d565b60209081029190910101528061150a816124e8565b9150506114da565b509392505050565b600061118b42611ffb565b61152d61202a565b6115376000612084565b565b61154161202a565b6006546001600160a01b03161561159a5760405162461bcd60e51b815260206004820152601a60248201527f64616e636520746f6b656e20697320616c7265616479207365740000000000006044820152606401610487565b6001600160a01b0381166115f05760405162461bcd60e51b815260206004820152601f60248201527f64616e636520746f6b656e2063616e6e6f7420626520302061646472657373006044820152606401610487565b600680546001600160a01b0319166001600160a01b0392909216919091179055565b61161a61202a565b6003546001600160a01b03161561166a5760405162461bcd60e51b815260206004820152601460248201527314dc1b1a5d1d195c88185b1c9958591e481cd95d60621b6044820152606401610487565b6001600160a01b0381166116c05760405162461bcd60e51b815260206004820152601c60248201527f73706c69747465722063616e6e6f7420626520302061646472657373000000006044820152606401610487565b600380546001600160a01b0319166001600160a01b0392909216919091179055565b6000806116ed61151a565b6001600160a01b0385166000908152600760205260408120805492935090918590811061171c5761171c61248d565b600091825260208083206040805160808101825291909301546001600160801b03811680835263ffffffff600160801b8304811694840194909452600160a01b82048416948301859052600160c01b909104909216606082015293506117829190612617565b6001600160801b031690506000826060015163ffffffff1683600001516117a99190612617565b6001600160801b0316905060006117c884602001518560400151610ebe565b90506117d6828487846120d4565b98975050505050505050565b6117ea61202a565b6002541561183a5760405162461bcd60e51b815260206004820152601c60248201527f5374616b696e672068617320616c726561647920737461727465642e000000006044820152606401610487565b42600255565b61184861202a565b600081116118985760405162461bcd60e51b815260206004820152601b60248201527f56616c7565206d75737420626520626967676572207468616e203000000000006044820152606401610487565b600155565b6000816001166000036118c657506000908152600560205260409020546001600160601b031690565b600560006118d56001856124b9565b8152602081019190915260400160002054600160801b90046001600160601b031692915050565b919050565b61190961202a565b6001600160a01b03811661196e5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610487565b61197781612084565b50565b6000816001166000036119a75750600090815260056020526040902054600160601b900463ffffffff1690565b600560006119b66001856124b9565b8152602081019190915260400160002054600160e01b900463ffffffff1692915050565b60006119e582611f64565b90508181106119f2575050565b6003546040516370a0823160e01b81526000916001600160a01b0316906370a0823190611a23903090600401612449565b602060405180830381865afa158015611a40573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a6491906125dc565b9050815b8381101561083b5780600116600003611adc57600081815260056020526040902054600160601b900463ffffffff1615611ad757611aa58261219e565b600082815260056020526040902080546bffffffffffffffffffffffff19166001600160601b03929092169190911790555b611b5e565b6000600581611aec6001856124b9565b8152602081019190915260400160002054600160e01b900463ffffffff161115611b5e57611b198261219e565b60056000611b286001856124b9565b815260200190815260200160002060000160106101000a8154816001600160601b0302191690836001600160601b031602179055505b80611b68816124e8565b915050611a68565b80516000906001600160801b0316611bbd5760405162461bcd60e51b815260206004820152601060248201526f1251081a5cc81b9bdd081cdd185ad95960821b6044820152606401610487565b6000611c0283600001516001600160801b031685856040015163ffffffff16866060015163ffffffff16611bfd8860200151896040015161ffff16610ebe565b6121e9565b949350505050565b600081831115611c1a5781611c1c565b825b9392505050565b336000908152600760205260408120805482919084908110611c4757611c4761248d565b600091825260208083206040805160808101825291909301546001600160801b038116825263ffffffff600160801b8204811693830193909352600160a01b8104831693820193909352600160c01b9092041660608201529150611ca961151a565b6040830151835191925063ffffffff1690611ccd906001600160801b0316836124b9565b1015611d155760405162461bcd60e51b815260206004820152601760248201527629ba30b5b4b733903832b934b7b2103737ba1037bb32b960491b6044820152606401610487565b611d1e816119da565b6000611d2a8284611b70565b336000908152600760205260409020805491925090611d4b906001906124b9565b81548110611d5b57611d5b61248d565b9060005260206000200160076000336001600160a01b03166001600160a01b031681526020019081526020016000208681548110611d9b57611d9b61248d565b600091825260208083208454920180546001600160801b031981166001600160801b039094169384178255855463ffffffff600160801b9182900481169091026001600160a01b0319909216909417178082558554600160a01b9081900485160263ffffffff60a01b198216811783559554600160c01b9081900490941690930263ffffffff60c01b1990951667ffffffffffffffff60a01b1990931692909217939093179055338152600790915260409020805480611e5d57611e5d612658565b600082815260209020810160001990810180546001600160e01b0319169055019055949350505050565b825b611e9383856124d0565b81101561083b5780600116600003611ef65760008181526005602052604090208054839190600c90611ed3908490600160601b900463ffffffff1661266e565b92506101000a81548163ffffffff021916908363ffffffff160217905550611f52565b8160056000611f066001856124b9565b815260208101919091526040016000208054601c90611f33908490600160e01b900463ffffffff1661266e565b92506101000a81548163ffffffff021916908363ffffffff1602179055505b80611f5c816124e8565b915050611e89565b600081815b6001821115611ff157611f7d6001836124b9565b915081600116600003611fa857506000818152600560205260409020546001600160601b0316611fdb565b60056000611fb76001856124b9565b8152602081019190915260400160002054600160801b90046001600160601b031690505b8015611fec57611c028260016124d0565b611f69565b5060009392505050565b600062093a806002548361200f91906124b9565b61201991906125f5565b6120249060016124d0565b92915050565b6000546001600160a01b031633146115375760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610487565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6000806120df61110b565b90506120eb8585611c0a565b945060006120f885611f64565b905060008080895b8981101561218f576121118161197a565b9150811561217d57848110156121315761212a8161189d565b925061215b565b6103e86001548761214291906125bd565b61214c91906125f5565b925061215883876124b9565b95505b8161216689856125bd565b61217091906125f5565b61217a90856124d0565b93505b80612187816124e8565b915050612100565b50919998505050505050505050565b6000806103e8600154600454856121b591906124b9565b6121bf91906125bd565b6121c991906125f5565b905080600460008282546121dd91906124d0565b90915550909392505050565b6000846121f684886124d0565b106122035750600061222c565b61222961221084886124d0565b6122238761221e888b6124d0565b611c0a565b84612235565b90505b95945050505050565b60008080855b858110156122de578060011660000361227157600081815260056020526040902054600160601b900463ffffffff1691506122a1565b600560006122806001846124b9565b8152602081019190915260400160002054600160e01b900463ffffffff1691505b81856122ac8361189d565b6122b691906125bd565b6122c091906125f5565b6122ca90846124d0565b9250806122d6816124e8565b91505061223b565b509095945050505050565b6000602082840312156122fb57600080fd5b5035919050565b803563ffffffff811681146118fc57600080fd5b6000806040838503121561232957600080fd5b61233283612302565b9150602083013561ffff8116811461234957600080fd5b809150509250929050565b6000806040838503121561236757600080fd5b61237083612302565b915061237e60208401612302565b90509250929050565b80356001600160a01b03811681146118fc57600080fd5b600080604083850312156123b157600080fd5b6123ba83612387565b946020939093013593505050565b600080604083850312156123db57600080fd5b50508035926020909101359150565b6000602082840312156123fc57600080fd5b611c1c82612387565b6020808252825182820181905260009190848201906040850190845b8181101561243d57835183529284019291840191600101612421565b50909695505050505050565b6001600160a01b0391909116815260200190565b602080825260169082015275139bc811185b98d948151bdad95b9cc81cdd185ad95960521b604082015260600190565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b6000828210156124cb576124cb6124a3565b500390565b600082198211156124e3576124e36124a3565b500190565b6000600182016124fa576124fa6124a3565b5060010190565b602080825260149082015273139bc81c995dd85c99081d1bc81c185e481bdd5d60621b604082015260600190565b6001600160a01b03929092168252602082015260400190565b6020808252600a9082015269125b9d985b1a5908125160b21b604082015260600190565b60006001600160601b0380831681851681830481118215151615612592576125926124a3565b02949350505050565b6000602082840312156125ad57600080fd5b81518015158114611c1c57600080fd5b60008160001904831182151516156125d7576125d76124a3565b500290565b6000602082840312156125ee57600080fd5b5051919050565b60008261261257634e487b7160e01b600052601260045260246000fd5b500490565b60006001600160801b03828116848216808303821115612639576126396124a3565b01949350505050565b634e487b7160e01b600052604160045260246000fd5b634e487b7160e01b600052603160045260246000fd5b600063ffffffff808316818516808303821115612639576126396124a356fea264697066735822122098215fd0a64096a14f1573d800aea6c78c8f9079d9487e49f00f43c9fd85708764736f6c634300080f0033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
0000000000000000000000000000000000000000000000000000000000000014
-----Decoded View---------------
Arg [0] : percentPerWeek (uint256): 20
-----Encoded View---------------
1 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000014
Loading...
Loading
Loading...
Loading
Net Worth in USD
$0.00
Net Worth in ETH
0
Multichain Portfolio | 34 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.