Source Code
Overview
ETH Balance
0 ETH
ETH Value
$0.00View more zero value Internal Transactions in Advanced View mode
Advanced mode:
Cross-Chain Transactions
Loading...
Loading
Contract Name:
FactoryRegistry
Compiler Version
v0.8.19+commit.7dd6d404
Optimization Enabled:
Yes with 200 runs
Other Settings:
default evmVersion
Contract Source Code (Solidity Standard Json-Input format)
// SPDX-License-Identifier: BUSL-1.1
pragma solidity 0.8.19;
import {Ownable} from "@openzeppelin/contracts/access/Ownable.sol";
import {IFactoryRegistry} from "../interfaces/factories/IFactoryRegistry.sol";
import {EnumerableSet} from "@openzeppelin/contracts/utils/structs/EnumerableSet.sol";
/// @title Protocol Factory Registry
/// @notice Protocol Factory Registry to swap and create gauges
contract FactoryRegistry is IFactoryRegistry, Ownable {
using EnumerableSet for EnumerableSet.AddressSet;
/// @dev factory to create free and locked rewards for a managed veNFT
address private _managedRewardsFactory;
/// @dev The protocol will always have a usable poolFactory, votingRewardsFactory, and gaugeFactory. The votingRewardsFactory
// and gaugeFactory are defined to the poolFactory which can never be removed
address public immutable fallbackPoolFactory;
/// @dev Array of poolFactories used to create a gauge and votingRewards
EnumerableSet.AddressSet private _poolFactories;
struct FactoriesToPoolFactory {
address votingRewardsFactory;
address gaugeFactory;
}
/// @dev the factories linked to the poolFactory
mapping(address => FactoriesToPoolFactory) private _factoriesToPoolsFactory;
constructor(
address _fallbackPoolFactory,
address _fallbackVotingRewardsFactory,
address _fallbackGaugeFactory,
address _newManagedRewardsFactory
) {
fallbackPoolFactory = _fallbackPoolFactory;
approve(_fallbackPoolFactory, _fallbackVotingRewardsFactory, _fallbackGaugeFactory);
setManagedRewardsFactory(_newManagedRewardsFactory);
}
/// @inheritdoc IFactoryRegistry
function approve(address poolFactory, address votingRewardsFactory, address gaugeFactory) public onlyOwner {
if (poolFactory == address(0) || votingRewardsFactory == address(0) || gaugeFactory == address(0))
revert ZeroAddress();
if (_poolFactories.contains(poolFactory)) revert PathAlreadyApproved();
FactoriesToPoolFactory memory usedFactories = _factoriesToPoolsFactory[poolFactory];
// If the poolFactory *has not* been approved before, can approve any gauge/votingRewards factory
// Only one check is sufficient
if (usedFactories.votingRewardsFactory == address(0)) {
_factoriesToPoolsFactory[poolFactory] = FactoriesToPoolFactory(votingRewardsFactory, gaugeFactory);
} else {
// If the poolFactory *has* been approved before, can only approve the same used gauge/votingRewards factory to
// to maintain state within Voter
if (
votingRewardsFactory != usedFactories.votingRewardsFactory || gaugeFactory != usedFactories.gaugeFactory
) revert InvalidFactoriesToPoolFactory();
}
_poolFactories.add(poolFactory);
emit Approve(poolFactory, votingRewardsFactory, gaugeFactory);
}
/// @inheritdoc IFactoryRegistry
function unapprove(address poolFactory) external onlyOwner {
if (poolFactory == fallbackPoolFactory) revert FallbackFactory();
if (!_poolFactories.contains(poolFactory)) revert PathNotApproved();
_poolFactories.remove(poolFactory);
(address votingRewardsFactory, address gaugeFactory) = factoriesToPoolFactory(poolFactory);
emit Unapprove(poolFactory, votingRewardsFactory, gaugeFactory);
}
/// @inheritdoc IFactoryRegistry
function setManagedRewardsFactory(address _newManagedRewardsFactory) public onlyOwner {
if (_newManagedRewardsFactory == _managedRewardsFactory) revert SameAddress();
if (_newManagedRewardsFactory == address(0)) revert ZeroAddress();
_managedRewardsFactory = _newManagedRewardsFactory;
emit SetManagedRewardsFactory(_newManagedRewardsFactory);
}
/// @inheritdoc IFactoryRegistry
function managedRewardsFactory() external view returns (address) {
return _managedRewardsFactory;
}
/// @inheritdoc IFactoryRegistry
function factoriesToPoolFactory(
address poolFactory
) public view returns (address votingRewardsFactory, address gaugeFactory) {
FactoriesToPoolFactory memory f = _factoriesToPoolsFactory[poolFactory];
votingRewardsFactory = f.votingRewardsFactory;
gaugeFactory = f.gaugeFactory;
}
/// @inheritdoc IFactoryRegistry
function poolFactories() external view returns (address[] memory) {
return _poolFactories.values();
}
/// @inheritdoc IFactoryRegistry
function isPoolFactoryApproved(address poolFactory) external view returns (bool) {
return _poolFactories.contains(poolFactory);
}
/// @inheritdoc IFactoryRegistry
function poolFactoriesLength() external view returns (uint256) {
return _poolFactories.length();
}
}// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
interface IFactoryRegistry {
error FallbackFactory();
error InvalidFactoriesToPoolFactory();
error PathAlreadyApproved();
error PathNotApproved();
error SameAddress();
error ZeroAddress();
event Approve(address indexed poolFactory, address indexed votingRewardsFactory, address indexed gaugeFactory);
event Unapprove(address indexed poolFactory, address indexed votingRewardsFactory, address indexed gaugeFactory);
event SetManagedRewardsFactory(address indexed _newRewardsFactory);
/// @notice Approve a set of factories used in the Protocol.
/// Router.sol is able to swap any poolFactories currently approved.
/// Cannot approve address(0) factories.
/// Cannot aprove path that is already approved.
/// Each poolFactory has one unique set and maintains state. In the case a poolFactory is unapproved
/// and then re-approved, the same set of factories must be used. In other words, you cannot overwrite
/// the factories tied to a poolFactory address.
/// VotingRewardsFactories and GaugeFactories may use the same address across multiple poolFactories.
/// @dev Callable by onlyOwner
/// @param poolFactory .
/// @param votingRewardsFactory .
/// @param gaugeFactory .
function approve(address poolFactory, address votingRewardsFactory, address gaugeFactory) external;
/// @notice Unapprove a set of factories used in the Protocol.
/// While a poolFactory is unapproved, Router.sol cannot swap with pools made from the corresponding factory
/// Can only unapprove an approved path.
/// Cannot unapprove the fallback path (core v2 factories).
/// @dev Callable by onlyOwner
/// @param poolFactory .
function unapprove(address poolFactory) external;
/// @notice Factory to create free and locked rewards for a managed veNFT
function managedRewardsFactory() external view returns (address);
/// @notice Set the rewards factory address
/// @dev Callable by onlyOwner
/// @param _newManagedRewardsFactory address of new managedRewardsFactory
function setManagedRewardsFactory(address _newManagedRewardsFactory) external;
/// @notice Get the factories correlated to a poolFactory.
/// Once set, this can never be modified.
/// Returns the correlated factories even after an approved poolFactory is unapproved.
function factoriesToPoolFactory(
address poolFactory
) external view returns (address votingRewardsFactory, address gaugeFactory);
/// @notice Get all PoolFactories approved by the registry
/// @dev The same PoolFactory address cannot be used twice
/// @return Array of PoolFactory addresses
function poolFactories() external view returns (address[] memory);
/// @notice Check if a PoolFactory is approved within the factory registry. Router uses this method to
/// ensure a pool swapped from is approved.
/// @param poolFactory .
/// @return True if PoolFactory is approved, else false
function isPoolFactoryApproved(address poolFactory) external view returns (bool);
/// @notice Get the length of the poolFactories array
function poolFactoriesLength() external view returns (uint256);
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.7.0) (access/Ownable.sol)
pragma solidity ^0.8.0;
import "../utils/Context.sol";
/**
* @dev Contract module which provides a basic access control mechanism, where
* there is an account (an owner) that can be granted exclusive access to
* specific functions.
*
* By default, the owner account will be the one that deploys the contract. This
* can later be changed with {transferOwnership}.
*
* This module is used through inheritance. It will make available the modifier
* `onlyOwner`, which can be applied to your functions to restrict their use to
* the owner.
*/
abstract contract Ownable is Context {
address private _owner;
event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);
/**
* @dev Initializes the contract setting the deployer as the initial owner.
*/
constructor() {
_transferOwnership(_msgSender());
}
/**
* @dev Throws if called by any account other than the owner.
*/
modifier onlyOwner() {
_checkOwner();
_;
}
/**
* @dev Returns the address of the current owner.
*/
function owner() public view virtual returns (address) {
return _owner;
}
/**
* @dev Throws if the sender is not the owner.
*/
function _checkOwner() internal view virtual {
require(owner() == _msgSender(), "Ownable: caller is not the owner");
}
/**
* @dev Leaves the contract without owner. It will not be possible to call
* `onlyOwner` functions anymore. Can only be called by the current owner.
*
* NOTE: Renouncing ownership will leave the contract without an owner,
* thereby removing any functionality that is only available to the owner.
*/
function renounceOwnership() public virtual onlyOwner {
_transferOwnership(address(0));
}
/**
* @dev Transfers ownership of the contract to a new account (`newOwner`).
* Can only be called by the current owner.
*/
function transferOwnership(address newOwner) public virtual onlyOwner {
require(newOwner != address(0), "Ownable: new owner is the zero address");
_transferOwnership(newOwner);
}
/**
* @dev Transfers ownership of the contract to a new account (`newOwner`).
* Internal function without access restriction.
*/
function _transferOwnership(address newOwner) internal virtual {
address oldOwner = _owner;
_owner = newOwner;
emit OwnershipTransferred(oldOwner, newOwner);
}
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (utils/Context.sol)
pragma solidity ^0.8.0;
/**
* @dev Provides information about the current execution context, including the
* sender of the transaction and its data. While these are generally available
* via msg.sender and msg.data, they should not be accessed in such a direct
* manner, since when dealing with meta-transactions the account sending and
* paying for execution may not be the actual sender (as far as an application
* is concerned).
*
* This contract is only required for intermediate, library-like contracts.
*/
abstract contract Context {
function _msgSender() internal view virtual returns (address) {
return msg.sender;
}
function _msgData() internal view virtual returns (bytes calldata) {
return msg.data;
}
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.8.0) (utils/structs/EnumerableSet.sol)
// This file was procedurally generated from scripts/generate/templates/EnumerableSet.js.
pragma solidity ^0.8.0;
/**
* @dev Library for managing
* https://en.wikipedia.org/wiki/Set_(abstract_data_type)[sets] of primitive
* types.
*
* Sets have the following properties:
*
* - Elements are added, removed, and checked for existence in constant time
* (O(1)).
* - Elements are enumerated in O(n). No guarantees are made on the ordering.
*
* ```solidity
* contract Example {
* // Add the library methods
* using EnumerableSet for EnumerableSet.AddressSet;
*
* // Declare a set state variable
* EnumerableSet.AddressSet private mySet;
* }
* ```
*
* As of v3.3.0, sets of type `bytes32` (`Bytes32Set`), `address` (`AddressSet`)
* and `uint256` (`UintSet`) are supported.
*
* [WARNING]
* ====
* Trying to delete such a structure from storage will likely result in data corruption, rendering the structure
* unusable.
* See https://github.com/ethereum/solidity/pull/11843[ethereum/solidity#11843] for more info.
*
* In order to clean an EnumerableSet, you can either remove all elements one by one or create a fresh instance using an
* array of EnumerableSet.
* ====
*/
library EnumerableSet {
// To implement this library for multiple types with as little code
// repetition as possible, we write it in terms of a generic Set type with
// bytes32 values.
// The Set implementation uses private functions, and user-facing
// implementations (such as AddressSet) are just wrappers around the
// underlying Set.
// This means that we can only create new EnumerableSets for types that fit
// in bytes32.
struct Set {
// Storage of set values
bytes32[] _values;
// Position of the value in the `values` array, plus 1 because index 0
// means a value is not in the set.
mapping(bytes32 => uint256) _indexes;
}
/**
* @dev Add a value to a set. O(1).
*
* Returns true if the value was added to the set, that is if it was not
* already present.
*/
function _add(Set storage set, bytes32 value) private returns (bool) {
if (!_contains(set, value)) {
set._values.push(value);
// The value is stored at length-1, but we add 1 to all indexes
// and use 0 as a sentinel value
set._indexes[value] = set._values.length;
return true;
} else {
return false;
}
}
/**
* @dev Removes a value from a set. O(1).
*
* Returns true if the value was removed from the set, that is if it was
* present.
*/
function _remove(Set storage set, bytes32 value) private returns (bool) {
// We read and store the value's index to prevent multiple reads from the same storage slot
uint256 valueIndex = set._indexes[value];
if (valueIndex != 0) {
// Equivalent to contains(set, value)
// To delete an element from the _values array in O(1), we swap the element to delete with the last one in
// the array, and then remove the last element (sometimes called as 'swap and pop').
// This modifies the order of the array, as noted in {at}.
uint256 toDeleteIndex = valueIndex - 1;
uint256 lastIndex = set._values.length - 1;
if (lastIndex != toDeleteIndex) {
bytes32 lastValue = set._values[lastIndex];
// Move the last value to the index where the value to delete is
set._values[toDeleteIndex] = lastValue;
// Update the index for the moved value
set._indexes[lastValue] = valueIndex; // Replace lastValue's index to valueIndex
}
// Delete the slot where the moved value was stored
set._values.pop();
// Delete the index for the deleted slot
delete set._indexes[value];
return true;
} else {
return false;
}
}
/**
* @dev Returns true if the value is in the set. O(1).
*/
function _contains(Set storage set, bytes32 value) private view returns (bool) {
return set._indexes[value] != 0;
}
/**
* @dev Returns the number of values on the set. O(1).
*/
function _length(Set storage set) private view returns (uint256) {
return set._values.length;
}
/**
* @dev Returns the value stored at position `index` in the set. O(1).
*
* Note that there are no guarantees on the ordering of values inside the
* array, and it may change when more values are added or removed.
*
* Requirements:
*
* - `index` must be strictly less than {length}.
*/
function _at(Set storage set, uint256 index) private view returns (bytes32) {
return set._values[index];
}
/**
* @dev Return the entire set in an array
*
* WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed
* to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that
* this function has an unbounded cost, and using it as part of a state-changing function may render the function
* uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block.
*/
function _values(Set storage set) private view returns (bytes32[] memory) {
return set._values;
}
// Bytes32Set
struct Bytes32Set {
Set _inner;
}
/**
* @dev Add a value to a set. O(1).
*
* Returns true if the value was added to the set, that is if it was not
* already present.
*/
function add(Bytes32Set storage set, bytes32 value) internal returns (bool) {
return _add(set._inner, value);
}
/**
* @dev Removes a value from a set. O(1).
*
* Returns true if the value was removed from the set, that is if it was
* present.
*/
function remove(Bytes32Set storage set, bytes32 value) internal returns (bool) {
return _remove(set._inner, value);
}
/**
* @dev Returns true if the value is in the set. O(1).
*/
function contains(Bytes32Set storage set, bytes32 value) internal view returns (bool) {
return _contains(set._inner, value);
}
/**
* @dev Returns the number of values in the set. O(1).
*/
function length(Bytes32Set storage set) internal view returns (uint256) {
return _length(set._inner);
}
/**
* @dev Returns the value stored at position `index` in the set. O(1).
*
* Note that there are no guarantees on the ordering of values inside the
* array, and it may change when more values are added or removed.
*
* Requirements:
*
* - `index` must be strictly less than {length}.
*/
function at(Bytes32Set storage set, uint256 index) internal view returns (bytes32) {
return _at(set._inner, index);
}
/**
* @dev Return the entire set in an array
*
* WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed
* to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that
* this function has an unbounded cost, and using it as part of a state-changing function may render the function
* uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block.
*/
function values(Bytes32Set storage set) internal view returns (bytes32[] memory) {
bytes32[] memory store = _values(set._inner);
bytes32[] memory result;
/// @solidity memory-safe-assembly
assembly {
result := store
}
return result;
}
// AddressSet
struct AddressSet {
Set _inner;
}
/**
* @dev Add a value to a set. O(1).
*
* Returns true if the value was added to the set, that is if it was not
* already present.
*/
function add(AddressSet storage set, address value) internal returns (bool) {
return _add(set._inner, bytes32(uint256(uint160(value))));
}
/**
* @dev Removes a value from a set. O(1).
*
* Returns true if the value was removed from the set, that is if it was
* present.
*/
function remove(AddressSet storage set, address value) internal returns (bool) {
return _remove(set._inner, bytes32(uint256(uint160(value))));
}
/**
* @dev Returns true if the value is in the set. O(1).
*/
function contains(AddressSet storage set, address value) internal view returns (bool) {
return _contains(set._inner, bytes32(uint256(uint160(value))));
}
/**
* @dev Returns the number of values in the set. O(1).
*/
function length(AddressSet storage set) internal view returns (uint256) {
return _length(set._inner);
}
/**
* @dev Returns the value stored at position `index` in the set. O(1).
*
* Note that there are no guarantees on the ordering of values inside the
* array, and it may change when more values are added or removed.
*
* Requirements:
*
* - `index` must be strictly less than {length}.
*/
function at(AddressSet storage set, uint256 index) internal view returns (address) {
return address(uint160(uint256(_at(set._inner, index))));
}
/**
* @dev Return the entire set in an array
*
* WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed
* to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that
* this function has an unbounded cost, and using it as part of a state-changing function may render the function
* uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block.
*/
function values(AddressSet storage set) internal view returns (address[] memory) {
bytes32[] memory store = _values(set._inner);
address[] memory result;
/// @solidity memory-safe-assembly
assembly {
result := store
}
return result;
}
// UintSet
struct UintSet {
Set _inner;
}
/**
* @dev Add a value to a set. O(1).
*
* Returns true if the value was added to the set, that is if it was not
* already present.
*/
function add(UintSet storage set, uint256 value) internal returns (bool) {
return _add(set._inner, bytes32(value));
}
/**
* @dev Removes a value from a set. O(1).
*
* Returns true if the value was removed from the set, that is if it was
* present.
*/
function remove(UintSet storage set, uint256 value) internal returns (bool) {
return _remove(set._inner, bytes32(value));
}
/**
* @dev Returns true if the value is in the set. O(1).
*/
function contains(UintSet storage set, uint256 value) internal view returns (bool) {
return _contains(set._inner, bytes32(value));
}
/**
* @dev Returns the number of values in the set. O(1).
*/
function length(UintSet storage set) internal view returns (uint256) {
return _length(set._inner);
}
/**
* @dev Returns the value stored at position `index` in the set. O(1).
*
* Note that there are no guarantees on the ordering of values inside the
* array, and it may change when more values are added or removed.
*
* Requirements:
*
* - `index` must be strictly less than {length}.
*/
function at(UintSet storage set, uint256 index) internal view returns (uint256) {
return uint256(_at(set._inner, index));
}
/**
* @dev Return the entire set in an array
*
* WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed
* to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that
* this function has an unbounded cost, and using it as part of a state-changing function may render the function
* uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block.
*/
function values(UintSet storage set) internal view returns (uint256[] memory) {
bytes32[] memory store = _values(set._inner);
uint256[] memory result;
/// @solidity memory-safe-assembly
assembly {
result := store
}
return result;
}
}{
"optimizer": {
"enabled": true,
"runs": 200
},
"outputSelection": {
"*": {
"*": [
"evm.bytecode",
"evm.deployedBytecode",
"devdoc",
"userdoc",
"metadata",
"abi"
]
}
},
"metadata": {
"useLiteralContent": true
},
"remappings": [
"@opengsn/=lib/gsn/packages/",
"@openzeppelin/=lib/openzeppelin-contracts/",
"@uniswap/v3-core/=lib/v3-core/",
"ds-test/=lib/ds-test/src/",
"erc4626-tests/=lib/openzeppelin-contracts/lib/erc4626-tests/",
"forge-std/=lib/forge-std/src/",
"gsn/=lib/gsn/",
"openzeppelin-contracts/=lib/openzeppelin-contracts/",
"solady/=lib/solady/src/",
"utils/=test/utils/"
],
"libraries": {}
}Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
Contract ABI
API[{"inputs":[{"internalType":"address","name":"_fallbackPoolFactory","type":"address"},{"internalType":"address","name":"_fallbackVotingRewardsFactory","type":"address"},{"internalType":"address","name":"_fallbackGaugeFactory","type":"address"},{"internalType":"address","name":"_newManagedRewardsFactory","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"FallbackFactory","type":"error"},{"inputs":[],"name":"InvalidFactoriesToPoolFactory","type":"error"},{"inputs":[],"name":"PathAlreadyApproved","type":"error"},{"inputs":[],"name":"PathNotApproved","type":"error"},{"inputs":[],"name":"SameAddress","type":"error"},{"inputs":[],"name":"ZeroAddress","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"poolFactory","type":"address"},{"indexed":true,"internalType":"address","name":"votingRewardsFactory","type":"address"},{"indexed":true,"internalType":"address","name":"gaugeFactory","type":"address"}],"name":"Approve","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_newRewardsFactory","type":"address"}],"name":"SetManagedRewardsFactory","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"poolFactory","type":"address"},{"indexed":true,"internalType":"address","name":"votingRewardsFactory","type":"address"},{"indexed":true,"internalType":"address","name":"gaugeFactory","type":"address"}],"name":"Unapprove","type":"event"},{"inputs":[{"internalType":"address","name":"poolFactory","type":"address"},{"internalType":"address","name":"votingRewardsFactory","type":"address"},{"internalType":"address","name":"gaugeFactory","type":"address"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"poolFactory","type":"address"}],"name":"factoriesToPoolFactory","outputs":[{"internalType":"address","name":"votingRewardsFactory","type":"address"},{"internalType":"address","name":"gaugeFactory","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"fallbackPoolFactory","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"poolFactory","type":"address"}],"name":"isPoolFactoryApproved","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"managedRewardsFactory","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"poolFactories","outputs":[{"internalType":"address[]","name":"","type":"address[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"poolFactoriesLength","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_newManagedRewardsFactory","type":"address"}],"name":"setManagedRewardsFactory","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"poolFactory","type":"address"}],"name":"unapprove","outputs":[],"stateMutability":"nonpayable","type":"function"}]Contract Creation Code
60a06040523480156200001157600080fd5b5060405162000f2238038062000f22833981016040819052620000349162000449565b6200003f336200006e565b6001600160a01b03841660805262000059848484620000be565b620000648162000295565b50505050620004a6565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b620000c862000341565b6001600160a01b0383161580620000e657506001600160a01b038216155b80620000f957506001600160a01b038116155b15620001185760405163d92e233d60e01b815260040160405180910390fd5b62000125600284620003a2565b1562000144576040516362cee17560e11b815260040160405180910390fd5b6001600160a01b038084166000908152600460209081526040918290208251808401909352805484168084526001909101549093169082015290620001e5576040805180820182526001600160a01b03808616825284811660208084019182528883166000908152600490915293909320915182549082166001600160a01b0319918216178355925160019092018054929091169190921617905562000237565b80516001600160a01b03848116911614158062000218575080602001516001600160a01b0316826001600160a01b031614155b156200023757604051630358043160e01b815260040160405180910390fd5b62000244600285620003c9565b50816001600160a01b0316836001600160a01b0316856001600160a01b03167f5abe7702ac48299ef7647755d7af6d6a6beecd1c584bbb6fa55b7a882490efc760405160405180910390a450505050565b6200029f62000341565b6001546001600160a01b0390811690821603620002cf5760405163367558c360e01b815260040160405180910390fd5b6001600160a01b038116620002f75760405163d92e233d60e01b815260040160405180910390fd5b600180546001600160a01b0319166001600160a01b0383169081179091556040517f3123bae5152a999decbb5b69306adb30fa19885cf983c49427fd5b4594dcb03790600090a250565b6000546001600160a01b03163314620003a05760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640160405180910390fd5b565b6001600160a01b038116600090815260018301602052604081205415155b90505b92915050565b6000620003c0836001600160a01b03841660008181526001830160205260408120546200042357508154600181810184556000848152602080822090930184905584548482528286019093526040902091909155620003c3565b506000620003c3565b80516001600160a01b03811681146200044457600080fd5b919050565b600080600080608085870312156200046057600080fd5b6200046b856200042c565b93506200047b602086016200042c565b92506200048b604086016200042c565b91506200049b606086016200042c565b905092959194509250565b608051610a59620004c96000396000818161014a015261058e0152610a596000f3fe608060405234801561001057600080fd5b50600436106100b45760003560e01c8063715018a611610071578063715018a6146101815780638da5cb5b146101895780639b140a851461019a578063d1ea0a1d146101ad578063f2fde38b146101d0578063fbf1f78a146101e357600080fd5b806306121cd5146100b95780630cb299c9146100d75780630d0ae678146100ed5780631217afdb1461011257806356d9cb6414610145578063640769391461016c575b600080fd5b6100c16101f6565b6040516100ce919061090f565b60405180910390f35b6100df610207565b6040519081526020016100ce565b6001546001600160a01b03165b6040516001600160a01b0390911681526020016100ce565b610125610120366004610978565b610213565b604080516001600160a01b039384168152929091166020830152016100ce565b6100fa7f000000000000000000000000000000000000000000000000000000000000000081565b61017f61017a366004610978565b610251565b005b61017f6102f9565b6000546001600160a01b03166100fa565b61017f6101a8366004610993565b61030d565b6101c06101bb366004610978565b6104e4565b60405190151581526020016100ce565b61017f6101de366004610978565b610506565b61017f6101f1366004610978565b610584565b6060610202600261067f565b905090565b60006102026002610693565b6001600160a01b0390811660009081526004602090815260409182902082518084019093528054841680845260019091015490931691018190529091565b61025961069d565b6001546001600160a01b03908116908216036102885760405163367558c360e01b815260040160405180910390fd5b6001600160a01b0381166102af5760405163d92e233d60e01b815260040160405180910390fd5b600180546001600160a01b0319166001600160a01b0383169081179091556040517f3123bae5152a999decbb5b69306adb30fa19885cf983c49427fd5b4594dcb03790600090a250565b61030161069d565b61030b60006106f7565b565b61031561069d565b6001600160a01b038316158061033257506001600160a01b038216155b8061034457506001600160a01b038116155b156103625760405163d92e233d60e01b815260040160405180910390fd5b6001600160a01b03831660009081526003602052604090205415610399576040516362cee17560e11b815260040160405180910390fd5b6001600160a01b038084166000908152600460209081526040918290208251808401909352805484168084526001909101549093169082015290610438576040805180820182526001600160a01b03808616825284811660208084019182528883166000908152600490915293909320915182549082166001600160a01b03199182161783559251600190920180549290911691909216179055610488565b80516001600160a01b03848116911614158061046a575080602001516001600160a01b0316826001600160a01b031614155b1561048857604051630358043160e01b815260040160405180910390fd5b610493600285610747565b50816001600160a01b0316836001600160a01b0316856001600160a01b03167f5abe7702ac48299ef7647755d7af6d6a6beecd1c584bbb6fa55b7a882490efc760405160405180910390a450505050565b6001600160a01b03811660009081526003602052604081205415155b92915050565b61050e61069d565b6001600160a01b0381166105785760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084015b60405180910390fd5b610581816106f7565b50565b61058c61069d565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316816001600160a01b0316036105de57604051630a235adf60e11b815260040160405180910390fd5b6001600160a01b0381166000908152600360205260409020546106145760405163d38afd6560e01b815260040160405180910390fd5b61061f60028261075c565b5060008061062c83610213565b91509150806001600160a01b0316826001600160a01b0316846001600160a01b03167fbbbf8609bccd24696f7d2d86357dbd1a55ff9b79853a72ea11b1c0968ada177660405160405180910390a4505050565b6060600061068c83610771565b9392505050565b6000610500825490565b6000546001600160a01b0316331461030b5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161056f565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b600061068c836001600160a01b0384166107cd565b600061068c836001600160a01b03841661081c565b6060816000018054806020026020016040519081016040528092919081815260200182805480156107c157602002820191906000526020600020905b8154815260200190600101908083116107ad575b50505050509050919050565b600081815260018301602052604081205461081457508154600181810184556000848152602080822090930184905584548482528286019093526040902091909155610500565b506000610500565b600081815260018301602052604081205480156109055760006108406001836109d6565b8554909150600090610854906001906109d6565b90508181146108b9576000866000018281548110610874576108746109f7565b9060005260206000200154905080876000018481548110610897576108976109f7565b6000918252602080832090910192909255918252600188019052604090208390555b85548690806108ca576108ca610a0d565b600190038181906000526020600020016000905590558560010160008681526020019081526020016000206000905560019350505050610500565b6000915050610500565b6020808252825182820181905260009190848201906040850190845b818110156109505783516001600160a01b03168352928401929184019160010161092b565b50909695505050505050565b80356001600160a01b038116811461097357600080fd5b919050565b60006020828403121561098a57600080fd5b61068c8261095c565b6000806000606084860312156109a857600080fd5b6109b18461095c565b92506109bf6020850161095c565b91506109cd6040850161095c565b90509250925092565b8181038181111561050057634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052603160045260246000fdfea26469706673582212208bc42d671bbab120c629a6689aba09df1b2abc210fe5d7c1c7165b3650e2a7c464736f6c63430008130033000000000000000000000000189d5ae8bb12925da73221a8f4bfedff50e4392000000000000000000000000017eb81a8ff88ea3c5f0ca00b61bae85cc7920e9c0000000000000000000000009d79f35e04b32fab64f6bad63a99261ceac367ec000000000000000000000000d0053b6e23c0343129c08f7a063514274090a825
Deployed Bytecode
0x608060405234801561001057600080fd5b50600436106100b45760003560e01c8063715018a611610071578063715018a6146101815780638da5cb5b146101895780639b140a851461019a578063d1ea0a1d146101ad578063f2fde38b146101d0578063fbf1f78a146101e357600080fd5b806306121cd5146100b95780630cb299c9146100d75780630d0ae678146100ed5780631217afdb1461011257806356d9cb6414610145578063640769391461016c575b600080fd5b6100c16101f6565b6040516100ce919061090f565b60405180910390f35b6100df610207565b6040519081526020016100ce565b6001546001600160a01b03165b6040516001600160a01b0390911681526020016100ce565b610125610120366004610978565b610213565b604080516001600160a01b039384168152929091166020830152016100ce565b6100fa7f000000000000000000000000189d5ae8bb12925da73221a8f4bfedff50e4392081565b61017f61017a366004610978565b610251565b005b61017f6102f9565b6000546001600160a01b03166100fa565b61017f6101a8366004610993565b61030d565b6101c06101bb366004610978565b6104e4565b60405190151581526020016100ce565b61017f6101de366004610978565b610506565b61017f6101f1366004610978565b610584565b6060610202600261067f565b905090565b60006102026002610693565b6001600160a01b0390811660009081526004602090815260409182902082518084019093528054841680845260019091015490931691018190529091565b61025961069d565b6001546001600160a01b03908116908216036102885760405163367558c360e01b815260040160405180910390fd5b6001600160a01b0381166102af5760405163d92e233d60e01b815260040160405180910390fd5b600180546001600160a01b0319166001600160a01b0383169081179091556040517f3123bae5152a999decbb5b69306adb30fa19885cf983c49427fd5b4594dcb03790600090a250565b61030161069d565b61030b60006106f7565b565b61031561069d565b6001600160a01b038316158061033257506001600160a01b038216155b8061034457506001600160a01b038116155b156103625760405163d92e233d60e01b815260040160405180910390fd5b6001600160a01b03831660009081526003602052604090205415610399576040516362cee17560e11b815260040160405180910390fd5b6001600160a01b038084166000908152600460209081526040918290208251808401909352805484168084526001909101549093169082015290610438576040805180820182526001600160a01b03808616825284811660208084019182528883166000908152600490915293909320915182549082166001600160a01b03199182161783559251600190920180549290911691909216179055610488565b80516001600160a01b03848116911614158061046a575080602001516001600160a01b0316826001600160a01b031614155b1561048857604051630358043160e01b815260040160405180910390fd5b610493600285610747565b50816001600160a01b0316836001600160a01b0316856001600160a01b03167f5abe7702ac48299ef7647755d7af6d6a6beecd1c584bbb6fa55b7a882490efc760405160405180910390a450505050565b6001600160a01b03811660009081526003602052604081205415155b92915050565b61050e61069d565b6001600160a01b0381166105785760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084015b60405180910390fd5b610581816106f7565b50565b61058c61069d565b7f000000000000000000000000189d5ae8bb12925da73221a8f4bfedff50e439206001600160a01b0316816001600160a01b0316036105de57604051630a235adf60e11b815260040160405180910390fd5b6001600160a01b0381166000908152600360205260409020546106145760405163d38afd6560e01b815260040160405180910390fd5b61061f60028261075c565b5060008061062c83610213565b91509150806001600160a01b0316826001600160a01b0316846001600160a01b03167fbbbf8609bccd24696f7d2d86357dbd1a55ff9b79853a72ea11b1c0968ada177660405160405180910390a4505050565b6060600061068c83610771565b9392505050565b6000610500825490565b6000546001600160a01b0316331461030b5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161056f565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b600061068c836001600160a01b0384166107cd565b600061068c836001600160a01b03841661081c565b6060816000018054806020026020016040519081016040528092919081815260200182805480156107c157602002820191906000526020600020905b8154815260200190600101908083116107ad575b50505050509050919050565b600081815260018301602052604081205461081457508154600181810184556000848152602080822090930184905584548482528286019093526040902091909155610500565b506000610500565b600081815260018301602052604081205480156109055760006108406001836109d6565b8554909150600090610854906001906109d6565b90508181146108b9576000866000018281548110610874576108746109f7565b9060005260206000200154905080876000018481548110610897576108976109f7565b6000918252602080832090910192909255918252600188019052604090208390555b85548690806108ca576108ca610a0d565b600190038181906000526020600020016000905590558560010160008681526020019081526020016000206000905560019350505050610500565b6000915050610500565b6020808252825182820181905260009190848201906040850190845b818110156109505783516001600160a01b03168352928401929184019160010161092b565b50909695505050505050565b80356001600160a01b038116811461097357600080fd5b919050565b60006020828403121561098a57600080fd5b61068c8261095c565b6000806000606084860312156109a857600080fd5b6109b18461095c565b92506109bf6020850161095c565b91506109cd6040850161095c565b90509250925092565b8181038181111561050057634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052603160045260246000fdfea26469706673582212208bc42d671bbab120c629a6689aba09df1b2abc210fe5d7c1c7165b3650e2a7c464736f6c63430008130033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
000000000000000000000000189d5ae8bb12925da73221a8f4bfedff50e4392000000000000000000000000017eb81a8ff88ea3c5f0ca00b61bae85cc7920e9c0000000000000000000000009d79f35e04b32fab64f6bad63a99261ceac367ec000000000000000000000000d0053b6e23c0343129c08f7a063514274090a825
-----Decoded View---------------
Arg [0] : _fallbackPoolFactory (address): 0x189D5aE8Bb12925Da73221A8F4bFedFF50e43920
Arg [1] : _fallbackVotingRewardsFactory (address): 0x17eB81A8Ff88EA3c5f0ca00b61BAe85Cc7920E9C
Arg [2] : _fallbackGaugeFactory (address): 0x9D79F35E04B32fAB64F6Bad63a99261CeAC367eC
Arg [3] : _newManagedRewardsFactory (address): 0xD0053B6E23c0343129c08f7a063514274090a825
-----Encoded View---------------
4 Constructor Arguments found :
Arg [0] : 000000000000000000000000189d5ae8bb12925da73221a8f4bfedff50e43920
Arg [1] : 00000000000000000000000017eb81a8ff88ea3c5f0ca00b61bae85cc7920e9c
Arg [2] : 0000000000000000000000009d79f35e04b32fab64f6bad63a99261ceac367ec
Arg [3] : 000000000000000000000000d0053b6e23c0343129c08f7a063514274090a825
Loading...
Loading
Loading...
Loading
Loading...
Loading
Net Worth in USD
$0.00
Net Worth in ETH
0
Multichain Portfolio | 35 Chains
| Chain | Token | Portfolio % | Price | Amount | Value |
|---|
Loading...
Loading
Loading...
Loading
Loading...
Loading
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.