Source Code
| Transaction Hash |
Method
|
Block
|
From
|
|
To
|
||||
|---|---|---|---|---|---|---|---|---|---|
Loading...
Loading
Loading...
Loading
Cross-Chain Transactions
Loading...
Loading
Contract Name:
BigApeSoloStaking
Compiler Version
v0.8.16+commit.07a7930e
Contract Source Code (Solidity)
/**
*Submitted for verification at Etherscan.io on 2022-11-10
*/
//SPDX-License-Identifier: MIT
pragma solidity 0.8.16;
//import "@nomiclabs/buidler/console.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 GSN meta-transactions the account sending and
* paying for execution may not be the actual sender (as far as an application
* is concerned).
*
* This contract is only required for intermediate, library-like contracts.
*/
contract Context {
// Empty internal constructor, to prevent people from mistakenly deploying
// an instance of this contract, which should be used via inheritance.
constructor() {}
function _msgSender() internal view returns (address payable) {
return payable(msg.sender);
}
function _msgData() internal view returns (bytes memory) {
this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691
return msg.data;
}
}
/**
* @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.
*/
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() {
address msgSender = _msgSender();
_owner = msgSender;
emit OwnershipTransferred(address(0), msgSender);
}
/**
* @dev Returns the address of the current owner.
*/
function owner() public view returns (address) {
return _owner;
}
/**
* @dev Throws if called by any account other than the owner.
*/
modifier onlyOwner() {
require(_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 onlyOwner {
emit OwnershipTransferred(_owner, address(0));
_owner = address(0);
}
/**
* @dev Transfers ownership of the contract to a new account (`newOwner`).
* Can only be called by the current owner.
*/
function transferOwnership(address newOwner) public onlyOwner {
_transferOwnership(newOwner);
}
/**
* @dev Transfers ownership of the contract to a new account (`newOwner`).
*/
function _transferOwnership(address newOwner) internal {
require(newOwner != address(0), 'Ownable: new owner is the zero address');
emit OwnershipTransferred(_owner, newOwner);
_owner = newOwner;
}
}
/**
* @dev Wrappers over Solidity's arithmetic operations with added overflow
* checks.
*
* Arithmetic operations in Solidity wrap on overflow. This can easily result
* in bugs, because programmers usually assume that an overflow raises an
* error, which is the standard behavior in high level programming languages.
* `SafeMath` restores this intuition by reverting the transaction when an
* operation overflows.
*
* Using this library instead of the unchecked operations eliminates an entire
* class of bugs, so it's recommended to use it always.
*/
library SafeMath {
/**
* @dev Returns the addition of two unsigned integers, reverting on
* overflow.
*
* Counterpart to Solidity's `+` operator.
*
* Requirements:
*
* - Addition cannot overflow.
*/
function add(uint256 a, uint256 b) internal pure returns (uint256) {
uint256 c = a + b;
require(c >= a, 'SafeMath: addition overflow');
return c;
}
/**
* @dev Returns the subtraction of two unsigned integers, reverting on
* overflow (when the result is negative).
*
* Counterpart to Solidity's `-` operator.
*
* Requirements:
*
* - Subtraction cannot overflow.
*/
function sub(uint256 a, uint256 b) internal pure returns (uint256) {
return sub(a, b, 'SafeMath: subtraction overflow');
}
/**
* @dev Returns the subtraction of two unsigned integers, reverting with custom message on
* overflow (when the result is negative).
*
* Counterpart to Solidity's `-` operator.
*
* Requirements:
*
* - Subtraction cannot overflow.
*/
function sub(
uint256 a,
uint256 b,
string memory errorMessage
) internal pure returns (uint256) {
require(b <= a, errorMessage);
uint256 c = a - b;
return c;
}
/**
* @dev Returns the multiplication of two unsigned integers, reverting on
* overflow.
*
* Counterpart to Solidity's `*` operator.
*
* Requirements:
*
* - Multiplication cannot overflow.
*/
function mul(uint256 a, uint256 b) internal pure returns (uint256) {
// Gas optimization: this is cheaper than requiring 'a' not being zero, but the
// benefit is lost if 'b' is also tested.
// See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522
if (a == 0) {
return 0;
}
uint256 c = a * b;
require(c / a == b, 'SafeMath: multiplication overflow');
return c;
}
/**
* @dev Returns the integer division of two unsigned integers. Reverts on
* division by zero. The result is rounded towards zero.
*
* Counterpart to Solidity's `/` operator. Note: this function uses a
* `revert` opcode (which leaves remaining gas untouched) while Solidity
* uses an invalid opcode to revert (consuming all remaining gas).
*
* Requirements:
*
* - The divisor cannot be zero.
*/
function div(uint256 a, uint256 b) internal pure returns (uint256) {
return div(a, b, 'SafeMath: division by zero');
}
/**
* @dev Returns the integer division of two unsigned integers. Reverts with custom message on
* division by zero. The result is rounded towards zero.
*
* Counterpart to Solidity's `/` operator. Note: this function uses a
* `revert` opcode (which leaves remaining gas untouched) while Solidity
* uses an invalid opcode to revert (consuming all remaining gas).
*
* Requirements:
*
* - The divisor cannot be zero.
*/
function div(
uint256 a,
uint256 b,
string memory errorMessage
) internal pure returns (uint256) {
require(b > 0, errorMessage);
uint256 c = a / b;
// assert(a == b * c + a % b); // There is no case in which this doesn't hold
return c;
}
/**
* @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
* Reverts when dividing by zero.
*
* Counterpart to Solidity's `%` operator. This function uses a `revert`
* opcode (which leaves remaining gas untouched) while Solidity uses an
* invalid opcode to revert (consuming all remaining gas).
*
* Requirements:
*
* - The divisor cannot be zero.
*/
function mod(uint256 a, uint256 b) internal pure returns (uint256) {
return mod(a, b, 'SafeMath: modulo by zero');
}
/**
* @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
* Reverts with custom message when dividing by zero.
*
* Counterpart to Solidity's `%` operator. This function uses a `revert`
* opcode (which leaves remaining gas untouched) while Solidity uses an
* invalid opcode to revert (consuming all remaining gas).
*
* Requirements:
*
* - The divisor cannot be zero.
*/
function mod(
uint256 a,
uint256 b,
string memory errorMessage
) internal pure returns (uint256) {
require(b != 0, errorMessage);
return a % b;
}
function min(uint256 x, uint256 y) internal pure returns (uint256 z) {
z = x < y ? x : y;
}
// babylonian method (https://en.wikipedia.org/wiki/Methods_of_computing_square_roots#Babylonian_method)
function sqrt(uint256 y) internal pure returns (uint256 z) {
if (y > 3) {
z = y;
uint256 x = y / 2 + 1;
while (x < z) {
z = x;
x = (y / x + x) / 2;
}
} else if (y != 0) {
z = 1;
}
}
}
interface IBEP20 {
/**
* @dev Returns the amount of tokens in existence.
*/
function totalSupply() external view returns (uint256);
/**
* @dev Returns the token decimals.
*/
function decimals() external view returns (uint8);
/**
* @dev Returns the token symbol.
*/
function symbol() external view returns (string memory);
/**
* @dev Returns the token name.
*/
function name() external view returns (string memory);
/**
* @dev Returns the bep token owner.
*/
function getOwner() external view returns (address);
/**
* @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);
}
/**
* @title SafeBEP20
* @dev Wrappers around BEP20 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 SafeBEP20 for IBEP20;` statement to your contract,
* which allows you to call the safe operations as `token.safeTransfer(...)`, etc.
*/
library SafeBEP20 {
using SafeMath for uint256;
using Address for address;
function safeTransfer(
IBEP20 token,
address to,
uint256 value
) internal {
_callOptionalReturn(token, abi.encodeWithSelector(token.transfer.selector, to, value));
}
function safeTransferFrom(
IBEP20 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
* {IBEP20-approve}, and its usage is discouraged.
*
* Whenever possible, use {safeIncreaseAllowance} and
* {safeDecreaseAllowance} instead.
*/
function safeApprove(
IBEP20 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),
'SafeBEP20: approve from non-zero to non-zero allowance'
);
_callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, value));
}
function safeIncreaseAllowance(
IBEP20 token,
address spender,
uint256 value
) internal {
uint256 newAllowance = token.allowance(address(this), spender).add(value);
_callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance));
}
function safeDecreaseAllowance(
IBEP20 token,
address spender,
uint256 value
) internal {
uint256 newAllowance = token.allowance(address(this), spender).sub(
value,
'SafeBEP20: decreased allowance below zero'
);
_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(IBEP20 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, 'SafeBEP20: low-level call failed');
if (returndata.length > 0) {
// Return data is optional
// solhint-disable-next-line max-line-length
require(abi.decode(returndata, (bool)), 'SafeBEP20: BEP20 operation did not succeed');
}
}
}
/**
* @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) {
// According to EIP-1052, 0x0 is the value returned for not-yet created accounts
// and 0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470 is returned
// for accounts without code, i.e. `keccak256('')`
bytes32 codehash;
bytes32 accountHash = 0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470;
// solhint-disable-next-line no-inline-assembly
assembly {
codehash := extcodehash(account)
}
return (codehash != accountHash && codehash != 0x0);
}
/**
* @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');
return _functionCallWithValue(target, data, value, errorMessage);
}
function _functionCallWithValue(
address target,
bytes memory data,
uint256 weiValue,
string memory errorMessage
) private returns (bytes memory) {
require(isContract(target), 'Address: call to non-contract');
// solhint-disable-next-line avoid-low-level-calls
(bool success, bytes memory returndata) = target.call{value: weiValue}(data);
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);
}
}
}
}
abstract contract ReentrancyGuard {
// Booleans are more expensive than uint256 or any type that takes up a full
// word because each write operation emits an extra SLOAD to first read the
// slot's contents, replace the bits taken up by the boolean, and then write
// back. This is the compiler's defense against contract upgrades and
// pointer aliasing, and it cannot be disabled.
// The values being non-zero value makes deployment a bit more expensive,
// but in exchange the refund on every call to nonReentrant will be lower in
// amount. Since refunds are capped to a percentage of the total
// transaction's gas, it is best to keep them low in cases like this one, to
// increase the likelihood of the full refund coming into effect.
uint256 private constant _NOT_ENTERED = 1;
uint256 private constant _ENTERED = 2;
uint256 private _status;
constructor() {
_status = _NOT_ENTERED;
}
/**
* @dev Prevents a contract from calling itself, directly or indirectly.
* Calling a `nonReentrant` function from another `nonReentrant`
* function is not supported. It is possible to prevent this from happening
* by making the `nonReentrant` function external, and making it call a
* `private` function that does the actual work.
*/
modifier nonReentrant() {
// On the first call to nonReentrant, _notEntered will be true
require(_status != _ENTERED, "ReentrancyGuard: reentrant call");
// Any calls to nonReentrant after this point will fail
_status = _ENTERED;
_;
// By storing the original value once again, a refund is triggered (see
// https://eips.ethereum.org/EIPS/eip-2200)
_status = _NOT_ENTERED;
}
}
contract BigApeSoloStaking is Ownable, ReentrancyGuard {
using SafeMath for uint256;
using SafeBEP20 for IBEP20;
// Info of each user.
struct UserInfo {
uint256 amount; // How many LP tokens the user has provided.
uint256 rewardDebt; // Reward debt. See explanation below.
}
// Info of each pool.
struct PoolInfo {
IBEP20 lpToken; // Address of LP token contract.
uint256 allocPoint; // How many allocation points assigned to this pool. Tokens to distribute per block.
uint256 lastRewardTimestamp; // Last block number that Tokens distribution occurs.
uint256 accTokensPerShare; // Accumulated Tokens per share, times 1e12. See below.
}
IBEP20 public immutable stakingToken;
IBEP20 public immutable rewardToken;
mapping (address => uint256) public holderUnlockTime;
uint256 public totalStaked;
uint256 public rewardsPerSecond;
uint256 public lockDuration;
uint256 public exitPenaltyPerc;
// Info of each pool.
PoolInfo[] public poolInfo;
// Info of each user that stakes LP tokens.
mapping (address => UserInfo) public userInfo;
// Total allocation poitns. Must be the sum of all allocation points in all pools.
uint256 private totalAllocPoint = 0;
event Deposit(address indexed user, uint256 amount);
event Withdraw(address indexed user, uint256 amount);
event Compound(address indexed user);
event RewardsPaid(address indexed user, uint256 amount);
event EmergencyWithdraw(address indexed user, uint256 amount);
constructor(address _tokenAddress, uint256 _rewardsPerSecond, uint256 _lockDurationInDays, uint256 _exitPenaltyPerc) {
stakingToken = IBEP20(_tokenAddress);
rewardToken = IBEP20(_tokenAddress);
rewardsPerSecond = _rewardsPerSecond;
lockDuration = _lockDurationInDays * 1 days;
exitPenaltyPerc = _exitPenaltyPerc;
// staking pool
poolInfo.push(PoolInfo({
lpToken: stakingToken,
allocPoint: 1000,
lastRewardTimestamp: 99999999999,
accTokensPerShare: 0
}));
totalAllocPoint = 1000;
}
function stopReward() external onlyOwner {
updatePool(0);
rewardsPerSecond = 0;
}
function startReward() external onlyOwner {
require(poolInfo[0].lastRewardTimestamp == 99999999999, "Can only start rewards once");
poolInfo[0].lastRewardTimestamp = block.timestamp;
}
// View function to see pending Reward on frontend.
function pendingReward(address _user) external view returns (uint256) {
PoolInfo storage pool = poolInfo[0];
UserInfo storage user = userInfo[_user];
if(pool.lastRewardTimestamp == 99999999999){
return 0;
}
uint256 accTokensPerShare = pool.accTokensPerShare;
uint256 lpSupply = totalStaked;
if (block.timestamp > pool.lastRewardTimestamp && lpSupply != 0) {
uint256 tokenReward = calculateNewRewards().mul(pool.allocPoint).div(totalAllocPoint);
accTokensPerShare = accTokensPerShare.add(tokenReward.mul(1e12).div(lpSupply));
}
return user.amount.mul(accTokensPerShare).div(1e12).sub(user.rewardDebt);
}
// Update reward variables of the given pool to be up-to-date.
function updatePool(uint256 _pid) internal {
PoolInfo storage pool = poolInfo[_pid];
if (block.timestamp <= pool.lastRewardTimestamp) {
return;
}
uint256 lpSupply = totalStaked;
if (lpSupply == 0) {
pool.lastRewardTimestamp = block.timestamp;
return;
}
uint256 tokenReward = calculateNewRewards().mul(pool.allocPoint).div(totalAllocPoint);
pool.accTokensPerShare = pool.accTokensPerShare.add(tokenReward.mul(1e12).div(lpSupply));
pool.lastRewardTimestamp = block.timestamp;
}
// Update reward variables for all pools. Be careful of gas spending!
function massUpdatePools() public onlyOwner {
uint256 length = poolInfo.length;
for (uint256 pid = 0; pid < length; ++pid) {
updatePool(pid);
}
}
// Stake primary tokens
function deposit(uint256 _amount) external nonReentrant {
if(holderUnlockTime[msg.sender] == 0){
holderUnlockTime[msg.sender] = block.timestamp + lockDuration;
}
PoolInfo storage pool = poolInfo[0];
UserInfo storage user = userInfo[msg.sender];
updatePool(0);
if (user.amount > 0) {
uint256 pending = user.amount.mul(pool.accTokensPerShare).div(1e12).sub(user.rewardDebt);
if(pending > 0) {
require(pending <= rewardsRemaining(), "Cannot withdraw other people's staked tokens. Contact an admin.");
rewardToken.safeTransfer(address(msg.sender), pending);
emit RewardsPaid(msg.sender, pending);
}
}
uint256 amountTransferred = 0;
if(_amount > 0) {
uint256 initialBalance = pool.lpToken.balanceOf(address(this));
pool.lpToken.safeTransferFrom(address(msg.sender), address(this), _amount);
amountTransferred = pool.lpToken.balanceOf(address(this)) - initialBalance;
user.amount = user.amount.add(amountTransferred);
totalStaked += amountTransferred;
}
user.rewardDebt = user.amount.mul(pool.accTokensPerShare).div(1e12);
emit Deposit(msg.sender, _amount);
}
function compound() external nonReentrant {
PoolInfo storage pool = poolInfo[0];
UserInfo storage user = userInfo[msg.sender];
updatePool(0);
if (user.amount > 0) {
uint256 pending = user.amount.mul(pool.accTokensPerShare).div(1e12).sub(user.rewardDebt);
if(pending > 0) {
require(pending <= rewardsRemaining(), "Cannot withdraw other people's staked tokens. Contact an admin.");
user.amount += pending;
totalStaked += pending;
emit RewardsPaid(msg.sender, pending);
}
}
user.rewardDebt = user.amount.mul(pool.accTokensPerShare).div(1e12);
emit Compound(msg.sender);
}
// Withdraw primary tokens from STAKING.
function withdraw() external nonReentrant {
require(holderUnlockTime[msg.sender] <= block.timestamp, "May not do normal withdraw early");
PoolInfo storage pool = poolInfo[0];
UserInfo storage user = userInfo[msg.sender];
uint256 _amount = user.amount;
updatePool(0);
uint256 pending = user.amount.mul(pool.accTokensPerShare).div(1e12).sub(user.rewardDebt);
if(pending > 0){
require(pending <= rewardsRemaining(), "Cannot withdraw other people's staked tokens. Contact an admin.");
rewardToken.safeTransfer(address(msg.sender), pending);
emit RewardsPaid(msg.sender, pending);
}
if(_amount > 0) {
user.amount = 0;
totalStaked -= _amount;
pool.lpToken.safeTransfer(address(msg.sender), _amount);
}
user.rewardDebt = user.amount.mul(pool.accTokensPerShare).div(1e12);
if(user.amount > 0){
holderUnlockTime[msg.sender] = block.timestamp + lockDuration;
} else {
holderUnlockTime[msg.sender] = 0;
}
emit Withdraw(msg.sender, _amount);
}
// Withdraw without caring about rewards. EMERGENCY ONLY.
function emergencyWithdraw() external nonReentrant {
PoolInfo storage pool = poolInfo[0];
UserInfo storage user = userInfo[msg.sender];
uint256 _amount = user.amount;
totalStaked -= _amount;
// exit penalty for early unstakers, penalty held on contract as rewards.
if(holderUnlockTime[msg.sender] >= block.timestamp){
_amount -= _amount * exitPenaltyPerc / 100;
}
holderUnlockTime[msg.sender] = 0;
pool.lpToken.safeTransfer(address(msg.sender), _amount);
user.amount = 0;
user.rewardDebt = 0;
emit EmergencyWithdraw(msg.sender, _amount);
}
// Withdraw reward. EMERGENCY ONLY. This allows the owner to migrate rewards to a new staking pool since we are not minting new tokens.
function emergencyRewardWithdraw(uint256 _amount) external onlyOwner {
require(_amount <= rewardToken.balanceOf(address(this)) - totalStaked, 'not enough tokens to take out');
rewardToken.safeTransfer(address(msg.sender), _amount);
}
function calculateNewRewards() public view returns (uint256) {
PoolInfo storage pool = poolInfo[0];
if(pool.lastRewardTimestamp > block.timestamp){
return 0;
}
return (((block.timestamp - pool.lastRewardTimestamp) * rewardsPerSecond));
}
function rewardsRemaining() public view returns (uint256){
return rewardToken.balanceOf(address(this)) - totalStaked;
}
function updateRewardsPerSecond(uint256 newRewardsPerSecond) external onlyOwner {
updatePool(0);
rewardsPerSecond = newRewardsPerSecond;
}
function updateLockDuration(uint256 daysForLock) external onlyOwner {
require(daysForLock <= 365, "Lock must be 365 days or less.");
lockDuration = daysForLock * 1 days;
}
function updateExitPenalty(uint256 newPenaltyPerc) external onlyOwner {
require(newPenaltyPerc <= 20, "May not set higher than 20%");
exitPenaltyPerc = newPenaltyPerc;
}
}Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
Contract ABI
API[{"inputs":[{"internalType":"address","name":"_tokenAddress","type":"address"},{"internalType":"uint256","name":"_rewardsPerSecond","type":"uint256"},{"internalType":"uint256","name":"_lockDurationInDays","type":"uint256"},{"internalType":"uint256","name":"_exitPenaltyPerc","type":"uint256"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"}],"name":"Compound","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Deposit","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"EmergencyWithdraw","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":"user","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"RewardsPaid","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Withdraw","type":"event"},{"inputs":[],"name":"calculateNewRewards","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"compound","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"deposit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"emergencyRewardWithdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"emergencyWithdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"exitPenaltyPerc","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"holderUnlockTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lockDuration","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"massUpdatePools","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_user","type":"address"}],"name":"pendingReward","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"poolInfo","outputs":[{"internalType":"contract IBEP20","name":"lpToken","type":"address"},{"internalType":"uint256","name":"allocPoint","type":"uint256"},{"internalType":"uint256","name":"lastRewardTimestamp","type":"uint256"},{"internalType":"uint256","name":"accTokensPerShare","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"rewardToken","outputs":[{"internalType":"contract IBEP20","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"rewardsPerSecond","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"rewardsRemaining","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"stakingToken","outputs":[{"internalType":"contract IBEP20","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"startReward","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"stopReward","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"totalStaked","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":"newPenaltyPerc","type":"uint256"}],"name":"updateExitPenalty","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"daysForLock","type":"uint256"}],"name":"updateLockDuration","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newRewardsPerSecond","type":"uint256"}],"name":"updateRewardsPerSecond","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"userInfo","outputs":[{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"rewardDebt","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]Contract Creation Code
60c060405260006009553480156200001657600080fd5b5060405162001d7838038062001d788339810160408190526200003991620001ab565b600080546001600160a01b031916339081178255604051909182917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a350600180556001600160a01b038416608081905260a0526004839055620000a48262015180620001f8565b60055560065550506040805160808082018352516001600160a01b0390811682526103e86020830181815264174876e7ff94840194855260006060850181815260078054600181018255925294517fa66cc928b5edb82af9bd49922954155ab7b0942694bea4ce44661d9a8736c688600490920291820180546001600160a01b0319169190951617909355517fa66cc928b5edb82af9bd49922954155ab7b0942694bea4ce44661d9a8736c68983015592517fa66cc928b5edb82af9bd49922954155ab7b0942694bea4ce44661d9a8736c68a82015590517fa66cc928b5edb82af9bd49922954155ab7b0942694bea4ce44661d9a8736c68b909101556009555062000226565b60008060008060808587031215620001c257600080fd5b84516001600160a01b0381168114620001da57600080fd5b60208601516040870151606090970151919890975090945092505050565b60008160001904831182151516156200022157634e487b7160e01b600052601160045260246000fd5b500290565b60805160a051611b096200026f6000396000818161038701528181610438015281816105110152818161067c015281816109670152610c3f0152600061025a0152611b096000f3fe608060405234801561001057600080fd5b506004361061018e5760003560e01c80638da5cb5b116100de578063d477edf411610097578063f2fde38b11610071578063f2fde38b14610354578063f40f0f5214610367578063f69e20461461037a578063f7c618c11461038257600080fd5b8063d477edf414610330578063db2e21bc14610343578063eacdaabc1461034b57600080fd5b80638da5cb5b146102be5780638e0b0198146102cf578063999e2f75146102e25780639f5662e2146102ea578063a913a5f7146102fd578063b6b55f251461031d57600080fd5b8063715018a61161014b57806378c196f31161012557806378c196f31461029c5780637b280def146102a457806380dc0672146102ad578063817b1cd2146102b557600080fd5b8063715018a61461024d57806372f702f314610255578063746c8ae11461029457600080fd5b806304554443146101935780631526fe27146101af5780631959a002146101ec5780633279beab146102285780633ccfd60b1461023d578063630b5ba114610245575b600080fd5b61019c60055481565b6040519081526020015b60405180910390f35b6101c26101bd36600461186d565b6103a9565b604080516001600160a01b03909516855260208501939093529183015260608201526080016101a6565b6102136101fa366004611886565b6008602052600090815260409020805460019091015482565b604080519283526020830191909152016101a6565b61023b61023636600461186d565b6103ed565b005b61023b61053b565b61023b6107ab565b61023b610800565b61027c7f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b0390911681526020016101a6565b61023b610874565b61019c610943565b61019c60065481565b61023b6109e1565b61019c60035481565b6000546001600160a01b031661027c565b61023b6102dd36600461186d565b610a1c565b61019c610a9c565b61023b6102f836600461186d565b610af9565b61019c61030b366004611886565b60026020526000908152604090205481565b61023b61032b36600461186d565b610b32565b61023b61033e36600461186d565b610e20565b61023b610eaf565b61019c60045481565b61023b610362366004611886565b610fda565b61019c610375366004611886565b61100d565b61023b6110fc565b61027c7f000000000000000000000000000000000000000000000000000000000000000081565b600781815481106103b957600080fd5b600091825260209091206004909102018054600182015460028301546003909301546001600160a01b039092169350919084565b6000546001600160a01b031633146104205760405162461bcd60e51b8152600401610417906118af565b60405180910390fd5b6003546040516370a0823160e01b81523060048201527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906370a0823190602401602060405180830381865afa158015610487573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906104ab91906118e4565b6104b59190611913565b8111156105045760405162461bcd60e51b815260206004820152601d60248201527f6e6f7420656e6f75676820746f6b656e7320746f2074616b65206f75740000006044820152606401610417565b6105386001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000163383611285565b50565b60026001540361055d5760405162461bcd60e51b815260040161041790611926565b6002600181905533600090815260209190915260409020544210156105c45760405162461bcd60e51b815260206004820181905260248201527f4d6179206e6f7420646f206e6f726d616c207769746864726177206561726c796044820152606401610417565b600060076000815481106105da576105da61195d565b6000918252602080832033845260089091526040832080546004909302909101935091610606906112ed565b6000610640836001015461063a64e8d4a510006106348860030154886000015461138490919063ffffffff16565b9061140f565b90611451565b905080156106d957610650610943565b81111561066f5760405162461bcd60e51b815260040161041790611973565b6106a36001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000163383611285565b60405181815233907fd5ec1b97fc4d048ade361b013c285a0a5c1c40ae32579013ad3798ee657d9de79060200160405180910390a25b8115610711576000808455600380548492906106f6908490611913565b90915550508354610711906001600160a01b03163384611285565b6003840154835461072c9164e8d4a510009161063491611384565b600184015582541561075a5760055461074590426119d1565b3360009081526002602052604090205561076b565b336000908152600260205260408120555b60405182815233907f884edad9ce6fa2440d8a54cc123490eb96d2768479d49ff9c7366125a9424364906020015b60405180910390a25050600180555050565b6000546001600160a01b031633146107d55760405162461bcd60e51b8152600401610417906118af565b60075460005b818110156107fc576107ec816112ed565b6107f5816119e4565b90506107db565b5050565b6000546001600160a01b0316331461082a5760405162461bcd60e51b8152600401610417906118af565b600080546040516001600160a01b03909116907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600080546001600160a01b0319169055565b6000546001600160a01b0316331461089e5760405162461bcd60e51b8152600401610417906118af565b60076000815481106108b2576108b261195d565b90600052602060002090600402016002015464174876e7ff146109175760405162461bcd60e51b815260206004820152601b60248201527f43616e206f6e6c792073746172742072657761726473206f6e636500000000006044820152606401610417565b42600760008154811061092c5761092c61195d565b906000526020600020906004020160020181905550565b6003546040516370a0823160e01b8152306004820152600091906001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016906370a0823190602401602060405180830381865afa1580156109ae573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109d291906118e4565b6109dc9190611913565b905090565b6000546001600160a01b03163314610a0b5760405162461bcd60e51b8152600401610417906118af565b610a1560006112ed565b6000600455565b6000546001600160a01b03163314610a465760405162461bcd60e51b8152600401610417906118af565b6014811115610a975760405162461bcd60e51b815260206004820152601b60248201527f4d6179206e6f742073657420686967686572207468616e2032302500000000006044820152606401610417565b600655565b6000806007600081548110610ab357610ab361195d565b906000526020600020906004020190504281600201541115610ad757600091505090565b6004546002820154610ae99042611913565b610af391906119fd565b91505090565b6000546001600160a01b03163314610b235760405162461bcd60e51b8152600401610417906118af565b610b2d60006112ed565b600455565b600260015403610b545760405162461bcd60e51b815260040161041790611926565b6002600181905533600090815260209190915260408120549003610b9057600554610b7f90426119d1565b336000908152600260205260409020555b60006007600081548110610ba657610ba661195d565b60009182526020808320338452600890915260408320600490920201925090610bce906112ed565b805415610c9e576000610c03826001015461063a64e8d4a510006106348760030154876000015461138490919063ffffffff16565b90508015610c9c57610c13610943565b811115610c325760405162461bcd60e51b815260040161041790611973565b610c666001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000163383611285565b60405181815233907fd5ec1b97fc4d048ade361b013c285a0a5c1c40ae32579013ad3798ee657d9de79060200160405180910390a25b505b60008315610dce5782546040516370a0823160e01b81523060048201526000916001600160a01b0316906370a0823190602401602060405180830381865afa158015610cee573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d1291906118e4565b8454909150610d2c906001600160a01b0316333088611493565b83546040516370a0823160e01b815230600482015282916001600160a01b0316906370a0823190602401602060405180830381865afa158015610d73573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d9791906118e4565b610da19190611913565b8354909250610db090836114d1565b835560038054839190600090610dc79084906119d1565b9091555050505b60038301548254610de99164e8d4a510009161063491611384565b600183015560405184815233907fe1fffcc4923d04b559f4d29a8bfc6cda04eb5b0d3c460751c2402c5c5cc9109c90602001610799565b6000546001600160a01b03163314610e4a5760405162461bcd60e51b8152600401610417906118af565b61016d811115610e9c5760405162461bcd60e51b815260206004820152601e60248201527f4c6f636b206d757374206265203336352064617973206f72206c6573732e00006044820152606401610417565b610ea981620151806119fd565b60055550565b600260015403610ed15760405162461bcd60e51b815260040161041790611926565b600260018190555060006007600081548110610eef57610eef61195d565b60009182526020808320338452600890915260408320805460038054600490950290930195509093909283929190610f28908490611913565b9091555050336000908152600260205260409020544211610f6a57606460065482610f5391906119fd565b610f5d9190611a1c565b610f679082611913565b90505b336000818152600260205260408120558354610f92916001600160a01b039091169083611285565b6000808355600183015560405181815233907f5fafa99d0643513820be26656b45130b01e1c03062e1266bf36f88cbd3bd96959060200160405180910390a250506001805550565b6000546001600160a01b031633146110045760405162461bcd60e51b8152600401610417906118af565b61053881611530565b60008060076000815481106110245761102461195d565b600091825260208083206001600160a01b038716845260089091526040909220600260049092029092019081015490925064174876e7ff0361106a575060009392505050565b600380830154905460028401544211801561108457508015155b156110ca5760006110a760095461063487600101546110a1610a9c565b90611384565b90506110c66110bf836106348464e8d4a51000611384565b84906114d1565b9250505b6110f2836001015461063a64e8d4a5100061063486886000015461138490919063ffffffff16565b9695505050505050565b60026001540361111e5760405162461bcd60e51b815260040161041790611926565b60026001819055506000600760008154811061113c5761113c61195d565b60009182526020808320338452600890915260408320600490920201925090611164906112ed565b805415611232576000611199826001015461063a64e8d4a510006106348760030154876000015461138490919063ffffffff16565b90508015611230576111a9610943565b8111156111c85760405162461bcd60e51b815260040161041790611973565b808260000160008282546111dc91906119d1565b9250508190555080600360008282546111f591906119d1565b909155505060405181815233907fd5ec1b97fc4d048ade361b013c285a0a5c1c40ae32579013ad3798ee657d9de79060200160405180910390a25b505b6003820154815461124d9164e8d4a510009161063491611384565b600182015560405133907fda323bd96658b18a6ce813e824305dc61760462bad6aaf52c65aebb8c8c9faa190600090a2505060018055565b6040516001600160a01b0383166024820152604481018290526112e890849063a9059cbb60e01b906064015b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b0319909316929092179091526115f0565b505050565b6000600782815481106113025761130261195d565b9060005260206000209060040201905080600201544211611321575050565b600354600081900361133857504260029091015550565b600061135060095461063485600101546110a1610a9c565b9050611373611368836106348464e8d4a51000611384565b6003850154906114d1565b600384015550504260029091015550565b60008260000361139657506000611409565b60006113a283856119fd565b9050826113af8583611a1c565b146114065760405162461bcd60e51b815260206004820152602160248201527f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f6044820152607760f81b6064820152608401610417565b90505b92915050565b600061140683836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f0000000000008152506116c2565b600061140683836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f7700008152506116f9565b6040516001600160a01b03808516602483015283166044820152606481018290526114cb9085906323b872dd60e01b906084016112b1565b50505050565b6000806114de83856119d1565b9050838110156114065760405162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f7700000000006044820152606401610417565b6001600160a01b0381166115955760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610417565b600080546040516001600160a01b03808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080546001600160a01b0319166001600160a01b0392909216919091179055565b6000611645826040518060400160405280602081526020017f5361666542455032303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b031661172a9092919063ffffffff16565b8051909150156112e857808060200190518101906116639190611a3e565b6112e85760405162461bcd60e51b815260206004820152602a60248201527f5361666542455032303a204245503230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b6064820152608401610417565b600081836116e35760405162461bcd60e51b81526004016104179190611a84565b5060006116f08486611a1c565b95945050505050565b6000818484111561171d5760405162461bcd60e51b81526004016104179190611a84565b5060006116f08486611913565b60606117398484600085611741565b949350505050565b606061174c85611834565b6117985760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610417565b600080866001600160a01b031685876040516117b49190611ab7565b60006040518083038185875af1925050503d80600081146117f1576040519150601f19603f3d011682016040523d82523d6000602084013e6117f6565b606091505b5091509150811561180a5791506117399050565b80511561181a5780518082602001fd5b8360405162461bcd60e51b81526004016104179190611a84565b6000813f7fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470818114801590611739575050151592915050565b60006020828403121561187f57600080fd5b5035919050565b60006020828403121561189857600080fd5b81356001600160a01b038116811461140657600080fd5b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b6000602082840312156118f657600080fd5b5051919050565b634e487b7160e01b600052601160045260246000fd5b81810381811115611409576114096118fd565b6020808252601f908201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604082015260600190565b634e487b7160e01b600052603260045260246000fd5b602080825260409082018190527f43616e6e6f74207769746864726177206f746865722070656f706c6527732073908201527f74616b656420746f6b656e732e2020436f6e7461637420616e2061646d696e2e606082015260800190565b80820180821115611409576114096118fd565b6000600182016119f6576119f66118fd565b5060010190565b6000816000190483118215151615611a1757611a176118fd565b500290565b600082611a3957634e487b7160e01b600052601260045260246000fd5b500490565b600060208284031215611a5057600080fd5b8151801515811461140657600080fd5b60005b83811015611a7b578181015183820152602001611a63565b50506000910152565b6020815260008251806020840152611aa3816040850160208701611a60565b601f01601f19169190910160400192915050565b60008251611ac9818460208701611a60565b919091019291505056fea264697066735822122065c276927ca24d99de5af8de6400172ab73ed8de5093c3553163e50d6dbfa17064736f6c63430008100033000000000000000000000000ed1a772b401ab1126e67db4cf0414a98e81756f20000000000000000000000000000000000000000000000001600ca63e2b0dccd00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
Deployed Bytecode
0x608060405234801561001057600080fd5b506004361061018e5760003560e01c80638da5cb5b116100de578063d477edf411610097578063f2fde38b11610071578063f2fde38b14610354578063f40f0f5214610367578063f69e20461461037a578063f7c618c11461038257600080fd5b8063d477edf414610330578063db2e21bc14610343578063eacdaabc1461034b57600080fd5b80638da5cb5b146102be5780638e0b0198146102cf578063999e2f75146102e25780639f5662e2146102ea578063a913a5f7146102fd578063b6b55f251461031d57600080fd5b8063715018a61161014b57806378c196f31161012557806378c196f31461029c5780637b280def146102a457806380dc0672146102ad578063817b1cd2146102b557600080fd5b8063715018a61461024d57806372f702f314610255578063746c8ae11461029457600080fd5b806304554443146101935780631526fe27146101af5780631959a002146101ec5780633279beab146102285780633ccfd60b1461023d578063630b5ba114610245575b600080fd5b61019c60055481565b6040519081526020015b60405180910390f35b6101c26101bd36600461186d565b6103a9565b604080516001600160a01b03909516855260208501939093529183015260608201526080016101a6565b6102136101fa366004611886565b6008602052600090815260409020805460019091015482565b604080519283526020830191909152016101a6565b61023b61023636600461186d565b6103ed565b005b61023b61053b565b61023b6107ab565b61023b610800565b61027c7f000000000000000000000000ed1a772b401ab1126e67db4cf0414a98e81756f281565b6040516001600160a01b0390911681526020016101a6565b61023b610874565b61019c610943565b61019c60065481565b61023b6109e1565b61019c60035481565b6000546001600160a01b031661027c565b61023b6102dd36600461186d565b610a1c565b61019c610a9c565b61023b6102f836600461186d565b610af9565b61019c61030b366004611886565b60026020526000908152604090205481565b61023b61032b36600461186d565b610b32565b61023b61033e36600461186d565b610e20565b61023b610eaf565b61019c60045481565b61023b610362366004611886565b610fda565b61019c610375366004611886565b61100d565b61023b6110fc565b61027c7f000000000000000000000000ed1a772b401ab1126e67db4cf0414a98e81756f281565b600781815481106103b957600080fd5b600091825260209091206004909102018054600182015460028301546003909301546001600160a01b039092169350919084565b6000546001600160a01b031633146104205760405162461bcd60e51b8152600401610417906118af565b60405180910390fd5b6003546040516370a0823160e01b81523060048201527f000000000000000000000000ed1a772b401ab1126e67db4cf0414a98e81756f26001600160a01b0316906370a0823190602401602060405180830381865afa158015610487573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906104ab91906118e4565b6104b59190611913565b8111156105045760405162461bcd60e51b815260206004820152601d60248201527f6e6f7420656e6f75676820746f6b656e7320746f2074616b65206f75740000006044820152606401610417565b6105386001600160a01b037f000000000000000000000000ed1a772b401ab1126e67db4cf0414a98e81756f2163383611285565b50565b60026001540361055d5760405162461bcd60e51b815260040161041790611926565b6002600181905533600090815260209190915260409020544210156105c45760405162461bcd60e51b815260206004820181905260248201527f4d6179206e6f7420646f206e6f726d616c207769746864726177206561726c796044820152606401610417565b600060076000815481106105da576105da61195d565b6000918252602080832033845260089091526040832080546004909302909101935091610606906112ed565b6000610640836001015461063a64e8d4a510006106348860030154886000015461138490919063ffffffff16565b9061140f565b90611451565b905080156106d957610650610943565b81111561066f5760405162461bcd60e51b815260040161041790611973565b6106a36001600160a01b037f000000000000000000000000ed1a772b401ab1126e67db4cf0414a98e81756f2163383611285565b60405181815233907fd5ec1b97fc4d048ade361b013c285a0a5c1c40ae32579013ad3798ee657d9de79060200160405180910390a25b8115610711576000808455600380548492906106f6908490611913565b90915550508354610711906001600160a01b03163384611285565b6003840154835461072c9164e8d4a510009161063491611384565b600184015582541561075a5760055461074590426119d1565b3360009081526002602052604090205561076b565b336000908152600260205260408120555b60405182815233907f884edad9ce6fa2440d8a54cc123490eb96d2768479d49ff9c7366125a9424364906020015b60405180910390a25050600180555050565b6000546001600160a01b031633146107d55760405162461bcd60e51b8152600401610417906118af565b60075460005b818110156107fc576107ec816112ed565b6107f5816119e4565b90506107db565b5050565b6000546001600160a01b0316331461082a5760405162461bcd60e51b8152600401610417906118af565b600080546040516001600160a01b03909116907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600080546001600160a01b0319169055565b6000546001600160a01b0316331461089e5760405162461bcd60e51b8152600401610417906118af565b60076000815481106108b2576108b261195d565b90600052602060002090600402016002015464174876e7ff146109175760405162461bcd60e51b815260206004820152601b60248201527f43616e206f6e6c792073746172742072657761726473206f6e636500000000006044820152606401610417565b42600760008154811061092c5761092c61195d565b906000526020600020906004020160020181905550565b6003546040516370a0823160e01b8152306004820152600091906001600160a01b037f000000000000000000000000ed1a772b401ab1126e67db4cf0414a98e81756f216906370a0823190602401602060405180830381865afa1580156109ae573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109d291906118e4565b6109dc9190611913565b905090565b6000546001600160a01b03163314610a0b5760405162461bcd60e51b8152600401610417906118af565b610a1560006112ed565b6000600455565b6000546001600160a01b03163314610a465760405162461bcd60e51b8152600401610417906118af565b6014811115610a975760405162461bcd60e51b815260206004820152601b60248201527f4d6179206e6f742073657420686967686572207468616e2032302500000000006044820152606401610417565b600655565b6000806007600081548110610ab357610ab361195d565b906000526020600020906004020190504281600201541115610ad757600091505090565b6004546002820154610ae99042611913565b610af391906119fd565b91505090565b6000546001600160a01b03163314610b235760405162461bcd60e51b8152600401610417906118af565b610b2d60006112ed565b600455565b600260015403610b545760405162461bcd60e51b815260040161041790611926565b6002600181905533600090815260209190915260408120549003610b9057600554610b7f90426119d1565b336000908152600260205260409020555b60006007600081548110610ba657610ba661195d565b60009182526020808320338452600890915260408320600490920201925090610bce906112ed565b805415610c9e576000610c03826001015461063a64e8d4a510006106348760030154876000015461138490919063ffffffff16565b90508015610c9c57610c13610943565b811115610c325760405162461bcd60e51b815260040161041790611973565b610c666001600160a01b037f000000000000000000000000ed1a772b401ab1126e67db4cf0414a98e81756f2163383611285565b60405181815233907fd5ec1b97fc4d048ade361b013c285a0a5c1c40ae32579013ad3798ee657d9de79060200160405180910390a25b505b60008315610dce5782546040516370a0823160e01b81523060048201526000916001600160a01b0316906370a0823190602401602060405180830381865afa158015610cee573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d1291906118e4565b8454909150610d2c906001600160a01b0316333088611493565b83546040516370a0823160e01b815230600482015282916001600160a01b0316906370a0823190602401602060405180830381865afa158015610d73573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d9791906118e4565b610da19190611913565b8354909250610db090836114d1565b835560038054839190600090610dc79084906119d1565b9091555050505b60038301548254610de99164e8d4a510009161063491611384565b600183015560405184815233907fe1fffcc4923d04b559f4d29a8bfc6cda04eb5b0d3c460751c2402c5c5cc9109c90602001610799565b6000546001600160a01b03163314610e4a5760405162461bcd60e51b8152600401610417906118af565b61016d811115610e9c5760405162461bcd60e51b815260206004820152601e60248201527f4c6f636b206d757374206265203336352064617973206f72206c6573732e00006044820152606401610417565b610ea981620151806119fd565b60055550565b600260015403610ed15760405162461bcd60e51b815260040161041790611926565b600260018190555060006007600081548110610eef57610eef61195d565b60009182526020808320338452600890915260408320805460038054600490950290930195509093909283929190610f28908490611913565b9091555050336000908152600260205260409020544211610f6a57606460065482610f5391906119fd565b610f5d9190611a1c565b610f679082611913565b90505b336000818152600260205260408120558354610f92916001600160a01b039091169083611285565b6000808355600183015560405181815233907f5fafa99d0643513820be26656b45130b01e1c03062e1266bf36f88cbd3bd96959060200160405180910390a250506001805550565b6000546001600160a01b031633146110045760405162461bcd60e51b8152600401610417906118af565b61053881611530565b60008060076000815481106110245761102461195d565b600091825260208083206001600160a01b038716845260089091526040909220600260049092029092019081015490925064174876e7ff0361106a575060009392505050565b600380830154905460028401544211801561108457508015155b156110ca5760006110a760095461063487600101546110a1610a9c565b90611384565b90506110c66110bf836106348464e8d4a51000611384565b84906114d1565b9250505b6110f2836001015461063a64e8d4a5100061063486886000015461138490919063ffffffff16565b9695505050505050565b60026001540361111e5760405162461bcd60e51b815260040161041790611926565b60026001819055506000600760008154811061113c5761113c61195d565b60009182526020808320338452600890915260408320600490920201925090611164906112ed565b805415611232576000611199826001015461063a64e8d4a510006106348760030154876000015461138490919063ffffffff16565b90508015611230576111a9610943565b8111156111c85760405162461bcd60e51b815260040161041790611973565b808260000160008282546111dc91906119d1565b9250508190555080600360008282546111f591906119d1565b909155505060405181815233907fd5ec1b97fc4d048ade361b013c285a0a5c1c40ae32579013ad3798ee657d9de79060200160405180910390a25b505b6003820154815461124d9164e8d4a510009161063491611384565b600182015560405133907fda323bd96658b18a6ce813e824305dc61760462bad6aaf52c65aebb8c8c9faa190600090a2505060018055565b6040516001600160a01b0383166024820152604481018290526112e890849063a9059cbb60e01b906064015b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b0319909316929092179091526115f0565b505050565b6000600782815481106113025761130261195d565b9060005260206000209060040201905080600201544211611321575050565b600354600081900361133857504260029091015550565b600061135060095461063485600101546110a1610a9c565b9050611373611368836106348464e8d4a51000611384565b6003850154906114d1565b600384015550504260029091015550565b60008260000361139657506000611409565b60006113a283856119fd565b9050826113af8583611a1c565b146114065760405162461bcd60e51b815260206004820152602160248201527f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f6044820152607760f81b6064820152608401610417565b90505b92915050565b600061140683836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f0000000000008152506116c2565b600061140683836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f7700008152506116f9565b6040516001600160a01b03808516602483015283166044820152606481018290526114cb9085906323b872dd60e01b906084016112b1565b50505050565b6000806114de83856119d1565b9050838110156114065760405162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f7700000000006044820152606401610417565b6001600160a01b0381166115955760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610417565b600080546040516001600160a01b03808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080546001600160a01b0319166001600160a01b0392909216919091179055565b6000611645826040518060400160405280602081526020017f5361666542455032303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b031661172a9092919063ffffffff16565b8051909150156112e857808060200190518101906116639190611a3e565b6112e85760405162461bcd60e51b815260206004820152602a60248201527f5361666542455032303a204245503230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b6064820152608401610417565b600081836116e35760405162461bcd60e51b81526004016104179190611a84565b5060006116f08486611a1c565b95945050505050565b6000818484111561171d5760405162461bcd60e51b81526004016104179190611a84565b5060006116f08486611913565b60606117398484600085611741565b949350505050565b606061174c85611834565b6117985760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610417565b600080866001600160a01b031685876040516117b49190611ab7565b60006040518083038185875af1925050503d80600081146117f1576040519150601f19603f3d011682016040523d82523d6000602084013e6117f6565b606091505b5091509150811561180a5791506117399050565b80511561181a5780518082602001fd5b8360405162461bcd60e51b81526004016104179190611a84565b6000813f7fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470818114801590611739575050151592915050565b60006020828403121561187f57600080fd5b5035919050565b60006020828403121561189857600080fd5b81356001600160a01b038116811461140657600080fd5b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b6000602082840312156118f657600080fd5b5051919050565b634e487b7160e01b600052601160045260246000fd5b81810381811115611409576114096118fd565b6020808252601f908201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604082015260600190565b634e487b7160e01b600052603260045260246000fd5b602080825260409082018190527f43616e6e6f74207769746864726177206f746865722070656f706c6527732073908201527f74616b656420746f6b656e732e2020436f6e7461637420616e2061646d696e2e606082015260800190565b80820180821115611409576114096118fd565b6000600182016119f6576119f66118fd565b5060010190565b6000816000190483118215151615611a1757611a176118fd565b500290565b600082611a3957634e487b7160e01b600052601260045260246000fd5b500490565b600060208284031215611a5057600080fd5b8151801515811461140657600080fd5b60005b83811015611a7b578181015183820152602001611a63565b50506000910152565b6020815260008251806020840152611aa3816040850160208701611a60565b601f01601f19169190910160400192915050565b60008251611ac9818460208701611a60565b919091019291505056fea264697066735822122065c276927ca24d99de5af8de6400172ab73ed8de5093c3553163e50d6dbfa17064736f6c63430008100033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
000000000000000000000000ed1a772b401ab1126e67db4cf0414a98e81756f20000000000000000000000000000000000000000000000001600ca63e2b0dccd00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
-----Decoded View---------------
Arg [0] : _tokenAddress (address): 0xED1A772b401AB1126E67dB4cF0414A98E81756f2
Arg [1] : _rewardsPerSecond (uint256): 1585489599188229325
Arg [2] : _lockDurationInDays (uint256): 0
Arg [3] : _exitPenaltyPerc (uint256): 0
-----Encoded View---------------
4 Constructor Arguments found :
Arg [0] : 000000000000000000000000ed1a772b401ab1126e67db4cf0414a98e81756f2
Arg [1] : 0000000000000000000000000000000000000000000000001600ca63e2b0dccd
Arg [2] : 0000000000000000000000000000000000000000000000000000000000000000
Arg [3] : 0000000000000000000000000000000000000000000000000000000000000000
Deployed Bytecode Sourcemap
24689:9881:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25669:27;;;;;;;;;160:25:1;;;148:2;133:18;25669:27:0;;;;;;;;25769:26;;;;;;:::i;:::-;;:::i;:::-;;;;-1:-1:-1;;;;;644:32:1;;;626:51;;708:2;693:18;;686:34;;;;736:18;;;729:34;794:2;779:18;;772:34;613:3;598:19;25769:26:0;381:431:1;25851:45:0;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;1282:25:1;;;1338:2;1323:18;;1316:34;;;;1255:18;25851:45:0;1108:248:1;33300:256:0;;;;;;:::i;:::-;;:::i;:::-;;31209:1206;;;:::i;28831:190::-;;;:::i;2810:140::-;;;:::i;25452:36::-;;;;;;;;-1:-1:-1;;;;;1539:32:1;;;1521:51;;1509:2;1494:18;25452:36:0;1361:217:1;27073:207:0;;;:::i;33863:133::-;;;:::i;25703:30::-;;;;;;26961:104;;;:::i;25598:26::-;;;;;;2168:79;2206:7;2233:6;-1:-1:-1;;;;;2233:6:0;2168:79;;34375:192;;;;;;:::i;:::-;;:::i;33564:291::-;;;:::i;34004:161::-;;;;;;:::i;:::-;;:::i;25537:52::-;;;;;;:::i;:::-;;;;;;;;;;;;;;29058:1339;;;;;;:::i;:::-;;:::i;34173:194::-;;;;;;:::i;:::-;;:::i;32486:665::-;;;:::i;25631:31::-;;;;;;3105:109;;;;;;:::i;:::-;;:::i;27345:727::-;;;;;;:::i;:::-;;:::i;30405:748::-;;;:::i;25495:35::-;;;;;25769:26;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;25769:26:0;;;;-1:-1:-1;25769:26:0;;;:::o;33300:256::-;2380:6;;-1:-1:-1;;;;;2380:6:0;911:10;2380:22;2372:67;;;;-1:-1:-1;;;2372:67:0;;;;;;;:::i;:::-;;;;;;;;;33438:11:::1;::::0;33399:36:::1;::::0;-1:-1:-1;;;33399:36:0;;33429:4:::1;33399:36;::::0;::::1;1521:51:1::0;33399:11:0::1;-1:-1:-1::0;;;;;33399:21:0::1;::::0;::::1;::::0;1494:18:1;;33399:36:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:50;;;;:::i;:::-;33388:7;:61;;33380:103;;;::::0;-1:-1:-1;;;33380:103:0;;2808:2:1;33380:103:0::1;::::0;::::1;2790:21:1::0;2847:2;2827:18;;;2820:30;2886:31;2866:18;;;2859:59;2935:18;;33380:103:0::1;2606:353:1::0;33380:103:0::1;33494:54;-1:-1:-1::0;;;;;33494:11:0::1;:24;33527:10;33540:7:::0;33494:24:::1;:54::i;:::-;33300:256:::0;:::o;31209:1206::-;23742:1;24340:7;;:19;24332:63;;;;-1:-1:-1;;;24332:63:0;;;;;;;:::i;:::-;23742:1;24473:7;:18;;;31289:10:::1;31272:28;::::0;;;::::1;::::0;;;;;;;;31304:15:::1;-1:-1:-1::0;31272:47:0::1;31264:92;;;::::0;-1:-1:-1;;;31264:92:0;;3526:2:1;31264:92:0::1;::::0;::::1;3508:21:1::0;;;3545:18;;;3538:30;3604:34;3584:18;;;3577:62;3656:18;;31264:92:0::1;3324:356:1::0;31264:92:0::1;31377:21;31401:8;31410:1;31401:11;;;;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;31456:10:::1;31447:20:::0;;:8:::1;:20:::0;;;;;;31498:11;;31401::::1;::::0;;::::1;::::0;;::::1;::::0;-1:-1:-1;31447:20:0;31520:13:::1;::::0;:10:::1;:13::i;:::-;31544:15;31562:70;31616:4;:15;;;31562:49;31606:4;31562:39;31578:4;:22;;;31562:4;:11;;;:15;;:39;;;;:::i;:::-;:43:::0;::::1;:49::i;:::-;:53:::0;::::1;:70::i;:::-;31544:88:::0;-1:-1:-1;31646:11:0;;31643:269:::1;;31692:18;:16;:18::i;:::-;31681:7;:29;;31673:106;;;;-1:-1:-1::0;;;31673:106:0::1;;;;;;;:::i;:::-;31794:54;-1:-1:-1::0;;;;;31794:11:0::1;:24;31827:10;31840:7:::0;31794:24:::1;:54::i;:::-;31868:32;::::0;160:25:1;;;31880:10:0::1;::::0;31868:32:::1;::::0;148:2:1;133:18;31868:32:0::1;;;;;;;31643:269;31927:11:::0;;31924:165:::1;;31969:1;31955:15:::0;;;31985:11:::1;:22:::0;;32000:7;;31969:1;31985:22:::1;::::0;32000:7;;31985:22:::1;:::i;:::-;::::0;;;-1:-1:-1;;32022:12:0;;:55:::1;::::0;-1:-1:-1;;;;;32022:12:0::1;32056:10;32069:7:::0;32022:25:::1;:55::i;:::-;32135:22;::::0;::::1;::::0;32119:11;;:49:::1;::::0;32163:4:::1;::::0;32119:39:::1;::::0;:15:::1;:39::i;:49::-;32101:15;::::0;::::1;:67:::0;32192:11;;:15;32189:172:::1;;32272:12;::::0;32254:30:::1;::::0;:15:::1;:30;:::i;:::-;32240:10;32223:28;::::0;;;:16:::1;:28;::::0;;;;:61;32189:172:::1;;;32334:10;32348:1;32317:28:::0;;;:16:::1;:28;::::0;;;;:32;32189:172:::1;32378:29;::::0;160:25:1;;;32387:10:0::1;::::0;32378:29:::1;::::0;148:2:1;133:18;32378:29:0::1;;;;;;;;-1:-1:-1::0;;23698:1:0;24652:22;;-1:-1:-1;;31209:1206:0:o;28831:190::-;2380:6;;-1:-1:-1;;;;;2380:6:0;911:10;2380:22;2372:67;;;;-1:-1:-1;;;2372:67:0;;;;;;;:::i;:::-;28903:8:::1;:15:::0;28886:14:::1;28929:85;28957:6;28951:3;:12;28929:85;;;28987:15;28998:3;28987:10;:15::i;:::-;28965:5;::::0;::::1;:::i;:::-;;;28929:85;;;;28875:146;28831:190::o:0;2810:140::-;2380:6;;-1:-1:-1;;;;;2380:6:0;911:10;2380:22;2372:67;;;;-1:-1:-1;;;2372:67:0;;;;;;;:::i;:::-;2909:1:::1;2893:6:::0;;2872:40:::1;::::0;-1:-1:-1;;;;;2893:6:0;;::::1;::::0;2872:40:::1;::::0;2909:1;;2872:40:::1;2940:1;2923:19:::0;;-1:-1:-1;;;;;;2923:19:0::1;::::0;;2810:140::o;27073:207::-;2380:6;;-1:-1:-1;;;;;2380:6:0;911:10;2380:22;2372:67;;;;-1:-1:-1;;;2372:67:0;;;;;;;:::i;:::-;27134:8:::1;27143:1;27134:11;;;;;;;;:::i;:::-;;;;;;;;;;;:31;;;27169:11;27134:46;27126:86;;;::::0;-1:-1:-1;;;27126:86:0;;4722:2:1;27126:86:0::1;::::0;::::1;4704:21:1::0;4761:2;4741:18;;;4734:30;4800:29;4780:18;;;4773:57;4847:18;;27126:86:0::1;4520:351:1::0;27126:86:0::1;27257:15;27223:8;27232:1;27223:11;;;;;;;;:::i;:::-;;;;;;;;;;;:31;;:49;;;;27073:207::o:0;33863:133::-;33977:11;;33938:36;;-1:-1:-1;;;33938:36:0;;33968:4;33938:36;;;1521:51:1;33912:7:0;;33977:11;-1:-1:-1;;;;;33938:11:0;:21;;;;1494:18:1;;33938:36:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:50;;;;:::i;:::-;33931:57;;33863:133;:::o;26961:104::-;2380:6;;-1:-1:-1;;;;;2380:6:0;911:10;2380:22;2372:67;;;;-1:-1:-1;;;2372:67:0;;;;;;;:::i;:::-;27013:13:::1;27024:1;27013:10;:13::i;:::-;27056:1;27037:16;:20:::0;26961:104::o;34375:192::-;2380:6;;-1:-1:-1;;;;;2380:6:0;911:10;2380:22;2372:67;;;;-1:-1:-1;;;2372:67:0;;;;;;;:::i;:::-;34482:2:::1;34464:14;:20;;34456:60;;;::::0;-1:-1:-1;;;34456:60:0;;5078:2:1;34456:60:0::1;::::0;::::1;5060:21:1::0;5117:2;5097:18;;;5090:30;5156:29;5136:18;;;5129:57;5203:18;;34456:60:0::1;4876:351:1::0;34456:60:0::1;34527:15;:32:::0;34375:192::o;33564:291::-;33616:7;33636:21;33660:8;33669:1;33660:11;;;;;;;;:::i;:::-;;;;;;;;;;;33636:35;;33712:15;33685:4;:24;;;:42;33682:81;;;33750:1;33743:8;;;33564:291;:::o;33682:81::-;33829:16;;33801:24;;;;33783:42;;:15;:42;:::i;:::-;33782:63;;;;:::i;:::-;33773:74;;;33564:291;:::o;34004:161::-;2380:6;;-1:-1:-1;;;;;2380:6:0;911:10;2380:22;2372:67;;;;-1:-1:-1;;;2372:67:0;;;;;;;:::i;:::-;34095:13:::1;34106:1;34095:10;:13::i;:::-;34119:16;:38:::0;34004:161::o;29058:1339::-;23742:1;24340:7;;:19;24332:63;;;;-1:-1:-1;;;24332:63:0;;;;;;;:::i;:::-;23742:1;24473:7;:18;;;29145:10:::1;29128:28;::::0;;;::::1;::::0;;;;;;;;:33;;29125:125:::1;;29226:12;::::0;29208:30:::1;::::0;:15:::1;:30;:::i;:::-;29194:10;29177:28;::::0;;;:16:::1;:28;::::0;;;;:61;29125:125:::1;29260:21;29284:8;29293:1;29284:11;;;;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;29339:10:::1;29330:20:::0;;:8:::1;:20:::0;;;;;;29284:11:::1;::::0;;::::1;;::::0;-1:-1:-1;29330:20:0;29363:13:::1;::::0;:10:::1;:13::i;:::-;29391:11:::0;;:15;29387:436:::1;;29423:15;29441:70;29495:4;:15;;;29441:49;29485:4;29441:39;29457:4;:22;;;29441:4;:11;;;:15;;:39;;;;:::i;:70::-;29423:88:::0;-1:-1:-1;29529:11:0;;29526:286:::1;;29580:18;:16;:18::i;:::-;29569:7;:29;;29561:106;;;;-1:-1:-1::0;;;29561:106:0::1;;;;;;;:::i;:::-;29686:54;-1:-1:-1::0;;;;;29686:11:0::1;:24;29719:10;29732:7:::0;29686:24:::1;:54::i;:::-;29764:32;::::0;160:25:1;;;29776:10:0::1;::::0;29764:32:::1;::::0;148:2:1;133:18;29764:32:0::1;;;;;;;29526:286;29408:415;29387:436;29833:25;29876:11:::0;;29873:393:::1;;29929:12:::0;;:37:::1;::::0;-1:-1:-1;;;29929:37:0;;29960:4:::1;29929:37;::::0;::::1;1521:51:1::0;29904:22:0::1;::::0;-1:-1:-1;;;;;29929:12:0::1;::::0;:22:::1;::::0;1494:18:1;;29929:37:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;29981:12:::0;;29904:62;;-1:-1:-1;29981:74:0::1;::::0;-1:-1:-1;;;;;29981:12:0::1;30019:10;30040:4;30047:7:::0;29981:29:::1;:74::i;:::-;30090:12:::0;;:37:::1;::::0;-1:-1:-1;;;30090:37:0;;30121:4:::1;30090:37;::::0;::::1;1521:51:1::0;30130:14:0;;-1:-1:-1;;;;;30090:12:0::1;::::0;:22:::1;::::0;1494:18:1;;30090:37:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:54;;;;:::i;:::-;30173:11:::0;;30070:74;;-1:-1:-1;30173:34:0::1;::::0;30070:74;30173:15:::1;:34::i;:::-;30159:48:::0;;30222:11:::1;:32:::0;;30237:17;;30222:11;30159::::1;::::0;30222:32:::1;::::0;30237:17;;30222:32:::1;:::i;:::-;::::0;;;-1:-1:-1;;;29873:393:0::1;30310:22;::::0;::::1;::::0;30294:11;;:49:::1;::::0;30338:4:::1;::::0;30294:39:::1;::::0;:15:::1;:39::i;:49::-;30276:15;::::0;::::1;:67:::0;30361:28:::1;::::0;160:25:1;;;30369:10:0::1;::::0;30361:28:::1;::::0;148:2:1;133:18;30361:28:0::1;14:177:1::0;34173:194:0;2380:6;;-1:-1:-1;;;;;2380:6:0;911:10;2380:22;2372:67;;;;-1:-1:-1;;;2372:67:0;;;;;;;:::i;:::-;34275:3:::1;34260:11;:18;;34252:61;;;::::0;-1:-1:-1;;;34252:61:0;;5607:2:1;34252:61:0::1;::::0;::::1;5589:21:1::0;5646:2;5626:18;;;5619:30;5685:32;5665:18;;;5658:60;5735:18;;34252:61:0::1;5405:354:1::0;34252:61:0::1;34339:20;:11:::0;34353:6:::1;34339:20;:::i;:::-;34324:12;:35:::0;-1:-1:-1;34173:194:0:o;32486:665::-;23742:1;24340:7;;:19;24332:63;;;;-1:-1:-1;;;24332:63:0;;;;;;;:::i;:::-;23742:1;24473:7;:18;;;;32548:21:::1;32572:8;32581:1;32572:11;;;;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;32627:10:::1;32618:20:::0;;:8:::1;:20:::0;;;;;;32667:11;;32689::::1;:22:::0;;32572:11:::1;::::0;;::::1;::::0;;::::1;::::0;-1:-1:-1;32618:20:0;;32667:11;;;;32689;32572;32689:22:::1;::::0;32667:11;;32689:22:::1;:::i;:::-;::::0;;;-1:-1:-1;;32825:10:0::1;32808:28;::::0;;;:16:::1;:28;::::0;;;;;32840:15:::1;-1:-1:-1::0;32805:120:0::1;;32910:3;32892:15;;32882:7;:25;;;;:::i;:::-;:31;;;;:::i;:::-;32871:42;::::0;;::::1;:::i;:::-;;;32805:120;32952:10;32966:1;32935:28:::0;;;:16:::1;:28;::::0;;;;:32;32978:12;;:55:::1;::::0;-1:-1:-1;;;;;32978:12:0;;::::1;::::0;33025:7;32978:25:::1;:55::i;:::-;33058:1;33044:15:::0;;;33070::::1;::::0;::::1;:19:::0;33105:38:::1;::::0;160:25:1;;;33123:10:0::1;::::0;33105:38:::1;::::0;148:2:1;133:18;33105:38:0::1;;;;;;;-1:-1:-1::0;;23698:1:0;24652:22;;-1:-1:-1;32486:665:0:o;3105:109::-;2380:6;;-1:-1:-1;;;;;2380:6:0;911:10;2380:22;2372:67;;;;-1:-1:-1;;;2372:67:0;;;;;;;:::i;:::-;3178:28:::1;3197:8;3178:18;:28::i;27345:727::-:0;27406:7;27426:21;27450:8;27459:1;27450:11;;;;;;;;:::i;:::-;;;;;;;;;-1:-1:-1;;;;;27496:15:0;;;;:8;:15;;;;;;;27525:24;27450:11;;;;;;;27525:24;;;;27450:11;;-1:-1:-1;27553:11:0;27525:39;27522:78;;-1:-1:-1;27587:1:0;;27345:727;-1:-1:-1;;;27345:727:0:o;27522:78::-;27638:22;;;;;27690:11;;27734:24;;;;27716:15;:42;:59;;;;-1:-1:-1;27762:13:0;;;27716:59;27712:270;;;27792:19;27814:63;27861:15;;27814:42;27840:4;:15;;;27814:21;:19;:21::i;:::-;:25;;:42::i;:63::-;27792:85;-1:-1:-1;27912:58:0;27934:35;27960:8;27934:21;27792:85;27950:4;27934:15;:21::i;:35::-;27912:17;;:21;:58::i;:::-;27892:78;;27777:205;27712:270;27999:65;28048:4;:15;;;27999:44;28038:4;27999:34;28015:17;27999:4;:11;;;:15;;:34;;;;:::i;:65::-;27992:72;27345:727;-1:-1:-1;;;;;;27345:727:0:o;30405:748::-;23742:1;24340:7;;:19;24332:63;;;;-1:-1:-1;;;24332:63:0;;;;;;;:::i;:::-;23742:1;24473:7;:18;;;;30458:21:::1;30482:8;30491:1;30482:11;;;;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;30537:10:::1;30528:20:::0;;:8:::1;:20:::0;;;;;;30482:11:::1;::::0;;::::1;;::::0;-1:-1:-1;30528:20:0;30561:13:::1;::::0;:10:::1;:13::i;:::-;30589:11:::0;;:15;30585:445:::1;;30621:15;30639:70;30693:4;:15;;;30639:49;30683:4;30639:39;30655:4;:22;;;30639:4;:11;;;:15;;:39;;;;:::i;:70::-;30621:88:::0;-1:-1:-1;30727:11:0;;30724:295:::1;;30778:18;:16;:18::i;:::-;30767:7;:29;;30759:106;;;;-1:-1:-1::0;;;30759:106:0::1;;;;;;;:::i;:::-;30899:7;30884:4;:11;;;:22;;;;;;;:::i;:::-;;;;;;;;30940:7;30925:11;;:22;;;;;;;:::i;:::-;::::0;;;-1:-1:-1;;30971:32:0::1;::::0;160:25:1;;;30983:10:0::1;::::0;30971:32:::1;::::0;148:2:1;133:18;30971:32:0::1;;;;;;;30724:295;30606:424;30585:445;31076:22;::::0;::::1;::::0;31060:11;;:49:::1;::::0;31104:4:::1;::::0;31060:39:::1;::::0;:15:::1;:39::i;:49::-;31042:15;::::0;::::1;:67:::0;31125:20:::1;::::0;31134:10:::1;::::0;31125:20:::1;::::0;;;::::1;-1:-1:-1::0;;23698:1:0;24652:22;;30405:748::o;13209:211::-;13353:58;;-1:-1:-1;;;;;6178:32:1;;13353:58:0;;;6160:51:1;6227:18;;;6220:34;;;13326:86:0;;13346:5;;-1:-1:-1;;;13376:23:0;6133:18:1;;13353:58:0;;;;-1:-1:-1;;13353:58:0;;;;;;;;;;;;;;-1:-1:-1;;;;;13353:58:0;-1:-1:-1;;;;;;13353:58:0;;;;;;;;;;13326:19;:86::i;:::-;13209:211;;;:::o;28148:600::-;28202:21;28226:8;28235:4;28226:14;;;;;;;;:::i;:::-;;;;;;;;;;;28202:38;;28274:4;:24;;;28255:15;:43;28251:82;;28315:7;28148:600;:::o;28251:82::-;28362:11;;28343:16;28388:13;;;28384:109;;-1:-1:-1;28445:15:0;28418:24;;;;:42;-1:-1:-1;28148:600:0:o;28384:109::-;28503:19;28525:63;28572:15;;28525:42;28551:4;:15;;;28525:21;:19;:21::i;:63::-;28503:85;-1:-1:-1;28624:63:0;28651:35;28677:8;28651:21;28503:85;28667:4;28651:15;:21::i;:35::-;28624:22;;;;;:26;:63::i;:::-;28599:22;;;:88;-1:-1:-1;;28725:15:0;28698:24;;;;:42;-1:-1:-1;28148:600:0:o;5784:471::-;5842:7;6087:1;6092;6087:6;6083:47;;-1:-1:-1;6117:1:0;6110:8;;6083:47;6142:9;6154:5;6158:1;6154;:5;:::i;:::-;6142:17;-1:-1:-1;6187:1:0;6178:5;6182:1;6142:17;6178:5;:::i;:::-;:10;6170:56;;;;-1:-1:-1;;;6170:56:0;;6467:2:1;6170:56:0;;;6449:21:1;6506:2;6486:18;;;6479:30;6545:34;6525:18;;;6518:62;-1:-1:-1;;;6596:18:1;;;6589:31;6637:19;;6170:56:0;6265:397:1;6170:56:0;6246:1;-1:-1:-1;5784:471:0;;;;;:::o;6731:132::-;6789:7;6816:39;6820:1;6823;6816:39;;;;;;;;;;;;;;;;;:3;:39::i;4860:136::-;4918:7;4945:43;4949:1;4952;4945:43;;;;;;;;;;;;;;;;;:3;:43::i;13428:248::-;13599:68;;-1:-1:-1;;;;;6925:15:1;;;13599:68:0;;;6907:34:1;6977:15;;6957:18;;;6950:43;7009:18;;;7002:34;;;13572:96:0;;13592:5;;-1:-1:-1;;;13622:27:0;6842:18:1;;13599:68:0;6667:375:1;13572:96:0;13428:248;;;;:::o;4396:181::-;4454:7;;4486:5;4490:1;4486;:5;:::i;:::-;4474:17;;4515:1;4510;:6;;4502:46;;;;-1:-1:-1;;;4502:46:0;;7249:2:1;4502:46:0;;;7231:21:1;7288:2;7268:18;;;7261:30;7327:29;7307:18;;;7300:57;7374:18;;4502:46:0;7047:351:1;3320:229:0;-1:-1:-1;;;;;3394:22:0;;3386:73;;;;-1:-1:-1;;;3386:73:0;;7605:2:1;3386:73:0;;;7587:21:1;7644:2;7624:18;;;7617:30;7683:34;7663:18;;;7656:62;-1:-1:-1;;;7734:18:1;;;7727:36;7780:19;;3386:73:0;7403:402:1;3386:73:0;3496:6;;;3475:38;;-1:-1:-1;;;;;3475:38:0;;;;3496:6;;;3475:38;;;3524:6;:17;;-1:-1:-1;;;;;;3524:17:0;-1:-1:-1;;;;;3524:17:0;;;;;;;;;;3320:229::o;15744:774::-;16168:23;16194:69;16222:4;16194:69;;;;;;;;;;;;;;;;;16202:5;-1:-1:-1;;;;;16194:27:0;;;:69;;;;;:::i;:::-;16278:17;;16168:95;;-1:-1:-1;16278:21:0;16274:237;;16433:10;16422:30;;;;;;;;;;;;:::i;:::-;16414:85;;;;-1:-1:-1;;;16414:85:0;;8294:2:1;16414:85:0;;;8276:21:1;8333:2;8313:18;;;8306:30;8372:34;8352:18;;;8345:62;-1:-1:-1;;;8423:18:1;;;8416:40;8473:19;;16414:85:0;8092:406:1;7359:312:0;7479:7;7514:12;7507:5;7499:28;;;;-1:-1:-1;;;7499:28:0;;;;;;;;:::i;:::-;-1:-1:-1;7538:9:0;7550:5;7554:1;7550;:5;:::i;:::-;7538:17;7359:312;-1:-1:-1;;;;;7359:312:0:o;5299:226::-;5419:7;5455:12;5447:6;;;;5439:29;;;;-1:-1:-1;;;5439:29:0;;;;;;;;:::i;:::-;-1:-1:-1;5479:9:0;5491:5;5495:1;5491;:5;:::i;20343:230::-;20480:12;20512:53;20535:6;20543:4;20549:1;20552:12;20512:22;:53::i;:::-;20505:60;20343:230;-1:-1:-1;;;;20343:230:0:o;21831:1020::-;22004:12;22037:18;22048:6;22037:10;:18::i;:::-;22029:60;;;;-1:-1:-1;;;22029:60:0;;9361:2:1;22029:60:0;;;9343:21:1;9400:2;9380:18;;;9373:30;9439:31;9419:18;;;9412:59;9488:18;;22029:60:0;9159:353:1;22029:60:0;22163:12;22177:23;22204:6;-1:-1:-1;;;;;22204:11:0;22223:8;22233:4;22204:34;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22162:76;;;;22253:7;22249:595;;;22284:10;-1:-1:-1;22277:17:0;;-1:-1:-1;22277:17:0;22249:595;22398:17;;:21;22394:439;;22661:10;22655:17;22722:15;22709:10;22705:2;22701:19;22694:44;22394:439;22804:12;22797:20;;-1:-1:-1;;;22797:20:0;;;;;;;;:::i;17206:641::-;17266:4;17747:20;;17577:66;17796:23;;;;;;:42;;-1:-1:-1;;17823:15:0;;;17788:51;-1:-1:-1;;17206:641:0:o;196:180:1:-;255:6;308:2;296:9;287:7;283:23;279:32;276:52;;;324:1;321;314:12;276:52;-1:-1:-1;347:23:1;;196:180;-1:-1:-1;196:180:1:o;817:286::-;876:6;929:2;917:9;908:7;904:23;900:32;897:52;;;945:1;942;935:12;897:52;971:23;;-1:-1:-1;;;;;1023:31:1;;1013:42;;1003:70;;1069:1;1066;1059:12;1791:356;1993:2;1975:21;;;2012:18;;;2005:30;2071:34;2066:2;2051:18;;2044:62;2138:2;2123:18;;1791:356::o;2152:184::-;2222:6;2275:2;2263:9;2254:7;2250:23;2246:32;2243:52;;;2291:1;2288;2281:12;2243:52;-1:-1:-1;2314:16:1;;2152:184;-1:-1:-1;2152:184:1:o;2341:127::-;2402:10;2397:3;2393:20;2390:1;2383:31;2433:4;2430:1;2423:15;2457:4;2454:1;2447:15;2473:128;2540:9;;;2561:11;;;2558:37;;;2575:18;;:::i;2964:355::-;3166:2;3148:21;;;3205:2;3185:18;;;3178:30;3244:33;3239:2;3224:18;;3217:61;3310:2;3295:18;;2964:355::o;3685:127::-;3746:10;3741:3;3737:20;3734:1;3727:31;3777:4;3774:1;3767:15;3801:4;3798:1;3791:15;3817:428;4019:2;4001:21;;;4058:2;4038:18;;;4031:30;;;4097:34;4077:18;;;4070:62;4168:34;4163:2;4148:18;;4141:62;4235:3;4220:19;;3817:428::o;4250:125::-;4315:9;;;4336:10;;;4333:36;;;4349:18;;:::i;4380:135::-;4419:3;4440:17;;;4437:43;;4460:18;;:::i;:::-;-1:-1:-1;4507:1:1;4496:13;;4380:135::o;5232:168::-;5272:7;5338:1;5334;5330:6;5326:14;5323:1;5320:21;5315:1;5308:9;5301:17;5297:45;5294:71;;;5345:18;;:::i;:::-;-1:-1:-1;5385:9:1;;5232:168::o;5764:217::-;5804:1;5830;5820:132;;5874:10;5869:3;5865:20;5862:1;5855:31;5909:4;5906:1;5899:15;5937:4;5934:1;5927:15;5820:132;-1:-1:-1;5966:9:1;;5764:217::o;7810:277::-;7877:6;7930:2;7918:9;7909:7;7905:23;7901:32;7898:52;;;7946:1;7943;7936:12;7898:52;7978:9;7972:16;8031:5;8024:13;8017:21;8010:5;8007:32;7997:60;;8053:1;8050;8043:12;8503:250;8588:1;8598:113;8612:6;8609:1;8606:13;8598:113;;;8688:11;;;8682:18;8669:11;;;8662:39;8634:2;8627:10;8598:113;;;-1:-1:-1;;8745:1:1;8727:16;;8720:27;8503:250::o;8758:396::-;8907:2;8896:9;8889:21;8870:4;8939:6;8933:13;8982:6;8977:2;8966:9;8962:18;8955:34;8998:79;9070:6;9065:2;9054:9;9050:18;9045:2;9037:6;9033:15;8998:79;:::i;:::-;9138:2;9117:15;-1:-1:-1;;9113:29:1;9098:45;;;;9145:2;9094:54;;8758:396;-1:-1:-1;;8758:396:1:o;9517:287::-;9646:3;9684:6;9678:13;9700:66;9759:6;9754:3;9747:4;9739:6;9735:17;9700:66;:::i;:::-;9782:16;;;;;9517:287;-1:-1:-1;;9517:287:1:o
Swarm Source
ipfs://65c276927ca24d99de5af8de6400172ab73ed8de5093c3553163e50d6dbfa170
Loading...
Loading
Loading...
Loading
Net Worth in USD
$0.00
Net Worth in ETH
0
Multichain Portfolio | 33 Chains
| Chain | Token | Portfolio % | Price | Amount | Value |
|---|
Loading...
Loading
Loading...
Loading
Loading...
Loading
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.