Polygon Sponsored slots available. Book your slot here!
Contract Overview
Balance:
0 MATIC
MATIC Value:
$0.00
My Name Tag:
Not Available, login to update
Txn Hash |
Method
|
Block
|
From
|
To
|
Value | [Txn Fee] | |||
---|---|---|---|---|---|---|---|---|---|
0xb6f9836a34f03bee0850f61e7f9b6ff40e62ecb52f9980ab31744509bb41c8cd | 0x60c06040 | 31243739 | 245 days 16 hrs ago | 0x07883ebd6f178420f24969279bd425ab0b99f10b | IN | Create: UniV2Validator | 0 MATIC | 0.05802376595 |
[ Download CSV Export ]
Contract Name:
UniV2Validator
Compiler Version
v0.8.9+commit.e5eed63a
Contract Source Code (Solidity Standard Json-Input format)
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.0 (access/IAccessControl.sol) pragma solidity ^0.8.0; /** * @dev External interface of AccessControl declared to support ERC165 detection. */ interface IAccessControl { /** * @dev Emitted when `newAdminRole` is set as ``role``'s admin role, replacing `previousAdminRole` * * `DEFAULT_ADMIN_ROLE` is the starting admin for all roles, despite * {RoleAdminChanged} not being emitted signaling this. * * _Available since v3.1._ */ event RoleAdminChanged(bytes32 indexed role, bytes32 indexed previousAdminRole, bytes32 indexed newAdminRole); /** * @dev Emitted when `account` is granted `role`. * * `sender` is the account that originated the contract call, an admin role * bearer except when using {AccessControl-_setupRole}. */ event RoleGranted(bytes32 indexed role, address indexed account, address indexed sender); /** * @dev Emitted when `account` is revoked `role`. * * `sender` is the account that originated the contract call: * - if using `revokeRole`, it is the admin role bearer * - if using `renounceRole`, it is the role bearer (i.e. `account`) */ event RoleRevoked(bytes32 indexed role, address indexed account, address indexed sender); /** * @dev Returns `true` if `account` has been granted `role`. */ function hasRole(bytes32 role, address account) external view returns (bool); /** * @dev Returns the admin role that controls `role`. See {grantRole} and * {revokeRole}. * * To change a role's admin, use {AccessControl-_setRoleAdmin}. */ function getRoleAdmin(bytes32 role) external view returns (bytes32); /** * @dev Grants `role` to `account`. * * If `account` had not been already granted `role`, emits a {RoleGranted} * event. * * Requirements: * * - the caller must have ``role``'s admin role. */ function grantRole(bytes32 role, address account) external; /** * @dev Revokes `role` from `account`. * * If `account` had been granted `role`, emits a {RoleRevoked} event. * * Requirements: * * - the caller must have ``role``'s admin role. */ function revokeRole(bytes32 role, address account) external; /** * @dev Revokes `role` from the calling account. * * Roles are often managed via {grantRole} and {revokeRole}: this function's * purpose is to provide a mechanism for accounts to lose their privileges * if they are compromised (such as when a trusted device is misplaced). * * If the calling account had been granted `role`, emits a {RoleRevoked} * event. * * Requirements: * * - the caller must be `account`. */ function renounceRole(bytes32 role, address account) external; }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.0 (access/IAccessControlEnumerable.sol) pragma solidity ^0.8.0; import "./IAccessControl.sol"; /** * @dev External interface of AccessControlEnumerable declared to support ERC165 detection. */ interface IAccessControlEnumerable is IAccessControl { /** * @dev Returns one of the accounts that have `role`. `index` must be a * value between 0 and {getRoleMemberCount}, non-inclusive. * * Role bearers are not sorted in any particular way, and their ordering may * change at any point. * * WARNING: When using {getRoleMember} and {getRoleMemberCount}, make sure * you perform all queries on the same block. See the following * https://forum.openzeppelin.com/t/iterating-over-elements-on-enumerableset-in-openzeppelin-contracts/2296[forum post] * for more information. */ function getRoleMember(bytes32 role, uint256 index) external view returns (address); /** * @dev Returns the number of accounts that have `role`. Can be used * together with {getRoleMember} to enumerate all bearers of a role. */ function getRoleMemberCount(bytes32 role) external view returns (uint256); }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.0 (token/ERC721/IERC721.sol) pragma solidity ^0.8.0; import "../../utils/introspection/IERC165.sol"; /** * @dev Required interface of an ERC721 compliant contract. */ interface IERC721 is IERC165 { /** * @dev Emitted when `tokenId` token is transferred from `from` to `to`. */ event Transfer(address indexed from, address indexed to, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables `approved` to manage the `tokenId` token. */ event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets. */ event ApprovalForAll(address indexed owner, address indexed operator, bool approved); /** * @dev Returns the number of tokens in ``owner``'s account. */ function balanceOf(address owner) external view returns (uint256 balance); /** * @dev Returns the owner of the `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function ownerOf(uint256 tokenId) external view returns (address owner); /** * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients * are aware of the ERC721 protocol to prevent tokens from being forever locked. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be have been allowed to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Transfers `tokenId` token from `from` to `to`. * * WARNING: Usage of this method is discouraged, use {safeTransferFrom} whenever possible. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * * Emits a {Transfer} event. */ function transferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Gives permission to `to` to transfer `tokenId` token to another account. * The approval is cleared when the token is transferred. * * Only a single account can be approved at a time, so approving the zero address clears previous approvals. * * Requirements: * * - The caller must own the token or be an approved operator. * - `tokenId` must exist. * * Emits an {Approval} event. */ function approve(address to, uint256 tokenId) external; /** * @dev Returns the account approved for `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function getApproved(uint256 tokenId) external view returns (address operator); /** * @dev Approve or remove `operator` as an operator for the caller. * Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller. * * Requirements: * * - The `operator` cannot be the caller. * * Emits an {ApprovalForAll} event. */ function setApprovalForAll(address operator, bool _approved) external; /** * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`. * * See {setApprovalForAll} */ function isApprovedForAll(address owner, address operator) external view returns (bool); /** * @dev Safely transfers `tokenId` token from `from` to `to`. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes calldata data ) external; }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.0 (utils/introspection/ERC165.sol) pragma solidity ^0.8.0; import "./IERC165.sol"; /** * @dev Implementation of the {IERC165} interface. * * Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check * for the additional interface id that will be supported. For example: * * ```solidity * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { * return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId); * } * ``` * * Alternatively, {ERC165Storage} provides an easier to use but more expensive implementation. */ abstract contract ERC165 is IERC165 { /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { return interfaceId == type(IERC165).interfaceId; } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.0 (utils/introspection/IERC165.sol) pragma solidity ^0.8.0; /** * @dev Interface of the ERC165 standard, as defined in the * https://eips.ethereum.org/EIPS/eip-165[EIP]. * * Implementers can declare support of contract interfaces, which can then be * queried by others ({ERC165Checker}). * * For an implementation, see {ERC165}. */ interface IERC165 { /** * @dev Returns true if this contract implements the interface defined by * `interfaceId`. See the corresponding * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section] * to learn more about how these ids are created. * * This function call must use less than 30 000 gas. */ function supportsInterface(bytes4 interfaceId) external view returns (bool); }
// SPDX-License-Identifier: MIT pragma solidity 0.8.9; import "./utils/IDefaultAccessControl.sol"; import "./IUnitPricesGovernance.sol"; interface IProtocolGovernance is IDefaultAccessControl, IUnitPricesGovernance { /// @notice CommonLibrary protocol params. /// @param maxTokensPerVault Max different token addresses that could be managed by the vault /// @param governanceDelay The delay (in secs) that must pass before setting new pending params to commiting them /// @param protocolTreasury The address that collects protocolFees, if protocolFee is not zero /// @param forceAllowMask If a permission bit is set in this mask it forces all addresses to have this permission as true /// @param withdrawLimit Withdraw limit (in unit prices, i.e. usd) struct Params { uint256 maxTokensPerVault; uint256 governanceDelay; address protocolTreasury; uint256 forceAllowMask; uint256 withdrawLimit; } // ------------------- EXTERNAL, VIEW ------------------- /// @notice Timestamp after which staged granted permissions for the given address can be committed. /// @param target The given address /// @return Zero if there are no staged permission grants, timestamp otherwise function stagedPermissionGrantsTimestamps(address target) external view returns (uint256); /// @notice Staged granted permission bitmask for the given address. /// @param target The given address /// @return Bitmask function stagedPermissionGrantsMasks(address target) external view returns (uint256); /// @notice Permission bitmask for the given address. /// @param target The given address /// @return Bitmask function permissionMasks(address target) external view returns (uint256); /// @notice Timestamp after which staged pending protocol parameters can be committed /// @return Zero if there are no staged parameters, timestamp otherwise. function stagedParamsTimestamp() external view returns (uint256); /// @notice Staged pending protocol parameters. function stagedParams() external view returns (Params memory); /// @notice Current protocol parameters. function params() external view returns (Params memory); /// @notice Addresses for which non-zero permissions are set. function permissionAddresses() external view returns (address[] memory); /// @notice Permission addresses staged for commit. function stagedPermissionGrantsAddresses() external view returns (address[] memory); /// @notice Return all addresses where rawPermissionMask bit for permissionId is set to 1. /// @param permissionId Id of the permission to check. /// @return A list of dirty addresses. function addressesByPermission(uint8 permissionId) external view returns (address[] memory); /// @notice Checks if address has permission or given permission is force allowed for any address. /// @param addr Address to check /// @param permissionId Permission to check function hasPermission(address addr, uint8 permissionId) external view returns (bool); /// @notice Checks if address has all permissions. /// @param target Address to check /// @param permissionIds A list of permissions to check function hasAllPermissions(address target, uint8[] calldata permissionIds) external view returns (bool); /// @notice Max different ERC20 token addresses that could be managed by the protocol. function maxTokensPerVault() external view returns (uint256); /// @notice The delay for committing any governance params. function governanceDelay() external view returns (uint256); /// @notice The address of the protocol treasury. function protocolTreasury() external view returns (address); /// @notice Permissions mask which defines if ordinary permission should be reverted. /// This bitmask is xored with ordinary mask. function forceAllowMask() external view returns (uint256); /// @notice Withdraw limit per token per block. /// @param token Address of the token /// @return Withdraw limit per token per block function withdrawLimit(address token) external view returns (uint256); /// @notice Addresses that has staged validators. function stagedValidatorsAddresses() external view returns (address[] memory); /// @notice Timestamp after which staged granted permissions for the given address can be committed. /// @param target The given address /// @return Zero if there are no staged permission grants, timestamp otherwise function stagedValidatorsTimestamps(address target) external view returns (uint256); /// @notice Staged validator for the given address. /// @param target The given address /// @return Validator function stagedValidators(address target) external view returns (address); /// @notice Addresses that has validators. function validatorsAddresses() external view returns (address[] memory); /// @notice Address that has validators. /// @param i The number of address /// @return Validator address function validatorsAddress(uint256 i) external view returns (address); /// @notice Validator for the given address. /// @param target The given address /// @return Validator function validators(address target) external view returns (address); // ------------------- EXTERNAL, MUTATING, GOVERNANCE, IMMEDIATE ------------------- /// @notice Rollback all staged validators. function rollbackStagedValidators() external; /// @notice Revoke validator instantly from the given address. /// @param target The given address function revokeValidator(address target) external; /// @notice Stages a new validator for the given address /// @param target The given address /// @param validator The validator for the given address function stageValidator(address target, address validator) external; /// @notice Commits validator for the given address. /// @dev Reverts if governance delay has not passed yet. /// @param target The given address. function commitValidator(address target) external; /// @notice Commites all staged validators for which governance delay passed /// @return Addresses for which validators were committed function commitAllValidatorsSurpassedDelay() external returns (address[] memory); /// @notice Rollback all staged granted permission grant. function rollbackStagedPermissionGrants() external; /// @notice Commits permission grants for the given address. /// @dev Reverts if governance delay has not passed yet. /// @param target The given address. function commitPermissionGrants(address target) external; /// @notice Commites all staged permission grants for which governance delay passed. /// @return An array of addresses for which permission grants were committed. function commitAllPermissionGrantsSurpassedDelay() external returns (address[] memory); /// @notice Revoke permission instantly from the given address. /// @param target The given address. /// @param permissionIds A list of permission ids to revoke. function revokePermissions(address target, uint8[] memory permissionIds) external; /// @notice Commits staged protocol params. /// Reverts if governance delay has not passed yet. function commitParams() external; // ------------------- EXTERNAL, MUTATING, GOVERNANCE, DELAY ------------------- /// @notice Sets new pending params that could have been committed after governance delay expires. /// @param newParams New protocol parameters to set. function stageParams(Params memory newParams) external; /// @notice Stage granted permissions that could have been committed after governance delay expires. /// Resets commit delay and permissions if there are already staged permissions for this address. /// @param target Target address /// @param permissionIds A list of permission ids to grant function stagePermissionGrants(address target, uint8[] memory permissionIds) external; }
// SPDX-License-Identifier: MIT pragma solidity 0.8.9; import "@openzeppelin/contracts/utils/introspection/IERC165.sol"; import "./utils/IDefaultAccessControl.sol"; interface IUnitPricesGovernance is IDefaultAccessControl, IERC165 { // ------------------- EXTERNAL, VIEW ------------------- /// @notice Estimated amount of token worth 1 USD staged for commit. /// @param token Address of the token /// @return The amount of token function stagedUnitPrices(address token) external view returns (uint256); /// @notice Timestamp after which staged unit prices for the given token can be committed. /// @param token Address of the token /// @return Timestamp function stagedUnitPricesTimestamps(address token) external view returns (uint256); /// @notice Estimated amount of token worth 1 USD. /// @param token Address of the token /// @return The amount of token function unitPrices(address token) external view returns (uint256); // ------------------- EXTERNAL, MUTATING ------------------- /// @notice Stage estimated amount of token worth 1 USD staged for commit. /// @param token Address of the token /// @param value The amount of token function stageUnitPrice(address token, uint256 value) external; /// @notice Reset staged value /// @param token Address of the token function rollbackUnitPrice(address token) external; /// @notice Commit staged unit price /// @param token Address of the token function commitUnitPrice(address token) external; }
// SPDX-License-Identifier: MIT pragma solidity =0.8.9; import "@openzeppelin/contracts/token/ERC721/IERC721.sol"; import "./IProtocolGovernance.sol"; interface IVaultRegistry is IERC721 { /// @notice Get Vault for the giver NFT ID. /// @param nftId NFT ID /// @return vault Address of the Vault contract function vaultForNft(uint256 nftId) external view returns (address vault); /// @notice Get NFT ID for given Vault contract address. /// @param vault Address of the Vault contract /// @return nftId NFT ID function nftForVault(address vault) external view returns (uint256 nftId); /// @notice Checks if the nft is locked for all transfers /// @param nft NFT to check for lock /// @return `true` if locked, false otherwise function isLocked(uint256 nft) external view returns (bool); /// @notice Register new Vault and mint NFT. /// @param vault address of the vault /// @param owner owner of the NFT /// @return nft Nft minted for the given Vault function registerVault(address vault, address owner) external returns (uint256 nft); /// @notice Number of Vaults registered. function vaultsCount() external view returns (uint256); /// @notice All Vaults registered. function vaults() external view returns (address[] memory); /// @notice Address of the ProtocolGovernance. function protocolGovernance() external view returns (IProtocolGovernance); /// @notice Address of the staged ProtocolGovernance. function stagedProtocolGovernance() external view returns (IProtocolGovernance); /// @notice Minimal timestamp when staged ProtocolGovernance can be applied. function stagedProtocolGovernanceTimestamp() external view returns (uint256); /// @notice Stage new ProtocolGovernance. /// @param newProtocolGovernance new ProtocolGovernance function stageProtocolGovernance(IProtocolGovernance newProtocolGovernance) external; /// @notice Commit new ProtocolGovernance. function commitStagedProtocolGovernance() external; /// @notice Lock NFT for transfers /// @dev Use this method when vault structure is set up and should become immutable. Can be called by owner. /// @param nft - NFT to lock function lockNft(uint256 nft) external; }
// SPDX-License-Identifier: MIT pragma solidity 0.8.9; interface IUniswapV2Factory { function getPair(address token0, address token1) external view returns (address); }
// SPDX-License-Identifier: MIT pragma solidity >=0.6.2; interface IUniswapV2Router01 { function factory() external pure returns (address); function WETH() external pure returns (address); function addLiquidity( address tokenA, address tokenB, uint amountADesired, uint amountBDesired, uint amountAMin, uint amountBMin, address to, uint deadline ) external returns (uint amountA, uint amountB, uint liquidity); function addLiquidityETH( address token, uint amountTokenDesired, uint amountTokenMin, uint amountETHMin, address to, uint deadline ) external payable returns (uint amountToken, uint amountETH, uint liquidity); function removeLiquidity( address tokenA, address tokenB, uint liquidity, uint amountAMin, uint amountBMin, address to, uint deadline ) external returns (uint amountA, uint amountB); function removeLiquidityETH( address token, uint liquidity, uint amountTokenMin, uint amountETHMin, address to, uint deadline ) external returns (uint amountToken, uint amountETH); function removeLiquidityWithPermit( address tokenA, address tokenB, uint liquidity, uint amountAMin, uint amountBMin, address to, uint deadline, bool approveMax, uint8 v, bytes32 r, bytes32 s ) external returns (uint amountA, uint amountB); function removeLiquidityETHWithPermit( address token, uint liquidity, uint amountTokenMin, uint amountETHMin, address to, uint deadline, bool approveMax, uint8 v, bytes32 r, bytes32 s ) external returns (uint amountToken, uint amountETH); function swapExactTokensForTokens( uint amountIn, uint amountOutMin, address[] calldata path, address to, uint deadline ) external returns (uint[] memory amounts); function swapTokensForExactTokens( uint amountOut, uint amountInMax, address[] calldata path, address to, uint deadline ) external returns (uint[] memory amounts); function swapExactETHForTokens(uint amountOutMin, address[] calldata path, address to, uint deadline) external payable returns (uint[] memory amounts); function swapTokensForExactETH(uint amountOut, uint amountInMax, address[] calldata path, address to, uint deadline) external returns (uint[] memory amounts); function swapExactTokensForETH(uint amountIn, uint amountOutMin, address[] calldata path, address to, uint deadline) external returns (uint[] memory amounts); function swapETHForExactTokens(uint amountOut, address[] calldata path, address to, uint deadline) external payable returns (uint[] memory amounts); function quote(uint amountA, uint reserveA, uint reserveB) external pure returns (uint amountB); function getAmountOut(uint amountIn, uint reserveIn, uint reserveOut) external pure returns (uint amountOut); function getAmountIn(uint amountOut, uint reserveIn, uint reserveOut) external pure returns (uint amountIn); function getAmountsOut(uint amountIn, address[] calldata path) external view returns (uint[] memory amounts); function getAmountsIn(uint amountOut, address[] calldata path) external view returns (uint[] memory amounts); }
// SPDX-License-Identifier: BSL-1.1 pragma solidity 0.8.9; interface IContractMeta { function contractName() external view returns (string memory); function contractNameBytes() external view returns (bytes32); function contractVersion() external view returns (string memory); function contractVersionBytes() external view returns (bytes32); }
// SPDX-License-Identifier: MIT pragma solidity 0.8.9; import "@openzeppelin/contracts/access/IAccessControlEnumerable.sol"; interface IDefaultAccessControl is IAccessControlEnumerable { /// @notice Checks that the address is contract admin. /// @param who Address to check /// @return `true` if who is admin, `false` otherwise function isAdmin(address who) external view returns (bool); /// @notice Checks that the address is contract admin. /// @param who Address to check /// @return `true` if who is operator, `false` otherwise function isOperator(address who) external view returns (bool); }
// SPDX-License-Identifier: MIT pragma solidity 0.8.9; import "../IProtocolGovernance.sol"; interface IBaseValidator { /// @notice Validator parameters /// @param protocolGovernance Reference to Protocol Governance struct ValidatorParams { IProtocolGovernance protocolGovernance; } /// @notice Validator params staged to commit. function stagedValidatorParams() external view returns (ValidatorParams memory); /// @notice Timestamp after which validator params can be committed. function stagedValidatorParamsTimestamp() external view returns (uint256); /// @notice Current validator params. function validatorParams() external view returns (ValidatorParams memory); /// @notice Stage new validator params for commit. /// @param newParams New params for commit function stageValidatorParams(ValidatorParams calldata newParams) external; /// @notice Commit new validator params. function commitValidatorParams() external; }
// SPDX-License-Identifier: MIT pragma solidity 0.8.9; import "@openzeppelin/contracts/utils/introspection/IERC165.sol"; import "./IBaseValidator.sol"; interface IValidator is IBaseValidator, IERC165 { // @notice Validate if call can be made to external contract. // @dev Reverts if validation failed. Returns nothing if validation is ok // @param sender Sender of the externalCall method // @param addr Address of the called contract // @param value Ether value for the call // @param selector Selector of the called method // @param data Call data after selector function validate( address sender, address addr, uint256 value, bytes4 selector, bytes calldata data ) external view; }
// SPDX-License-Identifier: MIT pragma solidity 0.8.9; import "./IVaultGovernance.sol"; interface IVault is IERC165 { /// @notice Checks if the vault is initialized function initialized() external view returns (bool); /// @notice VaultRegistry NFT for this vault function nft() external view returns (uint256); /// @notice Address of the Vault Governance for this contract. function vaultGovernance() external view returns (IVaultGovernance); /// @notice ERC20 tokens under Vault management. function vaultTokens() external view returns (address[] memory); /// @notice Checks if a token is vault token /// @param token Address of the token to check /// @return `true` if this token is managed by Vault function isVaultToken(address token) external view returns (bool); /// @notice Total value locked for this contract. /// @dev Generally it is the underlying token value of this contract in some /// other DeFi protocol. For example, for USDC Yearn Vault this would be total USDC balance that could be withdrawn for Yearn to this contract. /// The tvl itself is estimated in some range. Sometimes the range is exact, sometimes it's not /// @return minTokenAmounts Lower bound for total available balances estimation (nth tokenAmount corresponds to nth token in vaultTokens) /// @return maxTokenAmounts Upper bound for total available balances estimation (nth tokenAmount corresponds to nth token in vaultTokens) function tvl() external view returns (uint256[] memory minTokenAmounts, uint256[] memory maxTokenAmounts); /// @notice Existential amounts for each token function pullExistentials() external view returns (uint256[] memory); }
// SPDX-License-Identifier: MIT pragma solidity 0.8.9; import "../IProtocolGovernance.sol"; import "../IVaultRegistry.sol"; import "./IVault.sol"; interface IVaultGovernance { /// @notice Internal references of the contract. /// @param protocolGovernance Reference to Protocol Governance /// @param registry Reference to Vault Registry struct InternalParams { IProtocolGovernance protocolGovernance; IVaultRegistry registry; IVault singleton; } // ------------------- EXTERNAL, VIEW ------------------- /// @notice Timestamp in unix time seconds after which staged Delayed Strategy Params could be committed. /// @param nft Nft of the vault function delayedStrategyParamsTimestamp(uint256 nft) external view returns (uint256); /// @notice Timestamp in unix time seconds after which staged Delayed Protocol Params could be committed. function delayedProtocolParamsTimestamp() external view returns (uint256); /// @notice Timestamp in unix time seconds after which staged Delayed Protocol Params Per Vault could be committed. /// @param nft Nft of the vault function delayedProtocolPerVaultParamsTimestamp(uint256 nft) external view returns (uint256); /// @notice Timestamp in unix time seconds after which staged Internal Params could be committed. function internalParamsTimestamp() external view returns (uint256); /// @notice Internal Params of the contract. function internalParams() external view returns (InternalParams memory); /// @notice Staged new Internal Params. /// @dev The Internal Params could be committed after internalParamsTimestamp function stagedInternalParams() external view returns (InternalParams memory); // ------------------- EXTERNAL, MUTATING ------------------- /// @notice Stage new Internal Params. /// @param newParams New Internal Params function stageInternalParams(InternalParams memory newParams) external; /// @notice Commit staged Internal Params. function commitInternalParams() external; }
// SPDX-License-Identifier: MIT pragma solidity 0.8.9; /// @notice Exceptions stores project`s smart-contracts exceptions library ExceptionsLibrary { string constant ADDRESS_ZERO = "AZ"; string constant VALUE_ZERO = "VZ"; string constant EMPTY_LIST = "EMPL"; string constant NOT_FOUND = "NF"; string constant INIT = "INIT"; string constant DUPLICATE = "DUP"; string constant NULL = "NULL"; string constant TIMESTAMP = "TS"; string constant FORBIDDEN = "FRB"; string constant ALLOWLIST = "ALL"; string constant LIMIT_OVERFLOW = "LIMO"; string constant LIMIT_UNDERFLOW = "LIMU"; string constant INVALID_VALUE = "INV"; string constant INVARIANT = "INVA"; string constant INVALID_TARGET = "INVTR"; string constant INVALID_TOKEN = "INVTO"; string constant INVALID_INTERFACE = "INVI"; string constant INVALID_SELECTOR = "INVS"; string constant INVALID_STATE = "INVST"; string constant INVALID_LENGTH = "INVL"; string constant LOCK = "LCKD"; string constant DISABLED = "DIS"; }
//SPDX-License-Identifier: MIT pragma solidity 0.8.9; /// @notice Stores permission ids for addresses library PermissionIdsLibrary { // The msg.sender is allowed to register vault uint8 constant REGISTER_VAULT = 0; // The msg.sender is allowed to create vaults uint8 constant CREATE_VAULT = 1; // The token is allowed to be transfered by vault uint8 constant ERC20_TRANSFER = 2; // The token is allowed to be added to vault uint8 constant ERC20_VAULT_TOKEN = 3; // Trusted protocols that are allowed to be approved of vault ERC20 tokens by any strategy uint8 constant ERC20_APPROVE = 4; // Trusted protocols that are allowed to be approved of vault ERC20 tokens by trusted strategy uint8 constant ERC20_APPROVE_RESTRICTED = 5; // Strategy allowed using restricted API uint8 constant TRUSTED_STRATEGY = 6; }
// SPDX-License-Identifier: BSL-1.1 pragma solidity 0.8.9; import "../interfaces/utils/IContractMeta.sol"; abstract contract ContractMeta is IContractMeta { // ------------------- EXTERNAL, VIEW ------------------- function contractName() external pure returns (string memory) { return _bytes32ToString(_contractName()); } function contractNameBytes() external pure returns (bytes32) { return _contractName(); } function contractVersion() external pure returns (string memory) { return _bytes32ToString(_contractVersion()); } function contractVersionBytes() external pure returns (bytes32) { return _contractVersion(); } // ------------------- INTERNAL, VIEW ------------------- function _contractName() internal pure virtual returns (bytes32); function _contractVersion() internal pure virtual returns (bytes32); function _bytes32ToString(bytes32 b) internal pure returns (string memory s) { s = new string(32); uint256 len = 32; for (uint256 i = 0; i < 32; ++i) { if (uint8(b[i]) == 0) { len = i; break; } } assembly { mstore(s, len) mstore(add(s, 0x20), b) } } }
// SPDX-License-Identifier: MIT pragma solidity 0.8.9; import "../interfaces/validators/IBaseValidator.sol"; import "../interfaces/IProtocolGovernance.sol"; import "../libraries/ExceptionsLibrary.sol"; contract BaseValidator is IBaseValidator { IBaseValidator.ValidatorParams internal _validatorParams; IBaseValidator.ValidatorParams internal _stagedValidatorParams; uint256 internal _stagedValidatorParamsTimestamp; constructor(IProtocolGovernance protocolGovernance) { _validatorParams = IBaseValidator.ValidatorParams({protocolGovernance: protocolGovernance}); } // ------------------- EXTERNAL, VIEW ------------------- /// @inheritdoc IBaseValidator function stagedValidatorParams() external view returns (ValidatorParams memory) { return _stagedValidatorParams; } /// @inheritdoc IBaseValidator function stagedValidatorParamsTimestamp() external view returns (uint256) { return _stagedValidatorParamsTimestamp; } /// @inheritdoc IBaseValidator function validatorParams() external view returns (ValidatorParams memory) { return _validatorParams; } // ------------------- EXTERNAL, MUTATING ------------------- /// @notice Stages params that could have been committed after governance delay expires. /// @param newParams Params to stage function stageValidatorParams(IBaseValidator.ValidatorParams calldata newParams) external { IProtocolGovernance governance = _validatorParams.protocolGovernance; require(governance.isAdmin(msg.sender), ExceptionsLibrary.FORBIDDEN); _stagedValidatorParams = newParams; _stagedValidatorParamsTimestamp = block.timestamp + governance.governanceDelay(); emit StagedValidatorParams(tx.origin, msg.sender, newParams, _stagedValidatorParamsTimestamp); } /// @notice Commits staged params function commitValidatorParams() external { require(_stagedValidatorParamsTimestamp != 0, ExceptionsLibrary.INVALID_STATE); IProtocolGovernance governance = _validatorParams.protocolGovernance; require(governance.isAdmin(msg.sender), ExceptionsLibrary.FORBIDDEN); require(block.timestamp >= _stagedValidatorParamsTimestamp, ExceptionsLibrary.TIMESTAMP); _validatorParams = _stagedValidatorParams; delete _stagedValidatorParams; delete _stagedValidatorParamsTimestamp; emit CommittedValidatorParams(tx.origin, msg.sender, _validatorParams); } /// @notice Emitted when new params are staged for commit /// @param origin Origin of the transaction (tx.origin) /// @param sender Sender of the call (msg.sender) /// @param newParams New params that were staged for commit /// @param when When the params could be committed event StagedValidatorParams( address indexed origin, address indexed sender, IBaseValidator.ValidatorParams newParams, uint256 when ); /// @notice Emitted when new params are staged for commit /// @param origin Origin of the transaction (tx.origin) /// @param sender Sender of the call (msg.sender) /// @param params New params that were staged for commit event CommittedValidatorParams( address indexed origin, address indexed sender, IBaseValidator.ValidatorParams params ); }
// SPDX-License-Identifier: MIT pragma solidity 0.8.9; import "../interfaces/external/univ2/IUniswapV2Factory.sol"; import "../interfaces/external/univ2/IUniswapV2Router01.sol"; import "../interfaces/IProtocolGovernance.sol"; import "../interfaces/vaults/IVault.sol"; import "../libraries/PermissionIdsLibrary.sol"; import "../libraries/ExceptionsLibrary.sol"; import "../utils/ContractMeta.sol"; import "./Validator.sol"; contract UniV2Validator is ContractMeta, Validator { struct TokenInput { uint256 amount; uint256 amountMax; address[] path; address to; uint256 deadline; } struct EthInput { uint256 amountMax; address[] path; address to; uint256 deadline; } bytes4 public constant EXACT_INPUT_SELECTOR = IUniswapV2Router01.swapExactTokensForTokens.selector; bytes4 public constant EXACT_OUTPUT_SELECTOR = IUniswapV2Router01.swapTokensForExactTokens.selector; bytes4 public constant EXACT_ETH_INPUT_SELECTOR = IUniswapV2Router01.swapExactETHForTokens.selector; bytes4 public constant EXACT_ETH_OUTPUT_SELECTOR = IUniswapV2Router01.swapTokensForExactETH.selector; bytes4 public constant EXACT_TOKENS_INPUT_SELECTOR = IUniswapV2Router01.swapExactTokensForETH.selector; bytes4 public constant EXACT_TOKENS_OUTPUT_SELECTOR = IUniswapV2Router01.swapETHForExactTokens.selector; address public immutable swapRouter; IUniswapV2Factory public immutable factory; constructor( IProtocolGovernance protocolGovernance_, address swapRouter_, IUniswapV2Factory factory_ ) BaseValidator(protocolGovernance_) { swapRouter = swapRouter_; factory = factory_; } // ------------------- EXTERNAL, VIEW ------------------- // @inhericdoc IValidator function validate( address, address addr, uint256 value, bytes4 selector, bytes calldata data ) external view { require(address(swapRouter) == addr, ExceptionsLibrary.INVALID_TARGET); IVault vault = IVault(msg.sender); address[] memory path; address to; if ((selector == EXACT_ETH_INPUT_SELECTOR) || (selector == EXACT_TOKENS_OUTPUT_SELECTOR)) { (, path, to, ) = abi.decode(data, (uint256, address[], address, uint256)); } else if ( (selector == EXACT_ETH_OUTPUT_SELECTOR) || (selector == EXACT_TOKENS_INPUT_SELECTOR) || (selector == EXACT_INPUT_SELECTOR) || (selector == EXACT_OUTPUT_SELECTOR) ) { require(value == 0, ExceptionsLibrary.INVALID_VALUE); (, , path, to, ) = abi.decode(data, (uint256, uint256, address[], address, uint256)); } else { revert(ExceptionsLibrary.INVALID_SELECTOR); } require(to == msg.sender); _verifyPath(vault, path); } // ------------------- INTERNAL, VIEW ------------------- function _contractName() internal pure override returns (bytes32) { return bytes32("UniV2Validator"); } function _contractVersion() internal pure override returns (bytes32) { return bytes32("1.0.0"); } function _verifyPath(IVault vault, address[] memory path) private view { require(path.length > 1, ExceptionsLibrary.INVALID_LENGTH); require(vault.isVaultToken(path[path.length - 1]), ExceptionsLibrary.INVALID_TOKEN); IProtocolGovernance protocolGovernance = _validatorParams.protocolGovernance; for (uint256 i = 0; i < path.length - 1; i++) { address token0 = path[i]; address token1 = path[i + 1]; require(token0 != token1, ExceptionsLibrary.INVALID_TOKEN); address pool = factory.getPair(token0, token1); require( protocolGovernance.hasPermission(pool, PermissionIdsLibrary.ERC20_APPROVE), ExceptionsLibrary.FORBIDDEN ); } } }
// SPDX-License-Identifier: MIT pragma solidity 0.8.9; import "@openzeppelin/contracts/utils/introspection/ERC165.sol"; import "../interfaces/validators/IValidator.sol"; import "./BaseValidator.sol"; abstract contract Validator is IValidator, ERC165, BaseValidator { /// @inheritdoc IERC165 function supportsInterface(bytes4 interfaceId) public view virtual override(IERC165, ERC165) returns (bool) { return (interfaceId == type(IValidator).interfaceId) || super.supportsInterface(interfaceId); } }
{ "evmVersion": "istanbul", "libraries": {}, "metadata": { "bytecodeHash": "ipfs", "useLiteralContent": true }, "optimizer": { "enabled": true, "runs": 200 }, "remappings": [], "outputSelection": { "*": { "*": [ "evm.bytecode", "evm.deployedBytecode", "devdoc", "userdoc", "metadata", "abi" ] } } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"contract IProtocolGovernance","name":"protocolGovernance_","type":"address"},{"internalType":"address","name":"swapRouter_","type":"address"},{"internalType":"contract IUniswapV2Factory","name":"factory_","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"origin","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"},{"components":[{"internalType":"contract IProtocolGovernance","name":"protocolGovernance","type":"address"}],"indexed":false,"internalType":"struct IBaseValidator.ValidatorParams","name":"params","type":"tuple"}],"name":"CommittedValidatorParams","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"origin","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"},{"components":[{"internalType":"contract IProtocolGovernance","name":"protocolGovernance","type":"address"}],"indexed":false,"internalType":"struct IBaseValidator.ValidatorParams","name":"newParams","type":"tuple"},{"indexed":false,"internalType":"uint256","name":"when","type":"uint256"}],"name":"StagedValidatorParams","type":"event"},{"inputs":[],"name":"EXACT_ETH_INPUT_SELECTOR","outputs":[{"internalType":"bytes4","name":"","type":"bytes4"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"EXACT_ETH_OUTPUT_SELECTOR","outputs":[{"internalType":"bytes4","name":"","type":"bytes4"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"EXACT_INPUT_SELECTOR","outputs":[{"internalType":"bytes4","name":"","type":"bytes4"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"EXACT_OUTPUT_SELECTOR","outputs":[{"internalType":"bytes4","name":"","type":"bytes4"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"EXACT_TOKENS_INPUT_SELECTOR","outputs":[{"internalType":"bytes4","name":"","type":"bytes4"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"EXACT_TOKENS_OUTPUT_SELECTOR","outputs":[{"internalType":"bytes4","name":"","type":"bytes4"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"commitValidatorParams","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"contractName","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"contractNameBytes","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"contractVersion","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"contractVersionBytes","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"factory","outputs":[{"internalType":"contract IUniswapV2Factory","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"components":[{"internalType":"contract IProtocolGovernance","name":"protocolGovernance","type":"address"}],"internalType":"struct IBaseValidator.ValidatorParams","name":"newParams","type":"tuple"}],"name":"stageValidatorParams","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"stagedValidatorParams","outputs":[{"components":[{"internalType":"contract IProtocolGovernance","name":"protocolGovernance","type":"address"}],"internalType":"struct IBaseValidator.ValidatorParams","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"stagedValidatorParamsTimestamp","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"swapRouter","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"addr","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"},{"internalType":"bytes4","name":"selector","type":"bytes4"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"validate","outputs":[],"stateMutability":"view","type":"function"},{"inputs":[],"name":"validatorParams","outputs":[{"components":[{"internalType":"contract IProtocolGovernance","name":"protocolGovernance","type":"address"}],"internalType":"struct IBaseValidator.ValidatorParams","name":"","type":"tuple"}],"stateMutability":"view","type":"function"}]
Contract Creation Code
60c060405234801561001057600080fd5b506040516111bd3803806111bd83398101604081905261002f91610083565b60408051602081019091526001600160a01b0393841690819052600080546001600160a01b03191690911790559082166080521660a0526100d0565b6001600160a01b038116811461008057600080fd5b50565b60008060006060848603121561009857600080fd5b83516100a38161006b565b60208501519093506100b48161006b565b60408501519092506100c58161006b565b809150509250925092565b60805160a0516110ba610103600039600081816102d60152610a9c01526000818161029701526104e801526110ba6000f3fe608060405234801561001057600080fd5b50600436106101215760003560e01c80635e585c34116100ad578063a0a8e46011610071578063a0a8e4601461028a578063c31c9c0714610292578063c45a0155146102d1578063c8991b9e146102f8578063e6ab042c1461030657600080fd5b80635e585c341461023857806370655fa01461024b57806374ed429a1461025957806375d0c0dc14610267578063764ff9ee1461027c57600080fd5b80632da5f5c7116100f45780632da5f5c71461018557806337c85920146101ac57806347c0a4ed146101ba5780634c39da1b146101cf57806357acc3021461020e57600080fd5b806301ffc9a71461012657806306a462391461014e5780630768b496146101665780630e3e80ac1461016e575b600080fd5b610139610134366004610c7e565b61030e565b60405190151581526020015b60405180910390f35b640312e302e360dc1b5b604051908152602001610145565b600254610158565b6d2ab734ab192b30b634b230ba37b960911b610158565b610193632512eca560e11b81565b6040516001600160e01b03199091168152602001610145565b61019363fb3bdb4160e01b81565b6101cd6101c8366004610ca0565b61034a565b005b6040805160208082018352600090915281519081019091526001546001600160a01b031681525b60405190516001600160a01b03168152602001610145565b60408051602080820183526000918290528251908101909252546001600160a01b031681526101f6565b6101cd610246366004610cdb565b6104dc565b610193634401edf760e11b81565b610193637ff36ab560e01b81565b61026f6106b8565b6040516101459190610d8c565b6101936318cbafe560e01b81565b61026f6106d4565b6102b97f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b039091168152602001610145565b6102b97f000000000000000000000000000000000000000000000000000000000000000081565b6101936338ed173960e01b81565b6101cd6106e7565b60006001600160e01b03198216631796170d60e21b148061033f57506301ffc9a760e01b6001600160e01b03198316145b92915050565b905090565b600054604051630935e01b60e21b81523360048201526001600160a01b039091169081906324d7806c9060240160206040518083038186803b15801561038f57600080fd5b505afa1580156103a3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906103c79190610de1565b6040518060400160405280600381526020016223292160e91b8152509061040a5760405162461bcd60e51b81526004016104019190610d8c565b60405180910390fd5b508160016104188282610e03565b905050806001600160a01b031663bba329396040518163ffffffff1660e01b815260040160206040518083038186803b15801561045457600080fd5b505afa158015610468573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061048c9190610e2c565b6104969042610e5b565b6002819055604051339132917f660ad6a797f71286627569396d4046567822701c6afd27f47d280dee5e2ce181916104d091879190610e73565b60405180910390a35050565b846001600160a01b03167f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316146040518060400160405280600581526020016424a72b2a2960d91b8152509061054d5760405162461bcd60e51b81526004016104019190610d8c565b5033606060006001600160e01b03198616637ff36ab560e01b148061058257506001600160e01b0319861663fb3bdb4160e01b145b156105a05761059384860186610f53565b50909350915061068e9050565b6001600160e01b03198616632512eca560e11b14806105cf57506001600160e01b031986166318cbafe560e01b145b806105ea57506001600160e01b031986166338ed173960e01b145b8061060557506001600160e01b03198616634401edf760e11b145b1561065e5760408051808201909152600381526224a72b60e91b602082015287156106435760405162461bcd60e51b81526004016104019190610d8c565b5061065084860186610fb4565b50909450925061068e915050565b604080518082018252600480825263494e565360e01b6020830152915162461bcd60e51b81526104019201610d8c565b6001600160a01b03811633146106a357600080fd5b6106ad8383610884565b505050505050505050565b60606103456d2ab734ab192b30b634b230ba37b960911b610bf5565b6060610345640312e302e360dc1b610bf5565b60025460408051808201909152600581526412539594d560da1b6020820152906107245760405162461bcd60e51b81526004016104019190610d8c565b50600054604051630935e01b60e21b81523360048201526001600160a01b039091169081906324d7806c9060240160206040518083038186803b15801561076a57600080fd5b505afa15801561077e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107a29190610de1565b6040518060400160405280600381526020016223292160e91b815250906107dc5760405162461bcd60e51b81526004016104019190610d8c565b5060025442101560405180604001604052806002815260200161545360f01b8152509061081c5760405162461bcd60e51b81526004016104019190610d8c565b5060018054600080546001600160a01b0383166001600160a01b0319918216811783559216909255600291909155604051908152339032907f15f858bb04b5aa79f0fafddd94b014ab8bf8ceae94724b7074c7b4940be688b49060200160405180910390a350565b6001815111604051806040016040528060048152602001631253959360e21b815250906108c45760405162461bcd60e51b81526004016104019190610d8c565b50816001600160a01b031663338c4ccb82600184516108e3919061101f565b815181106108f3576108f3611036565b60200260200101516040518263ffffffff1660e01b815260040161092691906001600160a01b0391909116815260200190565b60206040518083038186803b15801561093e57600080fd5b505afa158015610952573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109769190610de1565b60405180604001604052806005815260200164494e56544f60d81b815250906109b25760405162461bcd60e51b81526004016104019190610d8c565b50600080546001600160a01b0316905b600183516109d0919061101f565b811015610bef5760008382815181106109eb576109eb611036565b60200260200101519050600084836001610a059190610e5b565b81518110610a1557610a15611036565b60200260200101519050806001600160a01b0316826001600160a01b0316141560405180604001604052806005815260200164494e56544f60d81b81525090610a715760405162461bcd60e51b81526004016104019190610d8c565b5060405163e6a4390560e01b81526001600160a01b03838116600483015282811660248301526000917f00000000000000000000000000000000000000000000000000000000000000009091169063e6a439059060440160206040518083038186803b158015610ae057600080fd5b505afa158015610af4573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b18919061104c565b6040516363e85d2d60e01b81526001600160a01b038083166004808401919091526024830152919250908616906363e85d2d9060440160206040518083038186803b158015610b6657600080fd5b505afa158015610b7a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b9e9190610de1565b6040518060400160405280600381526020016223292160e91b81525090610bd85760405162461bcd60e51b81526004016104019190610d8c565b505050508080610be790611069565b9150506109c2565b50505050565b604080516020808252818301909252606091602082018180368337019050509050602060005b6020811015610c5357838160208110610c3657610c36611036565b1a610c4357809150610c53565b610c4c81611069565b9050610c1b565b508152602081019190915290565b80356001600160e01b031981168114610c7957600080fd5b919050565b600060208284031215610c9057600080fd5b610c9982610c61565b9392505050565b600060208284031215610cb257600080fd5b50919050565b6001600160a01b0381168114610ccd57600080fd5b50565b8035610c7981610cb8565b60008060008060008060a08789031215610cf457600080fd5b8635610cff81610cb8565b95506020870135610d0f81610cb8565b945060408701359350610d2460608801610c61565b9250608087013567ffffffffffffffff80821115610d4157600080fd5b818901915089601f830112610d5557600080fd5b813581811115610d6457600080fd5b8a6020828501011115610d7657600080fd5b6020830194508093505050509295509295509295565b600060208083528351808285015260005b81811015610db957858101830151858201604001528201610d9d565b81811115610dcb576000604083870101525b50601f01601f1916929092016040019392505050565b600060208284031215610df357600080fd5b81518015158114610c9957600080fd5b8135610e0e81610cb8565b81546001600160a01b0319166001600160a01b039190911617905550565b600060208284031215610e3e57600080fd5b5051919050565b634e487b7160e01b600052601160045260246000fd5b60008219821115610e6e57610e6e610e45565b500190565b604081018335610e8281610cb8565b6001600160a01b03168252602090910191909152919050565b634e487b7160e01b600052604160045260246000fd5b600082601f830112610ec257600080fd5b8135602067ffffffffffffffff80831115610edf57610edf610e9b565b8260051b604051601f19603f83011681018181108482111715610f0457610f04610e9b565b604052938452858101830193838101925087851115610f2257600080fd5b83870191505b84821015610f4857610f3982610cd0565b83529183019190830190610f28565b979650505050505050565b60008060008060808587031215610f6957600080fd5b84359350602085013567ffffffffffffffff811115610f8757600080fd5b610f9387828801610eb1565b9350506040850135610fa481610cb8565b9396929550929360600135925050565b600080600080600060a08688031215610fcc57600080fd5b8535945060208601359350604086013567ffffffffffffffff811115610ff157600080fd5b610ffd88828901610eb1565b935050606086013561100e81610cb8565b949793965091946080013592915050565b60008282101561103157611031610e45565b500390565b634e487b7160e01b600052603260045260246000fd5b60006020828403121561105e57600080fd5b8151610c9981610cb8565b600060001982141561107d5761107d610e45565b506001019056fea2646970667358221220761c2f9370d6b1b9ce2de8f53b58692b468d97a392efb3e2702115c74606d9f464736f6c634300080900330000000000000000000000008ff3148ce574b8e135130065b188960ba93799c60000000000000000000000001b02da8cb0d097eb8d57a175b88c7d8b47997506000000000000000000000000c35dadb65012ec5796536bd9864ed8773abc74c4
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
0000000000000000000000008ff3148ce574b8e135130065b188960ba93799c60000000000000000000000001b02da8cb0d097eb8d57a175b88c7d8b47997506000000000000000000000000c35dadb65012ec5796536bd9864ed8773abc74c4
-----Decoded View---------------
Arg [0] : protocolGovernance_ (address): 0x8ff3148ce574b8e135130065b188960ba93799c6
Arg [1] : swapRouter_ (address): 0x1b02da8cb0d097eb8d57a175b88c7d8b47997506
Arg [2] : factory_ (address): 0xc35dadb65012ec5796536bd9864ed8773abc74c4
-----Encoded View---------------
3 Constructor Arguments found :
Arg [0] : 0000000000000000000000008ff3148ce574b8e135130065b188960ba93799c6
Arg [1] : 0000000000000000000000001b02da8cb0d097eb8d57a175b88c7d8b47997506
Arg [2] : 000000000000000000000000c35dadb65012ec5796536bd9864ed8773abc74c4
Age | Block | Fee Address | BC Fee Address | Voting Power | Jailed | Incoming |
---|
Make sure to use the "Vote Down" button for any spammy posts, and the "Vote Up" for interesting conversations.