Overview
S Balance
0 S
S Value
$0.00More Info
Private Name Tags
ContractCreator
Latest 2 internal transactions
Parent Transaction Hash | Block | From | To | |||
---|---|---|---|---|---|---|
4976198 | 7 days ago | Contract Creation | 0 S | |||
2867778 | 22 days ago | Contract Creation | 0 S |
Loading...
Loading
This contract may be a proxy contract. Click on More Options and select Is this a proxy? to confirm and enable the "Read as Proxy" & "Write as Proxy" tabs.
Contract Source Code Verified (Exact Match)
Contract Name:
CurveXChainLiquidityGaugeFactory
Compiler Version
vyper:0.3.10
Contract Source Code (Vyper language format)
# pragma version 0.3.10 # pragma evm-version paris """ @title CurveXChainLiquidityGaugeFactory @custom:version 2.0.1 @author Curve.Fi @license Copyright (c) Curve.Fi, 2020-2024 - all rights reserved @notice Layer2/Cross-Chain Gauge Factory for Curve """ version: public(constant(String[8])) = "2.0.1" from vyper.interfaces import ERC20 interface ChildGauge: def initialize(_lp_token: address, _root: address, _manager: address): nonpayable def integrate_fraction(_user: address) -> uint256: view def user_checkpoint(_user: address) -> bool: nonpayable interface CallProxy: def anyCall( _to: address, _data: Bytes[1024], _fallback: address, _to_chain_id: uint256 ): nonpayable event DeployedGauge: _implementation: indexed(address) _lp_token: indexed(address) _deployer: indexed(address) _salt: bytes32 _gauge: address event Minted: _user: indexed(address) _gauge: indexed(address) _new_total: uint256 event UpdateImplementation: _old_implementation: address _new_implementation: address event UpdateVotingEscrow: _old_voting_escrow: address _new_voting_escrow: address event UpdateRoot: _factory: address _implementation: address event UpdateManager: _manager: address event UpdateCallProxy: _old_call_proxy: address _new_call_proxy: address event UpdateMirrored: _gauge: indexed(address) _mirrored: bool event TransferOwnership: _old_owner: address _new_owner: address WEEK: constant(uint256) = 86400 * 7 crv: public(ERC20) get_implementation: public(address) voting_escrow: public(address) owner: public(address) future_owner: public(address) manager: public(address) root_factory: public(address) root_implementation: public(address) call_proxy: public(address) # [last_request][has_counterpart][is_valid_gauge] gauge_data: public(HashMap[address, uint256]) # user -> gauge -> value minted: public(HashMap[address, HashMap[address, uint256]]) get_gauge_from_lp_token: public(HashMap[address, address]) get_gauge_count: public(uint256) get_gauge: public(address[max_value(int128)]) deployer: immutable(address) @external def __init__(_root_factory: address, _root_impl: address, _crv: address): """ @param _root_factory Root factory to anchor to @param _root_impl Address of root gauge implementation to calculate mirror (can be updated) @param _crv Bridged CRV token address (might be zero if not known yet) """ self.crv = ERC20(_crv) assert _root_factory != empty(address) assert _root_impl != empty(address) self.root_factory = _root_factory self.root_implementation = _root_impl log UpdateRoot(_root_factory, _root_impl) self.owner = msg.sender log TransferOwnership(empty(address), msg.sender) self.manager = msg.sender log UpdateManager(msg.sender) deployer = msg.sender @external def set_owner(_owner: address): assert msg.sender == deployer assert self.owner == deployer assert _owner != deployer log TransferOwnership(self.owner, _owner) self.owner = _owner @internal def _psuedo_mint(_gauge: address, _user: address): gauge_data: uint256 = self.gauge_data[_gauge] assert gauge_data != 0 # dev: invalid gauge # if is_mirrored and last_request != this week if gauge_data & 2 != 0 and (gauge_data >> 2) / WEEK != block.timestamp / WEEK: CallProxy(self.call_proxy).anyCall( self, _abi_encode(_gauge, method_id=method_id("transmit_emissions(address)")), empty(address), 1, ) # update last request time self.gauge_data[_gauge] = block.timestamp << 2 + 3 assert ChildGauge(_gauge).user_checkpoint(_user) total_mint: uint256 = ChildGauge(_gauge).integrate_fraction(_user) to_mint: uint256 = total_mint - self.minted[_user][_gauge] if to_mint != 0 and self.crv != empty(ERC20): assert self.crv.transfer(_user, to_mint, default_return_value=True) self.minted[_user][_gauge] = total_mint log Minted(_user, _gauge, total_mint) @external @nonreentrant("lock") def mint(_gauge: address): """ @notice Mint everything which belongs to `msg.sender` and send to them @param _gauge `LiquidityGauge` address to get mintable amount from """ self._psuedo_mint(_gauge, msg.sender) @external @nonreentrant("lock") def mint_many(_gauges: address[32]): """ @notice Mint everything which belongs to `msg.sender` across multiple gauges @param _gauges List of `LiquidityGauge` addresses """ for i in range(32): if _gauges[i] == empty(address): pass self._psuedo_mint(_gauges[i], msg.sender) @external def deploy_gauge(_lp_token: address, _salt: bytes32, _manager: address = msg.sender) -> address: """ @notice Deploy a liquidity gauge @param _lp_token The token to deposit in the gauge @param _salt A value to deterministically deploy a gauge @param _manager The address to set as manager of the gauge """ if self.get_gauge_from_lp_token[_lp_token] != empty(address): # overwriting lp_token -> gauge mapping requires assert msg.sender == self.owner # dev: only owner gauge_data: uint256 = 1 # set is_valid_gauge = True implementation: address = self.get_implementation salt: bytes32 = keccak256(_abi_encode(chain.id, _salt)) gauge: address = create_minimal_proxy_to( implementation, salt=salt ) if msg.sender == self.call_proxy: gauge_data += 2 # set mirrored = True log UpdateMirrored(gauge, True) # issue a call to the root chain to deploy a root gauge CallProxy(self.call_proxy).anyCall( self, _abi_encode(chain.id, _salt, method_id=method_id("deploy_gauge(uint256,bytes32)")), empty(address), 1 ) self.gauge_data[gauge] = gauge_data idx: uint256 = self.get_gauge_count self.get_gauge[idx] = gauge self.get_gauge_count = idx + 1 self.get_gauge_from_lp_token[_lp_token] = gauge # derive root gauge address gauge_codehash: bytes32 = keccak256( concat( 0x602d3d8160093d39f3363d3d373d3d3d363d73, convert(self.root_implementation, bytes20), 0x5af43d82803e903d91602b57fd5bf3, ) ) digest: bytes32 = keccak256(concat(0xFF, convert(self.root_factory, bytes20), salt, gauge_codehash)) root: address = convert(convert(digest, uint256) & convert(max_value(uint160), uint256), address) # If root is uninitialized, self.owner can always set the root gauge manually # on the gauge contract itself via set_root_gauge method ChildGauge(gauge).initialize(_lp_token, root, _manager) log DeployedGauge(implementation, _lp_token, msg.sender, _salt, gauge) return gauge @external def set_crv(_crv: ERC20): """ @notice Sets CRV token address @dev Child gauges reference the factory to fetch CRV address If empty, the gauges do not mint any CRV tokens. @param _crv address of CRV token on child chain """ assert msg.sender == self.owner assert _crv != empty(ERC20) assert self.crv == empty(ERC20), "CRV already set" self.crv = _crv @external def set_root(_factory: address, _implementation: address): """ @notice Update root addresses @dev Addresses are used only as helper methods @param _factory Root gauge factory @param _implementation Root gauge """ assert msg.sender in [self.owner, self.manager] # dev: access denied self.root_factory = _factory self.root_implementation = _implementation log UpdateRoot(_factory, _implementation) @external def set_voting_escrow(_voting_escrow: address): """ @notice Update the voting escrow contract @param _voting_escrow Contract to use as the voting escrow oracle """ assert msg.sender == self.owner # dev: only owner log UpdateVotingEscrow(self.voting_escrow, _voting_escrow) self.voting_escrow = _voting_escrow @external def set_implementation(_implementation: address): """ @notice Set the implementation @param _implementation The address of the implementation to use """ assert msg.sender == self.owner # dev: only owner log UpdateImplementation(self.get_implementation, _implementation) self.get_implementation = _implementation @external def set_mirrored(_gauge: address, _mirrored: bool): """ @notice Set the mirrored bit of the gauge data for `_gauge` @param _gauge The gauge of interest @param _mirrored Boolean deteremining whether to set the mirrored bit to True/False """ gauge_data: uint256 = self.gauge_data[_gauge] assert gauge_data != 0 # dev: invalid gauge assert msg.sender == self.owner # dev: only owner gauge_data = gauge_data | 1 # set is_valid_gauge = True if _mirrored: gauge_data += 2 # set is_mirrored = True self.gauge_data[_gauge] = gauge_data log UpdateMirrored(_gauge, _mirrored) @external def set_call_proxy(_new_call_proxy: address): """ @notice Set the address of the call proxy used @dev _new_call_proxy should adhere to the same interface as defined @param _new_call_proxy Address of the cross chain call proxy """ assert msg.sender == self.owner log UpdateCallProxy(self.call_proxy, _new_call_proxy) self.call_proxy = _new_call_proxy @external def set_manager(_new_manager: address): assert msg.sender in [self.owner, self.manager] # dev: access denied self.manager = _new_manager log UpdateManager(_new_manager) @external def commit_transfer_ownership(_future_owner: address): """ @notice Transfer ownership to `_future_owner` @param _future_owner The account to commit as the future owner """ assert msg.sender == self.owner # dev: only owner self.future_owner = _future_owner @external def accept_transfer_ownership(): """ @notice Accept the transfer of ownership @dev Only the committed future owner can call this function """ assert msg.sender == self.future_owner # dev: only future owner log TransferOwnership(self.owner, msg.sender) self.owner = msg.sender @view @external def is_valid_gauge(_gauge: address) -> bool: """ @notice Query whether the gauge is a valid one deployed via the factory @param _gauge The address of the gauge of interest """ return self.gauge_data[_gauge] != 0 @view @external def is_mirrored(_gauge: address) -> bool: """ @notice Query whether the gauge is mirrored on Ethereum mainnet @param _gauge The address of the gauge of interest """ return (self.gauge_data[_gauge] & 2) != 0 @view @external def last_request(_gauge: address) -> uint256: """ @notice Query the timestamp of the last cross chain request for emissions @param _gauge The address of the gauge of interest """ return self.gauge_data[_gauge] >> 2
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"name":"DeployedGauge","inputs":[{"name":"_implementation","type":"address","indexed":true},{"name":"_lp_token","type":"address","indexed":true},{"name":"_deployer","type":"address","indexed":true},{"name":"_salt","type":"bytes32","indexed":false},{"name":"_gauge","type":"address","indexed":false}],"anonymous":false,"type":"event"},{"name":"Minted","inputs":[{"name":"_user","type":"address","indexed":true},{"name":"_gauge","type":"address","indexed":true},{"name":"_new_total","type":"uint256","indexed":false}],"anonymous":false,"type":"event"},{"name":"UpdateImplementation","inputs":[{"name":"_old_implementation","type":"address","indexed":false},{"name":"_new_implementation","type":"address","indexed":false}],"anonymous":false,"type":"event"},{"name":"UpdateVotingEscrow","inputs":[{"name":"_old_voting_escrow","type":"address","indexed":false},{"name":"_new_voting_escrow","type":"address","indexed":false}],"anonymous":false,"type":"event"},{"name":"UpdateRoot","inputs":[{"name":"_factory","type":"address","indexed":false},{"name":"_implementation","type":"address","indexed":false}],"anonymous":false,"type":"event"},{"name":"UpdateManager","inputs":[{"name":"_manager","type":"address","indexed":false}],"anonymous":false,"type":"event"},{"name":"UpdateCallProxy","inputs":[{"name":"_old_call_proxy","type":"address","indexed":false},{"name":"_new_call_proxy","type":"address","indexed":false}],"anonymous":false,"type":"event"},{"name":"UpdateMirrored","inputs":[{"name":"_gauge","type":"address","indexed":true},{"name":"_mirrored","type":"bool","indexed":false}],"anonymous":false,"type":"event"},{"name":"TransferOwnership","inputs":[{"name":"_old_owner","type":"address","indexed":false},{"name":"_new_owner","type":"address","indexed":false}],"anonymous":false,"type":"event"},{"stateMutability":"nonpayable","type":"constructor","inputs":[{"name":"_root_factory","type":"address"},{"name":"_root_impl","type":"address"},{"name":"_crv","type":"address"}],"outputs":[]},{"stateMutability":"nonpayable","type":"function","name":"set_owner","inputs":[{"name":"_owner","type":"address"}],"outputs":[]},{"stateMutability":"nonpayable","type":"function","name":"mint","inputs":[{"name":"_gauge","type":"address"}],"outputs":[]},{"stateMutability":"nonpayable","type":"function","name":"mint_many","inputs":[{"name":"_gauges","type":"address[32]"}],"outputs":[]},{"stateMutability":"nonpayable","type":"function","name":"deploy_gauge","inputs":[{"name":"_lp_token","type":"address"},{"name":"_salt","type":"bytes32"}],"outputs":[{"name":"","type":"address"}]},{"stateMutability":"nonpayable","type":"function","name":"deploy_gauge","inputs":[{"name":"_lp_token","type":"address"},{"name":"_salt","type":"bytes32"},{"name":"_manager","type":"address"}],"outputs":[{"name":"","type":"address"}]},{"stateMutability":"nonpayable","type":"function","name":"set_crv","inputs":[{"name":"_crv","type":"address"}],"outputs":[]},{"stateMutability":"nonpayable","type":"function","name":"set_root","inputs":[{"name":"_factory","type":"address"},{"name":"_implementation","type":"address"}],"outputs":[]},{"stateMutability":"nonpayable","type":"function","name":"set_voting_escrow","inputs":[{"name":"_voting_escrow","type":"address"}],"outputs":[]},{"stateMutability":"nonpayable","type":"function","name":"set_implementation","inputs":[{"name":"_implementation","type":"address"}],"outputs":[]},{"stateMutability":"nonpayable","type":"function","name":"set_mirrored","inputs":[{"name":"_gauge","type":"address"},{"name":"_mirrored","type":"bool"}],"outputs":[]},{"stateMutability":"nonpayable","type":"function","name":"set_call_proxy","inputs":[{"name":"_new_call_proxy","type":"address"}],"outputs":[]},{"stateMutability":"nonpayable","type":"function","name":"set_manager","inputs":[{"name":"_new_manager","type":"address"}],"outputs":[]},{"stateMutability":"nonpayable","type":"function","name":"commit_transfer_ownership","inputs":[{"name":"_future_owner","type":"address"}],"outputs":[]},{"stateMutability":"nonpayable","type":"function","name":"accept_transfer_ownership","inputs":[],"outputs":[]},{"stateMutability":"view","type":"function","name":"is_valid_gauge","inputs":[{"name":"_gauge","type":"address"}],"outputs":[{"name":"","type":"bool"}]},{"stateMutability":"view","type":"function","name":"is_mirrored","inputs":[{"name":"_gauge","type":"address"}],"outputs":[{"name":"","type":"bool"}]},{"stateMutability":"view","type":"function","name":"last_request","inputs":[{"name":"_gauge","type":"address"}],"outputs":[{"name":"","type":"uint256"}]},{"stateMutability":"view","type":"function","name":"version","inputs":[],"outputs":[{"name":"","type":"string"}]},{"stateMutability":"view","type":"function","name":"crv","inputs":[],"outputs":[{"name":"","type":"address"}]},{"stateMutability":"view","type":"function","name":"get_implementation","inputs":[],"outputs":[{"name":"","type":"address"}]},{"stateMutability":"view","type":"function","name":"voting_escrow","inputs":[],"outputs":[{"name":"","type":"address"}]},{"stateMutability":"view","type":"function","name":"owner","inputs":[],"outputs":[{"name":"","type":"address"}]},{"stateMutability":"view","type":"function","name":"future_owner","inputs":[],"outputs":[{"name":"","type":"address"}]},{"stateMutability":"view","type":"function","name":"manager","inputs":[],"outputs":[{"name":"","type":"address"}]},{"stateMutability":"view","type":"function","name":"root_factory","inputs":[],"outputs":[{"name":"","type":"address"}]},{"stateMutability":"view","type":"function","name":"root_implementation","inputs":[],"outputs":[{"name":"","type":"address"}]},{"stateMutability":"view","type":"function","name":"call_proxy","inputs":[],"outputs":[{"name":"","type":"address"}]},{"stateMutability":"view","type":"function","name":"gauge_data","inputs":[{"name":"arg0","type":"address"}],"outputs":[{"name":"","type":"uint256"}]},{"stateMutability":"view","type":"function","name":"minted","inputs":[{"name":"arg0","type":"address"},{"name":"arg1","type":"address"}],"outputs":[{"name":"","type":"uint256"}]},{"stateMutability":"view","type":"function","name":"get_gauge_from_lp_token","inputs":[{"name":"arg0","type":"address"}],"outputs":[{"name":"","type":"address"}]},{"stateMutability":"view","type":"function","name":"get_gauge_count","inputs":[],"outputs":[{"name":"","type":"uint256"}]},{"stateMutability":"view","type":"function","name":"get_gauge","inputs":[{"name":"arg0","type":"uint256"}],"outputs":[{"name":"","type":"address"}]}]
Contract Creation Code
6112475150346101175760206113796000396000518060a01c6101175760405260206113996000396000518060a01c6101175760605260206113b96000396000518060a01c61011757608052608051600155604051156101175760605115610117576040516007556060516008557f70f9501abbdc1e859ff8c1a6d83d3cb1ba973674e97c3e3c2292540d6e40dcfe60405160a05260605160c052604060a0a1336004557f5c486528ec3e3f0ea91181cff8116f02bfa350e03b8b6f12e00765adbb5af85c600060a0523360c052604060a0a1336006557f5c18ab5c697b63d102fc7e14c77bfaef0f1013206eca139920fd389277814e093360a052602060a0a1336112475261124761011c61000039611267610000f35b600080fd60003560e01c6002601d820660011b61120d01601e39600051565b6354fd4d50811861009957346112085760208060805260056040527f322e302e3100000000000000000000000000000000000000000000000000000060605260408160800181518152602082015160208201528051806020830101601f82600003163682375050601f19601f8251602001011690509050810190506080f35b631ec0cdc181186100b557346112085760055460405260206040f35b6366e1de658118610f5f57604436103417611208576004358060a01c611208576040526024358060a01c611208576060523360045481186100f75760016100fe565b6006548118155b905015611208576040516007556060516008557f70f9501abbdc1e859ff8c1a6d83d3cb1ba973674e97c3e3c2292540d6e40dcfe60405160805260605160a05260406080a100610f5f565b636a4874a18118610f5f57346112085760015460405260206040f3610f5f565b63c781c6688118610f5f57346112085760025460405260206040f3610f5f565b63dfe0503181186101a557346112085760035460405260206040f35b639aece83e8118610f5f57602436103417611208576004358060a01c611208576040523360045481186101d95760016101e0565b6006548118155b905015611208576040516006557f5c18ab5c697b63d102fc7e14c77bfaef0f1013206eca139920fd389277814e0960405160605260206060a100610f5f565b638da5cb5b811861023b57346112085760045460405260206040f35b63285218488118610f5f57602436103417611208576004356f7ffffffffffffffffffffffffffffffe811161120857600e015460405260206040f3610f5f565b63481c6a758118610f5f57346112085760065460405260206040f3610f5f565b633043228d8118610f5f57346112085760075460405260206040f3610f5f565b637de035c18118610f5f57346112085760085460405260206040f3610f5f565b63f81c6c3e81186102f757346112085760095460405260206040f35b635d95c65e8118610f5f57602436103417611208576004358060a01c61120857604052600c60405160205260005260406000205460605260206060f3610f5f565b63f0ce32f8811861037557602436103417611208576004358060a01c61120857604052600a60405160205260005260406000205460605260206060f35b632d4841218118610f5f57602436103417611208576004358060a01c6112085760405260045433186112085760405115611208576001541561040e57600f6060527f43525620616c726561647920736574000000000000000000000000000000000060805260605060605180608001601f826000031636823750506308c379a06020526020604052601f19601f6060510116604401603cfd5b60405160015500610f5f565b638b752bb08118610f5f57604436103417611208576004358060a01c611208576040526024358060a01c61120857606052600b604051602052600052604060002080606051602052600052604060002090505460805260206080f3610f5f565b63f111569c8118610f5f573461120857600d5460405260206040f3610f5f565b637cb97b2b811861052e57602436103417611208576004358060a01c61120857604052602061124760003960005133186112085760206112476000396000516004541861120857602061124760003960005160405114611208577f5c486528ec3e3f0ea91181cff8116f02bfa350e03b8b6f12e00765adbb5af85c60045460605260405160805260406060a1604051600455005b635ecb9e148118610f5f57602436103417611208576004358060a01c611208576040526004543318611208577fe385116766307e81d4427b03f1ac50c300b2f6a5df7b3c67eeb7eaaab12f080560095460605260405160805260406060a160405160095500610f5f565b636a6278428118610f5f57602436103417611208576004358060a01c611208576102005260005460021461120857600260005561020051604052336060526105de610f65565b600360005500610f5f565b6355ec67088118610f5f5761040436103417611208576004358060a01c61120857610200526024358060a01c61120857610220526044358060a01c61120857610240526064358060a01c61120857610260526084358060a01c611208576102805260a4358060a01c611208576102a05260c4358060a01c611208576102c05260e4358060a01c611208576102e052610104358060a01c6112085761030052610124358060a01c6112085761032052610144358060a01c6112085761034052610164358060a01c6112085761036052610184358060a01c61120857610380526101a4358060a01c611208576103a0526101c4358060a01c611208576103c0526101e4358060a01c611208576103e052610204358060a01c6112085761040052610224358060a01c6112085761042052610244358060a01c6112085761044052610264358060a01c6112085761046052610284358060a01c61120857610480526102a4358060a01c611208576104a0526102c4358060a01c611208576104c0526102e4358060a01c611208576104e052610304358060a01c6112085761050052610324358060a01c6112085761052052610344358060a01c6112085761054052610364358060a01c6112085761056052610384358060a01c61120857610580526103a4358060a01c611208576105a0526103c4358060a01c611208576105c0526103e4358060a01c611208576105e05260005460021461120857600260005560006020905b806106005261060051601f81116112085760051b610200015161082a575b61060051601f81116112085760051b61020001516040523360605261084d610f65565b60010181811861080c575050600360005500610f5f565b638db98b5c8118610f5f5760443610341761120857336060526108aa56610f5f565b636be320d28118610f5f57606436103417611208576044358060a01c611208576060525b6004358060a01c61120857604052600c604051602052600052604060002054156108d8576004543318611208575b600160805260025460a052466101005260243561012052604060e05260e080516020820120905060c0527f602d3d8160093d39f3363d3d373d3d3d363d73000000000000000000000000006101005260a05160601b610113527f5af43d82803e903d91602b57fd5bf300000000000000000000000000000000006101275260c05160366101006000f580156112085760e0526009543318610a60576080516002810181811061120857905060805260e0517f54b0a41dd85251df77437effbf9fbdca133bd234e7771816495877177288092c6001610100526020610100a260095463f9754c93610180526080306101a052806101c05263e10a16b861010452600446610124526024356101445260400161010052610100816101a00160208251018082828560045afa50508051806020830101601f82600003163682375050601f19601f82516020010116905090508101905060006101e05260016102005250803b1561120857600061018061010461019c6000855af1610a5e573d600060003e3d6000fd5b505b608051600a60e051602052600052604060002055600d546101005260e051610100516f7ffffffffffffffffffffffffffffffe811161120857600e01556101005160018101818110611208579050600d5560e051600c60405160205260005260406000205560007f602d3d8160093d39f3363d3d373d3d3d363d73000000000000000000000000008161016001526013810190506008548060601b90508161016001526014810190507f5af43d82803e903d91602b57fd5bf30000000000000000000000000000000000816101600152600f81019050806101405261014090508051602082012090506101205260007fff000000000000000000000000000000000000000000000000000000000000008161018001526001810190506007548060601b905081610180015260148101905060c05181610180015260208101905061012051816101800152602081019050806101605261016090508051602082012090506101405273ffffffffffffffffffffffffffffffffffffffff61014051168060a01c611208576101605260e05163c0c53b8b610180526040516101a052610160516101c0526060516101e052803b15611208576000610180606461019c6000855af1610c34573d600060003e3d6000fd5b503360405160a0517f69e16554b097f489830077da86e9e40cc91529a8d0787c42c4f33a0a337a0e086024356101805260e0516101a0526040610180a4602060e0f3610f5f565b6323fc5a478118610f5f57602436103417611208576004358060a01c611208576040526004543318611208577fa1b167642dcf1fee2fbf716c48c7c3f2326e4f26020cb042cd6405dfa72f4fd260035460605260405160805260406060a160405160035500610f5f565b634cd69da08118610f5f57602436103417611208576004358060a01c611208576040526004543318611208577fcdfeee65e4d0a88d6e47c5d034c34b03d52f1e6ffc56906257fc93d993ca04c460025460605260405160805260406060a160405160025500610f5f565b634b29cac88118610e0f57604436103417611208576004358060a01c611208576040526024358060011c61120857606052600a604051602052600052604060002054608052608051156112085760045433186112085760016080511760805260605115610dca57608051600281018181106112085790506080525b608051600a6040516020526000526040600020556040517f54b0a41dd85251df77437effbf9fbdca133bd234e7771816495877177288092c60605160a052602060a0a2005b636b441a408118610f5f57602436103417611208576004358060a01c6112085760405260045433186112085760405160055500610f5f565b63e5ea47b88118610e965734611208576005543318611208577f5c486528ec3e3f0ea91181cff8116f02bfa350e03b8b6f12e00765adbb5af85c6004546040523360605260406040a133600455005b6351bd4db58118610f5f57602436103417611208576004358060a01c61120857604052600a60405160205260005260406000205460021c60605260206060f3610f5f565b634b9203798118610f5f57602436103417611208576004358060a01c61120857604052600a604051602052600052604060002054151560605260206060f3610f5f565b638a42bd828118610f5f57602436103417611208576004358060a01c611208576040526002600a60405160205260005260406000205416151560605260206060f35b60006000fd5b600a604051602052600052604060002054608052608051156112085760026080511615610faa574262093a808104905060805160021c62093a80810490501415610fad565b60005b156110675760095463f9754c93610100526080306101205280610140526311bfb95660a452600460405160c45260200160a05260a0816101200160208251018082828560045afa50508051806020830101601f82600003163682375050601f19601f82516020010116905090508101905060006101605260016101805250803b1561120857600061010060e461011c6000855af1611050573d600060003e3d6000fd5b504260051b600a6040516020526000526040600020555b604051634b82009360a05260605160c052602060a0602460bc6000855af1611094573d600060003e3d6000fd5b60203d106112085760a0518060011c6112085760e05260e09050511561120857604051630940070760c05260605160e052602060c0602460dc845afa6110df573d600060003e3d6000fd5b60203d106112085760c090505160a05260a051600b6060516020526000526040600020806040516020526000526040600020905054808203828111611208579050905060c05260c0511561113757600154151561113a565b60005b156112065760015463a9059cbb60e0526060516101005260c05161012052602060e0604460fc6000855af1611174573d600060003e3d6000fd5b3d61118b57803b15611208576001610140526111a3565b60203d106112085760e0518060011c61120857610140525b610140905051156112085760a051600b60605160205260005260406000208060405160205260005260406000209050556040516060517f9d228d69b5fdb8d273a2336f8fb8612d039631024ea9bf09c424a9503aa078f060a05160e052602060e0a35b565b600080fd0f5f03380f5f0f5f0d4f059808860eda049a0c7b0ce5041a047a0f5f0f5f001a027b05e9021f0f5f02db01490e47018902bb029b016908640f1d8419124781183a1820a16576797065728300030a0016000000000000000000000000306a45a1478a000dc701a6e1f7a569afb8d9dcd600000000000000000000000096720942f9ff22efd8611f696e5333fe3671717a0000000000000000000000000000000000000000000000000000000000000000
Deployed Bytecode
0x60003560e01c6002601d820660011b61120d01601e39600051565b6354fd4d50811861009957346112085760208060805260056040527f322e302e3100000000000000000000000000000000000000000000000000000060605260408160800181518152602082015160208201528051806020830101601f82600003163682375050601f19601f8251602001011690509050810190506080f35b631ec0cdc181186100b557346112085760055460405260206040f35b6366e1de658118610f5f57604436103417611208576004358060a01c611208576040526024358060a01c611208576060523360045481186100f75760016100fe565b6006548118155b905015611208576040516007556060516008557f70f9501abbdc1e859ff8c1a6d83d3cb1ba973674e97c3e3c2292540d6e40dcfe60405160805260605160a05260406080a100610f5f565b636a4874a18118610f5f57346112085760015460405260206040f3610f5f565b63c781c6688118610f5f57346112085760025460405260206040f3610f5f565b63dfe0503181186101a557346112085760035460405260206040f35b639aece83e8118610f5f57602436103417611208576004358060a01c611208576040523360045481186101d95760016101e0565b6006548118155b905015611208576040516006557f5c18ab5c697b63d102fc7e14c77bfaef0f1013206eca139920fd389277814e0960405160605260206060a100610f5f565b638da5cb5b811861023b57346112085760045460405260206040f35b63285218488118610f5f57602436103417611208576004356f7ffffffffffffffffffffffffffffffe811161120857600e015460405260206040f3610f5f565b63481c6a758118610f5f57346112085760065460405260206040f3610f5f565b633043228d8118610f5f57346112085760075460405260206040f3610f5f565b637de035c18118610f5f57346112085760085460405260206040f3610f5f565b63f81c6c3e81186102f757346112085760095460405260206040f35b635d95c65e8118610f5f57602436103417611208576004358060a01c61120857604052600c60405160205260005260406000205460605260206060f3610f5f565b63f0ce32f8811861037557602436103417611208576004358060a01c61120857604052600a60405160205260005260406000205460605260206060f35b632d4841218118610f5f57602436103417611208576004358060a01c6112085760405260045433186112085760405115611208576001541561040e57600f6060527f43525620616c726561647920736574000000000000000000000000000000000060805260605060605180608001601f826000031636823750506308c379a06020526020604052601f19601f6060510116604401603cfd5b60405160015500610f5f565b638b752bb08118610f5f57604436103417611208576004358060a01c611208576040526024358060a01c61120857606052600b604051602052600052604060002080606051602052600052604060002090505460805260206080f3610f5f565b63f111569c8118610f5f573461120857600d5460405260206040f3610f5f565b637cb97b2b811861052e57602436103417611208576004358060a01c61120857604052602061124760003960005133186112085760206112476000396000516004541861120857602061124760003960005160405114611208577f5c486528ec3e3f0ea91181cff8116f02bfa350e03b8b6f12e00765adbb5af85c60045460605260405160805260406060a1604051600455005b635ecb9e148118610f5f57602436103417611208576004358060a01c611208576040526004543318611208577fe385116766307e81d4427b03f1ac50c300b2f6a5df7b3c67eeb7eaaab12f080560095460605260405160805260406060a160405160095500610f5f565b636a6278428118610f5f57602436103417611208576004358060a01c611208576102005260005460021461120857600260005561020051604052336060526105de610f65565b600360005500610f5f565b6355ec67088118610f5f5761040436103417611208576004358060a01c61120857610200526024358060a01c61120857610220526044358060a01c61120857610240526064358060a01c61120857610260526084358060a01c611208576102805260a4358060a01c611208576102a05260c4358060a01c611208576102c05260e4358060a01c611208576102e052610104358060a01c6112085761030052610124358060a01c6112085761032052610144358060a01c6112085761034052610164358060a01c6112085761036052610184358060a01c61120857610380526101a4358060a01c611208576103a0526101c4358060a01c611208576103c0526101e4358060a01c611208576103e052610204358060a01c6112085761040052610224358060a01c6112085761042052610244358060a01c6112085761044052610264358060a01c6112085761046052610284358060a01c61120857610480526102a4358060a01c611208576104a0526102c4358060a01c611208576104c0526102e4358060a01c611208576104e052610304358060a01c6112085761050052610324358060a01c6112085761052052610344358060a01c6112085761054052610364358060a01c6112085761056052610384358060a01c61120857610580526103a4358060a01c611208576105a0526103c4358060a01c611208576105c0526103e4358060a01c611208576105e05260005460021461120857600260005560006020905b806106005261060051601f81116112085760051b610200015161082a575b61060051601f81116112085760051b61020001516040523360605261084d610f65565b60010181811861080c575050600360005500610f5f565b638db98b5c8118610f5f5760443610341761120857336060526108aa56610f5f565b636be320d28118610f5f57606436103417611208576044358060a01c611208576060525b6004358060a01c61120857604052600c604051602052600052604060002054156108d8576004543318611208575b600160805260025460a052466101005260243561012052604060e05260e080516020820120905060c0527f602d3d8160093d39f3363d3d373d3d3d363d73000000000000000000000000006101005260a05160601b610113527f5af43d82803e903d91602b57fd5bf300000000000000000000000000000000006101275260c05160366101006000f580156112085760e0526009543318610a60576080516002810181811061120857905060805260e0517f54b0a41dd85251df77437effbf9fbdca133bd234e7771816495877177288092c6001610100526020610100a260095463f9754c93610180526080306101a052806101c05263e10a16b861010452600446610124526024356101445260400161010052610100816101a00160208251018082828560045afa50508051806020830101601f82600003163682375050601f19601f82516020010116905090508101905060006101e05260016102005250803b1561120857600061018061010461019c6000855af1610a5e573d600060003e3d6000fd5b505b608051600a60e051602052600052604060002055600d546101005260e051610100516f7ffffffffffffffffffffffffffffffe811161120857600e01556101005160018101818110611208579050600d5560e051600c60405160205260005260406000205560007f602d3d8160093d39f3363d3d373d3d3d363d73000000000000000000000000008161016001526013810190506008548060601b90508161016001526014810190507f5af43d82803e903d91602b57fd5bf30000000000000000000000000000000000816101600152600f81019050806101405261014090508051602082012090506101205260007fff000000000000000000000000000000000000000000000000000000000000008161018001526001810190506007548060601b905081610180015260148101905060c05181610180015260208101905061012051816101800152602081019050806101605261016090508051602082012090506101405273ffffffffffffffffffffffffffffffffffffffff61014051168060a01c611208576101605260e05163c0c53b8b610180526040516101a052610160516101c0526060516101e052803b15611208576000610180606461019c6000855af1610c34573d600060003e3d6000fd5b503360405160a0517f69e16554b097f489830077da86e9e40cc91529a8d0787c42c4f33a0a337a0e086024356101805260e0516101a0526040610180a4602060e0f3610f5f565b6323fc5a478118610f5f57602436103417611208576004358060a01c611208576040526004543318611208577fa1b167642dcf1fee2fbf716c48c7c3f2326e4f26020cb042cd6405dfa72f4fd260035460605260405160805260406060a160405160035500610f5f565b634cd69da08118610f5f57602436103417611208576004358060a01c611208576040526004543318611208577fcdfeee65e4d0a88d6e47c5d034c34b03d52f1e6ffc56906257fc93d993ca04c460025460605260405160805260406060a160405160025500610f5f565b634b29cac88118610e0f57604436103417611208576004358060a01c611208576040526024358060011c61120857606052600a604051602052600052604060002054608052608051156112085760045433186112085760016080511760805260605115610dca57608051600281018181106112085790506080525b608051600a6040516020526000526040600020556040517f54b0a41dd85251df77437effbf9fbdca133bd234e7771816495877177288092c60605160a052602060a0a2005b636b441a408118610f5f57602436103417611208576004358060a01c6112085760405260045433186112085760405160055500610f5f565b63e5ea47b88118610e965734611208576005543318611208577f5c486528ec3e3f0ea91181cff8116f02bfa350e03b8b6f12e00765adbb5af85c6004546040523360605260406040a133600455005b6351bd4db58118610f5f57602436103417611208576004358060a01c61120857604052600a60405160205260005260406000205460021c60605260206060f3610f5f565b634b9203798118610f5f57602436103417611208576004358060a01c61120857604052600a604051602052600052604060002054151560605260206060f3610f5f565b638a42bd828118610f5f57602436103417611208576004358060a01c611208576040526002600a60405160205260005260406000205416151560605260206060f35b60006000fd5b600a604051602052600052604060002054608052608051156112085760026080511615610faa574262093a808104905060805160021c62093a80810490501415610fad565b60005b156110675760095463f9754c93610100526080306101205280610140526311bfb95660a452600460405160c45260200160a05260a0816101200160208251018082828560045afa50508051806020830101601f82600003163682375050601f19601f82516020010116905090508101905060006101605260016101805250803b1561120857600061010060e461011c6000855af1611050573d600060003e3d6000fd5b504260051b600a6040516020526000526040600020555b604051634b82009360a05260605160c052602060a0602460bc6000855af1611094573d600060003e3d6000fd5b60203d106112085760a0518060011c6112085760e05260e09050511561120857604051630940070760c05260605160e052602060c0602460dc845afa6110df573d600060003e3d6000fd5b60203d106112085760c090505160a05260a051600b6060516020526000526040600020806040516020526000526040600020905054808203828111611208579050905060c05260c0511561113757600154151561113a565b60005b156112065760015463a9059cbb60e0526060516101005260c05161012052602060e0604460fc6000855af1611174573d600060003e3d6000fd5b3d61118b57803b15611208576001610140526111a3565b60203d106112085760e0518060011c61120857610140525b610140905051156112085760a051600b60605160205260005260406000208060405160205260005260406000209050556040516060517f9d228d69b5fdb8d273a2336f8fb8612d039631024ea9bf09c424a9503aa078f060a05160e052602060e0a35b565b600080fd0f5f03380f5f0f5f0d4f059808860eda049a0c7b0ce5041a047a0f5f0f5f001a027b05e9021f0f5f02db01490e47018902bb029b016908640f1d0000000000000000000000002d12d0907a388811e3aa855a550f959501d303ee
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
000000000000000000000000306a45a1478a000dc701a6e1f7a569afb8d9dcd600000000000000000000000096720942f9ff22efd8611f696e5333fe3671717a0000000000000000000000000000000000000000000000000000000000000000
-----Decoded View---------------
Arg [0] : _root_factory (address): 0x306A45a1478A000dC701A6e1f7a569afb8D9DCD6
Arg [1] : _root_impl (address): 0x96720942F9fF22eFd8611F696E5333Fe3671717a
Arg [2] : _crv (address): 0x0000000000000000000000000000000000000000
-----Encoded View---------------
3 Constructor Arguments found :
Arg [0] : 000000000000000000000000306a45a1478a000dc701a6e1f7a569afb8d9dcd6
Arg [1] : 00000000000000000000000096720942f9ff22efd8611f696e5333fe3671717a
Arg [2] : 0000000000000000000000000000000000000000000000000000000000000000
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 30 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
[ Download: CSV Export ]
[ 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.