More Info
Private Name Tags
ContractCreator
Latest 25 from a total of 876 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
Value | ||||
---|---|---|---|---|---|---|---|---|---|
Request Withdraw... | 20227597 | 2 days ago | IN | 0 ETH | 0.0003426 | ||||
Request Withdraw... | 20226989 | 2 days ago | IN | 0 ETH | 0.00065145 | ||||
Restake | 20226983 | 2 days ago | IN | 0 ETH | 0.00062102 | ||||
Stake | 20203910 | 5 days ago | IN | 0 ETH | 0.00017016 | ||||
Withdraw | 20155019 | 12 days ago | IN | 0 ETH | 0.00020211 | ||||
Withdraw | 20138040 | 15 days ago | IN | 0 ETH | 0.00019667 | ||||
Request Withdraw... | 20056639 | 26 days ago | IN | 0 ETH | 0.00028915 | ||||
Request Withdraw... | 20006315 | 33 days ago | IN | 0 ETH | 0.00034578 | ||||
Restake | 20006307 | 33 days ago | IN | 0 ETH | 0.00031952 | ||||
Claim Early | 19953015 | 40 days ago | IN | 0 ETH | 0.00026666 | ||||
Withdraw | 19925443 | 44 days ago | IN | 0 ETH | 0.00074648 | ||||
Withdraw | 19909659 | 46 days ago | IN | 0 ETH | 0.00020703 | ||||
Request Withdraw... | 19908055 | 47 days ago | IN | 0 ETH | 0.00008699 | ||||
Claim | 19864197 | 53 days ago | IN | 0 ETH | 0.00023358 | ||||
Request Withdraw... | 19836963 | 57 days ago | IN | 0 ETH | 0.00009085 | ||||
Request Withdraw... | 19790939 | 63 days ago | IN | 0 ETH | 0.00026677 | ||||
Restake | 19790921 | 63 days ago | IN | 0 ETH | 0.00024039 | ||||
Claim | 19761716 | 67 days ago | IN | 0 ETH | 0.00074066 | ||||
Withdraw | 19705378 | 75 days ago | IN | 0 ETH | 0.00055702 | ||||
Request Withdraw... | 19699328 | 76 days ago | IN | 0 ETH | 0.00018272 | ||||
Request Withdraw... | 19677845 | 79 days ago | IN | 0 ETH | 0.00041948 | ||||
Claim | 19659787 | 81 days ago | IN | 0 ETH | 0.00085008 | ||||
Withdraw | 19640492 | 84 days ago | IN | 0 ETH | 0.00166057 | ||||
Request Withdraw... | 19626400 | 86 days ago | IN | 0 ETH | 0.00076937 | ||||
Withdraw | 19620754 | 87 days ago | IN | 0 ETH | 0.00136345 |
View more zero value Internal Transactions in Advanced View mode
Advanced mode:
Loading...
Loading
Contract Name:
BulkStaking
Compiler Version
v0.7.6+commit.7338295f
Optimization Enabled:
Yes with 999999 runs
Other Settings:
default evmVersion
Contract Source Code (Solidity Standard Json-Input format)
// SPDX-License-Identifier: MIT pragma solidity 0.7.6; pragma abicoder v2; import '@openzeppelin/contracts/token/ERC20/SafeERC20.sol'; import '@openzeppelin/contracts/math/Math.sol'; import '@openzeppelin/contracts/math/SafeMath.sol'; import '@openzeppelin/contracts/access/Ownable.sol'; import './Readable.sol'; contract BulkStaking is Ownable, Readable { using SafeMath for *; using ExtraMath for *; using SafeERC20 for IERC20; IERC20 immutable public BULK; // Release date 1628164800 is August 5th 2021, 12:00:00. uint public constant RELEASE_DATE = 1628164800; // 20% unlocked on release date. 375 days total. uint public constant STRATEGIC = RELEASE_DATE - 75 days; uint public constant STRATEGIC_PERIOD = 375 days; // 25% unlocked on release date. 400 days total. uint public constant PRIVATE = RELEASE_DATE - 100 days; uint public constant PRIVATE_PERIOD = 400 days; // Full release date 1654084800 is June 1st 2022, 12:00:00. // 5% unlocked on release date. 600 days total. uint public constant INSTITUTIONAL = RELEASE_DATE - 30 days; uint public constant INSTITUTIONAL_PERIOD = 600 days; // Full release date 1677412800 is February 26th 2023, 12:00:00. uint public constant WITHDRAW_TIMEOUT = 30 days; struct Lock { uint128 strategicSale; uint128 privateSale; uint128 institutionalSale; uint128 claimed; uint88 secondary; uint88 requested; uint32 readyAt; } struct DB { mapping(address => Lock) locked; uint totalBalance; } DB internal db; constructor(IERC20 bulk, address newOwner) { BULK = bulk; transferOwnership(newOwner); } function getUserInfo(address who) external view returns(Lock memory) { return db.locked[who]; } function getTotalBalance() external view returns(uint) { return db.totalBalance; } function calcualteReleased(uint amount, uint releaseStart, uint releasePeriod) private view returns(uint) { uint released = amount.mul(since(releaseStart)) / releasePeriod; return Math.min(amount, released); } function availableToClaim(address who) public view returns(uint) { if (not(reached(RELEASE_DATE))) { return 0; } Lock memory user = db.locked[who]; uint releasedStrategic = calcualteReleased( user.strategicSale, STRATEGIC, STRATEGIC_PERIOD); uint releasedPrivate = calcualteReleased( user.privateSale, PRIVATE, PRIVATE_PERIOD); uint releasedInstitutional = calcualteReleased( user.institutionalSale, INSTITUTIONAL, INSTITUTIONAL_PERIOD); uint released = releasedStrategic.add(releasedPrivate).add(releasedInstitutional); if (user.claimed >= released) { return 0; } return released.sub(user.claimed); } function availableToWithdraw(address who) public view returns(uint) { Lock storage user = db.locked[who]; uint readyAt = user.readyAt; uint requested = user.requested; if (readyAt > 0 && passed(readyAt)) { return requested; } return 0; } function balanceOf(address who) external view returns(uint) { Lock memory user = db.locked[who]; return user.strategicSale.add(user.privateSale).add(user.institutionalSale) .add(user.secondary).sub(user.claimed).sub(availableToWithdraw(who)); } function assignStrategic(address[] calldata tos, uint[] calldata amounts) external onlyOwner { uint len = tos.length; require(len == amounts.length, 'Invalid input'); uint total = 0; for (uint i = 0; i < len; i++) { address to = tos[i]; uint amount = amounts[i]; db.locked[to].strategicSale = db.locked[to].strategicSale.add(amount).toUInt128(); total = total.add(amount); emit StrategicAssigned(to, amount); } db.totalBalance = db.totalBalance.add(total); BULK.safeTransferFrom(msg.sender, address(this), total); } function assignPrivate(address[] calldata tos, uint[] calldata amounts) external onlyOwner { uint len = tos.length; require(len == amounts.length, 'Invalid input'); uint total = 0; for (uint i = 0; i < len; i++) { address to = tos[i]; uint amount = amounts[i]; db.locked[to].privateSale = db.locked[to].privateSale.add(amount).toUInt128(); total = total.add(amount); emit PrivateAssigned(to, amount); } db.totalBalance = db.totalBalance.add(total); BULK.safeTransferFrom(msg.sender, address(this), total); } function assignInstitutional(address[] calldata tos, uint[] calldata amounts) external onlyOwner { uint len = tos.length; require(len == amounts.length, 'Invalid input'); uint total = 0; for (uint i = 0; i < len; i++) { address to = tos[i]; uint amount = amounts[i]; db.locked[to].institutionalSale = db.locked[to].institutionalSale.add(amount).toUInt128(); total = total.add(amount); emit InstitutionalAssigned(to, amount); } db.totalBalance = db.totalBalance.add(total); BULK.safeTransferFrom(msg.sender, address(this), total); } function claim() public { uint claimable = availableToClaim(msg.sender); require(claimable > 0, 'Nothing to claim'); Lock storage user = db.locked[msg.sender]; user.claimed = user.claimed.add(claimable).toUInt128(); db.totalBalance = db.totalBalance.sub(claimable); BULK.safeTransfer(msg.sender, claimable); emit Claimed(msg.sender, claimable); } function stake(uint amount) external { Lock storage user = db.locked[msg.sender]; user.secondary = user.secondary.add(amount).toUInt88(); user.readyAt = 0; user.requested = 0; db.totalBalance = db.totalBalance.add(amount); BULK.safeTransferFrom(msg.sender, address(this), amount); emit Staked(msg.sender, amount); } function restake() external { Lock storage user = db.locked[msg.sender]; uint requested = user.requested; user.readyAt = 0; user.requested = 0; emit Restaked(msg.sender, requested); } function requestWithdrawal(uint amount) external { require(amount > 0, 'Amount must be positive'); if(availableToWithdraw(msg.sender) > 0) { withdraw(); } Lock storage user = db.locked[msg.sender]; uint readyAt = user.readyAt; uint requested = user.requested; uint newRequested = requested.add(amount); require(user.secondary >= newRequested, 'Insufficient balance to withdraw'); uint timeLeft = till(readyAt).mul(requested).add( amount.mul(WITHDRAW_TIMEOUT)).div(newRequested); uint newReadyAt = block.timestamp.add(timeLeft); user.readyAt = newReadyAt.toUInt32(); user.requested = newRequested.toUInt88(); emit WithdrawRequested(msg.sender, amount, newReadyAt); } function withdraw() public { uint withdrawable = availableToWithdraw(msg.sender); require(withdrawable > 0, 'Nothing to withdraw'); Lock storage user = db.locked[msg.sender]; user.secondary = user.secondary.sub(withdrawable).toUInt88(); user.readyAt = 0; user.requested = 0; db.totalBalance = db.totalBalance.sub(withdrawable); BULK.safeTransfer(msg.sender, withdrawable); emit Withdrawn(msg.sender, withdrawable); } function withdrawEarly(address who, uint amount) external onlyOwner { Lock storage user = db.locked[who]; user.secondary = user.secondary.sub(amount).toUInt88(); user.readyAt = 0; user.requested = 0; db.totalBalance = db.totalBalance.sub(amount); BULK.safeTransfer(msg.sender, amount); emit WithdrawnEarly(who, amount); } function claimEarly(address who, uint amount) external onlyOwner { Lock storage user = db.locked[who]; Lock memory userData = user; uint unclaimed = userData.strategicSale.add(userData.privateSale) .add(userData.institutionalSale).sub(userData.claimed); require(amount <= unclaimed, 'Insufficient unclaimed'); user.claimed = user.claimed.add(amount).toUInt128(); db.totalBalance = db.totalBalance.sub(amount); BULK.safeTransfer(msg.sender, amount); emit ClaimedEarly(who, amount); } function claimAndWithdraw() external { claim(); if (availableToWithdraw(msg.sender) == 0) { return; } withdraw(); } function recover(IERC20 token, address to, uint amount) external onlyOwner { if (token == BULK) { require(BULK.balanceOf(address(this)).sub(db.totalBalance) >= amount, 'Not enough to recover'); } token.safeTransfer(to, amount); emit Recovered(token, to, amount); } event StrategicAssigned(address user, uint amount); event PrivateAssigned(address user, uint amount); event InstitutionalAssigned(address user, uint amount); event Claimed(address user, uint amount); event Staked(address user, uint amount); event Restaked(address user, uint amount); event WithdrawRequested(address user, uint amount, uint readyAt); event Withdrawn(address user, uint amount); event WithdrawnEarly(address user, uint amount); event ClaimedEarly(address user, uint amount); event Recovered(IERC20 token, address to, uint amount); }
// SPDX-License-Identifier: MIT pragma solidity >=0.6.0 <0.8.0; import "./IERC20.sol"; import "../../math/SafeMath.sol"; import "../../utils/Address.sol"; /** * @title SafeERC20 * @dev Wrappers around ERC20 operations that throw on failure (when the token * contract returns false). Tokens that return no value (and instead revert or * throw on failure) are also supported, non-reverting calls are assumed to be * successful. * To use this library you can add a `using SafeERC20 for IERC20;` statement to your contract, * which allows you to call the safe operations as `token.safeTransfer(...)`, etc. */ library SafeERC20 { using SafeMath for uint256; using Address for address; function safeTransfer(IERC20 token, address to, uint256 value) internal { _callOptionalReturn(token, abi.encodeWithSelector(token.transfer.selector, to, value)); } function safeTransferFrom(IERC20 token, address from, address to, uint256 value) internal { _callOptionalReturn(token, abi.encodeWithSelector(token.transferFrom.selector, from, to, value)); } /** * @dev Deprecated. This function has issues similar to the ones found in * {IERC20-approve}, and its usage is discouraged. * * Whenever possible, use {safeIncreaseAllowance} and * {safeDecreaseAllowance} instead. */ function safeApprove(IERC20 token, address spender, uint256 value) internal { // safeApprove should only be called when setting an initial allowance, // or when resetting it to zero. To increase and decrease it, use // 'safeIncreaseAllowance' and 'safeDecreaseAllowance' // solhint-disable-next-line max-line-length require((value == 0) || (token.allowance(address(this), spender) == 0), "SafeERC20: approve from non-zero to non-zero allowance" ); _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, value)); } function safeIncreaseAllowance(IERC20 token, address spender, uint256 value) internal { uint256 newAllowance = token.allowance(address(this), spender).add(value); _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance)); } function safeDecreaseAllowance(IERC20 token, address spender, uint256 value) internal { uint256 newAllowance = token.allowance(address(this), spender).sub(value, "SafeERC20: decreased allowance below zero"); _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance)); } /** * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement * on the return value: the return value is optional (but if data is returned, it must not be false). * @param token The token targeted by the call. * @param data The call data (encoded using abi.encode or one of its variants). */ function _callOptionalReturn(IERC20 token, bytes memory data) private { // We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since // we're implementing it ourselves. We use {Address.functionCall} to perform this call, which verifies that // the target address contains contract code and also asserts for success in the low-level call. bytes memory returndata = address(token).functionCall(data, "SafeERC20: low-level call failed"); if (returndata.length > 0) { // Return data is optional // solhint-disable-next-line max-line-length require(abi.decode(returndata, (bool)), "SafeERC20: ERC20 operation did not succeed"); } } }
// SPDX-License-Identifier: MIT pragma solidity >=0.6.0 <0.8.0; /** * @dev Standard math utilities missing in the Solidity language. */ library Math { /** * @dev Returns the largest of two numbers. */ function max(uint256 a, uint256 b) internal pure returns (uint256) { return a >= b ? a : b; } /** * @dev Returns the smallest of two numbers. */ function min(uint256 a, uint256 b) internal pure returns (uint256) { return a < b ? a : b; } /** * @dev Returns the average of two numbers. The result is rounded towards * zero. */ function average(uint256 a, uint256 b) internal pure returns (uint256) { // (a + b) / 2 can overflow, so we distribute return (a / 2) + (b / 2) + ((a % 2 + b % 2) / 2); } }
// SPDX-License-Identifier: MIT pragma solidity >=0.6.0 <0.8.0; /** * @dev Wrappers over Solidity's arithmetic operations with added overflow * checks. * * Arithmetic operations in Solidity wrap on overflow. This can easily result * in bugs, because programmers usually assume that an overflow raises an * error, which is the standard behavior in high level programming languages. * `SafeMath` restores this intuition by reverting the transaction when an * operation overflows. * * Using this library instead of the unchecked operations eliminates an entire * class of bugs, so it's recommended to use it always. */ library SafeMath { /** * @dev Returns the addition of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) { uint256 c = a + b; if (c < a) return (false, 0); return (true, c); } /** * @dev Returns the substraction of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function trySub(uint256 a, uint256 b) internal pure returns (bool, uint256) { 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) { // 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) { 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) { 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) { uint256 c = a + b; require(c >= a, "SafeMath: addition overflow"); return c; } /** * @dev Returns the subtraction of two unsigned integers, reverting on * overflow (when the result is negative). * * Counterpart to Solidity's `-` operator. * * Requirements: * * - Subtraction cannot overflow. */ function sub(uint256 a, uint256 b) internal pure returns (uint256) { require(b <= a, "SafeMath: subtraction overflow"); 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) { if (a == 0) return 0; uint256 c = a * b; require(c / a == b, "SafeMath: multiplication overflow"); return c; } /** * @dev Returns the integer division of two unsigned integers, reverting on * division by zero. The result is rounded towards zero. * * Counterpart to Solidity's `/` operator. Note: this function uses a * `revert` opcode (which leaves remaining gas untouched) while Solidity * uses an invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function div(uint256 a, uint256 b) internal pure returns (uint256) { require(b > 0, "SafeMath: division by zero"); 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) { require(b > 0, "SafeMath: modulo by zero"); 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) { 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. * * CAUTION: This function is deprecated because it requires allocating memory for the error * message unnecessarily. For custom revert reasons use {tryDiv}. * * Counterpart to Solidity's `/` operator. Note: this function uses a * `revert` opcode (which leaves remaining gas untouched) while Solidity * uses an invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { require(b > 0, errorMessage); 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) { require(b > 0, errorMessage); return a % b; } }
// SPDX-License-Identifier: MIT pragma solidity >=0.6.0 <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 () internal { address msgSender = _msgSender(); _owner = msgSender; emit OwnershipTransferred(address(0), msgSender); } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { require(owner() == _msgSender(), "Ownable: caller is not the owner"); _; } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions anymore. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby removing any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { emit OwnershipTransferred(_owner, address(0)); _owner = address(0); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { require(newOwner != address(0), "Ownable: new owner is the zero address"); emit OwnershipTransferred(_owner, newOwner); _owner = newOwner; } }
// SPDX-License-Identifier: MIT pragma solidity 0.7.6; contract Readable { function since(uint _timestamp) internal view returns(uint) { if (not(passed(_timestamp))) { return 0; } return block.timestamp - _timestamp; } function till(uint _timestamp) internal view returns(uint) { if (passed(_timestamp)) { return 0; } return _timestamp - block.timestamp; } function passed(uint _timestamp) internal view returns(bool) { return _timestamp < block.timestamp; } function reached(uint _timestamp) internal view returns(bool) { return _timestamp <= block.timestamp; } function not(bool _condition) internal pure returns(bool) { return !_condition; } } library ExtraMath { function toUInt32(uint _a) internal pure returns(uint32) { require(_a <= type(uint32).max, 'uint32 overflow'); return uint32(_a); } function toUInt88(uint _a) internal pure returns(uint88) { require(_a <= type(uint88).max, 'uint88 overflow'); return uint88(_a); } function toUInt128(uint _a) internal pure returns(uint128) { require(_a <= type(uint128).max, 'uint128 overflow'); return uint128(_a); } }
// SPDX-License-Identifier: MIT pragma solidity >=0.6.0 <0.8.0; /** * @dev Interface of the ERC20 standard as defined in the EIP. */ interface IERC20 { /** * @dev Returns the amount of tokens in existence. */ function totalSupply() external view returns (uint256); /** * @dev Returns the amount of tokens owned by `account`. */ function balanceOf(address account) external view returns (uint256); /** * @dev Moves `amount` tokens from the caller's account to `recipient`. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transfer(address recipient, uint256 amount) external returns (bool); /** * @dev Returns the remaining number of tokens that `spender` will be * allowed to spend on behalf of `owner` through {transferFrom}. This is * zero by default. * * This value changes when {approve} or {transferFrom} are called. */ function allowance(address owner, address spender) external view returns (uint256); /** * @dev Sets `amount` as the allowance of `spender` over the caller's tokens. * * Returns a boolean value indicating whether the operation succeeded. * * IMPORTANT: Beware that changing an allowance with this method brings the risk * that someone may use both the old and the new allowance by unfortunate * transaction ordering. One possible solution to mitigate this race * condition is to first reduce the spender's allowance to 0 and set the * desired value afterwards: * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 * * Emits an {Approval} event. */ function approve(address spender, uint256 amount) external returns (bool); /** * @dev Moves `amount` tokens from `sender` to `recipient` using the * allowance mechanism. `amount` is then deducted from the caller's * allowance. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transferFrom(address sender, address recipient, uint256 amount) external returns (bool); /** * @dev Emitted when `value` tokens are moved from one account (`from`) to * another (`to`). * * Note that `value` may be zero. */ event Transfer(address indexed from, address indexed to, uint256 value); /** * @dev Emitted when the allowance of a `spender` for an `owner` is set by * a call to {approve}. `value` is the new allowance. */ event Approval(address indexed owner, address indexed spender, uint256 value); }
// SPDX-License-Identifier: MIT pragma solidity >=0.6.2 <0.8.0; /** * @dev Collection of functions related to the address type */ library Address { /** * @dev Returns true if `account` is a contract. * * [IMPORTANT] * ==== * It is unsafe to assume that an address for which this function returns * false is an externally-owned account (EOA) and not a contract. * * Among others, `isContract` will return false for the following * types of addresses: * * - an externally-owned account * - a contract in construction * - an address where a contract will be created * - an address where a contract lived, but was destroyed * ==== */ function isContract(address account) internal view returns (bool) { // This method relies on extcodesize, which returns 0 for contracts in // construction, since the code is only stored at the end of the // constructor execution. uint256 size; // solhint-disable-next-line no-inline-assembly assembly { size := extcodesize(account) } return size > 0; } /** * @dev Replacement for Solidity's `transfer`: sends `amount` wei to * `recipient`, forwarding all available gas and reverting on errors. * * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by `transfer`, making them unable to receive funds via * `transfer`. {sendValue} removes this limitation. * * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. * * IMPORTANT: because control is transferred to `recipient`, care must be * taken to not create reentrancy vulnerabilities. Consider using * {ReentrancyGuard} or the * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { require(address(this).balance >= amount, "Address: insufficient balance"); // solhint-disable-next-line avoid-low-level-calls, avoid-call-value (bool success, ) = recipient.call{ value: amount }(""); require(success, "Address: unable to send value, recipient may have reverted"); } /** * @dev Performs a Solidity function call using a low level `call`. A * plain`call` is an unsafe replacement for a function call: use this * function instead. * * If `target` reverts with a revert reason, it is bubbled up by this * function (like regular Solidity function calls). * * Returns the raw returned data. To convert to the expected return value, * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. * * Requirements: * * - `target` must be a contract. * - calling `target` with `data` must not revert. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCall(target, data, "Address: low-level call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with * `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data, string memory errorMessage) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but also transferring `value` wei to `target`. * * Requirements: * * - the calling contract must have an ETH balance of at least `value`. * - the called Solidity function must be `payable`. * * _Available since v3.1._ */ function functionCallWithValue(address target, bytes memory data, uint256 value) internal returns (bytes memory) { return functionCallWithValue(target, data, value, "Address: low-level call with value failed"); } /** * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but * with `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCallWithValue(address target, bytes memory data, uint256 value, string memory errorMessage) internal returns (bytes memory) { require(address(this).balance >= value, "Address: insufficient balance for call"); require(isContract(target), "Address: call to non-contract"); // solhint-disable-next-line avoid-low-level-calls (bool success, bytes memory returndata) = target.call{ value: value }(data); return _verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) { return functionStaticCall(target, data, "Address: low-level static call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall(address target, bytes memory data, string memory errorMessage) internal view returns (bytes memory) { require(isContract(target), "Address: static call to non-contract"); // solhint-disable-next-line avoid-low-level-calls (bool success, bytes memory returndata) = target.staticcall(data); return _verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { return functionDelegateCall(target, data, "Address: low-level delegate call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall(address target, bytes memory data, string memory errorMessage) internal returns (bytes memory) { require(isContract(target), "Address: delegate call to non-contract"); // solhint-disable-next-line avoid-low-level-calls (bool success, bytes memory returndata) = target.delegatecall(data); return _verifyCallResult(success, returndata, errorMessage); } function _verifyCallResult(bool success, bytes memory returndata, string memory errorMessage) private pure returns(bytes memory) { if (success) { return returndata; } else { // Look for revert reason and bubble it up if present if (returndata.length > 0) { // The easiest way to bubble the revert reason is using memory via assembly // solhint-disable-next-line no-inline-assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } }
// SPDX-License-Identifier: MIT pragma solidity >=0.6.0 <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 GSN meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract Context { function _msgSender() internal view virtual returns (address payable) { return msg.sender; } function _msgData() internal view virtual returns (bytes memory) { this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691 return msg.data; } }
{ "optimizer": { "enabled": true, "runs": 999999 }, "outputSelection": { "*": { "*": [ "evm.bytecode", "evm.deployedBytecode", "abi" ] } }, "libraries": {} }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"contract IERC20","name":"bulk","type":"address"},{"internalType":"address","name":"newOwner","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Claimed","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"ClaimedEarly","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"InstitutionalAssigned","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":"user","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"PrivateAssigned","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"contract IERC20","name":"token","type":"address"},{"indexed":false,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Recovered","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Restaked","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Staked","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"StrategicAssigned","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"readyAt","type":"uint256"}],"name":"WithdrawRequested","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Withdrawn","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"WithdrawnEarly","type":"event"},{"inputs":[],"name":"BULK","outputs":[{"internalType":"contract IERC20","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"INSTITUTIONAL","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"INSTITUTIONAL_PERIOD","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PRIVATE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PRIVATE_PERIOD","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"RELEASE_DATE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"STRATEGIC","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"STRATEGIC_PERIOD","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"WITHDRAW_TIMEOUT","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"tos","type":"address[]"},{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"name":"assignInstitutional","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"tos","type":"address[]"},{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"name":"assignPrivate","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"tos","type":"address[]"},{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"name":"assignStrategic","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"who","type":"address"}],"name":"availableToClaim","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"who","type":"address"}],"name":"availableToWithdraw","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"who","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"claim","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"claimAndWithdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"who","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"claimEarly","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"getTotalBalance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"who","type":"address"}],"name":"getUserInfo","outputs":[{"components":[{"internalType":"uint128","name":"strategicSale","type":"uint128"},{"internalType":"uint128","name":"privateSale","type":"uint128"},{"internalType":"uint128","name":"institutionalSale","type":"uint128"},{"internalType":"uint128","name":"claimed","type":"uint128"},{"internalType":"uint88","name":"secondary","type":"uint88"},{"internalType":"uint88","name":"requested","type":"uint88"},{"internalType":"uint32","name":"readyAt","type":"uint32"}],"internalType":"struct BulkStaking.Lock","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"contract IERC20","name":"token","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"recover","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"requestWithdrawal","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"restake","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"stake","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"who","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"withdrawEarly","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
60a06040523480156200001157600080fd5b506040516200304e3803806200304e8339810160408190526200003491620001bb565b6000620000406200009e565b600080546001600160a01b0319166001600160a01b0383169081178255604051929350916000805160206200302e833981519152908290a3506001600160601b0319606083901b166080526200009681620000a2565b505062000212565b3390565b620000ac6200009e565b6001600160a01b0316620000bf620001ac565b6001600160a01b0316146200011b576040805162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b6001600160a01b038116620001625760405162461bcd60e51b8152600401808060200182810382526026815260200180620030086026913960400191505060405180910390fd5b600080546040516001600160a01b03808516939216916000805160206200302e83398151915291a3600080546001600160a01b0319166001600160a01b0392909216919091179055565b6000546001600160a01b031690565b60008060408385031215620001ce578182fd5b8251620001db81620001f9565b6020840151909250620001ee81620001f9565b809150509250929050565b6001600160a01b03811681146200020f57600080fd5b50565b60805160601c612db0620002586000398061056d52806107fa52806108d4528061096c5280610b9d5280610cf152806114a052806118c15280611b965250612db06000f3fe608060405234801561001057600080fd5b50600436106101cf5760003560e01c80638da5cb5b11610104578063c19cbd48116100a2578063e701708311610071578063e701708314610347578063f1a98e9c1461035a578063f2fde38b14610362578063f7363ecb14610375576101cf565b8063c19cbd4814610311578063c24d187914610324578063c33237a41461032c578063e54868a514610334576101cf565b8063a25db8ce116100de578063a25db8ce146102d0578063a694fc3a146102e3578063aead9e47146102f6578063b66fbdfe146102fe576101cf565b80638da5cb5b146102ad57806398ba5cf1146102b55780639ee679e8146102bd576101cf565b80633ccfd60b1161017157806355072fef1161014b57806355072fef1461026a5780636386c1c71461027257806370a0823114610292578063715018a6146102a5576101cf565b80633ccfd60b146102525780634e71d92d1461025a5780634f91440d14610262576101cf565b806312b58349116101ad57806312b583491461021a57806316287c02146102225780631ec82cb814610237578063309d094b1461024a576101cf565b806306761d3e146101d45780630da45188146101f257806310426c1c14610205575b600080fd5b6101dc61037d565b6040516101e99190612cb5565b60405180910390f35b6101dc6102003660046128ef565b610384565b61020d61056b565b6040516101e99190612a0f565b6101dc61058f565b610235610230366004612936565b610595565b005b61023561024536600461299f565b61082a565b6101dc610a90565b610235610a98565b610235610c01565b610235610d49565b6101dc610dd6565b6102856102803660046128ef565b610dde565b6040516101e99190612c34565b6101dc6102a03660046128ef565b610ebd565b61023561102b565b61020d611142565b6101dc61115e565b6102356102cb3660046129df565b611166565b6101dc6102de3660046128ef565b611353565b6102356102f13660046129df565b6113e7565b6102356114f9565b61023561030c366004612936565b61151d565b61023561031f36600461290b565b61174a565b6101dc611919565b6101dc611921565b61023561034236600461290b565b611929565b610235610355366004612936565b611bfd565b6101dc611e24565b6102356103703660046128ef565b611e2c565b6101dc611fcd565b62278d0081565b600061039b61039663610bd2c0611fd5565b611fdb565b156103a857506000610566565b73ffffffffffffffffffffffffffffffffffffffff82166000908152600160208181526040808420815160e08101835281546fffffffffffffffffffffffffffffffff80821680845270010000000000000000000000000000000092839004821696840196909652958301548087169483019490945290920490931660608201526002909201546affffffffffffffffffffff80821660808501526b01000000000000000000000082041660a0840152760100000000000000000000000000000000000000000000900463ffffffff1660c0830152909190610493906360a8f2406301ee6280611fdf565b905060006104c583602001516fffffffffffffffffffffffffffffffff166283d60063610bd2c00363020f5800611fdf565b905060006104f784604001516fffffffffffffffffffffffffffffffff1662278d0063610bd2c0036303170400611fdf565b9050600061050f826105098686612013565b90612013565b90508085606001516fffffffffffffffffffffffffffffffff161061053c57600095505050505050610566565b606085015161055e9082906fffffffffffffffffffffffffffffffff16612090565b955050505050505b919050565b7f000000000000000000000000000000000000000000000000000000000000000081565b60025490565b61059d612107565b73ffffffffffffffffffffffffffffffffffffffff166105bb611142565b73ffffffffffffffffffffffffffffffffffffffff161461063d57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b82818114610680576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161067790612bc6565b60405180910390fd5b6000805b828110156107cf57600087878381811061069a57fe5b90506020020160208101906106af91906128ef565b905060008686848181106106bf57fe5b73ffffffffffffffffffffffffffffffffffffffff8516600090815260016020818152604090922001549102929092013592506107189161071391506fffffffffffffffffffffffffffffffff1683612013565b61210b565b73ffffffffffffffffffffffffffffffffffffffff831660009081526001602081905260409091200180547fffffffffffffffffffffffffffffffff00000000000000000000000000000000166fffffffffffffffffffffffffffffffff9290921691909117905561078a8482612013565b93507fda5adace4f88f1c56459c909839dafc6209fa4d8e155707e69a87496c3fddbdb82826040516107bd929190612a30565b60405180910390a15050600101610684565b506002546107dd9082612013565b60025561082273ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016333084612190565b505050505050565b610832612107565b73ffffffffffffffffffffffffffffffffffffffff16610850611142565b73ffffffffffffffffffffffffffffffffffffffff16146108d257604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610a2f576002546040517f70a0823100000000000000000000000000000000000000000000000000000000815282916109f79173ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016906370a08231906109a1903090600401612a0f565b60206040518083038186803b1580156109b957600080fd5b505afa1580156109cd573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109f191906129f7565b90612090565b1015610a2f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161067790612ab5565b610a5073ffffffffffffffffffffffffffffffffffffffff8416838361222b565b7ffff3b3844276f57024e0b42afec1a37f75db36511e43819a4f2a63ab7862b648838383604051610a8393929190612a84565b60405180910390a1505050565b63610bd2c081565b6000610aa333611353565b905060008111610adf576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161067790612aec565b3360009081526001602052604090206002810154610b1390610b0e906affffffffffffffffffffff1684612090565b6122bd565b600282810180547fffffffffffffffffffffffffffffffffffffffffff0000000000000000000000166affffffffffffffffffffff93909316929092177fffffffffffff000000000000000000000000000000ffffffffffffffffffffff1690915554610b809083612090565b600255610bc473ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016338461222b565b7f7084f5476618d8e60b11ef0d7d3f06914655adb8793e28ff7f018d4c76d505d53383604051610bf5929190612a30565b60405180910390a15050565b6000610c0c33610384565b905060008111610c48576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161067790612b23565b33600090815260016020819052604090912090810154610c92906107139070010000000000000000000000000000000090046fffffffffffffffffffffffffffffffff1684612013565b6001820180546fffffffffffffffffffffffffffffffff928316700100000000000000000000000000000000029216919091179055600254610cd49083612090565b600255610d1873ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016338461222b565b7fd8138f8a3f377c5259ca548e70e4c2de94f129f5a11036a15b69513cba2b426a3383604051610bf5929190612a30565b33600081815260016020526040908190206002810180547fffffffffffff000000000000000000000000000000ffffffffffffffffffffff8116909155915190926b0100000000000000000000009092046affffffffffffffffffffff16917ffc11547e675aec955dee8afa8fab2509420a3a91ca90e88b9b95db75bdf4c00b91610bf591908490612a30565b636087fcc081565b610de661286a565b5073ffffffffffffffffffffffffffffffffffffffff16600090815260016020818152604092839020835160e08101855281546fffffffffffffffffffffffffffffffff8082168352700100000000000000000000000000000000918290048116948301949094529382015480841695820195909552929093041660608201526002909101546affffffffffffffffffffff80821660808401526b01000000000000000000000082041660a0830152760100000000000000000000000000000000000000000000900463ffffffff1660c082015290565b73ffffffffffffffffffffffffffffffffffffffff81166000908152600160208181526040808420815160e08101835281546fffffffffffffffffffffffffffffffff8082168352700100000000000000000000000000000000918290048116958301959095529482015480851693820193909352939091049091166060830152600201546affffffffffffffffffffff80821660808401526b01000000000000000000000082041660a0830152760100000000000000000000000000000000000000000000900463ffffffff1660c0820152611024610f9c84611353565b6109f183606001516fffffffffffffffffffffffffffffffff166109f185608001516affffffffffffffffffffff1661050987604001516fffffffffffffffffffffffffffffffff1661050989602001516fffffffffffffffffffffffffffffffff168a600001516fffffffffffffffffffffffffffffffff1661201390919063ffffffff16565b9392505050565b611033612107565b73ffffffffffffffffffffffffffffffffffffffff16611051611142565b73ffffffffffffffffffffffffffffffffffffffff16146110d357604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b6000805460405173ffffffffffffffffffffffffffffffffffffffff909116907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600080547fffffffffffffffffffffffff0000000000000000000000000000000000000000169055565b60005473ffffffffffffffffffffffffffffffffffffffff1690565b630317040081565b600081116111a0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161067790612bfd565b60006111ab33611353565b11156111b9576111b9610a98565b3360009081526001602052604081206002810154909163ffffffff76010000000000000000000000000000000000000000000083048116926affffffffffffffffffffff6b01000000000000000000000090910416919061121e908390879061201316565b60028501549091506affffffffffffffffffffff1681111561126c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161067790612b91565b600061129b826112956112828962278d00612339565b6105098761128f8a6123ac565b90612339565b906123cb565b905060006112a94283612013565b90506112b48161244c565b8660020160166101000a81548163ffffffff021916908363ffffffff1602179055506112df836122bd565b86600201600b6101000a8154816affffffffffffffffffffff02191690836affffffffffffffffffffff1602179055507fd72eb5d043f24a0168ae744d5c44f9596fd673a26bf74d9646bff4b844882d1433888360405161134293929190612a56565b60405180910390a150505050505050565b73ffffffffffffffffffffffffffffffffffffffff811660009081526001602052604081206002810154760100000000000000000000000000000000000000000000810463ffffffff16906b01000000000000000000000090046affffffffffffffffffffff1681158015906113cd57506113cd826124c1565b156113dc579250610566915050565b506000949350505050565b336000908152600160205260409020600281015461141690610b0e906affffffffffffffffffffff1684612013565b600282810180547fffffffffffffffffffffffffffffffffffffffffff0000000000000000000000166affffffffffffffffffffff93909316929092177fffffffffffff000000000000000000000000000000ffffffffffffffffffffff16909155546114839083612013565b6002556114c873ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016333085612190565b7f9e71bc8eea02a63969f509818f2dafb9254532904319f9dbda79b67bd34a5f3d3383604051610bf5929190612a30565b611501610c01565b61150a33611353565b6115135761151b565b61151b610a98565b565b611525612107565b73ffffffffffffffffffffffffffffffffffffffff16611543611142565b73ffffffffffffffffffffffffffffffffffffffff16146115c557604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b828181146115ff576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161067790612bc6565b6000805b828110156107cf57600087878381811061161957fe5b905060200201602081019061162e91906128ef565b9050600086868481811061163e57fe5b73ffffffffffffffffffffffffffffffffffffffff85166000908152600160209081526040909120549102929092013592506116a591610713915070010000000000000000000000000000000090046fffffffffffffffffffffffffffffffff1683612013565b73ffffffffffffffffffffffffffffffffffffffff8316600090815260016020526040902080546fffffffffffffffffffffffffffffffff9283167001000000000000000000000000000000000292169190911790556117058482612013565b93507ff9aab938f1f5cac8d8e07824ea4c6bcedea93a6a520ccde8f251b618935ecf538282604051611738929190612a30565b60405180910390a15050600101611603565b611752612107565b73ffffffffffffffffffffffffffffffffffffffff16611770611142565b73ffffffffffffffffffffffffffffffffffffffff16146117f257604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b73ffffffffffffffffffffffffffffffffffffffff82166000908152600160205260409020600281015461183790610b0e906affffffffffffffffffffff1684612090565b600282810180547fffffffffffffffffffffffffffffffffffffffffff0000000000000000000000166affffffffffffffffffffff93909316929092177fffffffffffff000000000000000000000000000000ffffffffffffffffffffff16909155546118a49083612090565b6002556118e873ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016338461222b565b7fb2ca6364660634ba189ae3c4d21750511b3ea18b84684d020c4576e4ca99c7de8383604051610a83929190612a30565b6301ee628081565b63020f580081565b611931612107565b73ffffffffffffffffffffffffffffffffffffffff1661194f611142565b73ffffffffffffffffffffffffffffffffffffffff16146119d157604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b73ffffffffffffffffffffffffffffffffffffffff82166000908152600160208181526040808420815160e08101835281546fffffffffffffffffffffffffffffffff8082168084527001000000000000000000000000000000009283900482169684018790529684015480821695840186905291909104166060820181905260028301546affffffffffffffffffffff80821660808501526b01000000000000000000000082041660a084015263ffffffff760100000000000000000000000000000000000000000000909104811660c0840152929691959194611ac29491936109f19361050992909161201316565b905080841115611afe576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161067790612b5a565b6001830154611b37906107139070010000000000000000000000000000000090046fffffffffffffffffffffffffffffffff1686612013565b6001840180546fffffffffffffffffffffffffffffffff928316700100000000000000000000000000000000029216919091179055600254611b799085612090565b600255611bbd73ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016338661222b565b7f2614bf2625130edc7b0d79ae77210d9fb3c3b71ae677a939fcc9326269fa54388585604051611bee929190612a30565b60405180910390a15050505050565b611c05612107565b73ffffffffffffffffffffffffffffffffffffffff16611c23611142565b73ffffffffffffffffffffffffffffffffffffffff1614611ca557604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b82818114611cdf576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161067790612bc6565b6000805b828110156107cf576000878783818110611cf957fe5b9050602002016020810190611d0e91906128ef565b90506000868684818110611d1e57fe5b73ffffffffffffffffffffffffffffffffffffffff8516600090815260016020908152604090912054910292909201359250611d719161071391506fffffffffffffffffffffffffffffffff1683612013565b73ffffffffffffffffffffffffffffffffffffffff8316600090815260016020526040902080547fffffffffffffffffffffffffffffffff00000000000000000000000000000000166fffffffffffffffffffffffffffffffff92909216919091179055611ddf8482612013565b93507f16ebfc01e860ed54cbeebbcc2487da4d240a77e5cdf6f96e069739737ed88d1d8282604051611e12929190612a30565b60405180910390a15050600101611ce3565b6360e445c081565b611e34612107565b73ffffffffffffffffffffffffffffffffffffffff16611e52611142565b73ffffffffffffffffffffffffffffffffffffffff1614611ed457604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b73ffffffffffffffffffffffffffffffffffffffff8116611f40576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526026815260200180612ce46026913960400191505060405180910390fd5b6000805460405173ffffffffffffffffffffffffffffffffffffffff808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055565b6360a8f24081565b42101590565b1590565b60008082611ff6611fef866124c6565b8790612339565b81611ffd57fe5b04905061200a85826124e7565b95945050505050565b60008282018381101561208757604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b90505b92915050565b60008282111561210157604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601e60248201527f536166654d6174683a207375627472616374696f6e206f766572666c6f770000604482015290519081900360640190fd5b50900390565b3390565b60006fffffffffffffffffffffffffffffffff82111561218c57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601060248201527f75696e74313238206f766572666c6f7700000000000000000000000000000000604482015290519081900360640190fd5b5090565b6040805173ffffffffffffffffffffffffffffffffffffffff80861660248301528416604482015260648082018490528251808303909101815260849091019091526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f23b872dd000000000000000000000000000000000000000000000000000000001790526122259085906124fd565b50505050565b6040805173ffffffffffffffffffffffffffffffffffffffff8416602482015260448082018490528251808303909101815260649091019091526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fa9059cbb000000000000000000000000000000000000000000000000000000001790526122b89084906124fd565b505050565b60006affffffffffffffffffffff82111561218c57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600f60248201527f75696e743838206f766572666c6f770000000000000000000000000000000000604482015290519081900360640190fd5b6000826123485750600061208a565b8282028284828161235557fe5b0414612087576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526021815260200180612d306021913960400191505060405180910390fd5b60006123b7826124c1565b156123c457506000610566565b5042900390565b600080821161243b57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601a60248201527f536166654d6174683a206469766973696f6e206279207a65726f000000000000604482015290519081900360640190fd5b81838161244457fe5b049392505050565b600063ffffffff82111561218c57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600f60248201527f75696e743332206f766572666c6f770000000000000000000000000000000000604482015290519081900360640190fd5b421190565b60006124d4610396836124c1565b156124e157506000610566565b50420390565b60008183106124f65781612087565b5090919050565b600061255f826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff166125d59092919063ffffffff16565b8051909150156122b85780806020019051602081101561257e57600080fd5b50516122b8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602a815260200180612d51602a913960400191505060405180910390fd5b60606125e484846000856125ec565b949350505050565b606082471015612647576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526026815260200180612d0a6026913960400191505060405180910390fd5b612650856127a6565b6126bb57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015290519081900360640190fd5b6000808673ffffffffffffffffffffffffffffffffffffffff1685876040518082805190602001908083835b6020831061272457805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe090920191602091820191016126e7565b6001836020036101000a03801982511681845116808217855250505050505090500191505060006040518083038185875af1925050503d8060008114612786576040519150601f19603f3d011682016040523d82523d6000602084013e61278b565b606091505b509150915061279b8282866127ac565b979650505050505050565b3b151590565b606083156127bb575081611024565b8251156127cb5782518084602001fd5b816040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b8381101561282f578181015183820152602001612817565b50505050905090810190601f16801561285c5780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b6040805160e081018252600080825260208201819052918101829052606081018290526080810182905260a0810182905260c081019190915290565b60008083601f8401126128b7578182fd5b50813567ffffffffffffffff8111156128ce578182fd5b60208301915083602080830285010111156128e857600080fd5b9250929050565b600060208284031215612900578081fd5b813561208781612cbe565b6000806040838503121561291d578081fd5b823561292881612cbe565b946020939093013593505050565b6000806000806040858703121561294b578182fd5b843567ffffffffffffffff80821115612962578384fd5b61296e888389016128a6565b90965094506020870135915080821115612986578384fd5b50612993878288016128a6565b95989497509550505050565b6000806000606084860312156129b3578283fd5b83356129be81612cbe565b925060208401356129ce81612cbe565b929592945050506040919091013590565b6000602082840312156129f0578081fd5b5035919050565b600060208284031215612a08578081fd5b5051919050565b73ffffffffffffffffffffffffffffffffffffffff91909116815260200190565b73ffffffffffffffffffffffffffffffffffffffff929092168252602082015260400190565b73ffffffffffffffffffffffffffffffffffffffff9390931683526020830191909152604082015260600190565b73ffffffffffffffffffffffffffffffffffffffff9384168152919092166020820152604081019190915260600190565b60208082526015908201527f4e6f7420656e6f75676820746f207265636f7665720000000000000000000000604082015260600190565b60208082526013908201527f4e6f7468696e6720746f20776974686472617700000000000000000000000000604082015260600190565b60208082526010908201527f4e6f7468696e6720746f20636c61696d00000000000000000000000000000000604082015260600190565b60208082526016908201527f496e73756666696369656e7420756e636c61696d656400000000000000000000604082015260600190565b6020808252818101527f496e73756666696369656e742062616c616e636520746f207769746864726177604082015260600190565b6020808252600d908201527f496e76616c696420696e70757400000000000000000000000000000000000000604082015260600190565b60208082526017908201527f416d6f756e74206d75737420626520706f736974697665000000000000000000604082015260600190565b600060e0820190506fffffffffffffffffffffffffffffffff8084511683528060208501511660208401528060408501511660408401528060608501511660608401525060808301516affffffffffffffffffffff80821660808501528060a08601511660a0850152505063ffffffff60c08401511660c083015292915050565b90815260200190565b73ffffffffffffffffffffffffffffffffffffffff81168114612ce057600080fd5b5056fe4f776e61626c653a206e6577206f776e657220697320746865207a65726f2061646472657373416464726573733a20696e73756666696369656e742062616c616e636520666f722063616c6c536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f775361666545524332303a204552433230206f7065726174696f6e20646964206e6f742073756363656564a26469706673582212201e59aa55fcad9110efe4c24f2d87d12a4738b0b6e4fdb40a52d1f78cbba0d58364736f6c634300070600334f776e61626c653a206e6577206f776e657220697320746865207a65726f20616464726573738be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0000000000000000000000000a143ac515dca260a46c742c7251ef3b268639593000000000000000000000000365b05028dd656a9f73238b7931d85a6e96dfb9c
Deployed Bytecode
0x608060405234801561001057600080fd5b50600436106101cf5760003560e01c80638da5cb5b11610104578063c19cbd48116100a2578063e701708311610071578063e701708314610347578063f1a98e9c1461035a578063f2fde38b14610362578063f7363ecb14610375576101cf565b8063c19cbd4814610311578063c24d187914610324578063c33237a41461032c578063e54868a514610334576101cf565b8063a25db8ce116100de578063a25db8ce146102d0578063a694fc3a146102e3578063aead9e47146102f6578063b66fbdfe146102fe576101cf565b80638da5cb5b146102ad57806398ba5cf1146102b55780639ee679e8146102bd576101cf565b80633ccfd60b1161017157806355072fef1161014b57806355072fef1461026a5780636386c1c71461027257806370a0823114610292578063715018a6146102a5576101cf565b80633ccfd60b146102525780634e71d92d1461025a5780634f91440d14610262576101cf565b806312b58349116101ad57806312b583491461021a57806316287c02146102225780631ec82cb814610237578063309d094b1461024a576101cf565b806306761d3e146101d45780630da45188146101f257806310426c1c14610205575b600080fd5b6101dc61037d565b6040516101e99190612cb5565b60405180910390f35b6101dc6102003660046128ef565b610384565b61020d61056b565b6040516101e99190612a0f565b6101dc61058f565b610235610230366004612936565b610595565b005b61023561024536600461299f565b61082a565b6101dc610a90565b610235610a98565b610235610c01565b610235610d49565b6101dc610dd6565b6102856102803660046128ef565b610dde565b6040516101e99190612c34565b6101dc6102a03660046128ef565b610ebd565b61023561102b565b61020d611142565b6101dc61115e565b6102356102cb3660046129df565b611166565b6101dc6102de3660046128ef565b611353565b6102356102f13660046129df565b6113e7565b6102356114f9565b61023561030c366004612936565b61151d565b61023561031f36600461290b565b61174a565b6101dc611919565b6101dc611921565b61023561034236600461290b565b611929565b610235610355366004612936565b611bfd565b6101dc611e24565b6102356103703660046128ef565b611e2c565b6101dc611fcd565b62278d0081565b600061039b61039663610bd2c0611fd5565b611fdb565b156103a857506000610566565b73ffffffffffffffffffffffffffffffffffffffff82166000908152600160208181526040808420815160e08101835281546fffffffffffffffffffffffffffffffff80821680845270010000000000000000000000000000000092839004821696840196909652958301548087169483019490945290920490931660608201526002909201546affffffffffffffffffffff80821660808501526b01000000000000000000000082041660a0840152760100000000000000000000000000000000000000000000900463ffffffff1660c0830152909190610493906360a8f2406301ee6280611fdf565b905060006104c583602001516fffffffffffffffffffffffffffffffff166283d60063610bd2c00363020f5800611fdf565b905060006104f784604001516fffffffffffffffffffffffffffffffff1662278d0063610bd2c0036303170400611fdf565b9050600061050f826105098686612013565b90612013565b90508085606001516fffffffffffffffffffffffffffffffff161061053c57600095505050505050610566565b606085015161055e9082906fffffffffffffffffffffffffffffffff16612090565b955050505050505b919050565b7f000000000000000000000000a143ac515dca260a46c742c7251ef3b26863959381565b60025490565b61059d612107565b73ffffffffffffffffffffffffffffffffffffffff166105bb611142565b73ffffffffffffffffffffffffffffffffffffffff161461063d57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b82818114610680576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161067790612bc6565b60405180910390fd5b6000805b828110156107cf57600087878381811061069a57fe5b90506020020160208101906106af91906128ef565b905060008686848181106106bf57fe5b73ffffffffffffffffffffffffffffffffffffffff8516600090815260016020818152604090922001549102929092013592506107189161071391506fffffffffffffffffffffffffffffffff1683612013565b61210b565b73ffffffffffffffffffffffffffffffffffffffff831660009081526001602081905260409091200180547fffffffffffffffffffffffffffffffff00000000000000000000000000000000166fffffffffffffffffffffffffffffffff9290921691909117905561078a8482612013565b93507fda5adace4f88f1c56459c909839dafc6209fa4d8e155707e69a87496c3fddbdb82826040516107bd929190612a30565b60405180910390a15050600101610684565b506002546107dd9082612013565b60025561082273ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000a143ac515dca260a46c742c7251ef3b26863959316333084612190565b505050505050565b610832612107565b73ffffffffffffffffffffffffffffffffffffffff16610850611142565b73ffffffffffffffffffffffffffffffffffffffff16146108d257604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b7f000000000000000000000000a143ac515dca260a46c742c7251ef3b26863959373ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610a2f576002546040517f70a0823100000000000000000000000000000000000000000000000000000000815282916109f79173ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000a143ac515dca260a46c742c7251ef3b26863959316906370a08231906109a1903090600401612a0f565b60206040518083038186803b1580156109b957600080fd5b505afa1580156109cd573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109f191906129f7565b90612090565b1015610a2f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161067790612ab5565b610a5073ffffffffffffffffffffffffffffffffffffffff8416838361222b565b7ffff3b3844276f57024e0b42afec1a37f75db36511e43819a4f2a63ab7862b648838383604051610a8393929190612a84565b60405180910390a1505050565b63610bd2c081565b6000610aa333611353565b905060008111610adf576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161067790612aec565b3360009081526001602052604090206002810154610b1390610b0e906affffffffffffffffffffff1684612090565b6122bd565b600282810180547fffffffffffffffffffffffffffffffffffffffffff0000000000000000000000166affffffffffffffffffffff93909316929092177fffffffffffff000000000000000000000000000000ffffffffffffffffffffff1690915554610b809083612090565b600255610bc473ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000a143ac515dca260a46c742c7251ef3b26863959316338461222b565b7f7084f5476618d8e60b11ef0d7d3f06914655adb8793e28ff7f018d4c76d505d53383604051610bf5929190612a30565b60405180910390a15050565b6000610c0c33610384565b905060008111610c48576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161067790612b23565b33600090815260016020819052604090912090810154610c92906107139070010000000000000000000000000000000090046fffffffffffffffffffffffffffffffff1684612013565b6001820180546fffffffffffffffffffffffffffffffff928316700100000000000000000000000000000000029216919091179055600254610cd49083612090565b600255610d1873ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000a143ac515dca260a46c742c7251ef3b26863959316338461222b565b7fd8138f8a3f377c5259ca548e70e4c2de94f129f5a11036a15b69513cba2b426a3383604051610bf5929190612a30565b33600081815260016020526040908190206002810180547fffffffffffff000000000000000000000000000000ffffffffffffffffffffff8116909155915190926b0100000000000000000000009092046affffffffffffffffffffff16917ffc11547e675aec955dee8afa8fab2509420a3a91ca90e88b9b95db75bdf4c00b91610bf591908490612a30565b636087fcc081565b610de661286a565b5073ffffffffffffffffffffffffffffffffffffffff16600090815260016020818152604092839020835160e08101855281546fffffffffffffffffffffffffffffffff8082168352700100000000000000000000000000000000918290048116948301949094529382015480841695820195909552929093041660608201526002909101546affffffffffffffffffffff80821660808401526b01000000000000000000000082041660a0830152760100000000000000000000000000000000000000000000900463ffffffff1660c082015290565b73ffffffffffffffffffffffffffffffffffffffff81166000908152600160208181526040808420815160e08101835281546fffffffffffffffffffffffffffffffff8082168352700100000000000000000000000000000000918290048116958301959095529482015480851693820193909352939091049091166060830152600201546affffffffffffffffffffff80821660808401526b01000000000000000000000082041660a0830152760100000000000000000000000000000000000000000000900463ffffffff1660c0820152611024610f9c84611353565b6109f183606001516fffffffffffffffffffffffffffffffff166109f185608001516affffffffffffffffffffff1661050987604001516fffffffffffffffffffffffffffffffff1661050989602001516fffffffffffffffffffffffffffffffff168a600001516fffffffffffffffffffffffffffffffff1661201390919063ffffffff16565b9392505050565b611033612107565b73ffffffffffffffffffffffffffffffffffffffff16611051611142565b73ffffffffffffffffffffffffffffffffffffffff16146110d357604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b6000805460405173ffffffffffffffffffffffffffffffffffffffff909116907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600080547fffffffffffffffffffffffff0000000000000000000000000000000000000000169055565b60005473ffffffffffffffffffffffffffffffffffffffff1690565b630317040081565b600081116111a0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161067790612bfd565b60006111ab33611353565b11156111b9576111b9610a98565b3360009081526001602052604081206002810154909163ffffffff76010000000000000000000000000000000000000000000083048116926affffffffffffffffffffff6b01000000000000000000000090910416919061121e908390879061201316565b60028501549091506affffffffffffffffffffff1681111561126c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161067790612b91565b600061129b826112956112828962278d00612339565b6105098761128f8a6123ac565b90612339565b906123cb565b905060006112a94283612013565b90506112b48161244c565b8660020160166101000a81548163ffffffff021916908363ffffffff1602179055506112df836122bd565b86600201600b6101000a8154816affffffffffffffffffffff02191690836affffffffffffffffffffff1602179055507fd72eb5d043f24a0168ae744d5c44f9596fd673a26bf74d9646bff4b844882d1433888360405161134293929190612a56565b60405180910390a150505050505050565b73ffffffffffffffffffffffffffffffffffffffff811660009081526001602052604081206002810154760100000000000000000000000000000000000000000000810463ffffffff16906b01000000000000000000000090046affffffffffffffffffffff1681158015906113cd57506113cd826124c1565b156113dc579250610566915050565b506000949350505050565b336000908152600160205260409020600281015461141690610b0e906affffffffffffffffffffff1684612013565b600282810180547fffffffffffffffffffffffffffffffffffffffffff0000000000000000000000166affffffffffffffffffffff93909316929092177fffffffffffff000000000000000000000000000000ffffffffffffffffffffff16909155546114839083612013565b6002556114c873ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000a143ac515dca260a46c742c7251ef3b26863959316333085612190565b7f9e71bc8eea02a63969f509818f2dafb9254532904319f9dbda79b67bd34a5f3d3383604051610bf5929190612a30565b611501610c01565b61150a33611353565b6115135761151b565b61151b610a98565b565b611525612107565b73ffffffffffffffffffffffffffffffffffffffff16611543611142565b73ffffffffffffffffffffffffffffffffffffffff16146115c557604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b828181146115ff576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161067790612bc6565b6000805b828110156107cf57600087878381811061161957fe5b905060200201602081019061162e91906128ef565b9050600086868481811061163e57fe5b73ffffffffffffffffffffffffffffffffffffffff85166000908152600160209081526040909120549102929092013592506116a591610713915070010000000000000000000000000000000090046fffffffffffffffffffffffffffffffff1683612013565b73ffffffffffffffffffffffffffffffffffffffff8316600090815260016020526040902080546fffffffffffffffffffffffffffffffff9283167001000000000000000000000000000000000292169190911790556117058482612013565b93507ff9aab938f1f5cac8d8e07824ea4c6bcedea93a6a520ccde8f251b618935ecf538282604051611738929190612a30565b60405180910390a15050600101611603565b611752612107565b73ffffffffffffffffffffffffffffffffffffffff16611770611142565b73ffffffffffffffffffffffffffffffffffffffff16146117f257604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b73ffffffffffffffffffffffffffffffffffffffff82166000908152600160205260409020600281015461183790610b0e906affffffffffffffffffffff1684612090565b600282810180547fffffffffffffffffffffffffffffffffffffffffff0000000000000000000000166affffffffffffffffffffff93909316929092177fffffffffffff000000000000000000000000000000ffffffffffffffffffffff16909155546118a49083612090565b6002556118e873ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000a143ac515dca260a46c742c7251ef3b26863959316338461222b565b7fb2ca6364660634ba189ae3c4d21750511b3ea18b84684d020c4576e4ca99c7de8383604051610a83929190612a30565b6301ee628081565b63020f580081565b611931612107565b73ffffffffffffffffffffffffffffffffffffffff1661194f611142565b73ffffffffffffffffffffffffffffffffffffffff16146119d157604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b73ffffffffffffffffffffffffffffffffffffffff82166000908152600160208181526040808420815160e08101835281546fffffffffffffffffffffffffffffffff8082168084527001000000000000000000000000000000009283900482169684018790529684015480821695840186905291909104166060820181905260028301546affffffffffffffffffffff80821660808501526b01000000000000000000000082041660a084015263ffffffff760100000000000000000000000000000000000000000000909104811660c0840152929691959194611ac29491936109f19361050992909161201316565b905080841115611afe576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161067790612b5a565b6001830154611b37906107139070010000000000000000000000000000000090046fffffffffffffffffffffffffffffffff1686612013565b6001840180546fffffffffffffffffffffffffffffffff928316700100000000000000000000000000000000029216919091179055600254611b799085612090565b600255611bbd73ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000a143ac515dca260a46c742c7251ef3b26863959316338661222b565b7f2614bf2625130edc7b0d79ae77210d9fb3c3b71ae677a939fcc9326269fa54388585604051611bee929190612a30565b60405180910390a15050505050565b611c05612107565b73ffffffffffffffffffffffffffffffffffffffff16611c23611142565b73ffffffffffffffffffffffffffffffffffffffff1614611ca557604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b82818114611cdf576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161067790612bc6565b6000805b828110156107cf576000878783818110611cf957fe5b9050602002016020810190611d0e91906128ef565b90506000868684818110611d1e57fe5b73ffffffffffffffffffffffffffffffffffffffff8516600090815260016020908152604090912054910292909201359250611d719161071391506fffffffffffffffffffffffffffffffff1683612013565b73ffffffffffffffffffffffffffffffffffffffff8316600090815260016020526040902080547fffffffffffffffffffffffffffffffff00000000000000000000000000000000166fffffffffffffffffffffffffffffffff92909216919091179055611ddf8482612013565b93507f16ebfc01e860ed54cbeebbcc2487da4d240a77e5cdf6f96e069739737ed88d1d8282604051611e12929190612a30565b60405180910390a15050600101611ce3565b6360e445c081565b611e34612107565b73ffffffffffffffffffffffffffffffffffffffff16611e52611142565b73ffffffffffffffffffffffffffffffffffffffff1614611ed457604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b73ffffffffffffffffffffffffffffffffffffffff8116611f40576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526026815260200180612ce46026913960400191505060405180910390fd5b6000805460405173ffffffffffffffffffffffffffffffffffffffff808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055565b6360a8f24081565b42101590565b1590565b60008082611ff6611fef866124c6565b8790612339565b81611ffd57fe5b04905061200a85826124e7565b95945050505050565b60008282018381101561208757604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b90505b92915050565b60008282111561210157604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601e60248201527f536166654d6174683a207375627472616374696f6e206f766572666c6f770000604482015290519081900360640190fd5b50900390565b3390565b60006fffffffffffffffffffffffffffffffff82111561218c57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601060248201527f75696e74313238206f766572666c6f7700000000000000000000000000000000604482015290519081900360640190fd5b5090565b6040805173ffffffffffffffffffffffffffffffffffffffff80861660248301528416604482015260648082018490528251808303909101815260849091019091526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f23b872dd000000000000000000000000000000000000000000000000000000001790526122259085906124fd565b50505050565b6040805173ffffffffffffffffffffffffffffffffffffffff8416602482015260448082018490528251808303909101815260649091019091526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fa9059cbb000000000000000000000000000000000000000000000000000000001790526122b89084906124fd565b505050565b60006affffffffffffffffffffff82111561218c57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600f60248201527f75696e743838206f766572666c6f770000000000000000000000000000000000604482015290519081900360640190fd5b6000826123485750600061208a565b8282028284828161235557fe5b0414612087576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526021815260200180612d306021913960400191505060405180910390fd5b60006123b7826124c1565b156123c457506000610566565b5042900390565b600080821161243b57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601a60248201527f536166654d6174683a206469766973696f6e206279207a65726f000000000000604482015290519081900360640190fd5b81838161244457fe5b049392505050565b600063ffffffff82111561218c57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600f60248201527f75696e743332206f766572666c6f770000000000000000000000000000000000604482015290519081900360640190fd5b421190565b60006124d4610396836124c1565b156124e157506000610566565b50420390565b60008183106124f65781612087565b5090919050565b600061255f826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff166125d59092919063ffffffff16565b8051909150156122b85780806020019051602081101561257e57600080fd5b50516122b8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602a815260200180612d51602a913960400191505060405180910390fd5b60606125e484846000856125ec565b949350505050565b606082471015612647576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526026815260200180612d0a6026913960400191505060405180910390fd5b612650856127a6565b6126bb57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015290519081900360640190fd5b6000808673ffffffffffffffffffffffffffffffffffffffff1685876040518082805190602001908083835b6020831061272457805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe090920191602091820191016126e7565b6001836020036101000a03801982511681845116808217855250505050505090500191505060006040518083038185875af1925050503d8060008114612786576040519150601f19603f3d011682016040523d82523d6000602084013e61278b565b606091505b509150915061279b8282866127ac565b979650505050505050565b3b151590565b606083156127bb575081611024565b8251156127cb5782518084602001fd5b816040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b8381101561282f578181015183820152602001612817565b50505050905090810190601f16801561285c5780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b6040805160e081018252600080825260208201819052918101829052606081018290526080810182905260a0810182905260c081019190915290565b60008083601f8401126128b7578182fd5b50813567ffffffffffffffff8111156128ce578182fd5b60208301915083602080830285010111156128e857600080fd5b9250929050565b600060208284031215612900578081fd5b813561208781612cbe565b6000806040838503121561291d578081fd5b823561292881612cbe565b946020939093013593505050565b6000806000806040858703121561294b578182fd5b843567ffffffffffffffff80821115612962578384fd5b61296e888389016128a6565b90965094506020870135915080821115612986578384fd5b50612993878288016128a6565b95989497509550505050565b6000806000606084860312156129b3578283fd5b83356129be81612cbe565b925060208401356129ce81612cbe565b929592945050506040919091013590565b6000602082840312156129f0578081fd5b5035919050565b600060208284031215612a08578081fd5b5051919050565b73ffffffffffffffffffffffffffffffffffffffff91909116815260200190565b73ffffffffffffffffffffffffffffffffffffffff929092168252602082015260400190565b73ffffffffffffffffffffffffffffffffffffffff9390931683526020830191909152604082015260600190565b73ffffffffffffffffffffffffffffffffffffffff9384168152919092166020820152604081019190915260600190565b60208082526015908201527f4e6f7420656e6f75676820746f207265636f7665720000000000000000000000604082015260600190565b60208082526013908201527f4e6f7468696e6720746f20776974686472617700000000000000000000000000604082015260600190565b60208082526010908201527f4e6f7468696e6720746f20636c61696d00000000000000000000000000000000604082015260600190565b60208082526016908201527f496e73756666696369656e7420756e636c61696d656400000000000000000000604082015260600190565b6020808252818101527f496e73756666696369656e742062616c616e636520746f207769746864726177604082015260600190565b6020808252600d908201527f496e76616c696420696e70757400000000000000000000000000000000000000604082015260600190565b60208082526017908201527f416d6f756e74206d75737420626520706f736974697665000000000000000000604082015260600190565b600060e0820190506fffffffffffffffffffffffffffffffff8084511683528060208501511660208401528060408501511660408401528060608501511660608401525060808301516affffffffffffffffffffff80821660808501528060a08601511660a0850152505063ffffffff60c08401511660c083015292915050565b90815260200190565b73ffffffffffffffffffffffffffffffffffffffff81168114612ce057600080fd5b5056fe4f776e61626c653a206e6577206f776e657220697320746865207a65726f2061646472657373416464726573733a20696e73756666696369656e742062616c616e636520666f722063616c6c536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f775361666545524332303a204552433230206f7065726174696f6e20646964206e6f742073756363656564a26469706673582212201e59aa55fcad9110efe4c24f2d87d12a4738b0b6e4fdb40a52d1f78cbba0d58364736f6c63430007060033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
000000000000000000000000a143ac515dca260a46c742c7251ef3b268639593000000000000000000000000365b05028dd656a9f73238b7931d85a6e96dfb9c
-----Decoded View---------------
Arg [0] : bulk (address): 0xa143ac515dCA260A46C742C7251eF3B268639593
Arg [1] : newOwner (address): 0x365b05028dd656a9f73238b7931D85a6e96Dfb9c
-----Encoded View---------------
2 Constructor Arguments found :
Arg [0] : 000000000000000000000000a143ac515dca260a46c742c7251ef3b268639593
Arg [1] : 000000000000000000000000365b05028dd656a9f73238b7931d85a6e96dfb9c
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 26 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
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.