More Info
Private Name Tags
ContractCreator
View more zero value Internal Transactions in Advanced View mode
Advanced mode:
Loading...
Loading
Contract Source Code Verified (Exact Match)
Contract Name:
ZunEthFrxEthApsStakingConvexCurveStrat
Compiler Version
v0.8.23+commit.f704f362
Optimization Enabled:
Yes with 200 runs
Other Settings:
paris EvmVersion
Contract Source Code (Solidity Standard Json-Input format)
//SPDX-License-Identifier: MIT pragma solidity ^0.8.23; import '../../../../../utils/Constants.sol'; import './FrxEthApsStakingConvexCurveStratBase.sol'; contract ZunEthFrxEthApsStakingConvexCurveStrat is FrxEthApsStakingConvexCurveStratBase { constructor() FrxEthApsStakingConvexCurveStratBase( [ IERC20(Constants.zunETH_ADDRESS), IERC20(address(0)), IERC20(address(0)), IERC20(address(0)), IERC20(address(0)) ], [uint256(1), 0, 0, 0, 0], Constants.CRV_zunETH_frxETH_ADDRESS, Constants.CRV_zunETH_frxETH_LP_ADDRESS, Constants.CRV_STAKING_BOOSTER_ADDRESS, Constants.CVX_STAKING_zunETH_frxETH_PID, Constants.zunETH_CONTROLLER_ADDRESS, Constants.zunETH_ADDRESS ) {} }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v5.0.0) (access/AccessControl.sol) pragma solidity ^0.8.20; import {IAccessControl} from "./IAccessControl.sol"; import {Context} from "../utils/Context.sol"; import {ERC165} from "../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: * * ```solidity * 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}: * * ```solidity * 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. We recommend using {AccessControlDefaultAdminRules} * to enforce additional security measures for this role. */ abstract contract AccessControl is Context, IAccessControl, ERC165 { struct RoleData { mapping(address account => bool) hasRole; bytes32 adminRole; } mapping(bytes32 role => RoleData) private _roles; bytes32 public constant DEFAULT_ADMIN_ROLE = 0x00; /** * @dev Modifier that checks that an account has a specific role. Reverts * with an {AccessControlUnauthorizedAccount} error including the required role. */ modifier onlyRole(bytes32 role) { _checkRole(role); _; } /** * @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 virtual returns (bool) { return _roles[role].hasRole[account]; } /** * @dev Reverts with an {AccessControlUnauthorizedAccount} error if `_msgSender()` * is missing `role`. Overriding this function changes the behavior of the {onlyRole} modifier. */ function _checkRole(bytes32 role) internal view virtual { _checkRole(role, _msgSender()); } /** * @dev Reverts with an {AccessControlUnauthorizedAccount} error if `account` * is missing `role`. */ function _checkRole(bytes32 role, address account) internal view virtual { if (!hasRole(role, account)) { revert AccessControlUnauthorizedAccount(account, role); } } /** * @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 virtual 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. * * May emit a {RoleGranted} event. */ function grantRole(bytes32 role, address account) public virtual 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. * * May emit a {RoleRevoked} event. */ function revokeRole(bytes32 role, address account) public virtual 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 `callerConfirmation`. * * May emit a {RoleRevoked} event. */ function renounceRole(bytes32 role, address callerConfirmation) public virtual { if (callerConfirmation != _msgSender()) { revert AccessControlBadConfirmation(); } _revokeRole(role, callerConfirmation); } /** * @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 Attempts to grant `role` to `account` and returns a boolean indicating if `role` was granted. * * Internal function without access restriction. * * May emit a {RoleGranted} event. */ function _grantRole(bytes32 role, address account) internal virtual returns (bool) { if (!hasRole(role, account)) { _roles[role].hasRole[account] = true; emit RoleGranted(role, account, _msgSender()); return true; } else { return false; } } /** * @dev Attempts to revoke `role` to `account` and returns a boolean indicating if `role` was revoked. * * Internal function without access restriction. * * May emit a {RoleRevoked} event. */ function _revokeRole(bytes32 role, address account) internal virtual returns (bool) { if (hasRole(role, account)) { _roles[role].hasRole[account] = false; emit RoleRevoked(role, account, _msgSender()); return true; } else { return false; } } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v5.0.0) (access/IAccessControl.sol) pragma solidity ^0.8.20; /** * @dev External interface of AccessControl declared to support ERC165 detection. */ interface IAccessControl { /** * @dev The `account` is missing a role. */ error AccessControlUnauthorizedAccount(address account, bytes32 neededRole); /** * @dev The caller of a function is not the expected one. * * NOTE: Don't confuse with {AccessControlUnauthorizedAccount}. */ error AccessControlBadConfirmation(); /** * @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. */ 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 `callerConfirmation`. */ function renounceRole(bytes32 role, address callerConfirmation) external; }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v5.0.0) (token/ERC20/extensions/IERC20Permit.sol) pragma solidity ^0.8.20; /** * @dev Interface of the ERC20 Permit extension allowing approvals to be made via signatures, as defined in * https://eips.ethereum.org/EIPS/eip-2612[EIP-2612]. * * Adds the {permit} method, which can be used to change an account's ERC20 allowance (see {IERC20-allowance}) by * presenting a message signed by the account. By not relying on {IERC20-approve}, the token holder account doesn't * need to send a transaction, and thus is not required to hold Ether at all. * * ==== Security Considerations * * There are two important considerations concerning the use of `permit`. The first is that a valid permit signature * expresses an allowance, and it should not be assumed to convey additional meaning. In particular, it should not be * considered as an intention to spend the allowance in any specific way. The second is that because permits have * built-in replay protection and can be submitted by anyone, they can be frontrun. A protocol that uses permits should * take this into consideration and allow a `permit` call to fail. Combining these two aspects, a pattern that may be * generally recommended is: * * ```solidity * function doThingWithPermit(..., uint256 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s) public { * try token.permit(msg.sender, address(this), value, deadline, v, r, s) {} catch {} * doThing(..., value); * } * * function doThing(..., uint256 value) public { * token.safeTransferFrom(msg.sender, address(this), value); * ... * } * ``` * * Observe that: 1) `msg.sender` is used as the owner, leaving no ambiguity as to the signer intent, and 2) the use of * `try/catch` allows the permit to fail and makes the code tolerant to frontrunning. (See also * {SafeERC20-safeTransferFrom}). * * Additionally, note that smart contract wallets (such as Argent or Safe) are not able to produce permit signatures, so * contracts should have entry points that don't rely on permit. */ interface IERC20Permit { /** * @dev Sets `value` as the allowance of `spender` over ``owner``'s tokens, * given ``owner``'s signed approval. * * IMPORTANT: The same issues {IERC20-approve} has related to transaction * ordering also apply here. * * Emits an {Approval} event. * * Requirements: * * - `spender` cannot be the zero address. * - `deadline` must be a timestamp in the future. * - `v`, `r` and `s` must be a valid `secp256k1` signature from `owner` * over the EIP712-formatted function arguments. * - the signature must use ``owner``'s current nonce (see {nonces}). * * For more information on the signature format, see the * https://eips.ethereum.org/EIPS/eip-2612#specification[relevant EIP * section]. * * CAUTION: See Security Considerations above. */ function permit( address owner, address spender, uint256 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s ) external; /** * @dev Returns the current nonce for `owner`. This value must be * included whenever a signature is generated for {permit}. * * Every successful call to {permit} increases ``owner``'s nonce by one. This * prevents a signature from being used multiple times. */ function nonces(address owner) external view returns (uint256); /** * @dev Returns the domain separator used in the encoding of the signature for {permit}, as defined by {EIP712}. */ // solhint-disable-next-line func-name-mixedcase function DOMAIN_SEPARATOR() external view returns (bytes32); }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v5.0.0) (token/ERC20/IERC20.sol) pragma solidity ^0.8.20; /** * @dev Interface of the ERC20 standard as defined in the EIP. */ interface IERC20 { /** * @dev Emitted when `value` tokens are moved from one account (`from`) to * another (`to`). * * Note that `value` may be zero. */ event Transfer(address indexed from, address indexed to, uint256 value); /** * @dev Emitted when the allowance of a `spender` for an `owner` is set by * a call to {approve}. `value` is the new allowance. */ event Approval(address indexed owner, address indexed spender, uint256 value); /** * @dev Returns the value of tokens in existence. */ function totalSupply() external view returns (uint256); /** * @dev Returns the value of tokens owned by `account`. */ function balanceOf(address account) external view returns (uint256); /** * @dev Moves a `value` amount of tokens from the caller's account to `to`. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transfer(address to, uint256 value) external returns (bool); /** * @dev Returns the remaining number of tokens that `spender` will be * allowed to spend on behalf of `owner` through {transferFrom}. This is * zero by default. * * This value changes when {approve} or {transferFrom} are called. */ function allowance(address owner, address spender) external view returns (uint256); /** * @dev Sets a `value` amount of tokens as the allowance of `spender` over the * caller's tokens. * * Returns a boolean value indicating whether the operation succeeded. * * IMPORTANT: Beware that changing an allowance with this method brings the risk * that someone may use both the old and the new allowance by unfortunate * transaction ordering. One possible solution to mitigate this race * condition is to first reduce the spender's allowance to 0 and set the * desired value afterwards: * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 * * Emits an {Approval} event. */ function approve(address spender, uint256 value) external returns (bool); /** * @dev Moves a `value` amount of tokens from `from` to `to` using the * allowance mechanism. `value` is then deducted from the caller's * allowance. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transferFrom(address from, address to, uint256 value) external returns (bool); }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v5.0.0) (token/ERC20/utils/SafeERC20.sol) pragma solidity ^0.8.20; import {IERC20} from "../IERC20.sol"; import {IERC20Permit} from "../extensions/IERC20Permit.sol"; import {Address} from "../../../utils/Address.sol"; /** * @title SafeERC20 * @dev Wrappers around ERC20 operations that throw on failure (when the token * contract returns false). Tokens that return no value (and instead revert or * throw on failure) are also supported, non-reverting calls are assumed to be * successful. * To use this library you can add a `using SafeERC20 for IERC20;` statement to your contract, * which allows you to call the safe operations as `token.safeTransfer(...)`, etc. */ library SafeERC20 { using Address for address; /** * @dev An operation with an ERC20 token failed. */ error SafeERC20FailedOperation(address token); /** * @dev Indicates a failed `decreaseAllowance` request. */ error SafeERC20FailedDecreaseAllowance(address spender, uint256 currentAllowance, uint256 requestedDecrease); /** * @dev Transfer `value` amount of `token` from the calling contract to `to`. If `token` returns no value, * non-reverting calls are assumed to be successful. */ function safeTransfer(IERC20 token, address to, uint256 value) internal { _callOptionalReturn(token, abi.encodeCall(token.transfer, (to, value))); } /** * @dev Transfer `value` amount of `token` from `from` to `to`, spending the approval given by `from` to the * calling contract. If `token` returns no value, non-reverting calls are assumed to be successful. */ function safeTransferFrom(IERC20 token, address from, address to, uint256 value) internal { _callOptionalReturn(token, abi.encodeCall(token.transferFrom, (from, to, value))); } /** * @dev Increase the calling contract's allowance toward `spender` by `value`. If `token` returns no value, * non-reverting calls are assumed to be successful. */ function safeIncreaseAllowance(IERC20 token, address spender, uint256 value) internal { uint256 oldAllowance = token.allowance(address(this), spender); forceApprove(token, spender, oldAllowance + value); } /** * @dev Decrease the calling contract's allowance toward `spender` by `requestedDecrease`. If `token` returns no * value, non-reverting calls are assumed to be successful. */ function safeDecreaseAllowance(IERC20 token, address spender, uint256 requestedDecrease) internal { unchecked { uint256 currentAllowance = token.allowance(address(this), spender); if (currentAllowance < requestedDecrease) { revert SafeERC20FailedDecreaseAllowance(spender, currentAllowance, requestedDecrease); } forceApprove(token, spender, currentAllowance - requestedDecrease); } } /** * @dev Set the calling contract's allowance toward `spender` to `value`. If `token` returns no value, * non-reverting calls are assumed to be successful. Meant to be used with tokens that require the approval * to be set to zero before setting it to a non-zero value, such as USDT. */ function forceApprove(IERC20 token, address spender, uint256 value) internal { bytes memory approvalCall = abi.encodeCall(token.approve, (spender, value)); if (!_callOptionalReturnBool(token, approvalCall)) { _callOptionalReturn(token, abi.encodeCall(token.approve, (spender, 0))); _callOptionalReturn(token, approvalCall); } } /** * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement * on the return value: the return value is optional (but if data is returned, it must not be false). * @param token The token targeted by the call. * @param data The call data (encoded using abi.encode or one of its variants). */ function _callOptionalReturn(IERC20 token, bytes memory data) private { // We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since // we're implementing it ourselves. We use {Address-functionCall} to perform this call, which verifies that // the target address contains contract code and also asserts for success in the low-level call. bytes memory returndata = address(token).functionCall(data); if (returndata.length != 0 && !abi.decode(returndata, (bool))) { revert SafeERC20FailedOperation(address(token)); } } /** * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement * on the return value: the return value is optional (but if data is returned, it must not be false). * @param token The token targeted by the call. * @param data The call data (encoded using abi.encode or one of its variants). * * This is a variant of {_callOptionalReturn} that silents catches all reverts and returns a bool instead. */ function _callOptionalReturnBool(IERC20 token, bytes memory data) private returns (bool) { // We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since // we're implementing it ourselves. We cannot use {Address-functionCall} here since this should return false // and not revert is the subcall reverts. (bool success, bytes memory returndata) = address(token).call(data); return success && (returndata.length == 0 || abi.decode(returndata, (bool))) && address(token).code.length > 0; } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v5.0.0) (utils/Address.sol) pragma solidity ^0.8.20; /** * @dev Collection of functions related to the address type */ library Address { /** * @dev The ETH balance of the account is not enough to perform the operation. */ error AddressInsufficientBalance(address account); /** * @dev There's no code at `target` (it is not a contract). */ error AddressEmptyCode(address target); /** * @dev A call to an address target failed. The target may have reverted. */ error FailedInnerCall(); /** * @dev Replacement for Solidity's `transfer`: sends `amount` wei to * `recipient`, forwarding all available gas and reverting on errors. * * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by `transfer`, making them unable to receive funds via * `transfer`. {sendValue} removes this limitation. * * https://consensys.net/diligence/blog/2019/09/stop-using-soliditys-transfer-now/[Learn more]. * * IMPORTANT: because control is transferred to `recipient`, care must be * taken to not create reentrancy vulnerabilities. Consider using * {ReentrancyGuard} or the * https://solidity.readthedocs.io/en/v0.8.20/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { if (address(this).balance < amount) { revert AddressInsufficientBalance(address(this)); } (bool success, ) = recipient.call{value: amount}(""); if (!success) { revert FailedInnerCall(); } } /** * @dev Performs a Solidity function call using a low level `call`. A * plain `call` is an unsafe replacement for a function call: use this * function instead. * * If `target` reverts with a revert reason or custom error, it is bubbled * up by this function (like regular Solidity function calls). However, if * the call reverted with no returned reason, this function reverts with a * {FailedInnerCall} error. * * Returns the raw returned data. To convert to the expected return value, * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. * * Requirements: * * - `target` must be a contract. * - calling `target` with `data` must not revert. */ function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCallWithValue(target, data, 0); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but also transferring `value` wei to `target`. * * Requirements: * * - the calling contract must have an ETH balance of at least `value`. * - the called Solidity function must be `payable`. */ function functionCallWithValue(address target, bytes memory data, uint256 value) internal returns (bytes memory) { if (address(this).balance < value) { revert AddressInsufficientBalance(address(this)); } (bool success, bytes memory returndata) = target.call{value: value}(data); return verifyCallResultFromTarget(target, success, returndata); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a static call. */ function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) { (bool success, bytes memory returndata) = target.staticcall(data); return verifyCallResultFromTarget(target, success, returndata); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a delegate call. */ function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { (bool success, bytes memory returndata) = target.delegatecall(data); return verifyCallResultFromTarget(target, success, returndata); } /** * @dev Tool to verify that a low level call to smart-contract was successful, and reverts if the target * was not a contract or bubbling up the revert reason (falling back to {FailedInnerCall}) in case of an * unsuccessful call. */ function verifyCallResultFromTarget( address target, bool success, bytes memory returndata ) internal view returns (bytes memory) { if (!success) { _revert(returndata); } else { // only check if target is a contract if the call was successful and the return data is empty // otherwise we already know that it was a contract if (returndata.length == 0 && target.code.length == 0) { revert AddressEmptyCode(target); } return returndata; } } /** * @dev Tool to verify that a low level call was successful, and reverts if it wasn't, either by bubbling the * revert reason or with a default {FailedInnerCall} error. */ function verifyCallResult(bool success, bytes memory returndata) internal pure returns (bytes memory) { if (!success) { _revert(returndata); } else { return returndata; } } /** * @dev Reverts with returndata if present. Otherwise reverts with {FailedInnerCall}. */ function _revert(bytes memory returndata) private pure { // Look for revert reason and bubble it up if present if (returndata.length > 0) { // The easiest way to bubble the revert reason is using memory via assembly /// @solidity memory-safe-assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert FailedInnerCall(); } } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v5.0.1) (utils/Context.sol) pragma solidity ^0.8.20; /** * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } function _contextSuffixLength() internal view virtual returns (uint256) { return 0; } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v5.0.0) (utils/introspection/ERC165.sol) pragma solidity ^0.8.20; import {IERC165} from "./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); * } * ``` */ abstract contract ERC165 is IERC165 { /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual returns (bool) { return interfaceId == type(IERC165).interfaceId; } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v5.0.0) (utils/introspection/IERC165.sol) pragma solidity ^0.8.20; /** * @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 pragma solidity ^0.8.23; interface IController { function deposit(uint256[5] memory amounts, address receiver) external returns (uint256 shares); function withdraw(uint256 shares, uint256[5] memory minTokenAmounts, address receiver) external; }
//SPDX-License-Identifier: MIT pragma solidity ^0.8.23; interface IConvexRewards { function balanceOf(address account) external view returns (uint256); function earned(address account) external view returns (uint256); function rewardRate() external view returns (uint256); function totalSupply() external view returns (uint256); function withdrawAllAndUnwrap(bool claim) external; function withdrawAndUnwrap(uint256 amount, bool claim) external; function getReward() external returns (bool); function extraRewardsLength() external view returns (uint256); function extraRewards(uint256 id) external view returns (address extraRewardsAddress); function rewardToken() external view returns (address); }
//SPDX-License-Identifier: MIT pragma solidity ^0.8.0; interface IConvexStakingBooster { function createVault(uint256 _pid) external returns (address); }
//SPDX-License-Identifier: MIT pragma solidity ^0.8.23; import './ICurvePoolPricable.sol'; interface ICurvePool2 is ICurvePoolPricable { function coins(uint256 i) external view returns (address); function add_liquidity( uint256[2] memory amounts, uint256 min_mint_amount ) external returns (uint256); function remove_liquidity( uint256 burn_amount, uint256[2] memory min_amounts ) external returns (uint256[2] memory); function remove_liquidity_imbalance( uint256[2] memory amounts, uint256 max_burn_amount ) external returns (uint256); function remove_liquidity_one_coin( uint256 burn_amount, int128 i, uint256 min_received ) external returns (uint256); function exchange( int128 i, int128 j, uint256 input, uint256 min_output ) external returns (uint256); function exchange_underlying(int128 i, int128 j, uint256 input, uint256 min_output) external; function calc_token_amount( uint256[2] memory amounts, bool is_deposit ) external view returns (uint256); function calc_token_amount( uint256[2] memory amounts, bool is_deposit, bool previous ) external view returns (uint256); function calc_withdraw_one_coin(uint256 burn_amount, int128 i) external view returns (uint256); function get_dy(int128 i, int128 j, uint256 dx) external view returns (uint256); }
//SPDX-License-Identifier: MIT pragma solidity ^0.8.23; import './ICurvePoolPricable.sol'; interface ICurvePoolN is ICurvePoolPricable { function coins(uint256 i) external view returns (address); function add_liquidity( uint256[] memory amounts, uint256 min_mint_amount ) external returns (uint256); function remove_liquidity( uint256 burn_amount, uint256[] memory min_amounts ) external returns (uint256[] memory); function remove_liquidity_imbalance( uint256[] memory amounts, uint256 max_burn_amount ) external returns (uint256); function remove_liquidity_one_coin( uint256 burn_amount, int128 i, uint256 min_received ) external returns (uint256); function exchange( int128 i, int128 j, uint256 input, uint256 min_output ) external returns (uint256); function exchange_underlying(int128 i, int128 j, uint256 input, uint256 min_output) external; function calc_token_amount( uint256[] memory amounts, bool is_deposit ) external view returns (uint256); function calc_token_amount( uint256[] memory amounts, bool is_deposit, bool previous ) external view returns (uint256); function calc_withdraw_one_coin(uint256 burn_amount, int128 i) external view returns (uint256); function get_dy(int128 i, int128 j, uint256 dx) external view returns (uint256); }
//SPDX-License-Identifier: MIT pragma solidity ^0.8.23; interface ICurvePoolPricable { function get_virtual_price() external view returns (uint256); }
//SPDX-License-Identifier: MIT pragma solidity ^0.8.0; interface IFraxFarmERC20 { function lockedLiquidityOf(address account) external view returns (uint256); }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.23; import { IERC20 } from '@openzeppelin/contracts/token/ERC20/IERC20.sol'; import { IStrategy } from './IStrategy.sol'; interface IPool is IERC20 { error WrongDeposit(uint256 sid, uint256[5] amounts); error AbsentStrategy(uint256 sid); error NotStartedStrategy(uint256 sid); error DisabledStrategy(uint256 sid); error WrongAmount(); error WrongWithdrawParams(uint256 sid); error WrongRatio(); error ZeroAddress(); error DuplicatedStrategy(); error IncorrectArguments(); error WrongWithdrawPercent(); error WrongReceiver(); error IncorrectSid(); error WrongTokens(); error WrongDecimalMultipliers(); struct StrategyInfo { IStrategy strategy; uint256 startTime; uint256 minted; bool enabled; } event Deposited( address indexed depositor, uint256 deposited, uint256[5] amounts, uint256 indexed sid ); event Withdrawn(address indexed withdrawer, uint256 withdrawn, uint256 indexed sid); event FailedWithdrawal(address indexed withdrawer, uint256[5] amounts, uint256 withdrawn); event AddedStrategy(uint256 indexed sid, address indexed strategyAddr, uint256 startTime); event ClaimedRewards(address indexed receiver, IERC20[] rewardTokens); event ClaimedExtraGains(address indexed receiver, uint256 amount); event EnabledStrategy(address indexed pool); event DisableStrategy(address indexed pool); event UpdatedToken( uint256 indexed tid, address indexed token, uint256 tokenDecimalMultiplier, address tokenOld ); function tokens() external view returns (IERC20[5] memory); function token(uint256 tid) external view returns (IERC20); function tokenDecimalsMultipliers() external view returns (uint256[5] memory); function strategyInfo(uint256 sid) external view returns (StrategyInfo memory); function claimRewards(address receiver, IERC20[] memory rewardTokens) external; function totalHoldings() external view returns (uint256); function strategyCount() external view returns (uint256); function deposit( uint256 sid, uint256[5] memory amounts, address receiver ) external returns (uint256); function depositStrategy(uint256 sid, uint256[5] memory amounts) external returns (uint256); function withdraw( uint256 sid, uint256 stableAmount, uint256[5] memory minTokenAmounts, address receiver ) external; function mintAndClaimExtraGains(address receiver) external; }
//SPDX-License-Identifier: MIT pragma solidity ^0.8.0; import './IFraxFarmERC20.sol'; interface IStakingProxyConvex { function stakingAddress() external view returns (IFraxFarmERC20); function stakeLockedCurveLp(uint256 _liquidity, uint256 _secs) external returns (bytes32 kek_id); function lockAdditionalCurveLp(bytes32 _kek_id, uint256 _addl_liq) external; function lockLonger(bytes32 _kek_id, uint256 new_ending_ts) external; function withdrawLockedAndUnwrap(bytes32 _kek_id) external; function earned() external view returns (address[] memory token_addresses, uint256[] memory total_earned); function getReward(bool _claim) external; }
//SPDX-License-Identifier: MIT pragma solidity ^0.8.23; import { IERC20 } from '@openzeppelin/contracts/token/ERC20/IERC20.sol'; interface IStrategy { function deposit(uint256[5] memory amounts) external returns (uint256); function withdraw( address receiver, uint256 userDepositRatio, // multiplied by 1e18 uint256[5] memory minTokenAmounts ) external returns (bool); function withdrawAll(uint256[5] memory minTokenAmounts) external; function totalHoldings() external view returns (uint256); function claimRewards(address receiver, IERC20[] memory rewardTokens) external; function calcTokenAmount( uint256[5] memory tokenAmounts, bool isDeposit ) external view returns (uint256 sharesAmount); }
//SPDX-License-Identifier: MIT pragma solidity ^0.8.23; interface ITokenConverter { function handle( address tokenIn, address tokenOut, uint256 amount, uint256 minAmountOut ) external returns (uint256); function valuate( address tokenIn_, address tokenOut_, uint256 amountIn_ ) external view returns (uint256); }
// SPDX-License-Identifier: GPL-3.0-or-later pragma solidity ^0.8.23; interface IOracle { error ZeroAddress(); error UnsupportedToken(); /// @notice returns the price in USD of symbol. function getUSDPrice(address token) external view returns (uint256); /// @notice returns if the given token is supported for pricing. function isTokenSupported(address token) external view returns (bool); }
//SPDX-License-Identifier: MIT pragma solidity ^0.8.23; import '../StakingConvexCurveNStratBase.sol'; abstract contract EmergencyAdminStakingConvexCurveNStratBase is StakingConvexCurveNStratBase { bytes32 public constant EMERGENCY_ADMIN_ROLE = keccak256('EMERGENCY_ADMIN_ROLE'); constructor( IERC20[POOL_ASSETS] memory _tokens, uint256[POOL_ASSETS] memory _tokenDecimalsMultipliers, address _poolAddr, address _poolLpAddr, address _cvxBooster, uint256 _cvxPID ) StakingConvexCurveNStratBase( _tokens, _tokenDecimalsMultipliers, _poolAddr, _poolLpAddr, _cvxBooster, _cvxPID ) { _grantRole(EMERGENCY_ADMIN_ROLE, msg.sender); } function inflate( uint256 ratioOfCrvLps, uint256 minInflatedAmount ) external onlyRole(EMERGENCY_ADMIN_ROLE) { _inflate(ratioOfCrvLps, minInflatedAmount); } function _inflate(uint256 ratioOfCrvLps, uint256 minInflatedAmount) internal virtual; function deflate( uint256 ratioOfCrvLps, uint256 minDeflateAmount ) external onlyRole(EMERGENCY_ADMIN_ROLE) { _deflate(ratioOfCrvLps, minDeflateAmount); } function _deflate(uint256 ratioOfCrvLps, uint256 minDeflateAmount) internal virtual; function stakeLonger() external onlyRole(EMERGENCY_ADMIN_ROLE) { uint256 newLockTimestamp = block.timestamp + lockingIntervalSec; stakingVault.lockLonger(kekId, newLockTimestamp); emit LockedLonger(newLockTimestamp); } }
//SPDX-License-Identifier: MIT pragma solidity ^0.8.23; import '../../../../../utils/Constants.sol'; import '../../../../../interfaces/IController.sol'; import '../../../../../interfaces/ITokenConverter.sol'; import '../EmergencyAdminStakingConvexCurveNStratBase.sol'; import '../../../../../interfaces/ICurvePool2.sol'; import '../../../../../interfaces/ITokenConverter.sol'; import 'hardhat/console.sol'; contract FrxEthApsStakingConvexCurveStratBase is EmergencyAdminStakingConvexCurveNStratBase { using SafeERC20 for IERC20; error InsufficientAmount(); uint256 constant ZUNAMI_STABLE_TOKEN_ID = 0; uint128 public constant FRXETH_TOKEN_POOL_FRXETH_ID = 1; int128 public constant FRXETH_TOKEN_POOL_FRXETH_ID_INT = int128(FRXETH_TOKEN_POOL_FRXETH_ID); uint128 public constant FRXETH_TOKEN_POOL_TOKEN_ID = 0; int128 public constant FRXETH_TOKEN_POOL_TOKEN_ID_INT = int128(FRXETH_TOKEN_POOL_TOKEN_ID); IERC20 wEth = IERC20(Constants.WETH_ADDRESS); IERC20 frxEth = IERC20(Constants.FRX_ETH_ADDRESS); IController public immutable zunamiController; IERC20 public immutable zunamiStable; ITokenConverter public converter; event SetTokenConverter(address tokenConverter); constructor( IERC20[POOL_ASSETS] memory _tokens, uint256[POOL_ASSETS] memory _tokenDecimalsMultipliers, address _poolAddr, address _poolLpAddr, address _cvxBooster, uint256 _cvxPID, address _zunamiControllerAddr, address _zunamiStableAddr ) EmergencyAdminStakingConvexCurveNStratBase( _tokens, _tokenDecimalsMultipliers, _poolAddr, _poolLpAddr, _cvxBooster, _cvxPID ) { if (_zunamiControllerAddr == address(0)) revert ZeroAddress(); zunamiController = IController(_zunamiControllerAddr); if (_zunamiStableAddr == address(0)) revert ZeroAddress(); zunamiStable = IERC20(_zunamiStableAddr); } function setLockingIntervalSec(uint256 _lockingIntervalSec) external onlyRole(EMERGENCY_ADMIN_ROLE) { _setLockingIntervalSec(_lockingIntervalSec); } function setTokenConverter(address converterAddr) external onlyRole(DEFAULT_ADMIN_ROLE) { if (address(converterAddr) == address(0)) revert ZeroAddress(); converter = ITokenConverter(converterAddr); emit SetTokenConverter(converterAddr); } function getTokenPrice(address token) internal view override returns (uint256) { if (token == address(Constants.WETH_ADDRESS)) return 1e18; return (oracle.getUSDPrice(token) * 1e18) / oracle.getUSDPrice(Constants.CHAINLINK_FEED_REGISTRY_ETH_ADDRESS); } function convertCurvePoolTokenAmounts( uint256[POOL_ASSETS] memory amounts ) internal pure override returns (uint256[] memory) { uint256[] memory amountsN = new uint256[](CURVENG_MAX_COINS); amountsN[FRXETH_TOKEN_POOL_TOKEN_ID] = amounts[ZUNAMI_STABLE_TOKEN_ID]; return amountsN; } function convertAndApproveTokens( address pool, uint256[POOL_ASSETS] memory amounts ) internal override returns (uint256[] memory) { uint256[] memory amountsN = new uint256[](CURVENG_MAX_COINS); amountsN[FRXETH_TOKEN_POOL_TOKEN_ID] = amounts[ZUNAMI_STABLE_TOKEN_ID]; zunamiStable.safeIncreaseAllowance(pool, amountsN[FRXETH_TOKEN_POOL_TOKEN_ID]); return amountsN; } function getCurveRemovingTokenIndex() internal pure override returns (int128) { return FRXETH_TOKEN_POOL_TOKEN_ID_INT; } function getZunamiRemovingTokenIndex() internal pure override returns (uint256) { return ZUNAMI_STABLE_TOKEN_ID; } function _inflate(uint256 ratioOfCrvLps, uint256 minInflatedAmount) internal override { uint256 removingCrvLps = getLiquidityAmountByRatio(ratioOfCrvLps); depositedLiquidity -= removingCrvLps; releaseLiquidity(); if (ratioOfCrvLps != RATIO_MULTIPLIER) { // stake back other liquidity depositBooster(poolToken.balanceOf(address(this)) - removingCrvLps); } uint256 frxEthAmount = pool.remove_liquidity_one_coin( removingCrvLps, FRXETH_TOKEN_POOL_FRXETH_ID_INT, 0 ); frxEth.safeIncreaseAllowance(address(zunamiController), frxEthAmount); uint256 zunStableAmount = zunamiController.deposit( [0, frxEthAmount, 0, 0, 0], address(this) ); if (zunStableAmount < minInflatedAmount) { revert InsufficientAmount(); } uint256[] memory amountsN = new uint256[](CURVENG_MAX_COINS); amountsN[FRXETH_TOKEN_POOL_TOKEN_ID] = zunStableAmount; zunamiStable.safeIncreaseAllowance(address(pool), zunStableAmount); uint256 poolTokenAmount = depositCurve(amountsN); depositedLiquidity += poolTokenAmount; depositBooster(poolTokenAmount); } function _deflate(uint256 ratioOfCrvLps, uint256 minDeflateAmount) internal override { uint256 removingCrvLps = getLiquidityAmountByRatio(ratioOfCrvLps); depositedLiquidity -= removingCrvLps; releaseLiquidity(); if (ratioOfCrvLps != RATIO_MULTIPLIER) { // stake back other liquidity depositBooster(poolToken.balanceOf(address(this)) - removingCrvLps); } uint256 tokenAmount = pool.remove_liquidity_one_coin( removingCrvLps, FRXETH_TOKEN_POOL_TOKEN_ID_INT, 0 ); zunamiStable.safeIncreaseAllowance(address(zunamiController), tokenAmount); zunamiController.withdraw(tokenAmount, [uint256(0), 0, 0, 0, 0], address(this)); uint256 wEthBalance = wEth.balanceOf(address(this)); if (wEthBalance > 0) { wEth.safeTransfer(address(converter), wEthBalance); converter.handle( address(wEth), address(frxEth), wEthBalance, applySlippage(wEthBalance) ); } uint256 frxEthAmount = frxEth.balanceOf(address(this)); if (frxEthAmount < minDeflateAmount) { revert InsufficientAmount(); } uint256[] memory amountsN = new uint256[](CURVENG_MAX_COINS); amountsN[FRXETH_TOKEN_POOL_FRXETH_ID] = frxEthAmount; frxEth.safeIncreaseAllowance(address(pool), frxEthAmount); uint256 poolTokenAmount = depositCurve(amountsN); depositedLiquidity += poolTokenAmount; depositBooster(poolTokenAmount); } }
//SPDX-License-Identifier: MIT pragma solidity ^0.8.23; import '../CurveNStratBase.sol'; import '../../../interfaces/IConvexRewards.sol'; import '../../../interfaces/IConvexStakingBooster.sol'; import "../../../interfaces/IStakingProxyConvex.sol"; abstract contract StakingConvexCurveNStratBase is CurveNStratBase { using SafeERC20 for IERC20; error WrongBoosterDepositAll(); event LockedLonger(uint256 newLockTimestamp); event SetLockingIntervalSec(uint256 lockingIntervalSec); uint256 public immutable cvxPID; IConvexStakingBooster public immutable cvxBooster; IConvexRewards public immutable cvxRewards; IStakingProxyConvex public stakingVault; bytes32 public kekId; uint256 public lockingIntervalSec; constructor( IERC20[POOL_ASSETS] memory _tokens, uint256[POOL_ASSETS] memory _tokenDecimalsMultipliers, address _poolAddr, address _poolTokenAddr, address _cvxBooster, uint256 _cvxPID ) CurveNStratBase(_tokens, _tokenDecimalsMultipliers, _poolAddr, _poolTokenAddr) { if (_cvxBooster == address(0)) revert ZeroAddress(); cvxBooster = IConvexStakingBooster(_cvxBooster); if (_cvxPID == 0) revert ZeroValue(); cvxPID = _cvxPID; _setLockingIntervalSec(604800); // 7 days } function _setLockingIntervalSec(uint256 _lockingIntervalSec) internal { lockingIntervalSec = _lockingIntervalSec; emit SetLockingIntervalSec(_lockingIntervalSec); } function depositBooster(uint256 amount) internal override { if (address(stakingVault) == address(0)) { stakingVault = IStakingProxyConvex(cvxBooster.createVault(cvxPID)); } poolToken.safeIncreaseAllowance(address(stakingVault), amount); if (kekId == 0) { kekId = stakingVault.stakeLockedCurveLp(amount, lockingIntervalSec); } else { stakingVault.lockAdditionalCurveLp(kekId, amount); } } function releaseLiquidity() internal { stakingVault.withdrawLockedAndUnwrap(kekId); kekId = 0; } function removeLiquidity( uint256 amount, uint256[POOL_ASSETS] memory minTokenAmounts, bool removeAll ) internal virtual override { // release all liquidity releaseLiquidity(); if (!removeAll) { // stake back other liquidity depositBooster(poolToken.balanceOf(address(this)) - amount); } super.removeLiquidity(amount, minTokenAmounts, removeAll); } function claimCollectedRewards() internal virtual override { if (address(stakingVault) == address(0)) return; try stakingVault.getReward(true) {} catch { stakingVault.getReward(false); } } }
//SPDX-License-Identifier: MIT pragma solidity ^0.8.23; import '@openzeppelin/contracts/token/ERC20/IERC20.sol'; import '@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol'; import '../../interfaces/ICurvePoolN.sol'; import '../ZunamiStratBase.sol'; abstract contract CurveNStratBase is ZunamiStratBase { using SafeERC20 for IERC20; uint256 public constant CURVENG_MAX_COINS = 8; ICurvePoolN public immutable pool; IERC20 public immutable poolToken; constructor( IERC20[POOL_ASSETS] memory tokens_, uint256[POOL_ASSETS] memory tokenDecimalsMultipliers_, address poolAddr, address poolTokenAddr ) ZunamiStratBase(tokens_, tokenDecimalsMultipliers_) { if (poolAddr == address(0)) revert ZeroAddress(); pool = ICurvePoolN(poolAddr); if (poolTokenAddr == address(0)) revert ZeroAddress(); poolToken = IERC20(poolTokenAddr); } function convertCurvePoolTokenAmounts( uint256[POOL_ASSETS] memory amounts ) internal view virtual returns (uint256[] memory); function depositLiquidity( uint256[POOL_ASSETS] memory amounts ) internal override returns (uint256 poolTokenAmount) { uint256[] memory amountsN = convertAndApproveTokens(address(pool), amounts); poolTokenAmount = depositCurve(amountsN); depositBooster(poolTokenAmount); } function convertAndApproveTokens( address pool, uint256[POOL_ASSETS] memory amounts ) internal virtual returns (uint256[] memory amountsN); function depositCurve(uint256[] memory amountsN) internal virtual returns (uint256 deposited) { return pool.add_liquidity(amountsN, 0); } function depositBooster(uint256 amount) internal virtual; function getLiquidityTokenPrice() internal view virtual override returns (uint256) { return getTokenPrice(address(poolToken)); } function calcTokenAmount( uint256[POOL_ASSETS] memory tokenAmounts, bool isDeposit ) public view override returns (uint256 sharesAmount) { return pool.calc_token_amount(convertCurvePoolTokenAmounts(tokenAmounts), isDeposit); } function getCurveRemovingTokenIndex() internal view virtual returns (int128); function getZunamiRemovingTokenIndex() internal view virtual returns (uint256); function removeLiquidity( uint256 amount, uint256[POOL_ASSETS] memory minTokenAmounts, bool ) internal virtual override { int128 curveTokenIndex = getCurveRemovingTokenIndex(); uint256 removedAmount = pool.remove_liquidity_one_coin( amount, curveTokenIndex, minTokenAmounts[getZunamiRemovingTokenIndex()] ); convertRemovedAmount(removedAmount); } function convertRemovedAmount(uint256 receivedAmount) internal virtual {} }
//SPDX-License-Identifier: MIT pragma solidity ^0.8.23; import '@openzeppelin/contracts/access/AccessControl.sol'; import '../interfaces/IPool.sol'; contract ZunamiPoolAccessControl is AccessControl { error MustBeCalledByZunamiPool(); error ZeroAddress(); error ZeroValue(); error MustHaveOwner(); IPool public zunamiPool; event ZunamiPoolSet(address zunamiPoolAddr); modifier onlyZunamiPool() { if (msg.sender != address(zunamiPool)) revert MustBeCalledByZunamiPool(); _; } constructor() { _grantRole(DEFAULT_ADMIN_ROLE, msg.sender); } function setZunamiPool(address zunamiAddr) external onlyRole(DEFAULT_ADMIN_ROLE) { if (zunamiAddr == address(0)) revert ZeroAddress(); zunamiPool = IPool(zunamiAddr); emit ZunamiPoolSet(zunamiAddr); } }
//SPDX-License-Identifier: MIT pragma solidity ^0.8.23; import '@openzeppelin/contracts/token/ERC20/IERC20.sol'; import '@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol'; import '../lib/Oracle/interfaces/IOracle.sol'; import '../interfaces/IStrategy.sol'; import './ZunamiPoolAccessControl.sol'; abstract contract ZunamiStratBase is IStrategy, ZunamiPoolAccessControl { using SafeERC20 for IERC20; error WrongTokens(); error WrongDecimalMultipliers(); error DepositLiquidityValueTooLow(); uint8 public constant POOL_ASSETS = 5; uint256 public constant RATIO_MULTIPLIER = 1e18; uint256 public constant PRICE_DENOMINATOR = 1e18; uint256 public constant SLIPPAGE_DENOMINATOR = 10000; uint256 public slippage = 50; // 0.50% IERC20[POOL_ASSETS] public tokens; uint256[POOL_ASSETS] public tokenDecimalsMultipliers; IOracle public oracle; uint256 public depositedLiquidity; event SlippageSet(uint256 oldSlippage, uint256 newSlippage); event PriceOracleSet(address oracleAddr); error WrongSlippage(); error WrongRatio(); constructor( IERC20[POOL_ASSETS] memory tokens_, uint256[POOL_ASSETS] memory tokenDecimalsMultipliers_ ) { bool otherZeros = false; for (uint256 i = 0; i < POOL_ASSETS; ++i) { if (otherZeros && address(tokens_[i]) != address(0)) revert WrongTokens(); if (address(tokens_[i]) == address(0)) otherZeros = true; if ( (address(tokens_[i]) != address(0) && tokenDecimalsMultipliers_[i] == 0) || (address(tokens_[i]) == address(0) && tokenDecimalsMultipliers_[i] != 0) ) revert WrongDecimalMultipliers(); } tokens = tokens_; tokenDecimalsMultipliers = tokenDecimalsMultipliers_; } function setPriceOracle(address oracleAddr) public onlyRole(DEFAULT_ADMIN_ROLE) { if (oracleAddr == address(0)) revert ZeroAddress(); oracle = IOracle(oracleAddr); emit PriceOracleSet(oracleAddr); } function setSlippage(uint256 _slippage) external onlyRole(DEFAULT_ADMIN_ROLE) { if (!(_slippage > 0 && _slippage <= SLIPPAGE_DENOMINATOR)) revert WrongSlippage(); emit SlippageSet(slippage, _slippage); slippage = _slippage; } function applySlippageDifferentPrice( uint256 amount, address tokenIn, address tokenOut ) internal view returns (uint256) { return (amount * getTokenPrice(tokenIn) * (SLIPPAGE_DENOMINATOR - slippage)) / SLIPPAGE_DENOMINATOR / getTokenPrice(tokenOut); } function applySlippage(uint256 amount) internal view returns (uint256) { return (amount * (SLIPPAGE_DENOMINATOR - slippage)) / SLIPPAGE_DENOMINATOR; } function calcTokenAmount( uint256[POOL_ASSETS] memory tokenAmounts, bool isDeposit ) public view virtual returns (uint256 sharesAmount); function calcLiquidityValue(uint256 tokenAmount) internal view returns (uint256) { return (tokenAmount * getLiquidityTokenPrice()) / PRICE_DENOMINATOR; } function getLiquidityTokenPrice() internal view virtual returns (uint256); function getTokenPrice(address token) internal view virtual returns (uint256) { return oracle.getUSDPrice(token); } function totalHoldings() public view virtual returns (uint256) { return calcLiquidityValue(getLiquidityBalance()); } function getLiquidityBalance() internal view virtual returns (uint256) { return depositedLiquidity; } function deposit( uint256[POOL_ASSETS] memory amounts ) external onlyZunamiPool returns (uint256 liquidityValue) { uint256 depositValue = valuateDeposit(amounts); uint256 liquidity = depositLiquidity(amounts); depositedLiquidity += liquidity; liquidityValue = calcLiquidityValue(liquidity); if (liquidityValue < applySlippage(depositValue)) revert DepositLiquidityValueTooLow(); } function valuateDeposit( uint256[POOL_ASSETS] memory amounts ) internal view virtual returns (uint256 value) { for (uint256 i = 0; i < POOL_ASSETS; ++i) { address token = address(tokens[i]); if (token == address(0)) break; value += (getTokenPrice(address(tokens[i])) * amounts[i] * tokenDecimalsMultipliers[i]) / PRICE_DENOMINATOR; } return value; } function depositLiquidity( uint256[POOL_ASSETS] memory amounts ) internal virtual returns (uint256); function getLiquidityAmountByRatio( uint256 poolTokenRatio // multiplied by 1e18 ) internal view returns (uint256) { require(poolTokenRatio > 0 && poolTokenRatio <= RATIO_MULTIPLIER, 'Wrong PoolToken Ratio'); if (!(poolTokenRatio > 0 && poolTokenRatio <= RATIO_MULTIPLIER)) revert WrongRatio(); return (getLiquidityBalance() * poolTokenRatio) / RATIO_MULTIPLIER; } function withdraw( address receiver, uint256 poolTokenRatio, // multiplied by 1e18 uint256[POOL_ASSETS] memory tokenAmounts ) external virtual onlyZunamiPool returns (bool) { uint256 liquidityAmount = getLiquidityAmountByRatio(poolTokenRatio); if (liquidityAmount < calcTokenAmount(tokenAmounts, false)) { return false; } uint256[] memory prevBalances = new uint256[](POOL_ASSETS); for (uint256 i = 0; i < POOL_ASSETS; ++i) { if (address(tokens[i]) == address(0)) break; prevBalances[i] = tokens[i].balanceOf(address(this)); } depositedLiquidity -= liquidityAmount; removeLiquidity(liquidityAmount, tokenAmounts, false); transferTokensOut(convertTokensToDynamic(tokens), receiver, prevBalances); return true; } function removeLiquidity( uint256 amount, uint256[POOL_ASSETS] memory minTokenAmounts, bool removeAll ) internal virtual; function claimRewards( address receiver, IERC20[] memory rewardTokens ) public virtual onlyZunamiPool { claimCollectedRewards(); transferTokensOut(rewardTokens, receiver, fillArrayN(0, rewardTokens.length)); } function claimCollectedRewards() internal virtual {} function withdrawAll( uint256[POOL_ASSETS] memory minTokenAmounts ) external virtual onlyZunamiPool { removeLiquidity(depositedLiquidity, minTokenAmounts, true); depositedLiquidity = 0; transferTokensOut(convertTokensToDynamic(tokens), msg.sender, fillArrayN(0, POOL_ASSETS)); } function transferTokensOut( IERC20[] memory transferringTokens, address receiver, uint256[] memory prevBalances ) internal { uint256 transferAmount; IERC20 token_; for (uint256 i = 0; i < transferringTokens.length; ++i) { token_ = transferringTokens[i]; if (address(token_) == address(0)) break; transferAmount = token_.balanceOf(address(this)) - prevBalances[i]; if (transferAmount > 0) { token_.safeTransfer(receiver, transferAmount); } } } function convertTokensToDynamic( IERC20[POOL_ASSETS] memory _tokens ) internal pure returns (IERC20[] memory tokesDynamic) { tokesDynamic = new IERC20[](POOL_ASSETS); for (uint256 i = 0; i < _tokens.length; ++i) { tokesDynamic[i] = _tokens[i]; } } function fillArrayN( uint256 _value, uint256 _count ) internal pure returns (uint256[] memory values) { values = new uint256[](_count); for (uint256 i = 0; i < _count; ++i) { values[i] = _value; } } function withdrawEmergency(IERC20 _token) external onlyRole(DEFAULT_ADMIN_ROLE) { uint256 tokenBalance = _token.balanceOf(address(this)); if (tokenBalance > 0) { _token.safeTransfer(msg.sender, tokenBalance); } } }
//SPDX-License-Identifier: MIT pragma solidity ^0.8.23; library Constants { address internal constant CRVUSD_ADDRESS = 0xf939E0A03FB07F59A73314E73794Be0E57ac1b4E; address internal constant USDC_ADDRESS = 0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48; address internal constant USDT_ADDRESS = 0xdAC17F958D2ee523a2206206994597C13D831ec7; address internal constant DAI_ADDRESS = 0x6B175474E89094C44Da98b954EedeAC495271d0F; address internal constant FRX_ETH_ADDRESS = 0x5E8422345238F34275888049021821E8E08CAa1f; address internal constant WETH_ADDRESS = 0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2; address internal constant CVX_ADDRESS = 0x4e3FBD56CD56c3e72c1403e103b45Db9da5B9D2B; address internal constant CRV_ADDRESS = 0xD533a949740bb3306d119CC777fa900bA034cd52; address internal constant FXS_ADDRESS = 0x3432B6A60D23Ca0dFCa7761B7ab56459D9C964D0; address internal constant SPELL_ADDRESS = 0x090185f2135308BaD17527004364eBcC2D37e5F6; address internal constant SDT_ADDRESS = 0x73968b9a57c6E53d41345FD57a6E6ae27d6CDB2F; address internal constant SFRXETH_ADDRESS = 0xac3E018457B222d93114458476f3E3416Abbe38F; // Will be added after deployment of zunUSD v2 pool address internal constant ZUNUSD_ADDRESS = 0x8C0D76C9B18779665475F3E212D9Ca1Ed6A1A0e6; // Will be added after deployment of zunUSD v2 pool controller address internal constant zunUSD_CONTROLLER_ADDRESS = 0x618eee502CDF6b46A2199C21D1411f3F6065c940; // Will be added after deployment of zunETH v2 pool address internal constant zunETH_ADDRESS = 0xc2e660C62F72c2ad35AcE6DB78a616215E2F2222; address internal constant zunETH_CONTROLLER_ADDRESS = 0x54A00DA65c79DDCe24E7fe4691737FD70F7797DF; address public constant CHAINLINK_FEED_REGISTRY_ETH_ADDRESS = 0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE; address internal constant CRV_3POOL_ADDRESS = 0xbEbc44782C7dB0a1A60Cb6fe97d0b483032FF1C7; address internal constant CRV_3POOL_LP_ADDRESS = 0x6c3F90f043a72FA612cbac8115EE7e52BDe6E490; address internal constant CRV_TRICRYPTO2_ADDRESS = 0xD51a44d3FaE010294C616388b506AcdA1bfAAE46; address internal constant ETH_frxETH_ADDRESS = 0xa1F8A6807c402E4A15ef4EBa36528A3FED24E577; address internal constant ETH_frxETH_LP_ADDRESS = 0xf43211935C781D5ca1a41d2041F397B8A7366C7A; address internal constant WETH_frxETH_ADDRESS = 0x9c3B46C0Ceb5B9e304FCd6D88Fc50f7DD24B31Bc; address internal constant WETH_frxETH_LP_ADDRESS = 0x9c3B46C0Ceb5B9e304FCd6D88Fc50f7DD24B31Bc; address internal constant CRV_FRAX_USDC_POOL_ADDRESS = 0xDcEF968d416a41Cdac0ED8702fAC8128A64241A2; address internal constant CRV_FRAX_USDC_POOL_LP_ADDRESS = 0x3175Df0976dFA876431C2E9eE6Bc45b65d3473CC; address internal constant SDT_CRVUSD_USDT_VAULT_ADDRESS = 0x37b24ac19504C0c6FC1ADc8deb5D24f5C4F6A2f2; address internal constant CRV_CRVUSD_USDT_LP_ADDRESS = 0x390f3595bCa2Df7d23783dFd126427CCeb997BF4; address internal constant CRV_CRVUSD_USDT_ADDRESS = 0x390f3595bCa2Df7d23783dFd126427CCeb997BF4; address internal constant SDT_CRVUSD_USDC_VAULT_ADDRESS = 0xb618EA40cb1F5b08839Ba228C8dd58AC3DCA12F3; address internal constant CRV_CRVUSD_USDC_LP_ADDRESS = 0x4DEcE678ceceb27446b35C672dC7d61F30bAD69E; address internal constant CRV_CRVUSD_USDC_ADDRESS = 0x4DEcE678ceceb27446b35C672dC7d61F30bAD69E; address internal constant CRV_BOOSTER_ADDRESS = 0xF403C135812408BFbE8713b5A23a04b3D48AAE31; address internal constant CRV_STAKING_BOOSTER_ADDRESS = 0xD8Bd5Cdd145ed2197CB16ddB172DF954e3F28659; address internal constant CRV_ETH_stETH_ADDRESS = 0x21E27a5E5513D6e65C4f830167390997aA84843a; address internal constant CRV_ETH_stETH_LP_ADDRESS = 0x21E27a5E5513D6e65C4f830167390997aA84843a; address internal constant CVX_ETH_stETH_REWARDS_ADDRESS = 0x6B27D7BC63F1999D14fF9bA900069ee516669ee8; uint256 internal constant CVX_ETH_stETH_PID = 177; address internal constant CRV_zunUSD_crvUSD_ADDRESS = 0x8C24b3213FD851db80245FCCc42c40B94Ac9a745; address internal constant CRV_zunUSD_crvUSD_LP_ADDRESS = 0x8C24b3213FD851db80245FCCc42c40B94Ac9a745; address internal constant CVX_zunUSD_crvUSD_REWARDS_ADDRESS = 0xB0408d1477554268Ece9b0a40290C345196fBf1B; uint256 internal constant CVX_zunUSD_crvUSD_PID = 309; address internal constant CRV_USDT_crvUSD_ADDRESS = 0x390f3595bCa2Df7d23783dFd126427CCeb997BF4; address internal constant LLAMALEND_CRVUSD_ADDRESS = 0xCeA18a8752bb7e7817F9AE7565328FE415C0f2cA; address internal constant CVX_LLAMALEND_CRVUSD_REWARDS_ADDRESS = 0x4bf2d8484474170bff8a8c34475be3d87dFF28cA; uint256 internal constant CVX_LLAMALEND_CRVUSD_PID = 325; address internal constant CRV_zunETH_frxETH_ADDRESS = 0x3A65cbaebBFecbeA5D0CB523ab56fDbda7fF9aAA; address internal constant CRV_zunETH_frxETH_LP_ADDRESS = 0x3A65cbaebBFecbeA5D0CB523ab56fDbda7fF9aAA; address internal constant CVX_zunETH_frxETH_REWARDS_ADDRESS = 0x756d67A10974Fa0e0cE63F82AF4E7ef0d46d452D; uint256 internal constant CVX_zunETH_frxETH_PID = 330; uint256 internal constant CVX_STAKING_zunETH_frxETH_PID = 75; address internal constant SDT_zunETH_frxETH_VAULT_ADDRESS = 0xAaE1Ae12d4C8b811DDa1188b01be23b4ab7C62D2; address internal constant SDT_LLAMALEND_CRVUSD_VAULT_ADDRESS = 0xfa6D40573082D797CB3cC378c0837fB90eB043e5; address internal constant SDT_PXETH_WETH_VAULT_ADDRESS = 0x062AdE4F4583fF6b21f6f2c2Ed04eD7037E8B282; address internal constant CRV_PXETH_WETH_ADDRESS = 0xC8Eb2Cf2f792F77AF0Cd9e203305a585E588179D; address internal constant CRV_PXETH_WETH_LP_ADDRESS = 0xC8Eb2Cf2f792F77AF0Cd9e203305a585E588179D; // Will be added after deployment of zunUSD v2 pool and curve pool for zunUSD address internal constant CRV_zunUSD_crvFRAX_ADDRESS = address(0); address internal constant CRV_zunUSD_crvFRAX_LP_ADDRESS = address(0); address internal constant CVX_zunUSD_crvFRAX_REWARDS_ADDRESS = address(0); uint256 internal constant CVX_zunUSD_crvFRAX_PID = 0; }
// SPDX-License-Identifier: MIT pragma solidity >=0.4.22 <0.9.0; library console { address constant CONSOLE_ADDRESS = 0x000000000000000000636F6e736F6c652e6c6f67; function _sendLogPayloadImplementation(bytes memory payload) internal view { address consoleAddress = CONSOLE_ADDRESS; /// @solidity memory-safe-assembly assembly { pop( staticcall( gas(), consoleAddress, add(payload, 32), mload(payload), 0, 0 ) ) } } function _castToPure( function(bytes memory) internal view fnIn ) internal pure returns (function(bytes memory) pure fnOut) { assembly { fnOut := fnIn } } function _sendLogPayload(bytes memory payload) internal pure { _castToPure(_sendLogPayloadImplementation)(payload); } function log() internal pure { _sendLogPayload(abi.encodeWithSignature("log()")); } function logInt(int256 p0) internal pure { _sendLogPayload(abi.encodeWithSignature("log(int256)", p0)); } function logUint(uint256 p0) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256)", p0)); } function logString(string memory p0) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string)", p0)); } function logBool(bool p0) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool)", p0)); } function logAddress(address p0) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address)", p0)); } function logBytes(bytes memory p0) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bytes)", p0)); } function logBytes1(bytes1 p0) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bytes1)", p0)); } function logBytes2(bytes2 p0) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bytes2)", p0)); } function logBytes3(bytes3 p0) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bytes3)", p0)); } function logBytes4(bytes4 p0) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bytes4)", p0)); } function logBytes5(bytes5 p0) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bytes5)", p0)); } function logBytes6(bytes6 p0) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bytes6)", p0)); } function logBytes7(bytes7 p0) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bytes7)", p0)); } function logBytes8(bytes8 p0) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bytes8)", p0)); } function logBytes9(bytes9 p0) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bytes9)", p0)); } function logBytes10(bytes10 p0) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bytes10)", p0)); } function logBytes11(bytes11 p0) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bytes11)", p0)); } function logBytes12(bytes12 p0) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bytes12)", p0)); } function logBytes13(bytes13 p0) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bytes13)", p0)); } function logBytes14(bytes14 p0) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bytes14)", p0)); } function logBytes15(bytes15 p0) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bytes15)", p0)); } function logBytes16(bytes16 p0) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bytes16)", p0)); } function logBytes17(bytes17 p0) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bytes17)", p0)); } function logBytes18(bytes18 p0) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bytes18)", p0)); } function logBytes19(bytes19 p0) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bytes19)", p0)); } function logBytes20(bytes20 p0) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bytes20)", p0)); } function logBytes21(bytes21 p0) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bytes21)", p0)); } function logBytes22(bytes22 p0) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bytes22)", p0)); } function logBytes23(bytes23 p0) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bytes23)", p0)); } function logBytes24(bytes24 p0) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bytes24)", p0)); } function logBytes25(bytes25 p0) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bytes25)", p0)); } function logBytes26(bytes26 p0) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bytes26)", p0)); } function logBytes27(bytes27 p0) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bytes27)", p0)); } function logBytes28(bytes28 p0) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bytes28)", p0)); } function logBytes29(bytes29 p0) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bytes29)", p0)); } function logBytes30(bytes30 p0) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bytes30)", p0)); } function logBytes31(bytes31 p0) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bytes31)", p0)); } function logBytes32(bytes32 p0) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bytes32)", p0)); } function log(uint256 p0) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256)", p0)); } function log(string memory p0) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string)", p0)); } function log(bool p0) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool)", p0)); } function log(address p0) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address)", p0)); } function log(uint256 p0, uint256 p1) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256)", p0, p1)); } function log(uint256 p0, string memory p1) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,string)", p0, p1)); } function log(uint256 p0, bool p1) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,bool)", p0, p1)); } function log(uint256 p0, address p1) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,address)", p0, p1)); } function log(string memory p0, uint256 p1) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,uint256)", p0, p1)); } function log(string memory p0, string memory p1) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,string)", p0, p1)); } function log(string memory p0, bool p1) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,bool)", p0, p1)); } function log(string memory p0, address p1) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,address)", p0, p1)); } function log(bool p0, uint256 p1) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,uint256)", p0, p1)); } function log(bool p0, string memory p1) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,string)", p0, p1)); } function log(bool p0, bool p1) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,bool)", p0, p1)); } function log(bool p0, address p1) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,address)", p0, p1)); } function log(address p0, uint256 p1) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,uint256)", p0, p1)); } function log(address p0, string memory p1) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,string)", p0, p1)); } function log(address p0, bool p1) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,bool)", p0, p1)); } function log(address p0, address p1) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,address)", p0, p1)); } function log(uint256 p0, uint256 p1, uint256 p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,uint256)", p0, p1, p2)); } function log(uint256 p0, uint256 p1, string memory p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,string)", p0, p1, p2)); } function log(uint256 p0, uint256 p1, bool p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,bool)", p0, p1, p2)); } function log(uint256 p0, uint256 p1, address p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,address)", p0, p1, p2)); } function log(uint256 p0, string memory p1, uint256 p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,string,uint256)", p0, p1, p2)); } function log(uint256 p0, string memory p1, string memory p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,string,string)", p0, p1, p2)); } function log(uint256 p0, string memory p1, bool p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,string,bool)", p0, p1, p2)); } function log(uint256 p0, string memory p1, address p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,string,address)", p0, p1, p2)); } function log(uint256 p0, bool p1, uint256 p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,uint256)", p0, p1, p2)); } function log(uint256 p0, bool p1, string memory p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,string)", p0, p1, p2)); } function log(uint256 p0, bool p1, bool p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,bool)", p0, p1, p2)); } function log(uint256 p0, bool p1, address p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,address)", p0, p1, p2)); } function log(uint256 p0, address p1, uint256 p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,address,uint256)", p0, p1, p2)); } function log(uint256 p0, address p1, string memory p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,address,string)", p0, p1, p2)); } function log(uint256 p0, address p1, bool p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,address,bool)", p0, p1, p2)); } function log(uint256 p0, address p1, address p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,address,address)", p0, p1, p2)); } function log(string memory p0, uint256 p1, uint256 p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,uint256,uint256)", p0, p1, p2)); } function log(string memory p0, uint256 p1, string memory p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,uint256,string)", p0, p1, p2)); } function log(string memory p0, uint256 p1, bool p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,uint256,bool)", p0, p1, p2)); } function log(string memory p0, uint256 p1, address p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,uint256,address)", p0, p1, p2)); } function log(string memory p0, string memory p1, uint256 p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,string,uint256)", p0, p1, p2)); } function log(string memory p0, string memory p1, string memory p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,string,string)", p0, p1, p2)); } function log(string memory p0, string memory p1, bool p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,string,bool)", p0, p1, p2)); } function log(string memory p0, string memory p1, address p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,string,address)", p0, p1, p2)); } function log(string memory p0, bool p1, uint256 p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,bool,uint256)", p0, p1, p2)); } function log(string memory p0, bool p1, string memory p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,bool,string)", p0, p1, p2)); } function log(string memory p0, bool p1, bool p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,bool,bool)", p0, p1, p2)); } function log(string memory p0, bool p1, address p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,bool,address)", p0, p1, p2)); } function log(string memory p0, address p1, uint256 p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,address,uint256)", p0, p1, p2)); } function log(string memory p0, address p1, string memory p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,address,string)", p0, p1, p2)); } function log(string memory p0, address p1, bool p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,address,bool)", p0, p1, p2)); } function log(string memory p0, address p1, address p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,address,address)", p0, p1, p2)); } function log(bool p0, uint256 p1, uint256 p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,uint256)", p0, p1, p2)); } function log(bool p0, uint256 p1, string memory p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,string)", p0, p1, p2)); } function log(bool p0, uint256 p1, bool p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,bool)", p0, p1, p2)); } function log(bool p0, uint256 p1, address p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,address)", p0, p1, p2)); } function log(bool p0, string memory p1, uint256 p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,string,uint256)", p0, p1, p2)); } function log(bool p0, string memory p1, string memory p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,string,string)", p0, p1, p2)); } function log(bool p0, string memory p1, bool p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,string,bool)", p0, p1, p2)); } function log(bool p0, string memory p1, address p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,string,address)", p0, p1, p2)); } function log(bool p0, bool p1, uint256 p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,uint256)", p0, p1, p2)); } function log(bool p0, bool p1, string memory p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,string)", p0, p1, p2)); } function log(bool p0, bool p1, bool p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,bool)", p0, p1, p2)); } function log(bool p0, bool p1, address p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,address)", p0, p1, p2)); } function log(bool p0, address p1, uint256 p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,address,uint256)", p0, p1, p2)); } function log(bool p0, address p1, string memory p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,address,string)", p0, p1, p2)); } function log(bool p0, address p1, bool p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,address,bool)", p0, p1, p2)); } function log(bool p0, address p1, address p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,address,address)", p0, p1, p2)); } function log(address p0, uint256 p1, uint256 p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,uint256,uint256)", p0, p1, p2)); } function log(address p0, uint256 p1, string memory p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,uint256,string)", p0, p1, p2)); } function log(address p0, uint256 p1, bool p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,uint256,bool)", p0, p1, p2)); } function log(address p0, uint256 p1, address p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,uint256,address)", p0, p1, p2)); } function log(address p0, string memory p1, uint256 p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,string,uint256)", p0, p1, p2)); } function log(address p0, string memory p1, string memory p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,string,string)", p0, p1, p2)); } function log(address p0, string memory p1, bool p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,string,bool)", p0, p1, p2)); } function log(address p0, string memory p1, address p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,string,address)", p0, p1, p2)); } function log(address p0, bool p1, uint256 p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,bool,uint256)", p0, p1, p2)); } function log(address p0, bool p1, string memory p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,bool,string)", p0, p1, p2)); } function log(address p0, bool p1, bool p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,bool,bool)", p0, p1, p2)); } function log(address p0, bool p1, address p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,bool,address)", p0, p1, p2)); } function log(address p0, address p1, uint256 p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,address,uint256)", p0, p1, p2)); } function log(address p0, address p1, string memory p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,address,string)", p0, p1, p2)); } function log(address p0, address p1, bool p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,address,bool)", p0, p1, p2)); } function log(address p0, address p1, address p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,address,address)", p0, p1, p2)); } function log(uint256 p0, uint256 p1, uint256 p2, uint256 p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,uint256,uint256)", p0, p1, p2, p3)); } function log(uint256 p0, uint256 p1, uint256 p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,uint256,string)", p0, p1, p2, p3)); } function log(uint256 p0, uint256 p1, uint256 p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,uint256,bool)", p0, p1, p2, p3)); } function log(uint256 p0, uint256 p1, uint256 p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,uint256,address)", p0, p1, p2, p3)); } function log(uint256 p0, uint256 p1, string memory p2, uint256 p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,string,uint256)", p0, p1, p2, p3)); } function log(uint256 p0, uint256 p1, string memory p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,string,string)", p0, p1, p2, p3)); } function log(uint256 p0, uint256 p1, string memory p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,string,bool)", p0, p1, p2, p3)); } function log(uint256 p0, uint256 p1, string memory p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,string,address)", p0, p1, p2, p3)); } function log(uint256 p0, uint256 p1, bool p2, uint256 p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,bool,uint256)", p0, p1, p2, p3)); } function log(uint256 p0, uint256 p1, bool p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,bool,string)", p0, p1, p2, p3)); } function log(uint256 p0, uint256 p1, bool p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,bool,bool)", p0, p1, p2, p3)); } function log(uint256 p0, uint256 p1, bool p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,bool,address)", p0, p1, p2, p3)); } function log(uint256 p0, uint256 p1, address p2, uint256 p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,address,uint256)", p0, p1, p2, p3)); } function log(uint256 p0, uint256 p1, address p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,address,string)", p0, p1, p2, p3)); } function log(uint256 p0, uint256 p1, address p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,address,bool)", p0, p1, p2, p3)); } function log(uint256 p0, uint256 p1, address p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,address,address)", p0, p1, p2, p3)); } function log(uint256 p0, string memory p1, uint256 p2, uint256 p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,string,uint256,uint256)", p0, p1, p2, p3)); } function log(uint256 p0, string memory p1, uint256 p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,string,uint256,string)", p0, p1, p2, p3)); } function log(uint256 p0, string memory p1, uint256 p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,string,uint256,bool)", p0, p1, p2, p3)); } function log(uint256 p0, string memory p1, uint256 p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,string,uint256,address)", p0, p1, p2, p3)); } function log(uint256 p0, string memory p1, string memory p2, uint256 p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,string,string,uint256)", p0, p1, p2, p3)); } function log(uint256 p0, string memory p1, string memory p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,string,string,string)", p0, p1, p2, p3)); } function log(uint256 p0, string memory p1, string memory p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,string,string,bool)", p0, p1, p2, p3)); } function log(uint256 p0, string memory p1, string memory p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,string,string,address)", p0, p1, p2, p3)); } function log(uint256 p0, string memory p1, bool p2, uint256 p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,string,bool,uint256)", p0, p1, p2, p3)); } function log(uint256 p0, string memory p1, bool p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,string,bool,string)", p0, p1, p2, p3)); } function log(uint256 p0, string memory p1, bool p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,string,bool,bool)", p0, p1, p2, p3)); } function log(uint256 p0, string memory p1, bool p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,string,bool,address)", p0, p1, p2, p3)); } function log(uint256 p0, string memory p1, address p2, uint256 p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,string,address,uint256)", p0, p1, p2, p3)); } function log(uint256 p0, string memory p1, address p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,string,address,string)", p0, p1, p2, p3)); } function log(uint256 p0, string memory p1, address p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,string,address,bool)", p0, p1, p2, p3)); } function log(uint256 p0, string memory p1, address p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,string,address,address)", p0, p1, p2, p3)); } function log(uint256 p0, bool p1, uint256 p2, uint256 p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,uint256,uint256)", p0, p1, p2, p3)); } function log(uint256 p0, bool p1, uint256 p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,uint256,string)", p0, p1, p2, p3)); } function log(uint256 p0, bool p1, uint256 p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,uint256,bool)", p0, p1, p2, p3)); } function log(uint256 p0, bool p1, uint256 p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,uint256,address)", p0, p1, p2, p3)); } function log(uint256 p0, bool p1, string memory p2, uint256 p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,string,uint256)", p0, p1, p2, p3)); } function log(uint256 p0, bool p1, string memory p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,string,string)", p0, p1, p2, p3)); } function log(uint256 p0, bool p1, string memory p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,string,bool)", p0, p1, p2, p3)); } function log(uint256 p0, bool p1, string memory p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,string,address)", p0, p1, p2, p3)); } function log(uint256 p0, bool p1, bool p2, uint256 p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,bool,uint256)", p0, p1, p2, p3)); } function log(uint256 p0, bool p1, bool p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,bool,string)", p0, p1, p2, p3)); } function log(uint256 p0, bool p1, bool p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,bool,bool)", p0, p1, p2, p3)); } function log(uint256 p0, bool p1, bool p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,bool,address)", p0, p1, p2, p3)); } function log(uint256 p0, bool p1, address p2, uint256 p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,address,uint256)", p0, p1, p2, p3)); } function log(uint256 p0, bool p1, address p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,address,string)", p0, p1, p2, p3)); } function log(uint256 p0, bool p1, address p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,address,bool)", p0, p1, p2, p3)); } function log(uint256 p0, bool p1, address p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,address,address)", p0, p1, p2, p3)); } function log(uint256 p0, address p1, uint256 p2, uint256 p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,address,uint256,uint256)", p0, p1, p2, p3)); } function log(uint256 p0, address p1, uint256 p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,address,uint256,string)", p0, p1, p2, p3)); } function log(uint256 p0, address p1, uint256 p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,address,uint256,bool)", p0, p1, p2, p3)); } function log(uint256 p0, address p1, uint256 p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,address,uint256,address)", p0, p1, p2, p3)); } function log(uint256 p0, address p1, string memory p2, uint256 p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,address,string,uint256)", p0, p1, p2, p3)); } function log(uint256 p0, address p1, string memory p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,address,string,string)", p0, p1, p2, p3)); } function log(uint256 p0, address p1, string memory p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,address,string,bool)", p0, p1, p2, p3)); } function log(uint256 p0, address p1, string memory p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,address,string,address)", p0, p1, p2, p3)); } function log(uint256 p0, address p1, bool p2, uint256 p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,address,bool,uint256)", p0, p1, p2, p3)); } function log(uint256 p0, address p1, bool p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,address,bool,string)", p0, p1, p2, p3)); } function log(uint256 p0, address p1, bool p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,address,bool,bool)", p0, p1, p2, p3)); } function log(uint256 p0, address p1, bool p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,address,bool,address)", p0, p1, p2, p3)); } function log(uint256 p0, address p1, address p2, uint256 p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,address,address,uint256)", p0, p1, p2, p3)); } function log(uint256 p0, address p1, address p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,address,address,string)", p0, p1, p2, p3)); } function log(uint256 p0, address p1, address p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,address,address,bool)", p0, p1, p2, p3)); } function log(uint256 p0, address p1, address p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,address,address,address)", p0, p1, p2, p3)); } function log(string memory p0, uint256 p1, uint256 p2, uint256 p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,uint256,uint256,uint256)", p0, p1, p2, p3)); } function log(string memory p0, uint256 p1, uint256 p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,uint256,uint256,string)", p0, p1, p2, p3)); } function log(string memory p0, uint256 p1, uint256 p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,uint256,uint256,bool)", p0, p1, p2, p3)); } function log(string memory p0, uint256 p1, uint256 p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,uint256,uint256,address)", p0, p1, p2, p3)); } function log(string memory p0, uint256 p1, string memory p2, uint256 p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,uint256,string,uint256)", p0, p1, p2, p3)); } function log(string memory p0, uint256 p1, string memory p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,uint256,string,string)", p0, p1, p2, p3)); } function log(string memory p0, uint256 p1, string memory p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,uint256,string,bool)", p0, p1, p2, p3)); } function log(string memory p0, uint256 p1, string memory p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,uint256,string,address)", p0, p1, p2, p3)); } function log(string memory p0, uint256 p1, bool p2, uint256 p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,uint256,bool,uint256)", p0, p1, p2, p3)); } function log(string memory p0, uint256 p1, bool p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,uint256,bool,string)", p0, p1, p2, p3)); } function log(string memory p0, uint256 p1, bool p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,uint256,bool,bool)", p0, p1, p2, p3)); } function log(string memory p0, uint256 p1, bool p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,uint256,bool,address)", p0, p1, p2, p3)); } function log(string memory p0, uint256 p1, address p2, uint256 p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,uint256,address,uint256)", p0, p1, p2, p3)); } function log(string memory p0, uint256 p1, address p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,uint256,address,string)", p0, p1, p2, p3)); } function log(string memory p0, uint256 p1, address p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,uint256,address,bool)", p0, p1, p2, p3)); } function log(string memory p0, uint256 p1, address p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,uint256,address,address)", p0, p1, p2, p3)); } function log(string memory p0, string memory p1, uint256 p2, uint256 p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,string,uint256,uint256)", p0, p1, p2, p3)); } function log(string memory p0, string memory p1, uint256 p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,string,uint256,string)", p0, p1, p2, p3)); } function log(string memory p0, string memory p1, uint256 p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,string,uint256,bool)", p0, p1, p2, p3)); } function log(string memory p0, string memory p1, uint256 p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,string,uint256,address)", p0, p1, p2, p3)); } function log(string memory p0, string memory p1, string memory p2, uint256 p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,string,string,uint256)", p0, p1, p2, p3)); } function log(string memory p0, string memory p1, string memory p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,string,string,string)", p0, p1, p2, p3)); } function log(string memory p0, string memory p1, string memory p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,string,string,bool)", p0, p1, p2, p3)); } function log(string memory p0, string memory p1, string memory p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,string,string,address)", p0, p1, p2, p3)); } function log(string memory p0, string memory p1, bool p2, uint256 p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,string,bool,uint256)", p0, p1, p2, p3)); } function log(string memory p0, string memory p1, bool p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,string,bool,string)", p0, p1, p2, p3)); } function log(string memory p0, string memory p1, bool p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,string,bool,bool)", p0, p1, p2, p3)); } function log(string memory p0, string memory p1, bool p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,string,bool,address)", p0, p1, p2, p3)); } function log(string memory p0, string memory p1, address p2, uint256 p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,string,address,uint256)", p0, p1, p2, p3)); } function log(string memory p0, string memory p1, address p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,string,address,string)", p0, p1, p2, p3)); } function log(string memory p0, string memory p1, address p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,string,address,bool)", p0, p1, p2, p3)); } function log(string memory p0, string memory p1, address p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,string,address,address)", p0, p1, p2, p3)); } function log(string memory p0, bool p1, uint256 p2, uint256 p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,bool,uint256,uint256)", p0, p1, p2, p3)); } function log(string memory p0, bool p1, uint256 p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,bool,uint256,string)", p0, p1, p2, p3)); } function log(string memory p0, bool p1, uint256 p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,bool,uint256,bool)", p0, p1, p2, p3)); } function log(string memory p0, bool p1, uint256 p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,bool,uint256,address)", p0, p1, p2, p3)); } function log(string memory p0, bool p1, string memory p2, uint256 p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,bool,string,uint256)", p0, p1, p2, p3)); } function log(string memory p0, bool p1, string memory p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,bool,string,string)", p0, p1, p2, p3)); } function log(string memory p0, bool p1, string memory p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,bool,string,bool)", p0, p1, p2, p3)); } function log(string memory p0, bool p1, string memory p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,bool,string,address)", p0, p1, p2, p3)); } function log(string memory p0, bool p1, bool p2, uint256 p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,bool,bool,uint256)", p0, p1, p2, p3)); } function log(string memory p0, bool p1, bool p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,bool,bool,string)", p0, p1, p2, p3)); } function log(string memory p0, bool p1, bool p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,bool,bool,bool)", p0, p1, p2, p3)); } function log(string memory p0, bool p1, bool p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,bool,bool,address)", p0, p1, p2, p3)); } function log(string memory p0, bool p1, address p2, uint256 p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,bool,address,uint256)", p0, p1, p2, p3)); } function log(string memory p0, bool p1, address p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,bool,address,string)", p0, p1, p2, p3)); } function log(string memory p0, bool p1, address p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,bool,address,bool)", p0, p1, p2, p3)); } function log(string memory p0, bool p1, address p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,bool,address,address)", p0, p1, p2, p3)); } function log(string memory p0, address p1, uint256 p2, uint256 p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,address,uint256,uint256)", p0, p1, p2, p3)); } function log(string memory p0, address p1, uint256 p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,address,uint256,string)", p0, p1, p2, p3)); } function log(string memory p0, address p1, uint256 p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,address,uint256,bool)", p0, p1, p2, p3)); } function log(string memory p0, address p1, uint256 p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,address,uint256,address)", p0, p1, p2, p3)); } function log(string memory p0, address p1, string memory p2, uint256 p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,address,string,uint256)", p0, p1, p2, p3)); } function log(string memory p0, address p1, string memory p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,address,string,string)", p0, p1, p2, p3)); } function log(string memory p0, address p1, string memory p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,address,string,bool)", p0, p1, p2, p3)); } function log(string memory p0, address p1, string memory p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,address,string,address)", p0, p1, p2, p3)); } function log(string memory p0, address p1, bool p2, uint256 p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,address,bool,uint256)", p0, p1, p2, p3)); } function log(string memory p0, address p1, bool p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,address,bool,string)", p0, p1, p2, p3)); } function log(string memory p0, address p1, bool p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,address,bool,bool)", p0, p1, p2, p3)); } function log(string memory p0, address p1, bool p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,address,bool,address)", p0, p1, p2, p3)); } function log(string memory p0, address p1, address p2, uint256 p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,address,address,uint256)", p0, p1, p2, p3)); } function log(string memory p0, address p1, address p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,address,address,string)", p0, p1, p2, p3)); } function log(string memory p0, address p1, address p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,address,address,bool)", p0, p1, p2, p3)); } function log(string memory p0, address p1, address p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,address,address,address)", p0, p1, p2, p3)); } function log(bool p0, uint256 p1, uint256 p2, uint256 p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,uint256,uint256)", p0, p1, p2, p3)); } function log(bool p0, uint256 p1, uint256 p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,uint256,string)", p0, p1, p2, p3)); } function log(bool p0, uint256 p1, uint256 p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,uint256,bool)", p0, p1, p2, p3)); } function log(bool p0, uint256 p1, uint256 p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,uint256,address)", p0, p1, p2, p3)); } function log(bool p0, uint256 p1, string memory p2, uint256 p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,string,uint256)", p0, p1, p2, p3)); } function log(bool p0, uint256 p1, string memory p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,string,string)", p0, p1, p2, p3)); } function log(bool p0, uint256 p1, string memory p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,string,bool)", p0, p1, p2, p3)); } function log(bool p0, uint256 p1, string memory p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,string,address)", p0, p1, p2, p3)); } function log(bool p0, uint256 p1, bool p2, uint256 p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,bool,uint256)", p0, p1, p2, p3)); } function log(bool p0, uint256 p1, bool p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,bool,string)", p0, p1, p2, p3)); } function log(bool p0, uint256 p1, bool p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,bool,bool)", p0, p1, p2, p3)); } function log(bool p0, uint256 p1, bool p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,bool,address)", p0, p1, p2, p3)); } function log(bool p0, uint256 p1, address p2, uint256 p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,address,uint256)", p0, p1, p2, p3)); } function log(bool p0, uint256 p1, address p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,address,string)", p0, p1, p2, p3)); } function log(bool p0, uint256 p1, address p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,address,bool)", p0, p1, p2, p3)); } function log(bool p0, uint256 p1, address p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,address,address)", p0, p1, p2, p3)); } function log(bool p0, string memory p1, uint256 p2, uint256 p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,string,uint256,uint256)", p0, p1, p2, p3)); } function log(bool p0, string memory p1, uint256 p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,string,uint256,string)", p0, p1, p2, p3)); } function log(bool p0, string memory p1, uint256 p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,string,uint256,bool)", p0, p1, p2, p3)); } function log(bool p0, string memory p1, uint256 p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,string,uint256,address)", p0, p1, p2, p3)); } function log(bool p0, string memory p1, string memory p2, uint256 p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,string,string,uint256)", p0, p1, p2, p3)); } function log(bool p0, string memory p1, string memory p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,string,string,string)", p0, p1, p2, p3)); } function log(bool p0, string memory p1, string memory p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,string,string,bool)", p0, p1, p2, p3)); } function log(bool p0, string memory p1, string memory p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,string,string,address)", p0, p1, p2, p3)); } function log(bool p0, string memory p1, bool p2, uint256 p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,string,bool,uint256)", p0, p1, p2, p3)); } function log(bool p0, string memory p1, bool p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,string,bool,string)", p0, p1, p2, p3)); } function log(bool p0, string memory p1, bool p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,string,bool,bool)", p0, p1, p2, p3)); } function log(bool p0, string memory p1, bool p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,string,bool,address)", p0, p1, p2, p3)); } function log(bool p0, string memory p1, address p2, uint256 p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,string,address,uint256)", p0, p1, p2, p3)); } function log(bool p0, string memory p1, address p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,string,address,string)", p0, p1, p2, p3)); } function log(bool p0, string memory p1, address p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,string,address,bool)", p0, p1, p2, p3)); } function log(bool p0, string memory p1, address p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,string,address,address)", p0, p1, p2, p3)); } function log(bool p0, bool p1, uint256 p2, uint256 p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,uint256,uint256)", p0, p1, p2, p3)); } function log(bool p0, bool p1, uint256 p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,uint256,string)", p0, p1, p2, p3)); } function log(bool p0, bool p1, uint256 p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,uint256,bool)", p0, p1, p2, p3)); } function log(bool p0, bool p1, uint256 p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,uint256,address)", p0, p1, p2, p3)); } function log(bool p0, bool p1, string memory p2, uint256 p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,string,uint256)", p0, p1, p2, p3)); } function log(bool p0, bool p1, string memory p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,string,string)", p0, p1, p2, p3)); } function log(bool p0, bool p1, string memory p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,string,bool)", p0, p1, p2, p3)); } function log(bool p0, bool p1, string memory p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,string,address)", p0, p1, p2, p3)); } function log(bool p0, bool p1, bool p2, uint256 p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,bool,uint256)", p0, p1, p2, p3)); } function log(bool p0, bool p1, bool p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,bool,string)", p0, p1, p2, p3)); } function log(bool p0, bool p1, bool p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,bool,bool)", p0, p1, p2, p3)); } function log(bool p0, bool p1, bool p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,bool,address)", p0, p1, p2, p3)); } function log(bool p0, bool p1, address p2, uint256 p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,address,uint256)", p0, p1, p2, p3)); } function log(bool p0, bool p1, address p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,address,string)", p0, p1, p2, p3)); } function log(bool p0, bool p1, address p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,address,bool)", p0, p1, p2, p3)); } function log(bool p0, bool p1, address p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,address,address)", p0, p1, p2, p3)); } function log(bool p0, address p1, uint256 p2, uint256 p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,address,uint256,uint256)", p0, p1, p2, p3)); } function log(bool p0, address p1, uint256 p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,address,uint256,string)", p0, p1, p2, p3)); } function log(bool p0, address p1, uint256 p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,address,uint256,bool)", p0, p1, p2, p3)); } function log(bool p0, address p1, uint256 p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,address,uint256,address)", p0, p1, p2, p3)); } function log(bool p0, address p1, string memory p2, uint256 p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,address,string,uint256)", p0, p1, p2, p3)); } function log(bool p0, address p1, string memory p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,address,string,string)", p0, p1, p2, p3)); } function log(bool p0, address p1, string memory p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,address,string,bool)", p0, p1, p2, p3)); } function log(bool p0, address p1, string memory p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,address,string,address)", p0, p1, p2, p3)); } function log(bool p0, address p1, bool p2, uint256 p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,address,bool,uint256)", p0, p1, p2, p3)); } function log(bool p0, address p1, bool p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,address,bool,string)", p0, p1, p2, p3)); } function log(bool p0, address p1, bool p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,address,bool,bool)", p0, p1, p2, p3)); } function log(bool p0, address p1, bool p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,address,bool,address)", p0, p1, p2, p3)); } function log(bool p0, address p1, address p2, uint256 p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,address,address,uint256)", p0, p1, p2, p3)); } function log(bool p0, address p1, address p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,address,address,string)", p0, p1, p2, p3)); } function log(bool p0, address p1, address p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,address,address,bool)", p0, p1, p2, p3)); } function log(bool p0, address p1, address p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,address,address,address)", p0, p1, p2, p3)); } function log(address p0, uint256 p1, uint256 p2, uint256 p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,uint256,uint256,uint256)", p0, p1, p2, p3)); } function log(address p0, uint256 p1, uint256 p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,uint256,uint256,string)", p0, p1, p2, p3)); } function log(address p0, uint256 p1, uint256 p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,uint256,uint256,bool)", p0, p1, p2, p3)); } function log(address p0, uint256 p1, uint256 p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,uint256,uint256,address)", p0, p1, p2, p3)); } function log(address p0, uint256 p1, string memory p2, uint256 p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,uint256,string,uint256)", p0, p1, p2, p3)); } function log(address p0, uint256 p1, string memory p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,uint256,string,string)", p0, p1, p2, p3)); } function log(address p0, uint256 p1, string memory p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,uint256,string,bool)", p0, p1, p2, p3)); } function log(address p0, uint256 p1, string memory p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,uint256,string,address)", p0, p1, p2, p3)); } function log(address p0, uint256 p1, bool p2, uint256 p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,uint256,bool,uint256)", p0, p1, p2, p3)); } function log(address p0, uint256 p1, bool p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,uint256,bool,string)", p0, p1, p2, p3)); } function log(address p0, uint256 p1, bool p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,uint256,bool,bool)", p0, p1, p2, p3)); } function log(address p0, uint256 p1, bool p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,uint256,bool,address)", p0, p1, p2, p3)); } function log(address p0, uint256 p1, address p2, uint256 p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,uint256,address,uint256)", p0, p1, p2, p3)); } function log(address p0, uint256 p1, address p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,uint256,address,string)", p0, p1, p2, p3)); } function log(address p0, uint256 p1, address p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,uint256,address,bool)", p0, p1, p2, p3)); } function log(address p0, uint256 p1, address p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,uint256,address,address)", p0, p1, p2, p3)); } function log(address p0, string memory p1, uint256 p2, uint256 p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,string,uint256,uint256)", p0, p1, p2, p3)); } function log(address p0, string memory p1, uint256 p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,string,uint256,string)", p0, p1, p2, p3)); } function log(address p0, string memory p1, uint256 p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,string,uint256,bool)", p0, p1, p2, p3)); } function log(address p0, string memory p1, uint256 p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,string,uint256,address)", p0, p1, p2, p3)); } function log(address p0, string memory p1, string memory p2, uint256 p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,string,string,uint256)", p0, p1, p2, p3)); } function log(address p0, string memory p1, string memory p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,string,string,string)", p0, p1, p2, p3)); } function log(address p0, string memory p1, string memory p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,string,string,bool)", p0, p1, p2, p3)); } function log(address p0, string memory p1, string memory p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,string,string,address)", p0, p1, p2, p3)); } function log(address p0, string memory p1, bool p2, uint256 p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,string,bool,uint256)", p0, p1, p2, p3)); } function log(address p0, string memory p1, bool p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,string,bool,string)", p0, p1, p2, p3)); } function log(address p0, string memory p1, bool p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,string,bool,bool)", p0, p1, p2, p3)); } function log(address p0, string memory p1, bool p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,string,bool,address)", p0, p1, p2, p3)); } function log(address p0, string memory p1, address p2, uint256 p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,string,address,uint256)", p0, p1, p2, p3)); } function log(address p0, string memory p1, address p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,string,address,string)", p0, p1, p2, p3)); } function log(address p0, string memory p1, address p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,string,address,bool)", p0, p1, p2, p3)); } function log(address p0, string memory p1, address p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,string,address,address)", p0, p1, p2, p3)); } function log(address p0, bool p1, uint256 p2, uint256 p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,bool,uint256,uint256)", p0, p1, p2, p3)); } function log(address p0, bool p1, uint256 p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,bool,uint256,string)", p0, p1, p2, p3)); } function log(address p0, bool p1, uint256 p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,bool,uint256,bool)", p0, p1, p2, p3)); } function log(address p0, bool p1, uint256 p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,bool,uint256,address)", p0, p1, p2, p3)); } function log(address p0, bool p1, string memory p2, uint256 p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,bool,string,uint256)", p0, p1, p2, p3)); } function log(address p0, bool p1, string memory p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,bool,string,string)", p0, p1, p2, p3)); } function log(address p0, bool p1, string memory p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,bool,string,bool)", p0, p1, p2, p3)); } function log(address p0, bool p1, string memory p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,bool,string,address)", p0, p1, p2, p3)); } function log(address p0, bool p1, bool p2, uint256 p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,bool,bool,uint256)", p0, p1, p2, p3)); } function log(address p0, bool p1, bool p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,bool,bool,string)", p0, p1, p2, p3)); } function log(address p0, bool p1, bool p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,bool,bool,bool)", p0, p1, p2, p3)); } function log(address p0, bool p1, bool p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,bool,bool,address)", p0, p1, p2, p3)); } function log(address p0, bool p1, address p2, uint256 p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,bool,address,uint256)", p0, p1, p2, p3)); } function log(address p0, bool p1, address p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,bool,address,string)", p0, p1, p2, p3)); } function log(address p0, bool p1, address p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,bool,address,bool)", p0, p1, p2, p3)); } function log(address p0, bool p1, address p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,bool,address,address)", p0, p1, p2, p3)); } function log(address p0, address p1, uint256 p2, uint256 p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,address,uint256,uint256)", p0, p1, p2, p3)); } function log(address p0, address p1, uint256 p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,address,uint256,string)", p0, p1, p2, p3)); } function log(address p0, address p1, uint256 p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,address,uint256,bool)", p0, p1, p2, p3)); } function log(address p0, address p1, uint256 p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,address,uint256,address)", p0, p1, p2, p3)); } function log(address p0, address p1, string memory p2, uint256 p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,address,string,uint256)", p0, p1, p2, p3)); } function log(address p0, address p1, string memory p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,address,string,string)", p0, p1, p2, p3)); } function log(address p0, address p1, string memory p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,address,string,bool)", p0, p1, p2, p3)); } function log(address p0, address p1, string memory p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,address,string,address)", p0, p1, p2, p3)); } function log(address p0, address p1, bool p2, uint256 p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,address,bool,uint256)", p0, p1, p2, p3)); } function log(address p0, address p1, bool p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,address,bool,string)", p0, p1, p2, p3)); } function log(address p0, address p1, bool p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,address,bool,bool)", p0, p1, p2, p3)); } function log(address p0, address p1, bool p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,address,bool,address)", p0, p1, p2, p3)); } function log(address p0, address p1, address p2, uint256 p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,address,address,uint256)", p0, p1, p2, p3)); } function log(address p0, address p1, address p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,address,address,string)", p0, p1, p2, p3)); } function log(address p0, address p1, address p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,address,address,bool)", p0, p1, p2, p3)); } function log(address p0, address p1, address p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,address,address,address)", p0, p1, p2, p3)); } }
{ "optimizer": { "enabled": true, "runs": 200 }, "evmVersion": "paris", "outputSelection": { "*": { "*": [ "evm.bytecode", "evm.deployedBytecode", "devdoc", "userdoc", "metadata", "abi" ] } }, "metadata": { "useLiteralContent": true }, "libraries": {} }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"AccessControlBadConfirmation","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"bytes32","name":"neededRole","type":"bytes32"}],"name":"AccessControlUnauthorizedAccount","type":"error"},{"inputs":[{"internalType":"address","name":"target","type":"address"}],"name":"AddressEmptyCode","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"AddressInsufficientBalance","type":"error"},{"inputs":[],"name":"DepositLiquidityValueTooLow","type":"error"},{"inputs":[],"name":"FailedInnerCall","type":"error"},{"inputs":[],"name":"InsufficientAmount","type":"error"},{"inputs":[],"name":"MustBeCalledByZunamiPool","type":"error"},{"inputs":[],"name":"MustHaveOwner","type":"error"},{"inputs":[{"internalType":"address","name":"token","type":"address"}],"name":"SafeERC20FailedOperation","type":"error"},{"inputs":[],"name":"WrongBoosterDepositAll","type":"error"},{"inputs":[],"name":"WrongDecimalMultipliers","type":"error"},{"inputs":[],"name":"WrongRatio","type":"error"},{"inputs":[],"name":"WrongSlippage","type":"error"},{"inputs":[],"name":"WrongTokens","type":"error"},{"inputs":[],"name":"ZeroAddress","type":"error"},{"inputs":[],"name":"ZeroValue","type":"error"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"newLockTimestamp","type":"uint256"}],"name":"LockedLonger","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"oracleAddr","type":"address"}],"name":"PriceOracleSet","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"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"lockingIntervalSec","type":"uint256"}],"name":"SetLockingIntervalSec","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"tokenConverter","type":"address"}],"name":"SetTokenConverter","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"oldSlippage","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"newSlippage","type":"uint256"}],"name":"SlippageSet","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"zunamiPoolAddr","type":"address"}],"name":"ZunamiPoolSet","type":"event"},{"inputs":[],"name":"CURVENG_MAX_COINS","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"DEFAULT_ADMIN_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"EMERGENCY_ADMIN_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"FRXETH_TOKEN_POOL_FRXETH_ID","outputs":[{"internalType":"uint128","name":"","type":"uint128"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"FRXETH_TOKEN_POOL_FRXETH_ID_INT","outputs":[{"internalType":"int128","name":"","type":"int128"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"FRXETH_TOKEN_POOL_TOKEN_ID","outputs":[{"internalType":"uint128","name":"","type":"uint128"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"FRXETH_TOKEN_POOL_TOKEN_ID_INT","outputs":[{"internalType":"int128","name":"","type":"int128"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"POOL_ASSETS","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PRICE_DENOMINATOR","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"RATIO_MULTIPLIER","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"SLIPPAGE_DENOMINATOR","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256[5]","name":"tokenAmounts","type":"uint256[5]"},{"internalType":"bool","name":"isDeposit","type":"bool"}],"name":"calcTokenAmount","outputs":[{"internalType":"uint256","name":"sharesAmount","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"receiver","type":"address"},{"internalType":"contract IERC20[]","name":"rewardTokens","type":"address[]"}],"name":"claimRewards","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"converter","outputs":[{"internalType":"contract ITokenConverter","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"cvxBooster","outputs":[{"internalType":"contract IConvexStakingBooster","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"cvxPID","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"cvxRewards","outputs":[{"internalType":"contract IConvexRewards","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"ratioOfCrvLps","type":"uint256"},{"internalType":"uint256","name":"minDeflateAmount","type":"uint256"}],"name":"deflate","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256[5]","name":"amounts","type":"uint256[5]"}],"name":"deposit","outputs":[{"internalType":"uint256","name":"liquidityValue","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"depositedLiquidity","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"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":"uint256","name":"ratioOfCrvLps","type":"uint256"},{"internalType":"uint256","name":"minInflatedAmount","type":"uint256"}],"name":"inflate","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"kekId","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lockingIntervalSec","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"oracle","outputs":[{"internalType":"contract IOracle","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pool","outputs":[{"internalType":"contract ICurvePoolN","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"poolToken","outputs":[{"internalType":"contract IERC20","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"callerConfirmation","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":"uint256","name":"_lockingIntervalSec","type":"uint256"}],"name":"setLockingIntervalSec","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"oracleAddr","type":"address"}],"name":"setPriceOracle","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_slippage","type":"uint256"}],"name":"setSlippage","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"converterAddr","type":"address"}],"name":"setTokenConverter","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"zunamiAddr","type":"address"}],"name":"setZunamiPool","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"slippage","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"stakeLonger","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"stakingVault","outputs":[{"internalType":"contract IStakingProxyConvex","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"tokenDecimalsMultipliers","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"tokens","outputs":[{"internalType":"contract IERC20","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalHoldings","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"receiver","type":"address"},{"internalType":"uint256","name":"poolTokenRatio","type":"uint256"},{"internalType":"uint256[5]","name":"tokenAmounts","type":"uint256[5]"}],"name":"withdraw","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256[5]","name":"minTokenAmounts","type":"uint256[5]"}],"name":"withdrawAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract IERC20","name":"_token","type":"address"}],"name":"withdrawEmergency","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"zunamiController","outputs":[{"internalType":"contract IController","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"zunamiPool","outputs":[{"internalType":"contract IPool","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"zunamiStable","outputs":[{"internalType":"contract IERC20","name":"","type":"address"}],"stateMutability":"view","type":"function"}]
Contract Creation Code
6101606040526032600255601280546001600160a01b031990811673c02aaa39b223fe8d0a0e5c4f27ead9083c756cc21790915560138054909116735e8422345238f34275888049021821e8e08caa1f1790553480156200005f57600080fd5b506040518060a0016040528073c2e660c62f72c2ad35ace6db78a616215e2f22226001600160a01b03166001600160a01b0316815260200160006001600160a01b03166001600160a01b0316815260200160006001600160a01b03166001600160a01b0316815260200160006001600160a01b03166001600160a01b0316815260200160006001600160a01b03166001600160a01b03168152506040518060a00160405280600181526020016000815260200160008152602001600081526020016000815250733a65cbaebbfecbea5d0cb523ab56fdbda7ff9aaa8073d8bd5cdd145ed2197cb16ddb172df954e3f28659604b7354a00da65c79ddce24e7fe4691737fd70f7797df73c2e660c62f72c2ad35ace6db78a616215e2f2222878787878787858585858585858585858383620001a36000801b336200049b60201b60201c565b506000805b6005811015620002f757818015620001e357506000848260058110620001d257620001d26200062a565b60200201516001600160a01b031614155b156200020257604051631d37a6fd60e11b815260040160405180910390fd5b60008482600581106200021957620002196200062a565b60200201516001600160a01b0316036200023257600191505b60008482600581106200024957620002496200062a565b60200201516001600160a01b0316141580156200027d57508281600581106200027657620002766200062a565b6020020151155b80620002cf575060008482600581106200029b576200029b6200062a565b60200201516001600160a01b0316148015620002cf5750828160058110620002c757620002c76200062a565b602002015115155b15620002ee5760405163bfa45dc560e01b815260040160405180910390fd5b600101620001a8565b5062000307600384600562000585565b50620003176008836005620005e2565b5050506001600160a01b0383169050620003445760405163d92e233d60e01b815260040160405180910390fd5b6001600160a01b038083166080528116620003725760405163d92e233d60e01b815260040160405180910390fd5b6001600160a01b0390811660a05285169250620003a59150505760405163d92e233d60e01b815260040160405180910390fd5b6001600160a01b03821660e0526000819003620003d557604051637c946ed760e01b815260040160405180910390fd5b60c0819052620003e862093a806200054a565b505050505050620004207f5358bcfd81d1ef3da152b1755e1c3c6739686fa7e83dbcad0071568cc4b73a63336200049b60201b60201c565b5050506001600160a01b038616935062000451925050505760405163d92e233d60e01b815260040160405180910390fd5b6001600160a01b03808316610120528116620004805760405163d92e233d60e01b815260040160405180910390fd5b6001600160a01b031661014052506200064095505050505050565b6000828152602081815260408083206001600160a01b038516845290915281205460ff1662000540576000838152602081815260408083206001600160a01b03861684529091529020805460ff19166001179055620004f73390565b6001600160a01b0316826001600160a01b0316847f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a450600162000544565b5060005b92915050565b60118190556040518181527f57753a889d1830ec176a512e55838bca3500c644653db868d60d1328b02a7ae89060200160405180910390a150565b8260058101928215620005d0579160200282015b82811115620005d057825182546001600160a01b0319166001600160a01b0390911617825560209092019160019091019062000599565b50620005de92915062000613565b5090565b8260058101928215620005d0579160200282015b82811115620005d0578251825591602001919060010190620005f6565b5b80821115620005de576000815560010162000614565b634e487b7160e01b600052603260045260246000fd5b60805160a05160c05160e051610100516101205161014051612d6c62000735600039600081816104c90152818161137b0152818161198f015261256e0152600081816106ad0152818161139d01528181611400015281816118300152611859015260006105d60152600081816102ed0152611fc301526000818161032c0152611f9d015260008181610647015281816112550152818161175001528181611c330152818161206a01526125ac01526000818161037401528181610ca8015281816112f701528181611694015281816117a6015281816119b101528181611e6a0152818161223201526122b10152612d6c6000f3fe608060405234801561001057600080fd5b50600436106102bb5760003560e01c80636524ee9011610182578063ac905114116100e9578063d547741f116100a2578063e9ec2e991161007c578063e9ec2e9914610685578063ec4d23e21461068d578063f0fa55a914610695578063f459fff4146106a857600080fd5b8063d547741f14610669578063d58f042b1461067c578063d5f651a41461051957600080fd5b8063ac905114146105f8578063b532617014610601578063b67d611d14610609578063bd38837b1461061c578063c56aa1661461062f578063cbdf382c1461064257600080fd5b806381a7b8941161013b57806381a7b8941461057d57806391d14854146105905780639d57b9a6146105a3578063a1c04f0e146105b6578063a217fddf146105c9578063aa5ccb90146105d157600080fd5b80636524ee90146105115780636c1516e1146105195780636d9164c6146105285780636e76fc8f1461053b57806375451b4f146105505780637dc0d1d01461056a57600080fd5b80632a9383421161022657806345bffdf6116101df57806345bffdf6146104955780634f64b2be1461049e578063530e784f146104b1578063550f5c98146104c457806356edb316146104eb57806359615983146104fe57600080fd5b80632a938342146104255780632e7f237f146104385780632f2ff15d1461045357806336489ed11461046657806336568abe146104795780633e032a3b1461048c57600080fd5b80632026ffa3116102785780632026ffa314610396578063213c79d8146103a9578063248a9ca3146103bc57806324e7964a146103df57806325122264146103f2578063258a5f291461040557600080fd5b806301ffc9a7146102c05780630229c64c146102e857806308051e97146103275780630cf391301461035c57806310c231c71461036657806316f0115b1461036f575b600080fd5b6102d36102ce366004612838565b6106cf565b60405190151581526020015b60405180910390f35b61030f7f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b0390911681526020016102df565b61034e7f000000000000000000000000000000000000000000000000000000000000000081565b6040519081526020016102df565b610364610706565b005b61034e600e5481565b61030f7f000000000000000000000000000000000000000000000000000000000000000081565b6103646103a43660046128be565b6107d5565b60015461030f906001600160a01b031681565b61034e6103ca366004612985565b60009081526020819052604090206001015490565b600f5461030f906001600160a01b031681565b61036461040036600461299e565b610822565b61040d600081565b6040516001600160801b0390911681526020016102df565b61036461043336600461299e565b610849565b610440600081565b604051600f9190910b81526020016102df565b6103646104613660046129c0565b61086b565b610364610474366004612985565b610896565b6103646104873660046129c0565b6108b7565b61034e60025481565b61034e60105481565b61030f6104ac366004612985565b6108ea565b6103646104bf3660046129f0565b61090a565b61030f7f000000000000000000000000000000000000000000000000000000000000000081565b61034e6104f9366004612985565b61098a565b61036461050c3660046129f0565b6109a1565b61040d600181565b61034e670de0b6b3a764000081565b6102d3610536366004612a7b565b610a21565b61034e600080516020612d1783398151915281565b610558600581565b60405160ff90911681526020016102df565b600d5461030f906001600160a01b031681565b61036461058b366004612aba565b610bee565b6102d361059e3660046129c0565b610c7b565b61034e6105b1366004612ae4565b610ca4565b6103646105c43660046129f0565b610d3d565b61034e600081565b61030f7f000000000000000000000000000000000000000000000000000000000000000081565b61034e61271081565b610440600181565b61034e610617366004612aba565b610dcf565b60145461030f906001600160a01b031681565b61036461063d3660046129f0565b610e6a565b61030f7f000000000000000000000000000000000000000000000000000000000000000081565b6103646106773660046129c0565b610eea565b61034e60115481565b61034e610f0f565b61034e600881565b6103646106a3366004612985565b610f27565b61030f7f000000000000000000000000000000000000000000000000000000000000000081565b60006001600160e01b03198216637965db0b60e01b148061070057506301ffc9a760e01b6001600160e01b03198316145b92915050565b600080516020612d1783398151915261071e81610fa3565b60006011544261072e9190612b27565b600f5460105460405163d2fbdc0d60e01b81526004810191909152602481018390529192506001600160a01b03169063d2fbdc0d90604401600060405180830381600087803b15801561078057600080fd5b505af1158015610794573d6000803e3d6000fd5b505050507f63a64e7a40c0e2a36c53dc32093800983ae4f85819b9f357a5014138e10c5c3b816040516107c991815260200190565b60405180910390a15050565b6001546001600160a01b03163314610800576040516304d6e46b60e31b815260040160405180910390fd5b610808610fad565b61081e818361081960008551611076565b6110f5565b5050565b600080516020612d1783398151915261083a81610fa3565b61084483836111f6565b505050565b600080516020612d1783398151915261086181610fa3565b61084483836116f1565b60008281526020819052604090206001015461088681610fa3565b6108908383611a0d565b50505050565b600080516020612d178339815191526108ae81610fa3565b61081e82611a9f565b6001600160a01b03811633146108e05760405163334bd91960e11b815260040160405180910390fd5b6108448282611ada565b600381600581106108fa57600080fd5b01546001600160a01b0316905081565b600061091581610fa3565b6001600160a01b03821661093c5760405163d92e233d60e01b815260040160405180910390fd5b600d80546001600160a01b0319166001600160a01b0384169081179091556040519081527f6536690106168bdf4ba72c128a053d817999b1db90cae23f139b293bf862cb75906020016107c9565b6008816005811061099a57600080fd5b0154905081565b60006109ac81610fa3565b6001600160a01b0382166109d35760405163d92e233d60e01b815260040160405180910390fd5b600180546001600160a01b0319166001600160a01b0384169081179091556040519081527ffa639b2012458fd129b4bf30b2a98c9b56cc3a9ba0606013b8d1f9232cb4498a906020016107c9565b6001546000906001600160a01b03163314610a4f576040516304d6e46b60e31b815260040160405180910390fd5b6000610a5a84611b45565b9050610a67836000610ca4565b811015610a78576000915050610be7565b60408051600580825260c082019092526000916020820160a08036833701905050905060005b6005811015610b6f57600060038260058110610abc57610abc612b3a565b01546001600160a01b031614610b6f5760038160058110610adf57610adf612b3a565b01546040516370a0823160e01b81523060048201526001600160a01b03909116906370a0823190602401602060405180830381865afa158015610b26573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b4a9190612b50565b828281518110610b5c57610b5c612b3a565b6020908102919091010152600101610a9e565b5081600e6000828254610b829190612b69565b90915550610b94905082856000611c03565b6040805160a0810191829052610be091610bd9919060039060059082845b81546001600160a01b03168152600190910190602001808311610bb2575050505050611c6d565b87836110f5565b6001925050505b9392505050565b6001546001600160a01b03163314610c19576040516304d6e46b60e31b815260040160405180910390fd5b610c27600e54826001611c03565b6000600e556040805160a0810191829052600380546001600160a01b03168252610c7892610c6b929190600590600460208501808311610bb2575050505050611c6d565b3361081960006005611076565b50565b6000918252602082815260408084206001600160a01b0393909316845291905290205460ff1690565b60007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316633db06dd8610cde85611ceb565b846040518363ffffffff1660e01b8152600401610cfc929190612bb8565b602060405180830381865afa158015610d19573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610be79190612b50565b6000610d4881610fa3565b6040516370a0823160e01b81523060048201526000906001600160a01b038416906370a0823190602401602060405180830381865afa158015610d8f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610db39190612b50565b90508015610844576108446001600160a01b0384163383611d3b565b6001546000906001600160a01b03163314610dfd576040516304d6e46b60e31b815260040160405180910390fd5b6000610e0883611d9a565b90506000610e1584611e62565b905080600e6000828254610e299190612b27565b90915550610e38905081611ea5565b9250610e4382611ec2565b831015610e6357604051630224f5df60e11b815260040160405180910390fd5b5050919050565b6000610e7581610fa3565b6001600160a01b038216610e9c5760405163d92e233d60e01b815260040160405180910390fd5b601480546001600160a01b0319166001600160a01b0384169081179091556040519081527f18f0ece2d6ea55163aef7a7c841762e706a96c532ed665e8abefaa00d1767fb8906020016107c9565b600082815260208190526040902060010154610f0581610fa3565b6108908383611ada565b6000610f22610f1d600e5490565b611ea5565b905090565b6000610f3281610fa3565b600082118015610f4457506127108211155b610f6157604051633f6fccb560e01b815260040160405180910390fd5b60025460408051918252602082018490527f785f467195f308c252d89e7e85c95a6b7646506ba4774a1dc54e0eedc08e3d43910160405180910390a150600255565b610c788133611ed7565b600f546001600160a01b0316610fbf57565b600f5460405163a4698feb60e01b8152600160048201526001600160a01b039091169063a4698feb90602401600060405180830381600087803b15801561100557600080fd5b505af1925050508015611016575060015b61107457600f5460405163a4698feb60e01b8152600060048201526001600160a01b039091169063a4698feb90602401600060405180830381600087803b15801561106057600080fd5b505af1158015610890573d6000803e3d6000fd5b565b60608167ffffffffffffffff81111561109157611091612877565b6040519080825280602002602001820160405280156110ba578160200160208202803683370190505b50905060005b828110156110ee57838282815181106110db576110db612b3a565b60209081029190910101526001016110c0565b5092915050565b60008060005b85518110156111ee5785818151811061111657611116612b3a565b6020026020010151915060006001600160a01b0316826001600160a01b031603156111ee5783818151811061114d5761114d612b3a565b60209081029190910101516040516370a0823160e01b81523060048201526001600160a01b038416906370a0823190602401602060405180830381865afa15801561119c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111c09190612b50565b6111ca9190612b69565b925082156111e6576111e66001600160a01b0383168685611d3b565b6001016110fb565b505050505050565b600061120183611b45565b905080600e60008282546112159190612b69565b909155506112239050611f10565b670de0b6b3a764000083146112d0576040516370a0823160e01b81523060048201526112d09082906001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016906370a08231906024015b602060405180830381865afa15801561129d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112c19190612b50565b6112cb9190612b69565b611f7e565b604051630d2680e960e11b81526004810182905260006024820181905260448201819052907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690631a4d01d2906064016020604051808303816000875af1158015611348573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061136c9190612b50565b90506113c26001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000167f00000000000000000000000000000000000000000000000000000000000000008361218e565b6040805160a081018252600080825260208201819052818301819052606082018190526080820152905163ca54be3b60e01b81526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169163ca54be3b916114379185913090600401612bff565b600060405180830381600087803b15801561145157600080fd5b505af1158015611465573d6000803e3d6000fd5b50506012546040516370a0823160e01b8152306004820152600093506001600160a01b0390911691506370a0823190602401602060405180830381865afa1580156114b4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114d89190612b50565b905080156115a5576014546012546114fd916001600160a01b03918216911683611d3b565b6014546012546013546001600160a01b0392831692631a378db792811691168461152681611ec2565b6040516001600160e01b031960e087901b1681526001600160a01b039485166004820152939092166024840152604483015260648201526084016020604051808303816000875af115801561157f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115a39190612b50565b505b6013546040516370a0823160e01b81523060048201526000916001600160a01b0316906370a0823190602401602060405180830381865afa1580156115ee573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116129190612b50565b90508481101561163557604051632ca2f52b60e11b815260040160405180910390fd5b60408051600880825261012082019092526000916020820161010080368337019050509050818160016001600160801b03168151811061167757611677612b3a565b60209081029190910101526013546116b9906001600160a01b03167f00000000000000000000000000000000000000000000000000000000000000008461218e565b60006116c482612218565b905080600e60008282546116d89190612b27565b909155506116e7905081611f7e565b5050505050505050565b60006116fc83611b45565b905080600e60008282546117109190612b69565b9091555061171e9050611f10565b670de0b6b3a7640000831461177f576040516370a0823160e01b815230600482015261177f9082906001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016906370a0823190602401611280565b604051630d2680e960e11b81526004810182905260016024820152600060448201819052907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690631a4d01d2906064016020604051808303816000875af11580156117f7573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061181b9190612b50565b601354909150611855906001600160a01b03167f00000000000000000000000000000000000000000000000000000000000000008361218e565b60007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316632d62af2f6040518060a001604052806000815260200185815260200160008152602001600081526020016000815250306040518363ffffffff1660e01b81526004016118cf929190612c2c565b6020604051808303816000875af11580156118ee573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119129190612b50565b90508381101561193557604051632ca2f52b60e11b815260040160405180910390fd5b60408051600880825261012082019092526000916020820161010080368337019050509050818160006001600160801b03168151811061197757611977612b3a565b60209081029190910101526119d66001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000167f00000000000000000000000000000000000000000000000000000000000000008461218e565b60006119e182612218565b905080600e60008282546119f59190612b27565b90915550611a04905081611f7e565b50505050505050565b6000611a198383610c7b565b611a97576000838152602081815260408083206001600160a01b03861684529091529020805460ff19166001179055611a4f3390565b6001600160a01b0316826001600160a01b0316847f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a4506001610700565b506000610700565b60118190556040518181527f57753a889d1830ec176a512e55838bca3500c644653db868d60d1328b02a7ae89060200160405180910390a150565b6000611ae68383610c7b565b15611a97576000838152602081815260408083206001600160a01b0386168085529252808320805460ff1916905551339286917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a4506001610700565b60008082118015611b5e5750670de0b6b3a76400008211155b611ba75760405162461bcd60e51b815260206004820152601560248201527457726f6e6720506f6f6c546f6b656e20526174696f60581b60448201526064015b60405180910390fd5b600082118015611bbf5750670de0b6b3a76400008211155b611bdc57604051634aa3778b60e01b815260040160405180910390fd5b670de0b6b3a764000082611bef600e5490565b611bf99190612c52565b6107009190612c69565b611c0b611f10565b80611c62576040516370a0823160e01b8152306004820152611c629084906001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016906370a0823190602401611280565b6108448383836122ac565b60408051600580825260c082019092526060916020820160a08036833701905050905060005b6005811015611ce557828160058110611cae57611cae612b3a565b6020020151828281518110611cc557611cc5612b3a565b6001600160a01b0390921660209283029190910190910152600101611c93565b50919050565b604080516008808252610120820190925260609160009190602082016101008036833750508451825192935091839150600090611d2a57611d2a612b3a565b602090810291909101015292915050565b6040516001600160a01b0383811660248301526044820183905261084491859182169063a9059cbb906064015b604051602081830303815290604052915060e01b6020820180516001600160e01b038381831617835250505050612360565b6000805b6005811015611ce557600060038260058110611dbc57611dbc612b3a565b01546001600160a01b0316905080611dd45750611ce5565b670de0b6b3a764000060088360058110611df057611df0612b3a565b0154858460058110611e0457611e04612b3a565b6020020151611e2f60038660058110611e1f57611e1f612b3a565b01546001600160a01b03166123c3565b611e399190612c52565b611e439190612c52565b611e4d9190612c69565b611e579084612b27565b925050600101611d9e565b600080611e8f7f0000000000000000000000000000000000000000000000000000000000000000846124f9565b9050611e9a81612218565b9150611ce582611f7e565b6000670de0b6b3a7640000611eb86125a5565b611bf99084612c52565b6000612710600254612710611eb89190612b69565b611ee18282610c7b565b61081e5760405163e2517d3f60e01b81526001600160a01b038216600482015260248101839052604401611b9e565b600f54601054604051634ab794a360e01b81526001600160a01b0390921691634ab794a391611f459160040190815260200190565b600060405180830381600087803b158015611f5f57600080fd5b505af1158015611f73573d6000803e3d6000fd5b505060006010555050565b600f546001600160a01b031661205957604051639abbdf4b60e01b81527f000000000000000000000000000000000000000000000000000000000000000060048201527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690639abbdf4b906024016020604051808303816000875af1158015612014573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906120389190612c8b565b600f80546001600160a01b0319166001600160a01b03929092169190911790555b600f54612093906001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000811691168361218e565b60105460000361211d57600f5460115460405163a41ce7e960e01b81526004810184905260248101919091526001600160a01b039091169063a41ce7e9906044016020604051808303816000875af11580156120f3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906121179190612b50565b60105550565b600f54601054604051630687c4bd60e01b81526001600160a01b0390921691630687c4bd91612159918590600401918252602082015260400190565b600060405180830381600087803b15801561217357600080fd5b505af1158015612187573d6000803e3d6000fd5b5050505050565b604051636eb1769f60e11b81523060048201526001600160a01b0383811660248301526000919085169063dd62ed3e90604401602060405180830381865afa1580156121de573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906122029190612b50565b905061089084846122138585612b27565b6125d0565b604051635b96faef60e11b81526000906001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169063b72df5de906122699085908590600401612ca8565b6020604051808303816000875af1158015612288573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107009190612b50565b6000807f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316631a4d01d28683878160200201516040516001600160e01b031960e086901b1681526004810193909352600f9190910b602483015260448201526064016020604051808303816000875af1158015612335573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906123599190612b50565b9050612187565b60006123756001600160a01b03841683612660565b9050805160001415801561239a5750808060200190518101906123989190612cca565b155b1561084457604051635274afe760e01b81526001600160a01b0384166004820152602401611b9e565b600073c02aaa39b223fe8d0a0e5c4f27ead9083c756cc1196001600160a01b038316016123f95750670de0b6b3a7640000919050565b600d54604051638b2f0f4f60e01b815273eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee60048201526001600160a01b0390911690638b2f0f4f90602401602060405180830381865afa158015612455573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906124799190612b50565b600d54604051638b2f0f4f60e01b81526001600160a01b03858116600483015290911690638b2f0f4f90602401602060405180830381865afa1580156124c3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906124e79190612b50565b611bf990670de0b6b3a7640000612c52565b60408051600880825261012082019092526060916000919060208201610100803683375050845182519293509183915060009061253857612538612b3a565b602002602001018181525050610be7848260006001600160801b03168151811061256457612564612b3a565b60200260200101517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031661218e9092919063ffffffff16565b6000610f227f00000000000000000000000000000000000000000000000000000000000000006123c3565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663095ea7b360e01b179052612621848261266e565b610890576040516001600160a01b0384811660248301526000604483015261265691869182169063095ea7b390606401611d68565b6108908482612360565b6060610be783836000612716565b6000806000846001600160a01b03168460405161268b9190612ce7565b6000604051808303816000865af19150503d80600081146126c8576040519150601f19603f3d011682016040523d82523d6000602084013e6126cd565b606091505b50915091508180156126f75750805115806126f75750808060200190518101906126f79190612cca565b801561270d57506000856001600160a01b03163b115b95945050505050565b60608147101561273b5760405163cd78605960e01b8152306004820152602401611b9e565b600080856001600160a01b031684866040516127579190612ce7565b60006040518083038185875af1925050503d8060008114612794576040519150601f19603f3d011682016040523d82523d6000602084013e612799565b606091505b50915091506127a98683836127b3565b9695505050505050565b6060826127c8576127c38261280f565b610be7565b81511580156127df57506001600160a01b0384163b155b1561280857604051639996b31560e01b81526001600160a01b0385166004820152602401611b9e565b5080610be7565b80511561281f5780518082602001fd5b604051630a12f52160e11b815260040160405180910390fd5b60006020828403121561284a57600080fd5b81356001600160e01b031981168114610be757600080fd5b6001600160a01b0381168114610c7857600080fd5b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f1916810167ffffffffffffffff811182821017156128b6576128b6612877565b604052919050565b600080604083850312156128d157600080fd5b82356128dc81612862565b915060208381013567ffffffffffffffff808211156128fa57600080fd5b818601915086601f83011261290e57600080fd5b81358181111561292057612920612877565b8060051b915061293184830161288d565b818152918301840191848101908984111561294b57600080fd5b938501935b83851015612975578435925061296583612862565b8282529385019390850190612950565b8096505050505050509250929050565b60006020828403121561299757600080fd5b5035919050565b600080604083850312156129b157600080fd5b50508035926020909101359150565b600080604083850312156129d357600080fd5b8235915060208301356129e581612862565b809150509250929050565b600060208284031215612a0257600080fd5b8135610be781612862565b600082601f830112612a1e57600080fd5b60405160a0810181811067ffffffffffffffff82111715612a4157612a41612877565b6040528060a0840185811115612a5657600080fd5b845b81811015612a70578035835260209283019201612a58565b509195945050505050565b600080600060e08486031215612a9057600080fd5b8335612a9b81612862565b925060208401359150612ab18560408601612a0d565b90509250925092565b600060a08284031215612acc57600080fd5b610be78383612a0d565b8015158114610c7857600080fd5b60008060c08385031215612af757600080fd5b612b018484612a0d565b915060a08301356129e581612ad6565b634e487b7160e01b600052601160045260246000fd5b8082018082111561070057610700612b11565b634e487b7160e01b600052603260045260246000fd5b600060208284031215612b6257600080fd5b5051919050565b8181038181111561070057610700612b11565b60008151808452602080850194506020840160005b83811015612bad57815187529582019590820190600101612b91565b509495945050505050565b604081526000612bcb6040830185612b7c565b905082151560208301529392505050565b8060005b6005811015610890578151845260209384019390910190600101612be0565b83815260e08101612c136020830185612bdc565b6001600160a01b039290921660c0919091015292915050565b60c08101612c3a8285612bdc565b6001600160a01b039290921660a09190910152919050565b808202811582820484141761070057610700612b11565b600082612c8657634e487b7160e01b600052601260045260246000fd5b500490565b600060208284031215612c9d57600080fd5b8151610be781612862565b604081526000612cbb6040830185612b7c565b90508260208301529392505050565b600060208284031215612cdc57600080fd5b8151610be781612ad6565b6000825160005b81811015612d085760208186018101518583015201612cee565b50600092019182525091905056fe5358bcfd81d1ef3da152b1755e1c3c6739686fa7e83dbcad0071568cc4b73a63a26469706673582212206dc4ca97df0f43f6d3884360041c5d0dfeb592ad31cfb784b6f1077469d7bb4264736f6c63430008170033
Deployed Bytecode
0x608060405234801561001057600080fd5b50600436106102bb5760003560e01c80636524ee9011610182578063ac905114116100e9578063d547741f116100a2578063e9ec2e991161007c578063e9ec2e9914610685578063ec4d23e21461068d578063f0fa55a914610695578063f459fff4146106a857600080fd5b8063d547741f14610669578063d58f042b1461067c578063d5f651a41461051957600080fd5b8063ac905114146105f8578063b532617014610601578063b67d611d14610609578063bd38837b1461061c578063c56aa1661461062f578063cbdf382c1461064257600080fd5b806381a7b8941161013b57806381a7b8941461057d57806391d14854146105905780639d57b9a6146105a3578063a1c04f0e146105b6578063a217fddf146105c9578063aa5ccb90146105d157600080fd5b80636524ee90146105115780636c1516e1146105195780636d9164c6146105285780636e76fc8f1461053b57806375451b4f146105505780637dc0d1d01461056a57600080fd5b80632a9383421161022657806345bffdf6116101df57806345bffdf6146104955780634f64b2be1461049e578063530e784f146104b1578063550f5c98146104c457806356edb316146104eb57806359615983146104fe57600080fd5b80632a938342146104255780632e7f237f146104385780632f2ff15d1461045357806336489ed11461046657806336568abe146104795780633e032a3b1461048c57600080fd5b80632026ffa3116102785780632026ffa314610396578063213c79d8146103a9578063248a9ca3146103bc57806324e7964a146103df57806325122264146103f2578063258a5f291461040557600080fd5b806301ffc9a7146102c05780630229c64c146102e857806308051e97146103275780630cf391301461035c57806310c231c71461036657806316f0115b1461036f575b600080fd5b6102d36102ce366004612838565b6106cf565b60405190151581526020015b60405180910390f35b61030f7f000000000000000000000000d8bd5cdd145ed2197cb16ddb172df954e3f2865981565b6040516001600160a01b0390911681526020016102df565b61034e7f000000000000000000000000000000000000000000000000000000000000004b81565b6040519081526020016102df565b610364610706565b005b61034e600e5481565b61030f7f0000000000000000000000003a65cbaebbfecbea5d0cb523ab56fdbda7ff9aaa81565b6103646103a43660046128be565b6107d5565b60015461030f906001600160a01b031681565b61034e6103ca366004612985565b60009081526020819052604090206001015490565b600f5461030f906001600160a01b031681565b61036461040036600461299e565b610822565b61040d600081565b6040516001600160801b0390911681526020016102df565b61036461043336600461299e565b610849565b610440600081565b604051600f9190910b81526020016102df565b6103646104613660046129c0565b61086b565b610364610474366004612985565b610896565b6103646104873660046129c0565b6108b7565b61034e60025481565b61034e60105481565b61030f6104ac366004612985565b6108ea565b6103646104bf3660046129f0565b61090a565b61030f7f000000000000000000000000c2e660c62f72c2ad35ace6db78a616215e2f222281565b61034e6104f9366004612985565b61098a565b61036461050c3660046129f0565b6109a1565b61040d600181565b61034e670de0b6b3a764000081565b6102d3610536366004612a7b565b610a21565b61034e600080516020612d1783398151915281565b610558600581565b60405160ff90911681526020016102df565b600d5461030f906001600160a01b031681565b61036461058b366004612aba565b610bee565b6102d361059e3660046129c0565b610c7b565b61034e6105b1366004612ae4565b610ca4565b6103646105c43660046129f0565b610d3d565b61034e600081565b61030f7f000000000000000000000000000000000000000000000000000000000000000081565b61034e61271081565b610440600181565b61034e610617366004612aba565b610dcf565b60145461030f906001600160a01b031681565b61036461063d3660046129f0565b610e6a565b61030f7f0000000000000000000000003a65cbaebbfecbea5d0cb523ab56fdbda7ff9aaa81565b6103646106773660046129c0565b610eea565b61034e60115481565b61034e610f0f565b61034e600881565b6103646106a3366004612985565b610f27565b61030f7f00000000000000000000000054a00da65c79ddce24e7fe4691737fd70f7797df81565b60006001600160e01b03198216637965db0b60e01b148061070057506301ffc9a760e01b6001600160e01b03198316145b92915050565b600080516020612d1783398151915261071e81610fa3565b60006011544261072e9190612b27565b600f5460105460405163d2fbdc0d60e01b81526004810191909152602481018390529192506001600160a01b03169063d2fbdc0d90604401600060405180830381600087803b15801561078057600080fd5b505af1158015610794573d6000803e3d6000fd5b505050507f63a64e7a40c0e2a36c53dc32093800983ae4f85819b9f357a5014138e10c5c3b816040516107c991815260200190565b60405180910390a15050565b6001546001600160a01b03163314610800576040516304d6e46b60e31b815260040160405180910390fd5b610808610fad565b61081e818361081960008551611076565b6110f5565b5050565b600080516020612d1783398151915261083a81610fa3565b61084483836111f6565b505050565b600080516020612d1783398151915261086181610fa3565b61084483836116f1565b60008281526020819052604090206001015461088681610fa3565b6108908383611a0d565b50505050565b600080516020612d178339815191526108ae81610fa3565b61081e82611a9f565b6001600160a01b03811633146108e05760405163334bd91960e11b815260040160405180910390fd5b6108448282611ada565b600381600581106108fa57600080fd5b01546001600160a01b0316905081565b600061091581610fa3565b6001600160a01b03821661093c5760405163d92e233d60e01b815260040160405180910390fd5b600d80546001600160a01b0319166001600160a01b0384169081179091556040519081527f6536690106168bdf4ba72c128a053d817999b1db90cae23f139b293bf862cb75906020016107c9565b6008816005811061099a57600080fd5b0154905081565b60006109ac81610fa3565b6001600160a01b0382166109d35760405163d92e233d60e01b815260040160405180910390fd5b600180546001600160a01b0319166001600160a01b0384169081179091556040519081527ffa639b2012458fd129b4bf30b2a98c9b56cc3a9ba0606013b8d1f9232cb4498a906020016107c9565b6001546000906001600160a01b03163314610a4f576040516304d6e46b60e31b815260040160405180910390fd5b6000610a5a84611b45565b9050610a67836000610ca4565b811015610a78576000915050610be7565b60408051600580825260c082019092526000916020820160a08036833701905050905060005b6005811015610b6f57600060038260058110610abc57610abc612b3a565b01546001600160a01b031614610b6f5760038160058110610adf57610adf612b3a565b01546040516370a0823160e01b81523060048201526001600160a01b03909116906370a0823190602401602060405180830381865afa158015610b26573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b4a9190612b50565b828281518110610b5c57610b5c612b3a565b6020908102919091010152600101610a9e565b5081600e6000828254610b829190612b69565b90915550610b94905082856000611c03565b6040805160a0810191829052610be091610bd9919060039060059082845b81546001600160a01b03168152600190910190602001808311610bb2575050505050611c6d565b87836110f5565b6001925050505b9392505050565b6001546001600160a01b03163314610c19576040516304d6e46b60e31b815260040160405180910390fd5b610c27600e54826001611c03565b6000600e556040805160a0810191829052600380546001600160a01b03168252610c7892610c6b929190600590600460208501808311610bb2575050505050611c6d565b3361081960006005611076565b50565b6000918252602082815260408084206001600160a01b0393909316845291905290205460ff1690565b60007f0000000000000000000000003a65cbaebbfecbea5d0cb523ab56fdbda7ff9aaa6001600160a01b0316633db06dd8610cde85611ceb565b846040518363ffffffff1660e01b8152600401610cfc929190612bb8565b602060405180830381865afa158015610d19573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610be79190612b50565b6000610d4881610fa3565b6040516370a0823160e01b81523060048201526000906001600160a01b038416906370a0823190602401602060405180830381865afa158015610d8f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610db39190612b50565b90508015610844576108446001600160a01b0384163383611d3b565b6001546000906001600160a01b03163314610dfd576040516304d6e46b60e31b815260040160405180910390fd5b6000610e0883611d9a565b90506000610e1584611e62565b905080600e6000828254610e299190612b27565b90915550610e38905081611ea5565b9250610e4382611ec2565b831015610e6357604051630224f5df60e11b815260040160405180910390fd5b5050919050565b6000610e7581610fa3565b6001600160a01b038216610e9c5760405163d92e233d60e01b815260040160405180910390fd5b601480546001600160a01b0319166001600160a01b0384169081179091556040519081527f18f0ece2d6ea55163aef7a7c841762e706a96c532ed665e8abefaa00d1767fb8906020016107c9565b600082815260208190526040902060010154610f0581610fa3565b6108908383611ada565b6000610f22610f1d600e5490565b611ea5565b905090565b6000610f3281610fa3565b600082118015610f4457506127108211155b610f6157604051633f6fccb560e01b815260040160405180910390fd5b60025460408051918252602082018490527f785f467195f308c252d89e7e85c95a6b7646506ba4774a1dc54e0eedc08e3d43910160405180910390a150600255565b610c788133611ed7565b600f546001600160a01b0316610fbf57565b600f5460405163a4698feb60e01b8152600160048201526001600160a01b039091169063a4698feb90602401600060405180830381600087803b15801561100557600080fd5b505af1925050508015611016575060015b61107457600f5460405163a4698feb60e01b8152600060048201526001600160a01b039091169063a4698feb90602401600060405180830381600087803b15801561106057600080fd5b505af1158015610890573d6000803e3d6000fd5b565b60608167ffffffffffffffff81111561109157611091612877565b6040519080825280602002602001820160405280156110ba578160200160208202803683370190505b50905060005b828110156110ee57838282815181106110db576110db612b3a565b60209081029190910101526001016110c0565b5092915050565b60008060005b85518110156111ee5785818151811061111657611116612b3a565b6020026020010151915060006001600160a01b0316826001600160a01b031603156111ee5783818151811061114d5761114d612b3a565b60209081029190910101516040516370a0823160e01b81523060048201526001600160a01b038416906370a0823190602401602060405180830381865afa15801561119c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111c09190612b50565b6111ca9190612b69565b925082156111e6576111e66001600160a01b0383168685611d3b565b6001016110fb565b505050505050565b600061120183611b45565b905080600e60008282546112159190612b69565b909155506112239050611f10565b670de0b6b3a764000083146112d0576040516370a0823160e01b81523060048201526112d09082906001600160a01b037f0000000000000000000000003a65cbaebbfecbea5d0cb523ab56fdbda7ff9aaa16906370a08231906024015b602060405180830381865afa15801561129d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112c19190612b50565b6112cb9190612b69565b611f7e565b604051630d2680e960e11b81526004810182905260006024820181905260448201819052907f0000000000000000000000003a65cbaebbfecbea5d0cb523ab56fdbda7ff9aaa6001600160a01b031690631a4d01d2906064016020604051808303816000875af1158015611348573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061136c9190612b50565b90506113c26001600160a01b037f000000000000000000000000c2e660c62f72c2ad35ace6db78a616215e2f2222167f00000000000000000000000054a00da65c79ddce24e7fe4691737fd70f7797df8361218e565b6040805160a081018252600080825260208201819052818301819052606082018190526080820152905163ca54be3b60e01b81526001600160a01b037f00000000000000000000000054a00da65c79ddce24e7fe4691737fd70f7797df169163ca54be3b916114379185913090600401612bff565b600060405180830381600087803b15801561145157600080fd5b505af1158015611465573d6000803e3d6000fd5b50506012546040516370a0823160e01b8152306004820152600093506001600160a01b0390911691506370a0823190602401602060405180830381865afa1580156114b4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114d89190612b50565b905080156115a5576014546012546114fd916001600160a01b03918216911683611d3b565b6014546012546013546001600160a01b0392831692631a378db792811691168461152681611ec2565b6040516001600160e01b031960e087901b1681526001600160a01b039485166004820152939092166024840152604483015260648201526084016020604051808303816000875af115801561157f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115a39190612b50565b505b6013546040516370a0823160e01b81523060048201526000916001600160a01b0316906370a0823190602401602060405180830381865afa1580156115ee573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116129190612b50565b90508481101561163557604051632ca2f52b60e11b815260040160405180910390fd5b60408051600880825261012082019092526000916020820161010080368337019050509050818160016001600160801b03168151811061167757611677612b3a565b60209081029190910101526013546116b9906001600160a01b03167f0000000000000000000000003a65cbaebbfecbea5d0cb523ab56fdbda7ff9aaa8461218e565b60006116c482612218565b905080600e60008282546116d89190612b27565b909155506116e7905081611f7e565b5050505050505050565b60006116fc83611b45565b905080600e60008282546117109190612b69565b9091555061171e9050611f10565b670de0b6b3a7640000831461177f576040516370a0823160e01b815230600482015261177f9082906001600160a01b037f0000000000000000000000003a65cbaebbfecbea5d0cb523ab56fdbda7ff9aaa16906370a0823190602401611280565b604051630d2680e960e11b81526004810182905260016024820152600060448201819052907f0000000000000000000000003a65cbaebbfecbea5d0cb523ab56fdbda7ff9aaa6001600160a01b031690631a4d01d2906064016020604051808303816000875af11580156117f7573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061181b9190612b50565b601354909150611855906001600160a01b03167f00000000000000000000000054a00da65c79ddce24e7fe4691737fd70f7797df8361218e565b60007f00000000000000000000000054a00da65c79ddce24e7fe4691737fd70f7797df6001600160a01b0316632d62af2f6040518060a001604052806000815260200185815260200160008152602001600081526020016000815250306040518363ffffffff1660e01b81526004016118cf929190612c2c565b6020604051808303816000875af11580156118ee573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119129190612b50565b90508381101561193557604051632ca2f52b60e11b815260040160405180910390fd5b60408051600880825261012082019092526000916020820161010080368337019050509050818160006001600160801b03168151811061197757611977612b3a565b60209081029190910101526119d66001600160a01b037f000000000000000000000000c2e660c62f72c2ad35ace6db78a616215e2f2222167f0000000000000000000000003a65cbaebbfecbea5d0cb523ab56fdbda7ff9aaa8461218e565b60006119e182612218565b905080600e60008282546119f59190612b27565b90915550611a04905081611f7e565b50505050505050565b6000611a198383610c7b565b611a97576000838152602081815260408083206001600160a01b03861684529091529020805460ff19166001179055611a4f3390565b6001600160a01b0316826001600160a01b0316847f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a4506001610700565b506000610700565b60118190556040518181527f57753a889d1830ec176a512e55838bca3500c644653db868d60d1328b02a7ae89060200160405180910390a150565b6000611ae68383610c7b565b15611a97576000838152602081815260408083206001600160a01b0386168085529252808320805460ff1916905551339286917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a4506001610700565b60008082118015611b5e5750670de0b6b3a76400008211155b611ba75760405162461bcd60e51b815260206004820152601560248201527457726f6e6720506f6f6c546f6b656e20526174696f60581b60448201526064015b60405180910390fd5b600082118015611bbf5750670de0b6b3a76400008211155b611bdc57604051634aa3778b60e01b815260040160405180910390fd5b670de0b6b3a764000082611bef600e5490565b611bf99190612c52565b6107009190612c69565b611c0b611f10565b80611c62576040516370a0823160e01b8152306004820152611c629084906001600160a01b037f0000000000000000000000003a65cbaebbfecbea5d0cb523ab56fdbda7ff9aaa16906370a0823190602401611280565b6108448383836122ac565b60408051600580825260c082019092526060916020820160a08036833701905050905060005b6005811015611ce557828160058110611cae57611cae612b3a565b6020020151828281518110611cc557611cc5612b3a565b6001600160a01b0390921660209283029190910190910152600101611c93565b50919050565b604080516008808252610120820190925260609160009190602082016101008036833750508451825192935091839150600090611d2a57611d2a612b3a565b602090810291909101015292915050565b6040516001600160a01b0383811660248301526044820183905261084491859182169063a9059cbb906064015b604051602081830303815290604052915060e01b6020820180516001600160e01b038381831617835250505050612360565b6000805b6005811015611ce557600060038260058110611dbc57611dbc612b3a565b01546001600160a01b0316905080611dd45750611ce5565b670de0b6b3a764000060088360058110611df057611df0612b3a565b0154858460058110611e0457611e04612b3a565b6020020151611e2f60038660058110611e1f57611e1f612b3a565b01546001600160a01b03166123c3565b611e399190612c52565b611e439190612c52565b611e4d9190612c69565b611e579084612b27565b925050600101611d9e565b600080611e8f7f0000000000000000000000003a65cbaebbfecbea5d0cb523ab56fdbda7ff9aaa846124f9565b9050611e9a81612218565b9150611ce582611f7e565b6000670de0b6b3a7640000611eb86125a5565b611bf99084612c52565b6000612710600254612710611eb89190612b69565b611ee18282610c7b565b61081e5760405163e2517d3f60e01b81526001600160a01b038216600482015260248101839052604401611b9e565b600f54601054604051634ab794a360e01b81526001600160a01b0390921691634ab794a391611f459160040190815260200190565b600060405180830381600087803b158015611f5f57600080fd5b505af1158015611f73573d6000803e3d6000fd5b505060006010555050565b600f546001600160a01b031661205957604051639abbdf4b60e01b81527f000000000000000000000000000000000000000000000000000000000000004b60048201527f000000000000000000000000d8bd5cdd145ed2197cb16ddb172df954e3f286596001600160a01b031690639abbdf4b906024016020604051808303816000875af1158015612014573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906120389190612c8b565b600f80546001600160a01b0319166001600160a01b03929092169190911790555b600f54612093906001600160a01b037f0000000000000000000000003a65cbaebbfecbea5d0cb523ab56fdbda7ff9aaa811691168361218e565b60105460000361211d57600f5460115460405163a41ce7e960e01b81526004810184905260248101919091526001600160a01b039091169063a41ce7e9906044016020604051808303816000875af11580156120f3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906121179190612b50565b60105550565b600f54601054604051630687c4bd60e01b81526001600160a01b0390921691630687c4bd91612159918590600401918252602082015260400190565b600060405180830381600087803b15801561217357600080fd5b505af1158015612187573d6000803e3d6000fd5b5050505050565b604051636eb1769f60e11b81523060048201526001600160a01b0383811660248301526000919085169063dd62ed3e90604401602060405180830381865afa1580156121de573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906122029190612b50565b905061089084846122138585612b27565b6125d0565b604051635b96faef60e11b81526000906001600160a01b037f0000000000000000000000003a65cbaebbfecbea5d0cb523ab56fdbda7ff9aaa169063b72df5de906122699085908590600401612ca8565b6020604051808303816000875af1158015612288573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107009190612b50565b6000807f0000000000000000000000003a65cbaebbfecbea5d0cb523ab56fdbda7ff9aaa6001600160a01b0316631a4d01d28683878160200201516040516001600160e01b031960e086901b1681526004810193909352600f9190910b602483015260448201526064016020604051808303816000875af1158015612335573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906123599190612b50565b9050612187565b60006123756001600160a01b03841683612660565b9050805160001415801561239a5750808060200190518101906123989190612cca565b155b1561084457604051635274afe760e01b81526001600160a01b0384166004820152602401611b9e565b600073c02aaa39b223fe8d0a0e5c4f27ead9083c756cc1196001600160a01b038316016123f95750670de0b6b3a7640000919050565b600d54604051638b2f0f4f60e01b815273eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee60048201526001600160a01b0390911690638b2f0f4f90602401602060405180830381865afa158015612455573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906124799190612b50565b600d54604051638b2f0f4f60e01b81526001600160a01b03858116600483015290911690638b2f0f4f90602401602060405180830381865afa1580156124c3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906124e79190612b50565b611bf990670de0b6b3a7640000612c52565b60408051600880825261012082019092526060916000919060208201610100803683375050845182519293509183915060009061253857612538612b3a565b602002602001018181525050610be7848260006001600160801b03168151811061256457612564612b3a565b60200260200101517f000000000000000000000000c2e660c62f72c2ad35ace6db78a616215e2f22226001600160a01b031661218e9092919063ffffffff16565b6000610f227f0000000000000000000000003a65cbaebbfecbea5d0cb523ab56fdbda7ff9aaa6123c3565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663095ea7b360e01b179052612621848261266e565b610890576040516001600160a01b0384811660248301526000604483015261265691869182169063095ea7b390606401611d68565b6108908482612360565b6060610be783836000612716565b6000806000846001600160a01b03168460405161268b9190612ce7565b6000604051808303816000865af19150503d80600081146126c8576040519150601f19603f3d011682016040523d82523d6000602084013e6126cd565b606091505b50915091508180156126f75750805115806126f75750808060200190518101906126f79190612cca565b801561270d57506000856001600160a01b03163b115b95945050505050565b60608147101561273b5760405163cd78605960e01b8152306004820152602401611b9e565b600080856001600160a01b031684866040516127579190612ce7565b60006040518083038185875af1925050503d8060008114612794576040519150601f19603f3d011682016040523d82523d6000602084013e612799565b606091505b50915091506127a98683836127b3565b9695505050505050565b6060826127c8576127c38261280f565b610be7565b81511580156127df57506001600160a01b0384163b155b1561280857604051639996b31560e01b81526001600160a01b0385166004820152602401611b9e565b5080610be7565b80511561281f5780518082602001fd5b604051630a12f52160e11b815260040160405180910390fd5b60006020828403121561284a57600080fd5b81356001600160e01b031981168114610be757600080fd5b6001600160a01b0381168114610c7857600080fd5b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f1916810167ffffffffffffffff811182821017156128b6576128b6612877565b604052919050565b600080604083850312156128d157600080fd5b82356128dc81612862565b915060208381013567ffffffffffffffff808211156128fa57600080fd5b818601915086601f83011261290e57600080fd5b81358181111561292057612920612877565b8060051b915061293184830161288d565b818152918301840191848101908984111561294b57600080fd5b938501935b83851015612975578435925061296583612862565b8282529385019390850190612950565b8096505050505050509250929050565b60006020828403121561299757600080fd5b5035919050565b600080604083850312156129b157600080fd5b50508035926020909101359150565b600080604083850312156129d357600080fd5b8235915060208301356129e581612862565b809150509250929050565b600060208284031215612a0257600080fd5b8135610be781612862565b600082601f830112612a1e57600080fd5b60405160a0810181811067ffffffffffffffff82111715612a4157612a41612877565b6040528060a0840185811115612a5657600080fd5b845b81811015612a70578035835260209283019201612a58565b509195945050505050565b600080600060e08486031215612a9057600080fd5b8335612a9b81612862565b925060208401359150612ab18560408601612a0d565b90509250925092565b600060a08284031215612acc57600080fd5b610be78383612a0d565b8015158114610c7857600080fd5b60008060c08385031215612af757600080fd5b612b018484612a0d565b915060a08301356129e581612ad6565b634e487b7160e01b600052601160045260246000fd5b8082018082111561070057610700612b11565b634e487b7160e01b600052603260045260246000fd5b600060208284031215612b6257600080fd5b5051919050565b8181038181111561070057610700612b11565b60008151808452602080850194506020840160005b83811015612bad57815187529582019590820190600101612b91565b509495945050505050565b604081526000612bcb6040830185612b7c565b905082151560208301529392505050565b8060005b6005811015610890578151845260209384019390910190600101612be0565b83815260e08101612c136020830185612bdc565b6001600160a01b039290921660c0919091015292915050565b60c08101612c3a8285612bdc565b6001600160a01b039290921660a09190910152919050565b808202811582820484141761070057610700612b11565b600082612c8657634e487b7160e01b600052601260045260246000fd5b500490565b600060208284031215612c9d57600080fd5b8151610be781612862565b604081526000612cbb6040830185612b7c565b90508260208301529392505050565b600060208284031215612cdc57600080fd5b8151610be781612ad6565b6000825160005b81811015612d085760208186018101518583015201612cee565b50600092019182525091905056fe5358bcfd81d1ef3da152b1755e1c3c6739686fa7e83dbcad0071568cc4b73a63a26469706673582212206dc4ca97df0f43f6d3884360041c5d0dfeb592ad31cfb784b6f1077469d7bb4264736f6c63430008170033
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 27 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
Loading...
Loading
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.