Warning! Contract bytecode has been changed and doesn't match the verified one. Therefore, interaction with this smart contract may be risky.
- Contract name:
- TimeDeposit
- Optimization enabled
- true
- Compiler version
- v0.8.20+commit.a1b79de6
- Optimization runs
- 200
- EVM Version
- default
- Verified at
- 2025-06-24T10:06:57.244270Z
Contract source code
// File: @openzeppelin/contracts/token/ERC20/IERC20.sol
// OpenZeppelin Contracts (last updated v5.1.0) (token/ERC20/IERC20.sol)
pragma solidity ^0.8.20;
/**
* @dev Interface of the ERC-20 standard as defined in the ERC.
*/
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 value of tokens in existence.
*/
function totalSupply() external view returns (uint256);
/**
* @dev Returns the value of tokens owned by `account`.
*/
function balanceOf(address account) external view returns (uint256);
/**
* @dev Moves a `value` amount of 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 value) 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 a `value` amount of tokens 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 value) external returns (bool);
/**
* @dev Moves a `value` amount of tokens from `from` to `to` using the
* allowance mechanism. `value` 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 value) external returns (bool);
}
// File: @openzeppelin/contracts/utils/Context.sol
// OpenZeppelin Contracts (last updated v5.0.1) (utils/Context.sol)
pragma solidity ^0.8.20;
/**
* @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;
}
function _contextSuffixLength() internal view virtual returns (uint256) {
return 0;
}
}
// File: @openzeppelin/contracts/access/Ownable.sol
// OpenZeppelin Contracts (last updated v5.0.0) (access/Ownable.sol)
pragma solidity ^0.8.20;
/**
* @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.
*
* The initial owner is set to the address provided by the deployer. 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;
/**
* @dev The caller account is not authorized to perform an operation.
*/
error OwnableUnauthorizedAccount(address account);
/**
* @dev The owner is not a valid owner account. (eg. `address(0)`)
*/
error OwnableInvalidOwner(address owner);
event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);
/**
* @dev Initializes the contract setting the address provided by the deployer as the initial owner.
*/
constructor(address initialOwner) {
if (initialOwner == address(0)) {
revert OwnableInvalidOwner(address(0));
}
_transferOwnership(initialOwner);
}
/**
* @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 {
if (owner() != _msgSender()) {
revert OwnableUnauthorizedAccount(_msgSender());
}
}
/**
* @dev Leaves the contract without owner. It will not be possible to call
* `onlyOwner` functions. Can only be called by the current owner.
*
* NOTE: Renouncing ownership will leave the contract without an owner,
* thereby disabling 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 {
if (newOwner == address(0)) {
revert OwnableInvalidOwner(address(0));
}
_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);
}
}
// File: @openzeppelin/contracts/security/ReentrancyGuard.sol
// OpenZeppelin Contracts (last updated v4.9.0) (security/ReentrancyGuard.sol)
pragma solidity ^0.8.0;
/**
* @dev Contract module that helps prevent reentrant calls to a function.
*
* Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier
* available, which can be applied to functions to make sure there are no nested
* (reentrant) calls to them.
*
* Note that because there is a single `nonReentrant` guard, functions marked as
* `nonReentrant` may not call one another. This can be worked around by making
* those functions `private`, and then adding `external` `nonReentrant` entry
* points to them.
*
* TIP: If you would like to learn more about reentrancy and alternative ways
* to protect against it, check out our blog post
* https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul].
*/
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() {
_nonReentrantBefore();
_;
_nonReentrantAfter();
}
function _nonReentrantBefore() private {
// On the first call to nonReentrant, _status will be _NOT_ENTERED
require(_status != _ENTERED, "ReentrancyGuard: reentrant call");
// Any calls to nonReentrant after this point will fail
_status = _ENTERED;
}
function _nonReentrantAfter() private {
// By storing the original value once again, a refund is triggered (see
// https://eips.ethereum.org/EIPS/eip-2200)
_status = _NOT_ENTERED;
}
/**
* @dev Returns true if the reentrancy guard is currently set to "entered", which indicates there is a
* `nonReentrant` function in the call stack.
*/
function _reentrancyGuardEntered() internal view returns (bool) {
return _status == _ENTERED;
}
}
// File: @openzeppelin/contracts/utils/math/SafeMath.sol
// OpenZeppelin Contracts (last updated v4.9.0) (utils/math/SafeMath.sol)
pragma solidity ^0.8.0;
// CAUTION
// This version of SafeMath should only be used with Solidity 0.8 or later,
// because it relies on the compiler's built in overflow checks.
/**
* @dev Wrappers over Solidity's arithmetic operations.
*
* NOTE: `SafeMath` is generally not needed starting with Solidity 0.8, since the compiler
* now has built in overflow checking.
*/
library SafeMath {
/**
* @dev Returns the addition of two unsigned integers, with an overflow flag.
*
* _Available since v3.4._
*/
function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) {
unchecked {
uint256 c = a + b;
if (c < a) return (false, 0);
return (true, c);
}
}
/**
* @dev Returns the subtraction of two unsigned integers, with an overflow flag.
*
* _Available since v3.4._
*/
function trySub(uint256 a, uint256 b) internal pure returns (bool, uint256) {
unchecked {
if (b > a) return (false, 0);
return (true, a - b);
}
}
/**
* @dev Returns the multiplication of two unsigned integers, with an overflow flag.
*
* _Available since v3.4._
*/
function tryMul(uint256 a, uint256 b) internal pure returns (bool, uint256) {
unchecked {
// 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 (true, 0);
uint256 c = a * b;
if (c / a != b) return (false, 0);
return (true, c);
}
}
/**
* @dev Returns the division of two unsigned integers, with a division by zero flag.
*
* _Available since v3.4._
*/
function tryDiv(uint256 a, uint256 b) internal pure returns (bool, uint256) {
unchecked {
if (b == 0) return (false, 0);
return (true, a / b);
}
}
/**
* @dev Returns the remainder of dividing two unsigned integers, with a division by zero flag.
*
* _Available since v3.4._
*/
function tryMod(uint256 a, uint256 b) internal pure returns (bool, uint256) {
unchecked {
if (b == 0) return (false, 0);
return (true, a % b);
}
}
/**
* @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) {
return a + b;
}
/**
* @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 a - b;
}
/**
* @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) {
return a * b;
}
/**
* @dev Returns the integer division of two unsigned integers, reverting on
* division by zero. The result is rounded towards zero.
*
* Counterpart to Solidity's `/` operator.
*
* Requirements:
*
* - The divisor cannot be zero.
*/
function div(uint256 a, uint256 b) internal pure returns (uint256) {
return a / b;
}
/**
* @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
* reverting 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 a % b;
}
/**
* @dev Returns the subtraction of two unsigned integers, reverting with custom message on
* overflow (when the result is negative).
*
* CAUTION: This function is deprecated because it requires allocating memory for the error
* message unnecessarily. For custom revert reasons use {trySub}.
*
* Counterpart to Solidity's `-` operator.
*
* Requirements:
*
* - Subtraction cannot overflow.
*/
function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
unchecked {
require(b <= a, errorMessage);
return a - b;
}
}
/**
* @dev Returns the integer division of two unsigned integers, reverting 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) {
unchecked {
require(b > 0, errorMessage);
return a / b;
}
}
/**
* @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
* reverting with custom message when dividing by zero.
*
* CAUTION: This function is deprecated because it requires allocating memory for the error
* message unnecessarily. For custom revert reasons use {tryMod}.
*
* 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) {
unchecked {
require(b > 0, errorMessage);
return a % b;
}
}
}
// File: DEGEN-main (9)/DEGEN-main/contracts/interface/IDTX.sol
// !! THIS FILE WAS AUTOGENERATED BY abi-to-sol v0.8.0. SEE SOURCE BELOW. !!
pragma solidity ^0.8.20;
interface IDTX {
error ERC20InsufficientAllowance(
address spender,
uint256 allowance,
uint256 needed
);
error ERC20InsufficientBalance(
address sender,
uint256 balance,
uint256 needed
);
error ERC20InvalidApprover(address approver);
error ERC20InvalidReceiver(address receiver);
error ERC20InvalidSender(address sender);
error ERC20InvalidSpender(address spender);
error OwnableInvalidOwner(address owner);
error OwnableUnauthorizedAccount(address account);
event Approval(
address indexed owner,
address indexed spender,
uint256 value
);
event OwnershipTransferred(
address indexed previousOwner,
address indexed newOwner
);
event Transfer(address indexed from, address indexed to, uint256 value);
function allowance(address owner, address spender)
external
view
returns (uint256);
function approve(address spender, uint256 value) external returns (bool);
function balanceOf(address account) external view returns (uint256);
function burn(uint256 value) external;
function burnFrom(address account, uint256 value) external;
function burnToken(address account, uint256 amount) external returns (bool);
function decimals() external view returns (uint8);
function governor() external view returns (address);
function masterchefAddress() external view returns (address);
function mint(address to, uint256 amount) external;
function name() external view returns (string memory);
function owner() external view returns (address);
function rebrandName(string memory _newName) external;
function rebrandSymbol(string memory _newSymbol) external;
function receiveTax() external view returns (address);
function renounceOwnership() external;
function symbol() external view returns (string memory);
function tax() external view returns (uint256);
function totalSupply() external view returns (uint256);
function transfer(address to, uint256 value) external returns (bool);
function transferFrom(
address from,
address to,
uint256 value
) external returns (bool);
function transferOwnership(address newOwner) external;
function updateTax(address _taxAddress) external;
function updateTax(uint256 _tax) external;
}
// THIS FILE WAS AUTOGENERATED FROM THE FOLLOWING ABI JSON:
/*
[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"allowance","type":"uint256"},{"internalType":"uint256","name":"needed","type":"uint256"}],"name":"ERC20InsufficientAllowance","type":"error"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"uint256","name":"balance","type":"uint256"},{"internalType":"uint256","name":"needed","type":"uint256"}],"name":"ERC20InsufficientBalance","type":"error"},{"inputs":[{"internalType":"address","name":"approver","type":"address"}],"name":"ERC20InvalidApprover","type":"error"},{"inputs":[{"internalType":"address","name":"receiver","type":"address"}],"name":"ERC20InvalidReceiver","type":"error"},{"inputs":[{"internalType":"address","name":"sender","type":"address"}],"name":"ERC20InvalidSender","type":"error"},{"inputs":[{"internalType":"address","name":"spender","type":"address"}],"name":"ERC20InvalidSpender","type":"error"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"OwnableInvalidOwner","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"OwnableUnauthorizedAccount","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"value","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"burnFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"burnToken","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"governor","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"masterchefAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"_newName","type":"string"}],"name":"rebrandName","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_newSymbol","type":"string"}],"name":"rebrandSymbol","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"receiveTax","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tax","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_taxAddress","type":"address"}],"name":"updateTax","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tax","type":"uint256"}],"name":"updateTax","outputs":[],"stateMutability":"nonpayable","type":"function"}]
*/
// File: DEGEN-main (9)/DEGEN-main/contracts/interface/IMasterChef.sol
// !! THIS FILE WAS AUTOGENERATED BY abi-to-sol v0.8.0. SEE SOURCE BELOW. !!
pragma solidity ^0.8.20;
interface IMasterChef {
event OwnershipTransferred(
address indexed previousOwner,
address indexed newOwner
);
event TransferCredit(address from, address to, uint256 amount);
event TrustedContract(address contractAddress, bool setting);
event UpdateEmissions(address indexed user, uint256 newEmissions);
function DTXPerBlock() external view returns (uint256);
function add(
uint256 _allocPoint,
address _participant,
bool _withUpdate
) external;
function burn(address _from, uint256 _amount) external returns (bool);
function credit(address) external view returns (uint256);
function dev(address _devaddr) external;
function devaddr() external view returns (address);
function dtx() external view returns (address);
function existingParticipant(address) external view returns (bool);
function fairMintSenate() external;
function fairTokensPublishedToSenate() external view returns (uint256);
function feeAddress() external view returns (address);
function governorFee() external view returns (uint256);
function massAdd(
uint256[] memory _allocPoint,
address[] memory _participant,
bool[] memory _withUpdate
) external;
function massUpdatePools() external;
function owner() external view returns (address);
function pendingDtx(uint256 _pid) external view returns (uint256);
function poolInfo(uint256)
external
view
returns (
uint256 allocPoint,
uint256 lastRewardBlock,
address participant
);
function poolLength() external view returns (uint256);
function publishTokens(address _to, uint256 _amount) external;
function renounceOwnership() external;
function renounceRewards() external;
function rewardSenators(bool _e) external;
function senatorRewards() external view returns (bool);
function set(
uint256 _pid,
uint256 _allocPoint,
bool _withUpdate
) external;
function setFeeAddress(address _feeAddress) external;
function setGovernorFee(uint256 _amount) external;
function setTrustedContract(address _contractAddress, bool _setting)
external;
function startBlock() external view returns (uint256);
function startPublishing(
uint256 _pid,
address _participant,
uint256 _alloc
) external;
function stopPublishing(uint256 _pid) external;
function tokenChangeOwnership(address _newOwner) external;
function totalAllocPoint() external view returns (uint256);
function totalCreditRewards() external view returns (uint256);
function totalCreditRewardsAtLastFairMint() external view returns (uint256);
function totalPrincipalBurned() external view returns (uint256);
function totalPublished() external view returns (uint256);
function transferCredit(address _to, uint256 _amount) external;
function transferOwnership(address newOwner) external;
function trustedContract(address) external view returns (bool);
function trustedContractCount() external view returns (uint256);
function updateEmissionRate(uint256 _DTXPerBlock) external;
function updatePool(uint256 _pid) external;
function updateStartBlock(uint256 _startBlock) external;
function virtualTotalSupply() external view returns (uint256);
}
// THIS FILE WAS AUTOGENERATED FROM THE FOLLOWING ABI JSON:
/*
[{"inputs":[{"internalType":"contract IDTX","name":"_DTX","type":"address"},{"internalType":"address","name":"_airdropFull","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"from","type":"address"},{"indexed":false,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"TransferCredit","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"contractAddress","type":"address"},{"indexed":false,"internalType":"bool","name":"setting","type":"bool"}],"name":"TrustedContract","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"uint256","name":"newEmissions","type":"uint256"}],"name":"UpdateEmissions","type":"event"},{"inputs":[],"name":"DTXPerBlock","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_allocPoint","type":"uint256"},{"internalType":"address","name":"_participant","type":"address"},{"internalType":"bool","name":"_withUpdate","type":"bool"}],"name":"add","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_from","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"burn","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"credit","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_devaddr","type":"address"}],"name":"dev","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"devaddr","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"dtx","outputs":[{"internalType":"contract IDTX","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"existingParticipant","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"fairMintSenate","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"fairTokensPublishedToSenate","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"feeAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"governorFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"_allocPoint","type":"uint256[]"},{"internalType":"address[]","name":"_participant","type":"address[]"},{"internalType":"bool[]","name":"_withUpdate","type":"bool[]"}],"name":"massAdd","outputs":[],"stateMutability":"nonpayable","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":"uint256","name":"_pid","type":"uint256"}],"name":"pendingDtx","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"poolInfo","outputs":[{"internalType":"uint256","name":"allocPoint","type":"uint256"},{"internalType":"uint256","name":"lastRewardBlock","type":"uint256"},{"internalType":"address","name":"participant","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"poolLength","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"publishTokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceRewards","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_e","type":"bool"}],"name":"rewardSenators","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"senatorRewards","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pid","type":"uint256"},{"internalType":"uint256","name":"_allocPoint","type":"uint256"},{"internalType":"bool","name":"_withUpdate","type":"bool"}],"name":"set","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_feeAddress","type":"address"}],"name":"setFeeAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"setGovernorFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_contractAddress","type":"address"},{"internalType":"bool","name":"_setting","type":"bool"}],"name":"setTrustedContract","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"startBlock","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pid","type":"uint256"},{"internalType":"address","name":"_participant","type":"address"},{"internalType":"uint256","name":"_alloc","type":"uint256"}],"name":"startPublishing","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pid","type":"uint256"}],"name":"stopPublishing","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_newOwner","type":"address"}],"name":"tokenChangeOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"totalAllocPoint","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalCreditRewards","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalCreditRewardsAtLastFairMint","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalPrincipalBurned","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalPublished","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"transferCredit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"trustedContract","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"trustedContractCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_DTXPerBlock","type":"uint256"}],"name":"updateEmissionRate","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pid","type":"uint256"}],"name":"updatePool","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_startBlock","type":"uint256"}],"name":"updateStartBlock","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"virtualTotalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"}]
*/
// File: DEGEN-main (9)/DEGEN-main/contracts/interface/IacPool.sol
// !! THIS FILE WAS AUTOGENERATED BY abi-to-sol v0.8.0. SEE SOURCE BELOW. !!
pragma solidity >=0.7.0 <0.9.0;
interface IacPool {
event AddAndExtendStake(
address indexed sender,
address indexed recipient,
uint256 amount,
uint256 stakeID,
uint256 shares,
uint256 lastDepositedTime
);
event AddVotes(address indexed voter, uint256 proposalID, uint256 change);
event Deposit(
address indexed sender,
uint256 amount,
uint256 shares,
uint256 lastDepositedTime
);
event GiftDeposit(
address indexed sender,
address indexed recipient,
uint256 amount,
uint256 shares,
uint256 lastDepositedTime
);
event HopDeposit(
address indexed recipient,
uint256 amount,
uint256 shares,
uint256 previousLastDepositedTime,
uint256 mandatoryTime
);
event HopPool(
address indexed sender,
uint256 DTXamount,
uint256 shares,
address indexed newPool
);
event MigrateStake(
address indexed goodSamaritan,
uint256 DTXamount,
uint256 shares,
address indexed recipient
);
event RemoveVotes(
address indexed voter,
uint256 proposalID,
uint256 change
);
event SetDelegate(address userDelegating, address delegatee);
event StakeAllowanceRevoke(
address owner,
address spender,
uint256 allowanceID
);
event StakeApproval(
address owner,
address spender,
uint256 allowanceID,
uint256 shareAllowance,
uint256 lastDeposit,
uint256 mandatoryTime
);
event TransferStake(
address indexed sender,
address indexed recipient,
uint256 shares,
uint256 stakeID
);
event TransferStakeFrom(
address _from,
address _to,
uint256 _stakeID,
uint256 _allowanceID
);
event TrustedPool(address contractAddress, bool setting);
event TrustedSender(address contractAddress, bool setting);
event Withdraw(
address indexed sender,
uint256 amount,
uint256 penalty,
uint256 shares
);
function addAndExtendStake(
address _recipientAddr,
uint256 _amount,
uint256 _stakeID,
uint256 _lockUpTokensInSeconds
) external;
function admin() external view returns (address);
function allowOrigin() external view returns (bool);
function allowStakeTransfer() external view returns (bool);
function allowStakeTransferFrom() external view returns (bool);
function allowTxOrigin(bool _setting) external;
function balanceOf() external view returns (uint256);
function calculateHarvestDTXRewards() external view returns (uint256);
function calculateTotalPendingDTXRewards() external view returns (uint256);
function callFee() external view returns (uint256);
function delegateeVote(address[] memory votingAddress, uint256 proposalID)
external;
function deposit(uint256 _amount) external;
function enableDisableStakeTransfer(bool _setting) external;
function enableDisableStakeTransferFrom(bool _setting) external;
function getNrOfStakes(address _user) external view returns (uint256);
function getPricePerFullShare() external view returns (uint256);
function getUserShares(address _wallet, uint256 _stakeID)
external
view
returns (uint256);
function getUserTotalShares(address _user) external view returns (uint256);
function giftDeposit(
uint256 _amount,
address _toAddress,
uint256 _minToServeInSecs
) external;
function giveStakeAllowance(address spender, uint256 _stakeID) external;
function gracePeriod() external view returns (uint256);
function hopDeposit(
uint256 _amount,
address _recipientAddress,
uint256 previousLastDepositedTime,
uint256 _mandatoryTime
) external;
function hopStakeToAnotherPool(
uint256 _shares,
uint256 _stakeID,
address _poolAddress
) external;
function masterchef() external view returns (address);
function migrateAllStakes(address _staker) external;
function migrateStake(address _staker, uint256 _stakeID) external;
function migrationPool() external view returns (address);
function minimumGift() external view returns (uint256);
function modifyPartialTransfers(bool _decision) external;
function modifyPartialWithdrawals(bool _decision) external;
function nrOfstakeAllowances(address owner, address spender)
external
view
returns (uint256);
function partialTransfers() external view returns (bool);
function partialWithdrawals() external view returns (bool);
function poolID() external view returns (uint256);
function revokeStakeAllowance(address spender, uint256 allowanceID)
external;
function setAdmin() external;
function setCallFee(uint256 _callFee) external;
function setDelegate(address _delegate, bool asProxy) external;
function setMasterChefAddress(address _masterchef, uint256 _newPoolID)
external;
function setMigrationPool(address _newPool) external;
function setMinimumGiftDeposit(uint256 _amount, bool _setting) external;
function setTrustedPool(address[] memory _pool, bool _setting) external;
function setTrustedSender(address[] memory _sender, bool _setting) external;
function stakeAllowances(
address owner,
address spender,
uint256 allowanceID
)
external
view
returns (
uint256,
uint256,
uint256
);
function stakeRollover(address _poolInto, uint256 _stakeID) external;
function token() external view returns (address);
function totalShares() external view returns (uint256);
function totalVotesForID(uint256) external view returns (uint256);
function transferStakeFrom(
address _from,
uint256 _stakeID,
uint256 allowanceID,
address _to
) external returns (bool);
function transferStakeToAnotherWallet(
uint256 _shares,
uint256 _stakeID,
address _recipientAddress
) external;
function treasury() external view returns (address);
function trustedPool(address) external view returns (bool);
function trustedPoolCount() external view returns (uint256);
function trustedSender(address) external view returns (bool);
function trustedSenderCount() external view returns (uint256);
function updateMinGiftGovernor() external view returns (bool);
function updateMinimumGift() external;
function userDelegate(address) external view returns (address);
function userInfo(address, uint256)
external
view
returns (
uint256 shares,
uint256 lastDepositedTime,
uint256 dtxAtLastUserAction,
uint256 lastUserActionTime,
uint256 mandatoryTimeToServe
);
function userVote(address) external view returns (uint256);
function voteForProposal(uint256 proposalID, bool asProxy) external;
function votingCredit(uint256 _shares, uint256 _stakeID) external;
function votingCreditAddress() external view returns (address);
function withdraw(uint256 _shares, uint256 _stakeID) external;
function withdrawAll(uint256 _stakeID) external;
function withdrawFeePeriod() external view returns (uint256);
function withdrawStuckTokens(address _tokenAddress) external;
}
// THIS FILE WAS AUTOGENERATED FROM THE FOLLOWING ABI JSON:
/*
[{"inputs":[{"internalType":"contract IDTX","name":"_token","type":"address"},{"internalType":"contract IMasterChef","name":"_masterchef","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"sender","type":"address"},{"indexed":true,"internalType":"address","name":"recipient","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"stakeID","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"shares","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"lastDepositedTime","type":"uint256"}],"name":"AddAndExtendStake","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"voter","type":"address"},{"indexed":false,"internalType":"uint256","name":"proposalID","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"change","type":"uint256"}],"name":"AddVotes","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"sender","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"shares","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"lastDepositedTime","type":"uint256"}],"name":"Deposit","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"sender","type":"address"},{"indexed":true,"internalType":"address","name":"recipient","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"shares","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"lastDepositedTime","type":"uint256"}],"name":"GiftDeposit","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"recipient","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"shares","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"previousLastDepositedTime","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"mandatoryTime","type":"uint256"}],"name":"HopDeposit","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"sender","type":"address"},{"indexed":false,"internalType":"uint256","name":"DTXamount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"shares","type":"uint256"},{"indexed":true,"internalType":"address","name":"newPool","type":"address"}],"name":"HopPool","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"goodSamaritan","type":"address"},{"indexed":false,"internalType":"uint256","name":"DTXamount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"shares","type":"uint256"},{"indexed":true,"internalType":"address","name":"recipient","type":"address"}],"name":"MigrateStake","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"voter","type":"address"},{"indexed":false,"internalType":"uint256","name":"proposalID","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"change","type":"uint256"}],"name":"RemoveVotes","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"userDelegating","type":"address"},{"indexed":false,"internalType":"address","name":"delegatee","type":"address"}],"name":"SetDelegate","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"owner","type":"address"},{"indexed":false,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"allowanceID","type":"uint256"}],"name":"StakeAllowanceRevoke","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"owner","type":"address"},{"indexed":false,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"allowanceID","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"shareAllowance","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"lastDeposit","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"mandatoryTime","type":"uint256"}],"name":"StakeApproval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"sender","type":"address"},{"indexed":true,"internalType":"address","name":"recipient","type":"address"},{"indexed":false,"internalType":"uint256","name":"shares","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"stakeID","type":"uint256"}],"name":"TransferStake","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"_from","type":"address"},{"indexed":false,"internalType":"address","name":"_to","type":"address"},{"indexed":false,"internalType":"uint256","name":"_stakeID","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"_allowanceID","type":"uint256"}],"name":"TransferStakeFrom","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"contractAddress","type":"address"},{"indexed":false,"internalType":"bool","name":"setting","type":"bool"}],"name":"TrustedPool","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"contractAddress","type":"address"},{"indexed":false,"internalType":"bool","name":"setting","type":"bool"}],"name":"TrustedSender","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"sender","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"penalty","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"shares","type":"uint256"}],"name":"Withdraw","type":"event"},{"inputs":[{"internalType":"address","name":"_recipientAddr","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"},{"internalType":"uint256","name":"_stakeID","type":"uint256"},{"internalType":"uint256","name":"_lockUpTokensInSeconds","type":"uint256"}],"name":"addAndExtendStake","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"admin","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"allowOrigin","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"allowStakeTransfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"allowStakeTransferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bool","name":"_setting","type":"bool"}],"name":"allowTxOrigin","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"calculateHarvestDTXRewards","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"calculateTotalPendingDTXRewards","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"callFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"votingAddress","type":"address[]"},{"internalType":"uint256","name":"proposalID","type":"uint256"}],"name":"delegateeVote","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"deposit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_setting","type":"bool"}],"name":"enableDisableStakeTransfer","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_setting","type":"bool"}],"name":"enableDisableStakeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_user","type":"address"}],"name":"getNrOfStakes","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getPricePerFullShare","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_wallet","type":"address"},{"internalType":"uint256","name":"_stakeID","type":"uint256"}],"name":"getUserShares","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_user","type":"address"}],"name":"getUserTotalShares","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"},{"internalType":"address","name":"_toAddress","type":"address"},{"internalType":"uint256","name":"_minToServeInSecs","type":"uint256"}],"name":"giftDeposit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"_stakeID","type":"uint256"}],"name":"giveStakeAllowance","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"gracePeriod","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"},{"internalType":"address","name":"_recipientAddress","type":"address"},{"internalType":"uint256","name":"previousLastDepositedTime","type":"uint256"},{"internalType":"uint256","name":"_mandatoryTime","type":"uint256"}],"name":"hopDeposit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_shares","type":"uint256"},{"internalType":"uint256","name":"_stakeID","type":"uint256"},{"internalType":"address","name":"_poolAddress","type":"address"}],"name":"hopStakeToAnotherPool","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"masterchef","outputs":[{"internalType":"contract IMasterChef","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_staker","type":"address"}],"name":"migrateAllStakes","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_staker","type":"address"},{"internalType":"uint256","name":"_stakeID","type":"uint256"}],"name":"migrateStake","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"migrationPool","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"minimumGift","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bool","name":"_decision","type":"bool"}],"name":"modifyPartialTransfers","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_decision","type":"bool"}],"name":"modifyPartialWithdrawals","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"nrOfstakeAllowances","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"partialTransfers","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"partialWithdrawals","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"poolID","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"allowanceID","type":"uint256"}],"name":"revokeStakeAllowance","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"setAdmin","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_callFee","type":"uint256"}],"name":"setCallFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_delegate","type":"address"},{"internalType":"bool","name":"asProxy","type":"bool"}],"name":"setDelegate","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract IMasterChef","name":"_masterchef","type":"address"},{"internalType":"uint256","name":"_newPoolID","type":"uint256"}],"name":"setMasterChefAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_newPool","type":"address"}],"name":"setMigrationPool","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"},{"internalType":"bool","name":"_setting","type":"bool"}],"name":"setMinimumGiftDeposit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"_pool","type":"address[]"},{"internalType":"bool","name":"_setting","type":"bool"}],"name":"setTrustedPool","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"_sender","type":"address[]"},{"internalType":"bool","name":"_setting","type":"bool"}],"name":"setTrustedSender","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"allowanceID","type":"uint256"}],"name":"stakeAllowances","outputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_poolInto","type":"address"},{"internalType":"uint256","name":"_stakeID","type":"uint256"}],"name":"stakeRollover","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"token","outputs":[{"internalType":"contract IDTX","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalShares","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"totalVotesForID","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_from","type":"address"},{"internalType":"uint256","name":"_stakeID","type":"uint256"},{"internalType":"uint256","name":"allowanceID","type":"uint256"},{"internalType":"address","name":"_to","type":"address"}],"name":"transferStakeFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_shares","type":"uint256"},{"internalType":"uint256","name":"_stakeID","type":"uint256"},{"internalType":"address","name":"_recipientAddress","type":"address"}],"name":"transferStakeToAnotherWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"treasury","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"trustedPool","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"trustedPoolCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"trustedSender","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"trustedSenderCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"updateMinGiftGovernor","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"updateMinimumGift","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"userDelegate","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"userInfo","outputs":[{"internalType":"uint256","name":"shares","type":"uint256"},{"internalType":"uint256","name":"lastDepositedTime","type":"uint256"},{"internalType":"uint256","name":"dtxAtLastUserAction","type":"uint256"},{"internalType":"uint256","name":"lastUserActionTime","type":"uint256"},{"internalType":"uint256","name":"mandatoryTimeToServe","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"userVote","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"proposalID","type":"uint256"},{"internalType":"bool","name":"asProxy","type":"bool"}],"name":"voteForProposal","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_shares","type":"uint256"},{"internalType":"uint256","name":"_stakeID","type":"uint256"}],"name":"votingCredit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"votingCreditAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_shares","type":"uint256"},{"internalType":"uint256","name":"_stakeID","type":"uint256"}],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_stakeID","type":"uint256"}],"name":"withdrawAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdrawFeePeriod","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_tokenAddress","type":"address"}],"name":"withdrawStuckTokens","outputs":[],"stateMutability":"nonpayable","type":"function"}]
*/
// File: DEGEN-main (9)/DEGEN-main/contracts/interface/IGovernor.sol
// !! THIS FILE WAS AUTOGENERATED BY abi-to-sol v0.8.0. SEE SOURCE BELOW. !!
pragma solidity >=0.7.0 <0.9.0;
interface IGovernor {
event EnforceGovernor(
address indexed _newGovernor,
address indexed enforcer
);
event GiveRolloverBonus(
address indexed recipient,
uint256 amount,
address indexed poolInto
);
event SetInflation(uint256 rewardPerBlock);
function OINK() external view returns (address);
function acPool1() external view returns (address);
function acPool1ID() external view returns (uint256);
function acPool2() external view returns (address);
function acPool2ID() external view returns (uint256);
function acPool3() external view returns (address);
function acPool3ID() external view returns (uint256);
function acPool4() external view returns (address);
function acPool4ID() external view returns (uint256);
function addNewPool(address _pool) external;
function addressToUint256(address addr) external pure returns (uint256);
function basicContract() external view returns (address);
function blockGovernorProposal() external;
function burnTokens(uint256 _amount) external;
function changedName() external view returns (bool);
function consensusContract() external view returns (address);
function costToVote() external view returns (uint256);
function creditContract() external view returns (address);
function delayBeforeEnforce() external view returns (uint256);
function depositFee() external view returns (uint256);
function farmContract() external view returns (address);
function fundingRate() external view returns (uint256);
function getRollBonus(address _bonusForPool)
external
view
returns (uint256);
function governorBlocked(address) external view returns (bool);
function harvest() external;
function manageRewardsAddress() external view returns (address);
function helperToken() external view returns (address);
function lastHarvestedTime() external view returns (uint256);
function masterchef() external view returns (address);
function proposeGovernorTimestamp() external view returns (uint256);
function proposeNewGovernor(address beneficiary) external;
function proposedGovernor() external view returns (address);
function rebalancePools() external;
function referralBonus() external view returns (uint256);
function rewardContract() external view returns (address);
function setCallFee(address _acPool, uint256 _newCallFee) external;
function setGovernorTax(uint256 _amount) external;
function setNewGovernor() external;
function setNewGovernor2(address _new) external;
function setPool(
uint256 _pid,
uint256 _allocPoint,
bool _withUpdate
) external;
function setReward(uint256 _amount) external;
function stakeRolloverBonus(
address _toAddress,
address _depositToPool,
uint256 _bonusToPay,
uint256 _stakeID
) external;
function token() external view returns (address);
function transferToTreasury(uint256 amount) external;
function treasuryRequest(
address _tokenAddr,
address _recipient,
uint256 _amountToSend
) external;
function treasuryWallet() external view returns (address);
function updateCostToVote(uint256 newCostToVote) external;
function updateDelayBeforeEnforce(uint256 newDelay) external;
function updateRolloverBonus(address _forPool, uint256 _bonus) external;
function updateVault(uint256 _type, uint256 _amount) external;
}
// THIS FILE WAS AUTOGENERATED FROM THE FOLLOWING ABI JSON:
/*
[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_newGovernor","type":"address"},{"indexed":true,"internalType":"address","name":"enforcer","type":"address"}],"name":"EnforceGovernor","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"recipient","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":true,"internalType":"address","name":"poolInto","type":"address"}],"name":"GiveRolloverBonus","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"rewardPerBlock","type":"uint256"}],"name":"SetInflation","type":"event"},{"inputs":[],"name":"OINK","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"acPool1","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"acPool1ID","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"acPool2","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"acPool2ID","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"acPool3","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"acPool3ID","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"acPool4","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"acPool4ID","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_pool","type":"address"}],"name":"addNewPool","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"addr","type":"address"}],"name":"addressToUint256","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"basicContract","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"blockGovernorProposal","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"burnTokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"changedName","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"consensusContract","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"costToVote","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"creditContract","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"delayBeforeEnforce","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"depositFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"farmContract","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"fundingRate","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_bonusForPool","type":"address"}],"name":"getRollBonus","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"governorBlocked","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"harvest","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"helperToken","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lastHarvestedTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"masterchef","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"proposeGovernorTimestamp","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"beneficiary","type":"address"}],"name":"proposeNewGovernor","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"proposedGovernor","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"rebalancePools","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"referralBonus","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"rewardContract","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_acPool","type":"address"},{"internalType":"uint256","name":"_newCallFee","type":"uint256"}],"name":"setCallFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"setGovernorTax","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"setNewGovernor","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_new","type":"address"}],"name":"setNewGovernor2","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pid","type":"uint256"},{"internalType":"uint256","name":"_allocPoint","type":"uint256"},{"internalType":"bool","name":"_withUpdate","type":"bool"}],"name":"setPool","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"setReward","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_toAddress","type":"address"},{"internalType":"address","name":"_depositToPool","type":"address"},{"internalType":"uint256","name":"_bonusToPay","type":"uint256"},{"internalType":"uint256","name":"_stakeID","type":"uint256"}],"name":"stakeRolloverBonus","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"token","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferToTreasury","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_tokenAddr","type":"address"},{"internalType":"address","name":"_recipient","type":"address"},{"internalType":"uint256","name":"_amountToSend","type":"uint256"}],"name":"treasuryRequest","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"treasuryWallet","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"newCostToVote","type":"uint256"}],"name":"updateCostToVote","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newDelay","type":"uint256"}],"name":"updateDelayBeforeEnforce","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_forPool","type":"address"},{"internalType":"uint256","name":"_bonus","type":"uint256"}],"name":"updateRolloverBonus","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_type","type":"uint256"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"updateVault","outputs":[],"stateMutability":"nonpayable","type":"function"}]
*/
// File: DEGEN-main (9)/DEGEN-main/contracts/interface/IVoting.sol
// !! THIS FILE WAS AUTOGENERATED BY abi-to-sol v0.8.0. SEE SOURCE BELOW. !!
pragma solidity ^0.8.20;
interface IVoting {
event AddCredit(address indexed depositor, uint256 amount);
event BurnCredit(
address indexed burnFrom,
uint256 amount,
uint256 indexed forId
);
event DeductCredit(address indexed from, uint256 amount);
event SetCreditingContract(address indexed _contract, bool setting);
event SetDeductingContract(address indexed _contract, bool setting);
function addCredit(uint256 amount, address _beneficiary) external;
function airdropContract() external view returns (address);
function airdropContractLocked() external view returns (address);
function airdropVotingCredit(uint256 amount, address beneficiary) external;
function burnCredit(uint256 amount, uint256 _forId) external;
function burnedForId(uint256) external view returns (uint256);
function creditingContract(address) external view returns (bool);
function creditingContractCount() external view returns (uint256);
function deductCredit(address from, uint256 amount) external returns (bool);
function deductingContract(address) external view returns (bool);
function deductingContractCount() external view returns (uint256);
function depositCredit(uint256 amount) external;
function masterchef() external view returns (address);
function modifyCreditingContract(address _contract, bool setting) external;
function modifyDeductingContract(address _contract, bool setting) external;
function owner() external view returns (address);
function redeemGovernor() external;
function syncOwner() external;
function token() external view returns (address);
function updateChef() external;
function userCredit(address) external view returns (uint256);
}
// THIS FILE WAS AUTOGENERATED FROM THE FOLLOWING ABI JSON:
/*
[{"inputs":[{"internalType":"contract IDTX","name":"_token","type":"address"},{"internalType":"contract IMasterChef","name":"_masterchef","type":"address"},{"internalType":"address","name":"_airdropContract","type":"address"},{"internalType":"address","name":"_airdropContractLocked","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"depositor","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"AddCredit","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"burnFrom","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":true,"internalType":"uint256","name":"forId","type":"uint256"}],"name":"BurnCredit","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"DeductCredit","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_contract","type":"address"},{"indexed":false,"internalType":"bool","name":"setting","type":"bool"}],"name":"SetCreditingContract","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_contract","type":"address"},{"indexed":false,"internalType":"bool","name":"setting","type":"bool"}],"name":"SetDeductingContract","type":"event"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"address","name":"_beneficiary","type":"address"}],"name":"addCredit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"airdropContract","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"airdropContractLocked","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"address","name":"beneficiary","type":"address"}],"name":"airdropVotingCredit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"_forId","type":"uint256"}],"name":"burnCredit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"burnedForId","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"creditingContract","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"creditingContractCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"deductCredit","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"deductingContract","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"deductingContractCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"depositCredit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"masterchef","outputs":[{"internalType":"contract IMasterChef","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_contract","type":"address"},{"internalType":"bool","name":"setting","type":"bool"}],"name":"modifyCreditingContract","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_contract","type":"address"},{"internalType":"bool","name":"setting","type":"bool"}],"name":"modifyDeductingContract","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"redeemGovernor","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"syncOwner","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"token","outputs":[{"internalType":"contract IDTX","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"updateChef","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"userCredit","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"}]
*/
// File: DEGEN-main (9)/DEGEN-main/contracts/mining/10year.sol
pragma solidity >= 0.8.0;
/**
* DTX time-locked deposit
* Auto-compounding pool
* !!! Warning: !!! Copyrighted.
*/
contract TimeDeposit is ReentrancyGuard {
using SafeMath for uint256;
struct UserInfo {
uint256 shares; // number of shares for a user
uint256 lastDepositedTime; // keeps track of deposited time for potential penalty
uint256 dtxAtLastUserAction; // keeps track of DTX deposited at the last user action
uint256 lastUserActionTime; // keeps track of the last user action time
uint256 mandatoryTimeToServe; // optional: disables early withdraw
}
//allows stakes to be transferred, similar to token transfers
struct StakeTransfer {
uint256 shares; // ALLOWANCE of shares
uint256 lastDepositedTime;
uint256 mandatoryTimeToServe;
}
IDTX public immutable token; // DTX token
IMasterChef public masterchef;
uint256 public immutable withdrawFeePeriod = 3652 days;
uint256 public immutable gracePeriod = 180 days;
mapping(address => UserInfo[]) public userInfo;
mapping(address => uint256) public userVote; //the ID the user is voting for
mapping(uint256 => uint256) public totalVotesForID; //total votes for a given ID
mapping(address => address) public userDelegate; //user can delegate their voting to another wallet
mapping(address => bool) public trustedSender; //Pools with shorter lockup duration(trustedSender(contracts) can transfer into this pool)
mapping(address => bool) public trustedPool; //Pools with longer lockup duration(can transfer from this pool into trustedPool(contracts))
mapping(address => mapping(address => StakeTransfer[])) private _stakeAllowances;
//similar to token allowances, difference being it's not for amount of tokens, but for a specific stake defined by shares, latdeposittime and mandatorytime
uint256 public poolID;
uint256 public totalShares;
address public admin; //admin = governing contract!
address public treasury; //penalties go to this address
address public migrationPool; //if pools are to change
uint256 public minimumGift = 0;
bool public updateMinGiftGovernor = true; //allows automatic update by anybody to costToVote from governing contract
uint256 public callFee = 0; // call fee paid for rebalancing pools
bool public allowStakeTransfer = true; //enable/disable transferring of stakes to another wallet
bool public allowStakeTransferFrom = false; //allow third party transfers(disabled initially)
bool public partialWithdrawals = true; //partial withdrawals from stakes
bool public partialTransfers = true; //allows transferring a portion of a stake
bool public allowOrigin = true; //(dis)allows tx.origin for voting
//safe to use tx.origin IMO. Can be disabled and use msg.sender instead
//it allows the voting and delegating in a single transaction for all pools through a proxy contract
// Easier to verify (opposed to checking event logs)
uint256 public trustedSenderCount;
uint256 public trustedPoolCount;
event Deposit(address indexed sender, uint256 amount, uint256 shares, uint256 lastDepositedTime);
event GiftDeposit(
address indexed sender,
address indexed recipient,
uint256 amount,
uint256 shares,
uint256 lastDepositedTime
);
event AddAndExtendStake(
address indexed sender,
address indexed recipient,
uint256 amount,
uint256 stakeID,
uint256 shares,
uint256 lastDepositedTime
);
event Withdraw(address indexed sender, uint256 amount, uint256 penalty, uint256 shares);
event TransferStake(address indexed sender, address indexed recipient, uint256 shares, uint256 stakeID);
event HopPool(address indexed sender, uint256 DTXamount, uint256 shares, address indexed newPool);
event MigrateStake(address indexed goodSamaritan, uint256 DTXamount, uint256 shares, address indexed recipient);
event HopDeposit(
address indexed recipient,
uint256 amount,
uint256 shares,
uint256 previousLastDepositedTime,
uint256 mandatoryTime
);
event RemoveVotes(address indexed voter, uint256 proposalID, uint256 change);
event AddVotes(address indexed voter, uint256 proposalID, uint256 change);
event TrustedSender(address contractAddress, bool setting);
event TrustedPool(address contractAddress, bool setting);
event StakeApproval(
address owner,
address spender,
uint256 allowanceID,
uint256 shareAllowance,
uint256 lastDeposit,
uint256 mandatoryTime
);
event StakeAllowanceRevoke(address owner, address spender, uint256 allowanceID);
event TransferStakeFrom(address _from, address _to, uint256 _stakeID, uint256 _allowanceID);
event SetDelegate(address userDelegating, address delegatee);
constructor(
) {
token = IDTX(0x3E79130ab714E97ee73f86a56a2427bb1A519896);
masterchef = IMasterChef(0xC84FbE083713544BB4Ea85E2fe95148D076b2942);
admin = msg.sender;
poolID = 3;
}
/**
* @notice Checks if the msg.sender is the admin
*/
modifier decentralizedVoting() {
require(msg.sender == admin, "admin: wut?");
_;
}
/**
* @notice Deposits funds into the DTX time-locked vault
* @param _amount: number of tokens to deposit (in DTX
*
* Creates a NEW stake
*/
function deposit(uint256 _amount) external nonReentrant {
require(_amount > 0, "Nothing to deposit");
uint256 pool = balanceOf();
require(masterchef.burn(msg.sender, _amount), "token burn failed");
uint256 currentShares = 0;
if (totalShares != 0) {
currentShares = (_amount.mul(totalShares)).div(pool);
} else {
currentShares = _amount;
}
totalShares = totalShares.add(currentShares);
userInfo[msg.sender].push(
UserInfo(currentShares, block.timestamp, _amount, block.timestamp, 0)
);
uint256 votingFor = userVote[msg.sender];
if(votingFor != 0) {
_updateVotingAddDiff(msg.sender, votingFor, currentShares);
}
emit Deposit(msg.sender, _amount, currentShares, block.timestamp);
}
/**
* Equivalent to Deposit
* Instead of crediting the msg.sender, it credits custom recipient
* A mechanism to gift a time-locked stake to another wallet
* Users can withdraw at any time(but will pay a penalty)
* Optionally stake can be irreversibly locked for a minimum period of time(minToServe)
*/
function giftDeposit(uint256 _amount, address _toAddress, uint256 _minToServeInSecs) external nonReentrant {
require(_amount >= minimumGift, "Below Minimum Gift");
uint256 pool = balanceOf();
require(masterchef.burn(msg.sender, _amount), "token burn failed");
uint256 currentShares = 0;
if (totalShares != 0) {
currentShares = (_amount.mul(totalShares)).div(pool);
} else {
currentShares = _amount;
}
totalShares = totalShares.add(currentShares);
userInfo[_toAddress].push(
UserInfo(currentShares, block.timestamp, _amount, block.timestamp, _minToServeInSecs)
);
uint256 votingFor = userVote[_toAddress];
if(votingFor != 0) {
_updateVotingAddDiff(_toAddress, votingFor, currentShares);
}
emit GiftDeposit(msg.sender, _toAddress, _amount, currentShares, block.timestamp);
}
/**
* @notice Deposits funds into the DTX time-locked vault
* @param _amount: number of tokens to deposit (in DTX
*
* Deposits into existing stake, effectively extending the stake
* It's used for rolling over stakes by the governor(admin) as well
* Mandatory Lock Up period can only be Increased
* It can be Decreased if stake is being extended(after it matures)
*/
function addAndExtendStake(address _recipientAddr, uint256 _amount, uint256 _stakeID, uint256 _lockUpTokensInSeconds) external nonReentrant {
require(_amount > 0, "Nothing to deposit");
require(userInfo[_recipientAddr].length > _stakeID, "wrong Stake ID");
if(msg.sender != admin) { require(_recipientAddr == msg.sender, "can only extend your own stake"); }
uint256 pool = balanceOf();
require(masterchef.burn(msg.sender, _amount), "token burn failed");
uint256 currentShares = 0;
if (totalShares != 0) {
currentShares = (_amount.mul(totalShares)).div(pool);
} else {
currentShares = _amount;
}
UserInfo storage user = userInfo[_recipientAddr][_stakeID];
user.shares = user.shares.add(currentShares);
totalShares = totalShares.add(currentShares);
if(_lockUpTokensInSeconds > user.mandatoryTimeToServe ||
block.timestamp > user.lastDepositedTime.add(withdrawFeePeriod)) {
user.mandatoryTimeToServe = _lockUpTokensInSeconds;
}
user.dtxAtLastUserAction = user.shares.mul(balanceOf()).div(totalShares);
user.lastUserActionTime = block.timestamp;
user.lastDepositedTime = block.timestamp;
uint256 votingFor = userVote[_recipientAddr];
if(votingFor != 0) {
_updateVotingAddDiff(_recipientAddr, votingFor, currentShares);
}
emit AddAndExtendStake(msg.sender, _recipientAddr, _amount, _stakeID, currentShares, block.timestamp);
}
function withdrawAll(uint256 _stakeID) external {
withdraw(userInfo[msg.sender][_stakeID].shares, _stakeID);
}
/**
* @notice Sets admin address and treasury
* If new governor is set, anyone can pay the gas to update the addresses
* Masterchef owns the token, the governor owns the Masterchef
* Treasury is feeAddress from masterchef(which collects fees from deposits into masterchef)
* Currently all penalties are going to fee address(currently governing contract)
* Alternatively, fee address can be set as a separate contract, which would re-distribute
* The tokens back into pool(so honest stakers would directly receive penalties from prematurely ended stakes)
* Alternatively could also split: a portion to honest stakers, a portion into governing contract.
* With initial setting, all penalties are going towards governing contract
*/
function setAdmin() external {
admin = IMasterChef(masterchef).owner();
treasury = IMasterChef(masterchef).feeAddress();
}
//updates minimum gift to costToVote from Governing contract
function updateMinimumGift() external {
require(updateMinGiftGovernor, "automatic update disabled");
minimumGift = IGovernor(admin).costToVote();
}
/**
* @notice Withdraws from funds from the DTX time-locked vault
* @param _shares: Number of shares to withdraw
*/
function withdraw(uint256 _shares, uint256 _stakeID) public {
require(_stakeID < userInfo[msg.sender].length, "invalid stake ID");
UserInfo storage user = userInfo[msg.sender][_stakeID];
require(_shares > 0, "Nothing to withdraw");
require(_shares <= user.shares, "Withdraw amount exceeds balance");
require(block.timestamp > user.lastDepositedTime.add(user.mandatoryTimeToServe), "must serve mandatory time");
if(!partialWithdrawals) { require(_shares == user.shares, "must transfer full stake"); }
uint256 currentAmount = (balanceOf().mul(_shares)).div(totalShares);
user.shares = user.shares.sub(_shares);
totalShares = totalShares.sub(_shares);
uint256 currentWithdrawFee = 0;
if (block.timestamp < user.lastDepositedTime.add(withdrawFeePeriod)) {
uint256 withdrawFee = uint256(9400).sub(((block.timestamp - user.lastDepositedTime).div(86400)).mul(2500).div(1000));
currentWithdrawFee = currentAmount.mul(withdrawFee).div(10000);
IMasterChef(masterchef).publishTokens(treasury, currentWithdrawFee);
currentAmount = currentAmount.sub(currentWithdrawFee);
} else if(block.timestamp > user.lastDepositedTime.add(withdrawFeePeriod).add(gracePeriod)) {
uint256 withdrawFee = block.timestamp.sub(user.lastDepositedTime.add(withdrawFeePeriod)).div(86400).mul(2500).div(1000);
if(withdrawFee > 9400) { withdrawFee = 9400; }
currentWithdrawFee = currentAmount.mul(withdrawFee).div(10000);
IMasterChef(masterchef).publishTokens(treasury, currentWithdrawFee);
currentAmount = currentAmount.sub(currentWithdrawFee);
}
if (user.shares > 0) {
user.dtxAtLastUserAction = user.shares.mul(balanceOf().sub(currentAmount)).div(totalShares);
user.lastUserActionTime = block.timestamp;
} else {
_removeStake(msg.sender, _stakeID); //delete the stake
}
uint256 votingFor = userVote[msg.sender];
if(votingFor != 0) {
_updateVotingSubDiff(msg.sender, votingFor, _shares);
}
emit Withdraw(msg.sender, currentAmount, currentWithdrawFee, _shares);
IMasterChef(masterchef).publishTokens(msg.sender, currentAmount);
}
/**
* Users can transfer their stake to another pool
* Can only transfer to pool with longer lock-up period(trusted pools)
* Equivalent to withdrawing, but it deposits the stake into another pool as hopDeposit
* Users can transfer stake without penalty
* Time served gets transferred
* The pool is "registered" as a "trustedSender" to another pool
*/
function hopStakeToAnotherPool(uint256 _shares, uint256 _stakeID, address _poolAddress) public {
require(_shares > 0, "Nothing to withdraw");
require(_stakeID < userInfo[msg.sender].length, "wrong stake ID");
UserInfo storage user = userInfo[msg.sender][_stakeID];
require(_shares <= user.shares, "Withdraw amount exceeds balance");
if(!partialWithdrawals) { require(_shares == user.shares, "must transfer full stake"); }
uint256 _lastDepositedTime = user.lastDepositedTime;
if(trustedPool[_poolAddress]) {
if(block.timestamp > _lastDepositedTime.add(withdrawFeePeriod).add(gracePeriod)) {
_lastDepositedTime = block.timestamp; //if after grace period, resets timer
}
} else {
//can only hop into trusted Pools or into trusted sender(lower pool) after time has been served within grace period
//only meant for stakeRollover. After hop, stake is extended and timer reset
require(trustedSender[_poolAddress] && block.timestamp > _lastDepositedTime.add(withdrawFeePeriod) &&
block.timestamp < _lastDepositedTime.add(withdrawFeePeriod).add(gracePeriod),
"can only hop into pre-set Pools");
}
uint256 currentAmount = (balanceOf().mul(_shares)).div(totalShares);
user.shares = user.shares.sub(_shares);
totalShares = totalShares.sub(_shares);
uint256 votingFor = userVote[msg.sender];
if(votingFor != 0) {
_updateVotingSubDiff(msg.sender, votingFor, _shares);
}
IacPool(_poolAddress).hopDeposit(currentAmount, msg.sender, _lastDepositedTime, user.mandatoryTimeToServe);
IMasterChef(masterchef).transferCredit(_poolAddress, currentAmount);
if (user.shares > 0) {
user.dtxAtLastUserAction = user.shares.mul(balanceOf()).div(totalShares);
user.lastUserActionTime = block.timestamp;
} else {
_removeStake(msg.sender, _stakeID); //delete the stake
}
emit HopPool(msg.sender, currentAmount, _shares, _poolAddress);
}
/**
* hopDeposit is equivalent to gift deposit, exception being that the time served can be passed
* The msg.sender can only be a trusted contract
* The checks are already made in the hopStakeToAnotherPool function
* msg sender can only be trusted senders
*/
function hopDeposit(uint256 _amount, address _recipientAddress, uint256 previousLastDepositedTime, uint256 _mandatoryTime) external {
require(trustedSender[msg.sender] || trustedPool[msg.sender], "only trusted senders(other pools)");
//only trustedSenders allowed. TrustedPools are under condition that the stake has matured(hopStake checks condition)
uint256 pool = balanceOf();
uint256 currentShares = 0;
if (totalShares != 0) {
currentShares = (_amount.mul(totalShares)).div(pool);
} else {
currentShares = _amount;
}
totalShares = totalShares.add(currentShares);
userInfo[_recipientAddress].push(
UserInfo(currentShares, previousLastDepositedTime, _amount,
block.timestamp, _mandatoryTime)
);
uint256 votingFor = userVote[_recipientAddress];
if(votingFor != 0) {
_updateVotingAddDiff(_recipientAddress, votingFor, currentShares);
}
emit HopDeposit(_recipientAddress, _amount, currentShares, previousLastDepositedTime, _mandatoryTime);
}
/**
* Users are encouraged to keep staking
* Governor pays bonuses to re-commit and roll over your stake
* Higher bonuses available for hopping into pools with longer lockup period
*/
function stakeRollover(address _poolInto, uint256 _stakeID) external {
require(userInfo[msg.sender].length > _stakeID, "invalid stake ID");
UserInfo storage user = userInfo[msg.sender][_stakeID];
require(block.timestamp > user.lastDepositedTime.add(withdrawFeePeriod), "stake not yet mature");
uint256 currentAmount = (balanceOf().mul(user.shares)).div(totalShares);
uint256 toPay = currentAmount.mul(IGovernor(admin).getRollBonus(_poolInto)).div(10000);
require(IDTX(token).balanceOf(admin) >= toPay, "governor reserves are currently insufficient");
if(_poolInto == address(this)) {
IGovernor(admin).stakeRolloverBonus(msg.sender, _poolInto, toPay, _stakeID); //gov sends tokens to extend the stake
} else {
hopStakeToAnotherPool(user.shares, _stakeID, _poolInto); //will revert if pool is wrong
IGovernor(admin).stakeRolloverBonus(msg.sender, _poolInto, toPay, IacPool(_poolInto).getNrOfStakes(msg.sender) - 1); //extends latest stake
}
}
/**
* Transfer stake to another account(another wallet address)
*/
function transferStakeToAnotherWallet(uint256 _shares, uint256 _stakeID, address _recipientAddress) external {
require(allowStakeTransfer, "transfers disabled");
require(_recipientAddress != msg.sender, "can't transfer to self");
require(_stakeID < userInfo[msg.sender].length, "wrong stake ID");
UserInfo storage user = userInfo[msg.sender][_stakeID];
uint256 _tokensTransferred = _shares.mul(balanceOf()).div(totalShares);
require(_tokensTransferred >= minimumGift, "Below minimum threshold");
require(_shares <= user.shares, "Withdraw amount exceeds balance");
if(!partialTransfers) { require(_shares == user.shares, "must transfer full stake"); }
user.shares = user.shares.sub(_shares);
uint256 votingFor = userVote[msg.sender];
if(votingFor != 0) {
_updateVotingSubDiff(msg.sender, votingFor, _shares);
}
votingFor = userVote[_recipientAddress];
if(votingFor != 0) {
_updateVotingAddDiff(_recipientAddress, votingFor, _shares);
}
userInfo[_recipientAddress].push(
UserInfo(_shares, user.lastDepositedTime, _tokensTransferred, block.timestamp, user.mandatoryTimeToServe)
);
if (user.shares > 0) {
user.dtxAtLastUserAction = user.shares.mul(balanceOf()).div(totalShares);
user.lastUserActionTime = block.timestamp;
} else {
_removeStake(msg.sender, _stakeID); //delete the stake
}
emit TransferStake(msg.sender, _recipientAddress, _shares, _stakeID);
}
/**
* user delegates their shares to cast a vote on a proposal
* casting to proposal ID = 0 is basically neutral position (not voting)
* Is origin is allowed, proxy contract can be used to vote in all pools in a single tx
*/
function voteForProposal(uint256 proposalID, bool asProxy) external {
address _wallet;
(allowOrigin && asProxy) ? _wallet = tx.origin : _wallet = msg.sender;
uint256 votingFor = userVote[_wallet]; //the ID the user is voting for(before change)
if(proposalID != votingFor) { // do nothing if false(already voting for that ID)
uint256 userTotalShares = getUserTotalShares(_wallet);
if(userTotalShares > 0) { //if false, no shares, thus just assign proposal ID to userVote
if(proposalID != 0) { // Allocates vote to an ID
if(votingFor == 0) { //starts voting, adds votes
_updateVotingAddDiff(_wallet, proposalID, userTotalShares);
} else { //removes from previous vote, adds to new
_updateVotingSubDiff(_wallet, votingFor, userTotalShares);
_updateVotingAddDiff(_wallet, proposalID, userTotalShares);
}
} else { //stops voting (previously voted, now going into neutral (=0)
_updateVotingSubDiff(_wallet, votingFor, userTotalShares);
}
}
userVote[_wallet] = proposalID;
}
}
/*
* delegatee can vote with shares of another user
*/
function delegateeVote(address[] calldata votingAddress, uint256 proposalID) external {
for(uint256 i = 0; i < votingAddress.length; i++) {
if(userDelegate[votingAddress[i]] == msg.sender) {
uint256 votingFor = userVote[votingAddress[i]]; //the ID the user is voting for(before change)
if(proposalID != votingFor){
uint256 userTotalShares = getUserTotalShares(votingAddress[i]);
if(userTotalShares > 0) {
if(proposalID != 0) {
if(votingFor == 0) {
_updateVotingAddDiff(votingAddress[i], proposalID, userTotalShares);
} else {
_updateVotingSubDiff(votingAddress[i], votingFor, userTotalShares);
_updateVotingAddDiff(votingAddress[i], proposalID, userTotalShares);
}
} else {
_updateVotingSubDiff(votingAddress[i], votingFor, userTotalShares);
}
}
userVote[votingAddress[i]] = proposalID;
}
}
}
}
/**
* Users can delegate their shares
*/
function setDelegate(address _delegate, bool asProxy) external {
address _wallet;
(allowOrigin && asProxy) ? _wallet=tx.origin : _wallet=msg.sender;
userDelegate[_wallet] = _delegate;
emit SetDelegate(_wallet, _delegate);
}
// allows third party stake transfer(stake IDs can be changed,
// so instead of being identified through ID, it's identified by shares, lastdeposit and mandatory time
function giveStakeAllowance(address spender, uint256 _stakeID) external {
UserInfo storage user = userInfo[msg.sender][_stakeID];
require(user.shares.mul(balanceOf()).div(totalShares) >= minimumGift, "below minimum threshold");
uint256 _allowanceID = _stakeAllowances[msg.sender][spender].length;
_stakeAllowances[msg.sender][spender].push(
StakeTransfer(user.shares, user.lastDepositedTime, user.mandatoryTimeToServe)
);
emit StakeApproval(msg.sender, spender, _allowanceID, user.shares, user.lastDepositedTime, user.mandatoryTimeToServe);
}
//Note: allowanceID (and not ID of the stake!)
function revokeStakeAllowance(address spender, uint256 allowanceID) external {
StakeTransfer[] storage allowances = _stakeAllowances[msg.sender][spender];
uint256 lastAllowanceID = allowances.length.sub(1);
if(allowanceID != lastAllowanceID) {
allowances[allowanceID] = allowances[lastAllowanceID];
}
allowances.pop();
emit StakeAllowanceRevoke(msg.sender, spender, allowanceID);
}
/**
* A third party can transfer the stake(allowance required)
* Allows smart contract inter-operability similar to how regular tokens work
* Can only transfer full stake (You can split the stake through other methods)
* Bad: makes illiquid stakes liquid
* I think best is to have the option, but leave it unavailable unless desired
*/
function transferStakeFrom(address _from, uint256 _stakeID, uint256 allowanceID, address _to) external returns (bool) {
require(allowStakeTransferFrom, "third party stake transfers disabled");
require(_from != _to, "can't transfer to self");
require(_stakeID < userInfo[_from].length, "wrong stake ID");
UserInfo storage user = userInfo[_from][_stakeID];
(uint256 _shares, uint256 _lastDeposit, uint256 _mandatoryTime) = stakeAllowances(_from, msg.sender, allowanceID);
//since stake ID can change, the stake to transfer is identified through number of shares, last deposit and mandatory time
//checks if stake allowance(for allowanceID) matches the actual stake of a user
require(_shares == user.shares, "incorrect stake or allowance");
require(_lastDeposit == user.lastDepositedTime, "incorrect stake or allowance");
require(_mandatoryTime == user.mandatoryTimeToServe, "incorrect stake or allowance");
uint256 votingFor = userVote[_from];
if(votingFor != 0) {
_updateVotingSubDiff(_from, votingFor, _shares);
}
votingFor = userVote[_to];
if(votingFor != 0) {
_updateVotingAddDiff(_to, votingFor, _shares);
}
_removeStake(_from, _stakeID); //transfer from must transfer full stake
_revokeStakeAllowance(_from, allowanceID);
userInfo[_to].push(
UserInfo(_shares, _lastDeposit, _shares.mul(balanceOf()).div(totalShares),
block.timestamp, _mandatoryTime)
);
emit TransferStakeFrom(_from, _to, _stakeID, allowanceID);
return true;
}
/**
* Allows the pools to be changed to new contracts
* if migration Pool is set
* anyone can be a "good Samaritan"
* and transfer the stake of another user to the new pool
*/
function migrateStake(address _staker, uint256 _stakeID) public {
require(migrationPool != address(0), "migration not activated");
require(_stakeID < userInfo[_staker].length, "invalid stake ID");
UserInfo storage user = userInfo[_staker][_stakeID];
require(user.shares > 0, "no balance");
uint256 currentAmount = (balanceOf().mul(user.shares)).div(totalShares);
totalShares = totalShares.sub(user.shares);
user.shares = 0; // equivalent to deleting the stake. Pools are no longer to be used,
//setting user shares to 0 is sufficient
IacPool(migrationPool).hopDeposit(currentAmount, _staker, user.lastDepositedTime, user.mandatoryTimeToServe);
IMasterChef(masterchef).transferCredit(migrationPool, currentAmount);
emit MigrateStake(msg.sender, currentAmount, user.shares, _staker);
}
/**
* loop and migrate all user stakes
* could run out of gas if too many stakes
*/
function migrateAllStakes(address _staker) external {
UserInfo[] storage user = userInfo[_staker];
uint256 userStakes = user.length;
for(uint256 i=0; i < userStakes; i++) {
migrateStake(_staker, i);
}
}
//enables or disables ability to draw stake from another wallet(allowance required)
function enableDisableStakeTransferFrom(bool _setting) external decentralizedVoting {
allowStakeTransferFrom = _setting;
}
/**
* @notice Sets call fee
* @dev Only callable by the contract admin.
*/
function setCallFee(uint256 _callFee) external decentralizedVoting {
callFee = _callFee;
}
/*
* set trusted senders, other pools that we can receive from (that can hopDeposit)
* guaranteed to be trusted (they rely lastDepositTime)
*/
function setTrustedSender(address[] calldata _sender, bool _setting) external decentralizedVoting {
for(uint i=0; i < _sender.length; i++) {
if(trustedSender[_sender[i]] != _setting) {
trustedSender[_sender[i]] = _setting;
_setting ? trustedSenderCount++ : trustedSenderCount--;
emit TrustedSender(_sender[i], _setting);
}
}
}
/**
* set trusted pools, the smart contracts that we can send the tokens to without penalty
* NOTICE: new pool must be set as trusted contract(to be able to draw balance without allowance)
*/
function setTrustedPool(address[] calldata _pool, bool _setting) external decentralizedVoting {
for(uint i=0; i < _pool.length; i++) {
if(trustedPool[_pool[i]] != _setting) {
trustedPool[_pool[i]] = _setting;
_setting ? trustedPoolCount++ : trustedPoolCount--;
emit TrustedPool(_pool[i], _setting);
}
}
}
/**
* set address of new pool that we can migrate into
* !!! NOTICE !!!
* new pool must be set as trusted contract in the token contract by the governor(to be able to draw balance without allowance)
*/
function setMigrationPool(address _newPool) external decentralizedVoting {
migrationPool = _newPool;
}
/**
* Enable or disable partial withdrawals from stakes
*/
function modifyPartialWithdrawals(bool _decision) external decentralizedVoting {
partialWithdrawals = _decision;
}
function modifyPartialTransfers(bool _decision) external decentralizedVoting {
partialTransfers = _decision;
}
function enableDisableStakeTransfer(bool _setting) external decentralizedVoting {
allowStakeTransfer = _setting;
}
/*
* Unlikely, but Masterchef can be changed if needed to be used without changing pools
* masterchef = IMasterChef(token.owner());
* Must stop earning first(withdraw tokens from old chef)
*/
function setMasterChefAddress(IMasterChef _masterchef, uint256 _newPoolID) external decentralizedVoting {
masterchef = _masterchef;
poolID = _newPoolID; //in case pool ID changes
}
function allowTxOrigin(bool _setting) external decentralizedVoting {
allowOrigin = _setting;
}
//sets minimum amount(for sending gift, transferring to another wallet,...)
//if setting is enabled, minimumGift can be auto-updated to costToVote from governor by anybody
function setMinimumGiftDeposit(uint256 _amount, bool _setting) external decentralizedVoting {
minimumGift = _amount;
updateMinGiftGovernor = _setting;
}
/**
* Returns number of stakes for a user
*/
function getNrOfStakes(address _user) external view returns (uint256) {
return userInfo[_user].length;
}
/**
* @notice Calculates the expected harvest reward from third party
* @return Expected reward to collect in DTX
*/
function calculateHarvestDTXRewards() external view returns (uint256) {
uint256 amount = IMasterChef(masterchef).pendingDtx(poolID);
uint256 currentCallFee = amount.mul(callFee).div(10000);
return currentCallFee;
}
/**
* @return Returns total pending dtx rewards
*/
function calculateTotalPendingDTXRewards() external view returns (uint256) {
uint256 amount = IMasterChef(masterchef).pendingDtx(poolID);
return amount;
}
/**
* @notice Calculates the price per share
*/
function getPricePerFullShare() external view returns (uint256) {
return totalShares == 0 ? 1e18 : balanceOf().mul(1e18).div(totalShares);
}
/**
* Returns all shares for a user
*/
function getUserTotalShares(address _user) public view returns (uint256) {
UserInfo[] storage _stake = userInfo[_user];
uint256 nrOfUserStakes = _stake.length;
uint256 countShares = 0;
for(uint256 i=0; i < nrOfUserStakes; i++) {
countShares += _stake[i].shares;
}
return countShares;
}
/**
* @notice returns number of shares for a certain stake of an user
*/
function getUserShares(address _wallet, uint256 _stakeID) public view returns (uint256) {
return userInfo[_wallet][_stakeID].shares;
}
/**
* @notice Calculates the total underlying tokens
* @dev It includes tokens held by the contract and held in MasterChef
*/
function balanceOf() public view returns (uint256) {
uint256 amount = IMasterChef(masterchef).pendingDtx(poolID);
uint256 _credit = IMasterChef(masterchef).credit(address(this));
return amount.add(_credit);
}
function nrOfstakeAllowances(address owner, address spender) public view returns (uint256) {
return _stakeAllowances[owner][spender].length;
}
function stakeAllowances(address owner, address spender, uint256 allowanceID) public view returns (uint256, uint256, uint256) {
StakeTransfer storage stakeStore = _stakeAllowances[owner][spender][allowanceID];
return (stakeStore.shares, stakeStore.lastDepositedTime, stakeStore.mandatoryTimeToServe);
}
//Note: allowanceID (and not ID of the stake!)
function _revokeStakeAllowance(address owner, uint256 allowanceID) private {
StakeTransfer[] storage allowances = _stakeAllowances[owner][msg.sender];
uint256 lastAllowanceID = allowances.length.sub(1);
if(allowanceID != lastAllowanceID) {
allowances[allowanceID] = allowances[lastAllowanceID];
}
allowances.pop();
emit StakeAllowanceRevoke(owner, msg.sender, allowanceID);
}
/**
* updates votes(whenever there is transfer of funds)
*/
function _updateVotingAddDiff(address voter, uint256 proposalID, uint256 diff) private {
totalVotesForID[proposalID] = totalVotesForID[proposalID].add(diff);
emit AddVotes(voter, proposalID, diff);
}
function _updateVotingSubDiff(address voter, uint256 proposalID, uint256 diff) private {
totalVotesForID[proposalID] = totalVotesForID[proposalID].sub(diff);
emit RemoveVotes(voter, proposalID, diff);
}
/**
* removes the stake
*/
function _removeStake(address _staker, uint256 _stakeID) private {
UserInfo[] storage stakes = userInfo[_staker];
uint256 lastStakeID = stakes.length - 1;
if(_stakeID != lastStakeID) {
stakes[_stakeID] = stakes[lastStakeID];
}
stakes.pop();
}
}
Contract ABI
[{"type":"constructor","stateMutability":"nonpayable","inputs":[]},{"type":"event","name":"AddAndExtendStake","inputs":[{"type":"address","name":"sender","internalType":"address","indexed":true},{"type":"address","name":"recipient","internalType":"address","indexed":true},{"type":"uint256","name":"amount","internalType":"uint256","indexed":false},{"type":"uint256","name":"stakeID","internalType":"uint256","indexed":false},{"type":"uint256","name":"shares","internalType":"uint256","indexed":false},{"type":"uint256","name":"lastDepositedTime","internalType":"uint256","indexed":false}],"anonymous":false},{"type":"event","name":"AddVotes","inputs":[{"type":"address","name":"voter","internalType":"address","indexed":true},{"type":"uint256","name":"proposalID","internalType":"uint256","indexed":false},{"type":"uint256","name":"change","internalType":"uint256","indexed":false}],"anonymous":false},{"type":"event","name":"Deposit","inputs":[{"type":"address","name":"sender","internalType":"address","indexed":true},{"type":"uint256","name":"amount","internalType":"uint256","indexed":false},{"type":"uint256","name":"shares","internalType":"uint256","indexed":false},{"type":"uint256","name":"lastDepositedTime","internalType":"uint256","indexed":false}],"anonymous":false},{"type":"event","name":"GiftDeposit","inputs":[{"type":"address","name":"sender","internalType":"address","indexed":true},{"type":"address","name":"recipient","internalType":"address","indexed":true},{"type":"uint256","name":"amount","internalType":"uint256","indexed":false},{"type":"uint256","name":"shares","internalType":"uint256","indexed":false},{"type":"uint256","name":"lastDepositedTime","internalType":"uint256","indexed":false}],"anonymous":false},{"type":"event","name":"HopDeposit","inputs":[{"type":"address","name":"recipient","internalType":"address","indexed":true},{"type":"uint256","name":"amount","internalType":"uint256","indexed":false},{"type":"uint256","name":"shares","internalType":"uint256","indexed":false},{"type":"uint256","name":"previousLastDepositedTime","internalType":"uint256","indexed":false},{"type":"uint256","name":"mandatoryTime","internalType":"uint256","indexed":false}],"anonymous":false},{"type":"event","name":"HopPool","inputs":[{"type":"address","name":"sender","internalType":"address","indexed":true},{"type":"uint256","name":"DTXamount","internalType":"uint256","indexed":false},{"type":"uint256","name":"shares","internalType":"uint256","indexed":false},{"type":"address","name":"newPool","internalType":"address","indexed":true}],"anonymous":false},{"type":"event","name":"MigrateStake","inputs":[{"type":"address","name":"goodSamaritan","internalType":"address","indexed":true},{"type":"uint256","name":"DTXamount","internalType":"uint256","indexed":false},{"type":"uint256","name":"shares","internalType":"uint256","indexed":false},{"type":"address","name":"recipient","internalType":"address","indexed":true}],"anonymous":false},{"type":"event","name":"RemoveVotes","inputs":[{"type":"address","name":"voter","internalType":"address","indexed":true},{"type":"uint256","name":"proposalID","internalType":"uint256","indexed":false},{"type":"uint256","name":"change","internalType":"uint256","indexed":false}],"anonymous":false},{"type":"event","name":"SetDelegate","inputs":[{"type":"address","name":"userDelegating","internalType":"address","indexed":false},{"type":"address","name":"delegatee","internalType":"address","indexed":false}],"anonymous":false},{"type":"event","name":"StakeAllowanceRevoke","inputs":[{"type":"address","name":"owner","internalType":"address","indexed":false},{"type":"address","name":"spender","internalType":"address","indexed":false},{"type":"uint256","name":"allowanceID","internalType":"uint256","indexed":false}],"anonymous":false},{"type":"event","name":"StakeApproval","inputs":[{"type":"address","name":"owner","internalType":"address","indexed":false},{"type":"address","name":"spender","internalType":"address","indexed":false},{"type":"uint256","name":"allowanceID","internalType":"uint256","indexed":false},{"type":"uint256","name":"shareAllowance","internalType":"uint256","indexed":false},{"type":"uint256","name":"lastDeposit","internalType":"uint256","indexed":false},{"type":"uint256","name":"mandatoryTime","internalType":"uint256","indexed":false}],"anonymous":false},{"type":"event","name":"TransferStake","inputs":[{"type":"address","name":"sender","internalType":"address","indexed":true},{"type":"address","name":"recipient","internalType":"address","indexed":true},{"type":"uint256","name":"shares","internalType":"uint256","indexed":false},{"type":"uint256","name":"stakeID","internalType":"uint256","indexed":false}],"anonymous":false},{"type":"event","name":"TransferStakeFrom","inputs":[{"type":"address","name":"_from","internalType":"address","indexed":false},{"type":"address","name":"_to","internalType":"address","indexed":false},{"type":"uint256","name":"_stakeID","internalType":"uint256","indexed":false},{"type":"uint256","name":"_allowanceID","internalType":"uint256","indexed":false}],"anonymous":false},{"type":"event","name":"TrustedPool","inputs":[{"type":"address","name":"contractAddress","internalType":"address","indexed":false},{"type":"bool","name":"setting","internalType":"bool","indexed":false}],"anonymous":false},{"type":"event","name":"TrustedSender","inputs":[{"type":"address","name":"contractAddress","internalType":"address","indexed":false},{"type":"bool","name":"setting","internalType":"bool","indexed":false}],"anonymous":false},{"type":"event","name":"Withdraw","inputs":[{"type":"address","name":"sender","internalType":"address","indexed":true},{"type":"uint256","name":"amount","internalType":"uint256","indexed":false},{"type":"uint256","name":"penalty","internalType":"uint256","indexed":false},{"type":"uint256","name":"shares","internalType":"uint256","indexed":false}],"anonymous":false},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"addAndExtendStake","inputs":[{"type":"address","name":"_recipientAddr","internalType":"address"},{"type":"uint256","name":"_amount","internalType":"uint256"},{"type":"uint256","name":"_stakeID","internalType":"uint256"},{"type":"uint256","name":"_lockUpTokensInSeconds","internalType":"uint256"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address"}],"name":"admin","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"allowOrigin","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"allowStakeTransfer","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"allowStakeTransferFrom","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"allowTxOrigin","inputs":[{"type":"bool","name":"_setting","internalType":"bool"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"balanceOf","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"calculateHarvestDTXRewards","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"calculateTotalPendingDTXRewards","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"callFee","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"delegateeVote","inputs":[{"type":"address[]","name":"votingAddress","internalType":"address[]"},{"type":"uint256","name":"proposalID","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"deposit","inputs":[{"type":"uint256","name":"_amount","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"enableDisableStakeTransfer","inputs":[{"type":"bool","name":"_setting","internalType":"bool"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"enableDisableStakeTransferFrom","inputs":[{"type":"bool","name":"_setting","internalType":"bool"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"getNrOfStakes","inputs":[{"type":"address","name":"_user","internalType":"address"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"getPricePerFullShare","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"getUserShares","inputs":[{"type":"address","name":"_wallet","internalType":"address"},{"type":"uint256","name":"_stakeID","internalType":"uint256"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"getUserTotalShares","inputs":[{"type":"address","name":"_user","internalType":"address"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"giftDeposit","inputs":[{"type":"uint256","name":"_amount","internalType":"uint256"},{"type":"address","name":"_toAddress","internalType":"address"},{"type":"uint256","name":"_minToServeInSecs","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"giveStakeAllowance","inputs":[{"type":"address","name":"spender","internalType":"address"},{"type":"uint256","name":"_stakeID","internalType":"uint256"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"gracePeriod","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"hopDeposit","inputs":[{"type":"uint256","name":"_amount","internalType":"uint256"},{"type":"address","name":"_recipientAddress","internalType":"address"},{"type":"uint256","name":"previousLastDepositedTime","internalType":"uint256"},{"type":"uint256","name":"_mandatoryTime","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"hopStakeToAnotherPool","inputs":[{"type":"uint256","name":"_shares","internalType":"uint256"},{"type":"uint256","name":"_stakeID","internalType":"uint256"},{"type":"address","name":"_poolAddress","internalType":"address"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"contract IMasterChef"}],"name":"masterchef","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"migrateAllStakes","inputs":[{"type":"address","name":"_staker","internalType":"address"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"migrateStake","inputs":[{"type":"address","name":"_staker","internalType":"address"},{"type":"uint256","name":"_stakeID","internalType":"uint256"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address"}],"name":"migrationPool","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"minimumGift","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"modifyPartialTransfers","inputs":[{"type":"bool","name":"_decision","internalType":"bool"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"modifyPartialWithdrawals","inputs":[{"type":"bool","name":"_decision","internalType":"bool"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"nrOfstakeAllowances","inputs":[{"type":"address","name":"owner","internalType":"address"},{"type":"address","name":"spender","internalType":"address"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"partialTransfers","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"partialWithdrawals","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"poolID","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"revokeStakeAllowance","inputs":[{"type":"address","name":"spender","internalType":"address"},{"type":"uint256","name":"allowanceID","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"setAdmin","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"setCallFee","inputs":[{"type":"uint256","name":"_callFee","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"setDelegate","inputs":[{"type":"address","name":"_delegate","internalType":"address"},{"type":"bool","name":"asProxy","internalType":"bool"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"setMasterChefAddress","inputs":[{"type":"address","name":"_masterchef","internalType":"contract IMasterChef"},{"type":"uint256","name":"_newPoolID","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"setMigrationPool","inputs":[{"type":"address","name":"_newPool","internalType":"address"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"setMinimumGiftDeposit","inputs":[{"type":"uint256","name":"_amount","internalType":"uint256"},{"type":"bool","name":"_setting","internalType":"bool"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"setTrustedPool","inputs":[{"type":"address[]","name":"_pool","internalType":"address[]"},{"type":"bool","name":"_setting","internalType":"bool"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"setTrustedSender","inputs":[{"type":"address[]","name":"_sender","internalType":"address[]"},{"type":"bool","name":"_setting","internalType":"bool"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"},{"type":"uint256","name":"","internalType":"uint256"},{"type":"uint256","name":"","internalType":"uint256"}],"name":"stakeAllowances","inputs":[{"type":"address","name":"owner","internalType":"address"},{"type":"address","name":"spender","internalType":"address"},{"type":"uint256","name":"allowanceID","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"stakeRollover","inputs":[{"type":"address","name":"_poolInto","internalType":"address"},{"type":"uint256","name":"_stakeID","internalType":"uint256"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"contract IDTX"}],"name":"token","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"totalShares","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"totalVotesForID","inputs":[{"type":"uint256","name":"","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"transferStakeFrom","inputs":[{"type":"address","name":"_from","internalType":"address"},{"type":"uint256","name":"_stakeID","internalType":"uint256"},{"type":"uint256","name":"allowanceID","internalType":"uint256"},{"type":"address","name":"_to","internalType":"address"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"transferStakeToAnotherWallet","inputs":[{"type":"uint256","name":"_shares","internalType":"uint256"},{"type":"uint256","name":"_stakeID","internalType":"uint256"},{"type":"address","name":"_recipientAddress","internalType":"address"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address"}],"name":"treasury","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"trustedPool","inputs":[{"type":"address","name":"","internalType":"address"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"trustedPoolCount","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"trustedSender","inputs":[{"type":"address","name":"","internalType":"address"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"trustedSenderCount","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"updateMinGiftGovernor","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"updateMinimumGift","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address"}],"name":"userDelegate","inputs":[{"type":"address","name":"","internalType":"address"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"shares","internalType":"uint256"},{"type":"uint256","name":"lastDepositedTime","internalType":"uint256"},{"type":"uint256","name":"dtxAtLastUserAction","internalType":"uint256"},{"type":"uint256","name":"lastUserActionTime","internalType":"uint256"},{"type":"uint256","name":"mandatoryTimeToServe","internalType":"uint256"}],"name":"userInfo","inputs":[{"type":"address","name":"","internalType":"address"},{"type":"uint256","name":"","internalType":"uint256"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"userVote","inputs":[{"type":"address","name":"","internalType":"address"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"voteForProposal","inputs":[{"type":"uint256","name":"proposalID","internalType":"uint256"},{"type":"bool","name":"asProxy","internalType":"bool"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"withdraw","inputs":[{"type":"uint256","name":"_shares","internalType":"uint256"},{"type":"uint256","name":"_stakeID","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"withdrawAll","inputs":[{"type":"uint256","name":"_stakeID","internalType":"uint256"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"withdrawFeePeriod","inputs":[]}]
Contract Creation Code
0x60e06040526312cea60060a05262ed4e0060c0525f600e819055600f805460ff191660011790556010556011805464010101000164ffffffffff1990911617905534801561004b575f80fd5b5060015f819055733e79130ab714e97ee73f86a56a2427bb1a51989660805280546001600160a01b031990811673c84fbe083713544bb4ea85e2fe95148d076b294217909155600b805490911633179055600360095560805160a05160c05161422b61011f5f395f81816106a801528181610a3901528181610af2015261162a01525f818161084201528181610a5e01528181610abf01528181610b17015281816115380152818161164e015281816116a301528181612a630152612db201525f81816108f50152612eea015261422b5ff3fe608060405234801561000f575f80fd5b50600436106103bf575f3560e01c80638482b202116101f5578063bdcd9c8011610114578063ddd9d045116100a9578063f5ba1c8711610079578063f5ba1c87146108ab578063f851a440146108ca578063fb1db278146108dd578063fc0c546a146108f0575f80fd5b8063ddd9d0451461082a578063df10b4e61461083d578063e56d607d14610864578063e5ea69ff14610883575f80fd5b8063d0afa9dd116100e4578063d0afa9dd146107de578063d693f834146107f1578063d6fe340514610804578063d71a4bc214610817575f80fd5b8063bdcd9c8014610776578063be50baa914610789578063c721308f146107b7578063cc7c7dec146107cb575f80fd5b8063a56924bd1161018a578063b6b55f251161015a578063b6b55f251461072a578063b7cdbed31461073d578063b949103b14610750578063ba17978714610763575f80fd5b8063a56924bd146106ca578063aaa9603a146106dc578063b330fc53146106ef578063b3f5f65514610717575f80fd5b8063955afa6c116101c5578063955afa6c1461066a578063958e2d311461067d5780639f6a928314610690578063a06db7dc146106a3575f80fd5b80638482b20214610632578063859f267f146106455780638d9344851461065857806390321e1a14610661575f80fd5b80633b500bcb116102e157806361d027b311610276578063722713f711610246578063722713f71461060757806377c7b8fc1461060f57806378e6e38a14610617578063800b2f341461061f575f80fd5b806361d027b3146105a157806362671897146105cc57806364f5c072146105df5780636505e8e8146105f4575f80fd5b80634a994eef116102b15780634a994eef14610560578063527cc2f11461057357806352d8164714610586578063607214d314610599575f80fd5b80633b500bcb146105055780633f6ba41514610518578063441a3e701461053a57806347be53111461054d575f80fd5b8063221665e5116103575780632e8ba039116103275780632e8ba039146104d3578063341d609f146104e0578063343d927e146104f35780633a98ef39146104fc575f80fd5b8063221665e5146104a757806325c6ea1f146104af57806326465826146104b85780632cae2096146104cb575f80fd5b8063174628d111610392578063174628d11461041a578063182c1da11461044c5780631de8e5921461045957806321ce919d1461046c575f80fd5b8063062d5ed4146103c35780630b799acf146103d85780630cf57ace146103eb5780631718e211146103fe575b5f80fd5b6103d66103d1366004613c20565b610917565b005b6103d66103e6366004613c63565b610d42565b6103d66103f9366004613c7e565b610d8c565b610407600e5481565b6040519081526020015b60405180910390f35b61043c610428366004613c7e565b60076020525f908152604090205460ff1681565b6040519015158152602001610411565b60115461043c9060ff1681565b6103d6610467366004613c99565b610dd2565b61047f61047a366004613cc7565b610e15565b604080519586526020860194909452928401919091526060830152608082015260a001610411565b6103d6610e5f565b61040760135481565b6103d66104c6366004613cf1565b610f2a565b6103d6610f59565b600f5461043c9060ff1681565b6104076104ee366004613d08565b61106f565b61040760125481565b610407600a5481565b61043c610513366004613d34565b61109b565b61043c610526366004613c7e565b60066020525f908152604090205460ff1681565b6103d6610548366004613d7b565b6113a5565b6103d661055b366004613de3565b611887565b6103d661056e366004613e2b565b611a0c565b6103d6610581366004613cc7565b611aa1565b6103d6610594366004613c63565b611bbd565b610407611c05565b600c546105b4906001600160a01b031681565b6040516001600160a01b039091168152602001610411565b6103d66105da366004613e57565b611c7d565b60115461043c90640100000000900460ff1681565b6103d6610602366004613c99565b611e39565b610407611ef1565b610407611feb565b610407612021565b6103d661062d366004613cc7565b6120be565b6103d6610640366004613cc7565b612221565b6103d6610653366004613e91565b612271565b61040760095481565b61040760105481565b600d546105b4906001600160a01b031681565b6103d661068b366004613cf1565b61248d565b6103d661069e366004613c63565b6124ca565b6104077f000000000000000000000000000000000000000000000000000000000000000081565b60115461043c90610100900460ff1681565b6103d66106ea366004613c20565b612510565b6105b46106fd366004613c7e565b60056020525f90815260409020546001600160a01b031681565b6103d6610725366004613ec6565b61281a565b6103d6610738366004613cf1565b612b51565b6103d661074b366004613cc7565b612d52565b60115461043c9062010000900460ff1681565b6103d6610771366004613efe565b613117565b6103d6610784366004613cc7565b6132ec565b61079c610797366004613f46565b613547565b60408051938452602084019290925290820152606001610411565b60115461043c906301000000900460ff1681565b6103d66107d9366004613c63565b6135b1565b6103d66107ec366004613de3565b6135f5565b6103d66107ff366004613c7e565b61377a565b6103d6610812366004613c63565b6137c6565b610407610825366004613c7e565b613803565b610407610838366004613cc7565b613870565b6104077f000000000000000000000000000000000000000000000000000000000000000081565b610407610872366004613cf1565b60046020525f908152604090205481565b610407610891366004613c7e565b6001600160a01b03165f9081526002602052604090205490565b6104076108b9366004613c7e565b60036020525f908152604090205481565b600b546105b4906001600160a01b031681565b6001546105b4906001600160a01b031681565b6105b47f000000000000000000000000000000000000000000000000000000000000000081565b5f83116109615760405162461bcd60e51b81526020600482015260136024820152724e6f7468696e6720746f20776974686472617760681b60448201526064015b60405180910390fd5b335f90815260026020526040902054821061098e5760405162461bcd60e51b815260040161095890613f73565b335f9081526002602052604081208054849081106109ae576109ae613f9b565b905f5260205f2090600502019050805f01548411156109df5760405162461bcd60e51b815260040161095890613faf565b60115462010000900460ff16610a0f5780548414610a0f5760405162461bcd60e51b815260040161095890613fe6565b60018101546001600160a01b0383165f9081526007602052604090205460ff1615610a9757610a887f0000000000000000000000000000000000000000000000000000000000000000610a82837f00000000000000000000000000000000000000000000000000000000000000006138b0565b906138b0565b421115610a925750425b610b8a565b6001600160a01b0383165f9081526006602052604090205460ff168015610ae65750610ae3817f00000000000000000000000000000000000000000000000000000000000000006138b0565b42115b8015610b3e5750610b3b7f0000000000000000000000000000000000000000000000000000000000000000610a82837f00000000000000000000000000000000000000000000000000000000000000006138b0565b42105b610b8a5760405162461bcd60e51b815260206004820152601f60248201527f63616e206f6e6c7920686f7020696e746f207072652d73657420506f6f6c73006044820152606401610958565b5f610ba9600a54610ba388610b9d611ef1565b906138bb565b906138c6565b8354909150610bb890876138d1565b8355600a54610bc790876138d1565b600a55335f908152600360205260409020548015610bea57610bea3382896138dc565b600484810154604051636267189760e01b81529182018490523360248301526044820185905260648201526001600160a01b038616906362671897906084015f604051808303815f87803b158015610c40575f80fd5b505af1158015610c52573d5f803e3d5ffd5b505060015460405163cc58a6bb60e01b81526001600160a01b03898116600483015260248201879052909116925063cc58a6bb91506044015f604051808303815f87803b158015610ca1575f80fd5b505af1158015610cb3573d5f803e3d5ffd5b50508554159150610ce9905057610cd9600a54610ba3610cd1611ef1565b8754906138bb565b6002850155426003850155610cf3565b610cf33387613950565b60408051838152602081018990526001600160a01b0387169133917f2391574aca0f6cc92f9588562ee00a7c2d33f83d17d01d8fa177ba4423740f44910160405180910390a350505050505050565b600b546001600160a01b03163314610d6c5760405162461bcd60e51b81526004016109589061401d565b601180549115156401000000000264ff0000000019909216919091179055565b6001600160a01b0381165f908152600260205260408120805490915b81811015610dcc57610dba84826132ec565b80610dc481614056565b915050610da8565b50505050565b600b546001600160a01b03163314610dfc5760405162461bcd60e51b81526004016109589061401d565b600e91909155600f805460ff1916911515919091179055565b6002602052815f5260405f208181548110610e2e575f80fd5b5f91825260209091206005909102018054600182015460028301546003840154600490940154929550909350919085565b600f5460ff16610eb15760405162461bcd60e51b815260206004820152601960248201527f6175746f6d61746963207570646174652064697361626c6564000000000000006044820152606401610958565b600b5f9054906101000a90046001600160a01b03166001600160a01b03166351a41dec6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610f01573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610f25919061406e565b600e55565b600b546001600160a01b03163314610f545760405162461bcd60e51b81526004016109589061401d565b601055565b60015f9054906101000a90046001600160a01b03166001600160a01b0316638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610fa9573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610fcd9190614085565b600b80546001600160a01b0319166001600160a01b0392831617905560015460408051630824ea6b60e31b81529051919092169163412753589160048083019260209291908290030181865afa158015611029573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061104d9190614085565b600c80546001600160a01b0319166001600160a01b0392909216919091179055565b6001600160a01b038083165f908152600860209081526040808320938516835292905220545b92915050565b6011545f90610100900460ff166111005760405162461bcd60e51b8152602060048201526024808201527f7468697264207061727479207374616b65207472616e73666572732064697361604482015263189b195960e21b6064820152608401610958565b816001600160a01b0316856001600160a01b03160361115a5760405162461bcd60e51b815260206004820152601660248201527531b0b713ba103a3930b739b332b9103a379039b2b63360511b6044820152606401610958565b6001600160a01b0385165f9081526002602052604090205484106111905760405162461bcd60e51b815260040161095890613f73565b6001600160a01b0385165f9081526002602052604081208054869081106111b9576111b9613f9b565b905f5260205f20906005020190505f805f6111d5893389613547565b925092509250835f015483146111fd5760405162461bcd60e51b8152600401610958906140a0565b836001015482146112205760405162461bcd60e51b8152600401610958906140a0565b836004015481146112435760405162461bcd60e51b8152600401610958906140a0565b6001600160a01b0389165f90815260036020526040902054801561126c5761126c8a82866138dc565b506001600160a01b0386165f90815260036020526040902054801561129657611296878286613a38565b6112a08a8a613950565b6112aa8a89613aa3565b60025f886001600160a01b03166001600160a01b031681526020019081526020015f206040518060a001604052808681526020018581526020016112fc600a54610ba36112f5611ef1565b8a906138bb565b81524260208083019190915260409182018690528354600181810186555f958652948290208451600590920201908155908301519381019390935581810151600284015560608201516003840155608090910151600490920191909155517f017cb7d605aa3dcd304a9eb2a4df6075576ccc4a5dc2fe0b518c558e8f75338d9061138d908c908a908d908d906140d7565b60405180910390a15060019998505050505050505050565b335f9081526002602052604090205481106113d25760405162461bcd60e51b815260040161095890614100565b335f9081526002602052604081208054839081106113f2576113f2613f9b565b905f5260205f20906005020190505f83116114455760405162461bcd60e51b81526020600482015260136024820152724e6f7468696e6720746f20776974686472617760681b6044820152606401610958565b80548311156114665760405162461bcd60e51b815260040161095890613faf565b60048101546001820154611479916138b0565b42116114c75760405162461bcd60e51b815260206004820152601960248201527f6d757374207365727665206d616e6461746f72792074696d65000000000000006044820152606401610958565b60115462010000900460ff166114f757805483146114f75760405162461bcd60e51b815260040161095890613fe6565b5f61150a600a54610ba386610b9d611ef1565b825490915061151990856138d1565b8255600a5461152890856138d1565b600a5560018201545f9061155c907f00000000000000000000000000000000000000000000000000000000000000006138b0565b421015611625575f61159361158a6103e8610ba36109c4610b9d620151808a6001015442610ba3919061412a565b6124b8906138d1565b90506115a5612710610ba385846138bb565b600154600c54604051632a98027560e01b81526001600160a01b039182166004820152602481018490529294501690632a980275906044015f604051808303815f87803b1580156115f4575f80fd5b505af1158015611606573d5f803e3d5ffd5b5050505061161d82846138d190919063ffffffff16565b925050611779565b6116807f0000000000000000000000000000000000000000000000000000000000000000610a827f000000000000000000000000000000000000000000000000000000000000000086600101546138b090919063ffffffff16565b421115611779575f6116dc6103e8610ba36109c4610b9d62015180610ba36116d57f00000000000000000000000000000000000000000000000000000000000000008c600101546138b090919063ffffffff16565b42906138d1565b90506124b88111156116ed57506124b85b6116fd612710610ba385846138bb565b600154600c54604051632a98027560e01b81526001600160a01b039182166004820152602481018490529294501690632a980275906044015f604051808303815f87803b15801561174c575f80fd5b505af115801561175e573d5f803e3d5ffd5b5050505061177582846138d190919063ffffffff16565b9250505b8254156117b3576117a3600a54610ba361179b85611795611ef1565b906138d1565b8654906138bb565b60028401554260038401556117bd565b6117bd3385613950565b335f9081526003602052604090205480156117dd576117dd3382886138dc565b604080518481526020810184905290810187905233907f02f25270a4d87bea75db541cdfe559334a275b4a233520ed6c0a2429667cca949060600160405180910390a2600154604051632a98027560e01b8152336004820152602481018590526001600160a01b0390911690632a980275906044015f604051808303815f87803b158015611869575f80fd5b505af115801561187b573d5f803e3d5ffd5b50505050505050505050565b600b546001600160a01b031633146118b15760405162461bcd60e51b81526004016109589061401d565b5f5b82811015610dcc5781151560075f8686858181106118d3576118d3613f9b565b90506020020160208101906118e89190613c7e565b6001600160a01b0316815260208101919091526040015f205460ff161515146119fa578160075f86868581811061192157611921613f9b565b90506020020160208101906119369190613c7e565b6001600160a01b0316815260208101919091526040015f20805460ff19169115159190911790558161197a5760138054905f6119718361413d565b9190505561198e565b60138054905f61198983614056565b919050555b507f808293acec1c44217eccd857d5abb88ff31456d23bf3a000d2f5aee5f92f4c198484838181106119c2576119c2613f9b565b90506020020160208101906119d79190613c7e565b604080516001600160a01b03909216825284151560208301520160405180910390a15b80611a0481614056565b9150506118b3565b6011545f90640100000000900460ff168015611a255750815b611a3157503380611a35565b5032805b506001600160a01b038181165f8181526005602090815260409182902080546001600160a01b031916948816948517905581519283528201929092527fbeebfeebc9d1af8057ca45af36b2171fea34cb5b251e394f0bc5fcabde119d7f910160405180910390a1505050565b335f9081526008602090815260408083206001600160a01b038616845290915281208054909190611ad39060016138d1565b9050808314611b3457818181548110611aee57611aee613f9b565b905f5260205f209060030201828481548110611b0c57611b0c613f9b565b5f91825260209091208254600390920201908155600180830154908201556002918201549101555b81805480611b4457611b44614152565b5f828152602080822060035f19949094019384020182815560018101839055600201919091559155604080513381526001600160a01b0387169281019290925281018490527f29fbfeb988fb99326ac41d70606334081c6be7e8518f6caa5b7b1bcbe7872a1e906060015b60405180910390a150505050565b600b546001600160a01b03163314611be75760405162461bcd60e51b81526004016109589061401d565b6011805491151563010000000263ff00000019909216919091179055565b60015460095460405163b6ec056160e01b81525f9283926001600160a01b039091169163b6ec056191611c3e9160040190815260200190565b602060405180830381865afa158015611c59573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611095919061406e565b335f9081526006602052604090205460ff1680611ca85750335f9081526007602052604090205460ff165b611cfe5760405162461bcd60e51b815260206004820152602160248201527f6f6e6c7920747275737465642073656e64657273286f7468657220706f6f6c736044820152602960f81b6064820152608401610958565b5f611d07611ef1565b90505f600a545f14611d3357611d2c82610ba3600a54896138bb90919063ffffffff16565b9050611d36565b50845b600a54611d4390826138b0565b600a556001600160a01b0385165f818152600260208181526040808420815160a0810183528781528084018b81528184018e81524260608401908152608084018d8152855460018181018855968b52888b20955160059091029095019485559251948401949094555195820195909555905160038083019190915593516004909101559383525220548015611ddd57611ddd868284613a38565b6040805188815260208101849052908101869052606081018590526001600160a01b038716907fb66a80ae2ebf4737952b9c2b57a9d34ef56806ab937f481b75197ae991d81afb9060800160405180910390a250505050505050565b6011545f90640100000000900460ff168015611e525750815b611e5e57503380611e62565b5032805b506001600160a01b0381165f90815260036020526040902054838114610dcc575f611e8c83613803565b90508015611ed2578415611ec757815f03611eb157611eac838683613a38565b611ed2565b611ebc8383836138dc565b611eac838683613a38565b611ed28383836138dc565b50506001600160a01b03165f9081526003602052604090209190915550565b60015460095460405163b6ec056160e01b81525f9283926001600160a01b039091169163b6ec056191611f2a9160040190815260200190565b602060405180830381865afa158015611f45573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611f69919061406e565b6001546040516301aba89b60e71b81523060048201529192505f916001600160a01b039091169063d5d44d8090602401602060405180830381865afa158015611fb4573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611fd8919061406e565b9050611fe482826138b0565b9250505090565b5f600a545f146120145761200f600a54610ba3670de0b6b3a7640000610b9d611ef1565b905090565b50670de0b6b3a764000090565b60015460095460405163b6ec056160e01b81525f9283926001600160a01b039091169163b6ec05619161205a9160040190815260200190565b602060405180830381865afa158015612075573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612099919061406e565b90505f6120b7612710610ba3601054856138bb90919063ffffffff16565b9392505050565b335f9081526002602052604081208054839081106120de576120de613f9b565b905f5260205f2090600502019050600e54612108600a54610ba3612100611ef1565b8554906138bb565b10156121565760405162461bcd60e51b815260206004820152601760248201527f62656c6f77206d696e696d756d207468726573686f6c640000000000000000006044820152606401610958565b335f8181526008602090815260408083206001600160a01b0388168085529083528184208054835160608082018652895482526001808b018054848a0190815260048d018054868b019081528488018955978c529a8a90209451600387029095019485555191840191909155935160029092019190915588549254965485519889529588019390935292860183905290850152608084019290925260a0830152907f13356b03fc409456fbfbc8b432cb402b7841b3114d1d159625eb0f3d4e3a46819060c001611baf565b600b546001600160a01b0316331461224b5760405162461bcd60e51b81526004016109589061401d565b600180546001600160a01b0319166001600160a01b039390931692909217909155600955565b612279613bb5565b600e548310156122c05760405162461bcd60e51b815260206004820152601260248201527110995b1bddc8135a5b9a5b5d5b4811da599d60721b6044820152606401610958565b5f6122c9611ef1565b600154604051632770a7eb60e21b8152336004820152602481018790529192506001600160a01b031690639dc29fac906044016020604051808303815f875af1158015612318573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061233c9190614166565b6123585760405162461bcd60e51b815260040161095890614181565b5f600a545f146123825761237b82610ba3600a54886138bb90919063ffffffff16565b9050612385565b50835b600a5461239290826138b0565b600a556001600160a01b0384165f818152600260208181526040808420815160a081018352878152428185018181528285018e815260608401928352608084018d8152855460018181018855968b52888b209551600590910290950194855591519484019490945592519582019590955593516003808601919091559051600490940193909355938352522054801561243057612430858284613a38565b6040805187815260208101849052428183015290516001600160a01b0387169133917f190f4e47df17911728b041870d3cd75008c166bb9d8cde694aaa68f73ad415829181900360600190a350505061248860015f55565b505050565b335f90815260026020526040902080546124c79190839081106124b2576124b2613f9b565b905f5260205f2090600502015f0154826113a5565b50565b600b546001600160a01b031633146124f45760405162461bcd60e51b81526004016109589061401d565b60118054911515620100000262ff000019909216919091179055565b60115460ff166125575760405162461bcd60e51b81526020600482015260126024820152711d1c985b9cd9995c9cc8191a5cd8589b195960721b6044820152606401610958565b336001600160a01b038216036125a85760405162461bcd60e51b815260206004820152601660248201527531b0b713ba103a3930b739b332b9103a379039b2b63360511b6044820152606401610958565b335f9081526002602052604090205482106125d55760405162461bcd60e51b815260040161095890613f73565b335f9081526002602052604081208054849081106125f5576125f5613f9b565b905f5260205f20906005020190505f61261c600a54610ba3612615611ef1565b88906138bb565b9050600e548110156126705760405162461bcd60e51b815260206004820152601760248201527f42656c6f77206d696e696d756d207468726573686f6c640000000000000000006044820152606401610958565b81548511156126915760405162461bcd60e51b815260040161095890613faf565b6011546301000000900460ff166126c257815485146126c25760405162461bcd60e51b815260040161095890613fe6565b81546126ce90866138d1565b8255335f9081526003602052604090205480156126f0576126f03382886138dc565b506001600160a01b0383165f90815260036020526040902054801561271a5761271a848288613a38565b6001600160a01b0384165f908152600260208181526040808420815160a0810183528b81526001808a015482860190815293820189815242606084019081526004808d01546080860190815286548086018855968b529790992093516005909502909301938455935190830155915193810193909355516003830155519101558254156127c2576127b2600a54610ba361179b611ef1565b60028401554260038401556127cc565b6127cc3386613950565b60408051878152602081018790526001600160a01b0386169133917ff3f8af030ee2cfc3c3c4ea260e6bcdd578eb1558b6eb3d79f7d0617ddbdc5b78910160405180910390a3505050505050565b612822613bb5565b5f83116128665760405162461bcd60e51b8152602060048201526012602482015271139bdd1a1a5b99c81d1bc819195c1bdcda5d60721b6044820152606401610958565b6001600160a01b0384165f9081526002602052604090205482106128bd5760405162461bcd60e51b815260206004820152600e60248201526d1ddc9bdb99c814dd185ad948125160921b6044820152606401610958565b600b546001600160a01b03163314612927576001600160a01b03841633146129275760405162461bcd60e51b815260206004820152601e60248201527f63616e206f6e6c7920657874656e6420796f7572206f776e207374616b6500006044820152606401610958565b5f612930611ef1565b600154604051632770a7eb60e21b8152336004820152602481018790529192506001600160a01b031690639dc29fac906044016020604051808303815f875af115801561297f573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906129a39190614166565b6129bf5760405162461bcd60e51b815260040161095890614181565b5f600a545f146129e9576129e282610ba3600a54886138bb90919063ffffffff16565b90506129ec565b50835b6001600160a01b0386165f908152600260205260408120805486908110612a1557612a15613f9b565b905f5260205f2090600502019050612a3982825f01546138b090919063ffffffff16565b8155600a54612a4890836138b0565b600a556004810154841180612a8a57506001810154612a87907f00000000000000000000000000000000000000000000000000000000000000006138b0565b42115b15612a9757600481018490555b612ab0600a54610ba3612aa8611ef1565b8454906138bb565b600282015542600380830182905560018301919091556001600160a01b0388165f90815260209190915260409020548015612af057612af0888285613a38565b60408051888152602081018890529081018490524260608201526001600160a01b0389169033907f7f65dfb94bab62e0708845150044cf7ad9c77fbfe6ba9e3c8c1f210e15aa953d9060800160405180910390a350505050610dcc60015f55565b612b59613bb5565b5f8111612b9d5760405162461bcd60e51b8152602060048201526012602482015271139bdd1a1a5b99c81d1bc819195c1bdcda5d60721b6044820152606401610958565b5f612ba6611ef1565b600154604051632770a7eb60e21b8152336004820152602481018590529192506001600160a01b031690639dc29fac906044016020604051808303815f875af1158015612bf5573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612c199190614166565b612c355760405162461bcd60e51b815260040161095890614181565b5f600a545f14612c5f57612c5882610ba3600a54866138bb90919063ffffffff16565b9050612c62565b50815b600a54612c6f90826138b0565b600a55335f818152600260208181526040808420815160a081018352878152428185018181528285018c81526060840192835260808401898152855460018181018855968b52888b2095516005909102909501948555915194840194909455925195820195909555935160038086019190915590516004909401939093559383525220548015612d0457612d04338284613a38565b60408051858152602081018490524281830152905133917f36af321ec8d3c75236829c5317affd40ddb308863a1236d2d277a4025cccee1e919081900360600190a25050506124c760015f55565b335f908152600260205260409020548110612d7f5760405162461bcd60e51b815260040161095890614100565b335f908152600260205260408120805483908110612d9f57612d9f613f9b565b905f5260205f2090600502019050612de47f000000000000000000000000000000000000000000000000000000000000000082600101546138b090919063ffffffff16565b4211612e295760405162461bcd60e51b81526020600482015260146024820152737374616b65206e6f7420796574206d617475726560601b6044820152606401610958565b5f612e3f600a54610ba3845f0154610b9d611ef1565b600b5460405163ded6e1c960e01b81526001600160a01b0387811660048301529293505f92612ec39261271092610ba3929091169063ded6e1c990602401602060405180830381865afa158015612e98573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612ebc919061406e565b85906138bb565b600b546040516370a0823160e01b81526001600160a01b03918216600482015291925082917f0000000000000000000000000000000000000000000000000000000000000000909116906370a0823190602401602060405180830381865afa158015612f31573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612f55919061406e565b1015612fb85760405162461bcd60e51b815260206004820152602c60248201527f676f7665726e6f72207265736572766573206172652063757272656e746c792060448201526b1a5b9cdd59999a58da595b9d60a21b6064820152608401610958565b306001600160a01b0386160361303057600b5460405163e5f59bc160e01b81526001600160a01b039091169063e5f59bc190612ffe903390899086908a906004016140d7565b5f604051808303815f87803b158015613015575f80fd5b505af1158015613027573d5f803e3d5ffd5b50505050613110565b825461303d908587610917565b600b5460405163e5ea69ff60e01b815233600482018190526001600160a01b039283169263e5f59bc1928991869160019184169063e5ea69ff90602401602060405180830381865afa158015613095573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906130b9919061406e565b6130c3919061412a565b6040518563ffffffff1660e01b81526004016130e294939291906140d7565b5f604051808303815f87803b1580156130f9575f80fd5b505af115801561310b573d5f803e3d5ffd5b505050505b5050505050565b5f5b82811015610dcc573360055f86868581811061313757613137613f9b565b905060200201602081019061314c9190613c7e565b6001600160a01b03908116825260208201929092526040015f205416036132da575f60035f86868581811061318357613183613f9b565b90506020020160208101906131989190613c7e565b6001600160a01b03166001600160a01b031681526020019081526020015f205490508083146132d8575f6131ec8686858181106131d7576131d7613f9b565b90506020020160208101906108259190613c7e565b9050801561329257831561327d57815f036132375761323286868581811061321657613216613f9b565b905060200201602081019061322b9190613c7e565b8583613a38565b613292565b61326886868581811061324c5761324c613f9b565b90506020020160208101906132619190613c7e565b83836138dc565b61323286868581811061321657613216613f9b565b61329286868581811061324c5761324c613f9b565b8360035f8888878181106132a8576132a8613f9b565b90506020020160208101906132bd9190613c7e565b6001600160a01b0316815260208101919091526040015f2055505b505b806132e481614056565b915050613119565b600d546001600160a01b03166133445760405162461bcd60e51b815260206004820152601760248201527f6d6967726174696f6e206e6f74206163746976617465640000000000000000006044820152606401610958565b6001600160a01b0382165f90815260026020526040902054811061337a5760405162461bcd60e51b815260040161095890614100565b6001600160a01b0382165f9081526002602052604081208054839081106133a3576133a3613f9b565b905f5260205f20906005020190505f815f0154116133f05760405162461bcd60e51b815260206004820152600a6024820152696e6f2062616c616e636560b01b6044820152606401610958565b5f613406600a54610ba3845f0154610b9d611ef1565b8254600a5491925061341891906138d1565b600a555f8255600d546001830154600480850154604051636267189760e01b81529182018590526001600160a01b038881166024840152604483019390935260648201529116906362671897906084015f604051808303815f87803b15801561347f575f80fd5b505af1158015613491573d5f803e3d5ffd5b5050600154600d5460405163cc58a6bb60e01b81526001600160a01b039182166004820152602481018690529116925063cc58a6bb91506044015f604051808303815f87803b1580156134e2575f80fd5b505af11580156134f4573d5f803e3d5ffd5b505083546040805185815260208101929092526001600160a01b03881693503392507fe28c7cce19d5f22ab16a04ca1bb768f7533bf719280b5e40718b41c2641ac309910160405180910390a350505050565b6001600160a01b038084165f90815260086020908152604080832093861683529290529081208054829182918291908690811061358657613586613f9b565b5f91825260209091206003909102018054600182015460029092015490999198509650945050505050565b600b546001600160a01b031633146135db5760405162461bcd60e51b81526004016109589061401d565b601180549115156101000261ff0019909216919091179055565b600b546001600160a01b0316331461361f5760405162461bcd60e51b81526004016109589061401d565b5f5b82811015610dcc5781151560065f86868581811061364157613641613f9b565b90506020020160208101906136569190613c7e565b6001600160a01b0316815260208101919091526040015f205460ff16151514613768578160065f86868581811061368f5761368f613f9b565b90506020020160208101906136a49190613c7e565b6001600160a01b0316815260208101919091526040015f20805460ff1916911515919091179055816136e85760128054905f6136df8361413d565b919050556136fc565b60128054905f6136f783614056565b919050555b507f68e0e16e4195f1bb5436073ae329e02686b513fd39cd623585b36d74785b21c184848381811061373057613730613f9b565b90506020020160208101906137459190613c7e565b604080516001600160a01b03909216825284151560208301520160405180910390a15b8061377281614056565b915050613621565b600b546001600160a01b031633146137a45760405162461bcd60e51b81526004016109589061401d565b600d80546001600160a01b0319166001600160a01b0392909216919091179055565b600b546001600160a01b031633146137f05760405162461bcd60e51b81526004016109589061401d565b6011805460ff1916911515919091179055565b6001600160a01b0381165f908152600260205260408120805482805b828110156138675783818154811061383957613839613f9b565b905f5260205f2090600502015f01548261385391906141ac565b91508061385f81614056565b91505061381f565b50949350505050565b6001600160a01b0382165f90815260026020526040812080548390811061389957613899613f9b565b905f5260205f2090600502015f0154905092915050565b5f6120b782846141ac565b5f6120b782846141bf565b5f6120b782846141d6565b5f6120b7828461412a565b5f828152600460205260409020546138f490826138d1565b5f838152600460209081526040918290209290925580518481529182018390526001600160a01b038516917f65b0f2fb4228364e2ac61c432687ae942c732095fc217265116bec6cc441683491015b60405180910390a2505050565b6001600160a01b0382165f90815260026020526040812080549091906139789060019061412a565b90508083146139f15781818154811061399357613993613f9b565b905f5260205f2090600502018284815481106139b1576139b1613f9b565b905f5260205f2090600502015f820154815f0155600182015481600101556002820154816002015560038201548160030155600482015481600401559050505b81805480613a0157613a01614152565b5f8281526020812060055f199093019283020181815560018101829055600281018290556003810182905560040155905550505050565b5f82815260046020526040902054613a5090826138b0565b5f838152600460209081526040918290209290925580518481529182018390526001600160a01b038516917fdb8549181d0331885cbb0e0d1e36bdd89e38e53990069f6f07a4090a15f74e5d9101613943565b6001600160a01b0382165f90815260086020908152604080832033845290915281208054909190613ad59060016138d1565b9050808314613b3657818181548110613af057613af0613f9b565b905f5260205f209060030201828481548110613b0e57613b0e613f9b565b5f91825260209091208254600390920201908155600180830154908201556002918201549101555b81805480613b4657613b46614152565b5f828152602080822060035f19949094019384020182815560018101839055600201919091559155604080516001600160a01b0387168152339281019290925281018490527f29fbfeb988fb99326ac41d70606334081c6be7e8518f6caa5b7b1bcbe7872a1e90606001611baf565b60025f5403613c065760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610958565b60025f55565b6001600160a01b03811681146124c7575f80fd5b5f805f60608486031215613c32575f80fd5b83359250602084013591506040840135613c4b81613c0c565b809150509250925092565b80151581146124c7575f80fd5b5f60208284031215613c73575f80fd5b81356120b781613c56565b5f60208284031215613c8e575f80fd5b81356120b781613c0c565b5f8060408385031215613caa575f80fd5b823591506020830135613cbc81613c56565b809150509250929050565b5f8060408385031215613cd8575f80fd5b8235613ce381613c0c565b946020939093013593505050565b5f60208284031215613d01575f80fd5b5035919050565b5f8060408385031215613d19575f80fd5b8235613d2481613c0c565b91506020830135613cbc81613c0c565b5f805f8060808587031215613d47575f80fd5b8435613d5281613c0c565b935060208501359250604085013591506060850135613d7081613c0c565b939692955090935050565b5f8060408385031215613d8c575f80fd5b50508035926020909101359150565b5f8083601f840112613dab575f80fd5b50813567ffffffffffffffff811115613dc2575f80fd5b6020830191508360208260051b8501011115613ddc575f80fd5b9250929050565b5f805f60408486031215613df5575f80fd5b833567ffffffffffffffff811115613e0b575f80fd5b613e1786828701613d9b565b9094509250506020840135613c4b81613c56565b5f8060408385031215613e3c575f80fd5b8235613e4781613c0c565b91506020830135613cbc81613c56565b5f805f8060808587031215613e6a575f80fd5b843593506020850135613e7c81613c0c565b93969395505050506040820135916060013590565b5f805f60608486031215613ea3575f80fd5b833592506020840135613eb581613c0c565b929592945050506040919091013590565b5f805f8060808587031215613ed9575f80fd5b8435613ee481613c0c565b966020860135965060408601359560600135945092505050565b5f805f60408486031215613f10575f80fd5b833567ffffffffffffffff811115613f26575f80fd5b613f3286828701613d9b565b909790965060209590950135949350505050565b5f805f60608486031215613f58575f80fd5b8335613f6381613c0c565b92506020840135613eb581613c0c565b6020808252600e908201526d1ddc9bdb99c81cdd185ad948125160921b604082015260600190565b634e487b7160e01b5f52603260045260245ffd5b6020808252601f908201527f576974686472617720616d6f756e7420657863656564732062616c616e636500604082015260600190565b60208082526018908201527f6d757374207472616e736665722066756c6c207374616b650000000000000000604082015260600190565b6020808252600b908201526a61646d696e3a207775743f60a81b604082015260600190565b634e487b7160e01b5f52601160045260245ffd5b5f6001820161406757614067614042565b5060010190565b5f6020828403121561407e575f80fd5b5051919050565b5f60208284031215614095575f80fd5b81516120b781613c0c565b6020808252601c908201527f696e636f7272656374207374616b65206f7220616c6c6f77616e636500000000604082015260600190565b6001600160a01b0394851681529290931660208301526040820152606081019190915260800190565b60208082526010908201526f1a5b9d985b1a59081cdd185ad948125160821b604082015260600190565b8181038181111561109557611095614042565b5f8161414b5761414b614042565b505f190190565b634e487b7160e01b5f52603160045260245ffd5b5f60208284031215614176575f80fd5b81516120b781613c56565b6020808252601190820152701d1bdad95b88189d5c9b8819985a5b1959607a1b604082015260600190565b8082018082111561109557611095614042565b808202811582820484141761109557611095614042565b5f826141f057634e487b7160e01b5f52601260045260245ffd5b50049056fea264697066735822122050b754a54797eb4842985061f9facc6739f1e9a9022d1e7c0e5d5778f665229c64736f6c63430008140033
Deployed ByteCode
0x608060405234801561000f575f80fd5b50600436106103bf575f3560e01c80638482b202116101f5578063bdcd9c8011610114578063ddd9d045116100a9578063f5ba1c8711610079578063f5ba1c87146108ab578063f851a440146108ca578063fb1db278146108dd578063fc0c546a146108f0575f80fd5b8063ddd9d0451461082a578063df10b4e61461083d578063e56d607d14610864578063e5ea69ff14610883575f80fd5b8063d0afa9dd116100e4578063d0afa9dd146107de578063d693f834146107f1578063d6fe340514610804578063d71a4bc214610817575f80fd5b8063bdcd9c8014610776578063be50baa914610789578063c721308f146107b7578063cc7c7dec146107cb575f80fd5b8063a56924bd1161018a578063b6b55f251161015a578063b6b55f251461072a578063b7cdbed31461073d578063b949103b14610750578063ba17978714610763575f80fd5b8063a56924bd146106ca578063aaa9603a146106dc578063b330fc53146106ef578063b3f5f65514610717575f80fd5b8063955afa6c116101c5578063955afa6c1461066a578063958e2d311461067d5780639f6a928314610690578063a06db7dc146106a3575f80fd5b80638482b20214610632578063859f267f146106455780638d9344851461065857806390321e1a14610661575f80fd5b80633b500bcb116102e157806361d027b311610276578063722713f711610246578063722713f71461060757806377c7b8fc1461060f57806378e6e38a14610617578063800b2f341461061f575f80fd5b806361d027b3146105a157806362671897146105cc57806364f5c072146105df5780636505e8e8146105f4575f80fd5b80634a994eef116102b15780634a994eef14610560578063527cc2f11461057357806352d8164714610586578063607214d314610599575f80fd5b80633b500bcb146105055780633f6ba41514610518578063441a3e701461053a57806347be53111461054d575f80fd5b8063221665e5116103575780632e8ba039116103275780632e8ba039146104d3578063341d609f146104e0578063343d927e146104f35780633a98ef39146104fc575f80fd5b8063221665e5146104a757806325c6ea1f146104af57806326465826146104b85780632cae2096146104cb575f80fd5b8063174628d111610392578063174628d11461041a578063182c1da11461044c5780631de8e5921461045957806321ce919d1461046c575f80fd5b8063062d5ed4146103c35780630b799acf146103d85780630cf57ace146103eb5780631718e211146103fe575b5f80fd5b6103d66103d1366004613c20565b610917565b005b6103d66103e6366004613c63565b610d42565b6103d66103f9366004613c7e565b610d8c565b610407600e5481565b6040519081526020015b60405180910390f35b61043c610428366004613c7e565b60076020525f908152604090205460ff1681565b6040519015158152602001610411565b60115461043c9060ff1681565b6103d6610467366004613c99565b610dd2565b61047f61047a366004613cc7565b610e15565b604080519586526020860194909452928401919091526060830152608082015260a001610411565b6103d6610e5f565b61040760135481565b6103d66104c6366004613cf1565b610f2a565b6103d6610f59565b600f5461043c9060ff1681565b6104076104ee366004613d08565b61106f565b61040760125481565b610407600a5481565b61043c610513366004613d34565b61109b565b61043c610526366004613c7e565b60066020525f908152604090205460ff1681565b6103d6610548366004613d7b565b6113a5565b6103d661055b366004613de3565b611887565b6103d661056e366004613e2b565b611a0c565b6103d6610581366004613cc7565b611aa1565b6103d6610594366004613c63565b611bbd565b610407611c05565b600c546105b4906001600160a01b031681565b6040516001600160a01b039091168152602001610411565b6103d66105da366004613e57565b611c7d565b60115461043c90640100000000900460ff1681565b6103d6610602366004613c99565b611e39565b610407611ef1565b610407611feb565b610407612021565b6103d661062d366004613cc7565b6120be565b6103d6610640366004613cc7565b612221565b6103d6610653366004613e91565b612271565b61040760095481565b61040760105481565b600d546105b4906001600160a01b031681565b6103d661068b366004613cf1565b61248d565b6103d661069e366004613c63565b6124ca565b6104077f0000000000000000000000000000000000000000000000000000000000ed4e0081565b60115461043c90610100900460ff1681565b6103d66106ea366004613c20565b612510565b6105b46106fd366004613c7e565b60056020525f90815260409020546001600160a01b031681565b6103d6610725366004613ec6565b61281a565b6103d6610738366004613cf1565b612b51565b6103d661074b366004613cc7565b612d52565b60115461043c9062010000900460ff1681565b6103d6610771366004613efe565b613117565b6103d6610784366004613cc7565b6132ec565b61079c610797366004613f46565b613547565b60408051938452602084019290925290820152606001610411565b60115461043c906301000000900460ff1681565b6103d66107d9366004613c63565b6135b1565b6103d66107ec366004613de3565b6135f5565b6103d66107ff366004613c7e565b61377a565b6103d6610812366004613c63565b6137c6565b610407610825366004613c7e565b613803565b610407610838366004613cc7565b613870565b6104077f0000000000000000000000000000000000000000000000000000000012cea60081565b610407610872366004613cf1565b60046020525f908152604090205481565b610407610891366004613c7e565b6001600160a01b03165f9081526002602052604090205490565b6104076108b9366004613c7e565b60036020525f908152604090205481565b600b546105b4906001600160a01b031681565b6001546105b4906001600160a01b031681565b6105b47f0000000000000000000000003e79130ab714e97ee73f86a56a2427bb1a51989681565b5f83116109615760405162461bcd60e51b81526020600482015260136024820152724e6f7468696e6720746f20776974686472617760681b60448201526064015b60405180910390fd5b335f90815260026020526040902054821061098e5760405162461bcd60e51b815260040161095890613f73565b335f9081526002602052604081208054849081106109ae576109ae613f9b565b905f5260205f2090600502019050805f01548411156109df5760405162461bcd60e51b815260040161095890613faf565b60115462010000900460ff16610a0f5780548414610a0f5760405162461bcd60e51b815260040161095890613fe6565b60018101546001600160a01b0383165f9081526007602052604090205460ff1615610a9757610a887f0000000000000000000000000000000000000000000000000000000000ed4e00610a82837f0000000000000000000000000000000000000000000000000000000012cea6006138b0565b906138b0565b421115610a925750425b610b8a565b6001600160a01b0383165f9081526006602052604090205460ff168015610ae65750610ae3817f0000000000000000000000000000000000000000000000000000000012cea6006138b0565b42115b8015610b3e5750610b3b7f0000000000000000000000000000000000000000000000000000000000ed4e00610a82837f0000000000000000000000000000000000000000000000000000000012cea6006138b0565b42105b610b8a5760405162461bcd60e51b815260206004820152601f60248201527f63616e206f6e6c7920686f7020696e746f207072652d73657420506f6f6c73006044820152606401610958565b5f610ba9600a54610ba388610b9d611ef1565b906138bb565b906138c6565b8354909150610bb890876138d1565b8355600a54610bc790876138d1565b600a55335f908152600360205260409020548015610bea57610bea3382896138dc565b600484810154604051636267189760e01b81529182018490523360248301526044820185905260648201526001600160a01b038616906362671897906084015f604051808303815f87803b158015610c40575f80fd5b505af1158015610c52573d5f803e3d5ffd5b505060015460405163cc58a6bb60e01b81526001600160a01b03898116600483015260248201879052909116925063cc58a6bb91506044015f604051808303815f87803b158015610ca1575f80fd5b505af1158015610cb3573d5f803e3d5ffd5b50508554159150610ce9905057610cd9600a54610ba3610cd1611ef1565b8754906138bb565b6002850155426003850155610cf3565b610cf33387613950565b60408051838152602081018990526001600160a01b0387169133917f2391574aca0f6cc92f9588562ee00a7c2d33f83d17d01d8fa177ba4423740f44910160405180910390a350505050505050565b600b546001600160a01b03163314610d6c5760405162461bcd60e51b81526004016109589061401d565b601180549115156401000000000264ff0000000019909216919091179055565b6001600160a01b0381165f908152600260205260408120805490915b81811015610dcc57610dba84826132ec565b80610dc481614056565b915050610da8565b50505050565b600b546001600160a01b03163314610dfc5760405162461bcd60e51b81526004016109589061401d565b600e91909155600f805460ff1916911515919091179055565b6002602052815f5260405f208181548110610e2e575f80fd5b5f91825260209091206005909102018054600182015460028301546003840154600490940154929550909350919085565b600f5460ff16610eb15760405162461bcd60e51b815260206004820152601960248201527f6175746f6d61746963207570646174652064697361626c6564000000000000006044820152606401610958565b600b5f9054906101000a90046001600160a01b03166001600160a01b03166351a41dec6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610f01573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610f25919061406e565b600e55565b600b546001600160a01b03163314610f545760405162461bcd60e51b81526004016109589061401d565b601055565b60015f9054906101000a90046001600160a01b03166001600160a01b0316638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610fa9573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610fcd9190614085565b600b80546001600160a01b0319166001600160a01b0392831617905560015460408051630824ea6b60e31b81529051919092169163412753589160048083019260209291908290030181865afa158015611029573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061104d9190614085565b600c80546001600160a01b0319166001600160a01b0392909216919091179055565b6001600160a01b038083165f908152600860209081526040808320938516835292905220545b92915050565b6011545f90610100900460ff166111005760405162461bcd60e51b8152602060048201526024808201527f7468697264207061727479207374616b65207472616e73666572732064697361604482015263189b195960e21b6064820152608401610958565b816001600160a01b0316856001600160a01b03160361115a5760405162461bcd60e51b815260206004820152601660248201527531b0b713ba103a3930b739b332b9103a379039b2b63360511b6044820152606401610958565b6001600160a01b0385165f9081526002602052604090205484106111905760405162461bcd60e51b815260040161095890613f73565b6001600160a01b0385165f9081526002602052604081208054869081106111b9576111b9613f9b565b905f5260205f20906005020190505f805f6111d5893389613547565b925092509250835f015483146111fd5760405162461bcd60e51b8152600401610958906140a0565b836001015482146112205760405162461bcd60e51b8152600401610958906140a0565b836004015481146112435760405162461bcd60e51b8152600401610958906140a0565b6001600160a01b0389165f90815260036020526040902054801561126c5761126c8a82866138dc565b506001600160a01b0386165f90815260036020526040902054801561129657611296878286613a38565b6112a08a8a613950565b6112aa8a89613aa3565b60025f886001600160a01b03166001600160a01b031681526020019081526020015f206040518060a001604052808681526020018581526020016112fc600a54610ba36112f5611ef1565b8a906138bb565b81524260208083019190915260409182018690528354600181810186555f958652948290208451600590920201908155908301519381019390935581810151600284015560608201516003840155608090910151600490920191909155517f017cb7d605aa3dcd304a9eb2a4df6075576ccc4a5dc2fe0b518c558e8f75338d9061138d908c908a908d908d906140d7565b60405180910390a15060019998505050505050505050565b335f9081526002602052604090205481106113d25760405162461bcd60e51b815260040161095890614100565b335f9081526002602052604081208054839081106113f2576113f2613f9b565b905f5260205f20906005020190505f83116114455760405162461bcd60e51b81526020600482015260136024820152724e6f7468696e6720746f20776974686472617760681b6044820152606401610958565b80548311156114665760405162461bcd60e51b815260040161095890613faf565b60048101546001820154611479916138b0565b42116114c75760405162461bcd60e51b815260206004820152601960248201527f6d757374207365727665206d616e6461746f72792074696d65000000000000006044820152606401610958565b60115462010000900460ff166114f757805483146114f75760405162461bcd60e51b815260040161095890613fe6565b5f61150a600a54610ba386610b9d611ef1565b825490915061151990856138d1565b8255600a5461152890856138d1565b600a5560018201545f9061155c907f0000000000000000000000000000000000000000000000000000000012cea6006138b0565b421015611625575f61159361158a6103e8610ba36109c4610b9d620151808a6001015442610ba3919061412a565b6124b8906138d1565b90506115a5612710610ba385846138bb565b600154600c54604051632a98027560e01b81526001600160a01b039182166004820152602481018490529294501690632a980275906044015f604051808303815f87803b1580156115f4575f80fd5b505af1158015611606573d5f803e3d5ffd5b5050505061161d82846138d190919063ffffffff16565b925050611779565b6116807f0000000000000000000000000000000000000000000000000000000000ed4e00610a827f0000000000000000000000000000000000000000000000000000000012cea60086600101546138b090919063ffffffff16565b421115611779575f6116dc6103e8610ba36109c4610b9d62015180610ba36116d57f0000000000000000000000000000000000000000000000000000000012cea6008c600101546138b090919063ffffffff16565b42906138d1565b90506124b88111156116ed57506124b85b6116fd612710610ba385846138bb565b600154600c54604051632a98027560e01b81526001600160a01b039182166004820152602481018490529294501690632a980275906044015f604051808303815f87803b15801561174c575f80fd5b505af115801561175e573d5f803e3d5ffd5b5050505061177582846138d190919063ffffffff16565b9250505b8254156117b3576117a3600a54610ba361179b85611795611ef1565b906138d1565b8654906138bb565b60028401554260038401556117bd565b6117bd3385613950565b335f9081526003602052604090205480156117dd576117dd3382886138dc565b604080518481526020810184905290810187905233907f02f25270a4d87bea75db541cdfe559334a275b4a233520ed6c0a2429667cca949060600160405180910390a2600154604051632a98027560e01b8152336004820152602481018590526001600160a01b0390911690632a980275906044015f604051808303815f87803b158015611869575f80fd5b505af115801561187b573d5f803e3d5ffd5b50505050505050505050565b600b546001600160a01b031633146118b15760405162461bcd60e51b81526004016109589061401d565b5f5b82811015610dcc5781151560075f8686858181106118d3576118d3613f9b565b90506020020160208101906118e89190613c7e565b6001600160a01b0316815260208101919091526040015f205460ff161515146119fa578160075f86868581811061192157611921613f9b565b90506020020160208101906119369190613c7e565b6001600160a01b0316815260208101919091526040015f20805460ff19169115159190911790558161197a5760138054905f6119718361413d565b9190505561198e565b60138054905f61198983614056565b919050555b507f808293acec1c44217eccd857d5abb88ff31456d23bf3a000d2f5aee5f92f4c198484838181106119c2576119c2613f9b565b90506020020160208101906119d79190613c7e565b604080516001600160a01b03909216825284151560208301520160405180910390a15b80611a0481614056565b9150506118b3565b6011545f90640100000000900460ff168015611a255750815b611a3157503380611a35565b5032805b506001600160a01b038181165f8181526005602090815260409182902080546001600160a01b031916948816948517905581519283528201929092527fbeebfeebc9d1af8057ca45af36b2171fea34cb5b251e394f0bc5fcabde119d7f910160405180910390a1505050565b335f9081526008602090815260408083206001600160a01b038616845290915281208054909190611ad39060016138d1565b9050808314611b3457818181548110611aee57611aee613f9b565b905f5260205f209060030201828481548110611b0c57611b0c613f9b565b5f91825260209091208254600390920201908155600180830154908201556002918201549101555b81805480611b4457611b44614152565b5f828152602080822060035f19949094019384020182815560018101839055600201919091559155604080513381526001600160a01b0387169281019290925281018490527f29fbfeb988fb99326ac41d70606334081c6be7e8518f6caa5b7b1bcbe7872a1e906060015b60405180910390a150505050565b600b546001600160a01b03163314611be75760405162461bcd60e51b81526004016109589061401d565b6011805491151563010000000263ff00000019909216919091179055565b60015460095460405163b6ec056160e01b81525f9283926001600160a01b039091169163b6ec056191611c3e9160040190815260200190565b602060405180830381865afa158015611c59573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611095919061406e565b335f9081526006602052604090205460ff1680611ca85750335f9081526007602052604090205460ff165b611cfe5760405162461bcd60e51b815260206004820152602160248201527f6f6e6c7920747275737465642073656e64657273286f7468657220706f6f6c736044820152602960f81b6064820152608401610958565b5f611d07611ef1565b90505f600a545f14611d3357611d2c82610ba3600a54896138bb90919063ffffffff16565b9050611d36565b50845b600a54611d4390826138b0565b600a556001600160a01b0385165f818152600260208181526040808420815160a0810183528781528084018b81528184018e81524260608401908152608084018d8152855460018181018855968b52888b20955160059091029095019485559251948401949094555195820195909555905160038083019190915593516004909101559383525220548015611ddd57611ddd868284613a38565b6040805188815260208101849052908101869052606081018590526001600160a01b038716907fb66a80ae2ebf4737952b9c2b57a9d34ef56806ab937f481b75197ae991d81afb9060800160405180910390a250505050505050565b6011545f90640100000000900460ff168015611e525750815b611e5e57503380611e62565b5032805b506001600160a01b0381165f90815260036020526040902054838114610dcc575f611e8c83613803565b90508015611ed2578415611ec757815f03611eb157611eac838683613a38565b611ed2565b611ebc8383836138dc565b611eac838683613a38565b611ed28383836138dc565b50506001600160a01b03165f9081526003602052604090209190915550565b60015460095460405163b6ec056160e01b81525f9283926001600160a01b039091169163b6ec056191611f2a9160040190815260200190565b602060405180830381865afa158015611f45573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611f69919061406e565b6001546040516301aba89b60e71b81523060048201529192505f916001600160a01b039091169063d5d44d8090602401602060405180830381865afa158015611fb4573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611fd8919061406e565b9050611fe482826138b0565b9250505090565b5f600a545f146120145761200f600a54610ba3670de0b6b3a7640000610b9d611ef1565b905090565b50670de0b6b3a764000090565b60015460095460405163b6ec056160e01b81525f9283926001600160a01b039091169163b6ec05619161205a9160040190815260200190565b602060405180830381865afa158015612075573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612099919061406e565b90505f6120b7612710610ba3601054856138bb90919063ffffffff16565b9392505050565b335f9081526002602052604081208054839081106120de576120de613f9b565b905f5260205f2090600502019050600e54612108600a54610ba3612100611ef1565b8554906138bb565b10156121565760405162461bcd60e51b815260206004820152601760248201527f62656c6f77206d696e696d756d207468726573686f6c640000000000000000006044820152606401610958565b335f8181526008602090815260408083206001600160a01b0388168085529083528184208054835160608082018652895482526001808b018054848a0190815260048d018054868b019081528488018955978c529a8a90209451600387029095019485555191840191909155935160029092019190915588549254965485519889529588019390935292860183905290850152608084019290925260a0830152907f13356b03fc409456fbfbc8b432cb402b7841b3114d1d159625eb0f3d4e3a46819060c001611baf565b600b546001600160a01b0316331461224b5760405162461bcd60e51b81526004016109589061401d565b600180546001600160a01b0319166001600160a01b039390931692909217909155600955565b612279613bb5565b600e548310156122c05760405162461bcd60e51b815260206004820152601260248201527110995b1bddc8135a5b9a5b5d5b4811da599d60721b6044820152606401610958565b5f6122c9611ef1565b600154604051632770a7eb60e21b8152336004820152602481018790529192506001600160a01b031690639dc29fac906044016020604051808303815f875af1158015612318573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061233c9190614166565b6123585760405162461bcd60e51b815260040161095890614181565b5f600a545f146123825761237b82610ba3600a54886138bb90919063ffffffff16565b9050612385565b50835b600a5461239290826138b0565b600a556001600160a01b0384165f818152600260208181526040808420815160a081018352878152428185018181528285018e815260608401928352608084018d8152855460018181018855968b52888b209551600590910290950194855591519484019490945592519582019590955593516003808601919091559051600490940193909355938352522054801561243057612430858284613a38565b6040805187815260208101849052428183015290516001600160a01b0387169133917f190f4e47df17911728b041870d3cd75008c166bb9d8cde694aaa68f73ad415829181900360600190a350505061248860015f55565b505050565b335f90815260026020526040902080546124c79190839081106124b2576124b2613f9b565b905f5260205f2090600502015f0154826113a5565b50565b600b546001600160a01b031633146124f45760405162461bcd60e51b81526004016109589061401d565b60118054911515620100000262ff000019909216919091179055565b60115460ff166125575760405162461bcd60e51b81526020600482015260126024820152711d1c985b9cd9995c9cc8191a5cd8589b195960721b6044820152606401610958565b336001600160a01b038216036125a85760405162461bcd60e51b815260206004820152601660248201527531b0b713ba103a3930b739b332b9103a379039b2b63360511b6044820152606401610958565b335f9081526002602052604090205482106125d55760405162461bcd60e51b815260040161095890613f73565b335f9081526002602052604081208054849081106125f5576125f5613f9b565b905f5260205f20906005020190505f61261c600a54610ba3612615611ef1565b88906138bb565b9050600e548110156126705760405162461bcd60e51b815260206004820152601760248201527f42656c6f77206d696e696d756d207468726573686f6c640000000000000000006044820152606401610958565b81548511156126915760405162461bcd60e51b815260040161095890613faf565b6011546301000000900460ff166126c257815485146126c25760405162461bcd60e51b815260040161095890613fe6565b81546126ce90866138d1565b8255335f9081526003602052604090205480156126f0576126f03382886138dc565b506001600160a01b0383165f90815260036020526040902054801561271a5761271a848288613a38565b6001600160a01b0384165f908152600260208181526040808420815160a0810183528b81526001808a015482860190815293820189815242606084019081526004808d01546080860190815286548086018855968b529790992093516005909502909301938455935190830155915193810193909355516003830155519101558254156127c2576127b2600a54610ba361179b611ef1565b60028401554260038401556127cc565b6127cc3386613950565b60408051878152602081018790526001600160a01b0386169133917ff3f8af030ee2cfc3c3c4ea260e6bcdd578eb1558b6eb3d79f7d0617ddbdc5b78910160405180910390a3505050505050565b612822613bb5565b5f83116128665760405162461bcd60e51b8152602060048201526012602482015271139bdd1a1a5b99c81d1bc819195c1bdcda5d60721b6044820152606401610958565b6001600160a01b0384165f9081526002602052604090205482106128bd5760405162461bcd60e51b815260206004820152600e60248201526d1ddc9bdb99c814dd185ad948125160921b6044820152606401610958565b600b546001600160a01b03163314612927576001600160a01b03841633146129275760405162461bcd60e51b815260206004820152601e60248201527f63616e206f6e6c7920657874656e6420796f7572206f776e207374616b6500006044820152606401610958565b5f612930611ef1565b600154604051632770a7eb60e21b8152336004820152602481018790529192506001600160a01b031690639dc29fac906044016020604051808303815f875af115801561297f573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906129a39190614166565b6129bf5760405162461bcd60e51b815260040161095890614181565b5f600a545f146129e9576129e282610ba3600a54886138bb90919063ffffffff16565b90506129ec565b50835b6001600160a01b0386165f908152600260205260408120805486908110612a1557612a15613f9b565b905f5260205f2090600502019050612a3982825f01546138b090919063ffffffff16565b8155600a54612a4890836138b0565b600a556004810154841180612a8a57506001810154612a87907f0000000000000000000000000000000000000000000000000000000012cea6006138b0565b42115b15612a9757600481018490555b612ab0600a54610ba3612aa8611ef1565b8454906138bb565b600282015542600380830182905560018301919091556001600160a01b0388165f90815260209190915260409020548015612af057612af0888285613a38565b60408051888152602081018890529081018490524260608201526001600160a01b0389169033907f7f65dfb94bab62e0708845150044cf7ad9c77fbfe6ba9e3c8c1f210e15aa953d9060800160405180910390a350505050610dcc60015f55565b612b59613bb5565b5f8111612b9d5760405162461bcd60e51b8152602060048201526012602482015271139bdd1a1a5b99c81d1bc819195c1bdcda5d60721b6044820152606401610958565b5f612ba6611ef1565b600154604051632770a7eb60e21b8152336004820152602481018590529192506001600160a01b031690639dc29fac906044016020604051808303815f875af1158015612bf5573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612c199190614166565b612c355760405162461bcd60e51b815260040161095890614181565b5f600a545f14612c5f57612c5882610ba3600a54866138bb90919063ffffffff16565b9050612c62565b50815b600a54612c6f90826138b0565b600a55335f818152600260208181526040808420815160a081018352878152428185018181528285018c81526060840192835260808401898152855460018181018855968b52888b2095516005909102909501948555915194840194909455925195820195909555935160038086019190915590516004909401939093559383525220548015612d0457612d04338284613a38565b60408051858152602081018490524281830152905133917f36af321ec8d3c75236829c5317affd40ddb308863a1236d2d277a4025cccee1e919081900360600190a25050506124c760015f55565b335f908152600260205260409020548110612d7f5760405162461bcd60e51b815260040161095890614100565b335f908152600260205260408120805483908110612d9f57612d9f613f9b565b905f5260205f2090600502019050612de47f0000000000000000000000000000000000000000000000000000000012cea60082600101546138b090919063ffffffff16565b4211612e295760405162461bcd60e51b81526020600482015260146024820152737374616b65206e6f7420796574206d617475726560601b6044820152606401610958565b5f612e3f600a54610ba3845f0154610b9d611ef1565b600b5460405163ded6e1c960e01b81526001600160a01b0387811660048301529293505f92612ec39261271092610ba3929091169063ded6e1c990602401602060405180830381865afa158015612e98573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612ebc919061406e565b85906138bb565b600b546040516370a0823160e01b81526001600160a01b03918216600482015291925082917f0000000000000000000000003e79130ab714e97ee73f86a56a2427bb1a519896909116906370a0823190602401602060405180830381865afa158015612f31573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612f55919061406e565b1015612fb85760405162461bcd60e51b815260206004820152602c60248201527f676f7665726e6f72207265736572766573206172652063757272656e746c792060448201526b1a5b9cdd59999a58da595b9d60a21b6064820152608401610958565b306001600160a01b0386160361303057600b5460405163e5f59bc160e01b81526001600160a01b039091169063e5f59bc190612ffe903390899086908a906004016140d7565b5f604051808303815f87803b158015613015575f80fd5b505af1158015613027573d5f803e3d5ffd5b50505050613110565b825461303d908587610917565b600b5460405163e5ea69ff60e01b815233600482018190526001600160a01b039283169263e5f59bc1928991869160019184169063e5ea69ff90602401602060405180830381865afa158015613095573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906130b9919061406e565b6130c3919061412a565b6040518563ffffffff1660e01b81526004016130e294939291906140d7565b5f604051808303815f87803b1580156130f9575f80fd5b505af115801561310b573d5f803e3d5ffd5b505050505b5050505050565b5f5b82811015610dcc573360055f86868581811061313757613137613f9b565b905060200201602081019061314c9190613c7e565b6001600160a01b03908116825260208201929092526040015f205416036132da575f60035f86868581811061318357613183613f9b565b90506020020160208101906131989190613c7e565b6001600160a01b03166001600160a01b031681526020019081526020015f205490508083146132d8575f6131ec8686858181106131d7576131d7613f9b565b90506020020160208101906108259190613c7e565b9050801561329257831561327d57815f036132375761323286868581811061321657613216613f9b565b905060200201602081019061322b9190613c7e565b8583613a38565b613292565b61326886868581811061324c5761324c613f9b565b90506020020160208101906132619190613c7e565b83836138dc565b61323286868581811061321657613216613f9b565b61329286868581811061324c5761324c613f9b565b8360035f8888878181106132a8576132a8613f9b565b90506020020160208101906132bd9190613c7e565b6001600160a01b0316815260208101919091526040015f2055505b505b806132e481614056565b915050613119565b600d546001600160a01b03166133445760405162461bcd60e51b815260206004820152601760248201527f6d6967726174696f6e206e6f74206163746976617465640000000000000000006044820152606401610958565b6001600160a01b0382165f90815260026020526040902054811061337a5760405162461bcd60e51b815260040161095890614100565b6001600160a01b0382165f9081526002602052604081208054839081106133a3576133a3613f9b565b905f5260205f20906005020190505f815f0154116133f05760405162461bcd60e51b815260206004820152600a6024820152696e6f2062616c616e636560b01b6044820152606401610958565b5f613406600a54610ba3845f0154610b9d611ef1565b8254600a5491925061341891906138d1565b600a555f8255600d546001830154600480850154604051636267189760e01b81529182018590526001600160a01b038881166024840152604483019390935260648201529116906362671897906084015f604051808303815f87803b15801561347f575f80fd5b505af1158015613491573d5f803e3d5ffd5b5050600154600d5460405163cc58a6bb60e01b81526001600160a01b039182166004820152602481018690529116925063cc58a6bb91506044015f604051808303815f87803b1580156134e2575f80fd5b505af11580156134f4573d5f803e3d5ffd5b505083546040805185815260208101929092526001600160a01b03881693503392507fe28c7cce19d5f22ab16a04ca1bb768f7533bf719280b5e40718b41c2641ac309910160405180910390a350505050565b6001600160a01b038084165f90815260086020908152604080832093861683529290529081208054829182918291908690811061358657613586613f9b565b5f91825260209091206003909102018054600182015460029092015490999198509650945050505050565b600b546001600160a01b031633146135db5760405162461bcd60e51b81526004016109589061401d565b601180549115156101000261ff0019909216919091179055565b600b546001600160a01b0316331461361f5760405162461bcd60e51b81526004016109589061401d565b5f5b82811015610dcc5781151560065f86868581811061364157613641613f9b565b90506020020160208101906136569190613c7e565b6001600160a01b0316815260208101919091526040015f205460ff16151514613768578160065f86868581811061368f5761368f613f9b565b90506020020160208101906136a49190613c7e565b6001600160a01b0316815260208101919091526040015f20805460ff1916911515919091179055816136e85760128054905f6136df8361413d565b919050556136fc565b60128054905f6136f783614056565b919050555b507f68e0e16e4195f1bb5436073ae329e02686b513fd39cd623585b36d74785b21c184848381811061373057613730613f9b565b90506020020160208101906137459190613c7e565b604080516001600160a01b03909216825284151560208301520160405180910390a15b8061377281614056565b915050613621565b600b546001600160a01b031633146137a45760405162461bcd60e51b81526004016109589061401d565b600d80546001600160a01b0319166001600160a01b0392909216919091179055565b600b546001600160a01b031633146137f05760405162461bcd60e51b81526004016109589061401d565b6011805460ff1916911515919091179055565b6001600160a01b0381165f908152600260205260408120805482805b828110156138675783818154811061383957613839613f9b565b905f5260205f2090600502015f01548261385391906141ac565b91508061385f81614056565b91505061381f565b50949350505050565b6001600160a01b0382165f90815260026020526040812080548390811061389957613899613f9b565b905f5260205f2090600502015f0154905092915050565b5f6120b782846141ac565b5f6120b782846141bf565b5f6120b782846141d6565b5f6120b7828461412a565b5f828152600460205260409020546138f490826138d1565b5f838152600460209081526040918290209290925580518481529182018390526001600160a01b038516917f65b0f2fb4228364e2ac61c432687ae942c732095fc217265116bec6cc441683491015b60405180910390a2505050565b6001600160a01b0382165f90815260026020526040812080549091906139789060019061412a565b90508083146139f15781818154811061399357613993613f9b565b905f5260205f2090600502018284815481106139b1576139b1613f9b565b905f5260205f2090600502015f820154815f0155600182015481600101556002820154816002015560038201548160030155600482015481600401559050505b81805480613a0157613a01614152565b5f8281526020812060055f199093019283020181815560018101829055600281018290556003810182905560040155905550505050565b5f82815260046020526040902054613a5090826138b0565b5f838152600460209081526040918290209290925580518481529182018390526001600160a01b038516917fdb8549181d0331885cbb0e0d1e36bdd89e38e53990069f6f07a4090a15f74e5d9101613943565b6001600160a01b0382165f90815260086020908152604080832033845290915281208054909190613ad59060016138d1565b9050808314613b3657818181548110613af057613af0613f9b565b905f5260205f209060030201828481548110613b0e57613b0e613f9b565b5f91825260209091208254600390920201908155600180830154908201556002918201549101555b81805480613b4657613b46614152565b5f828152602080822060035f19949094019384020182815560018101839055600201919091559155604080516001600160a01b0387168152339281019290925281018490527f29fbfeb988fb99326ac41d70606334081c6be7e8518f6caa5b7b1bcbe7872a1e90606001611baf565b60025f5403613c065760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610958565b60025f55565b6001600160a01b03811681146124c7575f80fd5b5f805f60608486031215613c32575f80fd5b83359250602084013591506040840135613c4b81613c0c565b809150509250925092565b80151581146124c7575f80fd5b5f60208284031215613c73575f80fd5b81356120b781613c56565b5f60208284031215613c8e575f80fd5b81356120b781613c0c565b5f8060408385031215613caa575f80fd5b823591506020830135613cbc81613c56565b809150509250929050565b5f8060408385031215613cd8575f80fd5b8235613ce381613c0c565b946020939093013593505050565b5f60208284031215613d01575f80fd5b5035919050565b5f8060408385031215613d19575f80fd5b8235613d2481613c0c565b91506020830135613cbc81613c0c565b5f805f8060808587031215613d47575f80fd5b8435613d5281613c0c565b935060208501359250604085013591506060850135613d7081613c0c565b939692955090935050565b5f8060408385031215613d8c575f80fd5b50508035926020909101359150565b5f8083601f840112613dab575f80fd5b50813567ffffffffffffffff811115613dc2575f80fd5b6020830191508360208260051b8501011115613ddc575f80fd5b9250929050565b5f805f60408486031215613df5575f80fd5b833567ffffffffffffffff811115613e0b575f80fd5b613e1786828701613d9b565b9094509250506020840135613c4b81613c56565b5f8060408385031215613e3c575f80fd5b8235613e4781613c0c565b91506020830135613cbc81613c56565b5f805f8060808587031215613e6a575f80fd5b843593506020850135613e7c81613c0c565b93969395505050506040820135916060013590565b5f805f60608486031215613ea3575f80fd5b833592506020840135613eb581613c0c565b929592945050506040919091013590565b5f805f8060808587031215613ed9575f80fd5b8435613ee481613c0c565b966020860135965060408601359560600135945092505050565b5f805f60408486031215613f10575f80fd5b833567ffffffffffffffff811115613f26575f80fd5b613f3286828701613d9b565b909790965060209590950135949350505050565b5f805f60608486031215613f58575f80fd5b8335613f6381613c0c565b92506020840135613eb581613c0c565b6020808252600e908201526d1ddc9bdb99c81cdd185ad948125160921b604082015260600190565b634e487b7160e01b5f52603260045260245ffd5b6020808252601f908201527f576974686472617720616d6f756e7420657863656564732062616c616e636500604082015260600190565b60208082526018908201527f6d757374207472616e736665722066756c6c207374616b650000000000000000604082015260600190565b6020808252600b908201526a61646d696e3a207775743f60a81b604082015260600190565b634e487b7160e01b5f52601160045260245ffd5b5f6001820161406757614067614042565b5060010190565b5f6020828403121561407e575f80fd5b5051919050565b5f60208284031215614095575f80fd5b81516120b781613c0c565b6020808252601c908201527f696e636f7272656374207374616b65206f7220616c6c6f77616e636500000000604082015260600190565b6001600160a01b0394851681529290931660208301526040820152606081019190915260800190565b60208082526010908201526f1a5b9d985b1a59081cdd185ad948125160821b604082015260600190565b8181038181111561109557611095614042565b5f8161414b5761414b614042565b505f190190565b634e487b7160e01b5f52603160045260245ffd5b5f60208284031215614176575f80fd5b81516120b781613c56565b6020808252601190820152701d1bdad95b88189d5c9b8819985a5b1959607a1b604082015260600190565b8082018082111561109557611095614042565b808202811582820484141761109557611095614042565b5f826141f057634e487b7160e01b5f52601260045260245ffd5b50049056fea264697066735822122050b754a54797eb4842985061f9facc6739f1e9a9022d1e7c0e5d5778f665229c64736f6c63430008140033