Latest 25 from a total of 17,485 transactions
| Transaction Hash |
|
Block
|
From
|
To
|
|||||
|---|---|---|---|---|---|---|---|---|---|
| Claim Part One | 14038581 | 374 days ago | IN | 0 ETH | 0.00000348 | ||||
| Claim Part One | 14001663 | 375 days ago | IN | 0 ETH | 0.00000018 | ||||
| Claim Part One | 13996735 | 375 days ago | IN | 0 ETH | 0.00000108 | ||||
| Claim Part One | 13994564 | 375 days ago | IN | 0 ETH | 0.00000076 | ||||
| Claim Part One | 13992985 | 375 days ago | IN | 0 ETH | 0.00000112 | ||||
| Claim Part One | 13984366 | 375 days ago | IN | 0 ETH | 0.00001817 | ||||
| Claim Part One | 13982126 | 375 days ago | IN | 0 ETH | 0.00002656 | ||||
| Claim Part One | 13957947 | 376 days ago | IN | 0 ETH | 0.00000026 | ||||
| Claim Part One | 13951145 | 376 days ago | IN | 0 ETH | 0.0000008 | ||||
| Claim Part One | 13945140 | 376 days ago | IN | 0 ETH | 0.00001144 | ||||
| Claim Part One | 13944080 | 376 days ago | IN | 0 ETH | 0.00000578 | ||||
| Claim Part One | 13939482 | 376 days ago | IN | 0 ETH | 0.00000016 | ||||
| Claim Part One | 13935556 | 377 days ago | IN | 0 ETH | 0.00000004 | ||||
| Claim Part One | 13935546 | 377 days ago | IN | 0 ETH | 0.00000015 | ||||
| Claim Part One | 13935210 | 377 days ago | IN | 0 ETH | 0.00000017 | ||||
| Claim Part One | 13930556 | 377 days ago | IN | 0 ETH | 0.00000015 | ||||
| Claim Part One | 13909953 | 377 days ago | IN | 0 ETH | 0.00000212 | ||||
| Claim Part One | 13909206 | 377 days ago | IN | 0 ETH | 0.00000232 | ||||
| Claim Part One | 13905219 | 377 days ago | IN | 0 ETH | 0.00000259 | ||||
| Claim Part One | 13899474 | 377 days ago | IN | 0 ETH | 0.00000069 | ||||
| Claim Part One | 13898169 | 377 days ago | IN | 0 ETH | 0.00000161 | ||||
| Claim Part One | 13894018 | 378 days ago | IN | 0 ETH | 0.00000046 | ||||
| Claim Part One | 13883912 | 378 days ago | IN | 0 ETH | 0.00000027 | ||||
| Claim Part One | 13883475 | 378 days ago | IN | 0 ETH | 0.0000009 | ||||
| Claim Part One | 13870490 | 378 days ago | IN | 0 ETH | 0.000001 |
View more zero value Internal Transactions in Advanced View mode
Advanced mode:
Cross-Chain Transactions
Loading...
Loading
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
Net Worth in USD
$0.00
Net Worth in ETH
0
Multichain Portfolio | 35 Chains
| Chain | Token | Portfolio % | Price | Amount | Value |
|---|
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.