Overview
S Balance
0 S
S Value
-More Info
Private Name Tags
ContractCreator
Loading...
Loading
Contract Name:
FactoryRegistry
Compiler Version
v0.8.19+commit.7dd6d404
Contract Source Code (Solidity)
/** *Submitted for verification at SonicScan.org on 2024-12-18 */ // SPDX-License-Identifier: GPL-3.0-or-later // Hydrometer combines powerful liquidity incentives, low slippage, and a vote-locked governance model using $HYDRO and $veHYDRO tokens, ensuring an innovative and decentralized experience for all users. //https://x.com/Hydrometer_Fi pragma solidity 0.8.19; // OpenZeppelin Contracts (last updated v4.7.0) (access/Ownable.sol) // OpenZeppelin Contracts v4.4.1 (utils/Context.sol) /** * @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; } } /** * @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); } } 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); } // OpenZeppelin Contracts (last updated v4.8.0) (utils/structs/EnumerableSet.sol) // This file was procedurally generated from scripts/generate/templates/EnumerableSet.js. /** * @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; } } /// @title Protocol Factory Registry /// @author Carter Carlson (@pegahcarter) /// @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(); } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"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
60a06040523480156200001157600080fd5b5060405162000f2238038062000f22833981016040819052620000349162000449565b6200003f336200006e565b6001600160a01b03841660805262000059848484620000be565b620000648162000295565b50505050620004a6565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b620000c862000341565b6001600160a01b0383161580620000e657506001600160a01b038216155b80620000f957506001600160a01b038116155b15620001185760405163d92e233d60e01b815260040160405180910390fd5b62000125600284620003a2565b1562000144576040516362cee17560e11b815260040160405180910390fd5b6001600160a01b038084166000908152600460209081526040918290208251808401909352805484168084526001909101549093169082015290620001e5576040805180820182526001600160a01b03808616825284811660208084019182528883166000908152600490915293909320915182549082166001600160a01b0319918216178355925160019092018054929091169190921617905562000237565b80516001600160a01b03848116911614158062000218575080602001516001600160a01b0316826001600160a01b031614155b156200023757604051630358043160e01b815260040160405180910390fd5b62000244600285620003c9565b50816001600160a01b0316836001600160a01b0316856001600160a01b03167f5abe7702ac48299ef7647755d7af6d6a6beecd1c584bbb6fa55b7a882490efc760405160405180910390a450505050565b6200029f62000341565b6001546001600160a01b0390811690821603620002cf5760405163367558c360e01b815260040160405180910390fd5b6001600160a01b038116620002f75760405163d92e233d60e01b815260040160405180910390fd5b600180546001600160a01b0319166001600160a01b0383169081179091556040517f3123bae5152a999decbb5b69306adb30fa19885cf983c49427fd5b4594dcb03790600090a250565b6000546001600160a01b03163314620003a05760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640160405180910390fd5b565b6001600160a01b038116600090815260018301602052604081205415155b90505b92915050565b6000620003c0836001600160a01b03841660008181526001830160205260408120546200042357508154600181810184556000848152602080822090930184905584548482528286019093526040902091909155620003c3565b506000620003c3565b80516001600160a01b03811681146200044457600080fd5b919050565b600080600080608085870312156200046057600080fd5b6200046b856200042c565b93506200047b602086016200042c565b92506200048b604086016200042c565b91506200049b606086016200042c565b905092959194509250565b608051610a59620004c96000396000818161014a015261058e0152610a596000f3fe608060405234801561001057600080fd5b50600436106100b45760003560e01c8063715018a611610071578063715018a6146101815780638da5cb5b146101895780639b140a851461019a578063d1ea0a1d146101ad578063f2fde38b146101d0578063fbf1f78a146101e357600080fd5b806306121cd5146100b95780630cb299c9146100d75780630d0ae678146100ed5780631217afdb1461011257806356d9cb6414610145578063640769391461016c575b600080fd5b6100c16101f6565b6040516100ce919061090f565b60405180910390f35b6100df610207565b6040519081526020016100ce565b6001546001600160a01b03165b6040516001600160a01b0390911681526020016100ce565b610125610120366004610978565b610213565b604080516001600160a01b039384168152929091166020830152016100ce565b6100fa7f000000000000000000000000000000000000000000000000000000000000000081565b61017f61017a366004610978565b610251565b005b61017f6102f9565b6000546001600160a01b03166100fa565b61017f6101a8366004610993565b61030d565b6101c06101bb366004610978565b6104e4565b60405190151581526020016100ce565b61017f6101de366004610978565b610506565b61017f6101f1366004610978565b610584565b6060610202600261067f565b905090565b60006102026002610693565b6001600160a01b0390811660009081526004602090815260409182902082518084019093528054841680845260019091015490931691018190529091565b61025961069d565b6001546001600160a01b03908116908216036102885760405163367558c360e01b815260040160405180910390fd5b6001600160a01b0381166102af5760405163d92e233d60e01b815260040160405180910390fd5b600180546001600160a01b0319166001600160a01b0383169081179091556040517f3123bae5152a999decbb5b69306adb30fa19885cf983c49427fd5b4594dcb03790600090a250565b61030161069d565b61030b60006106f7565b565b61031561069d565b6001600160a01b038316158061033257506001600160a01b038216155b8061034457506001600160a01b038116155b156103625760405163d92e233d60e01b815260040160405180910390fd5b6001600160a01b03831660009081526003602052604090205415610399576040516362cee17560e11b815260040160405180910390fd5b6001600160a01b038084166000908152600460209081526040918290208251808401909352805484168084526001909101549093169082015290610438576040805180820182526001600160a01b03808616825284811660208084019182528883166000908152600490915293909320915182549082166001600160a01b03199182161783559251600190920180549290911691909216179055610488565b80516001600160a01b03848116911614158061046a575080602001516001600160a01b0316826001600160a01b031614155b1561048857604051630358043160e01b815260040160405180910390fd5b610493600285610747565b50816001600160a01b0316836001600160a01b0316856001600160a01b03167f5abe7702ac48299ef7647755d7af6d6a6beecd1c584bbb6fa55b7a882490efc760405160405180910390a450505050565b6001600160a01b03811660009081526003602052604081205415155b92915050565b61050e61069d565b6001600160a01b0381166105785760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084015b60405180910390fd5b610581816106f7565b50565b61058c61069d565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316816001600160a01b0316036105de57604051630a235adf60e11b815260040160405180910390fd5b6001600160a01b0381166000908152600360205260409020546106145760405163d38afd6560e01b815260040160405180910390fd5b61061f60028261075c565b5060008061062c83610213565b91509150806001600160a01b0316826001600160a01b0316846001600160a01b03167fbbbf8609bccd24696f7d2d86357dbd1a55ff9b79853a72ea11b1c0968ada177660405160405180910390a4505050565b6060600061068c83610771565b9392505050565b6000610500825490565b6000546001600160a01b0316331461030b5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161056f565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b600061068c836001600160a01b0384166107cd565b600061068c836001600160a01b03841661081c565b6060816000018054806020026020016040519081016040528092919081815260200182805480156107c157602002820191906000526020600020905b8154815260200190600101908083116107ad575b50505050509050919050565b600081815260018301602052604081205461081457508154600181810184556000848152602080822090930184905584548482528286019093526040902091909155610500565b506000610500565b600081815260018301602052604081205480156109055760006108406001836109d6565b8554909150600090610854906001906109d6565b90508181146108b9576000866000018281548110610874576108746109f7565b9060005260206000200154905080876000018481548110610897576108976109f7565b6000918252602080832090910192909255918252600188019052604090208390555b85548690806108ca576108ca610a0d565b600190038181906000526020600020016000905590558560010160008681526020019081526020016000206000905560019350505050610500565b6000915050610500565b6020808252825182820181905260009190848201906040850190845b818110156109505783516001600160a01b03168352928401929184019160010161092b565b50909695505050505050565b80356001600160a01b038116811461097357600080fd5b919050565b60006020828403121561098a57600080fd5b61068c8261095c565b6000806000606084860312156109a857600080fd5b6109b18461095c565b92506109bf6020850161095c565b91506109cd6040850161095c565b90509250925092565b8181038181111561050057634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052603160045260246000fdfea2646970667358221220236fd4384f96b65fdf86a6d6a97c1cd05835fc03b15d43b14a8dad37c2c20d9564736f6c634300081300330000000000000000000000000ba188d6d09229b9c2ed5083b461726ee8a2e9c90000000000000000000000004590571aad31b0d87553e86b47b77dd131d54f670000000000000000000000004402364d123b4a59a830fb1b6a1f21b03940728c0000000000000000000000003ed62d9d36f1034c22bb18fdea5cb8eb371138c5
Deployed Bytecode
0x608060405234801561001057600080fd5b50600436106100b45760003560e01c8063715018a611610071578063715018a6146101815780638da5cb5b146101895780639b140a851461019a578063d1ea0a1d146101ad578063f2fde38b146101d0578063fbf1f78a146101e357600080fd5b806306121cd5146100b95780630cb299c9146100d75780630d0ae678146100ed5780631217afdb1461011257806356d9cb6414610145578063640769391461016c575b600080fd5b6100c16101f6565b6040516100ce919061090f565b60405180910390f35b6100df610207565b6040519081526020016100ce565b6001546001600160a01b03165b6040516001600160a01b0390911681526020016100ce565b610125610120366004610978565b610213565b604080516001600160a01b039384168152929091166020830152016100ce565b6100fa7f0000000000000000000000000ba188d6d09229b9c2ed5083b461726ee8a2e9c981565b61017f61017a366004610978565b610251565b005b61017f6102f9565b6000546001600160a01b03166100fa565b61017f6101a8366004610993565b61030d565b6101c06101bb366004610978565b6104e4565b60405190151581526020016100ce565b61017f6101de366004610978565b610506565b61017f6101f1366004610978565b610584565b6060610202600261067f565b905090565b60006102026002610693565b6001600160a01b0390811660009081526004602090815260409182902082518084019093528054841680845260019091015490931691018190529091565b61025961069d565b6001546001600160a01b03908116908216036102885760405163367558c360e01b815260040160405180910390fd5b6001600160a01b0381166102af5760405163d92e233d60e01b815260040160405180910390fd5b600180546001600160a01b0319166001600160a01b0383169081179091556040517f3123bae5152a999decbb5b69306adb30fa19885cf983c49427fd5b4594dcb03790600090a250565b61030161069d565b61030b60006106f7565b565b61031561069d565b6001600160a01b038316158061033257506001600160a01b038216155b8061034457506001600160a01b038116155b156103625760405163d92e233d60e01b815260040160405180910390fd5b6001600160a01b03831660009081526003602052604090205415610399576040516362cee17560e11b815260040160405180910390fd5b6001600160a01b038084166000908152600460209081526040918290208251808401909352805484168084526001909101549093169082015290610438576040805180820182526001600160a01b03808616825284811660208084019182528883166000908152600490915293909320915182549082166001600160a01b03199182161783559251600190920180549290911691909216179055610488565b80516001600160a01b03848116911614158061046a575080602001516001600160a01b0316826001600160a01b031614155b1561048857604051630358043160e01b815260040160405180910390fd5b610493600285610747565b50816001600160a01b0316836001600160a01b0316856001600160a01b03167f5abe7702ac48299ef7647755d7af6d6a6beecd1c584bbb6fa55b7a882490efc760405160405180910390a450505050565b6001600160a01b03811660009081526003602052604081205415155b92915050565b61050e61069d565b6001600160a01b0381166105785760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084015b60405180910390fd5b610581816106f7565b50565b61058c61069d565b7f0000000000000000000000000ba188d6d09229b9c2ed5083b461726ee8a2e9c96001600160a01b0316816001600160a01b0316036105de57604051630a235adf60e11b815260040160405180910390fd5b6001600160a01b0381166000908152600360205260409020546106145760405163d38afd6560e01b815260040160405180910390fd5b61061f60028261075c565b5060008061062c83610213565b91509150806001600160a01b0316826001600160a01b0316846001600160a01b03167fbbbf8609bccd24696f7d2d86357dbd1a55ff9b79853a72ea11b1c0968ada177660405160405180910390a4505050565b6060600061068c83610771565b9392505050565b6000610500825490565b6000546001600160a01b0316331461030b5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161056f565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b600061068c836001600160a01b0384166107cd565b600061068c836001600160a01b03841661081c565b6060816000018054806020026020016040519081016040528092919081815260200182805480156107c157602002820191906000526020600020905b8154815260200190600101908083116107ad575b50505050509050919050565b600081815260018301602052604081205461081457508154600181810184556000848152602080822090930184905584548482528286019093526040902091909155610500565b506000610500565b600081815260018301602052604081205480156109055760006108406001836109d6565b8554909150600090610854906001906109d6565b90508181146108b9576000866000018281548110610874576108746109f7565b9060005260206000200154905080876000018481548110610897576108976109f7565b6000918252602080832090910192909255918252600188019052604090208390555b85548690806108ca576108ca610a0d565b600190038181906000526020600020016000905590558560010160008681526020019081526020016000206000905560019350505050610500565b6000915050610500565b6020808252825182820181905260009190848201906040850190845b818110156109505783516001600160a01b03168352928401929184019160010161092b565b50909695505050505050565b80356001600160a01b038116811461097357600080fd5b919050565b60006020828403121561098a57600080fd5b61068c8261095c565b6000806000606084860312156109a857600080fd5b6109b18461095c565b92506109bf6020850161095c565b91506109cd6040850161095c565b90509250925092565b8181038181111561050057634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052603160045260246000fdfea2646970667358221220236fd4384f96b65fdf86a6d6a97c1cd05835fc03b15d43b14a8dad37c2c20d9564736f6c63430008130033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
0000000000000000000000000ba188d6d09229b9c2ed5083b461726ee8a2e9c90000000000000000000000004590571aad31b0d87553e86b47b77dd131d54f670000000000000000000000004402364d123b4a59a830fb1b6a1f21b03940728c0000000000000000000000003ed62d9d36f1034c22bb18fdea5cb8eb371138c5
-----Decoded View---------------
Arg [0] : _fallbackPoolFactory (address): 0x0BA188D6D09229b9c2eD5083B461726EE8a2e9C9
Arg [1] : _fallbackVotingRewardsFactory (address): 0x4590571AAd31b0D87553E86B47b77Dd131D54f67
Arg [2] : _fallbackGaugeFactory (address): 0x4402364d123b4A59A830FB1b6a1F21b03940728c
Arg [3] : _newManagedRewardsFactory (address): 0x3eD62D9D36f1034c22BB18fdeA5cb8Eb371138c5
-----Encoded View---------------
4 Constructor Arguments found :
Arg [0] : 0000000000000000000000000ba188d6d09229b9c2ed5083b461726ee8a2e9c9
Arg [1] : 0000000000000000000000004590571aad31b0d87553e86b47b77dd131d54f67
Arg [2] : 0000000000000000000000004402364d123b4a59a830fb1b6a1f21b03940728c
Arg [3] : 0000000000000000000000003ed62d9d36f1034c22bb18fdea5cb8eb371138c5
Deployed Bytecode Sourcemap
20564:4591:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24690:115;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;25040:112;;;:::i;:::-;;;823:25:1;;;811:2;796:18;25040:112:0;677:177:1;24157:113:0;24240:22;;-1:-1:-1;;;;;24240:22:0;24157:113;;;-1:-1:-1;;;;;1023:32:1;;;1005:51;;993:2;978:18;24157:113:0;859:203:1;24316:328:0;;;;;;:::i;:::-;;:::i;:::-;;;;-1:-1:-1;;;;;1666:15:1;;;1648:34;;1718:15;;;;1713:2;1698:18;;1691:43;1583:18;24316:328:0;1436:304:1;21020:44:0;;;;;23725:386;;;;;;:::i;:::-;;:::i;:::-;;2922:103;;;:::i;2274:87::-;2320:7;2347:6;-1:-1:-1;;;;;2347:6:0;2274:87;;21914:1279;;;;;;:::i;:::-;;:::i;24851:143::-;;;;;;:::i;:::-;;:::i;:::-;;;2249:14:1;;2242:22;2224:41;;2212:2;2197:18;24851:143:0;2084:187:1;3180:201:0;;;;;;:::i;:::-;;:::i;23239:440::-;;;;;;:::i;:::-;;:::i;24690:115::-;24738:16;24774:23;:14;:21;:23::i;:::-;24767:30;;24690:115;:::o;25040:112::-;25094:7;25121:23;:14;:21;:23::i;24316:328::-;-1:-1:-1;;;;;24503:37:0;;;24406:28;24503:37;;;:24;:37;;;;;;;;;24469:71;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24316:328::o;23725:386::-;2160:13;:11;:13::i;:::-;23855:22:::1;::::0;-1:-1:-1;;;;;23855:22:0;;::::1;23826:51:::0;;::::1;::::0;23822:77:::1;;23886:13;;-1:-1:-1::0;;;23886:13:0::1;;;;;;;;;;;23822:77;-1:-1:-1::0;;;;;23914:39:0;::::1;23910:65;;23962:13;;-1:-1:-1::0;;;23962:13:0::1;;;;;;;;;;;23910:65;23986:22;:50:::0;;-1:-1:-1;;;;;;23986:50:0::1;-1:-1:-1::0;;;;;23986:50:0;::::1;::::0;;::::1;::::0;;;24052:51:::1;::::0;::::1;::::0;-1:-1:-1;;24052:51:0::1;23725:386:::0;:::o;2922:103::-;2160:13;:11;:13::i;:::-;2987:30:::1;3014:1;2987:18;:30::i;:::-;2922:103::o:0;21914:1279::-;2160:13;:11;:13::i;:::-;-1:-1:-1;;;;;22036:25:0;::::1;::::0;;:63:::1;;-1:-1:-1::0;;;;;;22065:34:0;::::1;::::0;22036:63:::1;:93;;;-1:-1:-1::0;;;;;;22103:26:0;::::1;::::0;22036:93:::1;22032:132;;;22151:13;;-1:-1:-1::0;;;22151:13:0::1;;;;;;;;;;;22032:132;-1:-1:-1::0;;;;;16331:23:0;;16277:4;11549:19;;;:12;:19;;;;;;:24;22175:70:::1;;22224:21;;-1:-1:-1::0;;;22224:21:0::1;;;;;;;;;;;22175:70;-1:-1:-1::0;;;;;22304:37:0;;::::1;22258:43;22304:37:::0;;;:24:::1;:37;::::0;;;;;;;;22258:83;;;;::::1;::::0;;;;;;::::1;::::0;;;;;;::::1;::::0;;;::::1;::::0;;::::1;::::0;;22502:568:::1;;22611:58;::::0;;;;::::1;::::0;;-1:-1:-1;;;;;22611:58:0;;::::1;::::0;;;;::::1;;::::0;;::::1;::::0;;;22571:37;;::::1;-1:-1:-1::0;22571:37:0;;;:24:::1;:37:::0;;;;;;;:98;;;;;;::::1;-1:-1:-1::0;;;;;;22571:98:0;;::::1;;::::0;;;;;;;::::1;::::0;;;;;::::1;::::0;;;::::1;;::::0;;22502:568:::1;;;22924:34:::0;;-1:-1:-1;;;;;22900:58:0;;::::1;::::0;::::1;;;::::0;:104:::1;;;22978:13;:26;;;-1:-1:-1::0;;;;;22962:42:0::1;:12;-1:-1:-1::0;;;;;22962:42:0::1;;;22900:104;22878:180;;;23027:31;;-1:-1:-1::0;;;23027:31:0::1;;;;;;;;;;;22878:180;23082:31;:14;23101:11:::0;23082:18:::1;:31::i;:::-;;23172:12;-1:-1:-1::0;;;;;23129:56:0::1;23150:20;-1:-1:-1::0;;;;;23129:56:0::1;23137:11;-1:-1:-1::0;;;;;23129:56:0::1;;;;;;;;;;;22021:1172;21914:1279:::0;;;:::o;24851:143::-;-1:-1:-1;;;;;16331:23:0;;24926:4;11549:19;;;:12;:19;;;;;;:24;;24950:36;24943:43;24851:143;-1:-1:-1;;24851:143:0:o;3180:201::-;2160:13;:11;:13::i;:::-;-1:-1:-1;;;;;3269:22:0;::::1;3261:73;;;::::0;-1:-1:-1;;;3261:73:0;;2478:2:1;3261:73:0::1;::::0;::::1;2460:21:1::0;2517:2;2497:18;;;2490:30;2556:34;2536:18;;;2529:62;-1:-1:-1;;;2607:18:1;;;2600:36;2653:19;;3261:73:0::1;;;;;;;;;3345:28;3364:8;3345:18;:28::i;:::-;3180:201:::0;:::o;23239:440::-;2160:13;:11;:13::i;:::-;23328:19:::1;-1:-1:-1::0;;;;;23313:34:0::1;:11;-1:-1:-1::0;;;;;23313:34:0::1;::::0;23309:64:::1;;23356:17;;-1:-1:-1::0;;;23356:17:0::1;;;;;;;;;;;23309:64;-1:-1:-1::0;;;;;16331:23:0;;16277:4;11549:19;;;:12;:19;;;;;;23384:67:::1;;23434:17;;-1:-1:-1::0;;;23434:17:0::1;;;;;;;;;;;23384:67;23462:34;:14;23484:11:::0;23462:21:::1;:34::i;:::-;;23508:28;23538:20:::0;23562:35:::1;23585:11;23562:22;:35::i;:::-;23507:90;;;;23658:12;-1:-1:-1::0;;;;;23613:58:0::1;23636:20;-1:-1:-1::0;;;;;23613:58:0::1;23623:11;-1:-1:-1::0;;;;;23613:58:0::1;;;;;;;;;;;23298:381;;23239:440:::0;:::o;17629:310::-;17692:16;17721:22;17746:19;17754:3;17746:7;:19::i;:::-;17721:44;17629:310;-1:-1:-1;;;17629:310:0:o;16450:117::-;16513:7;16540:19;16548:3;11750:18;;11667:109;2439:132;2320:7;2347:6;-1:-1:-1;;;;;2347:6:0;1063:10;2503:23;2495:68;;;;-1:-1:-1;;;2495:68:0;;2885:2:1;2495:68:0;;;2867:21:1;;;2904:18;;;2897:30;2963:34;2943:18;;;2936:62;3015:18;;2495:68:0;2683:356:1;3541:191:0;3615:16;3634:6;;-1:-1:-1;;;;;3651:17:0;;;-1:-1:-1;;;;;;3651:17:0;;;;;;3684:40;;3634:6;;;;;;;3684:40;;3615:16;3684:40;3604:128;3541:191;:::o;15625:152::-;15695:4;15719:50;15724:3;-1:-1:-1;;;;;15744:23:0;;15719:4;:50::i;15953:158::-;16026:4;16050:53;16058:3;-1:-1:-1;;;;;16078:23:0;;16050:7;:53::i;12800:111::-;12856:16;12892:3;:11;;12885:18;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12800:111;;;:::o;9356:414::-;9419:4;11549:19;;;:12;;;:19;;;;;;9436:327;;-1:-1:-1;9479:23:0;;;;;;;;:11;:23;;;;;;;;;;;;;9662:18;;9640:19;;;:12;;;:19;;;;;;:40;;;;9695:11;;9436:327;-1:-1:-1;9746:5:0;9739:12;;9946:1420;10012:4;10151:19;;;:12;;;:19;;;;;;10187:15;;10183:1176;;10562:21;10586:14;10599:1;10586:10;:14;:::i;:::-;10635:18;;10562:38;;-1:-1:-1;10615:17:0;;10635:22;;10656:1;;10635:22;:::i;:::-;10615:42;;10691:13;10678:9;:26;10674:405;;10725:17;10745:3;:11;;10757:9;10745:22;;;;;;;;:::i;:::-;;;;;;;;;10725:42;;10899:9;10870:3;:11;;10882:13;10870:26;;;;;;;;:::i;:::-;;;;;;;;;;;;:38;;;;10984:23;;;:12;;;:23;;;;;:36;;;10674:405;11160:17;;:3;;:17;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;11255:3;:12;;:19;11268:5;11255:19;;;;;;;;;;;11248:26;;;11298:4;11291:11;;;;;;;10183:1176;11342:5;11335:12;;;;;14:658:1;185:2;237:21;;;307:13;;210:18;;;329:22;;;156:4;;185:2;408:15;;;;382:2;367:18;;;156:4;451:195;465:6;462:1;459:13;451:195;;;530:13;;-1:-1:-1;;;;;526:39:1;514:52;;621:15;;;;586:12;;;;562:1;480:9;451:195;;;-1:-1:-1;663:3:1;;14:658;-1:-1:-1;;;;;;14:658:1:o;1067:173::-;1135:20;;-1:-1:-1;;;;;1184:31:1;;1174:42;;1164:70;;1230:1;1227;1220:12;1164:70;1067:173;;;:::o;1245:186::-;1304:6;1357:2;1345:9;1336:7;1332:23;1328:32;1325:52;;;1373:1;1370;1363:12;1325:52;1396:29;1415:9;1396:29;:::i;1745:334::-;1822:6;1830;1838;1891:2;1879:9;1870:7;1866:23;1862:32;1859:52;;;1907:1;1904;1897:12;1859:52;1930:29;1949:9;1930:29;:::i;:::-;1920:39;;1978:38;2012:2;2001:9;1997:18;1978:38;:::i;:::-;1968:48;;2035:38;2069:2;2058:9;2054:18;2035:38;:::i;:::-;2025:48;;1745:334;;;;;:::o;3044:225::-;3111:9;;;3132:11;;;3129:134;;;3185:10;3180:3;3176:20;3173:1;3166:31;3220:4;3217:1;3210:15;3248:4;3245:1;3238:15;3274:127;3335:10;3330:3;3326:20;3323:1;3316:31;3366:4;3363:1;3356:15;3390:4;3387:1;3380:15;3406:127;3467:10;3462:3;3458:20;3455:1;3448:31;3498:4;3495:1;3488:15;3522:4;3519:1;3512:15
Swarm Source
ipfs://236fd4384f96b65fdf86a6d6a97c1cd05835fc03b15d43b14a8dad37c2c20d95
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 30 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
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.