Source Code
Overview
ETH Balance
0 ETH
Eth Value
$0.00View more zero value Internal Transactions in Advanced View mode
Advanced mode:
Loading...
Loading
Loading...
Loading
Cross-Chain Transactions
Loading...
Loading
Contract Name:
CurveFraxConvexStrategy
Compiler Version
v0.8.14+commit.80d49f37
Optimization Enabled:
Yes with 1000000 runs
Other Settings:
default evmVersion
Contract Source Code (Solidity Standard Json-Input format)
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.11;
import "@openzeppelin/contracts/access/AccessControl.sol";
import "@openzeppelin/contracts/utils/Address.sol";
import "@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol";
import "@openzeppelin/contracts/interfaces/IERC20.sol";
import "./../../IAlluoStrategy.sol";
import "./interfaces/ICvxBooster.sol";
import "./interfaces/ICvxBaseRewardPool.sol";
import "../../mock/IWrappedEther.sol";
import "../../interfaces/IExchange.sol";
import "./interfaces/IFraxFarmERC20.sol";
import "./interfaces/IConvexWrapper.sol";
contract CurveFraxConvexStrategy is AccessControl, IAlluoStrategy {
using Address for address;
using SafeERC20 for IERC20;
event Locked(bytes32 data);
ICvxBooster public constant cvxBooster =
ICvxBooster(0xF403C135812408BFbE8713b5A23a04b3D48AAE31);
IExchange public constant exchange =
IExchange(0x29c66CF57a03d41Cfe6d9ecB6883aa0E2AbA21Ec);
IERC20 public constant cvxRewards =
IERC20(0x4e3FBD56CD56c3e72c1403e103b45Db9da5B9D2B);
IERC20 public constant crvRewards =
IERC20(0xD533a949740bb3306d119CC777fa900bA034cd52);
IERC20 public constant fraxRewards =
IERC20(0x3432B6A60D23Ca0dFCa7761B7ab56459D9C964D0);
uint8 public constant unwindDecimals = 2;
receive() external payable {
}
constructor(
address voteExecutor,
address gnosis,
bool isTesting
) {
if (isTesting) _grantRole(DEFAULT_ADMIN_ROLE, msg.sender);
else {
require(
voteExecutor.isContract(),
"CurveConvexStrategy: 1!contract"
);
require(gnosis.isContract(), "CurveConvexStrategy: 2!contract");
_grantRole(DEFAULT_ADMIN_ROLE, gnosis);
_grantRole(DEFAULT_ADMIN_ROLE, voteExecutor);
}
}
function invest(bytes calldata data, uint256 amount)
external
onlyRole(DEFAULT_ADMIN_ROLE)
returns (bytes memory)
{
(
address curvePool,
IERC20 crvLpToken,
IERC20 poolToken,
uint8 poolSize,
uint8 tokenIndexInCurve,
uint256 poolId,
IERC20 stakeToken,
address fraxPool,
uint256 duration
) = decodeEntryParams(data);
poolToken.safeIncreaseAllowance(curvePool, amount);
// prepare amounts array for curve
uint256[4] memory fourPoolTokensAmount;
fourPoolTokensAmount[tokenIndexInCurve] = amount;
// encode call to curve - this ugly code handles different curve pool
// sizes and function selectors
bytes memory curveCall;
if (poolSize == 2) {
curveCall = abi.encodeWithSelector(
0x0b4c7e4d,
uint256[2]([fourPoolTokensAmount[0], fourPoolTokensAmount[1]]),
0
);
} else if (poolSize == 3) {
curveCall = abi.encodeWithSelector(
0x4515cef3,
uint256[3](
[
fourPoolTokensAmount[0],
fourPoolTokensAmount[1],
fourPoolTokensAmount[2]
]
),
0
);
} else {
curveCall = abi.encodeWithSelector(
0x029b2f34,
fourPoolTokensAmount,
0
);
}
// execute call
curvePool.functionCall(curveCall);
bytes32 kek_id;
// skip investment in convex, if poolId is uint256 max value
if (poolId != type(uint256).max) {
// invest tokens to convex
uint256 crvLpAmount = crvLpToken.balanceOf(address(this));
crvLpToken.safeIncreaseAllowance(address(stakeToken), crvLpAmount);
// Deposit these crvLptokens into the convex wrapper to get staked fraxLP tokens
IConvexWrapper(address(stakeToken)).deposit(crvLpAmount, address(this));
uint256 fraxLpAmount = stakeToken.balanceOf(address(this));
stakeToken.safeIncreaseAllowance(fraxPool, fraxLpAmount);
// Now stake and lock these LP tokens into the frax farm.
kek_id = IFraxFarmERC20(fraxPool).stakeLocked(fraxLpAmount, duration);
}
emit Locked(kek_id);
return
encodeExitParams(
curvePool,
address(poolToken),
address(crvLpToken),
tokenIndexInCurve,
poolId,
address(fraxPool),
kek_id
);
}
function exitAll(
bytes calldata data,
uint256 unwindPercent,
address outputCoin,
address receiver,
bool swapRewards
) external onlyRole(DEFAULT_ADMIN_ROLE) {
(
address curvePool,
IERC20 poolToken,
IERC20 crvLpToken,
uint8 tokenIndexInCurve,
uint256 convexPoolId,
address fraxPool,
bytes32 kek_id
) = decodeExitParams(data);
uint256 lpAmount;
if (convexPoolId != type(uint256).max) {
// Withdraw locked fraxLP tokens.
// Get all rewards accumulated.
address[] memory fraxPoolRewards = IFraxFarmERC20(fraxPool).getAllRewardTokens();
IFraxFarmERC20(fraxPool).withdrawLocked(kek_id, address(this));
// Get rewards from Frax
IFraxFarmERC20(fraxPool).getReward(address(this));
// Get rewards from Convex
IConvexWrapper(IFraxFarmERC20(fraxPool).stakingToken()).getReward(address(this));
// Simply send all frax rewards to receiver.
for (uint256 i; i < fraxPoolRewards.length; i++) {
IERC20(fraxPoolRewards[i]).transfer(receiver, IERC20(fraxPoolRewards[i]).balanceOf(address(this)));
}
// Withdraw all the curveLPs and curve rewards.
lpAmount =
( IERC20(IFraxFarmERC20(fraxPool).stakingToken()).balanceOf(address(this)) * unwindPercent) /
(10**(2 + unwindDecimals));
IConvexWrapper(IFraxFarmERC20(fraxPool).stakingToken()).withdrawAndUnwrap(lpAmount);
} else {
lpAmount = crvLpToken.balanceOf(address(this)) * unwindPercent / 10000;
}
if (lpAmount == 0) return;
// exit with coin that we used for entry
bytes memory curveCall = abi.encodeWithSignature(
"remove_liquidity_one_coin(uint256,int128,uint256)",
lpAmount,
tokenIndexInCurve,
0
);
curvePool.functionCall(curveCall);
// execute exchanges and transfer all tokens to receiver
exchangeAll(poolToken, IERC20(outputCoin));
manageRewardsAndWithdraw(swapRewards, IERC20(outputCoin), receiver);
}
function exitOnlyRewards(
bytes calldata data,
address outputCoin,
address receiver,
bool swapRewards
) external onlyRole(DEFAULT_ADMIN_ROLE) {
(
,
,
,
,
uint256 convexPoolId,
address fraxPool,
) = decodeExitParams(data);
if (convexPoolId != type(uint256).max) {
// Withdraw locked fraxLP tokens.
// Get all rewards accumulated.
address[] memory fraxPoolRewards = IFraxFarmERC20(fraxPool).getAllRewardTokens();
// Get rewards from Frax
IFraxFarmERC20(fraxPool).getReward(address(this));
// Get rewards from Convex
IConvexWrapper(IFraxFarmERC20(fraxPool).stakingToken()).getReward(address(this), address(this));
// Simply send all rewards to receiver.
for (uint256 i; i < fraxPoolRewards.length; i++) {
IERC20(fraxPoolRewards[i]).transfer(receiver, IERC20(fraxPoolRewards[i]).balanceOf(address(this)));
}
} else {
ICvxBaseRewardPool rewards = getCvxRewardPool(convexPoolId);
rewards.getReward(address(this), true);
}
manageRewardsAndWithdraw(swapRewards, IERC20(outputCoin), receiver);
}
function multicall(
address[] calldata destinations,
bytes[] calldata calldatas
) external onlyRole(DEFAULT_ADMIN_ROLE) {
uint256 length = destinations.length;
require(length == calldatas.length, "CurveConvexStrategy: lengths");
for (uint256 i = 0; i < length; i++) {
destinations[i].functionCall(calldatas[i]);
}
}
function encodeEntryParams(
address curvePool,
address crvLpToken,
address poolToken,
uint8 poolSize,
uint8 tokenIndexInCurve,
uint256 convexPoolId,
address stakeToken,
address fraxPool,
uint256 duration
) external pure returns (bytes memory) {
return
abi.encode(
curvePool,
crvLpToken,
poolToken,
poolSize,
tokenIndexInCurve,
convexPoolId,
stakeToken,
fraxPool,
duration
);
}
function encodeExitParams(
address curvePool,
address poolToken,
address crvLpToken,
uint8 tokenIndexInCurve,
uint256 convexPoolId,
address fraxPool,
bytes32 kek
) public pure returns (bytes memory) {
return
abi.encode(
curvePool,
poolToken,
crvLpToken,
tokenIndexInCurve,
convexPoolId,
fraxPool,
kek
);
}
function decodeEntryParams(bytes calldata data)
public
pure
returns (
address,
IERC20,
IERC20,
uint8,
uint8,
uint256,
IERC20,
address,
uint256
)
{
require(data.length == 32 * 9, "CurveConvexStrategy: length en");
return
abi.decode(data, (address, IERC20, IERC20, uint8, uint8, uint256, IERC20, address, uint256));
}
function decodeExitParams(bytes calldata data)
public
pure
returns (
address,
IERC20,
IERC20,
uint8,
uint256,
address,
bytes32
)
{
require(data.length == 32 * 7, "CurveConvexStrategy: length ex");
return abi.decode(data, (address, IERC20, IERC20, uint8, uint256, address,bytes32));
}
function exchangeAll(IERC20 fromCoin, IERC20 toCoin) private {
if (fromCoin == toCoin) return;
uint256 amount = IERC20(fromCoin).balanceOf(address(this));
if (amount == 0) return;
fromCoin.safeApprove(address(exchange), amount);
exchange.exchange(address(fromCoin), address(toCoin), amount, 0);
}
function manageRewardsAndWithdraw(
bool swapRewards,
IERC20 outputCoin,
address receiver
) private {
if (swapRewards) {
exchangeAll(cvxRewards, outputCoin);
exchangeAll(crvRewards, outputCoin);
} else {
cvxRewards.safeTransfer(
receiver,
cvxRewards.balanceOf(address(this))
);
crvRewards.safeTransfer(
receiver,
crvRewards.balanceOf(address(this))
);
}
outputCoin.safeTransfer(receiver, outputCoin.balanceOf(address(this)));
}
function getCvxRewardPool(uint256 poolId)
private
view
returns (ICvxBaseRewardPool)
{
(, , , address pool, , ) = cvxBooster.poolInfo(poolId);
return ICvxBaseRewardPool(pool);
}
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (access/AccessControl.sol)
pragma solidity ^0.8.0;
import "./IAccessControl.sol";
import "../utils/Context.sol";
import "../utils/Strings.sol";
import "../utils/introspection/ERC165.sol";
/**
* @dev Contract module that allows children to implement role-based access
* control mechanisms. This is a lightweight version that doesn't allow enumerating role
* members except through off-chain means by accessing the contract event logs. Some
* applications may benefit from on-chain enumerability, for those cases see
* {AccessControlEnumerable}.
*
* Roles are referred to by their `bytes32` identifier. These should be exposed
* in the external API and be unique. The best way to achieve this is by
* using `public constant` hash digests:
*
* ```
* bytes32 public constant MY_ROLE = keccak256("MY_ROLE");
* ```
*
* Roles can be used to represent a set of permissions. To restrict access to a
* function call, use {hasRole}:
*
* ```
* function foo() public {
* require(hasRole(MY_ROLE, msg.sender));
* ...
* }
* ```
*
* Roles can be granted and revoked dynamically via the {grantRole} and
* {revokeRole} functions. Each role has an associated admin role, and only
* accounts that have a role's admin role can call {grantRole} and {revokeRole}.
*
* By default, the admin role for all roles is `DEFAULT_ADMIN_ROLE`, which means
* that only accounts with this role will be able to grant or revoke other
* roles. More complex role relationships can be created by using
* {_setRoleAdmin}.
*
* WARNING: The `DEFAULT_ADMIN_ROLE` is also its own admin: it has permission to
* grant and revoke this role. Extra precautions should be taken to secure
* accounts that have been granted it.
*/
abstract contract AccessControl is Context, IAccessControl, ERC165 {
struct RoleData {
mapping(address => bool) members;
bytes32 adminRole;
}
mapping(bytes32 => RoleData) private _roles;
bytes32 public constant DEFAULT_ADMIN_ROLE = 0x00;
/**
* @dev Modifier that checks that an account has a specific role. Reverts
* with a standardized message including the required role.
*
* The format of the revert reason is given by the following regular expression:
*
* /^AccessControl: account (0x[0-9a-f]{40}) is missing role (0x[0-9a-f]{64})$/
*
* _Available since v4.1._
*/
modifier onlyRole(bytes32 role) {
_checkRole(role, _msgSender());
_;
}
/**
* @dev See {IERC165-supportsInterface}.
*/
function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
return interfaceId == type(IAccessControl).interfaceId || super.supportsInterface(interfaceId);
}
/**
* @dev Returns `true` if `account` has been granted `role`.
*/
function hasRole(bytes32 role, address account) public view override returns (bool) {
return _roles[role].members[account];
}
/**
* @dev Revert with a standard message if `account` is missing `role`.
*
* The format of the revert reason is given by the following regular expression:
*
* /^AccessControl: account (0x[0-9a-f]{40}) is missing role (0x[0-9a-f]{64})$/
*/
function _checkRole(bytes32 role, address account) internal view {
if (!hasRole(role, account)) {
revert(
string(
abi.encodePacked(
"AccessControl: account ",
Strings.toHexString(uint160(account), 20),
" is missing role ",
Strings.toHexString(uint256(role), 32)
)
)
);
}
}
/**
* @dev Returns the admin role that controls `role`. See {grantRole} and
* {revokeRole}.
*
* To change a role's admin, use {_setRoleAdmin}.
*/
function getRoleAdmin(bytes32 role) public view override returns (bytes32) {
return _roles[role].adminRole;
}
/**
* @dev Grants `role` to `account`.
*
* If `account` had not been already granted `role`, emits a {RoleGranted}
* event.
*
* Requirements:
*
* - the caller must have ``role``'s admin role.
*/
function grantRole(bytes32 role, address account) public virtual override onlyRole(getRoleAdmin(role)) {
_grantRole(role, account);
}
/**
* @dev Revokes `role` from `account`.
*
* If `account` had been granted `role`, emits a {RoleRevoked} event.
*
* Requirements:
*
* - the caller must have ``role``'s admin role.
*/
function revokeRole(bytes32 role, address account) public virtual override onlyRole(getRoleAdmin(role)) {
_revokeRole(role, account);
}
/**
* @dev Revokes `role` from the calling account.
*
* Roles are often managed via {grantRole} and {revokeRole}: this function's
* purpose is to provide a mechanism for accounts to lose their privileges
* if they are compromised (such as when a trusted device is misplaced).
*
* If the calling account had been revoked `role`, emits a {RoleRevoked}
* event.
*
* Requirements:
*
* - the caller must be `account`.
*/
function renounceRole(bytes32 role, address account) public virtual override {
require(account == _msgSender(), "AccessControl: can only renounce roles for self");
_revokeRole(role, account);
}
/**
* @dev Grants `role` to `account`.
*
* If `account` had not been already granted `role`, emits a {RoleGranted}
* event. Note that unlike {grantRole}, this function doesn't perform any
* checks on the calling account.
*
* [WARNING]
* ====
* This function should only be called from the constructor when setting
* up the initial roles for the system.
*
* Using this function in any other way is effectively circumventing the admin
* system imposed by {AccessControl}.
* ====
*
* NOTE: This function is deprecated in favor of {_grantRole}.
*/
function _setupRole(bytes32 role, address account) internal virtual {
_grantRole(role, account);
}
/**
* @dev Sets `adminRole` as ``role``'s admin role.
*
* Emits a {RoleAdminChanged} event.
*/
function _setRoleAdmin(bytes32 role, bytes32 adminRole) internal virtual {
bytes32 previousAdminRole = getRoleAdmin(role);
_roles[role].adminRole = adminRole;
emit RoleAdminChanged(role, previousAdminRole, adminRole);
}
/**
* @dev Grants `role` to `account`.
*
* Internal function without access restriction.
*/
function _grantRole(bytes32 role, address account) internal virtual {
if (!hasRole(role, account)) {
_roles[role].members[account] = true;
emit RoleGranted(role, account, _msgSender());
}
}
/**
* @dev Revokes `role` from `account`.
*
* Internal function without access restriction.
*/
function _revokeRole(bytes32 role, address account) internal virtual {
if (hasRole(role, account)) {
_roles[role].members[account] = false;
emit RoleRevoked(role, account, _msgSender());
}
}
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (utils/Address.sol)
pragma solidity ^0.8.0;
/**
* @dev Collection of functions related to the address type
*/
library Address {
/**
* @dev Returns true if `account` is a contract.
*
* [IMPORTANT]
* ====
* It is unsafe to assume that an address for which this function returns
* false is an externally-owned account (EOA) and not a contract.
*
* Among others, `isContract` will return false for the following
* types of addresses:
*
* - an externally-owned account
* - a contract in construction
* - an address where a contract will be created
* - an address where a contract lived, but was destroyed
* ====
*/
function isContract(address account) internal view returns (bool) {
// This method relies on extcodesize, which returns 0 for contracts in
// construction, since the code is only stored at the end of the
// constructor execution.
uint256 size;
assembly {
size := extcodesize(account)
}
return size > 0;
}
/**
* @dev Replacement for Solidity's `transfer`: sends `amount` wei to
* `recipient`, forwarding all available gas and reverting on errors.
*
* https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost
* of certain opcodes, possibly making contracts go over the 2300 gas limit
* imposed by `transfer`, making them unable to receive funds via
* `transfer`. {sendValue} removes this limitation.
*
* https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more].
*
* IMPORTANT: because control is transferred to `recipient`, care must be
* taken to not create reentrancy vulnerabilities. Consider using
* {ReentrancyGuard} or the
* https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].
*/
function sendValue(address payable recipient, uint256 amount) internal {
require(address(this).balance >= amount, "Address: insufficient balance");
(bool success, ) = recipient.call{value: amount}("");
require(success, "Address: unable to send value, recipient may have reverted");
}
/**
* @dev Performs a Solidity function call using a low level `call`. A
* plain `call` is an unsafe replacement for a function call: use this
* function instead.
*
* If `target` reverts with a revert reason, it is bubbled up by this
* function (like regular Solidity function calls).
*
* Returns the raw returned data. To convert to the expected return value,
* use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`].
*
* Requirements:
*
* - `target` must be a contract.
* - calling `target` with `data` must not revert.
*
* _Available since v3.1._
*/
function functionCall(address target, bytes memory data) internal returns (bytes memory) {
return functionCall(target, data, "Address: low-level call failed");
}
/**
* @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with
* `errorMessage` as a fallback revert reason when `target` reverts.
*
* _Available since v3.1._
*/
function functionCall(
address target,
bytes memory data,
string memory errorMessage
) internal returns (bytes memory) {
return functionCallWithValue(target, data, 0, errorMessage);
}
/**
* @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
* but also transferring `value` wei to `target`.
*
* Requirements:
*
* - the calling contract must have an ETH balance of at least `value`.
* - the called Solidity function must be `payable`.
*
* _Available since v3.1._
*/
function functionCallWithValue(
address target,
bytes memory data,
uint256 value
) internal returns (bytes memory) {
return functionCallWithValue(target, data, value, "Address: low-level call with value failed");
}
/**
* @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but
* with `errorMessage` as a fallback revert reason when `target` reverts.
*
* _Available since v3.1._
*/
function functionCallWithValue(
address target,
bytes memory data,
uint256 value,
string memory errorMessage
) internal returns (bytes memory) {
require(address(this).balance >= value, "Address: insufficient balance for call");
require(isContract(target), "Address: call to non-contract");
(bool success, bytes memory returndata) = target.call{value: value}(data);
return verifyCallResult(success, returndata, errorMessage);
}
/**
* @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
* but performing a static call.
*
* _Available since v3.3._
*/
function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {
return functionStaticCall(target, data, "Address: low-level static call failed");
}
/**
* @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
* but performing a static call.
*
* _Available since v3.3._
*/
function functionStaticCall(
address target,
bytes memory data,
string memory errorMessage
) internal view returns (bytes memory) {
require(isContract(target), "Address: static call to non-contract");
(bool success, bytes memory returndata) = target.staticcall(data);
return verifyCallResult(success, returndata, errorMessage);
}
/**
* @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
* but performing a delegate call.
*
* _Available since v3.4._
*/
function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) {
return functionDelegateCall(target, data, "Address: low-level delegate call failed");
}
/**
* @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
* but performing a delegate call.
*
* _Available since v3.4._
*/
function functionDelegateCall(
address target,
bytes memory data,
string memory errorMessage
) internal returns (bytes memory) {
require(isContract(target), "Address: delegate call to non-contract");
(bool success, bytes memory returndata) = target.delegatecall(data);
return verifyCallResult(success, returndata, errorMessage);
}
/**
* @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the
* revert reason using the provided one.
*
* _Available since v4.3._
*/
function verifyCallResult(
bool success,
bytes memory returndata,
string memory errorMessage
) internal pure returns (bytes memory) {
if (success) {
return returndata;
} else {
// Look for revert reason and bubble it up if present
if (returndata.length > 0) {
// The easiest way to bubble the revert reason is using memory via assembly
assembly {
let returndata_size := mload(returndata)
revert(add(32, returndata), returndata_size)
}
} else {
revert(errorMessage);
}
}
}
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (token/ERC20/utils/SafeERC20.sol)
pragma solidity ^0.8.0;
import "../IERC20.sol";
import "../../../utils/Address.sol";
/**
* @title SafeERC20
* @dev Wrappers around ERC20 operations that throw on failure (when the token
* contract returns false). Tokens that return no value (and instead revert or
* throw on failure) are also supported, non-reverting calls are assumed to be
* successful.
* To use this library you can add a `using SafeERC20 for IERC20;` statement to your contract,
* which allows you to call the safe operations as `token.safeTransfer(...)`, etc.
*/
library SafeERC20 {
using Address for address;
function safeTransfer(
IERC20 token,
address to,
uint256 value
) internal {
_callOptionalReturn(token, abi.encodeWithSelector(token.transfer.selector, to, value));
}
function safeTransferFrom(
IERC20 token,
address from,
address to,
uint256 value
) internal {
_callOptionalReturn(token, abi.encodeWithSelector(token.transferFrom.selector, from, to, value));
}
/**
* @dev Deprecated. This function has issues similar to the ones found in
* {IERC20-approve}, and its usage is discouraged.
*
* Whenever possible, use {safeIncreaseAllowance} and
* {safeDecreaseAllowance} instead.
*/
function safeApprove(
IERC20 token,
address spender,
uint256 value
) internal {
// safeApprove should only be called when setting an initial allowance,
// or when resetting it to zero. To increase and decrease it, use
// 'safeIncreaseAllowance' and 'safeDecreaseAllowance'
require(
(value == 0) || (token.allowance(address(this), spender) == 0),
"SafeERC20: approve from non-zero to non-zero allowance"
);
_callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, value));
}
function safeIncreaseAllowance(
IERC20 token,
address spender,
uint256 value
) internal {
uint256 newAllowance = token.allowance(address(this), spender) + value;
_callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance));
}
function safeDecreaseAllowance(
IERC20 token,
address spender,
uint256 value
) internal {
unchecked {
uint256 oldAllowance = token.allowance(address(this), spender);
require(oldAllowance >= value, "SafeERC20: decreased allowance below zero");
uint256 newAllowance = oldAllowance - value;
_callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance));
}
}
/**
* @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement
* on the return value: the return value is optional (but if data is returned, it must not be false).
* @param token The token targeted by the call.
* @param data The call data (encoded using abi.encode or one of its variants).
*/
function _callOptionalReturn(IERC20 token, bytes memory data) private {
// We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since
// we're implementing it ourselves. We use {Address.functionCall} to perform this call, which verifies that
// the target address contains contract code and also asserts for success in the low-level call.
bytes memory returndata = address(token).functionCall(data, "SafeERC20: low-level call failed");
if (returndata.length > 0) {
// Return data is optional
require(abi.decode(returndata, (bool)), "SafeERC20: ERC20 operation did not succeed");
}
}
}// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (interfaces/IERC20.sol) pragma solidity ^0.8.0; import "../token/ERC20/IERC20.sol";
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.11;
interface IAlluoStrategy {
/// @notice Invest tokens transferred to this contract.
/// @dev Amount of tokens specified in `amount` is guranteed to be
/// transferred to strategy by vote executor.
/// @param data whatever data you want to pass to strategy from vote extry.
/// @param amount amount of your tokens that will be invested.
/// @return data that MUST be passed in exiting functions
function invest(bytes calldata data, uint256 amount)
external
returns (bytes memory);
/// @notice Uninvest value and tranfer exchanged value to receiver.
/// @param data whatever data you want to pass to strategy from vote extry.
/// @param unwindPercent percentage of available assets to be released with 2 decimal points.
/// @param outputCoin address of token that strategy MUST return.
/// @param receiver address where tokens should go.
/// @param swapRewards true if rewards are needed to swap to `outputCoin`, false otherwise.
function exitAll(
bytes calldata data,
uint256 unwindPercent,
address outputCoin,
address receiver,
bool swapRewards
) external;
/// @notice Claim available rewards.
/// @param data whatever data you want to pass to strategy from vote extry.
/// @param outputCoin address of token that strategy MUST return (if swapRewards is true).
/// @param receiver address where tokens should go.
/// @param swapRewards true if rewards are needed to swap to `outputCoin`, false otherwise.
function exitOnlyRewards(
bytes calldata data,
address outputCoin,
address receiver,
bool swapRewards
) external;
/// @notice Execute any action on behalf of strategy.
/// @dev Regular call is executed. If any of extcall fails, transaction should revert.
/// @param destinations addresses to call
/// @param calldatas calldatas to execute
function multicall(
address[] calldata destinations,
bytes[] calldata calldatas
) external;
}// SPDX-License-Identifier: MIT
pragma solidity ^0.8.11;
// Interface from ABI of
// https://etherscan.io/address/0xF403C135812408BFbE8713b5A23a04b3D48AAE31
// Built with https://bia.is/tools/abi2solidity/
// solhint-disable func-name-mixedcase
interface ICvxBooster {
function FEE_DENOMINATOR() external view returns (uint256);
function MaxFees() external view returns (uint256);
function addPool(
address _lptoken,
address _gauge,
uint256 _stashVersion
) external returns (bool);
function claimRewards(uint256 _pid, address _gauge) external returns (bool);
function crv() external view returns (address);
function deposit(
uint256 _pid,
uint256 _amount,
bool _stake
) external returns (bool);
function depositAll(uint256 _pid, bool _stake) external returns (bool);
function distributionAddressId() external view returns (uint256);
function earmarkFees() external returns (bool);
function earmarkIncentive() external view returns (uint256);
function earmarkRewards(uint256 _pid) external returns (bool);
function feeDistro() external view returns (address);
function feeManager() external view returns (address);
function feeToken() external view returns (address);
function gaugeMap(address) external view returns (bool);
function isShutdown() external view returns (bool);
function lockFees() external view returns (address);
function lockIncentive() external view returns (uint256);
function lockRewards() external view returns (address);
function minter() external view returns (address);
function owner() external view returns (address);
function platformFee() external view returns (uint256);
function poolInfo(uint256)
external
view
returns (
address lptoken,
address token,
address gauge,
address crvRewards,
address stash,
bool shutdown
);
function poolLength() external view returns (uint256);
function poolManager() external view returns (address);
function registry() external view returns (address);
function rewardArbitrator() external view returns (address);
function rewardClaimed(
uint256 _pid,
address _address,
uint256 _amount
) external returns (bool);
function rewardFactory() external view returns (address);
function setArbitrator(address _arb) external;
function setFactories(
address _rfactory,
address _sfactory,
address _tfactory
) external;
function setFeeInfo() external;
function setFeeManager(address _feeM) external;
function setFees(
uint256 _lockFees,
uint256 _stakerFees,
uint256 _callerFees,
uint256 _platform
) external;
function setGaugeRedirect(uint256 _pid) external returns (bool);
function setOwner(address _owner) external;
function setPoolManager(address _poolM) external;
function setRewardContracts(address _rewards, address _stakerRewards)
external;
function setTreasury(address _treasury) external;
function setVoteDelegate(address _voteDelegate) external;
function shutdownPool(uint256 _pid) external returns (bool);
function shutdownSystem() external;
function staker() external view returns (address);
function stakerIncentive() external view returns (uint256);
function stakerRewards() external view returns (address);
function stashFactory() external view returns (address);
function tokenFactory() external view returns (address);
function treasury() external view returns (address);
function vote(
uint256 _voteId,
address _votingAddress,
bool _support
) external returns (bool);
function voteDelegate() external view returns (address);
function voteGaugeWeight(address[] memory _gauge, uint256[] memory _weight)
external
returns (bool);
function voteOwnership() external view returns (address);
function voteParameter() external view returns (address);
function withdraw(uint256 _pid, uint256 _amount) external returns (bool);
function withdrawAll(uint256 _pid) external returns (bool);
function withdrawTo(
uint256 _pid,
uint256 _amount,
address _to
) external returns (bool);
}// SPDX-License-Identifier: MIT
pragma solidity ^0.8.11;
// Interface from ABI of
// https://etherscan.io/address/0xB900EF131301B307dB5eFcbed9DBb50A3e209B2e
// Built with https://bia.is/tools/abi2solidity/
interface ICvxBaseRewardPool {
function addExtraReward(address _reward) external returns (bool);
function balanceOf(address account) external view returns (uint256);
function clearExtraRewards() external;
function currentRewards() external view returns (uint256);
function donate(uint256 _amount) external returns (bool);
function duration() external view returns (uint256);
function earned(address account) external view returns (uint256);
function extraRewards(uint256) external view returns (address);
function extraRewardsLength() external view returns (uint256);
function getReward() external returns (bool);
function getReward(address _account, bool _claimExtras)
external
returns (bool);
function historicalRewards() external view returns (uint256);
function lastTimeRewardApplicable() external view returns (uint256);
function lastUpdateTime() external view returns (uint256);
function newRewardRatio() external view returns (uint256);
function operator() external view returns (address);
function periodFinish() external view returns (uint256);
function pid() external view returns (uint256);
function queueNewRewards(uint256 _rewards) external returns (bool);
function queuedRewards() external view returns (uint256);
function rewardManager() external view returns (address);
function rewardPerToken() external view returns (uint256);
function rewardPerTokenStored() external view returns (uint256);
function rewardRate() external view returns (uint256);
function rewardToken() external view returns (address);
function rewards(address) external view returns (uint256);
function stake(uint256 _amount) external returns (bool);
function stakeAll() external returns (bool);
function stakeFor(address _for, uint256 _amount) external returns (bool);
function stakingToken() external view returns (address);
function totalSupply() external view returns (uint256);
function userRewardPerTokenPaid(address) external view returns (uint256);
function withdraw(uint256 amount, bool claim) external returns (bool);
function withdrawAll(bool claim) external;
function withdrawAllAndUnwrap(bool claim) external;
function withdrawAndUnwrap(uint256 amount, bool claim)
external
returns (bool);
}// SPDX-License-Identifier: MIT
pragma solidity 0.8.14;
interface IWrappedEther {
function name() external view returns (string memory);
function approve(address guy, uint256 wad) external returns (bool);
function totalSupply() external view returns (uint256);
function transferFrom(
address src,
address dst,
uint256 wad
) external returns (bool);
function withdraw(uint256 wad) external;
function decimals() external view returns (uint8);
function balanceOf(address) external view returns (uint256);
function symbol() external view returns (string memory);
function transfer(address dst, uint256 wad) external returns (bool);
function deposit() external payable;
function allowance(address, address) external view returns (uint256);
}// SPDX-License-Identifier: MIT
pragma solidity ^0.8.11;
interface IExchange {
struct RouteEdge {
uint32 swapProtocol; // 0 - unknown edge, 1 - UniswapV2, 2 - Curve...
address pool; // address of pool to call
address fromCoin; // address of coin to deposit to pool
address toCoin; // address of coin to get from pool
}
struct LpToken {
uint32 swapProtocol; // 0 - unknown edge, 1 - UniswapV2, 2 - Curve...
address pool; // address of pool to call
}
function exchange(
address from,
address to,
uint256 amountIn,
uint256 minAmountOut
) external payable returns (uint256);
function createInternalMajorRoutes(RouteEdge[][] calldata routes) external;
function createLpToken(
LpToken[] calldata edges,
address[] calldata lpTokensAddress,
address[][] calldata entryCoins
) external;
function createApproval(
address[] calldata coins,
address[] calldata spenders
) external;
function registerAdapters(
address[] calldata adapters_,
uint32[] calldata protocolId
) external;
function createMinorCoinEdge(RouteEdge[] calldata edges) external;
}// SPDX-License-Identifier: MIT
pragma solidity >=0.8.0;
interface IFraxFarmERC20 {
struct LockedStake {
bytes32 kek_id;
uint256 start_timestamp;
uint256 liquidity;
uint256 ending_timestamp;
uint256 lock_multiplier; // 6 decimals of precision. 1x = 1000000
}
struct EarnedData {
address token;
uint256 amount;
}
function earned() external view returns(EarnedData[] memory claimable);
function rewardLength() external view returns(uint256);
function owner() external view returns (address);
function stakingToken() external view returns (address);
function fraxPerLPToken() external view returns (uint256);
function calcCurCombinedWeight(address account) external view
returns (
uint256 old_combined_weight,
uint256 new_vefxs_multiplier,
uint256 new_combined_weight
);
function lockedStakesOf(address account) external view returns (LockedStake[] memory);
function lockedStakesOfLength(address account) external view returns (uint256);
function lockAdditional(bytes32 kek_id, uint256 addl_liq) external;
function lockLonger(bytes32 kek_id, uint256 new_ending_ts) external;
function stakeLocked(uint256 liquidity, uint256 secs) external returns (bytes32);
function withdrawLocked(bytes32 kek_id, address destination_address) external returns (uint256);
function withdrawLocked(bytes32 kek_id) external returns (uint256);
function periodFinish() external view returns (uint256);
function getAllRewardTokens() external view returns (address[] memory);
// function earned(address account) external view returns (uint256[] memory new_earned);
function totalLiquidityLocked() external view returns (uint256);
function lockedLiquidityOf(address account) external view returns (uint256);
function totalCombinedWeight() external view returns (uint256);
function combinedWeightOf(address account) external view returns (uint256);
function lockMultiplier(uint256 secs) external view returns (uint256);
function rewardRates(uint256 token_idx) external view returns (uint256 rwd_rate);
function userStakedFrax(address account) external view returns (uint256);
function proxyStakedFrax(address proxy_address) external view returns (uint256);
function maxLPForMaxBoost(address account) external view returns (uint256);
function minVeFXSForMaxBoost(address account) external view returns (uint256);
function minVeFXSForMaxBoostProxy(address proxy_address) external view returns (uint256);
function veFXSMultiplier(address account) external view returns (uint256 vefxs_multiplier);
function toggleValidVeFXSProxy(address proxy_address) external;
function proxyToggleStaker(address staker_address) external;
function stakerSetVeFXSProxy(address proxy_address) external;
function getReward(address destination_address) external returns (uint256[] memory);
function getReward(bool claim) external returns (uint256[] memory);
function vefxs_max_multiplier() external view returns(uint256);
function vefxs_boost_scale_factor() external view returns(uint256);
function vefxs_per_frax_for_max_boost() external view returns(uint256);
function getProxyFor(address addr) external view returns (address);
function sync() external;
}// SPDX-License-Identifier: MIT
pragma solidity ^0.8.11;
interface IConvexWrapper{
struct EarnedData {
address token;
uint256 amount;
}
function convexPoolId() external view returns(uint256 _poolId);
function balanceOf(address _account) external view returns(uint256);
function totalBalanceOf(address _account) external view returns(uint256);
function deposit(uint256 _amount, address _to) external;
function stake(uint256 _amount, address _to) external;
function withdraw(uint256 _amount) external;
function withdrawAndUnwrap(uint256 _amount) external;
function getReward(address _account) external;
function getReward(address _account, address _forwardTo) external;
function rewardLength() external view returns(uint256);
function earned(address _account) external view returns(EarnedData[] memory claimable);
function setVault(address _vault) external;
function user_checkpoint(address[2] calldata _accounts) external returns(bool);
function createVault(uint256 _pid) external returns (address);
function stakeLockedCurveLp(uint256 _liquidity, uint256 _secs) external returns (bytes32 kek_id);
function withdrawLockedAndUnwrap(bytes32 _kek_id) external;
function getReward() external;
function owner() external view returns (address);
function rewards(uint256) external view returns (address, address, uint128, uint128);
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (access/IAccessControl.sol)
pragma solidity ^0.8.0;
/**
* @dev External interface of AccessControl declared to support ERC165 detection.
*/
interface IAccessControl {
/**
* @dev Emitted when `newAdminRole` is set as ``role``'s admin role, replacing `previousAdminRole`
*
* `DEFAULT_ADMIN_ROLE` is the starting admin for all roles, despite
* {RoleAdminChanged} not being emitted signaling this.
*
* _Available since v3.1._
*/
event RoleAdminChanged(bytes32 indexed role, bytes32 indexed previousAdminRole, bytes32 indexed newAdminRole);
/**
* @dev Emitted when `account` is granted `role`.
*
* `sender` is the account that originated the contract call, an admin role
* bearer except when using {AccessControl-_setupRole}.
*/
event RoleGranted(bytes32 indexed role, address indexed account, address indexed sender);
/**
* @dev Emitted when `account` is revoked `role`.
*
* `sender` is the account that originated the contract call:
* - if using `revokeRole`, it is the admin role bearer
* - if using `renounceRole`, it is the role bearer (i.e. `account`)
*/
event RoleRevoked(bytes32 indexed role, address indexed account, address indexed sender);
/**
* @dev Returns `true` if `account` has been granted `role`.
*/
function hasRole(bytes32 role, address account) external view returns (bool);
/**
* @dev Returns the admin role that controls `role`. See {grantRole} and
* {revokeRole}.
*
* To change a role's admin, use {AccessControl-_setRoleAdmin}.
*/
function getRoleAdmin(bytes32 role) external view returns (bytes32);
/**
* @dev Grants `role` to `account`.
*
* If `account` had not been already granted `role`, emits a {RoleGranted}
* event.
*
* Requirements:
*
* - the caller must have ``role``'s admin role.
*/
function grantRole(bytes32 role, address account) external;
/**
* @dev Revokes `role` from `account`.
*
* If `account` had been granted `role`, emits a {RoleRevoked} event.
*
* Requirements:
*
* - the caller must have ``role``'s admin role.
*/
function revokeRole(bytes32 role, address account) external;
/**
* @dev Revokes `role` from the calling account.
*
* Roles are often managed via {grantRole} and {revokeRole}: this function's
* purpose is to provide a mechanism for accounts to lose their privileges
* if they are compromised (such as when a trusted device is misplaced).
*
* If the calling account had been granted `role`, emits a {RoleRevoked}
* event.
*
* Requirements:
*
* - the caller must be `account`.
*/
function renounceRole(bytes32 role, address account) external;
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (utils/Context.sol)
pragma solidity ^0.8.0;
/**
* @dev Provides information about the current execution context, including the
* sender of the transaction and its data. While these are generally available
* via msg.sender and msg.data, they should not be accessed in such a direct
* manner, since when dealing with meta-transactions the account sending and
* paying for execution may not be the actual sender (as far as an application
* is concerned).
*
* This contract is only required for intermediate, library-like contracts.
*/
abstract contract Context {
function _msgSender() internal view virtual returns (address) {
return msg.sender;
}
function _msgData() internal view virtual returns (bytes calldata) {
return msg.data;
}
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (utils/Strings.sol)
pragma solidity ^0.8.0;
/**
* @dev String operations.
*/
library Strings {
bytes16 private constant _HEX_SYMBOLS = "0123456789abcdef";
/**
* @dev Converts a `uint256` to its ASCII `string` decimal representation.
*/
function toString(uint256 value) internal pure returns (string memory) {
// Inspired by OraclizeAPI's implementation - MIT licence
// https://github.com/oraclize/ethereum-api/blob/b42146b063c7d6ee1358846c198246239e9360e8/oraclizeAPI_0.4.25.sol
if (value == 0) {
return "0";
}
uint256 temp = value;
uint256 digits;
while (temp != 0) {
digits++;
temp /= 10;
}
bytes memory buffer = new bytes(digits);
while (value != 0) {
digits -= 1;
buffer[digits] = bytes1(uint8(48 + uint256(value % 10)));
value /= 10;
}
return string(buffer);
}
/**
* @dev Converts a `uint256` to its ASCII `string` hexadecimal representation.
*/
function toHexString(uint256 value) internal pure returns (string memory) {
if (value == 0) {
return "0x00";
}
uint256 temp = value;
uint256 length = 0;
while (temp != 0) {
length++;
temp >>= 8;
}
return toHexString(value, length);
}
/**
* @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length.
*/
function toHexString(uint256 value, uint256 length) internal pure returns (string memory) {
bytes memory buffer = new bytes(2 * length + 2);
buffer[0] = "0";
buffer[1] = "x";
for (uint256 i = 2 * length + 1; i > 1; --i) {
buffer[i] = _HEX_SYMBOLS[value & 0xf];
value >>= 4;
}
require(value == 0, "Strings: hex length insufficient");
return string(buffer);
}
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (utils/introspection/ERC165.sol)
pragma solidity ^0.8.0;
import "./IERC165.sol";
/**
* @dev Implementation of the {IERC165} interface.
*
* Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check
* for the additional interface id that will be supported. For example:
*
* ```solidity
* function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
* return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId);
* }
* ```
*
* Alternatively, {ERC165Storage} provides an easier to use but more expensive implementation.
*/
abstract contract ERC165 is IERC165 {
/**
* @dev See {IERC165-supportsInterface}.
*/
function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
return interfaceId == type(IERC165).interfaceId;
}
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol)
pragma solidity ^0.8.0;
/**
* @dev Interface of the ERC165 standard, as defined in the
* https://eips.ethereum.org/EIPS/eip-165[EIP].
*
* Implementers can declare support of contract interfaces, which can then be
* queried by others ({ERC165Checker}).
*
* For an implementation, see {ERC165}.
*/
interface IERC165 {
/**
* @dev Returns true if this contract implements the interface defined by
* `interfaceId`. See the corresponding
* https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section]
* to learn more about how these ids are created.
*
* This function call must use less than 30 000 gas.
*/
function supportsInterface(bytes4 interfaceId) external view returns (bool);
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (token/ERC20/IERC20.sol)
pragma solidity ^0.8.0;
/**
* @dev Interface of the ERC20 standard as defined in the EIP.
*/
interface IERC20 {
/**
* @dev Returns the amount of tokens in existence.
*/
function totalSupply() external view returns (uint256);
/**
* @dev Returns the amount of tokens owned by `account`.
*/
function balanceOf(address account) external view returns (uint256);
/**
* @dev Moves `amount` tokens from the caller's account to `recipient`.
*
* Returns a boolean value indicating whether the operation succeeded.
*
* Emits a {Transfer} event.
*/
function transfer(address recipient, uint256 amount) external returns (bool);
/**
* @dev Returns the remaining number of tokens that `spender` will be
* allowed to spend on behalf of `owner` through {transferFrom}. This is
* zero by default.
*
* This value changes when {approve} or {transferFrom} are called.
*/
function allowance(address owner, address spender) external view returns (uint256);
/**
* @dev Sets `amount` as the allowance of `spender` over the caller's tokens.
*
* Returns a boolean value indicating whether the operation succeeded.
*
* IMPORTANT: Beware that changing an allowance with this method brings the risk
* that someone may use both the old and the new allowance by unfortunate
* transaction ordering. One possible solution to mitigate this race
* condition is to first reduce the spender's allowance to 0 and set the
* desired value afterwards:
* https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729
*
* Emits an {Approval} event.
*/
function approve(address spender, uint256 amount) external returns (bool);
/**
* @dev Moves `amount` tokens from `sender` to `recipient` using the
* allowance mechanism. `amount` is then deducted from the caller's
* allowance.
*
* Returns a boolean value indicating whether the operation succeeded.
*
* Emits a {Transfer} event.
*/
function transferFrom(
address sender,
address recipient,
uint256 amount
) external returns (bool);
/**
* @dev Emitted when `value` tokens are moved from one account (`from`) to
* another (`to`).
*
* Note that `value` may be zero.
*/
event Transfer(address indexed from, address indexed to, uint256 value);
/**
* @dev Emitted when the allowance of a `spender` for an `owner` is set by
* a call to {approve}. `value` is the new allowance.
*/
event Approval(address indexed owner, address indexed spender, uint256 value);
}{
"optimizer": {
"enabled": true,
"runs": 1000000
},
"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":"address","name":"voteExecutor","type":"address"},{"internalType":"address","name":"gnosis","type":"address"},{"internalType":"bool","name":"isTesting","type":"bool"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bytes32","name":"data","type":"bytes32"}],"name":"Locked","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"previousAdminRole","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"newAdminRole","type":"bytes32"}],"name":"RoleAdminChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleGranted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleRevoked","type":"event"},{"inputs":[],"name":"DEFAULT_ADMIN_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"crvRewards","outputs":[{"internalType":"contract IERC20","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"cvxBooster","outputs":[{"internalType":"contract ICvxBooster","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"cvxRewards","outputs":[{"internalType":"contract IERC20","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes","name":"data","type":"bytes"}],"name":"decodeEntryParams","outputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"contract IERC20","name":"","type":"address"},{"internalType":"contract IERC20","name":"","type":"address"},{"internalType":"uint8","name":"","type":"uint8"},{"internalType":"uint8","name":"","type":"uint8"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"contract IERC20","name":"","type":"address"},{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"bytes","name":"data","type":"bytes"}],"name":"decodeExitParams","outputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"contract IERC20","name":"","type":"address"},{"internalType":"contract IERC20","name":"","type":"address"},{"internalType":"uint8","name":"","type":"uint8"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"address","name":"","type":"address"},{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"address","name":"curvePool","type":"address"},{"internalType":"address","name":"crvLpToken","type":"address"},{"internalType":"address","name":"poolToken","type":"address"},{"internalType":"uint8","name":"poolSize","type":"uint8"},{"internalType":"uint8","name":"tokenIndexInCurve","type":"uint8"},{"internalType":"uint256","name":"convexPoolId","type":"uint256"},{"internalType":"address","name":"stakeToken","type":"address"},{"internalType":"address","name":"fraxPool","type":"address"},{"internalType":"uint256","name":"duration","type":"uint256"}],"name":"encodeEntryParams","outputs":[{"internalType":"bytes","name":"","type":"bytes"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"address","name":"curvePool","type":"address"},{"internalType":"address","name":"poolToken","type":"address"},{"internalType":"address","name":"crvLpToken","type":"address"},{"internalType":"uint8","name":"tokenIndexInCurve","type":"uint8"},{"internalType":"uint256","name":"convexPoolId","type":"uint256"},{"internalType":"address","name":"fraxPool","type":"address"},{"internalType":"bytes32","name":"kek","type":"bytes32"}],"name":"encodeExitParams","outputs":[{"internalType":"bytes","name":"","type":"bytes"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"exchange","outputs":[{"internalType":"contract IExchange","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes","name":"data","type":"bytes"},{"internalType":"uint256","name":"unwindPercent","type":"uint256"},{"internalType":"address","name":"outputCoin","type":"address"},{"internalType":"address","name":"receiver","type":"address"},{"internalType":"bool","name":"swapRewards","type":"bool"}],"name":"exitAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes","name":"data","type":"bytes"},{"internalType":"address","name":"outputCoin","type":"address"},{"internalType":"address","name":"receiver","type":"address"},{"internalType":"bool","name":"swapRewards","type":"bool"}],"name":"exitOnlyRewards","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"fraxRewards","outputs":[{"internalType":"contract IERC20","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"}],"name":"getRoleAdmin","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"grantRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"hasRole","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes","name":"data","type":"bytes"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"invest","outputs":[{"internalType":"bytes","name":"","type":"bytes"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"destinations","type":"address[]"},{"internalType":"bytes[]","name":"calldatas","type":"bytes[]"}],"name":"multicall","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"renounceRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"revokeRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"unwindDecimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"stateMutability":"payable","type":"receive"}]Contract Creation Code
60806040523480156200001157600080fd5b5060405162003c4c38038062003c4c833981016040819052620000349162000213565b80156200004e57620000486000336200014f565b62000146565b6200006d836001600160a01b0316620001f060201b62001d5a1760201c565b620000bf5760405162461bcd60e51b815260206004820152601f60248201527f4375727665436f6e76657853747261746567793a203121636f6e74726163740060448201526064015b60405180910390fd5b620000de826001600160a01b0316620001f060201b62001d5a1760201c565b6200012c5760405162461bcd60e51b815260206004820152601f60248201527f4375727665436f6e76657853747261746567793a203221636f6e7472616374006044820152606401620000b6565b620001396000836200014f565b620001466000846200014f565b50505062000265565b6000828152602081815260408083206001600160a01b038516845290915290205460ff16620001ec576000828152602081815260408083206001600160a01b03851684529091529020805460ff19166001179055620001ab3390565b6001600160a01b0316816001600160a01b0316837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45b5050565b3b151590565b80516001600160a01b03811681146200020e57600080fd5b919050565b6000806000606084860312156200022957600080fd5b6200023484620001f6565b92506200024460208501620001f6565b9150604084015180151581146200025a57600080fd5b809150509250925092565b6139d780620002756000396000f3fe60806040526004361061016e5760003560e01c8063a217fddf116100cb578063d2f7265a1161007f578063d8ce441811610059578063d8ce44181461054e578063ddce1b3e146105d8578063fa6d03d2146105f857600080fd5b8063d2f7265a146104de578063d304ed6214610506578063d547741f1461052e57600080fd5b8063b6bff295116100b0578063b6bff29514610412578063c139f6981461043a578063c606c766146104be57600080fd5b8063a217fddf146103d5578063aa5ccb90146103ea57600080fd5b806336568abe1161012257806363fb0b961161010757806363fb0b961461033d57806391d148541461035d57806397c1cd1e146103ae57600080fd5b806336568abe146102fd578063399d375c1461031d57600080fd5b80630b60c61a116101535780630b60c61a146101fc578063248a9ca31461029d5780632f2ff15d146102db57600080fd5b806301ffc9a71461017a5780630229c64c146101af57600080fd5b3661017557005b600080fd5b34801561018657600080fd5b5061019a610195366004612d8b565b610670565b60405190151581526020015b60405180910390f35b3480156101bb57600080fd5b506101d773f403c135812408bfbe8713b5a23a04b3d48aae3181565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016101a6565b34801561020857600080fd5b50610290610217366004612e08565b6040805173ffffffffffffffffffffffffffffffffffffffff9a8b166020820152988a1689820152968916606089015260ff95861660808901529390941660a087015260c0860191909152851660e085015293166101008301526101208083019390935280518083039093018352610140909101905290565b6040516101a69190612f24565b3480156102a957600080fd5b506102cd6102b8366004612f37565b60009081526020819052604090206001015490565b6040519081526020016101a6565b3480156102e757600080fd5b506102fb6102f6366004612f50565b610709565b005b34801561030957600080fd5b506102fb610318366004612f50565b610734565b34801561032957600080fd5b506102fb610338366004612fd7565b6107ec565b34801561034957600080fd5b506102fb6103583660046130a1565b611059565b34801561036957600080fd5b5061019a610378366004612f50565b60009182526020828152604080842073ffffffffffffffffffffffffffffffffffffffff93909316845291905290205460ff1690565b3480156103ba57600080fd5b506103c3600281565b60405160ff90911681526020016101a6565b3480156103e157600080fd5b506102cd600081565b3480156103f657600080fd5b506101d7734e3fbd56cd56c3e72c1403e103b45db9da5b9d2b81565b34801561041e57600080fd5b506101d773d533a949740bb3306d119cc777fa900ba034cd5281565b34801561044657600080fd5b5061029061045536600461310d565b6040805173ffffffffffffffffffffffffffffffffffffffff988916602082015296881687820152948716606087015260ff93909316608086015260a085019190915290931660c083015260e08083019390935280518083039093018352610100909101905290565b3480156104ca57600080fd5b506102fb6104d936600461318f565b61118e565b3480156104ea57600080fd5b506101d77329c66cf57a03d41cfe6d9ecb6883aa0e2aba21ec81565b34801561051257600080fd5b506101d7733432b6a60d23ca0dfca7761b7ab56459d9c964d081565b34801561053a57600080fd5b506102fb610549366004612f50565b611670565b34801561055a57600080fd5b5061056e61056936600461320c565b611696565b6040805173ffffffffffffffffffffffffffffffffffffffff9a8b168152988a1660208a01529689169688019690965260ff948516606088015293909216608086015260a0850152841660c08401529290921660e0820152610100810191909152610120016101a6565b3480156105e457600080fd5b506102906105f336600461324e565b611736565b34801561060457600080fd5b5061061861061336600461320c565b611cc4565b6040805173ffffffffffffffffffffffffffffffffffffffff988916815296881660208801529487169486019490945260ff909216606085015260808401529290921660a082015260c081019190915260e0016101a6565b60007fffffffff0000000000000000000000000000000000000000000000000000000082167f7965db0b00000000000000000000000000000000000000000000000000000000148061070357507f01ffc9a7000000000000000000000000000000000000000000000000000000007fffffffff000000000000000000000000000000000000000000000000000000008316145b92915050565b6000828152602081905260409020600101546107258133611d60565b61072f8383611e30565b505050565b73ffffffffffffffffffffffffffffffffffffffff811633146107de576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602f60248201527f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636560448201527f20726f6c657320666f722073656c66000000000000000000000000000000000060648201526084015b60405180910390fd5b6107e88282611f20565b5050565b60006107f88133611d60565b600080600080600080600061080d8e8e611cc4565b965096509650965096509650965060007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8414610eb85760008373ffffffffffffffffffffffffffffffffffffffff166312edb24c6040518163ffffffff1660e01b8152600401600060405180830381865afa158015610891573d6000803e3d6000fd5b505050506040513d6000823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01682016040526108d7919081019061333c565b6040517fe44b9fa50000000000000000000000000000000000000000000000000000000081526004810185905230602482015290915073ffffffffffffffffffffffffffffffffffffffff85169063e44b9fa5906044016020604051808303816000875af115801561094d573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061097191906133d0565b506040517fc00007b000000000000000000000000000000000000000000000000000000000815230600482015273ffffffffffffffffffffffffffffffffffffffff85169063c00007b0906024016000604051808303816000875af11580156109de573d6000803e3d6000fd5b505050506040513d6000823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0168201604052610a2491908101906133e9565b508373ffffffffffffffffffffffffffffffffffffffff166372f702f36040518163ffffffff1660e01b8152600401602060405180830381865afa158015610a70573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a94919061346f565b6040517fc00007b000000000000000000000000000000000000000000000000000000000815230600482015273ffffffffffffffffffffffffffffffffffffffff919091169063c00007b090602401600060405180830381600087803b158015610afd57600080fd5b505af1158015610b11573d6000803e3d6000fd5b5050505060005b8151811015610caa57818181518110610b3357610b3361348c565b602002602001015173ffffffffffffffffffffffffffffffffffffffff1663a9059cbb8e848481518110610b6957610b6961348c565b60209081029190910101516040517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015273ffffffffffffffffffffffffffffffffffffffff909116906370a0823190602401602060405180830381865afa158015610bdf573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c0391906133d0565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e085901b16815273ffffffffffffffffffffffffffffffffffffffff909216600483015260248201526044016020604051808303816000875af1158015610c73573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c9791906134bb565b5080610ca281613507565b915050610b18565b50610cb660028061353f565b610cc190600a613684565b8e8573ffffffffffffffffffffffffffffffffffffffff166372f702f36040518163ffffffff1660e01b8152600401602060405180830381865afa158015610d0d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d31919061346f565b6040517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015273ffffffffffffffffffffffffffffffffffffffff91909116906370a0823190602401602060405180830381865afa158015610d9d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610dc191906133d0565b610dcb9190613693565b610dd591906136d0565b91508373ffffffffffffffffffffffffffffffffffffffff166372f702f36040518163ffffffff1660e01b8152600401602060405180830381865afa158015610e22573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e46919061346f565b73ffffffffffffffffffffffffffffffffffffffff16633969dfb4836040518263ffffffff1660e01b8152600401610e8091815260200190565b600060405180830381600087803b158015610e9a57600080fd5b505af1158015610eae573d6000803e3d6000fd5b5050505050610f63565b6040517f70a08231000000000000000000000000000000000000000000000000000000008152306004820152612710908e9073ffffffffffffffffffffffffffffffffffffffff8916906370a0823190602401602060405180830381865afa158015610f28573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f4c91906133d0565b610f569190613693565b610f6091906136d0565b90505b80600003610f78575050505050505050611050565b6040516024810182905260ff8616604482015260006064820181905290608401604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f1a4d01d200000000000000000000000000000000000000000000000000000000179052905061103073ffffffffffffffffffffffffffffffffffffffff8a1682611fd7565b5061103b888e612020565b6110468b8e8e6121ec565b5050505050505050505b50505050505050565b60006110658133611d60565b838281146110cf576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601c60248201527f4375727665436f6e76657853747261746567793a206c656e677468730000000060448201526064016107d5565b60005b818110156110505761117b8585838181106110ef576110ef61348c565b9050602002810190611101919061370b565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152508b92508a915085905081811061114a5761114a61348c565b905060200201602081019061115f9190613770565b73ffffffffffffffffffffffffffffffffffffffff1690611fd7565b508061118681613507565b9150506110d2565b600061119a8133611d60565b6000806111a78888611cc4565b5095509550505050507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82146115b35760008173ffffffffffffffffffffffffffffffffffffffff166312edb24c6040518163ffffffff1660e01b8152600401600060405180830381865afa158015611224573d6000803e3d6000fd5b505050506040513d6000823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016820160405261126a919081019061333c565b6040517fc00007b000000000000000000000000000000000000000000000000000000000815230600482015290915073ffffffffffffffffffffffffffffffffffffffff83169063c00007b0906024016000604051808303816000875af11580156112d9573d6000803e3d6000fd5b505050506040513d6000823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016820160405261131f91908101906133e9565b508173ffffffffffffffffffffffffffffffffffffffff166372f702f36040518163ffffffff1660e01b8152600401602060405180830381865afa15801561136b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061138f919061346f565b6040517f6b0916950000000000000000000000000000000000000000000000000000000081523060048201819052602482015273ffffffffffffffffffffffffffffffffffffffff9190911690636b09169590604401600060405180830381600087803b1580156113ff57600080fd5b505af1158015611413573d6000803e3d6000fd5b5050505060005b81518110156115ac578181815181106114355761143561348c565b602002602001015173ffffffffffffffffffffffffffffffffffffffff1663a9059cbb8884848151811061146b5761146b61348c565b60209081029190910101516040517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015273ffffffffffffffffffffffffffffffffffffffff909116906370a0823190602401602060405180830381865afa1580156114e1573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061150591906133d0565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e085901b16815273ffffffffffffffffffffffffffffffffffffffff909216600483015260248201526044016020604051808303816000875af1158015611575573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061159991906134bb565b50806115a481613507565b91505061141a565b505061165b565b60006115be83612441565b6040517f7050ccd90000000000000000000000000000000000000000000000000000000081523060048201526001602482015290915073ffffffffffffffffffffffffffffffffffffffff821690637050ccd9906044016020604051808303816000875af1158015611634573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061165891906134bb565b50505b6116668487876121ec565b5050505050505050565b60008281526020819052604090206001015461168c8133611d60565b61072f8383611f20565b600080808080808080806101208a1461170b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601e60248201527f4375727665436f6e76657853747261746567793a206c656e67746820656e000060448201526064016107d5565b6117178a8c018c612e08565b9850985098509850985098509850985098509295985092959850929598565b606060006117448133611d60565b600080600080600080600080600061175c8e8e611696565b985098509850985098509850985098509850611799898d8973ffffffffffffffffffffffffffffffffffffffff166124e09092919063ffffffff16565b6117a1612d6d565b8c818760ff16600481106117b7576117b761348c565b6020020152606060ff881660020361186b57630b4c7e4d6040518060400160405280846000600481106117ec576117ec61348c565b60200201518152602001846001600481106118095761180961348c565b60200201519052604051611823919060009060240161378d565b6040516020818303038152906040529060e01b6020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050905061194a565b8760ff166003036118ed57634515cef36040518060600160405280846000600481106118995761189961348c565b60200201518152602001846001600481106118b6576118b661348c565b60200201518152602001846002600481106118d3576118d361348c565b6020020151905260405161182391906000906024016137c8565b63029b2f34826000604051602401611906929190613803565b6040516020818303038152906040529060e01b6020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff838183161783525050505090505b61196a73ffffffffffffffffffffffffffffffffffffffff8c1682611fd7565b5060007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8714611c1f576040517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015260009073ffffffffffffffffffffffffffffffffffffffff8d16906370a0823190602401602060405180830381865afa158015611a01573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a2591906133d0565b9050611a4873ffffffffffffffffffffffffffffffffffffffff8d1688836124e0565b6040517f6e553f650000000000000000000000000000000000000000000000000000000081526004810182905230602482015273ffffffffffffffffffffffffffffffffffffffff881690636e553f6590604401600060405180830381600087803b158015611ab657600080fd5b505af1158015611aca573d6000803e3d6000fd5b50506040517f70a082310000000000000000000000000000000000000000000000000000000081523060048201526000925073ffffffffffffffffffffffffffffffffffffffff8a1691506370a0823190602401602060405180830381865afa158015611b3b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b5f91906133d0565b9050611b8273ffffffffffffffffffffffffffffffffffffffff891688836124e0565b6040517f17b18c89000000000000000000000000000000000000000000000000000000008152600481018290526024810187905273ffffffffffffffffffffffffffffffffffffffff8816906317b18c89906044016020604051808303816000875af1158015611bf6573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611c1a91906133d0565b925050505b6040518181527f3223c64d0518f39e3854050c1ea77cb9f25539e39168510c5a0cc7aad992b3069060200160405180910390a16040805173ffffffffffffffffffffffffffffffffffffffff9d8e1660208201529a8d168b8201529a8c1660608b015260ff9790971660808a015250505060a08601929092525090941660c08301525060e0808201939093528151808203909301835261010001905295945050505050565b600080808080808060e08814611d36576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601e60248201527f4375727665436f6e76657853747261746567793a206c656e677468206578000060448201526064016107d5565b611d42888a018a61310d565b959f949e50929c50909a509850965090945092505050565b3b151590565b60008281526020818152604080832073ffffffffffffffffffffffffffffffffffffffff8516845290915290205460ff166107e857611db68173ffffffffffffffffffffffffffffffffffffffff16601461265c565b611dc183602061265c565b604051602001611dd292919061383e565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152908290527f08c379a00000000000000000000000000000000000000000000000000000000082526107d591600401612f24565b60008281526020818152604080832073ffffffffffffffffffffffffffffffffffffffff8516845290915290205460ff166107e85760008281526020818152604080832073ffffffffffffffffffffffffffffffffffffffff85168452909152902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055611ec23390565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45050565b60008281526020818152604080832073ffffffffffffffffffffffffffffffffffffffff8516845290915290205460ff16156107e85760008281526020818152604080832073ffffffffffffffffffffffffffffffffffffffff8516808552925280832080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016905551339285917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a45050565b606061201983836040518060400160405280601e81526020017f416464726573733a206c6f772d6c6576656c2063616c6c206661696c6564000081525061289f565b9392505050565b8073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603612057575050565b6040517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015260009073ffffffffffffffffffffffffffffffffffffffff8416906370a0823190602401602060405180830381865afa1580156120c4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906120e891906133d0565b9050806000036120f757505050565b61212c73ffffffffffffffffffffffffffffffffffffffff84167329c66cf57a03d41cfe6d9ecb6883aa0e2aba21ec836128b6565b6040517f0ed2fc9500000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff80851660048301528316602482015260448101829052600060648201527329c66cf57a03d41cfe6d9ecb6883aa0e2aba21ec90630ed2fc95906084016020604051808303816000875af11580156121c2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906121e691906133d0565b50505050565b821561223357612210734e3fbd56cd56c3e72c1403e103b45db9da5b9d2b83612020565b61222e73d533a949740bb3306d119cc777fa900ba034cd5283612020565b61238f565b6040517f70a082310000000000000000000000000000000000000000000000000000000081523060048201526122e1908290734e3fbd56cd56c3e72c1403e103b45db9da5b9d2b906370a0823190602401602060405180830381865afa1580156122a1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906122c591906133d0565b734e3fbd56cd56c3e72c1403e103b45db9da5b9d2b9190612a38565b6040517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015261238f90829073d533a949740bb3306d119cc777fa900ba034cd52906370a0823190602401602060405180830381865afa15801561234f573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061237391906133d0565b73d533a949740bb3306d119cc777fa900ba034cd529190612a38565b6040517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015261072f90829073ffffffffffffffffffffffffffffffffffffffff8516906370a0823190602401602060405180830381865afa1580156123ff573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061242391906133d0565b73ffffffffffffffffffffffffffffffffffffffff85169190612a38565b6040517f1526fe2700000000000000000000000000000000000000000000000000000000815260048101829052600090819073f403c135812408bfbe8713b5a23a04b3d48aae3190631526fe279060240160c060405180830381865afa1580156124af573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906124d391906138bf565b5090979650505050505050565b6040517fdd62ed3e00000000000000000000000000000000000000000000000000000000815230600482015273ffffffffffffffffffffffffffffffffffffffff8381166024830152600091839186169063dd62ed3e90604401602060405180830381865afa158015612557573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061257b91906133d0565b6125859190613938565b60405173ffffffffffffffffffffffffffffffffffffffff85166024820152604481018290529091506121e69085907f095ea7b300000000000000000000000000000000000000000000000000000000906064015b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090931692909217909152612a8e565b6060600061266b836002613693565b612676906002613938565b67ffffffffffffffff81111561268e5761268e61329a565b6040519080825280601f01601f1916602001820160405280156126b8576020820181803683370190505b5090507f3000000000000000000000000000000000000000000000000000000000000000816000815181106126ef576126ef61348c565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053507f7800000000000000000000000000000000000000000000000000000000000000816001815181106127525761275261348c565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600061278e846002613693565b612799906001613938565b90505b6001811115612836577f303132333435363738396162636465660000000000000000000000000000000085600f16601081106127da576127da61348c565b1a60f81b8282815181106127f0576127f061348c565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535060049490941c9361282f81613950565b905061279c565b508315612019576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f537472696e67733a20686578206c656e67746820696e73756666696369656e7460448201526064016107d5565b60606128ae8484600085612b9a565b949350505050565b80158061295657506040517fdd62ed3e00000000000000000000000000000000000000000000000000000000815230600482015273ffffffffffffffffffffffffffffffffffffffff838116602483015284169063dd62ed3e90604401602060405180830381865afa158015612930573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061295491906133d0565b155b6129e2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603660248201527f5361666545524332303a20617070726f76652066726f6d206e6f6e2d7a65726f60448201527f20746f206e6f6e2d7a65726f20616c6c6f77616e63650000000000000000000060648201526084016107d5565b60405173ffffffffffffffffffffffffffffffffffffffff831660248201526044810182905261072f9084907f095ea7b300000000000000000000000000000000000000000000000000000000906064016125da565b60405173ffffffffffffffffffffffffffffffffffffffff831660248201526044810182905261072f9084907fa9059cbb00000000000000000000000000000000000000000000000000000000906064016125da565b6000612af0826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff1661289f9092919063ffffffff16565b80519091501561072f5780806020019051810190612b0e91906134bb565b61072f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f7420737563636565640000000000000000000000000000000000000000000060648201526084016107d5565b606082471015612c2c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f60448201527f722063616c6c000000000000000000000000000000000000000000000000000060648201526084016107d5565b843b612c94576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e747261637400000060448201526064016107d5565b6000808673ffffffffffffffffffffffffffffffffffffffff168587604051612cbd9190613985565b60006040518083038185875af1925050503d8060008114612cfa576040519150601f19603f3d011682016040523d82523d6000602084013e612cff565b606091505b5091509150612d0f828286612d1a565b979650505050505050565b60608315612d29575081612019565b825115612d395782518084602001fd5b816040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107d59190612f24565b60405180608001604052806004906020820280368337509192915050565b600060208284031215612d9d57600080fd5b81357fffffffff000000000000000000000000000000000000000000000000000000008116811461201957600080fd5b73ffffffffffffffffffffffffffffffffffffffff81168114612def57600080fd5b50565b803560ff81168114612e0357600080fd5b919050565b60008060008060008060008060006101208a8c031215612e2757600080fd5b8935612e3281612dcd565b985060208a0135612e4281612dcd565b975060408a0135612e5281612dcd565b9650612e6060608b01612df2565b9550612e6e60808b01612df2565b945060a08a0135935060c08a0135612e8581612dcd565b925060e08a0135612e9581612dcd565b809250506101008a013590509295985092959850929598565b60005b83811015612ec9578181015183820152602001612eb1565b838111156121e65750506000910152565b60008151808452612ef2816020860160208601612eae565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b6020815260006120196020830184612eda565b600060208284031215612f4957600080fd5b5035919050565b60008060408385031215612f6357600080fd5b823591506020830135612f7581612dcd565b809150509250929050565b60008083601f840112612f9257600080fd5b50813567ffffffffffffffff811115612faa57600080fd5b602083019150836020828501011115612fc257600080fd5b9250929050565b8015158114612def57600080fd5b60008060008060008060a08789031215612ff057600080fd5b863567ffffffffffffffff81111561300757600080fd5b61301389828a01612f80565b90975095505060208701359350604087013561302e81612dcd565b9250606087013561303e81612dcd565b9150608087013561304e81612fc9565b809150509295509295509295565b60008083601f84011261306e57600080fd5b50813567ffffffffffffffff81111561308657600080fd5b6020830191508360208260051b8501011115612fc257600080fd5b600080600080604085870312156130b757600080fd5b843567ffffffffffffffff808211156130cf57600080fd5b6130db8883890161305c565b909650945060208701359150808211156130f457600080fd5b506131018782880161305c565b95989497509550505050565b600080600080600080600060e0888a03121561312857600080fd5b873561313381612dcd565b9650602088013561314381612dcd565b9550604088013561315381612dcd565b945061316160608901612df2565b93506080880135925060a088013561317881612dcd565b8092505060c0880135905092959891949750929550565b6000806000806000608086880312156131a757600080fd5b853567ffffffffffffffff8111156131be57600080fd5b6131ca88828901612f80565b90965094505060208601356131de81612dcd565b925060408601356131ee81612dcd565b915060608601356131fe81612fc9565b809150509295509295909350565b6000806020838503121561321f57600080fd5b823567ffffffffffffffff81111561323657600080fd5b61324285828601612f80565b90969095509350505050565b60008060006040848603121561326357600080fd5b833567ffffffffffffffff81111561327a57600080fd5b61328686828701612f80565b909790965060209590950135949350505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff811182821017156133105761331061329a565b604052919050565b600067ffffffffffffffff8211156133325761333261329a565b5060051b60200190565b6000602080838503121561334f57600080fd5b825167ffffffffffffffff81111561336657600080fd5b8301601f8101851361337757600080fd5b805161338a61338582613318565b6132c9565b81815260059190911b820183019083810190878311156133a957600080fd5b928401925b82841015612d0f5783516133c181612dcd565b825292840192908401906133ae565b6000602082840312156133e257600080fd5b5051919050565b600060208083850312156133fc57600080fd5b825167ffffffffffffffff81111561341357600080fd5b8301601f8101851361342457600080fd5b805161343261338582613318565b81815260059190911b8201830190838101908783111561345157600080fd5b928401925b82841015612d0f57835182529284019290840190613456565b60006020828403121561348157600080fd5b815161201981612dcd565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6000602082840312156134cd57600080fd5b815161201981612fc9565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203613538576135386134d8565b5060010190565b600060ff821660ff84168060ff0382111561355c5761355c6134d8565b019392505050565b600181815b808511156135bd57817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048211156135a3576135a36134d8565b808516156135b057918102915b93841c9390800290613569565b509250929050565b6000826135d457506001610703565b816135e157506000610703565b81600181146135f757600281146136015761361d565b6001915050610703565b60ff841115613612576136126134d8565b50506001821b610703565b5060208310610133831016604e8410600b8410161715613640575081810a610703565b61364a8383613564565b807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0482111561367c5761367c6134d8565b029392505050565b600061201960ff8416836135c5565b6000817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156136cb576136cb6134d8565b500290565b600082613706577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b500490565b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe184360301811261374057600080fd5b83018035915067ffffffffffffffff82111561375b57600080fd5b602001915036819003821315612fc257600080fd5b60006020828403121561378257600080fd5b813561201981612dcd565b60608101818460005b60028110156137b5578151835260209283019290910190600101613796565b50505060ff831660408301529392505050565b60808101818460005b60038110156137f05781518352602092830192909101906001016137d1565b50505060ff831660608301529392505050565b60a08101818460005b600481101561382b57815183526020928301929091019060010161380c565b50505060ff831660808301529392505050565b7f416363657373436f6e74726f6c3a206163636f756e7420000000000000000000815260008351613876816017850160208801612eae565b7f206973206d697373696e6720726f6c652000000000000000000000000000000060179184019182015283516138b3816028840160208801612eae565b01602801949350505050565b60008060008060008060c087890312156138d857600080fd5b86516138e381612dcd565b60208801519096506138f481612dcd565b604088015190955061390581612dcd565b606088015190945061391681612dcd565b608088015190935061392781612dcd565b60a088015190925061304e81612fc9565b6000821982111561394b5761394b6134d8565b500190565b60008161395f5761395f6134d8565b507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0190565b60008251613997818460208701612eae565b919091019291505056fea26469706673582212202f7f496fced2ca29aff5387d32395ca36e9019656050f09f0fe56e974624fa6464736f6c634300080e0033000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001
Deployed Bytecode
0x60806040526004361061016e5760003560e01c8063a217fddf116100cb578063d2f7265a1161007f578063d8ce441811610059578063d8ce44181461054e578063ddce1b3e146105d8578063fa6d03d2146105f857600080fd5b8063d2f7265a146104de578063d304ed6214610506578063d547741f1461052e57600080fd5b8063b6bff295116100b0578063b6bff29514610412578063c139f6981461043a578063c606c766146104be57600080fd5b8063a217fddf146103d5578063aa5ccb90146103ea57600080fd5b806336568abe1161012257806363fb0b961161010757806363fb0b961461033d57806391d148541461035d57806397c1cd1e146103ae57600080fd5b806336568abe146102fd578063399d375c1461031d57600080fd5b80630b60c61a116101535780630b60c61a146101fc578063248a9ca31461029d5780632f2ff15d146102db57600080fd5b806301ffc9a71461017a5780630229c64c146101af57600080fd5b3661017557005b600080fd5b34801561018657600080fd5b5061019a610195366004612d8b565b610670565b60405190151581526020015b60405180910390f35b3480156101bb57600080fd5b506101d773f403c135812408bfbe8713b5a23a04b3d48aae3181565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016101a6565b34801561020857600080fd5b50610290610217366004612e08565b6040805173ffffffffffffffffffffffffffffffffffffffff9a8b166020820152988a1689820152968916606089015260ff95861660808901529390941660a087015260c0860191909152851660e085015293166101008301526101208083019390935280518083039093018352610140909101905290565b6040516101a69190612f24565b3480156102a957600080fd5b506102cd6102b8366004612f37565b60009081526020819052604090206001015490565b6040519081526020016101a6565b3480156102e757600080fd5b506102fb6102f6366004612f50565b610709565b005b34801561030957600080fd5b506102fb610318366004612f50565b610734565b34801561032957600080fd5b506102fb610338366004612fd7565b6107ec565b34801561034957600080fd5b506102fb6103583660046130a1565b611059565b34801561036957600080fd5b5061019a610378366004612f50565b60009182526020828152604080842073ffffffffffffffffffffffffffffffffffffffff93909316845291905290205460ff1690565b3480156103ba57600080fd5b506103c3600281565b60405160ff90911681526020016101a6565b3480156103e157600080fd5b506102cd600081565b3480156103f657600080fd5b506101d7734e3fbd56cd56c3e72c1403e103b45db9da5b9d2b81565b34801561041e57600080fd5b506101d773d533a949740bb3306d119cc777fa900ba034cd5281565b34801561044657600080fd5b5061029061045536600461310d565b6040805173ffffffffffffffffffffffffffffffffffffffff988916602082015296881687820152948716606087015260ff93909316608086015260a085019190915290931660c083015260e08083019390935280518083039093018352610100909101905290565b3480156104ca57600080fd5b506102fb6104d936600461318f565b61118e565b3480156104ea57600080fd5b506101d77329c66cf57a03d41cfe6d9ecb6883aa0e2aba21ec81565b34801561051257600080fd5b506101d7733432b6a60d23ca0dfca7761b7ab56459d9c964d081565b34801561053a57600080fd5b506102fb610549366004612f50565b611670565b34801561055a57600080fd5b5061056e61056936600461320c565b611696565b6040805173ffffffffffffffffffffffffffffffffffffffff9a8b168152988a1660208a01529689169688019690965260ff948516606088015293909216608086015260a0850152841660c08401529290921660e0820152610100810191909152610120016101a6565b3480156105e457600080fd5b506102906105f336600461324e565b611736565b34801561060457600080fd5b5061061861061336600461320c565b611cc4565b6040805173ffffffffffffffffffffffffffffffffffffffff988916815296881660208801529487169486019490945260ff909216606085015260808401529290921660a082015260c081019190915260e0016101a6565b60007fffffffff0000000000000000000000000000000000000000000000000000000082167f7965db0b00000000000000000000000000000000000000000000000000000000148061070357507f01ffc9a7000000000000000000000000000000000000000000000000000000007fffffffff000000000000000000000000000000000000000000000000000000008316145b92915050565b6000828152602081905260409020600101546107258133611d60565b61072f8383611e30565b505050565b73ffffffffffffffffffffffffffffffffffffffff811633146107de576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602f60248201527f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636560448201527f20726f6c657320666f722073656c66000000000000000000000000000000000060648201526084015b60405180910390fd5b6107e88282611f20565b5050565b60006107f88133611d60565b600080600080600080600061080d8e8e611cc4565b965096509650965096509650965060007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8414610eb85760008373ffffffffffffffffffffffffffffffffffffffff166312edb24c6040518163ffffffff1660e01b8152600401600060405180830381865afa158015610891573d6000803e3d6000fd5b505050506040513d6000823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01682016040526108d7919081019061333c565b6040517fe44b9fa50000000000000000000000000000000000000000000000000000000081526004810185905230602482015290915073ffffffffffffffffffffffffffffffffffffffff85169063e44b9fa5906044016020604051808303816000875af115801561094d573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061097191906133d0565b506040517fc00007b000000000000000000000000000000000000000000000000000000000815230600482015273ffffffffffffffffffffffffffffffffffffffff85169063c00007b0906024016000604051808303816000875af11580156109de573d6000803e3d6000fd5b505050506040513d6000823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0168201604052610a2491908101906133e9565b508373ffffffffffffffffffffffffffffffffffffffff166372f702f36040518163ffffffff1660e01b8152600401602060405180830381865afa158015610a70573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a94919061346f565b6040517fc00007b000000000000000000000000000000000000000000000000000000000815230600482015273ffffffffffffffffffffffffffffffffffffffff919091169063c00007b090602401600060405180830381600087803b158015610afd57600080fd5b505af1158015610b11573d6000803e3d6000fd5b5050505060005b8151811015610caa57818181518110610b3357610b3361348c565b602002602001015173ffffffffffffffffffffffffffffffffffffffff1663a9059cbb8e848481518110610b6957610b6961348c565b60209081029190910101516040517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015273ffffffffffffffffffffffffffffffffffffffff909116906370a0823190602401602060405180830381865afa158015610bdf573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c0391906133d0565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e085901b16815273ffffffffffffffffffffffffffffffffffffffff909216600483015260248201526044016020604051808303816000875af1158015610c73573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c9791906134bb565b5080610ca281613507565b915050610b18565b50610cb660028061353f565b610cc190600a613684565b8e8573ffffffffffffffffffffffffffffffffffffffff166372f702f36040518163ffffffff1660e01b8152600401602060405180830381865afa158015610d0d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d31919061346f565b6040517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015273ffffffffffffffffffffffffffffffffffffffff91909116906370a0823190602401602060405180830381865afa158015610d9d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610dc191906133d0565b610dcb9190613693565b610dd591906136d0565b91508373ffffffffffffffffffffffffffffffffffffffff166372f702f36040518163ffffffff1660e01b8152600401602060405180830381865afa158015610e22573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e46919061346f565b73ffffffffffffffffffffffffffffffffffffffff16633969dfb4836040518263ffffffff1660e01b8152600401610e8091815260200190565b600060405180830381600087803b158015610e9a57600080fd5b505af1158015610eae573d6000803e3d6000fd5b5050505050610f63565b6040517f70a08231000000000000000000000000000000000000000000000000000000008152306004820152612710908e9073ffffffffffffffffffffffffffffffffffffffff8916906370a0823190602401602060405180830381865afa158015610f28573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f4c91906133d0565b610f569190613693565b610f6091906136d0565b90505b80600003610f78575050505050505050611050565b6040516024810182905260ff8616604482015260006064820181905290608401604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f1a4d01d200000000000000000000000000000000000000000000000000000000179052905061103073ffffffffffffffffffffffffffffffffffffffff8a1682611fd7565b5061103b888e612020565b6110468b8e8e6121ec565b5050505050505050505b50505050505050565b60006110658133611d60565b838281146110cf576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601c60248201527f4375727665436f6e76657853747261746567793a206c656e677468730000000060448201526064016107d5565b60005b818110156110505761117b8585838181106110ef576110ef61348c565b9050602002810190611101919061370b565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152508b92508a915085905081811061114a5761114a61348c565b905060200201602081019061115f9190613770565b73ffffffffffffffffffffffffffffffffffffffff1690611fd7565b508061118681613507565b9150506110d2565b600061119a8133611d60565b6000806111a78888611cc4565b5095509550505050507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82146115b35760008173ffffffffffffffffffffffffffffffffffffffff166312edb24c6040518163ffffffff1660e01b8152600401600060405180830381865afa158015611224573d6000803e3d6000fd5b505050506040513d6000823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016820160405261126a919081019061333c565b6040517fc00007b000000000000000000000000000000000000000000000000000000000815230600482015290915073ffffffffffffffffffffffffffffffffffffffff83169063c00007b0906024016000604051808303816000875af11580156112d9573d6000803e3d6000fd5b505050506040513d6000823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016820160405261131f91908101906133e9565b508173ffffffffffffffffffffffffffffffffffffffff166372f702f36040518163ffffffff1660e01b8152600401602060405180830381865afa15801561136b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061138f919061346f565b6040517f6b0916950000000000000000000000000000000000000000000000000000000081523060048201819052602482015273ffffffffffffffffffffffffffffffffffffffff9190911690636b09169590604401600060405180830381600087803b1580156113ff57600080fd5b505af1158015611413573d6000803e3d6000fd5b5050505060005b81518110156115ac578181815181106114355761143561348c565b602002602001015173ffffffffffffffffffffffffffffffffffffffff1663a9059cbb8884848151811061146b5761146b61348c565b60209081029190910101516040517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015273ffffffffffffffffffffffffffffffffffffffff909116906370a0823190602401602060405180830381865afa1580156114e1573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061150591906133d0565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e085901b16815273ffffffffffffffffffffffffffffffffffffffff909216600483015260248201526044016020604051808303816000875af1158015611575573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061159991906134bb565b50806115a481613507565b91505061141a565b505061165b565b60006115be83612441565b6040517f7050ccd90000000000000000000000000000000000000000000000000000000081523060048201526001602482015290915073ffffffffffffffffffffffffffffffffffffffff821690637050ccd9906044016020604051808303816000875af1158015611634573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061165891906134bb565b50505b6116668487876121ec565b5050505050505050565b60008281526020819052604090206001015461168c8133611d60565b61072f8383611f20565b600080808080808080806101208a1461170b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601e60248201527f4375727665436f6e76657853747261746567793a206c656e67746820656e000060448201526064016107d5565b6117178a8c018c612e08565b9850985098509850985098509850985098509295985092959850929598565b606060006117448133611d60565b600080600080600080600080600061175c8e8e611696565b985098509850985098509850985098509850611799898d8973ffffffffffffffffffffffffffffffffffffffff166124e09092919063ffffffff16565b6117a1612d6d565b8c818760ff16600481106117b7576117b761348c565b6020020152606060ff881660020361186b57630b4c7e4d6040518060400160405280846000600481106117ec576117ec61348c565b60200201518152602001846001600481106118095761180961348c565b60200201519052604051611823919060009060240161378d565b6040516020818303038152906040529060e01b6020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050905061194a565b8760ff166003036118ed57634515cef36040518060600160405280846000600481106118995761189961348c565b60200201518152602001846001600481106118b6576118b661348c565b60200201518152602001846002600481106118d3576118d361348c565b6020020151905260405161182391906000906024016137c8565b63029b2f34826000604051602401611906929190613803565b6040516020818303038152906040529060e01b6020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff838183161783525050505090505b61196a73ffffffffffffffffffffffffffffffffffffffff8c1682611fd7565b5060007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8714611c1f576040517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015260009073ffffffffffffffffffffffffffffffffffffffff8d16906370a0823190602401602060405180830381865afa158015611a01573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a2591906133d0565b9050611a4873ffffffffffffffffffffffffffffffffffffffff8d1688836124e0565b6040517f6e553f650000000000000000000000000000000000000000000000000000000081526004810182905230602482015273ffffffffffffffffffffffffffffffffffffffff881690636e553f6590604401600060405180830381600087803b158015611ab657600080fd5b505af1158015611aca573d6000803e3d6000fd5b50506040517f70a082310000000000000000000000000000000000000000000000000000000081523060048201526000925073ffffffffffffffffffffffffffffffffffffffff8a1691506370a0823190602401602060405180830381865afa158015611b3b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b5f91906133d0565b9050611b8273ffffffffffffffffffffffffffffffffffffffff891688836124e0565b6040517f17b18c89000000000000000000000000000000000000000000000000000000008152600481018290526024810187905273ffffffffffffffffffffffffffffffffffffffff8816906317b18c89906044016020604051808303816000875af1158015611bf6573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611c1a91906133d0565b925050505b6040518181527f3223c64d0518f39e3854050c1ea77cb9f25539e39168510c5a0cc7aad992b3069060200160405180910390a16040805173ffffffffffffffffffffffffffffffffffffffff9d8e1660208201529a8d168b8201529a8c1660608b015260ff9790971660808a015250505060a08601929092525090941660c08301525060e0808201939093528151808203909301835261010001905295945050505050565b600080808080808060e08814611d36576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601e60248201527f4375727665436f6e76657853747261746567793a206c656e677468206578000060448201526064016107d5565b611d42888a018a61310d565b959f949e50929c50909a509850965090945092505050565b3b151590565b60008281526020818152604080832073ffffffffffffffffffffffffffffffffffffffff8516845290915290205460ff166107e857611db68173ffffffffffffffffffffffffffffffffffffffff16601461265c565b611dc183602061265c565b604051602001611dd292919061383e565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152908290527f08c379a00000000000000000000000000000000000000000000000000000000082526107d591600401612f24565b60008281526020818152604080832073ffffffffffffffffffffffffffffffffffffffff8516845290915290205460ff166107e85760008281526020818152604080832073ffffffffffffffffffffffffffffffffffffffff85168452909152902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055611ec23390565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45050565b60008281526020818152604080832073ffffffffffffffffffffffffffffffffffffffff8516845290915290205460ff16156107e85760008281526020818152604080832073ffffffffffffffffffffffffffffffffffffffff8516808552925280832080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016905551339285917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a45050565b606061201983836040518060400160405280601e81526020017f416464726573733a206c6f772d6c6576656c2063616c6c206661696c6564000081525061289f565b9392505050565b8073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603612057575050565b6040517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015260009073ffffffffffffffffffffffffffffffffffffffff8416906370a0823190602401602060405180830381865afa1580156120c4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906120e891906133d0565b9050806000036120f757505050565b61212c73ffffffffffffffffffffffffffffffffffffffff84167329c66cf57a03d41cfe6d9ecb6883aa0e2aba21ec836128b6565b6040517f0ed2fc9500000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff80851660048301528316602482015260448101829052600060648201527329c66cf57a03d41cfe6d9ecb6883aa0e2aba21ec90630ed2fc95906084016020604051808303816000875af11580156121c2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906121e691906133d0565b50505050565b821561223357612210734e3fbd56cd56c3e72c1403e103b45db9da5b9d2b83612020565b61222e73d533a949740bb3306d119cc777fa900ba034cd5283612020565b61238f565b6040517f70a082310000000000000000000000000000000000000000000000000000000081523060048201526122e1908290734e3fbd56cd56c3e72c1403e103b45db9da5b9d2b906370a0823190602401602060405180830381865afa1580156122a1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906122c591906133d0565b734e3fbd56cd56c3e72c1403e103b45db9da5b9d2b9190612a38565b6040517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015261238f90829073d533a949740bb3306d119cc777fa900ba034cd52906370a0823190602401602060405180830381865afa15801561234f573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061237391906133d0565b73d533a949740bb3306d119cc777fa900ba034cd529190612a38565b6040517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015261072f90829073ffffffffffffffffffffffffffffffffffffffff8516906370a0823190602401602060405180830381865afa1580156123ff573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061242391906133d0565b73ffffffffffffffffffffffffffffffffffffffff85169190612a38565b6040517f1526fe2700000000000000000000000000000000000000000000000000000000815260048101829052600090819073f403c135812408bfbe8713b5a23a04b3d48aae3190631526fe279060240160c060405180830381865afa1580156124af573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906124d391906138bf565b5090979650505050505050565b6040517fdd62ed3e00000000000000000000000000000000000000000000000000000000815230600482015273ffffffffffffffffffffffffffffffffffffffff8381166024830152600091839186169063dd62ed3e90604401602060405180830381865afa158015612557573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061257b91906133d0565b6125859190613938565b60405173ffffffffffffffffffffffffffffffffffffffff85166024820152604481018290529091506121e69085907f095ea7b300000000000000000000000000000000000000000000000000000000906064015b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090931692909217909152612a8e565b6060600061266b836002613693565b612676906002613938565b67ffffffffffffffff81111561268e5761268e61329a565b6040519080825280601f01601f1916602001820160405280156126b8576020820181803683370190505b5090507f3000000000000000000000000000000000000000000000000000000000000000816000815181106126ef576126ef61348c565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053507f7800000000000000000000000000000000000000000000000000000000000000816001815181106127525761275261348c565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600061278e846002613693565b612799906001613938565b90505b6001811115612836577f303132333435363738396162636465660000000000000000000000000000000085600f16601081106127da576127da61348c565b1a60f81b8282815181106127f0576127f061348c565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535060049490941c9361282f81613950565b905061279c565b508315612019576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f537472696e67733a20686578206c656e67746820696e73756666696369656e7460448201526064016107d5565b60606128ae8484600085612b9a565b949350505050565b80158061295657506040517fdd62ed3e00000000000000000000000000000000000000000000000000000000815230600482015273ffffffffffffffffffffffffffffffffffffffff838116602483015284169063dd62ed3e90604401602060405180830381865afa158015612930573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061295491906133d0565b155b6129e2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603660248201527f5361666545524332303a20617070726f76652066726f6d206e6f6e2d7a65726f60448201527f20746f206e6f6e2d7a65726f20616c6c6f77616e63650000000000000000000060648201526084016107d5565b60405173ffffffffffffffffffffffffffffffffffffffff831660248201526044810182905261072f9084907f095ea7b300000000000000000000000000000000000000000000000000000000906064016125da565b60405173ffffffffffffffffffffffffffffffffffffffff831660248201526044810182905261072f9084907fa9059cbb00000000000000000000000000000000000000000000000000000000906064016125da565b6000612af0826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff1661289f9092919063ffffffff16565b80519091501561072f5780806020019051810190612b0e91906134bb565b61072f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f7420737563636565640000000000000000000000000000000000000000000060648201526084016107d5565b606082471015612c2c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f60448201527f722063616c6c000000000000000000000000000000000000000000000000000060648201526084016107d5565b843b612c94576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e747261637400000060448201526064016107d5565b6000808673ffffffffffffffffffffffffffffffffffffffff168587604051612cbd9190613985565b60006040518083038185875af1925050503d8060008114612cfa576040519150601f19603f3d011682016040523d82523d6000602084013e612cff565b606091505b5091509150612d0f828286612d1a565b979650505050505050565b60608315612d29575081612019565b825115612d395782518084602001fd5b816040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107d59190612f24565b60405180608001604052806004906020820280368337509192915050565b600060208284031215612d9d57600080fd5b81357fffffffff000000000000000000000000000000000000000000000000000000008116811461201957600080fd5b73ffffffffffffffffffffffffffffffffffffffff81168114612def57600080fd5b50565b803560ff81168114612e0357600080fd5b919050565b60008060008060008060008060006101208a8c031215612e2757600080fd5b8935612e3281612dcd565b985060208a0135612e4281612dcd565b975060408a0135612e5281612dcd565b9650612e6060608b01612df2565b9550612e6e60808b01612df2565b945060a08a0135935060c08a0135612e8581612dcd565b925060e08a0135612e9581612dcd565b809250506101008a013590509295985092959850929598565b60005b83811015612ec9578181015183820152602001612eb1565b838111156121e65750506000910152565b60008151808452612ef2816020860160208601612eae565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b6020815260006120196020830184612eda565b600060208284031215612f4957600080fd5b5035919050565b60008060408385031215612f6357600080fd5b823591506020830135612f7581612dcd565b809150509250929050565b60008083601f840112612f9257600080fd5b50813567ffffffffffffffff811115612faa57600080fd5b602083019150836020828501011115612fc257600080fd5b9250929050565b8015158114612def57600080fd5b60008060008060008060a08789031215612ff057600080fd5b863567ffffffffffffffff81111561300757600080fd5b61301389828a01612f80565b90975095505060208701359350604087013561302e81612dcd565b9250606087013561303e81612dcd565b9150608087013561304e81612fc9565b809150509295509295509295565b60008083601f84011261306e57600080fd5b50813567ffffffffffffffff81111561308657600080fd5b6020830191508360208260051b8501011115612fc257600080fd5b600080600080604085870312156130b757600080fd5b843567ffffffffffffffff808211156130cf57600080fd5b6130db8883890161305c565b909650945060208701359150808211156130f457600080fd5b506131018782880161305c565b95989497509550505050565b600080600080600080600060e0888a03121561312857600080fd5b873561313381612dcd565b9650602088013561314381612dcd565b9550604088013561315381612dcd565b945061316160608901612df2565b93506080880135925060a088013561317881612dcd565b8092505060c0880135905092959891949750929550565b6000806000806000608086880312156131a757600080fd5b853567ffffffffffffffff8111156131be57600080fd5b6131ca88828901612f80565b90965094505060208601356131de81612dcd565b925060408601356131ee81612dcd565b915060608601356131fe81612fc9565b809150509295509295909350565b6000806020838503121561321f57600080fd5b823567ffffffffffffffff81111561323657600080fd5b61324285828601612f80565b90969095509350505050565b60008060006040848603121561326357600080fd5b833567ffffffffffffffff81111561327a57600080fd5b61328686828701612f80565b909790965060209590950135949350505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff811182821017156133105761331061329a565b604052919050565b600067ffffffffffffffff8211156133325761333261329a565b5060051b60200190565b6000602080838503121561334f57600080fd5b825167ffffffffffffffff81111561336657600080fd5b8301601f8101851361337757600080fd5b805161338a61338582613318565b6132c9565b81815260059190911b820183019083810190878311156133a957600080fd5b928401925b82841015612d0f5783516133c181612dcd565b825292840192908401906133ae565b6000602082840312156133e257600080fd5b5051919050565b600060208083850312156133fc57600080fd5b825167ffffffffffffffff81111561341357600080fd5b8301601f8101851361342457600080fd5b805161343261338582613318565b81815260059190911b8201830190838101908783111561345157600080fd5b928401925b82841015612d0f57835182529284019290840190613456565b60006020828403121561348157600080fd5b815161201981612dcd565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6000602082840312156134cd57600080fd5b815161201981612fc9565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203613538576135386134d8565b5060010190565b600060ff821660ff84168060ff0382111561355c5761355c6134d8565b019392505050565b600181815b808511156135bd57817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048211156135a3576135a36134d8565b808516156135b057918102915b93841c9390800290613569565b509250929050565b6000826135d457506001610703565b816135e157506000610703565b81600181146135f757600281146136015761361d565b6001915050610703565b60ff841115613612576136126134d8565b50506001821b610703565b5060208310610133831016604e8410600b8410161715613640575081810a610703565b61364a8383613564565b807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0482111561367c5761367c6134d8565b029392505050565b600061201960ff8416836135c5565b6000817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156136cb576136cb6134d8565b500290565b600082613706577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b500490565b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe184360301811261374057600080fd5b83018035915067ffffffffffffffff82111561375b57600080fd5b602001915036819003821315612fc257600080fd5b60006020828403121561378257600080fd5b813561201981612dcd565b60608101818460005b60028110156137b5578151835260209283019290910190600101613796565b50505060ff831660408301529392505050565b60808101818460005b60038110156137f05781518352602092830192909101906001016137d1565b50505060ff831660608301529392505050565b60a08101818460005b600481101561382b57815183526020928301929091019060010161380c565b50505060ff831660808301529392505050565b7f416363657373436f6e74726f6c3a206163636f756e7420000000000000000000815260008351613876816017850160208801612eae565b7f206973206d697373696e6720726f6c652000000000000000000000000000000060179184019182015283516138b3816028840160208801612eae565b01602801949350505050565b60008060008060008060c087890312156138d857600080fd5b86516138e381612dcd565b60208801519096506138f481612dcd565b604088015190955061390581612dcd565b606088015190945061391681612dcd565b608088015190935061392781612dcd565b60a088015190925061304e81612fc9565b6000821982111561394b5761394b6134d8565b500190565b60008161395f5761395f6134d8565b507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0190565b60008251613997818460208701612eae565b919091019291505056fea26469706673582212202f7f496fced2ca29aff5387d32395ca36e9019656050f09f0fe56e974624fa6464736f6c634300080e0033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001
-----Decoded View---------------
Arg [0] : voteExecutor (address): 0x0000000000000000000000000000000000000000
Arg [1] : gnosis (address): 0x0000000000000000000000000000000000000000
Arg [2] : isTesting (bool): True
-----Encoded View---------------
3 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000000
Arg [1] : 0000000000000000000000000000000000000000000000000000000000000000
Arg [2] : 0000000000000000000000000000000000000000000000000000000000000001
Loading...
Loading
Loading...
Loading
Net Worth in USD
$0.00
Net Worth in ETH
0
Multichain Portfolio | 32 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.