More Info
Private Name Tags
ContractCreator
Multichain Info
No addresses found
Latest 25 from a total of 17,485 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Claim Part One | 14038581 | 98 days ago | IN | 0 ETH | 0.00000055 | ||||
Claim Part One | 14001663 | 99 days ago | IN | 0 ETH | 0.00000013 | ||||
Claim Part One | 13996735 | 99 days ago | IN | 0 ETH | 0.00000073 | ||||
Claim Part One | 13994564 | 99 days ago | IN | 0 ETH | 0.0000006 | ||||
Claim Part One | 13992985 | 99 days ago | IN | 0 ETH | 0.00000066 | ||||
Claim Part One | 13984366 | 99 days ago | IN | 0 ETH | 0 | ||||
Claim Part One | 13982126 | 99 days ago | IN | 0 ETH | 0.0000006 | ||||
Claim Part One | 13957947 | 100 days ago | IN | 0 ETH | 0.00000023 | ||||
Claim Part One | 13951145 | 100 days ago | IN | 0 ETH | 0.00000062 | ||||
Claim Part One | 13945140 | 100 days ago | IN | 0 ETH | 0.00000051 | ||||
Claim Part One | 13944080 | 100 days ago | IN | 0 ETH | 0.00000058 | ||||
Claim Part One | 13939482 | 100 days ago | IN | 0 ETH | 0.00000012 | ||||
Claim Part One | 13935556 | 101 days ago | IN | 0 ETH | 0.00000001 | ||||
Claim Part One | 13935546 | 101 days ago | IN | 0 ETH | 0.00000012 | ||||
Claim Part One | 13935210 | 101 days ago | IN | 0 ETH | 0.00000013 | ||||
Claim Part One | 13930556 | 101 days ago | IN | 0 ETH | 0.00000012 | ||||
Claim Part One | 13909953 | 101 days ago | IN | 0 ETH | 0.00000059 | ||||
Claim Part One | 13909206 | 101 days ago | IN | 0 ETH | 0.00000012 | ||||
Claim Part One | 13905219 | 101 days ago | IN | 0 ETH | 0.00000067 | ||||
Claim Part One | 13899474 | 101 days ago | IN | 0 ETH | 0.00000011 | ||||
Claim Part One | 13898169 | 101 days ago | IN | 0 ETH | 0.00000061 | ||||
Claim Part One | 13894018 | 102 days ago | IN | 0 ETH | 0.0000001 | ||||
Claim Part One | 13883912 | 102 days ago | IN | 0 ETH | 0.0000001 | ||||
Claim Part One | 13883475 | 102 days ago | IN | 0 ETH | 0.00000061 | ||||
Claim Part One | 13870490 | 102 days ago | IN | 0 ETH | 0.00000056 |
Loading...
Loading
Contract Source Code Verified (Exact Match)
Contract Name:
HyperThrustClaim
Compiler Version
v0.8.23+commit.f704f362
Optimization Enabled:
No with 200 runs
Other Settings:
paris EvmVersion
Contract Source Code (Solidity Standard Json-Input format)
// SPDX-License-Identifier: MIT pragma solidity 0.8.23; import { Ownable } from "@openzeppelin/contracts/access/Ownable.sol"; import { IERC20 } from "@openzeppelin/contracts/token/ERC20/IERC20.sol"; import { SafeERC20 } from "@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol"; import { MerkleProof } from "@openzeppelin/contracts/utils/cryptography/MerkleProof.sol"; import { IVotingEscrow } from "../interfaces/IVotingEscrow.sol"; import { ICrvDepositor } from "../interfaces/ICrvDepositor.sol"; contract HyperThrustClaim is Ownable { using SafeERC20 for IERC20; /* -------------------------------------------------------------------------- * Types -------------------------------------------------------------------------- */ struct Want { uint256 thrust; uint256 veThrust; uint256 hyper; uint256 hyperThrust; } struct Claim { address account; uint256 thrust; uint256 veThrust; uint256 hyper; } /* -------------------------------------------------------------------------- * Storage -------------------------------------------------------------------------- */ uint256 public constant MIN_LOCK = 12 * 7 days; // 12 weeks bytes32 public root; address public immutable THRUST; address public immutable veTHRUST; address public immutable HYPER; address public immutable crvDepositor; // Mapping user => claimed (amount of thrust+veThrust+hyperThrust claimed) mapping(address => uint256) public claimed; /* -------------------------------------------------------------------------- * Events -------------------------------------------------------------------------- */ event ClaimPartOne( address indexed account, uint256 thrust, uint256 hyper, uint256 veThrust, uint256 hyperThrust, uint256 hyperBoost ); event ClaimPartTwo(address indexed account, uint256 thrust, uint256 hyper, uint256 veThrust, uint256 hyperThrust); event SetRoot(bytes32 root); /* -------------------------------------------------------------------------- * Constructor -------------------------------------------------------------------------- */ constructor( bytes32 _root, address _thrust, address _veThrust, address _hyper, address _crvDepositor ) Ownable(msg.sender) { root = _root; THRUST = _thrust; veTHRUST = _veThrust; HYPER = _hyper; crvDepositor = _crvDepositor; } /* -------------------------------------------------------------------------- * Claim Logic -------------------------------------------------------------------------- */ /** * Input validation logic * * +----+--------------------------------+-----+-------------------------------+ * | | Want | | Claim | * +----+--------------------------------+-----+-------------------------------+ * | 1. | Want.thrust | lte | Claim.thrust | * | 2. | Want.thrust + Want.hyperThrust | lte | Claim.thrust + Claim.veThrust | * | 3. | Want.hyper | eq | Claim.hyper | * | 4. | Want.thrust + Want.hyperThurst | gte | Claim.thrust | * | 5. | Want.veThrust | eq | ZERO | * +----+--------------------------------+-----+-------------------------------+ * * Reasons * * 1. The amount of Thrust wanted must be less or equal than amount of Thrust in the claim * 2. The amount of Thrust and hyperThrust must be less than the total amount of Thrust and veThrust * 3. The user must claim all their hyper in the first part of the claim * 3a. This means the boost from locking is only available in the first claim * and the boost is calculated as: * boost = Claim.hyper * Want.hyperThrust / (Claim.thrust + Claim.veThrust) * 4. The user must claim the first 50% of their thrust either as THRUST or hyperTHRUST in the first claim * 4a. This means that they will just be left with claiming veTHRUST (or hyperTHRUST) in part 2 * 5. The amount of veThrust must be ZERO. * * */ function claimPartOne( Claim memory _claim, Want memory _want, bytes32[] memory _proof ) external { _requireValidClaim(msg.sender, _claim); require(claimed[msg.sender] == 0, "!claimed"); require(_verifyClaimProof(_claim, _proof), "!proof"); claimed[msg.sender] = _want.thrust + _want.hyperThrust; // prettier-ignore { require(_want.thrust <= _claim.thrust, "1. failed"); require(_want.thrust + _want.hyperThrust <= _claim.thrust + _claim.veThrust, "2. failed"); require(_want.hyper == _claim.hyper, "3. failed"); require(_want.thrust + _want.hyperThrust >= _claim.thrust, "4. failed"); require(_want.veThrust == 0, "5. failed"); } uint256 hyperBoost = _getHyperBoost(_want, _claim); _safeTransfer(THRUST, msg.sender, _want.thrust); _safeTransfer(HYPER, msg.sender, _want.hyper + hyperBoost); _mintHyperThrust(msg.sender, _want.hyperThrust); emit ClaimPartOne(msg.sender, _want.thrust, _want.hyper, _want.veThrust, _want.hyperThrust, hyperBoost); } /** * Input validation logic * * +----+----------------------------------+----+----------------+ * | | Want | | Claim | * +----+----------------------------------+----+----------------+ * | 1. | Want.hyper | eq | ZERO | * | 2. | Want.thrust | eq | ZERO | * | 3. | Want.hyperTHRUST + Want.veTHRUST | eq | Claim.veTHRUST | * +----+----------------------------------+----+----------------+ * * Reasons * * 1. All the HYPER would have been claimed in the first part * 2. All the THRUST would have been claimed in the first part * 3. The user must claim all of their veTHRUST balance as either hyperTHRUST or veTHRUST * 3a. We also need to verify they have a minimum of a 13 week lock * */ function claimPartTwo( Claim memory _claim, Want memory _want, bytes32[] memory _proof ) external { _requireValidClaim(msg.sender, _claim); require(claimed[msg.sender] > 0, "!partOne"); require(_verifyClaimProof(_claim, _proof), "!proof"); uint256 totalWant = _want.hyperThrust + _want.veThrust + claimed[msg.sender]; uint256 totalClaim = _claim.thrust + _claim.veThrust; require(totalWant == totalClaim, "!claimed"); uint256 usrClaimed = claimed[msg.sender]; claimed[msg.sender] = usrClaimed + _want.hyperThrust + _want.veThrust; uint256 remaining = (_claim.veThrust + _claim.thrust) - usrClaimed; // prettier-ignore { require(_want.hyper == 0, "1. failed"); require(_want.thrust == 0, "2. failed"); require(_want.hyperThrust + _want.veThrust == remaining, "3. failed"); } _depositVeFor(msg.sender, _want.veThrust); _mintHyperThrust(msg.sender, _want.hyperThrust); emit ClaimPartTwo(msg.sender, _want.thrust, _want.hyper, _want.veThrust, _want.hyperThrust); } /* -------------------------------------------------------------------------- * Utils Logic -------------------------------------------------------------------------- */ function _requireValidClaim(address _sender, Claim memory _claim) internal { require(_claim.account == _sender, "!account"); require(_claim.thrust > 0, "!thrust"); require(_claim.veThrust == _claim.thrust, "thrust!=veThrust"); } function _verifyClaimProof(Claim memory _claim, bytes32[] memory _proof) internal view returns (bool) { bytes32 node = keccak256(abi.encodePacked(msg.sender, _claim.thrust, _claim.veThrust, _claim.hyper)); return MerkleProof.verify(_proof, root, node); } function _depositVeFor(address _account, uint256 _amount) internal { if (_amount > 0) { uint256 lockEnd = IVotingEscrow(veTHRUST).locked(_account).end; require(lockEnd >= block.timestamp + MIN_LOCK, "!lockEnd"); IERC20(THRUST).safeIncreaseAllowance(veTHRUST, _amount); IVotingEscrow(veTHRUST).deposit_for(_account, _amount); } } function _safeTransfer( address _token, address _account, uint256 _amount ) internal { if (_amount > 0) { IERC20(_token).safeTransfer(_account, _amount); } } function _mintHyperThrust(address _account, uint256 _amount) internal { if (_amount > 0) { IERC20(THRUST).safeIncreaseAllowance(crvDepositor, _amount); ICrvDepositor(crvDepositor).depositFor(_account, _amount, true, address(0)); } } function _getHyperBoost(Want memory _want, Claim memory _claim) internal pure returns (uint256) { uint256 totalThrust = _claim.thrust + _claim.veThrust; return (_want.hyper * _want.hyperThrust) / totalThrust; } /* -------------------------------------------------------------------------- * Owner Logic -------------------------------------------------------------------------- */ function rescueTokens( address _token, address _to, uint256 _amount ) external onlyOwner { IERC20(_token).safeTransfer(_to, _amount); } function setRoot(bytes32 _root) external onlyOwner { root = _root; emit SetRoot(_root); } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v5.0.0) (access/Ownable.sol) pragma solidity ^0.8.20; import {Context} from "../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. * * The initial owner is set to the address provided by the deployer. This can * later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ abstract contract Ownable is Context { address private _owner; /** * @dev The caller account is not authorized to perform an operation. */ error OwnableUnauthorizedAccount(address account); /** * @dev The owner is not a valid owner account. (eg. `address(0)`) */ error OwnableInvalidOwner(address owner); event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the address provided by the deployer as the initial owner. */ constructor(address initialOwner) { if (initialOwner == address(0)) { revert OwnableInvalidOwner(address(0)); } _transferOwnership(initialOwner); } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { _checkOwner(); _; } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if the sender is not the owner. */ function _checkOwner() internal view virtual { if (owner() != _msgSender()) { revert OwnableUnauthorizedAccount(_msgSender()); } } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby disabling any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { _transferOwnership(address(0)); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { if (newOwner == address(0)) { revert OwnableInvalidOwner(address(0)); } _transferOwnership(newOwner); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Internal function without access restriction. */ function _transferOwnership(address newOwner) internal virtual { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v5.0.0) (token/ERC20/extensions/IERC20Permit.sol) pragma solidity ^0.8.20; /** * @dev Interface of the ERC20 Permit extension allowing approvals to be made via signatures, as defined in * https://eips.ethereum.org/EIPS/eip-2612[EIP-2612]. * * Adds the {permit} method, which can be used to change an account's ERC20 allowance (see {IERC20-allowance}) by * presenting a message signed by the account. By not relying on {IERC20-approve}, the token holder account doesn't * need to send a transaction, and thus is not required to hold Ether at all. * * ==== Security Considerations * * There are two important considerations concerning the use of `permit`. The first is that a valid permit signature * expresses an allowance, and it should not be assumed to convey additional meaning. In particular, it should not be * considered as an intention to spend the allowance in any specific way. The second is that because permits have * built-in replay protection and can be submitted by anyone, they can be frontrun. A protocol that uses permits should * take this into consideration and allow a `permit` call to fail. Combining these two aspects, a pattern that may be * generally recommended is: * * ```solidity * function doThingWithPermit(..., uint256 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s) public { * try token.permit(msg.sender, address(this), value, deadline, v, r, s) {} catch {} * doThing(..., value); * } * * function doThing(..., uint256 value) public { * token.safeTransferFrom(msg.sender, address(this), value); * ... * } * ``` * * Observe that: 1) `msg.sender` is used as the owner, leaving no ambiguity as to the signer intent, and 2) the use of * `try/catch` allows the permit to fail and makes the code tolerant to frontrunning. (See also * {SafeERC20-safeTransferFrom}). * * Additionally, note that smart contract wallets (such as Argent or Safe) are not able to produce permit signatures, so * contracts should have entry points that don't rely on permit. */ interface IERC20Permit { /** * @dev Sets `value` as the allowance of `spender` over ``owner``'s tokens, * given ``owner``'s signed approval. * * IMPORTANT: The same issues {IERC20-approve} has related to transaction * ordering also apply here. * * Emits an {Approval} event. * * Requirements: * * - `spender` cannot be the zero address. * - `deadline` must be a timestamp in the future. * - `v`, `r` and `s` must be a valid `secp256k1` signature from `owner` * over the EIP712-formatted function arguments. * - the signature must use ``owner``'s current nonce (see {nonces}). * * For more information on the signature format, see the * https://eips.ethereum.org/EIPS/eip-2612#specification[relevant EIP * section]. * * CAUTION: See Security Considerations above. */ function permit( address owner, address spender, uint256 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s ) external; /** * @dev Returns the current nonce for `owner`. This value must be * included whenever a signature is generated for {permit}. * * Every successful call to {permit} increases ``owner``'s nonce by one. This * prevents a signature from being used multiple times. */ function nonces(address owner) external view returns (uint256); /** * @dev Returns the domain separator used in the encoding of the signature for {permit}, as defined by {EIP712}. */ // solhint-disable-next-line func-name-mixedcase function DOMAIN_SEPARATOR() external view returns (bytes32); }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v5.0.0) (token/ERC20/IERC20.sol) pragma solidity ^0.8.20; /** * @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 value of tokens in existence. */ function totalSupply() external view returns (uint256); /** * @dev Returns the value of tokens owned by `account`. */ function balanceOf(address account) external view returns (uint256); /** * @dev Moves a `value` amount of tokens from the caller's account to `to`. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transfer(address to, uint256 value) external returns (bool); /** * @dev Returns the remaining number of tokens that `spender` will be * allowed to spend on behalf of `owner` through {transferFrom}. This is * zero by default. * * This value changes when {approve} or {transferFrom} are called. */ function allowance(address owner, address spender) external view returns (uint256); /** * @dev Sets a `value` amount of tokens as the allowance of `spender` over the * caller's tokens. * * Returns a boolean value indicating whether the operation succeeded. * * IMPORTANT: Beware that changing an allowance with this method brings the risk * that someone may use both the old and the new allowance by unfortunate * transaction ordering. One possible solution to mitigate this race * condition is to first reduce the spender's allowance to 0 and set the * desired value afterwards: * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 * * Emits an {Approval} event. */ function approve(address spender, uint256 value) external returns (bool); /** * @dev Moves a `value` amount of tokens from `from` to `to` using the * allowance mechanism. `value` is then deducted from the caller's * allowance. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transferFrom(address from, address to, uint256 value) external returns (bool); }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v5.0.0) (token/ERC20/utils/SafeERC20.sol) pragma solidity ^0.8.20; import {IERC20} from "../IERC20.sol"; import {IERC20Permit} from "../extensions/IERC20Permit.sol"; import {Address} from "../../../utils/Address.sol"; /** * @title SafeERC20 * @dev Wrappers around ERC20 operations that throw on failure (when the token * contract returns false). Tokens that return no value (and instead revert or * throw on failure) are also supported, non-reverting calls are assumed to be * successful. * To use this library you can add a `using SafeERC20 for IERC20;` statement to your contract, * which allows you to call the safe operations as `token.safeTransfer(...)`, etc. */ library SafeERC20 { using Address for address; /** * @dev An operation with an ERC20 token failed. */ error SafeERC20FailedOperation(address token); /** * @dev Indicates a failed `decreaseAllowance` request. */ error SafeERC20FailedDecreaseAllowance(address spender, uint256 currentAllowance, uint256 requestedDecrease); /** * @dev Transfer `value` amount of `token` from the calling contract to `to`. If `token` returns no value, * non-reverting calls are assumed to be successful. */ function safeTransfer(IERC20 token, address to, uint256 value) internal { _callOptionalReturn(token, abi.encodeCall(token.transfer, (to, value))); } /** * @dev Transfer `value` amount of `token` from `from` to `to`, spending the approval given by `from` to the * calling contract. If `token` returns no value, non-reverting calls are assumed to be successful. */ function safeTransferFrom(IERC20 token, address from, address to, uint256 value) internal { _callOptionalReturn(token, abi.encodeCall(token.transferFrom, (from, to, value))); } /** * @dev Increase the calling contract's allowance toward `spender` by `value`. If `token` returns no value, * non-reverting calls are assumed to be successful. */ function safeIncreaseAllowance(IERC20 token, address spender, uint256 value) internal { uint256 oldAllowance = token.allowance(address(this), spender); forceApprove(token, spender, oldAllowance + value); } /** * @dev Decrease the calling contract's allowance toward `spender` by `requestedDecrease`. If `token` returns no * value, non-reverting calls are assumed to be successful. */ function safeDecreaseAllowance(IERC20 token, address spender, uint256 requestedDecrease) internal { unchecked { uint256 currentAllowance = token.allowance(address(this), spender); if (currentAllowance < requestedDecrease) { revert SafeERC20FailedDecreaseAllowance(spender, currentAllowance, requestedDecrease); } forceApprove(token, spender, currentAllowance - requestedDecrease); } } /** * @dev Set the calling contract's allowance toward `spender` to `value`. If `token` returns no value, * non-reverting calls are assumed to be successful. Meant to be used with tokens that require the approval * to be set to zero before setting it to a non-zero value, such as USDT. */ function forceApprove(IERC20 token, address spender, uint256 value) internal { bytes memory approvalCall = abi.encodeCall(token.approve, (spender, value)); if (!_callOptionalReturnBool(token, approvalCall)) { _callOptionalReturn(token, abi.encodeCall(token.approve, (spender, 0))); _callOptionalReturn(token, approvalCall); } } /** * @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); if (returndata.length != 0 && !abi.decode(returndata, (bool))) { revert SafeERC20FailedOperation(address(token)); } } /** * @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). * * This is a variant of {_callOptionalReturn} that silents catches all reverts and returns a bool instead. */ function _callOptionalReturnBool(IERC20 token, bytes memory data) private returns (bool) { // 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 cannot use {Address-functionCall} here since this should return false // and not revert is the subcall reverts. (bool success, bytes memory returndata) = address(token).call(data); return success && (returndata.length == 0 || abi.decode(returndata, (bool))) && address(token).code.length > 0; } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v5.0.0) (utils/Address.sol) pragma solidity ^0.8.20; /** * @dev Collection of functions related to the address type */ library Address { /** * @dev The ETH balance of the account is not enough to perform the operation. */ error AddressInsufficientBalance(address account); /** * @dev There's no code at `target` (it is not a contract). */ error AddressEmptyCode(address target); /** * @dev A call to an address target failed. The target may have reverted. */ error FailedInnerCall(); /** * @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://consensys.net/diligence/blog/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.8.20/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { if (address(this).balance < amount) { revert AddressInsufficientBalance(address(this)); } (bool success, ) = recipient.call{value: amount}(""); if (!success) { revert FailedInnerCall(); } } /** * @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 or custom error, it is bubbled * up by this function (like regular Solidity function calls). However, if * the call reverted with no returned reason, this function reverts with a * {FailedInnerCall} error. * * 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. */ function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCallWithValue(target, data, 0); } /** * @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`. */ function functionCallWithValue(address target, bytes memory data, uint256 value) internal returns (bytes memory) { if (address(this).balance < value) { revert AddressInsufficientBalance(address(this)); } (bool success, bytes memory returndata) = target.call{value: value}(data); return verifyCallResultFromTarget(target, success, returndata); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a static call. */ function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) { (bool success, bytes memory returndata) = target.staticcall(data); return verifyCallResultFromTarget(target, success, returndata); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a delegate call. */ function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { (bool success, bytes memory returndata) = target.delegatecall(data); return verifyCallResultFromTarget(target, success, returndata); } /** * @dev Tool to verify that a low level call to smart-contract was successful, and reverts if the target * was not a contract or bubbling up the revert reason (falling back to {FailedInnerCall}) in case of an * unsuccessful call. */ function verifyCallResultFromTarget( address target, bool success, bytes memory returndata ) internal view returns (bytes memory) { if (!success) { _revert(returndata); } else { // only check if target is a contract if the call was successful and the return data is empty // otherwise we already know that it was a contract if (returndata.length == 0 && target.code.length == 0) { revert AddressEmptyCode(target); } return returndata; } } /** * @dev Tool to verify that a low level call was successful, and reverts if it wasn't, either by bubbling the * revert reason or with a default {FailedInnerCall} error. */ function verifyCallResult(bool success, bytes memory returndata) internal pure returns (bytes memory) { if (!success) { _revert(returndata); } else { return returndata; } } /** * @dev Reverts with returndata if present. Otherwise reverts with {FailedInnerCall}. */ function _revert(bytes memory returndata) private pure { // Look for revert reason and bubble it up if present if (returndata.length > 0) { // The easiest way to bubble the revert reason is using memory via assembly /// @solidity memory-safe-assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert FailedInnerCall(); } } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v5.0.1) (utils/Context.sol) pragma solidity ^0.8.20; /** * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } function _contextSuffixLength() internal view virtual returns (uint256) { return 0; } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v5.0.0) (utils/cryptography/MerkleProof.sol) pragma solidity ^0.8.20; /** * @dev These functions deal with verification of Merkle Tree proofs. * * The tree and the proofs can be generated using our * https://github.com/OpenZeppelin/merkle-tree[JavaScript library]. * You will find a quickstart guide in the readme. * * WARNING: You should avoid using leaf values that are 64 bytes long prior to * hashing, or use a hash function other than keccak256 for hashing leaves. * This is because the concatenation of a sorted pair of internal nodes in * the Merkle tree could be reinterpreted as a leaf value. * OpenZeppelin's JavaScript library generates Merkle trees that are safe * against this attack out of the box. */ library MerkleProof { /** *@dev The multiproof provided is not valid. */ error MerkleProofInvalidMultiproof(); /** * @dev Returns true if a `leaf` can be proved to be a part of a Merkle tree * defined by `root`. For this, a `proof` must be provided, containing * sibling hashes on the branch from the leaf to the root of the tree. Each * pair of leaves and each pair of pre-images are assumed to be sorted. */ function verify(bytes32[] memory proof, bytes32 root, bytes32 leaf) internal pure returns (bool) { return processProof(proof, leaf) == root; } /** * @dev Calldata version of {verify} */ function verifyCalldata(bytes32[] calldata proof, bytes32 root, bytes32 leaf) internal pure returns (bool) { return processProofCalldata(proof, leaf) == root; } /** * @dev Returns the rebuilt hash obtained by traversing a Merkle tree up * from `leaf` using `proof`. A `proof` is valid if and only if the rebuilt * hash matches the root of the tree. When processing the proof, the pairs * of leafs & pre-images are assumed to be sorted. */ function processProof(bytes32[] memory proof, bytes32 leaf) internal pure returns (bytes32) { bytes32 computedHash = leaf; for (uint256 i = 0; i < proof.length; i++) { computedHash = _hashPair(computedHash, proof[i]); } return computedHash; } /** * @dev Calldata version of {processProof} */ function processProofCalldata(bytes32[] calldata proof, bytes32 leaf) internal pure returns (bytes32) { bytes32 computedHash = leaf; for (uint256 i = 0; i < proof.length; i++) { computedHash = _hashPair(computedHash, proof[i]); } return computedHash; } /** * @dev Returns true if the `leaves` can be simultaneously proven to be a part of a Merkle tree defined by * `root`, according to `proof` and `proofFlags` as described in {processMultiProof}. * * CAUTION: Not all Merkle trees admit multiproofs. See {processMultiProof} for details. */ function multiProofVerify( bytes32[] memory proof, bool[] memory proofFlags, bytes32 root, bytes32[] memory leaves ) internal pure returns (bool) { return processMultiProof(proof, proofFlags, leaves) == root; } /** * @dev Calldata version of {multiProofVerify} * * CAUTION: Not all Merkle trees admit multiproofs. See {processMultiProof} for details. */ function multiProofVerifyCalldata( bytes32[] calldata proof, bool[] calldata proofFlags, bytes32 root, bytes32[] memory leaves ) internal pure returns (bool) { return processMultiProofCalldata(proof, proofFlags, leaves) == root; } /** * @dev Returns the root of a tree reconstructed from `leaves` and sibling nodes in `proof`. The reconstruction * proceeds by incrementally reconstructing all inner nodes by combining a leaf/inner node with either another * leaf/inner node or a proof sibling node, depending on whether each `proofFlags` item is true or false * respectively. * * CAUTION: Not all Merkle trees admit multiproofs. To use multiproofs, it is sufficient to ensure that: 1) the tree * is complete (but not necessarily perfect), 2) the leaves to be proven are in the opposite order they are in the * tree (i.e., as seen from right to left starting at the deepest layer and continuing at the next layer). */ function processMultiProof( bytes32[] memory proof, bool[] memory proofFlags, bytes32[] memory leaves ) internal pure returns (bytes32 merkleRoot) { // This function rebuilds the root hash by traversing the tree up from the leaves. The root is rebuilt by // consuming and producing values on a queue. The queue starts with the `leaves` array, then goes onto the // `hashes` array. At the end of the process, the last hash in the `hashes` array should contain the root of // the Merkle tree. uint256 leavesLen = leaves.length; uint256 proofLen = proof.length; uint256 totalHashes = proofFlags.length; // Check proof validity. if (leavesLen + proofLen != totalHashes + 1) { revert MerkleProofInvalidMultiproof(); } // The xxxPos values are "pointers" to the next value to consume in each array. All accesses are done using // `xxx[xxxPos++]`, which return the current value and increment the pointer, thus mimicking a queue's "pop". bytes32[] memory hashes = new bytes32[](totalHashes); uint256 leafPos = 0; uint256 hashPos = 0; uint256 proofPos = 0; // At each step, we compute the next hash using two values: // - a value from the "main queue". If not all leaves have been consumed, we get the next leaf, otherwise we // get the next hash. // - depending on the flag, either another value from the "main queue" (merging branches) or an element from the // `proof` array. for (uint256 i = 0; i < totalHashes; i++) { bytes32 a = leafPos < leavesLen ? leaves[leafPos++] : hashes[hashPos++]; bytes32 b = proofFlags[i] ? (leafPos < leavesLen ? leaves[leafPos++] : hashes[hashPos++]) : proof[proofPos++]; hashes[i] = _hashPair(a, b); } if (totalHashes > 0) { if (proofPos != proofLen) { revert MerkleProofInvalidMultiproof(); } unchecked { return hashes[totalHashes - 1]; } } else if (leavesLen > 0) { return leaves[0]; } else { return proof[0]; } } /** * @dev Calldata version of {processMultiProof}. * * CAUTION: Not all Merkle trees admit multiproofs. See {processMultiProof} for details. */ function processMultiProofCalldata( bytes32[] calldata proof, bool[] calldata proofFlags, bytes32[] memory leaves ) internal pure returns (bytes32 merkleRoot) { // This function rebuilds the root hash by traversing the tree up from the leaves. The root is rebuilt by // consuming and producing values on a queue. The queue starts with the `leaves` array, then goes onto the // `hashes` array. At the end of the process, the last hash in the `hashes` array should contain the root of // the Merkle tree. uint256 leavesLen = leaves.length; uint256 proofLen = proof.length; uint256 totalHashes = proofFlags.length; // Check proof validity. if (leavesLen + proofLen != totalHashes + 1) { revert MerkleProofInvalidMultiproof(); } // The xxxPos values are "pointers" to the next value to consume in each array. All accesses are done using // `xxx[xxxPos++]`, which return the current value and increment the pointer, thus mimicking a queue's "pop". bytes32[] memory hashes = new bytes32[](totalHashes); uint256 leafPos = 0; uint256 hashPos = 0; uint256 proofPos = 0; // At each step, we compute the next hash using two values: // - a value from the "main queue". If not all leaves have been consumed, we get the next leaf, otherwise we // get the next hash. // - depending on the flag, either another value from the "main queue" (merging branches) or an element from the // `proof` array. for (uint256 i = 0; i < totalHashes; i++) { bytes32 a = leafPos < leavesLen ? leaves[leafPos++] : hashes[hashPos++]; bytes32 b = proofFlags[i] ? (leafPos < leavesLen ? leaves[leafPos++] : hashes[hashPos++]) : proof[proofPos++]; hashes[i] = _hashPair(a, b); } if (totalHashes > 0) { if (proofPos != proofLen) { revert MerkleProofInvalidMultiproof(); } unchecked { return hashes[totalHashes - 1]; } } else if (leavesLen > 0) { return leaves[0]; } else { return proof[0]; } } /** * @dev Sorts the pair (a, b) and hashes the result. */ function _hashPair(bytes32 a, bytes32 b) private pure returns (bytes32) { return a < b ? _efficientHash(a, b) : _efficientHash(b, a); } /** * @dev Implementation of keccak256(abi.encode(a, b)) that doesn't allocate or expand memory. */ function _efficientHash(bytes32 a, bytes32 b) private pure returns (bytes32 value) { /// @solidity memory-safe-assembly assembly { mstore(0x00, a) mstore(0x20, b) value := keccak256(0x00, 0x40) } } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.23; interface ICrvDepositor { function depositFor( address to, uint256 _amount, bool _lock, address _stakeAddress ) external; }
// SPDX-License-Identifier: MIT pragma solidity >=0.8.0; interface IVotingEscrow { struct LockedBalance { int128 amount; uint256 end; } function locked(address owner) external view returns (LockedBalance memory lock); function deposit_for(address owner, uint256 value) external; function token() external view returns (address); }
{ "evmVersion": "paris", "optimizer": { "enabled": false, "runs": 200 }, "outputSelection": { "*": { "*": [ "evm.bytecode", "evm.deployedBytecode", "devdoc", "userdoc", "metadata", "abi" ] } }, "libraries": {} }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
Contract ABI
API[{"inputs":[{"internalType":"bytes32","name":"_root","type":"bytes32"},{"internalType":"address","name":"_thrust","type":"address"},{"internalType":"address","name":"_veThrust","type":"address"},{"internalType":"address","name":"_hyper","type":"address"},{"internalType":"address","name":"_crvDepositor","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[{"internalType":"address","name":"target","type":"address"}],"name":"AddressEmptyCode","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"AddressInsufficientBalance","type":"error"},{"inputs":[],"name":"FailedInnerCall","type":"error"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"OwnableInvalidOwner","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"OwnableUnauthorizedAccount","type":"error"},{"inputs":[{"internalType":"address","name":"token","type":"address"}],"name":"SafeERC20FailedOperation","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"uint256","name":"thrust","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"hyper","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"veThrust","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"hyperThrust","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"hyperBoost","type":"uint256"}],"name":"ClaimPartOne","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"uint256","name":"thrust","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"hyper","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"veThrust","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"hyperThrust","type":"uint256"}],"name":"ClaimPartTwo","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":"bytes32","name":"root","type":"bytes32"}],"name":"SetRoot","type":"event"},{"inputs":[],"name":"HYPER","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MIN_LOCK","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"THRUST","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"components":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"thrust","type":"uint256"},{"internalType":"uint256","name":"veThrust","type":"uint256"},{"internalType":"uint256","name":"hyper","type":"uint256"}],"internalType":"struct HyperThrustClaim.Claim","name":"_claim","type":"tuple"},{"components":[{"internalType":"uint256","name":"thrust","type":"uint256"},{"internalType":"uint256","name":"veThrust","type":"uint256"},{"internalType":"uint256","name":"hyper","type":"uint256"},{"internalType":"uint256","name":"hyperThrust","type":"uint256"}],"internalType":"struct HyperThrustClaim.Want","name":"_want","type":"tuple"},{"internalType":"bytes32[]","name":"_proof","type":"bytes32[]"}],"name":"claimPartOne","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"components":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"thrust","type":"uint256"},{"internalType":"uint256","name":"veThrust","type":"uint256"},{"internalType":"uint256","name":"hyper","type":"uint256"}],"internalType":"struct HyperThrustClaim.Claim","name":"_claim","type":"tuple"},{"components":[{"internalType":"uint256","name":"thrust","type":"uint256"},{"internalType":"uint256","name":"veThrust","type":"uint256"},{"internalType":"uint256","name":"hyper","type":"uint256"},{"internalType":"uint256","name":"hyperThrust","type":"uint256"}],"internalType":"struct HyperThrustClaim.Want","name":"_want","type":"tuple"},{"internalType":"bytes32[]","name":"_proof","type":"bytes32[]"}],"name":"claimPartTwo","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"claimed","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"crvDepositor","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_token","type":"address"},{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"rescueTokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"root","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_root","type":"bytes32"}],"name":"setRoot","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"veTHRUST","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"}]
Contract Creation Code
6101006040523480156200001257600080fd5b5060405162002c2138038062002c2183398181016040528101906200003891906200030b565b33600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603620000ae5760006040517f1e4fbdf7000000000000000000000000000000000000000000000000000000008152600401620000a59190620003a4565b60405180910390fd5b620000bf81620001a260201b60201c565b50846001819055508373ffffffffffffffffffffffffffffffffffffffff1660808173ffffffffffffffffffffffffffffffffffffffff16815250508273ffffffffffffffffffffffffffffffffffffffff1660a08173ffffffffffffffffffffffffffffffffffffffff16815250508173ffffffffffffffffffffffffffffffffffffffff1660c08173ffffffffffffffffffffffffffffffffffffffff16815250508073ffffffffffffffffffffffffffffffffffffffff1660e08173ffffffffffffffffffffffffffffffffffffffff16815250505050505050620003c1565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600080fd5b6000819050919050565b62000280816200026b565b81146200028c57600080fd5b50565b600081519050620002a08162000275565b92915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000620002d382620002a6565b9050919050565b620002e581620002c6565b8114620002f157600080fd5b50565b6000815190506200030581620002da565b92915050565b600080600080600060a086880312156200032a576200032962000266565b5b60006200033a888289016200028f565b95505060206200034d88828901620002f4565b94505060406200036088828901620002f4565b93505060606200037388828901620002f4565b92505060806200038688828901620002f4565b9150509295509295909350565b6200039e81620002c6565b82525050565b6000602082019050620003bb600083018462000393565b92915050565b60805160a05160c05160e0516127e76200043a600039600081816102ad015281816110af0152611117015260008181610a2f0152610b4d015260008181610b2901528181610eb501528181610fa8015261101001526000818161028901528181610a0001528181610fca01526110d101526127e76000f3fe608060405234801561001057600080fd5b50600436106100ea5760003560e01c8063d2fede8c1161008c578063e4680fe111610066578063e4680fe114610211578063ebf0c7171461022f578063f2fde38b1461024d578063f8764cec14610269576100ea565b8063d2fede8c146101bb578063dab5f340146101d7578063e345e109146101f3576100ea565b80638da5cb5b116100c85780638da5cb5b14610135578063985fe13914610153578063c884ef831461016f578063cea9d26f1461019f576100ea565b80634e66fd17146100ef57806355f4f1b91461010d578063715018a61461012b575b600080fd5b6100f7610287565b6040516101049190611859565b60405180910390f35b6101156102ab565b6040516101229190611859565b60405180910390f35b6101336102cf565b005b61013d6102e3565b60405161014a9190611859565b60405180910390f35b61016d60048036038101906101689190611b6e565b61030c565b005b61018960048036038101906101849190611bdf565b6106d2565b6040516101969190611c1b565b60405180910390f35b6101b960048036038101906101b49190611c36565b6106ea565b005b6101d560048036038101906101d09190611b6e565b610722565b005b6101f160048036038101906101ec9190611c89565b610ade565b005b6101fb610b27565b6040516102089190611859565b60405180910390f35b610219610b4b565b6040516102269190611859565b60405180910390f35b610237610b6f565b6040516102449190611cc5565b60405180910390f35b61026760048036038101906102629190611bdf565b610b75565b005b610271610bfb565b60405161027e9190611c1b565b60405180910390f35b7f000000000000000000000000000000000000000000000000000000000000000081565b7f000000000000000000000000000000000000000000000000000000000000000081565b6102d7610c02565b6102e16000610c89565b565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6103163384610d4d565b6000600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205411610398576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161038f90611d3d565b60405180910390fd5b6103a28382610e54565b6103e1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016103d890611da9565b60405180910390fd5b6000600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054836020015184606001516104379190611df8565b6104419190611df8565b90506000846040015185602001516104599190611df8565b905080821461049d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161049490611e78565b60405180910390fd5b6000600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905084602001518560600151826104f69190611df8565b6105009190611df8565b600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506000818760200151886040015161055a9190611df8565b6105649190611e98565b905060008660400151146105ad576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016105a490611f18565b60405180910390fd5b60008660000151146105f4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016105eb90611f84565b60405180910390fd5b80866020015187606001516106099190611df8565b14610649576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161064090611ff0565b60405180910390fd5b610657338760200151610ea8565b6106653387606001516110a1565b3373ffffffffffffffffffffffffffffffffffffffff167fc01446d3d78ed04e0c35f1a1321e9cdc46459bd3699532660e6a84ffbf8162e48760000151886040015189602001518a606001516040516106c19493929190612010565b60405180910390a250505050505050565b60026020528060005260406000206000915090505481565b6106f2610c02565b61071d82828573ffffffffffffffffffffffffffffffffffffffff166111ad9092919063ffffffff16565b505050565b61072c3384610d4d565b6000600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054146107ae576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107a590611e78565b60405180910390fd5b6107b88382610e54565b6107f7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107ee90611da9565b60405180910390fd5b8160600151826000015161080b9190611df8565b600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550826020015182600001511115610899576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161089090611f18565b60405180910390fd5b826040015183602001516108ad9190611df8565b826060015183600001516108c19190611df8565b1115610902576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108f990611f84565b60405180910390fd5b826060015182604001511461094c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161094390611ff0565b60405180910390fd5b8260200151826060015183600001516109659190611df8565b10156109a6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161099d906120a1565b60405180910390fd5b60008260200151146109ed576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109e49061210d565b60405180910390fd5b60006109f9838561122c565b9050610a2a7f000000000000000000000000000000000000000000000000000000000000000033856000015161126d565b610a647f000000000000000000000000000000000000000000000000000000000000000033838660400151610a5f9190611df8565b61126d565b610a723384606001516110a1565b3373ffffffffffffffffffffffffffffffffffffffff167ff46699b53d53d55a78d348eb226b9443ac118153c6a1dc4c6322c3e912151afd846000015185604001518660200151876060015186604051610ad095949392919061212d565b60405180910390a250505050565b610ae6610c02565b806001819055507f1b69d514bf94fc45c7379fc186902adc80eed92d11413dca7c40e5644729cb1f81604051610b1c9190611cc5565b60405180910390a150565b7f000000000000000000000000000000000000000000000000000000000000000081565b7f000000000000000000000000000000000000000000000000000000000000000081565b60015481565b610b7d610c02565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603610bef5760006040517f1e4fbdf7000000000000000000000000000000000000000000000000000000008152600401610be69190611859565b60405180910390fd5b610bf881610c89565b50565b626ebe0081565b610c0a6112a7565b73ffffffffffffffffffffffffffffffffffffffff16610c286102e3565b73ffffffffffffffffffffffffffffffffffffffff1614610c8757610c4b6112a7565b6040517f118cdaa7000000000000000000000000000000000000000000000000000000008152600401610c7e9190611859565b60405180910390fd5b565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b8173ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1614610dbf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610db6906121cc565b60405180910390fd5b6000816020015111610e06576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dfd90612238565b60405180910390fd5b8060200151816040015114610e50576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e47906122a4565b60405180910390fd5b5050565b60008033846020015185604001518660600151604051602001610e7a949392919061232d565b604051602081830303815290604052805190602001209050610e9f83600154836112af565b91505092915050565b600081111561109d5760007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663cbf9fe5f846040518263ffffffff1660e01b8152600401610f0c9190611859565b6040805180830381865afa158015610f28573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f4c9190612419565b602001519050626ebe0042610f619190611df8565b811015610fa3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f9a90612492565b60405180910390fd5b61100e7f0000000000000000000000000000000000000000000000000000000000000000837f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166112c69092919063ffffffff16565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16633a46273e84846040518363ffffffff1660e01b81526004016110699291906124b2565b600060405180830381600087803b15801561108357600080fd5b505af1158015611097573d6000803e3d6000fd5b50505050505b5050565b60008111156111a9576111157f0000000000000000000000000000000000000000000000000000000000000000827f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166112c69092919063ffffffff16565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16631e97b6e98383600160006040518563ffffffff1660e01b815260040161117694939291906124f6565b600060405180830381600087803b15801561119057600080fd5b505af11580156111a4573d6000803e3d6000fd5b505050505b5050565b611227838473ffffffffffffffffffffffffffffffffffffffff1663a9059cbb85856040516024016111e09291906124b2565b604051602081830303815290604052915060e01b6020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050611362565b505050565b600080826040015183602001516112439190611df8565b9050808460600151856040015161125a919061253b565b61126491906125ac565b91505092915050565b60008111156112a2576112a182828573ffffffffffffffffffffffffffffffffffffffff166111ad9092919063ffffffff16565b5b505050565b600033905090565b6000826112bc85846113f9565b1490509392505050565b60008373ffffffffffffffffffffffffffffffffffffffff1663dd62ed3e30856040518363ffffffff1660e01b81526004016113039291906125dd565b602060405180830381865afa158015611320573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113449190612606565b905061135c848484846113579190611df8565b611449565b50505050565b600061138d828473ffffffffffffffffffffffffffffffffffffffff1661155890919063ffffffff16565b905060008151141580156113b25750808060200190518101906113b0919061265f565b155b156113f457826040517f5274afe70000000000000000000000000000000000000000000000000000000081526004016113eb9190611859565b60405180910390fd5b505050565b60008082905060005b845181101561143e5761142f828683815181106114225761142161268c565b5b602002602001015161156e565b91508080600101915050611402565b508091505092915050565b60008373ffffffffffffffffffffffffffffffffffffffff1663095ea7b3848460405160240161147a9291906124b2565b604051602081830303815290604052915060e01b6020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff838183161783525050505090506114c88482611599565b61155257611547848573ffffffffffffffffffffffffffffffffffffffff1663095ea7b3866000604051602401611500929190612700565b604051602081830303815290604052915060e01b6020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050611362565b6115518482611362565b5b50505050565b606061156683836000611660565b905092915050565b600081831061158657611581828461172d565b611591565b611590838361172d565b5b905092915050565b60008060008473ffffffffffffffffffffffffffffffffffffffff16846040516115c3919061279a565b6000604051808303816000865af19150503d8060008114611600576040519150601f19603f3d011682016040523d82523d6000602084013e611605565b606091505b50915091508180156116335750600081511480611632575080806020019051810190611631919061265f565b5b5b8015611656575060008573ffffffffffffffffffffffffffffffffffffffff163b115b9250505092915050565b6060814710156116a757306040517fcd78605900000000000000000000000000000000000000000000000000000000815260040161169e9190611859565b60405180910390fd5b6000808573ffffffffffffffffffffffffffffffffffffffff1684866040516116d0919061279a565b60006040518083038185875af1925050503d806000811461170d576040519150601f19603f3d011682016040523d82523d6000602084013e611712565b606091505b5091509150611722868383611744565b925050509392505050565b600082600052816020526040600020905092915050565b60608261175957611754826117d3565b6117cb565b60008251148015611781575060008473ffffffffffffffffffffffffffffffffffffffff163b145b156117c357836040517f9996b3150000000000000000000000000000000000000000000000000000000081526004016117ba9190611859565b60405180910390fd5b8190506117cc565b5b9392505050565b6000815111156117e65780518082602001fd5b6040517f1425ea4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600061184382611818565b9050919050565b61185381611838565b82525050565b600060208201905061186e600083018461184a565b92915050565b6000604051905090565b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6118d68261188d565b810181811067ffffffffffffffff821117156118f5576118f461189e565b5b80604052505050565b6000611908611874565b905061191482826118cd565b919050565b61192281611838565b811461192d57600080fd5b50565b60008135905061193f81611919565b92915050565b6000819050919050565b61195881611945565b811461196357600080fd5b50565b6000813590506119758161194f565b92915050565b60006080828403121561199157611990611888565b5b61199b60806118fe565b905060006119ab84828501611930565b60008301525060206119bf84828501611966565b60208301525060406119d384828501611966565b60408301525060606119e784828501611966565b60608301525092915050565b600060808284031215611a0957611a08611888565b5b611a1360806118fe565b90506000611a2384828501611966565b6000830152506020611a3784828501611966565b6020830152506040611a4b84828501611966565b6040830152506060611a5f84828501611966565b60608301525092915050565b600080fd5b600067ffffffffffffffff821115611a8b57611a8a61189e565b5b602082029050602081019050919050565b600080fd5b6000819050919050565b611ab481611aa1565b8114611abf57600080fd5b50565b600081359050611ad181611aab565b92915050565b6000611aea611ae584611a70565b6118fe565b90508083825260208201905060208402830185811115611b0d57611b0c611a9c565b5b835b81811015611b365780611b228882611ac2565b845260208401935050602081019050611b0f565b5050509392505050565b600082601f830112611b5557611b54611a6b565b5b8135611b65848260208601611ad7565b91505092915050565b60008060006101208486031215611b8857611b8761187e565b5b6000611b968682870161197b565b9350506080611ba7868287016119f3565b92505061010084013567ffffffffffffffff811115611bc957611bc8611883565b5b611bd586828701611b40565b9150509250925092565b600060208284031215611bf557611bf461187e565b5b6000611c0384828501611930565b91505092915050565b611c1581611945565b82525050565b6000602082019050611c306000830184611c0c565b92915050565b600080600060608486031215611c4f57611c4e61187e565b5b6000611c5d86828701611930565b9350506020611c6e86828701611930565b9250506040611c7f86828701611966565b9150509250925092565b600060208284031215611c9f57611c9e61187e565b5b6000611cad84828501611ac2565b91505092915050565b611cbf81611aa1565b82525050565b6000602082019050611cda6000830184611cb6565b92915050565b600082825260208201905092915050565b7f21706172744f6e65000000000000000000000000000000000000000000000000600082015250565b6000611d27600883611ce0565b9150611d3282611cf1565b602082019050919050565b60006020820190508181036000830152611d5681611d1a565b9050919050565b7f2170726f6f660000000000000000000000000000000000000000000000000000600082015250565b6000611d93600683611ce0565b9150611d9e82611d5d565b602082019050919050565b60006020820190508181036000830152611dc281611d86565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000611e0382611945565b9150611e0e83611945565b9250828201905080821115611e2657611e25611dc9565b5b92915050565b7f21636c61696d6564000000000000000000000000000000000000000000000000600082015250565b6000611e62600883611ce0565b9150611e6d82611e2c565b602082019050919050565b60006020820190508181036000830152611e9181611e55565b9050919050565b6000611ea382611945565b9150611eae83611945565b9250828203905081811115611ec657611ec5611dc9565b5b92915050565b7f312e206661696c65640000000000000000000000000000000000000000000000600082015250565b6000611f02600983611ce0565b9150611f0d82611ecc565b602082019050919050565b60006020820190508181036000830152611f3181611ef5565b9050919050565b7f322e206661696c65640000000000000000000000000000000000000000000000600082015250565b6000611f6e600983611ce0565b9150611f7982611f38565b602082019050919050565b60006020820190508181036000830152611f9d81611f61565b9050919050565b7f332e206661696c65640000000000000000000000000000000000000000000000600082015250565b6000611fda600983611ce0565b9150611fe582611fa4565b602082019050919050565b6000602082019050818103600083015261200981611fcd565b9050919050565b60006080820190506120256000830187611c0c565b6120326020830186611c0c565b61203f6040830185611c0c565b61204c6060830184611c0c565b95945050505050565b7f342e206661696c65640000000000000000000000000000000000000000000000600082015250565b600061208b600983611ce0565b915061209682612055565b602082019050919050565b600060208201905081810360008301526120ba8161207e565b9050919050565b7f352e206661696c65640000000000000000000000000000000000000000000000600082015250565b60006120f7600983611ce0565b9150612102826120c1565b602082019050919050565b60006020820190508181036000830152612126816120ea565b9050919050565b600060a0820190506121426000830188611c0c565b61214f6020830187611c0c565b61215c6040830186611c0c565b6121696060830185611c0c565b6121766080830184611c0c565b9695505050505050565b7f216163636f756e74000000000000000000000000000000000000000000000000600082015250565b60006121b6600883611ce0565b91506121c182612180565b602082019050919050565b600060208201905081810360008301526121e5816121a9565b9050919050565b7f2174687275737400000000000000000000000000000000000000000000000000600082015250565b6000612222600783611ce0565b915061222d826121ec565b602082019050919050565b6000602082019050818103600083015261225181612215565b9050919050565b7f746872757374213d766554687275737400000000000000000000000000000000600082015250565b600061228e601083611ce0565b915061229982612258565b602082019050919050565b600060208201905081810360008301526122bd81612281565b9050919050565b60008160601b9050919050565b60006122dc826122c4565b9050919050565b60006122ee826122d1565b9050919050565b61230661230182611838565b6122e3565b82525050565b6000819050919050565b61232761232282611945565b61230c565b82525050565b600061233982876122f5565b6014820191506123498286612316565b6020820191506123598285612316565b6020820191506123698284612316565b60208201915081905095945050505050565b600081600f0b9050919050565b6123918161237b565b811461239c57600080fd5b50565b6000815190506123ae81612388565b92915050565b6000815190506123c38161194f565b92915050565b6000604082840312156123df576123de611888565b5b6123e960406118fe565b905060006123f98482850161239f565b600083015250602061240d848285016123b4565b60208301525092915050565b60006040828403121561242f5761242e61187e565b5b600061243d848285016123c9565b91505092915050565b7f216c6f636b456e64000000000000000000000000000000000000000000000000600082015250565b600061247c600883611ce0565b915061248782612446565b602082019050919050565b600060208201905081810360008301526124ab8161246f565b9050919050565b60006040820190506124c7600083018561184a565b6124d46020830184611c0c565b9392505050565b60008115159050919050565b6124f0816124db565b82525050565b600060808201905061250b600083018761184a565b6125186020830186611c0c565b61252560408301856124e7565b612532606083018461184a565b95945050505050565b600061254682611945565b915061255183611945565b925082820261255f81611945565b9150828204841483151761257657612575611dc9565b5b5092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b60006125b782611945565b91506125c283611945565b9250826125d2576125d161257d565b5b828204905092915050565b60006040820190506125f2600083018561184a565b6125ff602083018461184a565b9392505050565b60006020828403121561261c5761261b61187e565b5b600061262a848285016123b4565b91505092915050565b61263c816124db565b811461264757600080fd5b50565b60008151905061265981612633565b92915050565b6000602082840312156126755761267461187e565b5b60006126838482850161264a565b91505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6000819050919050565b6000819050919050565b60006126ea6126e56126e0846126bb565b6126c5565b611945565b9050919050565b6126fa816126cf565b82525050565b6000604082019050612715600083018561184a565b61272260208301846126f1565b9392505050565b600081519050919050565b600081905092915050565b60005b8381101561275d578082015181840152602081019050612742565b60008484015250505050565b600061277482612729565b61277e8185612734565b935061278e81856020860161273f565b80840191505092915050565b60006127a68284612769565b91508190509291505056fea2646970667358221220d7703b86fc66b74369e19f672eb408a7d425c127c7cf0f59543b21114339730664736f6c634300081700330000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e36072dd051ce26261bf50cd966311cab62c596e000000000000000000000000c6de1f30415352941f7ce784a67b2df1552386a4000000000000000000000000ec73284e4ec9bcea1a7dddf489eaa324c3f7dd310000000000000000000000009af27cfbe0bc537dbc47fc314934353dad7b8919
Deployed Bytecode
0x608060405234801561001057600080fd5b50600436106100ea5760003560e01c8063d2fede8c1161008c578063e4680fe111610066578063e4680fe114610211578063ebf0c7171461022f578063f2fde38b1461024d578063f8764cec14610269576100ea565b8063d2fede8c146101bb578063dab5f340146101d7578063e345e109146101f3576100ea565b80638da5cb5b116100c85780638da5cb5b14610135578063985fe13914610153578063c884ef831461016f578063cea9d26f1461019f576100ea565b80634e66fd17146100ef57806355f4f1b91461010d578063715018a61461012b575b600080fd5b6100f7610287565b6040516101049190611859565b60405180910390f35b6101156102ab565b6040516101229190611859565b60405180910390f35b6101336102cf565b005b61013d6102e3565b60405161014a9190611859565b60405180910390f35b61016d60048036038101906101689190611b6e565b61030c565b005b61018960048036038101906101849190611bdf565b6106d2565b6040516101969190611c1b565b60405180910390f35b6101b960048036038101906101b49190611c36565b6106ea565b005b6101d560048036038101906101d09190611b6e565b610722565b005b6101f160048036038101906101ec9190611c89565b610ade565b005b6101fb610b27565b6040516102089190611859565b60405180910390f35b610219610b4b565b6040516102269190611859565b60405180910390f35b610237610b6f565b6040516102449190611cc5565b60405180910390f35b61026760048036038101906102629190611bdf565b610b75565b005b610271610bfb565b60405161027e9190611c1b565b60405180910390f35b7f000000000000000000000000e36072dd051ce26261bf50cd966311cab62c596e81565b7f0000000000000000000000009af27cfbe0bc537dbc47fc314934353dad7b891981565b6102d7610c02565b6102e16000610c89565b565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6103163384610d4d565b6000600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205411610398576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161038f90611d3d565b60405180910390fd5b6103a28382610e54565b6103e1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016103d890611da9565b60405180910390fd5b6000600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054836020015184606001516104379190611df8565b6104419190611df8565b90506000846040015185602001516104599190611df8565b905080821461049d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161049490611e78565b60405180910390fd5b6000600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905084602001518560600151826104f69190611df8565b6105009190611df8565b600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506000818760200151886040015161055a9190611df8565b6105649190611e98565b905060008660400151146105ad576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016105a490611f18565b60405180910390fd5b60008660000151146105f4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016105eb90611f84565b60405180910390fd5b80866020015187606001516106099190611df8565b14610649576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161064090611ff0565b60405180910390fd5b610657338760200151610ea8565b6106653387606001516110a1565b3373ffffffffffffffffffffffffffffffffffffffff167fc01446d3d78ed04e0c35f1a1321e9cdc46459bd3699532660e6a84ffbf8162e48760000151886040015189602001518a606001516040516106c19493929190612010565b60405180910390a250505050505050565b60026020528060005260406000206000915090505481565b6106f2610c02565b61071d82828573ffffffffffffffffffffffffffffffffffffffff166111ad9092919063ffffffff16565b505050565b61072c3384610d4d565b6000600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054146107ae576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107a590611e78565b60405180910390fd5b6107b88382610e54565b6107f7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107ee90611da9565b60405180910390fd5b8160600151826000015161080b9190611df8565b600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550826020015182600001511115610899576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161089090611f18565b60405180910390fd5b826040015183602001516108ad9190611df8565b826060015183600001516108c19190611df8565b1115610902576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108f990611f84565b60405180910390fd5b826060015182604001511461094c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161094390611ff0565b60405180910390fd5b8260200151826060015183600001516109659190611df8565b10156109a6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161099d906120a1565b60405180910390fd5b60008260200151146109ed576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109e49061210d565b60405180910390fd5b60006109f9838561122c565b9050610a2a7f000000000000000000000000e36072dd051ce26261bf50cd966311cab62c596e33856000015161126d565b610a647f000000000000000000000000ec73284e4ec9bcea1a7dddf489eaa324c3f7dd3133838660400151610a5f9190611df8565b61126d565b610a723384606001516110a1565b3373ffffffffffffffffffffffffffffffffffffffff167ff46699b53d53d55a78d348eb226b9443ac118153c6a1dc4c6322c3e912151afd846000015185604001518660200151876060015186604051610ad095949392919061212d565b60405180910390a250505050565b610ae6610c02565b806001819055507f1b69d514bf94fc45c7379fc186902adc80eed92d11413dca7c40e5644729cb1f81604051610b1c9190611cc5565b60405180910390a150565b7f000000000000000000000000c6de1f30415352941f7ce784a67b2df1552386a481565b7f000000000000000000000000ec73284e4ec9bcea1a7dddf489eaa324c3f7dd3181565b60015481565b610b7d610c02565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603610bef5760006040517f1e4fbdf7000000000000000000000000000000000000000000000000000000008152600401610be69190611859565b60405180910390fd5b610bf881610c89565b50565b626ebe0081565b610c0a6112a7565b73ffffffffffffffffffffffffffffffffffffffff16610c286102e3565b73ffffffffffffffffffffffffffffffffffffffff1614610c8757610c4b6112a7565b6040517f118cdaa7000000000000000000000000000000000000000000000000000000008152600401610c7e9190611859565b60405180910390fd5b565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b8173ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1614610dbf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610db6906121cc565b60405180910390fd5b6000816020015111610e06576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dfd90612238565b60405180910390fd5b8060200151816040015114610e50576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e47906122a4565b60405180910390fd5b5050565b60008033846020015185604001518660600151604051602001610e7a949392919061232d565b604051602081830303815290604052805190602001209050610e9f83600154836112af565b91505092915050565b600081111561109d5760007f000000000000000000000000c6de1f30415352941f7ce784a67b2df1552386a473ffffffffffffffffffffffffffffffffffffffff1663cbf9fe5f846040518263ffffffff1660e01b8152600401610f0c9190611859565b6040805180830381865afa158015610f28573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f4c9190612419565b602001519050626ebe0042610f619190611df8565b811015610fa3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f9a90612492565b60405180910390fd5b61100e7f000000000000000000000000c6de1f30415352941f7ce784a67b2df1552386a4837f000000000000000000000000e36072dd051ce26261bf50cd966311cab62c596e73ffffffffffffffffffffffffffffffffffffffff166112c69092919063ffffffff16565b7f000000000000000000000000c6de1f30415352941f7ce784a67b2df1552386a473ffffffffffffffffffffffffffffffffffffffff16633a46273e84846040518363ffffffff1660e01b81526004016110699291906124b2565b600060405180830381600087803b15801561108357600080fd5b505af1158015611097573d6000803e3d6000fd5b50505050505b5050565b60008111156111a9576111157f0000000000000000000000009af27cfbe0bc537dbc47fc314934353dad7b8919827f000000000000000000000000e36072dd051ce26261bf50cd966311cab62c596e73ffffffffffffffffffffffffffffffffffffffff166112c69092919063ffffffff16565b7f0000000000000000000000009af27cfbe0bc537dbc47fc314934353dad7b891973ffffffffffffffffffffffffffffffffffffffff16631e97b6e98383600160006040518563ffffffff1660e01b815260040161117694939291906124f6565b600060405180830381600087803b15801561119057600080fd5b505af11580156111a4573d6000803e3d6000fd5b505050505b5050565b611227838473ffffffffffffffffffffffffffffffffffffffff1663a9059cbb85856040516024016111e09291906124b2565b604051602081830303815290604052915060e01b6020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050611362565b505050565b600080826040015183602001516112439190611df8565b9050808460600151856040015161125a919061253b565b61126491906125ac565b91505092915050565b60008111156112a2576112a182828573ffffffffffffffffffffffffffffffffffffffff166111ad9092919063ffffffff16565b5b505050565b600033905090565b6000826112bc85846113f9565b1490509392505050565b60008373ffffffffffffffffffffffffffffffffffffffff1663dd62ed3e30856040518363ffffffff1660e01b81526004016113039291906125dd565b602060405180830381865afa158015611320573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113449190612606565b905061135c848484846113579190611df8565b611449565b50505050565b600061138d828473ffffffffffffffffffffffffffffffffffffffff1661155890919063ffffffff16565b905060008151141580156113b25750808060200190518101906113b0919061265f565b155b156113f457826040517f5274afe70000000000000000000000000000000000000000000000000000000081526004016113eb9190611859565b60405180910390fd5b505050565b60008082905060005b845181101561143e5761142f828683815181106114225761142161268c565b5b602002602001015161156e565b91508080600101915050611402565b508091505092915050565b60008373ffffffffffffffffffffffffffffffffffffffff1663095ea7b3848460405160240161147a9291906124b2565b604051602081830303815290604052915060e01b6020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff838183161783525050505090506114c88482611599565b61155257611547848573ffffffffffffffffffffffffffffffffffffffff1663095ea7b3866000604051602401611500929190612700565b604051602081830303815290604052915060e01b6020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050611362565b6115518482611362565b5b50505050565b606061156683836000611660565b905092915050565b600081831061158657611581828461172d565b611591565b611590838361172d565b5b905092915050565b60008060008473ffffffffffffffffffffffffffffffffffffffff16846040516115c3919061279a565b6000604051808303816000865af19150503d8060008114611600576040519150601f19603f3d011682016040523d82523d6000602084013e611605565b606091505b50915091508180156116335750600081511480611632575080806020019051810190611631919061265f565b5b5b8015611656575060008573ffffffffffffffffffffffffffffffffffffffff163b115b9250505092915050565b6060814710156116a757306040517fcd78605900000000000000000000000000000000000000000000000000000000815260040161169e9190611859565b60405180910390fd5b6000808573ffffffffffffffffffffffffffffffffffffffff1684866040516116d0919061279a565b60006040518083038185875af1925050503d806000811461170d576040519150601f19603f3d011682016040523d82523d6000602084013e611712565b606091505b5091509150611722868383611744565b925050509392505050565b600082600052816020526040600020905092915050565b60608261175957611754826117d3565b6117cb565b60008251148015611781575060008473ffffffffffffffffffffffffffffffffffffffff163b145b156117c357836040517f9996b3150000000000000000000000000000000000000000000000000000000081526004016117ba9190611859565b60405180910390fd5b8190506117cc565b5b9392505050565b6000815111156117e65780518082602001fd5b6040517f1425ea4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600061184382611818565b9050919050565b61185381611838565b82525050565b600060208201905061186e600083018461184a565b92915050565b6000604051905090565b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6118d68261188d565b810181811067ffffffffffffffff821117156118f5576118f461189e565b5b80604052505050565b6000611908611874565b905061191482826118cd565b919050565b61192281611838565b811461192d57600080fd5b50565b60008135905061193f81611919565b92915050565b6000819050919050565b61195881611945565b811461196357600080fd5b50565b6000813590506119758161194f565b92915050565b60006080828403121561199157611990611888565b5b61199b60806118fe565b905060006119ab84828501611930565b60008301525060206119bf84828501611966565b60208301525060406119d384828501611966565b60408301525060606119e784828501611966565b60608301525092915050565b600060808284031215611a0957611a08611888565b5b611a1360806118fe565b90506000611a2384828501611966565b6000830152506020611a3784828501611966565b6020830152506040611a4b84828501611966565b6040830152506060611a5f84828501611966565b60608301525092915050565b600080fd5b600067ffffffffffffffff821115611a8b57611a8a61189e565b5b602082029050602081019050919050565b600080fd5b6000819050919050565b611ab481611aa1565b8114611abf57600080fd5b50565b600081359050611ad181611aab565b92915050565b6000611aea611ae584611a70565b6118fe565b90508083825260208201905060208402830185811115611b0d57611b0c611a9c565b5b835b81811015611b365780611b228882611ac2565b845260208401935050602081019050611b0f565b5050509392505050565b600082601f830112611b5557611b54611a6b565b5b8135611b65848260208601611ad7565b91505092915050565b60008060006101208486031215611b8857611b8761187e565b5b6000611b968682870161197b565b9350506080611ba7868287016119f3565b92505061010084013567ffffffffffffffff811115611bc957611bc8611883565b5b611bd586828701611b40565b9150509250925092565b600060208284031215611bf557611bf461187e565b5b6000611c0384828501611930565b91505092915050565b611c1581611945565b82525050565b6000602082019050611c306000830184611c0c565b92915050565b600080600060608486031215611c4f57611c4e61187e565b5b6000611c5d86828701611930565b9350506020611c6e86828701611930565b9250506040611c7f86828701611966565b9150509250925092565b600060208284031215611c9f57611c9e61187e565b5b6000611cad84828501611ac2565b91505092915050565b611cbf81611aa1565b82525050565b6000602082019050611cda6000830184611cb6565b92915050565b600082825260208201905092915050565b7f21706172744f6e65000000000000000000000000000000000000000000000000600082015250565b6000611d27600883611ce0565b9150611d3282611cf1565b602082019050919050565b60006020820190508181036000830152611d5681611d1a565b9050919050565b7f2170726f6f660000000000000000000000000000000000000000000000000000600082015250565b6000611d93600683611ce0565b9150611d9e82611d5d565b602082019050919050565b60006020820190508181036000830152611dc281611d86565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000611e0382611945565b9150611e0e83611945565b9250828201905080821115611e2657611e25611dc9565b5b92915050565b7f21636c61696d6564000000000000000000000000000000000000000000000000600082015250565b6000611e62600883611ce0565b9150611e6d82611e2c565b602082019050919050565b60006020820190508181036000830152611e9181611e55565b9050919050565b6000611ea382611945565b9150611eae83611945565b9250828203905081811115611ec657611ec5611dc9565b5b92915050565b7f312e206661696c65640000000000000000000000000000000000000000000000600082015250565b6000611f02600983611ce0565b9150611f0d82611ecc565b602082019050919050565b60006020820190508181036000830152611f3181611ef5565b9050919050565b7f322e206661696c65640000000000000000000000000000000000000000000000600082015250565b6000611f6e600983611ce0565b9150611f7982611f38565b602082019050919050565b60006020820190508181036000830152611f9d81611f61565b9050919050565b7f332e206661696c65640000000000000000000000000000000000000000000000600082015250565b6000611fda600983611ce0565b9150611fe582611fa4565b602082019050919050565b6000602082019050818103600083015261200981611fcd565b9050919050565b60006080820190506120256000830187611c0c565b6120326020830186611c0c565b61203f6040830185611c0c565b61204c6060830184611c0c565b95945050505050565b7f342e206661696c65640000000000000000000000000000000000000000000000600082015250565b600061208b600983611ce0565b915061209682612055565b602082019050919050565b600060208201905081810360008301526120ba8161207e565b9050919050565b7f352e206661696c65640000000000000000000000000000000000000000000000600082015250565b60006120f7600983611ce0565b9150612102826120c1565b602082019050919050565b60006020820190508181036000830152612126816120ea565b9050919050565b600060a0820190506121426000830188611c0c565b61214f6020830187611c0c565b61215c6040830186611c0c565b6121696060830185611c0c565b6121766080830184611c0c565b9695505050505050565b7f216163636f756e74000000000000000000000000000000000000000000000000600082015250565b60006121b6600883611ce0565b91506121c182612180565b602082019050919050565b600060208201905081810360008301526121e5816121a9565b9050919050565b7f2174687275737400000000000000000000000000000000000000000000000000600082015250565b6000612222600783611ce0565b915061222d826121ec565b602082019050919050565b6000602082019050818103600083015261225181612215565b9050919050565b7f746872757374213d766554687275737400000000000000000000000000000000600082015250565b600061228e601083611ce0565b915061229982612258565b602082019050919050565b600060208201905081810360008301526122bd81612281565b9050919050565b60008160601b9050919050565b60006122dc826122c4565b9050919050565b60006122ee826122d1565b9050919050565b61230661230182611838565b6122e3565b82525050565b6000819050919050565b61232761232282611945565b61230c565b82525050565b600061233982876122f5565b6014820191506123498286612316565b6020820191506123598285612316565b6020820191506123698284612316565b60208201915081905095945050505050565b600081600f0b9050919050565b6123918161237b565b811461239c57600080fd5b50565b6000815190506123ae81612388565b92915050565b6000815190506123c38161194f565b92915050565b6000604082840312156123df576123de611888565b5b6123e960406118fe565b905060006123f98482850161239f565b600083015250602061240d848285016123b4565b60208301525092915050565b60006040828403121561242f5761242e61187e565b5b600061243d848285016123c9565b91505092915050565b7f216c6f636b456e64000000000000000000000000000000000000000000000000600082015250565b600061247c600883611ce0565b915061248782612446565b602082019050919050565b600060208201905081810360008301526124ab8161246f565b9050919050565b60006040820190506124c7600083018561184a565b6124d46020830184611c0c565b9392505050565b60008115159050919050565b6124f0816124db565b82525050565b600060808201905061250b600083018761184a565b6125186020830186611c0c565b61252560408301856124e7565b612532606083018461184a565b95945050505050565b600061254682611945565b915061255183611945565b925082820261255f81611945565b9150828204841483151761257657612575611dc9565b5b5092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b60006125b782611945565b91506125c283611945565b9250826125d2576125d161257d565b5b828204905092915050565b60006040820190506125f2600083018561184a565b6125ff602083018461184a565b9392505050565b60006020828403121561261c5761261b61187e565b5b600061262a848285016123b4565b91505092915050565b61263c816124db565b811461264757600080fd5b50565b60008151905061265981612633565b92915050565b6000602082840312156126755761267461187e565b5b60006126838482850161264a565b91505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6000819050919050565b6000819050919050565b60006126ea6126e56126e0846126bb565b6126c5565b611945565b9050919050565b6126fa816126cf565b82525050565b6000604082019050612715600083018561184a565b61272260208301846126f1565b9392505050565b600081519050919050565b600081905092915050565b60005b8381101561275d578082015181840152602081019050612742565b60008484015250505050565b600061277482612729565b61277e8185612734565b935061278e81856020860161273f565b80840191505092915050565b60006127a68284612769565b91508190509291505056fea2646970667358221220d7703b86fc66b74369e19f672eb408a7d425c127c7cf0f59543b21114339730664736f6c63430008170033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e36072dd051ce26261bf50cd966311cab62c596e000000000000000000000000c6de1f30415352941f7ce784a67b2df1552386a4000000000000000000000000ec73284e4ec9bcea1a7dddf489eaa324c3f7dd310000000000000000000000009af27cfbe0bc537dbc47fc314934353dad7b8919
-----Decoded View---------------
Arg [0] : _root (bytes32): 0x0000000000000000000000000000000000000000000000000000000000000000
Arg [1] : _thrust (address): 0xE36072DD051Ce26261BF50CD966311cab62C596e
Arg [2] : _veThrust (address): 0xc6de1f30415352941f7ce784A67B2Df1552386a4
Arg [3] : _hyper (address): 0xEC73284E4EC9bcea1A7DDDf489eAA324C3F7dd31
Arg [4] : _crvDepositor (address): 0x9af27cFBe0bc537dbC47fC314934353Dad7B8919
-----Encoded View---------------
5 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000000
Arg [1] : 000000000000000000000000e36072dd051ce26261bf50cd966311cab62c596e
Arg [2] : 000000000000000000000000c6de1f30415352941f7ce784a67b2df1552386a4
Arg [3] : 000000000000000000000000ec73284e4ec9bcea1a7dddf489eaa324c3f7dd31
Arg [4] : 0000000000000000000000009af27cfbe0bc537dbc47fc314934353dad7b8919
Loading...
Loading
Loading...
Loading
Loading...
Loading
Loading...
Loading
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.