More Info
Private Name Tags
ContractCreator
Latest 25 from a total of 1,009 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Withdraw | 19172598 | 196 days ago | IN | 0 ETH | 0.00190779 | ||||
Withdraw | 19048043 | 214 days ago | IN | 0 ETH | 0.00076101 | ||||
Withdraw | 19046898 | 214 days ago | IN | 0 ETH | 0.00121726 | ||||
Claim Rewards | 19046896 | 214 days ago | IN | 0 ETH | 0.00204781 | ||||
Withdraw | 19039076 | 215 days ago | IN | 0 ETH | 0.00139045 | ||||
Claim Rewards | 19039074 | 215 days ago | IN | 0 ETH | 0.00157783 | ||||
Deposit | 19038658 | 215 days ago | IN | 0 ETH | 0.0027661 | ||||
Claim Rewards | 19038465 | 215 days ago | IN | 0 ETH | 0.00283391 | ||||
Claim Rewards | 19038320 | 215 days ago | IN | 0 ETH | 0.00405242 | ||||
Withdraw | 19038292 | 215 days ago | IN | 0 ETH | 0.00203802 | ||||
Claim Rewards | 19038290 | 215 days ago | IN | 0 ETH | 0.0022278 | ||||
Withdraw | 19038162 | 215 days ago | IN | 0 ETH | 0.00225404 | ||||
Claim Rewards | 19038108 | 215 days ago | IN | 0 ETH | 0.00493702 | ||||
Deposit | 19037897 | 215 days ago | IN | 0 ETH | 0.00427455 | ||||
Withdraw | 19037891 | 215 days ago | IN | 0 ETH | 0.00219779 | ||||
Claim Rewards | 19037858 | 215 days ago | IN | 0 ETH | 0.00438504 | ||||
Withdraw | 19037781 | 215 days ago | IN | 0 ETH | 0.00226547 | ||||
Withdraw | 19037776 | 215 days ago | IN | 0 ETH | 0.00190639 | ||||
Claim Rewards | 19037774 | 215 days ago | IN | 0 ETH | 0.00382312 | ||||
Withdraw | 19037538 | 215 days ago | IN | 0 ETH | 0.00201558 | ||||
Claim Rewards | 19037535 | 215 days ago | IN | 0 ETH | 0.00223851 | ||||
Deposit | 19037372 | 215 days ago | IN | 0 ETH | 0.00312388 | ||||
Withdraw | 19037356 | 215 days ago | IN | 0 ETH | 0.00321296 | ||||
Withdraw | 19037343 | 215 days ago | IN | 0 ETH | 0.00319787 | ||||
Withdraw | 19037032 | 215 days ago | IN | 0 ETH | 0.0014657 |
View more zero value Internal Transactions in Advanced View mode
Advanced mode:
Loading...
Loading
Contract Name:
KaspaMiningStaking
Compiler Version
v0.8.12+commit.f00d7308
Optimization Enabled:
Yes with 999 runs
Other Settings:
istanbul EvmVersion
Contract Source Code (Solidity Standard Json-Input format)
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; import {Ownable2Step} from "@openzeppelin/contracts/access/Ownable2Step.sol"; import {IERC20Metadata} from "@openzeppelin/contracts/token/ERC20/extensions/IERC20Metadata.sol"; import {HoldingsManager} from "./Libraries/HoldingsManager.sol"; // solhint-disable no-console import {console} from "hardhat/console.sol"; // solhint-disable func-name-mixedcase /** * @dev KaspasMining staking contract */ contract KaspaMiningStaking is Ownable2Step, HoldingsManager { IERC20Metadata public immutable rewardToken; uint8 public immutable rewardTokenDecs; event ClaimRewards(address indexed user, uint256 amountClaimed, uint256 userOffset); event DepositRewards(address indexed user, uint256 amountClaimed, uint256 totalScore, uint256 roundId); event CancelRewards(address indexed user, uint256 roundId); struct Round { bool canceled; uint16 id; uint32 timestamp; uint96 amount; uint96 totalScore; } struct UnpackedRound { bool canceled; uint256 id; uint256 timestamp; uint256 amount; uint256 totalScore; } uint16 public currentId; mapping(address => uint16) public userRoundOffset; mapping(uint16 => Round) private _rounds; constructor(address token, address _reward, address timerAddr) HoldingsManager(token, timerAddr) { rewardToken = IERC20Metadata(_reward); rewardTokenDecs = rewardToken.decimals(); } //#region Helpers function rewardTokenPack(uint256 rewardTokenAmount) public view returns(uint96) { return uint96(rewardTokenAmount * (10**MAX_PRECISION_DIGITS) / (10**rewardTokenDecs)); } function rewardTokenUnpack(uint96 rewardTokenAmount) public view returns(uint256) { return uint256(rewardTokenAmount) * (10**rewardTokenDecs) / (10**MAX_PRECISION_DIGITS); } //#endregion //#region ADMIN FUNCTIONS (HoldingsManager) /** * @notice Pause deposits (admin only) */ function pause() external onlyOwner { _pause(); } /** * @notice Unpause deposits (admin only) */ function unpause() external onlyOwner { _unpause(); } //#endregion //#region HoldingsManager /** * @notice Deposit the indicated amount of tokens */ function deposit(uint256 _amount) external { uint16 _userRoundOffset = userRoundOffset[msg.sender]; if (_userRoundOffset == 0) { userRoundOffset[msg.sender] = currentId + 1; } else { //We claim existing rewards first if(_userRoundOffset <= currentId) { (uint256 amountClaim, uint16[] memory claimIds, uint16 lastId) = getUserPendingClaim(msg.sender, 0, 400); require(claimIds[claimIds.length - 1] == 0, "You have to claim rewards first"); if (lastId > 0) { claimRewardsInternal(amountClaim, lastId); } } } _deposit(msg.sender, _amount); } /** * @notice Withdraw the indicated amount of tokens */ function withdraw(uint256 _amount) external { _withdraw(msg.sender, _amount); userRoundOffset[msg.sender] = currentId + 1; //offset update } //#endregion //#region RewardsManager /** * @notice Get round data */ function Rounds(uint16 index) public view returns(UnpackedRound memory) { Round memory _round = _rounds[index]; return UnpackedRound( _round.canceled, uint256(_round.id), uint256(_round.timestamp), rewardTokenUnpack(_round.amount), stakeTokenUnpack(_round.totalScore) ); } /** * @notice Get user pending claim amount and reward deposit ids, supports indexed searches */ function getUserPendingClaim( address user, uint16 index, uint16 nTake ) public view returns (uint256, uint16[] memory, uint16) { uint16[] memory pendingClaimIds = new uint16[](nTake); uint256 amountClaim = 0; uint16 nTaken = 0; uint16 lastId = 0; uint16 userOffset = userRoundOffset[user]; uint16 _currentId = currentId; Round memory rd; for (uint16 _index = (index > userOffset ? index : userOffset); _index <= _currentId; _index++) { rd = _rounds[_index]; if (rd.id == 0) break; if (!rd.canceled) { uint256 userScore = scoreOf(user, rd.timestamp); //CAREFUL!! totalScore is packaged, userScore is not and rd.amount is packaged //both have also different decimals precision... could be unpacked later or not //amountClaim += rd.amount * userScore / uint256(rd.totalScore); amountClaim += rewardTokenUnpack(rd.amount) * userScore / stakeTokenUnpack(rd.totalScore); pendingClaimIds[nTaken] = rd.id; lastId = rd.id; nTaken++; } if (nTaken >= nTake) break; } if(amountClaim > 0) { amountClaim = amountClaim * 995 / 1000; //0.5% //amountClaim = rewardTokenUnpack(uint96(amountClaim)) / stakeTokenUnpack(1); } return (amountClaim, pendingClaimIds, lastId); } /** * @notice Claims user rewards, an amount of rounds has to be set for scalability */ function claimRewards(uint16 nTake) public { (uint256 amountClaim, , uint16 lastId) = getUserPendingClaim(msg.sender, 0, nTake); require(lastId > 0, "There is nothing to claim"); claimRewardsInternal(amountClaim, lastId); } function claimRewardsInternal(uint256 amountClaim, uint16 lastId) internal { require(lastId > 0, "There is nothing to claim"); userRoundOffset[msg.sender] = lastId + 1; //offset update if (amountClaim > 0) { uint256 contractRewardBal = rewardToken.balanceOf(address(this)); console.log("Token to claim %s, contract balance %s", amountClaim, contractRewardBal); require(contractRewardBal > amountClaim, "There is not enough tokens, wait for refill"); bool result = rewardToken.transfer(msg.sender, amountClaim); require(result, "Error transferring tokens"); } emit ClaimRewards(msg.sender, amountClaim, lastId + 1); } //#endregion //#region ADMIN FUNCTIONS (Rewards manager) /** * @notice Administrator can use this to inject rewards in the contract * @param totalScore is the sum of each holder score */ function depositRewards(uint256 tokensAmount, uint256 totalScore) external onlyOwner { require(rewardToken.allowance(msg.sender, address(this)) >= tokensAmount, "Allowance not enough"); currentId++; _rounds[currentId].id = uint16(currentId); _rounds[currentId].amount = rewardTokenPack(tokensAmount); _rounds[currentId].totalScore = stakeTokenPack(totalScore); _rounds[currentId].timestamp = uint32(getCurrentTime()); bool result = rewardToken.transferFrom(msg.sender, address(this), tokensAmount); require(result, "Error transferring tokens"); emit DepositRewards(msg.sender, tokensAmount, totalScore, currentId); } /** * @notice Administrator can use this to cancel a reward deposit round and get the money back */ function cancelRound(uint16 RoundId) external onlyOwner { //CHECK THIS...TODO require(!_rounds[RoundId].canceled, "Reward deposit already canceled"); _rounds[RoundId].canceled = true; uint256 contractBalance = rewardToken.balanceOf(address(this)); bool result = rewardToken.transfer(msg.sender, min(rewardTokenUnpack(_rounds[currentId].amount), contractBalance)); require(result, "Error transferring tokens"); emit CancelRewards(msg.sender, RoundId); } //#endregion //#region ADMIN FUCNTIONS (Others) function withdrawRewards() external onlyOwner { uint256 contractBalance = rewardToken.balanceOf(address(this)); bool result = rewardToken.transfer(msg.sender, contractBalance); require(result, "Error transferring tokens"); } //#endregion }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.9.0) (access/Ownable.sol) pragma solidity ^0.8.0; import "../utils/Context.sol"; /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * By default, the owner account will be the one that deploys the contract. This * can later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ abstract contract Ownable is Context { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ constructor() { _transferOwnership(_msgSender()); } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { _checkOwner(); _; } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if the sender is not the owner. */ function _checkOwner() internal view virtual { require(owner() == _msgSender(), "Ownable: caller is not the owner"); } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions. 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 { require(newOwner != address(0), "Ownable: new owner is the zero address"); _transferOwnership(newOwner); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Internal function without access restriction. */ function _transferOwnership(address newOwner) internal virtual { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.9.0) (access/Ownable2Step.sol) pragma solidity ^0.8.0; import "./Ownable.sol"; /** * @dev Contract module which provides access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * By default, the owner account will be the one that deploys the contract. This * can later be changed with {transferOwnership} and {acceptOwnership}. * * This module is used through inheritance. It will make available all functions * from parent (Ownable). */ abstract contract Ownable2Step is Ownable { address private _pendingOwner; event OwnershipTransferStarted(address indexed previousOwner, address indexed newOwner); /** * @dev Returns the address of the pending owner. */ function pendingOwner() public view virtual returns (address) { return _pendingOwner; } /** * @dev Starts the ownership transfer of the contract to a new account. Replaces the pending transfer if there is one. * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual override onlyOwner { _pendingOwner = newOwner; emit OwnershipTransferStarted(owner(), newOwner); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`) and deletes any pending owner. * Internal function without access restriction. */ function _transferOwnership(address newOwner) internal virtual override { delete _pendingOwner; super._transferOwnership(newOwner); } /** * @dev The new owner accepts the ownership transfer. */ function acceptOwnership() public virtual { address sender = _msgSender(); require(pendingOwner() == sender, "Ownable2Step: caller is not the new owner"); _transferOwnership(sender); } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.7.0) (security/Pausable.sol) pragma solidity ^0.8.0; import "../utils/Context.sol"; /** * @dev Contract module which allows children to implement an emergency stop * mechanism that can be triggered by an authorized account. * * This module is used through inheritance. It will make available the * modifiers `whenNotPaused` and `whenPaused`, which can be applied to * the functions of your contract. Note that they will not be pausable by * simply including this module, only once the modifiers are put in place. */ abstract contract Pausable is Context { /** * @dev Emitted when the pause is triggered by `account`. */ event Paused(address account); /** * @dev Emitted when the pause is lifted by `account`. */ event Unpaused(address account); bool private _paused; /** * @dev Initializes the contract in unpaused state. */ constructor() { _paused = false; } /** * @dev Modifier to make a function callable only when the contract is not paused. * * Requirements: * * - The contract must not be paused. */ modifier whenNotPaused() { _requireNotPaused(); _; } /** * @dev Modifier to make a function callable only when the contract is paused. * * Requirements: * * - The contract must be paused. */ modifier whenPaused() { _requirePaused(); _; } /** * @dev Returns true if the contract is paused, and false otherwise. */ function paused() public view virtual returns (bool) { return _paused; } /** * @dev Throws if the contract is paused. */ function _requireNotPaused() internal view virtual { require(!paused(), "Pausable: paused"); } /** * @dev Throws if the contract is not paused. */ function _requirePaused() internal view virtual { require(paused(), "Pausable: not paused"); } /** * @dev Triggers stopped state. * * Requirements: * * - The contract must not be paused. */ function _pause() internal virtual whenNotPaused { _paused = true; emit Paused(_msgSender()); } /** * @dev Returns to normal state. * * Requirements: * * - The contract must be paused. */ function _unpause() internal virtual whenPaused { _paused = false; emit Unpaused(_msgSender()); } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (token/ERC20/extensions/IERC20Metadata.sol) pragma solidity ^0.8.0; import "../IERC20.sol"; /** * @dev Interface for the optional metadata functions from the ERC20 standard. * * _Available since v4.1._ */ interface IERC20Metadata is IERC20 { /** * @dev Returns the name of the token. */ function name() external view returns (string memory); /** * @dev Returns the symbol of the token. */ function symbol() external view returns (string memory); /** * @dev Returns the decimals places of the token. */ function decimals() external view returns (uint8); }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.9.0) (token/ERC20/IERC20.sol) pragma solidity ^0.8.0; /** * @dev Interface of the ERC20 standard as defined in the EIP. */ interface IERC20 { /** * @dev Emitted when `value` tokens are moved from one account (`from`) to * another (`to`). * * Note that `value` may be zero. */ event Transfer(address indexed from, address indexed to, uint256 value); /** * @dev Emitted when the allowance of a `spender` for an `owner` is set by * a call to {approve}. `value` is the new allowance. */ event Approval(address indexed owner, address indexed spender, uint256 value); /** * @dev Returns the amount of tokens in existence. */ function totalSupply() external view returns (uint256); /** * @dev Returns the amount of tokens owned by `account`. */ function balanceOf(address account) external view returns (uint256); /** * @dev Moves `amount` tokens from the caller's account to `to`. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transfer(address to, uint256 amount) external returns (bool); /** * @dev Returns the remaining number of tokens that `spender` will be * allowed to spend on behalf of `owner` through {transferFrom}. This is * zero by default. * * This value changes when {approve} or {transferFrom} are called. */ function allowance(address owner, address spender) external view returns (uint256); /** * @dev Sets `amount` as the allowance of `spender` over the caller's tokens. * * Returns a boolean value indicating whether the operation succeeded. * * IMPORTANT: Beware that changing an allowance with this method brings the risk * that someone may use both the old and the new allowance by unfortunate * transaction ordering. One possible solution to mitigate this race * condition is to first reduce the spender's allowance to 0 and set the * desired value afterwards: * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 * * Emits an {Approval} event. */ function approve(address spender, uint256 amount) external returns (bool); /** * @dev Moves `amount` tokens from `from` to `to` using the * allowance mechanism. `amount` is then deducted from the caller's * allowance. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transferFrom(address from, address to, uint256 amount) external returns (bool); }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (utils/Context.sol) pragma solidity ^0.8.0; /** * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } }
// SPDX-License-Identifier: MIT // 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; } } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.9; abstract contract Auth { address internal owner; mapping(address => bool) internal authorizations; constructor(address _owner) { owner = _owner; authorizations[_owner] = true; } /** * Function modifier to require caller to be contract owner */ modifier onlyOwner() { require(isOwner(msg.sender), "!OWNER"); _; } /** * Function modifier to require caller to be authorized */ modifier authorized() { require(isAuthorized(msg.sender), "!AUTHORIZED"); _; } /** * Authorize address. Owner only */ function authorize(address adr) public onlyOwner { authorizations[adr] = true; } /** * Remove address' authorization. Owner only */ function unauthorize(address adr) public onlyOwner { authorizations[adr] = false; } /** * Check if address is owner */ function isOwner(address account) public view returns (bool) { return account == owner; } /** * Return address' authorization status */ function isAuthorized(address adr) public view returns (bool) { return authorizations[adr]; } /** * Transfer ownership to new address. Caller must be owner. Leaves old owner authorized */ function transferOwnership(address payable adr) public onlyOwner { owner = adr; authorizations[adr] = true; emit OwnershipTransferred(adr); } event OwnershipTransferred(address owner); }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; import {Pausable} from "@openzeppelin/contracts/security/Pausable.sol"; import {IERC20Metadata} from "@openzeppelin/contracts/token/ERC20/extensions/IERC20Metadata.sol"; import {Testable} from "./Testable.sol"; // solhint-disable no-console //import {console} from "hardhat/console.sol"; // solhint-disable avoid-low-level-calls // solhint-disable func-name-mixedcase // solhint-disable-next-line max-states-count /** * @notice Manage users holdings deposits and withdrawals * @dev Each hour user deposit is added to points, multiplied by 1 + multiplier bonus (0.5 per month, max 2) * each time one user withdraws any amount all points and multiplier bonus are lost */ contract HoldingsManager is Pausable, Testable { struct UserData { uint32 lastUpdatedAt; uint32 multiplierStart; uint96 balance; uint96 points; } address[] internal _investors; mapping(address => UserData) internal userData; uint32 public constant HOLDING_END_TIME = type(uint32).max; IERC20Metadata public immutable TOKEN; uint8 public immutable stakeTokenDecs; uint8 public constant MAX_PRECISION_DIGITS = 9; uint256 private constant _HOUR = 1 hours; //3_600; uint256 private constant _DAY = 1 days; //_HOUR * 24; uint256 private constant _MONTH = 30 days; //_DAY * 30; uint256 private constant _BASIS_POINTS = 10_000; uint256 private constant _MULTIPLIER_PER_MONTH = 5_000; // bips uint256 private constant _EARLY_HOLDING_BONUS_PER_DAY = 5_000; // bips / hour uint256 private constant _BASE_MULTIPLIER = 10_000; // bips //bytes4 public decimalsCall = bytes4(keccak256(bytes("decimals()"))); //0xce974bc2 event Deposit(address indexed user, uint256 amount); event Withdraw(address indexed user, uint256 amount); error InsufficientBalance(); constructor(address token, address timerAddr) Testable(timerAddr) { TOKEN = IERC20Metadata(token); stakeTokenDecs = TOKEN.decimals(); // (bool success, bytes memory _stakeTokenDecs) = token.call(abi.encode(decimalsCall)); // stakeTokenDecs = abi.decode(_stakeTokenDecs, (uint8)); // require(success, "Invalid tokens"); } //#region Helpers function stakeTokenPack(uint256 stakeTokenAmount) public view returns(uint96) { return uint96(stakeTokenAmount * (10**MAX_PRECISION_DIGITS) / (10**stakeTokenDecs)); } function stakeTokenUnpack(uint96 stakeTokenAmount) public view returns(uint256) { return uint256(stakeTokenAmount) * (10**stakeTokenDecs) / (10**MAX_PRECISION_DIGITS); } //#region VIEWS /** * @notice Gets the total number of investors */ function nInvestors() public view returns (uint256) { return _investors.length; } /** * @notice Gets the balance of the user deposits * @param user User address * @return User deposit balance */ function balanceOf(address user) external view returns (uint256) { return stakeTokenUnpack(userData[user].balance); } function lastUpdatedAt(address user) external view returns(uint256) { return userData[user].lastUpdatedAt; } function multiplierStart(address user) external view returns(uint256) { return userData[user].multiplierStart; } /** * @notice Gets the current amount of points earned by the user (including pending points) * @param user User address * @return User points */ function pointsOf(address user, uint32 timestamp) public view returns (uint256) { return stakeTokenUnpack(userData[user].points + _computePendingPoints(user, timestamp)); } /** * @notice Gets the current points multiplier of the user * @param user User address * @return User multiplier */ function multiplierOf(address user, uint256 timestamp) public view returns (uint256) { UserData memory ud = userData[user]; uint256 _multiplierStart = uint256(ud.multiplierStart); if (_multiplierStart == 0 || ud.balance == 0) { return _BASE_MULTIPLIER; } return _BASE_MULTIPLIER + (_MULTIPLIER_PER_MONTH * (min(timestamp, uint256(HOLDING_END_TIME)) - _multiplierStart)) / _MONTH; } /** * @notice Gets the current score of the user at a certain timestamp * @param user User address * @param timestamp time stamp you went to use to calculate points and multiplier * @return User score */ function scoreOf(address user, uint32 timestamp) public view returns (uint256) { return (pointsOf(user, timestamp) * multiplierOf(user, timestamp)) / _BASIS_POINTS; } /** * @notice Checks acummulated scores using hot data * @return user acummulated scores */ function getHotAcumScores(uint256 index, uint256 take) public view returns (uint256) { uint256 hotAcumScores = 0; uint32 blockTimestamp = uint32(getCurrentTime()); for (uint256 _index = index; _index < _investors.length; _index++) { if (take != 0 && (_index - index) >= take) break; hotAcumScores += scoreOf(_investors[_index], blockTimestamp); } return hotAcumScores; } //#endregion //#region DEPOSITS AND WITHDRAWS /** * @notice Deposit TOKEN * @param amount Amount of TOKEN to deposit */ function _deposit(address user, uint256 amount) internal { require(amount > 0, "You forgot to indicate the amount you want to deposit"); __deposit(user, amount); bool result = TOKEN.transferFrom(user, address(this), amount); require(result, "Error transferring tokens"); } /** * @notice Withdraw TOKEN and enforce multiplier penalty * @param amount Amount to withdraw */ function _withdraw(address user, uint256 amount) internal { uint96 packedAmount = stakeTokenPack(amount); uint32 currentTime = uint32(getCurrentTime()); _checkpoint(user, currentTime); UserData storage ud = userData[user]; if (ud.balance < packedAmount) { revert InsufficientBalance(); } //RESET ud.multiplierStart = currentTime; //userData[user].lastUpdatedAt = currentTime; //already updated by checkpoint ud.points = 0; unchecked { ud.balance -= packedAmount; } TOKEN.transfer(user, amount); emit Withdraw(user, amount); } /** * @notice Deposit TOKEN from user * @param user User address * @param amount Amount of TOKEN to deposit */ function __deposit(address user, uint256 amount) internal whenNotPaused { uint32 currentTime = uint32(getCurrentTime()); UserData storage ud = userData[user]; if (ud.multiplierStart == 0) { ud.multiplierStart = currentTime; } if (ud.lastUpdatedAt == 0) { //userData[user].lastUpdatedAt = uint32(getCurrentTime()); //already updated by checkpoint _investors.push(user); } _checkpoint(user, currentTime); ud.balance += stakeTokenPack(amount); emit Deposit(user, amount); } /** * @notice Record earned points and update the last checkpoint time; must be called on every deposit and withdrawal * @param user User address */ function _checkpoint(address user, uint32 blockTimestamp) internal { UserData storage ud = userData[user]; ud.points += _computePendingPoints(user, blockTimestamp); ud.lastUpdatedAt = blockTimestamp; } /** * @notice Compute the pending points that have been earned but not recorded since the last checkpoint * @param user User address * @return points Amount of earned unrecorded points */ function _computePendingPoints(address user, uint32 timestamp) internal view returns (uint96) { UserData memory ud = userData[user]; uint32 _HOLDING_END_TIME = HOLDING_END_TIME; uint256 start = min(ud.lastUpdatedAt, _HOLDING_END_TIME); uint256 end = min(timestamp, _HOLDING_END_TIME); return uint96((uint256(ud.balance) * (_BASIS_POINTS * (end - start))) / (_HOUR * _BASIS_POINTS)); } //#endregion //#region HELPER FUNCTIONS function min(uint256 a, uint256 b) internal pure returns (uint256) { return a < b ? a : b; } //#endregion }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.9; import {Timer} from "./../Timer.sol"; /** * @title Base class that provides time overrides, but only if being run in test mode. */ abstract contract Testable { // If the contract is being run on the test network, then `timerAddress` will be the 0x0 address. // Note: this variable should be set on construction and never modified. address public timerAddress; /** * @notice Constructs the Testable contract. Called by child contracts. * @param _timerAddress Contract that stores the current time in a testing environment. * Must be set to 0x0 for production environments that use live time. */ constructor(address _timerAddress) { timerAddress = _timerAddress; } /** * @notice Reverts if not running in test mode. */ modifier onlyIfTest() { //solhint-disable-next-line reason-string require(timerAddress != address(0x0)); _; } /** * @notice Sets the current time. * @dev Will revert if not running in test mode. * @param time timestamp to set current Testable time to. */ // function setCurrentTime(uint256 time) external onlyIfTest { // Timer(timerAddress).setCurrentTime(time); // } /** * @notice Gets the current time. Will return the last time set in `setCurrentTime` if running in test mode. * Otherwise, it will return the block timestamp. * @return uint for the current Testable timestamp. */ function getCurrentTime() public view returns (uint256) { if (timerAddress != address(0x0)) { return Timer(timerAddress).getCurrentTime(); } else { return block.timestamp; } } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.9; import {Auth} from "./BasicLibraries/Auth.sol"; import {SafeMath} from "@openzeppelin/contracts/utils/math/SafeMath.sol"; /** * @title Universal store of current contract time for testing environments. */ contract Timer is Auth { using SafeMath for uint256; uint256 private currentTime; bool public enabled = false; // solhint-disable-next-line no-empty-blocks constructor() Auth(msg.sender) {} /** * @notice Sets the current time. * @dev Will revert if not running in test mode. * @param time timestamp to set `currentTime` to. */ function setCurrentTime(uint256 time) external authorized { require(time >= currentTime, "Return to the future Doc!"); currentTime = time; } function enable(bool _enabled) external authorized { require(enabled == false, "Can not be disabled"); enabled = _enabled; } function increaseDays(uint256 _days) external authorized { currentTime = getCurrentTime().add(uint256(1 days).mul(_days)); } function increaseMinutes(uint256 _minutes) external authorized { currentTime = getCurrentTime().add(uint256(1 minutes).mul(_minutes)); } function increaseSeconds(uint256 _seconds) external authorized { currentTime = getCurrentTime().add(uint256(1 seconds).mul(_seconds)); } /** * @notice Gets the current time. Will return the last time set in `setCurrentTime` if running in test mode. * Otherwise, it will return the block timestamp. * @return uint256 for the current Testable timestamp. */ function getCurrentTime() public view returns (uint256) { if (enabled) { return currentTime; } else { return block.timestamp; } } }
// SPDX-License-Identifier: MIT pragma solidity >= 0.4.22 <0.9.0; library console { address constant CONSOLE_ADDRESS = 0x000000000000000000636F6e736F6c652e6c6f67; function _sendLogPayload(bytes memory payload) private view { address consoleAddress = CONSOLE_ADDRESS; /// @solidity memory-safe-assembly assembly { pop(staticcall(gas(), consoleAddress, add(payload, 32), mload(payload), 0, 0)) } } function log() internal view { _sendLogPayload(abi.encodeWithSignature("log()")); } function logInt(int256 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(int256)", p0)); } function logUint(uint256 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256)", p0)); } function logString(string memory p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(string)", p0)); } function logBool(bool p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool)", p0)); } function logAddress(address p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(address)", p0)); } function logBytes(bytes memory p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes)", p0)); } function logBytes1(bytes1 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes1)", p0)); } function logBytes2(bytes2 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes2)", p0)); } function logBytes3(bytes3 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes3)", p0)); } function logBytes4(bytes4 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes4)", p0)); } function logBytes5(bytes5 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes5)", p0)); } function logBytes6(bytes6 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes6)", p0)); } function logBytes7(bytes7 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes7)", p0)); } function logBytes8(bytes8 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes8)", p0)); } function logBytes9(bytes9 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes9)", p0)); } function logBytes10(bytes10 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes10)", p0)); } function logBytes11(bytes11 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes11)", p0)); } function logBytes12(bytes12 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes12)", p0)); } function logBytes13(bytes13 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes13)", p0)); } function logBytes14(bytes14 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes14)", p0)); } function logBytes15(bytes15 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes15)", p0)); } function logBytes16(bytes16 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes16)", p0)); } function logBytes17(bytes17 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes17)", p0)); } function logBytes18(bytes18 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes18)", p0)); } function logBytes19(bytes19 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes19)", p0)); } function logBytes20(bytes20 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes20)", p0)); } function logBytes21(bytes21 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes21)", p0)); } function logBytes22(bytes22 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes22)", p0)); } function logBytes23(bytes23 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes23)", p0)); } function logBytes24(bytes24 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes24)", p0)); } function logBytes25(bytes25 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes25)", p0)); } function logBytes26(bytes26 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes26)", p0)); } function logBytes27(bytes27 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes27)", p0)); } function logBytes28(bytes28 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes28)", p0)); } function logBytes29(bytes29 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes29)", p0)); } function logBytes30(bytes30 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes30)", p0)); } function logBytes31(bytes31 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes31)", p0)); } function logBytes32(bytes32 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes32)", p0)); } function log(uint256 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256)", p0)); } function log(string memory p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(string)", p0)); } function log(bool p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool)", p0)); } function log(address p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(address)", p0)); } function log(uint256 p0, uint256 p1) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256)", p0, p1)); } function log(uint256 p0, string memory p1) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,string)", p0, p1)); } function log(uint256 p0, bool p1) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,bool)", p0, p1)); } function log(uint256 p0, address p1) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,address)", p0, p1)); } function log(string memory p0, uint256 p1) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,uint256)", p0, p1)); } function log(string memory p0, string memory p1) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,string)", p0, p1)); } function log(string memory p0, bool p1) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,bool)", p0, p1)); } function log(string memory p0, address p1) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,address)", p0, p1)); } function log(bool p0, uint256 p1) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,uint256)", p0, p1)); } function log(bool p0, string memory p1) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,string)", p0, p1)); } function log(bool p0, bool p1) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,bool)", p0, p1)); } function log(bool p0, address p1) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,address)", p0, p1)); } function log(address p0, uint256 p1) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,uint256)", p0, p1)); } function log(address p0, string memory p1) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,string)", p0, p1)); } function log(address p0, bool p1) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,bool)", p0, p1)); } function log(address p0, address p1) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,address)", p0, p1)); } function log(uint256 p0, uint256 p1, uint256 p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,uint256)", p0, p1, p2)); } function log(uint256 p0, uint256 p1, string memory p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,string)", p0, p1, p2)); } function log(uint256 p0, uint256 p1, bool p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,bool)", p0, p1, p2)); } function log(uint256 p0, uint256 p1, address p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,address)", p0, p1, p2)); } function log(uint256 p0, string memory p1, uint256 p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,string,uint256)", p0, p1, p2)); } function log(uint256 p0, string memory p1, string memory p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,string,string)", p0, p1, p2)); } function log(uint256 p0, string memory p1, bool p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,string,bool)", p0, p1, p2)); } function log(uint256 p0, string memory p1, address p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,string,address)", p0, p1, p2)); } function log(uint256 p0, bool p1, uint256 p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,uint256)", p0, p1, p2)); } function log(uint256 p0, bool p1, string memory p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,string)", p0, p1, p2)); } function log(uint256 p0, bool p1, bool p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,bool)", p0, p1, p2)); } function log(uint256 p0, bool p1, address p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,address)", p0, p1, p2)); } function log(uint256 p0, address p1, uint256 p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,address,uint256)", p0, p1, p2)); } function log(uint256 p0, address p1, string memory p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,address,string)", p0, p1, p2)); } function log(uint256 p0, address p1, bool p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,address,bool)", p0, p1, p2)); } function log(uint256 p0, address p1, address p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,address,address)", p0, p1, p2)); } function log(string memory p0, uint256 p1, uint256 p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,uint256,uint256)", p0, p1, p2)); } function log(string memory p0, uint256 p1, string memory p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,uint256,string)", p0, p1, p2)); } function log(string memory p0, uint256 p1, bool p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,uint256,bool)", p0, p1, p2)); } function log(string memory p0, uint256 p1, address p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,uint256,address)", p0, p1, p2)); } function log(string memory p0, string memory p1, uint256 p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,string,uint256)", p0, p1, p2)); } function log(string memory p0, string memory p1, string memory p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,string,string)", p0, p1, p2)); } function log(string memory p0, string memory p1, bool p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,string,bool)", p0, p1, p2)); } function log(string memory p0, string memory p1, address p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,string,address)", p0, p1, p2)); } function log(string memory p0, bool p1, uint256 p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,bool,uint256)", p0, p1, p2)); } function log(string memory p0, bool p1, string memory p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,bool,string)", p0, p1, p2)); } function log(string memory p0, bool p1, bool p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,bool,bool)", p0, p1, p2)); } function log(string memory p0, bool p1, address p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,bool,address)", p0, p1, p2)); } function log(string memory p0, address p1, uint256 p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,address,uint256)", p0, p1, p2)); } function log(string memory p0, address p1, string memory p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,address,string)", p0, p1, p2)); } function log(string memory p0, address p1, bool p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,address,bool)", p0, p1, p2)); } function log(string memory p0, address p1, address p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,address,address)", p0, p1, p2)); } function log(bool p0, uint256 p1, uint256 p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,uint256)", p0, p1, p2)); } function log(bool p0, uint256 p1, string memory p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,string)", p0, p1, p2)); } function log(bool p0, uint256 p1, bool p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,bool)", p0, p1, p2)); } function log(bool p0, uint256 p1, address p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,address)", p0, p1, p2)); } function log(bool p0, string memory p1, uint256 p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,string,uint256)", p0, p1, p2)); } function log(bool p0, string memory p1, string memory p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,string,string)", p0, p1, p2)); } function log(bool p0, string memory p1, bool p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,string,bool)", p0, p1, p2)); } function log(bool p0, string memory p1, address p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,string,address)", p0, p1, p2)); } function log(bool p0, bool p1, uint256 p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,uint256)", p0, p1, p2)); } function log(bool p0, bool p1, string memory p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,string)", p0, p1, p2)); } function log(bool p0, bool p1, bool p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,bool)", p0, p1, p2)); } function log(bool p0, bool p1, address p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,address)", p0, p1, p2)); } function log(bool p0, address p1, uint256 p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,address,uint256)", p0, p1, p2)); } function log(bool p0, address p1, string memory p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,address,string)", p0, p1, p2)); } function log(bool p0, address p1, bool p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,address,bool)", p0, p1, p2)); } function log(bool p0, address p1, address p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,address,address)", p0, p1, p2)); } function log(address p0, uint256 p1, uint256 p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,uint256,uint256)", p0, p1, p2)); } function log(address p0, uint256 p1, string memory p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,uint256,string)", p0, p1, p2)); } function log(address p0, uint256 p1, bool p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,uint256,bool)", p0, p1, p2)); } function log(address p0, uint256 p1, address p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,uint256,address)", p0, p1, p2)); } function log(address p0, string memory p1, uint256 p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,string,uint256)", p0, p1, p2)); } function log(address p0, string memory p1, string memory p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,string,string)", p0, p1, p2)); } function log(address p0, string memory p1, bool p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,string,bool)", p0, p1, p2)); } function log(address p0, string memory p1, address p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,string,address)", p0, p1, p2)); } function log(address p0, bool p1, uint256 p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,bool,uint256)", p0, p1, p2)); } function log(address p0, bool p1, string memory p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,bool,string)", p0, p1, p2)); } function log(address p0, bool p1, bool p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,bool,bool)", p0, p1, p2)); } function log(address p0, bool p1, address p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,bool,address)", p0, p1, p2)); } function log(address p0, address p1, uint256 p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,address,uint256)", p0, p1, p2)); } function log(address p0, address p1, string memory p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,address,string)", p0, p1, p2)); } function log(address p0, address p1, bool p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,address,bool)", p0, p1, p2)); } function log(address p0, address p1, address p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,address,address)", p0, p1, p2)); } function log(uint256 p0, uint256 p1, uint256 p2, uint256 p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,uint256,uint256)", p0, p1, p2, p3)); } function log(uint256 p0, uint256 p1, uint256 p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,uint256,string)", p0, p1, p2, p3)); } function log(uint256 p0, uint256 p1, uint256 p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,uint256,bool)", p0, p1, p2, p3)); } function log(uint256 p0, uint256 p1, uint256 p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,uint256,address)", p0, p1, p2, p3)); } function log(uint256 p0, uint256 p1, string memory p2, uint256 p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,string,uint256)", p0, p1, p2, p3)); } function log(uint256 p0, uint256 p1, string memory p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,string,string)", p0, p1, p2, p3)); } function log(uint256 p0, uint256 p1, string memory p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,string,bool)", p0, p1, p2, p3)); } function log(uint256 p0, uint256 p1, string memory p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,string,address)", p0, p1, p2, p3)); } function log(uint256 p0, uint256 p1, bool p2, uint256 p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,bool,uint256)", p0, p1, p2, p3)); } function log(uint256 p0, uint256 p1, bool p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,bool,string)", p0, p1, p2, p3)); } function log(uint256 p0, uint256 p1, bool p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,bool,bool)", p0, p1, p2, p3)); } function log(uint256 p0, uint256 p1, bool p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,bool,address)", p0, p1, p2, p3)); } function log(uint256 p0, uint256 p1, address p2, uint256 p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,address,uint256)", p0, p1, p2, p3)); } function log(uint256 p0, uint256 p1, address p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,address,string)", p0, p1, p2, p3)); } function log(uint256 p0, uint256 p1, address p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,address,bool)", p0, p1, p2, p3)); } function log(uint256 p0, uint256 p1, address p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,address,address)", p0, p1, p2, p3)); } function log(uint256 p0, string memory p1, uint256 p2, uint256 p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,string,uint256,uint256)", p0, p1, p2, p3)); } function log(uint256 p0, string memory p1, uint256 p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,string,uint256,string)", p0, p1, p2, p3)); } function log(uint256 p0, string memory p1, uint256 p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,string,uint256,bool)", p0, p1, p2, p3)); } function log(uint256 p0, string memory p1, uint256 p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,string,uint256,address)", p0, p1, p2, p3)); } function log(uint256 p0, string memory p1, string memory p2, uint256 p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,string,string,uint256)", p0, p1, p2, p3)); } function log(uint256 p0, string memory p1, string memory p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,string,string,string)", p0, p1, p2, p3)); } function log(uint256 p0, string memory p1, string memory p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,string,string,bool)", p0, p1, p2, p3)); } function log(uint256 p0, string memory p1, string memory p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,string,string,address)", p0, p1, p2, p3)); } function log(uint256 p0, string memory p1, bool p2, uint256 p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,string,bool,uint256)", p0, p1, p2, p3)); } function log(uint256 p0, string memory p1, bool p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,string,bool,string)", p0, p1, p2, p3)); } function log(uint256 p0, string memory p1, bool p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,string,bool,bool)", p0, p1, p2, p3)); } function log(uint256 p0, string memory p1, bool p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,string,bool,address)", p0, p1, p2, p3)); } function log(uint256 p0, string memory p1, address p2, uint256 p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,string,address,uint256)", p0, p1, p2, p3)); } function log(uint256 p0, string memory p1, address p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,string,address,string)", p0, p1, p2, p3)); } function log(uint256 p0, string memory p1, address p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,string,address,bool)", p0, p1, p2, p3)); } function log(uint256 p0, string memory p1, address p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,string,address,address)", p0, p1, p2, p3)); } function log(uint256 p0, bool p1, uint256 p2, uint256 p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,uint256,uint256)", p0, p1, p2, p3)); } function log(uint256 p0, bool p1, uint256 p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,uint256,string)", p0, p1, p2, p3)); } function log(uint256 p0, bool p1, uint256 p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,uint256,bool)", p0, p1, p2, p3)); } function log(uint256 p0, bool p1, uint256 p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,uint256,address)", p0, p1, p2, p3)); } function log(uint256 p0, bool p1, string memory p2, uint256 p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,string,uint256)", p0, p1, p2, p3)); } function log(uint256 p0, bool p1, string memory p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,string,string)", p0, p1, p2, p3)); } function log(uint256 p0, bool p1, string memory p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,string,bool)", p0, p1, p2, p3)); } function log(uint256 p0, bool p1, string memory p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,string,address)", p0, p1, p2, p3)); } function log(uint256 p0, bool p1, bool p2, uint256 p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,bool,uint256)", p0, p1, p2, p3)); } function log(uint256 p0, bool p1, bool p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,bool,string)", p0, p1, p2, p3)); } function log(uint256 p0, bool p1, bool p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,bool,bool)", p0, p1, p2, p3)); } function log(uint256 p0, bool p1, bool p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,bool,address)", p0, p1, p2, p3)); } function log(uint256 p0, bool p1, address p2, uint256 p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,address,uint256)", p0, p1, p2, p3)); } function log(uint256 p0, bool p1, address p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,address,string)", p0, p1, p2, p3)); } function log(uint256 p0, bool p1, address p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,address,bool)", p0, p1, p2, p3)); } function log(uint256 p0, bool p1, address p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,address,address)", p0, p1, p2, p3)); } function log(uint256 p0, address p1, uint256 p2, uint256 p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,address,uint256,uint256)", p0, p1, p2, p3)); } function log(uint256 p0, address p1, uint256 p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,address,uint256,string)", p0, p1, p2, p3)); } function log(uint256 p0, address p1, uint256 p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,address,uint256,bool)", p0, p1, p2, p3)); } function log(uint256 p0, address p1, uint256 p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,address,uint256,address)", p0, p1, p2, p3)); } function log(uint256 p0, address p1, string memory p2, uint256 p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,address,string,uint256)", p0, p1, p2, p3)); } function log(uint256 p0, address p1, string memory p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,address,string,string)", p0, p1, p2, p3)); } function log(uint256 p0, address p1, string memory p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,address,string,bool)", p0, p1, p2, p3)); } function log(uint256 p0, address p1, string memory p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,address,string,address)", p0, p1, p2, p3)); } function log(uint256 p0, address p1, bool p2, uint256 p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,address,bool,uint256)", p0, p1, p2, p3)); } function log(uint256 p0, address p1, bool p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,address,bool,string)", p0, p1, p2, p3)); } function log(uint256 p0, address p1, bool p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,address,bool,bool)", p0, p1, p2, p3)); } function log(uint256 p0, address p1, bool p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,address,bool,address)", p0, p1, p2, p3)); } function log(uint256 p0, address p1, address p2, uint256 p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,address,address,uint256)", p0, p1, p2, p3)); } function log(uint256 p0, address p1, address p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,address,address,string)", p0, p1, p2, p3)); } function log(uint256 p0, address p1, address p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,address,address,bool)", p0, p1, p2, p3)); } function log(uint256 p0, address p1, address p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,address,address,address)", p0, p1, p2, p3)); } function log(string memory p0, uint256 p1, uint256 p2, uint256 p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,uint256,uint256,uint256)", p0, p1, p2, p3)); } function log(string memory p0, uint256 p1, uint256 p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,uint256,uint256,string)", p0, p1, p2, p3)); } function log(string memory p0, uint256 p1, uint256 p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,uint256,uint256,bool)", p0, p1, p2, p3)); } function log(string memory p0, uint256 p1, uint256 p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,uint256,uint256,address)", p0, p1, p2, p3)); } function log(string memory p0, uint256 p1, string memory p2, uint256 p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,uint256,string,uint256)", p0, p1, p2, p3)); } function log(string memory p0, uint256 p1, string memory p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,uint256,string,string)", p0, p1, p2, p3)); } function log(string memory p0, uint256 p1, string memory p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,uint256,string,bool)", p0, p1, p2, p3)); } function log(string memory p0, uint256 p1, string memory p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,uint256,string,address)", p0, p1, p2, p3)); } function log(string memory p0, uint256 p1, bool p2, uint256 p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,uint256,bool,uint256)", p0, p1, p2, p3)); } function log(string memory p0, uint256 p1, bool p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,uint256,bool,string)", p0, p1, p2, p3)); } function log(string memory p0, uint256 p1, bool p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,uint256,bool,bool)", p0, p1, p2, p3)); } function log(string memory p0, uint256 p1, bool p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,uint256,bool,address)", p0, p1, p2, p3)); } function log(string memory p0, uint256 p1, address p2, uint256 p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,uint256,address,uint256)", p0, p1, p2, p3)); } function log(string memory p0, uint256 p1, address p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,uint256,address,string)", p0, p1, p2, p3)); } function log(string memory p0, uint256 p1, address p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,uint256,address,bool)", p0, p1, p2, p3)); } function log(string memory p0, uint256 p1, address p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,uint256,address,address)", p0, p1, p2, p3)); } function log(string memory p0, string memory p1, uint256 p2, uint256 p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,string,uint256,uint256)", p0, p1, p2, p3)); } function log(string memory p0, string memory p1, uint256 p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,string,uint256,string)", p0, p1, p2, p3)); } function log(string memory p0, string memory p1, uint256 p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,string,uint256,bool)", p0, p1, p2, p3)); } function log(string memory p0, string memory p1, uint256 p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,string,uint256,address)", p0, p1, p2, p3)); } function log(string memory p0, string memory p1, string memory p2, uint256 p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,string,string,uint256)", p0, p1, p2, p3)); } function log(string memory p0, string memory p1, string memory p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,string,string,string)", p0, p1, p2, p3)); } function log(string memory p0, string memory p1, string memory p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,string,string,bool)", p0, p1, p2, p3)); } function log(string memory p0, string memory p1, string memory p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,string,string,address)", p0, p1, p2, p3)); } function log(string memory p0, string memory p1, bool p2, uint256 p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,string,bool,uint256)", p0, p1, p2, p3)); } function log(string memory p0, string memory p1, bool p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,string,bool,string)", p0, p1, p2, p3)); } function log(string memory p0, string memory p1, bool p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,string,bool,bool)", p0, p1, p2, p3)); } function log(string memory p0, string memory p1, bool p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,string,bool,address)", p0, p1, p2, p3)); } function log(string memory p0, string memory p1, address p2, uint256 p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,string,address,uint256)", p0, p1, p2, p3)); } function log(string memory p0, string memory p1, address p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,string,address,string)", p0, p1, p2, p3)); } function log(string memory p0, string memory p1, address p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,string,address,bool)", p0, p1, p2, p3)); } function log(string memory p0, string memory p1, address p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,string,address,address)", p0, p1, p2, p3)); } function log(string memory p0, bool p1, uint256 p2, uint256 p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,bool,uint256,uint256)", p0, p1, p2, p3)); } function log(string memory p0, bool p1, uint256 p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,bool,uint256,string)", p0, p1, p2, p3)); } function log(string memory p0, bool p1, uint256 p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,bool,uint256,bool)", p0, p1, p2, p3)); } function log(string memory p0, bool p1, uint256 p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,bool,uint256,address)", p0, p1, p2, p3)); } function log(string memory p0, bool p1, string memory p2, uint256 p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,bool,string,uint256)", p0, p1, p2, p3)); } function log(string memory p0, bool p1, string memory p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,bool,string,string)", p0, p1, p2, p3)); } function log(string memory p0, bool p1, string memory p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,bool,string,bool)", p0, p1, p2, p3)); } function log(string memory p0, bool p1, string memory p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,bool,string,address)", p0, p1, p2, p3)); } function log(string memory p0, bool p1, bool p2, uint256 p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,bool,bool,uint256)", p0, p1, p2, p3)); } function log(string memory p0, bool p1, bool p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,bool,bool,string)", p0, p1, p2, p3)); } function log(string memory p0, bool p1, bool p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,bool,bool,bool)", p0, p1, p2, p3)); } function log(string memory p0, bool p1, bool p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,bool,bool,address)", p0, p1, p2, p3)); } function log(string memory p0, bool p1, address p2, uint256 p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,bool,address,uint256)", p0, p1, p2, p3)); } function log(string memory p0, bool p1, address p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,bool,address,string)", p0, p1, p2, p3)); } function log(string memory p0, bool p1, address p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,bool,address,bool)", p0, p1, p2, p3)); } function log(string memory p0, bool p1, address p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,bool,address,address)", p0, p1, p2, p3)); } function log(string memory p0, address p1, uint256 p2, uint256 p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,address,uint256,uint256)", p0, p1, p2, p3)); } function log(string memory p0, address p1, uint256 p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,address,uint256,string)", p0, p1, p2, p3)); } function log(string memory p0, address p1, uint256 p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,address,uint256,bool)", p0, p1, p2, p3)); } function log(string memory p0, address p1, uint256 p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,address,uint256,address)", p0, p1, p2, p3)); } function log(string memory p0, address p1, string memory p2, uint256 p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,address,string,uint256)", p0, p1, p2, p3)); } function log(string memory p0, address p1, string memory p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,address,string,string)", p0, p1, p2, p3)); } function log(string memory p0, address p1, string memory p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,address,string,bool)", p0, p1, p2, p3)); } function log(string memory p0, address p1, string memory p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,address,string,address)", p0, p1, p2, p3)); } function log(string memory p0, address p1, bool p2, uint256 p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,address,bool,uint256)", p0, p1, p2, p3)); } function log(string memory p0, address p1, bool p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,address,bool,string)", p0, p1, p2, p3)); } function log(string memory p0, address p1, bool p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,address,bool,bool)", p0, p1, p2, p3)); } function log(string memory p0, address p1, bool p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,address,bool,address)", p0, p1, p2, p3)); } function log(string memory p0, address p1, address p2, uint256 p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,address,address,uint256)", p0, p1, p2, p3)); } function log(string memory p0, address p1, address p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,address,address,string)", p0, p1, p2, p3)); } function log(string memory p0, address p1, address p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,address,address,bool)", p0, p1, p2, p3)); } function log(string memory p0, address p1, address p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,address,address,address)", p0, p1, p2, p3)); } function log(bool p0, uint256 p1, uint256 p2, uint256 p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,uint256,uint256)", p0, p1, p2, p3)); } function log(bool p0, uint256 p1, uint256 p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,uint256,string)", p0, p1, p2, p3)); } function log(bool p0, uint256 p1, uint256 p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,uint256,bool)", p0, p1, p2, p3)); } function log(bool p0, uint256 p1, uint256 p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,uint256,address)", p0, p1, p2, p3)); } function log(bool p0, uint256 p1, string memory p2, uint256 p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,string,uint256)", p0, p1, p2, p3)); } function log(bool p0, uint256 p1, string memory p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,string,string)", p0, p1, p2, p3)); } function log(bool p0, uint256 p1, string memory p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,string,bool)", p0, p1, p2, p3)); } function log(bool p0, uint256 p1, string memory p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,string,address)", p0, p1, p2, p3)); } function log(bool p0, uint256 p1, bool p2, uint256 p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,bool,uint256)", p0, p1, p2, p3)); } function log(bool p0, uint256 p1, bool p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,bool,string)", p0, p1, p2, p3)); } function log(bool p0, uint256 p1, bool p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,bool,bool)", p0, p1, p2, p3)); } function log(bool p0, uint256 p1, bool p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,bool,address)", p0, p1, p2, p3)); } function log(bool p0, uint256 p1, address p2, uint256 p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,address,uint256)", p0, p1, p2, p3)); } function log(bool p0, uint256 p1, address p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,address,string)", p0, p1, p2, p3)); } function log(bool p0, uint256 p1, address p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,address,bool)", p0, p1, p2, p3)); } function log(bool p0, uint256 p1, address p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,address,address)", p0, p1, p2, p3)); } function log(bool p0, string memory p1, uint256 p2, uint256 p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,string,uint256,uint256)", p0, p1, p2, p3)); } function log(bool p0, string memory p1, uint256 p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,string,uint256,string)", p0, p1, p2, p3)); } function log(bool p0, string memory p1, uint256 p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,string,uint256,bool)", p0, p1, p2, p3)); } function log(bool p0, string memory p1, uint256 p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,string,uint256,address)", p0, p1, p2, p3)); } function log(bool p0, string memory p1, string memory p2, uint256 p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,string,string,uint256)", p0, p1, p2, p3)); } function log(bool p0, string memory p1, string memory p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,string,string,string)", p0, p1, p2, p3)); } function log(bool p0, string memory p1, string memory p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,string,string,bool)", p0, p1, p2, p3)); } function log(bool p0, string memory p1, string memory p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,string,string,address)", p0, p1, p2, p3)); } function log(bool p0, string memory p1, bool p2, uint256 p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,string,bool,uint256)", p0, p1, p2, p3)); } function log(bool p0, string memory p1, bool p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,string,bool,string)", p0, p1, p2, p3)); } function log(bool p0, string memory p1, bool p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,string,bool,bool)", p0, p1, p2, p3)); } function log(bool p0, string memory p1, bool p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,string,bool,address)", p0, p1, p2, p3)); } function log(bool p0, string memory p1, address p2, uint256 p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,string,address,uint256)", p0, p1, p2, p3)); } function log(bool p0, string memory p1, address p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,string,address,string)", p0, p1, p2, p3)); } function log(bool p0, string memory p1, address p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,string,address,bool)", p0, p1, p2, p3)); } function log(bool p0, string memory p1, address p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,string,address,address)", p0, p1, p2, p3)); } function log(bool p0, bool p1, uint256 p2, uint256 p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,uint256,uint256)", p0, p1, p2, p3)); } function log(bool p0, bool p1, uint256 p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,uint256,string)", p0, p1, p2, p3)); } function log(bool p0, bool p1, uint256 p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,uint256,bool)", p0, p1, p2, p3)); } function log(bool p0, bool p1, uint256 p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,uint256,address)", p0, p1, p2, p3)); } function log(bool p0, bool p1, string memory p2, uint256 p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,string,uint256)", p0, p1, p2, p3)); } function log(bool p0, bool p1, string memory p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,string,string)", p0, p1, p2, p3)); } function log(bool p0, bool p1, string memory p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,string,bool)", p0, p1, p2, p3)); } function log(bool p0, bool p1, string memory p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,string,address)", p0, p1, p2, p3)); } function log(bool p0, bool p1, bool p2, uint256 p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,bool,uint256)", p0, p1, p2, p3)); } function log(bool p0, bool p1, bool p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,bool,string)", p0, p1, p2, p3)); } function log(bool p0, bool p1, bool p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,bool,bool)", p0, p1, p2, p3)); } function log(bool p0, bool p1, bool p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,bool,address)", p0, p1, p2, p3)); } function log(bool p0, bool p1, address p2, uint256 p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,address,uint256)", p0, p1, p2, p3)); } function log(bool p0, bool p1, address p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,address,string)", p0, p1, p2, p3)); } function log(bool p0, bool p1, address p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,address,bool)", p0, p1, p2, p3)); } function log(bool p0, bool p1, address p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,address,address)", p0, p1, p2, p3)); } function log(bool p0, address p1, uint256 p2, uint256 p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,address,uint256,uint256)", p0, p1, p2, p3)); } function log(bool p0, address p1, uint256 p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,address,uint256,string)", p0, p1, p2, p3)); } function log(bool p0, address p1, uint256 p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,address,uint256,bool)", p0, p1, p2, p3)); } function log(bool p0, address p1, uint256 p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,address,uint256,address)", p0, p1, p2, p3)); } function log(bool p0, address p1, string memory p2, uint256 p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,address,string,uint256)", p0, p1, p2, p3)); } function log(bool p0, address p1, string memory p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,address,string,string)", p0, p1, p2, p3)); } function log(bool p0, address p1, string memory p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,address,string,bool)", p0, p1, p2, p3)); } function log(bool p0, address p1, string memory p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,address,string,address)", p0, p1, p2, p3)); } function log(bool p0, address p1, bool p2, uint256 p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,address,bool,uint256)", p0, p1, p2, p3)); } function log(bool p0, address p1, bool p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,address,bool,string)", p0, p1, p2, p3)); } function log(bool p0, address p1, bool p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,address,bool,bool)", p0, p1, p2, p3)); } function log(bool p0, address p1, bool p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,address,bool,address)", p0, p1, p2, p3)); } function log(bool p0, address p1, address p2, uint256 p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,address,address,uint256)", p0, p1, p2, p3)); } function log(bool p0, address p1, address p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,address,address,string)", p0, p1, p2, p3)); } function log(bool p0, address p1, address p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,address,address,bool)", p0, p1, p2, p3)); } function log(bool p0, address p1, address p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,address,address,address)", p0, p1, p2, p3)); } function log(address p0, uint256 p1, uint256 p2, uint256 p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,uint256,uint256,uint256)", p0, p1, p2, p3)); } function log(address p0, uint256 p1, uint256 p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,uint256,uint256,string)", p0, p1, p2, p3)); } function log(address p0, uint256 p1, uint256 p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,uint256,uint256,bool)", p0, p1, p2, p3)); } function log(address p0, uint256 p1, uint256 p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,uint256,uint256,address)", p0, p1, p2, p3)); } function log(address p0, uint256 p1, string memory p2, uint256 p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,uint256,string,uint256)", p0, p1, p2, p3)); } function log(address p0, uint256 p1, string memory p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,uint256,string,string)", p0, p1, p2, p3)); } function log(address p0, uint256 p1, string memory p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,uint256,string,bool)", p0, p1, p2, p3)); } function log(address p0, uint256 p1, string memory p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,uint256,string,address)", p0, p1, p2, p3)); } function log(address p0, uint256 p1, bool p2, uint256 p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,uint256,bool,uint256)", p0, p1, p2, p3)); } function log(address p0, uint256 p1, bool p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,uint256,bool,string)", p0, p1, p2, p3)); } function log(address p0, uint256 p1, bool p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,uint256,bool,bool)", p0, p1, p2, p3)); } function log(address p0, uint256 p1, bool p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,uint256,bool,address)", p0, p1, p2, p3)); } function log(address p0, uint256 p1, address p2, uint256 p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,uint256,address,uint256)", p0, p1, p2, p3)); } function log(address p0, uint256 p1, address p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,uint256,address,string)", p0, p1, p2, p3)); } function log(address p0, uint256 p1, address p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,uint256,address,bool)", p0, p1, p2, p3)); } function log(address p0, uint256 p1, address p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,uint256,address,address)", p0, p1, p2, p3)); } function log(address p0, string memory p1, uint256 p2, uint256 p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,string,uint256,uint256)", p0, p1, p2, p3)); } function log(address p0, string memory p1, uint256 p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,string,uint256,string)", p0, p1, p2, p3)); } function log(address p0, string memory p1, uint256 p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,string,uint256,bool)", p0, p1, p2, p3)); } function log(address p0, string memory p1, uint256 p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,string,uint256,address)", p0, p1, p2, p3)); } function log(address p0, string memory p1, string memory p2, uint256 p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,string,string,uint256)", p0, p1, p2, p3)); } function log(address p0, string memory p1, string memory p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,string,string,string)", p0, p1, p2, p3)); } function log(address p0, string memory p1, string memory p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,string,string,bool)", p0, p1, p2, p3)); } function log(address p0, string memory p1, string memory p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,string,string,address)", p0, p1, p2, p3)); } function log(address p0, string memory p1, bool p2, uint256 p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,string,bool,uint256)", p0, p1, p2, p3)); } function log(address p0, string memory p1, bool p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,string,bool,string)", p0, p1, p2, p3)); } function log(address p0, string memory p1, bool p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,string,bool,bool)", p0, p1, p2, p3)); } function log(address p0, string memory p1, bool p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,string,bool,address)", p0, p1, p2, p3)); } function log(address p0, string memory p1, address p2, uint256 p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,string,address,uint256)", p0, p1, p2, p3)); } function log(address p0, string memory p1, address p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,string,address,string)", p0, p1, p2, p3)); } function log(address p0, string memory p1, address p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,string,address,bool)", p0, p1, p2, p3)); } function log(address p0, string memory p1, address p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,string,address,address)", p0, p1, p2, p3)); } function log(address p0, bool p1, uint256 p2, uint256 p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,bool,uint256,uint256)", p0, p1, p2, p3)); } function log(address p0, bool p1, uint256 p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,bool,uint256,string)", p0, p1, p2, p3)); } function log(address p0, bool p1, uint256 p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,bool,uint256,bool)", p0, p1, p2, p3)); } function log(address p0, bool p1, uint256 p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,bool,uint256,address)", p0, p1, p2, p3)); } function log(address p0, bool p1, string memory p2, uint256 p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,bool,string,uint256)", p0, p1, p2, p3)); } function log(address p0, bool p1, string memory p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,bool,string,string)", p0, p1, p2, p3)); } function log(address p0, bool p1, string memory p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,bool,string,bool)", p0, p1, p2, p3)); } function log(address p0, bool p1, string memory p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,bool,string,address)", p0, p1, p2, p3)); } function log(address p0, bool p1, bool p2, uint256 p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,bool,bool,uint256)", p0, p1, p2, p3)); } function log(address p0, bool p1, bool p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,bool,bool,string)", p0, p1, p2, p3)); } function log(address p0, bool p1, bool p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,bool,bool,bool)", p0, p1, p2, p3)); } function log(address p0, bool p1, bool p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,bool,bool,address)", p0, p1, p2, p3)); } function log(address p0, bool p1, address p2, uint256 p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,bool,address,uint256)", p0, p1, p2, p3)); } function log(address p0, bool p1, address p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,bool,address,string)", p0, p1, p2, p3)); } function log(address p0, bool p1, address p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,bool,address,bool)", p0, p1, p2, p3)); } function log(address p0, bool p1, address p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,bool,address,address)", p0, p1, p2, p3)); } function log(address p0, address p1, uint256 p2, uint256 p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,address,uint256,uint256)", p0, p1, p2, p3)); } function log(address p0, address p1, uint256 p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,address,uint256,string)", p0, p1, p2, p3)); } function log(address p0, address p1, uint256 p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,address,uint256,bool)", p0, p1, p2, p3)); } function log(address p0, address p1, uint256 p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,address,uint256,address)", p0, p1, p2, p3)); } function log(address p0, address p1, string memory p2, uint256 p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,address,string,uint256)", p0, p1, p2, p3)); } function log(address p0, address p1, string memory p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,address,string,string)", p0, p1, p2, p3)); } function log(address p0, address p1, string memory p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,address,string,bool)", p0, p1, p2, p3)); } function log(address p0, address p1, string memory p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,address,string,address)", p0, p1, p2, p3)); } function log(address p0, address p1, bool p2, uint256 p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,address,bool,uint256)", p0, p1, p2, p3)); } function log(address p0, address p1, bool p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,address,bool,string)", p0, p1, p2, p3)); } function log(address p0, address p1, bool p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,address,bool,bool)", p0, p1, p2, p3)); } function log(address p0, address p1, bool p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,address,bool,address)", p0, p1, p2, p3)); } function log(address p0, address p1, address p2, uint256 p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,address,address,uint256)", p0, p1, p2, p3)); } function log(address p0, address p1, address p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,address,address,string)", p0, p1, p2, p3)); } function log(address p0, address p1, address p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,address,address,bool)", p0, p1, p2, p3)); } function log(address p0, address p1, address p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,address,address,address)", p0, p1, p2, p3)); } }
{ "evmVersion": "istanbul", "optimizer": { "enabled": true, "runs": 999 }, "outputSelection": { "*": { "*": [ "evm.bytecode", "evm.deployedBytecode", "devdoc", "userdoc", "metadata", "abi" ] } }, "libraries": {} }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"address","name":"_reward","type":"address"},{"internalType":"address","name":"timerAddr","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"InsufficientBalance","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"uint256","name":"roundId","type":"uint256"}],"name":"CancelRewards","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"uint256","name":"amountClaimed","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"userOffset","type":"uint256"}],"name":"ClaimRewards","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Deposit","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"uint256","name":"amountClaimed","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"totalScore","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"roundId","type":"uint256"}],"name":"DepositRewards","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferStarted","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":false,"internalType":"address","name":"account","type":"address"}],"name":"Paused","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Unpaused","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Withdraw","type":"event"},{"inputs":[],"name":"HOLDING_END_TIME","outputs":[{"internalType":"uint32","name":"","type":"uint32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_PRECISION_DIGITS","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint16","name":"index","type":"uint16"}],"name":"Rounds","outputs":[{"components":[{"internalType":"bool","name":"canceled","type":"bool"},{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"uint256","name":"timestamp","type":"uint256"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"totalScore","type":"uint256"}],"internalType":"struct KaspaMiningStaking.UnpackedRound","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"TOKEN","outputs":[{"internalType":"contract IERC20Metadata","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"acceptOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"user","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint16","name":"RoundId","type":"uint16"}],"name":"cancelRound","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16","name":"nTake","type":"uint16"}],"name":"claimRewards","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"currentId","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"deposit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokensAmount","type":"uint256"},{"internalType":"uint256","name":"totalScore","type":"uint256"}],"name":"depositRewards","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"getCurrentTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"},{"internalType":"uint256","name":"take","type":"uint256"}],"name":"getHotAcumScores","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"user","type":"address"},{"internalType":"uint16","name":"index","type":"uint16"},{"internalType":"uint16","name":"nTake","type":"uint16"}],"name":"getUserPendingClaim","outputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint16[]","name":"","type":"uint16[]"},{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"user","type":"address"}],"name":"lastUpdatedAt","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"user","type":"address"},{"internalType":"uint256","name":"timestamp","type":"uint256"}],"name":"multiplierOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"user","type":"address"}],"name":"multiplierStart","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"nInvestors","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pendingOwner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"user","type":"address"},{"internalType":"uint32","name":"timestamp","type":"uint32"}],"name":"pointsOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"rewardToken","outputs":[{"internalType":"contract IERC20Metadata","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"rewardTokenDecs","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"rewardTokenAmount","type":"uint256"}],"name":"rewardTokenPack","outputs":[{"internalType":"uint96","name":"","type":"uint96"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint96","name":"rewardTokenAmount","type":"uint96"}],"name":"rewardTokenUnpack","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"user","type":"address"},{"internalType":"uint32","name":"timestamp","type":"uint32"}],"name":"scoreOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"stakeTokenDecs","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"stakeTokenAmount","type":"uint256"}],"name":"stakeTokenPack","outputs":[{"internalType":"uint96","name":"","type":"uint96"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint96","name":"stakeTokenAmount","type":"uint96"}],"name":"stakeTokenUnpack","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"timerAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"unpause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"userRoundOffset","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdrawRewards","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
6101006040523480156200001257600080fd5b5060405162002bd338038062002bd38339810160408190526200003591620001f5565b82818062000043336200015e565b6001805460ff60a01b19169055600280546001600160a01b0319166001600160a01b03928316179055821660808190526040805163313ce56760e01b8152905163313ce567916004808201926020929091908290030181865afa158015620000af573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620000d591906200023f565b60ff1660a05250506001600160a01b03821660c08190526040805163313ce56760e01b8152905163313ce567916004808201926020929091908290030181865afa15801562000128573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200014e91906200023f565b60ff1660e052506200026b915050565b600180546001600160a01b0319169055620001858162000188602090811b6200181817901c565b50565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b80516001600160a01b0381168114620001f057600080fd5b919050565b6000806000606084860312156200020b57600080fd5b6200021684620001d8565b92506200022660208501620001d8565b91506200023660408501620001d8565b90509250925092565b6000602082840312156200025257600080fd5b815160ff811681146200026457600080fd5b9392505050565b60805160a05160c05160e0516128cc62000307600039600081816104b6015281816109f2015261127d01526000818161063f01528181610c5001528181610cd7015281816112e10152818161151e01528181611641015281816116de01528181611ceb0152611e170152600081816103ae01528181610a4e0152610fe401526000818161048f015281816119800152611fda01526128cc6000f3fe608060405234801561001057600080fd5b50600436106102925760003560e01c806382bfefc811610160578063b6c97aed116100d8578063e00dd1611161008c578063f2fde38b11610071578063f2fde38b14610627578063f7c618c11461063a578063f8c712541461066157600080fd5b8063e00dd16114610608578063e30c39781461061657600080fd5b8063bdd071fb116100bd578063bdd071fb146105be578063c7b8981c146105d1578063d8b95bf0146105d957600080fd5b8063b6c97aed14610598578063b746b5d1146105ab57600080fd5b80638aa24f1f1161012f578063a522bbaa11610114578063a522bbaa1461055f578063ab03488114610572578063b6b55f251461058557600080fd5b80638aa24f1f146105175780638da5cb5b1461054e57600080fd5b806382bfefc81461048a57806383e575cf146104b15780638456cb59146104d8578063892844c5146104e057600080fd5b80635c975abb1161020e57806378393aeb116101c257806379ba5097116101a757806379ba5097146104675780637c14e07b1461046f5780637d9d56071461047757600080fd5b806378393aeb146103fd5780637966593b1461041057600080fd5b80635ff41794116101f35780635ff41794146103a957806370a08231146103e2578063715018a6146103f557600080fd5b80635c975abb146103845780635ccea232146103a157600080fd5b806337980447116102655780633f4ba83a1161024a5780633f4ba83a1461033e57806347ac8092146103465780634f5a9a821461037157600080fd5b8063379804471461031857806338ed9c991461032b57600080fd5b8063092358fd146102975780631c39c38d146102c257806329cb924d146102ed5780632e1a7d4d14610303575b600080fd5b6102aa6102a53660046123fa565b610681565b6040516102b99392919061243d565b60405180910390f35b6002546102d5906001600160a01b031681565b6040516001600160a01b0390911681526020016102b9565b6102f56108bd565b6040519081526020016102b9565b61031661031136600461249c565b610952565b005b6102f56103263660046124b5565b610994565b6102f56103393660046124f5565b6109df565b610316610a35565b61035961035436600461249c565b610a47565b6040516001600160601b0390911681526020016102b9565b6102f561037f366004612525565b610a8a565b600154600160a01b900460ff1660405190151581526020016102b9565b6003546102f5565b6103d07f000000000000000000000000000000000000000000000000000000000000000081565b60405160ff90911681526020016102b9565b6102f56103f036600461254f565b610b61565b610316610b93565b61031661040b36600461256a565b610ba5565b61042361041e36600461256a565b610e44565b6040516102b99190600060a0820190508251151582526020830151602083015260408301516040830152606083015160608301526080830151608083015292915050565b610316610f43565b6103d0600981565b6102f56104853660046124f5565b610fd1565b6102d57f000000000000000000000000000000000000000000000000000000000000000081565b6103d07f000000000000000000000000000000000000000000000000000000000000000081565b61031661100a565b6102f56104ee36600461254f565b6001600160a01b0316600090815260046020526040902054640100000000900463ffffffff1690565b61053b61052536600461254f565b60066020526000908152604090205461ffff1681565b60405161ffff90911681526020016102b9565b6000546001600160a01b03166102d5565b61031661056d36600461256a565b61101a565b6102f56105803660046124b5565b611091565b61031661059336600461249c565b6110c4565b6102f56105a6366004612585565b6111e1565b6103596105b936600461249c565b611276565b6103166105cc366004612585565b6112a3565b610316611621565b6102f56105e736600461254f565b6001600160a01b031660009081526004602052604090205463ffffffff1690565b60055461053b9061ffff1681565b6001546001600160a01b03166102d5565b61031661063536600461254f565b61179a565b6102d57f000000000000000000000000000000000000000000000000000000000000000081565b61066c63ffffffff81565b60405163ffffffff90911681526020016102b9565b600060606000808461ffff1667ffffffffffffffff8111156106a5576106a56125a7565b6040519080825280602002602001820160405280156106ce578160200160208202803683370190505b506001600160a01b038816600090815260066020908152604080832054600554825160a081018452858152938401859052918301849052606083018490526080830184905293945091928392839261ffff928316929182169184908d1684106107375783610739565b8c5b90505b8261ffff168161ffff16116108865761ffff808216600090815260076020908152604091829020825160a081018452905460ff811615158252610100810490941691810182905263ffffffff6301000000850416928101929092526001600160601b03670100000000000000840481166060840152600160981b909304909216608082015292506107cc57610886565b81516108605760006107e28f8460400151611091565b90506107f18360800151610fd1565b816107ff85606001516109df565b61080991906125d3565b61081391906125f2565b61081d9089612614565b97508260200151898861ffff168151811061083a5761083a61262c565b61ffff90921660209283029190910182015283015195508661085b81612642565b975050505b8b61ffff168661ffff161061087457610886565b8061087e81612642565b91505061073c565b5085156108a9576103e861089c876103e36125d3565b6108a691906125f2565b95505b50939b949a50909850929650505050505050565b6002546000906001600160a01b03161561094d57600260009054906101000a90046001600160a01b03166001600160a01b03166329cb924d6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610924573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109489190612664565b905090565b504290565b61095c3382611875565b60055461096e9061ffff16600161267d565b336000908152600660205260409020805461ffff191661ffff9290921691909117905550565b60006109d66109a38484611a3a565b6001600160a01b0385166000908152600460205260409020546104859190600160a01b90046001600160601b03166126a3565b90505b92915050565b60006109ed6009600a6127a9565b610a187f0000000000000000000000000000000000000000000000000000000000000000600a6127a9565b610a2b906001600160601b0385166125d3565b6109d991906125f2565b610a3d611b1d565b610a45611b77565b565b6000610a747f0000000000000000000000000000000000000000000000000000000000000000600a6127a9565b610a806009600a6127a9565b610a2b90846125d3565b6001600160a01b03821660009081526004602090815260408083208151608081018352905463ffffffff80821683526401000000008204169382018490526001600160601b03600160401b8204811693830193909352600160a01b9004909116606082015290801580610b08575060408201516001600160601b0316155b15610b1957612710925050506109d9565b62278d0081610b2c8663ffffffff611bcc565b610b3691906127b8565b610b42906113886125d3565b610b4c91906125f2565b610b5890612710612614565b95945050505050565b6001600160a01b0381166000908152600460205260408120546109d990600160401b90046001600160601b0316610fd1565b610b9b611b1d565b610a456000611be2565b610bad611b1d565b61ffff811660009081526007602052604090205460ff1615610c165760405162461bcd60e51b815260206004820152601f60248201527f526577617264206465706f73697420616c72656164792063616e63656c65640060448201526064015b60405180910390fd5b61ffff8116600090815260076020526040808220805460ff19166001179055516370a0823160e01b81523060048201526001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016906370a0823190602401602060405180830381865afa158015610c97573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610cbb9190612664565b60055461ffff16600090815260076020526040812054919250907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169063a9059cbb903390610d2f90610d299067010000000000000090046001600160601b03166109df565b86611bcc565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e085901b1681526001600160a01b03909216600483015260248201526044016020604051808303816000875af1158015610d92573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610db691906127cf565b905080610e055760405162461bcd60e51b815260206004820152601960248201527f4572726f72207472616e7366657272696e6720746f6b656e73000000000000006044820152606401610c0d565b60405161ffff8416815233907f806a9add4f7fa62f0b0f6862e74ed8d56b2efd3a6477c97886498940eca095d5906020015b60405180910390a2505050565b610e786040518060a00160405280600015158152602001600081526020016000815260200160008152602001600081525090565b61ffff808316600090815260076020908152604091829020825160a08082018552915460ff8116151582526101008104861682850190815263ffffffff6301000000830481168488019081526001600160601b03670100000000000000850481166060808801918252600160981b909604909116608087015288519687018952855115158752925190981695850195909552955190931693820193909352925191929190820190610f28906109df565b8152602001610f3a8360800151610fd1565b90529392505050565b60015433906001600160a01b03168114610fc55760405162461bcd60e51b815260206004820152602960248201527f4f776e61626c6532537465703a2063616c6c6572206973206e6f74207468652060448201527f6e6577206f776e657200000000000000000000000000000000000000000000006064820152608401610c0d565b610fce81611be2565b50565b6000610fdf6009600a6127a9565b610a187f0000000000000000000000000000000000000000000000000000000000000000600a6127a9565b611012611b1d565b610a45611c08565b60008061102933600085610681565b925050915060008161ffff16116110825760405162461bcd60e51b815260206004820152601960248201527f5468657265206973206e6f7468696e6720746f20636c61696d000000000000006044820152606401610c0d565b61108c8282611c4b565b505050565b60006127106110a6848463ffffffff16610a8a565b6110b08585610994565b6110ba91906125d3565b6109d691906125f2565b3360009081526006602052604090205461ffff1680611117576005546110ef9061ffff16600161267d565b336000908152600660205260409020805461ffff191661ffff929092169190911790556111d3565b60055461ffff908116908216116111d357600080600061113b336000610190610681565b925092509250816001835161115091906127b8565b815181106111605761116061262c565b602002602001015161ffff166000146111bb5760405162461bcd60e51b815260206004820152601f60248201527f596f75206861766520746f20636c61696d2072657761726473206669727374006044820152606401610c0d565b61ffff8116156111cf576111cf8382611c4b565b5050505b6111dd3383611f2b565b5050565b600080806111ed6108bd565b9050845b60035481101561126c57841580159061121357508461121087836127b8565b10155b1561121d5761126c565b61124e600382815481106112335761123361262c565b6000918252602090912001546001600160a01b031683611091565b6112589084612614565b925080611264816127f1565b9150506111f1565b5090949350505050565b6000610a747f0000000000000000000000000000000000000000000000000000000000000000600a6127a9565b6112ab611b1d565b6040517fdd62ed3e00000000000000000000000000000000000000000000000000000000815233600482015230602482015282907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169063dd62ed3e90604401602060405180830381865afa158015611330573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113549190612664565b10156113a25760405162461bcd60e51b815260206004820152601460248201527f416c6c6f77616e6365206e6f7420656e6f7567680000000000000000000000006044820152606401610c0d565b6005805461ffff169060006113b683612642565b825461010092830a61ffff8181021990921692821602919091179092556005549091166000818152600760205260409020805462ffff001916919092021790555061140082611276565b60055461ffff16600090815260076020526040902080546001600160601b0392909216670100000000000000027fffffffffffffffffffffffffff000000000000000000000000ffffffffffffff90921691909117905561146081610a47565b60055461ffff16600090815260076020526040902080546001600160601b0392909216600160981b027fff000000000000000000000000ffffffffffffffffffffffffffffffffffffff9092169190911790556114bb6108bd565b60055461ffff16600090815260076020526040808220805463ffffffff9490941663010000000266ffffffff000000199094169390931790925590516323b872dd60e01b8152336004820152306024820152604481018490526001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016906323b872dd906064016020604051808303816000875af1158015611567573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061158b91906127cf565b9050806115da5760405162461bcd60e51b815260206004820152601960248201527f4572726f72207472616e7366657272696e6720746f6b656e73000000000000006044820152606401610c0d565b600554604080518581526020810185905261ffff9092169082015233907f8c39852a077723f57930139d1fc5f7390505c947cd53471a68fee798aba4cd2c90606001610e37565b611629611b1d565b6040516370a0823160e01b81523060048201526000907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906370a0823190602401602060405180830381865afa158015611690573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116b49190612664565b60405163a9059cbb60e01b8152336004820152602481018290529091506000906001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169063a9059cbb906044016020604051808303816000875af1158015611727573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061174b91906127cf565b9050806111dd5760405162461bcd60e51b815260206004820152601960248201527f4572726f72207472616e7366657272696e6720746f6b656e73000000000000006044820152606401610c0d565b6117a2611b1d565b600180546001600160a01b03831673ffffffffffffffffffffffffffffffffffffffff1990911681179091556117e06000546001600160a01b031690565b6001600160a01b03167f38d16b8cac22d99fc7c124b9cd0de2d3fa1faef420bfe791d8c362d765e2270060405160405180910390a350565b600080546001600160a01b0383811673ffffffffffffffffffffffffffffffffffffffff19831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b600061188082610a47565b9050600061188c6108bd565b90506118988482612098565b6001600160a01b038416600090815260046020526040902080546001600160601b03808516600160401b9092041610156118fe576040517ff4d678b800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8054600160401b6001600160a01b0363ffffffff8581166401000000000282811673ffffffffffffffffffffffff00000000ffffffff8616178490046001600160601b039081168990031690930267ffffffffffffffff9390931693169290921717825560405163a9059cbb60e01b81528682166004820152602481018690527f00000000000000000000000000000000000000000000000000000000000000009091169063a9059cbb906044016020604051808303816000875af11580156119cb573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119ef91906127cf565b50846001600160a01b03167f884edad9ce6fa2440d8a54cc123490eb96d2768479d49ff9c7366125a942436485604051611a2b91815260200190565b60405180910390a25050505050565b6001600160a01b03821660009081526004602090815260408083208151608081018352905463ffffffff80821680845264010000000083048216958401959095526001600160601b03600160401b8304811694840194909452600160a01b9091049092166060820152918390611ab09083611bcc565b90506000611aca8663ffffffff168463ffffffff16611bcc565b9050611ada612710610e106125d3565b611ae483836127b8565b611af0906127106125d3565b85604001516001600160601b0316611b0891906125d3565b611b1291906125f2565b979650505050505050565b6000546001600160a01b03163314610a455760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610c0d565b611b7f61211b565b6001805460ff60a01b191690557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa335b6040516001600160a01b03909116815260200160405180910390a1565b6000818310611bdb57816109d6565b5090919050565b6001805473ffffffffffffffffffffffffffffffffffffffff19169055610fce81611818565b611c10612174565b6001805460ff60a01b1916600160a01b1790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a258611baf3390565b60008161ffff1611611c9f5760405162461bcd60e51b815260206004820152601960248201527f5468657265206973206e6f7468696e6720746f20636c61696d000000000000006044820152606401610c0d565b611caa81600161267d565b336000908152600660205260409020805461ffff191661ffff929092169190911790558115611ede576040516370a0823160e01b81523060048201526000907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906370a0823190602401602060405180830381865afa158015611d3a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611d5e9190612664565b9050611d836040518060600160405280602681526020016128716026913984836121ce565b828111611df85760405162461bcd60e51b815260206004820152602b60248201527f5468657265206973206e6f7420656e6f75676820746f6b656e732c207761697460448201527f20666f7220726566696c6c0000000000000000000000000000000000000000006064820152608401610c0d565b60405163a9059cbb60e01b8152336004820152602481018490526000907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169063a9059cbb906044016020604051808303816000875af1158015611e68573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e8c91906127cf565b905080611edb5760405162461bcd60e51b815260206004820152601960248201527f4572726f72207472616e7366657272696e6720746f6b656e73000000000000006044820152606401610c0d565b50505b337f674a8930d4166ce2352c3dc1e9ff633595db479f71f3741270a0a73a52cb7b0f83611f0c84600161267d565b6040805192835261ffff90911660208301520160405180910390a25050565b60008111611fa15760405162461bcd60e51b815260206004820152603560248201527f596f7520666f72676f7420746f20696e6469636174652074686520616d6f756e60448201527f7420796f752077616e7420746f206465706f73697400000000000000000000006064820152608401610c0d565b611fab8282612243565b6040516323b872dd60e01b81526001600160a01b038381166004830152306024830152604482018390526000917f0000000000000000000000000000000000000000000000000000000000000000909116906323b872dd906064016020604051808303816000875af1158015612025573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061204991906127cf565b90508061108c5760405162461bcd60e51b815260206004820152601960248201527f4572726f72207472616e7366657272696e6720746f6b656e73000000000000006044820152606401610c0d565b6001600160a01b03821660009081526004602052604090206120ba8383611a3a565b815482906014906120dc908490600160a01b90046001600160601b03166126a3565b82546001600160601b039182166101009390930a928302919092021990911617905550805463ffffffff90921663ffffffff1990921691909117905550565b600154600160a01b900460ff16610a455760405162461bcd60e51b815260206004820152601460248201527f5061757361626c653a206e6f74207061757365640000000000000000000000006044820152606401610c0d565b600154600160a01b900460ff1615610a455760405162461bcd60e51b815260206004820152601060248201527f5061757361626c653a20706175736564000000000000000000000000000000006044820152606401610c0d565b61108c8383836040516024016121e69392919061280c565b60408051601f198184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fca47c4eb000000000000000000000000000000000000000000000000000000001790526123ab565b61224b612174565b60006122556108bd565b6001600160a01b0384166000908152600460205260409020805491925090640100000000900463ffffffff166122a457805467ffffffff00000000191664010000000063ffffffff8416021781555b805463ffffffff1661230957600380546001810182556000919091527fc2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85b01805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b0386161790555b6123138483612098565b61231c83610a47565b8154829060089061233e908490600160401b90046001600160601b03166126a3565b92506101000a8154816001600160601b0302191690836001600160601b03160217905550836001600160a01b03167fe1fffcc4923d04b559f4d29a8bfc6cda04eb5b0d3c460751c2402c5c5cc9109c8460405161239d91815260200190565b60405180910390a250505050565b60006a636f6e736f6c652e6c6f679050600080835160208501845afa505050565b80356001600160a01b03811681146123e357600080fd5b919050565b803561ffff811681146123e357600080fd5b60008060006060848603121561240f57600080fd5b612418846123cc565b9250612426602085016123e8565b9150612434604085016123e8565b90509250925092565b6000606082018583526020606081850152818651808452608086019150828801935060005b8181101561248257845161ffff1683529383019391830191600101612462565b505080935050505061ffff83166040830152949350505050565b6000602082840312156124ae57600080fd5b5035919050565b600080604083850312156124c857600080fd5b6124d1836123cc565b9150602083013563ffffffff811681146124ea57600080fd5b809150509250929050565b60006020828403121561250757600080fd5b81356001600160601b038116811461251e57600080fd5b9392505050565b6000806040838503121561253857600080fd5b612541836123cc565b946020939093013593505050565b60006020828403121561256157600080fd5b6109d6826123cc565b60006020828403121561257c57600080fd5b6109d6826123e8565b6000806040838503121561259857600080fd5b50508035926020909101359150565b634e487b7160e01b600052604160045260246000fd5b634e487b7160e01b600052601160045260246000fd5b60008160001904831182151516156125ed576125ed6125bd565b500290565b60008261260f57634e487b7160e01b600052601260045260246000fd5b500490565b60008219821115612627576126276125bd565b500190565b634e487b7160e01b600052603260045260246000fd5b600061ffff8083168181141561265a5761265a6125bd565b6001019392505050565b60006020828403121561267657600080fd5b5051919050565b600061ffff80831681851680830382111561269a5761269a6125bd565b01949350505050565b60006001600160601b0380831681851680830382111561269a5761269a6125bd565b600181815b808511156127005781600019048211156126e6576126e66125bd565b808516156126f357918102915b93841c93908002906126ca565b509250929050565b600082612717575060016109d9565b81612724575060006109d9565b816001811461273a576002811461274457612760565b60019150506109d9565b60ff841115612755576127556125bd565b50506001821b6109d9565b5060208310610133831016604e8410600b8410161715612783575081810a6109d9565b61278d83836126c5565b80600019048211156127a1576127a16125bd565b029392505050565b60006109d660ff841683612708565b6000828210156127ca576127ca6125bd565b500390565b6000602082840312156127e157600080fd5b8151801515811461251e57600080fd5b6000600019821415612805576128056125bd565b5060010190565b606081526000845180606084015260005b8181101561283a576020818801810151608086840101520161281d565b8181111561284c576000608083860101525b5060208301949094525060408101919091526080601f909201601f1916010191905056fe546f6b656e20746f20636c61696d2025732c20636f6e74726163742062616c616e6365202573a26469706673582212207a049aa8ed7f92dc9fece9e2e3cb919b8319728fa23623600cb44d0574b1ec6264736f6c634300080c0033000000000000000000000000bded8a4dc74a940eab68703167db89b1712b68ea000000000000000000000000112b08621e27e10773ec95d250604a041f36c5820000000000000000000000000000000000000000000000000000000000000000
Deployed Bytecode
0x608060405234801561001057600080fd5b50600436106102925760003560e01c806382bfefc811610160578063b6c97aed116100d8578063e00dd1611161008c578063f2fde38b11610071578063f2fde38b14610627578063f7c618c11461063a578063f8c712541461066157600080fd5b8063e00dd16114610608578063e30c39781461061657600080fd5b8063bdd071fb116100bd578063bdd071fb146105be578063c7b8981c146105d1578063d8b95bf0146105d957600080fd5b8063b6c97aed14610598578063b746b5d1146105ab57600080fd5b80638aa24f1f1161012f578063a522bbaa11610114578063a522bbaa1461055f578063ab03488114610572578063b6b55f251461058557600080fd5b80638aa24f1f146105175780638da5cb5b1461054e57600080fd5b806382bfefc81461048a57806383e575cf146104b15780638456cb59146104d8578063892844c5146104e057600080fd5b80635c975abb1161020e57806378393aeb116101c257806379ba5097116101a757806379ba5097146104675780637c14e07b1461046f5780637d9d56071461047757600080fd5b806378393aeb146103fd5780637966593b1461041057600080fd5b80635ff41794116101f35780635ff41794146103a957806370a08231146103e2578063715018a6146103f557600080fd5b80635c975abb146103845780635ccea232146103a157600080fd5b806337980447116102655780633f4ba83a1161024a5780633f4ba83a1461033e57806347ac8092146103465780634f5a9a821461037157600080fd5b8063379804471461031857806338ed9c991461032b57600080fd5b8063092358fd146102975780631c39c38d146102c257806329cb924d146102ed5780632e1a7d4d14610303575b600080fd5b6102aa6102a53660046123fa565b610681565b6040516102b99392919061243d565b60405180910390f35b6002546102d5906001600160a01b031681565b6040516001600160a01b0390911681526020016102b9565b6102f56108bd565b6040519081526020016102b9565b61031661031136600461249c565b610952565b005b6102f56103263660046124b5565b610994565b6102f56103393660046124f5565b6109df565b610316610a35565b61035961035436600461249c565b610a47565b6040516001600160601b0390911681526020016102b9565b6102f561037f366004612525565b610a8a565b600154600160a01b900460ff1660405190151581526020016102b9565b6003546102f5565b6103d07f000000000000000000000000000000000000000000000000000000000000000981565b60405160ff90911681526020016102b9565b6102f56103f036600461254f565b610b61565b610316610b93565b61031661040b36600461256a565b610ba5565b61042361041e36600461256a565b610e44565b6040516102b99190600060a0820190508251151582526020830151602083015260408301516040830152606083015160608301526080830151608083015292915050565b610316610f43565b6103d0600981565b6102f56104853660046124f5565b610fd1565b6102d57f000000000000000000000000bded8a4dc74a940eab68703167db89b1712b68ea81565b6103d07f000000000000000000000000000000000000000000000000000000000000000881565b61031661100a565b6102f56104ee36600461254f565b6001600160a01b0316600090815260046020526040902054640100000000900463ffffffff1690565b61053b61052536600461254f565b60066020526000908152604090205461ffff1681565b60405161ffff90911681526020016102b9565b6000546001600160a01b03166102d5565b61031661056d36600461256a565b61101a565b6102f56105803660046124b5565b611091565b61031661059336600461249c565b6110c4565b6102f56105a6366004612585565b6111e1565b6103596105b936600461249c565b611276565b6103166105cc366004612585565b6112a3565b610316611621565b6102f56105e736600461254f565b6001600160a01b031660009081526004602052604090205463ffffffff1690565b60055461053b9061ffff1681565b6001546001600160a01b03166102d5565b61031661063536600461254f565b61179a565b6102d57f000000000000000000000000112b08621e27e10773ec95d250604a041f36c58281565b61066c63ffffffff81565b60405163ffffffff90911681526020016102b9565b600060606000808461ffff1667ffffffffffffffff8111156106a5576106a56125a7565b6040519080825280602002602001820160405280156106ce578160200160208202803683370190505b506001600160a01b038816600090815260066020908152604080832054600554825160a081018452858152938401859052918301849052606083018490526080830184905293945091928392839261ffff928316929182169184908d1684106107375783610739565b8c5b90505b8261ffff168161ffff16116108865761ffff808216600090815260076020908152604091829020825160a081018452905460ff811615158252610100810490941691810182905263ffffffff6301000000850416928101929092526001600160601b03670100000000000000840481166060840152600160981b909304909216608082015292506107cc57610886565b81516108605760006107e28f8460400151611091565b90506107f18360800151610fd1565b816107ff85606001516109df565b61080991906125d3565b61081391906125f2565b61081d9089612614565b97508260200151898861ffff168151811061083a5761083a61262c565b61ffff90921660209283029190910182015283015195508661085b81612642565b975050505b8b61ffff168661ffff161061087457610886565b8061087e81612642565b91505061073c565b5085156108a9576103e861089c876103e36125d3565b6108a691906125f2565b95505b50939b949a50909850929650505050505050565b6002546000906001600160a01b03161561094d57600260009054906101000a90046001600160a01b03166001600160a01b03166329cb924d6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610924573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109489190612664565b905090565b504290565b61095c3382611875565b60055461096e9061ffff16600161267d565b336000908152600660205260409020805461ffff191661ffff9290921691909117905550565b60006109d66109a38484611a3a565b6001600160a01b0385166000908152600460205260409020546104859190600160a01b90046001600160601b03166126a3565b90505b92915050565b60006109ed6009600a6127a9565b610a187f0000000000000000000000000000000000000000000000000000000000000008600a6127a9565b610a2b906001600160601b0385166125d3565b6109d991906125f2565b610a3d611b1d565b610a45611b77565b565b6000610a747f0000000000000000000000000000000000000000000000000000000000000009600a6127a9565b610a806009600a6127a9565b610a2b90846125d3565b6001600160a01b03821660009081526004602090815260408083208151608081018352905463ffffffff80821683526401000000008204169382018490526001600160601b03600160401b8204811693830193909352600160a01b9004909116606082015290801580610b08575060408201516001600160601b0316155b15610b1957612710925050506109d9565b62278d0081610b2c8663ffffffff611bcc565b610b3691906127b8565b610b42906113886125d3565b610b4c91906125f2565b610b5890612710612614565b95945050505050565b6001600160a01b0381166000908152600460205260408120546109d990600160401b90046001600160601b0316610fd1565b610b9b611b1d565b610a456000611be2565b610bad611b1d565b61ffff811660009081526007602052604090205460ff1615610c165760405162461bcd60e51b815260206004820152601f60248201527f526577617264206465706f73697420616c72656164792063616e63656c65640060448201526064015b60405180910390fd5b61ffff8116600090815260076020526040808220805460ff19166001179055516370a0823160e01b81523060048201526001600160a01b037f000000000000000000000000112b08621e27e10773ec95d250604a041f36c58216906370a0823190602401602060405180830381865afa158015610c97573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610cbb9190612664565b60055461ffff16600090815260076020526040812054919250907f000000000000000000000000112b08621e27e10773ec95d250604a041f36c5826001600160a01b03169063a9059cbb903390610d2f90610d299067010000000000000090046001600160601b03166109df565b86611bcc565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e085901b1681526001600160a01b03909216600483015260248201526044016020604051808303816000875af1158015610d92573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610db691906127cf565b905080610e055760405162461bcd60e51b815260206004820152601960248201527f4572726f72207472616e7366657272696e6720746f6b656e73000000000000006044820152606401610c0d565b60405161ffff8416815233907f806a9add4f7fa62f0b0f6862e74ed8d56b2efd3a6477c97886498940eca095d5906020015b60405180910390a2505050565b610e786040518060a00160405280600015158152602001600081526020016000815260200160008152602001600081525090565b61ffff808316600090815260076020908152604091829020825160a08082018552915460ff8116151582526101008104861682850190815263ffffffff6301000000830481168488019081526001600160601b03670100000000000000850481166060808801918252600160981b909604909116608087015288519687018952855115158752925190981695850195909552955190931693820193909352925191929190820190610f28906109df565b8152602001610f3a8360800151610fd1565b90529392505050565b60015433906001600160a01b03168114610fc55760405162461bcd60e51b815260206004820152602960248201527f4f776e61626c6532537465703a2063616c6c6572206973206e6f74207468652060448201527f6e6577206f776e657200000000000000000000000000000000000000000000006064820152608401610c0d565b610fce81611be2565b50565b6000610fdf6009600a6127a9565b610a187f0000000000000000000000000000000000000000000000000000000000000009600a6127a9565b611012611b1d565b610a45611c08565b60008061102933600085610681565b925050915060008161ffff16116110825760405162461bcd60e51b815260206004820152601960248201527f5468657265206973206e6f7468696e6720746f20636c61696d000000000000006044820152606401610c0d565b61108c8282611c4b565b505050565b60006127106110a6848463ffffffff16610a8a565b6110b08585610994565b6110ba91906125d3565b6109d691906125f2565b3360009081526006602052604090205461ffff1680611117576005546110ef9061ffff16600161267d565b336000908152600660205260409020805461ffff191661ffff929092169190911790556111d3565b60055461ffff908116908216116111d357600080600061113b336000610190610681565b925092509250816001835161115091906127b8565b815181106111605761116061262c565b602002602001015161ffff166000146111bb5760405162461bcd60e51b815260206004820152601f60248201527f596f75206861766520746f20636c61696d2072657761726473206669727374006044820152606401610c0d565b61ffff8116156111cf576111cf8382611c4b565b5050505b6111dd3383611f2b565b5050565b600080806111ed6108bd565b9050845b60035481101561126c57841580159061121357508461121087836127b8565b10155b1561121d5761126c565b61124e600382815481106112335761123361262c565b6000918252602090912001546001600160a01b031683611091565b6112589084612614565b925080611264816127f1565b9150506111f1565b5090949350505050565b6000610a747f0000000000000000000000000000000000000000000000000000000000000008600a6127a9565b6112ab611b1d565b6040517fdd62ed3e00000000000000000000000000000000000000000000000000000000815233600482015230602482015282907f000000000000000000000000112b08621e27e10773ec95d250604a041f36c5826001600160a01b03169063dd62ed3e90604401602060405180830381865afa158015611330573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113549190612664565b10156113a25760405162461bcd60e51b815260206004820152601460248201527f416c6c6f77616e6365206e6f7420656e6f7567680000000000000000000000006044820152606401610c0d565b6005805461ffff169060006113b683612642565b825461010092830a61ffff8181021990921692821602919091179092556005549091166000818152600760205260409020805462ffff001916919092021790555061140082611276565b60055461ffff16600090815260076020526040902080546001600160601b0392909216670100000000000000027fffffffffffffffffffffffffff000000000000000000000000ffffffffffffff90921691909117905561146081610a47565b60055461ffff16600090815260076020526040902080546001600160601b0392909216600160981b027fff000000000000000000000000ffffffffffffffffffffffffffffffffffffff9092169190911790556114bb6108bd565b60055461ffff16600090815260076020526040808220805463ffffffff9490941663010000000266ffffffff000000199094169390931790925590516323b872dd60e01b8152336004820152306024820152604481018490526001600160a01b037f000000000000000000000000112b08621e27e10773ec95d250604a041f36c58216906323b872dd906064016020604051808303816000875af1158015611567573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061158b91906127cf565b9050806115da5760405162461bcd60e51b815260206004820152601960248201527f4572726f72207472616e7366657272696e6720746f6b656e73000000000000006044820152606401610c0d565b600554604080518581526020810185905261ffff9092169082015233907f8c39852a077723f57930139d1fc5f7390505c947cd53471a68fee798aba4cd2c90606001610e37565b611629611b1d565b6040516370a0823160e01b81523060048201526000907f000000000000000000000000112b08621e27e10773ec95d250604a041f36c5826001600160a01b0316906370a0823190602401602060405180830381865afa158015611690573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116b49190612664565b60405163a9059cbb60e01b8152336004820152602481018290529091506000906001600160a01b037f000000000000000000000000112b08621e27e10773ec95d250604a041f36c582169063a9059cbb906044016020604051808303816000875af1158015611727573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061174b91906127cf565b9050806111dd5760405162461bcd60e51b815260206004820152601960248201527f4572726f72207472616e7366657272696e6720746f6b656e73000000000000006044820152606401610c0d565b6117a2611b1d565b600180546001600160a01b03831673ffffffffffffffffffffffffffffffffffffffff1990911681179091556117e06000546001600160a01b031690565b6001600160a01b03167f38d16b8cac22d99fc7c124b9cd0de2d3fa1faef420bfe791d8c362d765e2270060405160405180910390a350565b600080546001600160a01b0383811673ffffffffffffffffffffffffffffffffffffffff19831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b600061188082610a47565b9050600061188c6108bd565b90506118988482612098565b6001600160a01b038416600090815260046020526040902080546001600160601b03808516600160401b9092041610156118fe576040517ff4d678b800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8054600160401b6001600160a01b0363ffffffff8581166401000000000282811673ffffffffffffffffffffffff00000000ffffffff8616178490046001600160601b039081168990031690930267ffffffffffffffff9390931693169290921717825560405163a9059cbb60e01b81528682166004820152602481018690527f000000000000000000000000bded8a4dc74a940eab68703167db89b1712b68ea9091169063a9059cbb906044016020604051808303816000875af11580156119cb573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119ef91906127cf565b50846001600160a01b03167f884edad9ce6fa2440d8a54cc123490eb96d2768479d49ff9c7366125a942436485604051611a2b91815260200190565b60405180910390a25050505050565b6001600160a01b03821660009081526004602090815260408083208151608081018352905463ffffffff80821680845264010000000083048216958401959095526001600160601b03600160401b8304811694840194909452600160a01b9091049092166060820152918390611ab09083611bcc565b90506000611aca8663ffffffff168463ffffffff16611bcc565b9050611ada612710610e106125d3565b611ae483836127b8565b611af0906127106125d3565b85604001516001600160601b0316611b0891906125d3565b611b1291906125f2565b979650505050505050565b6000546001600160a01b03163314610a455760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610c0d565b611b7f61211b565b6001805460ff60a01b191690557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa335b6040516001600160a01b03909116815260200160405180910390a1565b6000818310611bdb57816109d6565b5090919050565b6001805473ffffffffffffffffffffffffffffffffffffffff19169055610fce81611818565b611c10612174565b6001805460ff60a01b1916600160a01b1790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a258611baf3390565b60008161ffff1611611c9f5760405162461bcd60e51b815260206004820152601960248201527f5468657265206973206e6f7468696e6720746f20636c61696d000000000000006044820152606401610c0d565b611caa81600161267d565b336000908152600660205260409020805461ffff191661ffff929092169190911790558115611ede576040516370a0823160e01b81523060048201526000907f000000000000000000000000112b08621e27e10773ec95d250604a041f36c5826001600160a01b0316906370a0823190602401602060405180830381865afa158015611d3a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611d5e9190612664565b9050611d836040518060600160405280602681526020016128716026913984836121ce565b828111611df85760405162461bcd60e51b815260206004820152602b60248201527f5468657265206973206e6f7420656e6f75676820746f6b656e732c207761697460448201527f20666f7220726566696c6c0000000000000000000000000000000000000000006064820152608401610c0d565b60405163a9059cbb60e01b8152336004820152602481018490526000907f000000000000000000000000112b08621e27e10773ec95d250604a041f36c5826001600160a01b03169063a9059cbb906044016020604051808303816000875af1158015611e68573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e8c91906127cf565b905080611edb5760405162461bcd60e51b815260206004820152601960248201527f4572726f72207472616e7366657272696e6720746f6b656e73000000000000006044820152606401610c0d565b50505b337f674a8930d4166ce2352c3dc1e9ff633595db479f71f3741270a0a73a52cb7b0f83611f0c84600161267d565b6040805192835261ffff90911660208301520160405180910390a25050565b60008111611fa15760405162461bcd60e51b815260206004820152603560248201527f596f7520666f72676f7420746f20696e6469636174652074686520616d6f756e60448201527f7420796f752077616e7420746f206465706f73697400000000000000000000006064820152608401610c0d565b611fab8282612243565b6040516323b872dd60e01b81526001600160a01b038381166004830152306024830152604482018390526000917f000000000000000000000000bded8a4dc74a940eab68703167db89b1712b68ea909116906323b872dd906064016020604051808303816000875af1158015612025573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061204991906127cf565b90508061108c5760405162461bcd60e51b815260206004820152601960248201527f4572726f72207472616e7366657272696e6720746f6b656e73000000000000006044820152606401610c0d565b6001600160a01b03821660009081526004602052604090206120ba8383611a3a565b815482906014906120dc908490600160a01b90046001600160601b03166126a3565b82546001600160601b039182166101009390930a928302919092021990911617905550805463ffffffff90921663ffffffff1990921691909117905550565b600154600160a01b900460ff16610a455760405162461bcd60e51b815260206004820152601460248201527f5061757361626c653a206e6f74207061757365640000000000000000000000006044820152606401610c0d565b600154600160a01b900460ff1615610a455760405162461bcd60e51b815260206004820152601060248201527f5061757361626c653a20706175736564000000000000000000000000000000006044820152606401610c0d565b61108c8383836040516024016121e69392919061280c565b60408051601f198184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fca47c4eb000000000000000000000000000000000000000000000000000000001790526123ab565b61224b612174565b60006122556108bd565b6001600160a01b0384166000908152600460205260409020805491925090640100000000900463ffffffff166122a457805467ffffffff00000000191664010000000063ffffffff8416021781555b805463ffffffff1661230957600380546001810182556000919091527fc2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85b01805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b0386161790555b6123138483612098565b61231c83610a47565b8154829060089061233e908490600160401b90046001600160601b03166126a3565b92506101000a8154816001600160601b0302191690836001600160601b03160217905550836001600160a01b03167fe1fffcc4923d04b559f4d29a8bfc6cda04eb5b0d3c460751c2402c5c5cc9109c8460405161239d91815260200190565b60405180910390a250505050565b60006a636f6e736f6c652e6c6f679050600080835160208501845afa505050565b80356001600160a01b03811681146123e357600080fd5b919050565b803561ffff811681146123e357600080fd5b60008060006060848603121561240f57600080fd5b612418846123cc565b9250612426602085016123e8565b9150612434604085016123e8565b90509250925092565b6000606082018583526020606081850152818651808452608086019150828801935060005b8181101561248257845161ffff1683529383019391830191600101612462565b505080935050505061ffff83166040830152949350505050565b6000602082840312156124ae57600080fd5b5035919050565b600080604083850312156124c857600080fd5b6124d1836123cc565b9150602083013563ffffffff811681146124ea57600080fd5b809150509250929050565b60006020828403121561250757600080fd5b81356001600160601b038116811461251e57600080fd5b9392505050565b6000806040838503121561253857600080fd5b612541836123cc565b946020939093013593505050565b60006020828403121561256157600080fd5b6109d6826123cc565b60006020828403121561257c57600080fd5b6109d6826123e8565b6000806040838503121561259857600080fd5b50508035926020909101359150565b634e487b7160e01b600052604160045260246000fd5b634e487b7160e01b600052601160045260246000fd5b60008160001904831182151516156125ed576125ed6125bd565b500290565b60008261260f57634e487b7160e01b600052601260045260246000fd5b500490565b60008219821115612627576126276125bd565b500190565b634e487b7160e01b600052603260045260246000fd5b600061ffff8083168181141561265a5761265a6125bd565b6001019392505050565b60006020828403121561267657600080fd5b5051919050565b600061ffff80831681851680830382111561269a5761269a6125bd565b01949350505050565b60006001600160601b0380831681851680830382111561269a5761269a6125bd565b600181815b808511156127005781600019048211156126e6576126e66125bd565b808516156126f357918102915b93841c93908002906126ca565b509250929050565b600082612717575060016109d9565b81612724575060006109d9565b816001811461273a576002811461274457612760565b60019150506109d9565b60ff841115612755576127556125bd565b50506001821b6109d9565b5060208310610133831016604e8410600b8410161715612783575081810a6109d9565b61278d83836126c5565b80600019048211156127a1576127a16125bd565b029392505050565b60006109d660ff841683612708565b6000828210156127ca576127ca6125bd565b500390565b6000602082840312156127e157600080fd5b8151801515811461251e57600080fd5b6000600019821415612805576128056125bd565b5060010190565b606081526000845180606084015260005b8181101561283a576020818801810151608086840101520161281d565b8181111561284c576000608083860101525b5060208301949094525060408101919091526080601f909201601f1916010191905056fe546f6b656e20746f20636c61696d2025732c20636f6e74726163742062616c616e6365202573a26469706673582212207a049aa8ed7f92dc9fece9e2e3cb919b8319728fa23623600cb44d0574b1ec6264736f6c634300080c0033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
000000000000000000000000bded8a4dc74a940eab68703167db89b1712b68ea000000000000000000000000112b08621e27e10773ec95d250604a041f36c5820000000000000000000000000000000000000000000000000000000000000000
-----Decoded View---------------
Arg [0] : token (address): 0xbded8a4DC74A940EAb68703167dB89b1712B68ea
Arg [1] : _reward (address): 0x112b08621E27e10773ec95d250604a041f36C582
Arg [2] : timerAddr (address): 0x0000000000000000000000000000000000000000
-----Encoded View---------------
3 Constructor Arguments found :
Arg [0] : 000000000000000000000000bded8a4dc74a940eab68703167db89b1712b68ea
Arg [1] : 000000000000000000000000112b08621e27e10773ec95d250604a041f36c582
Arg [2] : 0000000000000000000000000000000000000000000000000000000000000000
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 26 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|---|---|---|---|---|
ETH | 100.00% | $0.161289 | 14,626.9218 | $2,359.16 |
Loading...
Loading
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.