Overview
ETH Balance
0 ETH
Eth Value
$0.00More Info
Private Name Tags
ContractCreator
View more zero value Internal Transactions in Advanced View mode
Advanced mode:
Loading...
Loading
Contract Name:
ELFeeRecipientV1
Compiler Version
v0.8.10+commit.fc410830
Contract Source Code (Solidity Standard Json-Input format)
//SPDX-License-Identifier: BUSL-1.1 pragma solidity 0.8.10; import "./interfaces/IRiver.1.sol"; import "./interfaces/IELFeeRecipient.1.sol"; import "./libraries/LibUint256.sol"; import "./Initializable.sol"; import "./state/shared/RiverAddress.sol"; /// @title Execution Layer Fee Recipient (v1) /// @author Kiln /// @notice This contract receives all the execution layer fees from the proposed blocks + bribes contract ELFeeRecipientV1 is Initializable, IELFeeRecipientV1 { /// @inheritdoc IELFeeRecipientV1 function initELFeeRecipientV1(address _riverAddress) external init(0) { RiverAddress.set(_riverAddress); emit SetRiver(_riverAddress); } /// @inheritdoc IELFeeRecipientV1 function pullELFees(uint256 _maxAmount) external { address river = RiverAddress.get(); if (msg.sender != river) { revert LibErrors.Unauthorized(msg.sender); } uint256 amount = LibUint256.min(_maxAmount, address(this).balance); if (amount > 0) { IRiverV1(payable(river)).sendELFees{value: amount}(); } } /// @inheritdoc IELFeeRecipientV1 receive() external payable { this; } /// @inheritdoc IELFeeRecipientV1 fallback() external payable { revert InvalidCall(); } }
//SPDX-License-Identifier: BUSL-1.1 pragma solidity 0.8.10; import "./state/shared/Version.sol"; /// @title Initializable /// @author Kiln /// @notice This contract ensures that initializers are called only once per version contract Initializable { /// @notice Disable initialization on implementations constructor() { Version.set(type(uint256).max); emit Initialize(type(uint256).max, msg.data); } /// @notice An error occured during the initialization /// @param version The version that was attempting to be initialized /// @param expectedVersion The version that was expected error InvalidInitialization(uint256 version, uint256 expectedVersion); /// @notice Emitted when the contract is properly initialized /// @param version New version of the contracts /// @param cdata Complete calldata that was used during the initialization event Initialize(uint256 version, bytes cdata); /// @notice Use this modifier on initializers along with a hard-coded version number /// @param _version Version to initialize modifier init(uint256 _version) { if (_version != Version.get()) { revert InvalidInitialization(_version, Version.get()); } Version.set(_version + 1); // prevents reentrency on the called method _; emit Initialize(_version, msg.data); } }
//SPDX-License-Identifier: BUSL-1.1 pragma solidity 0.8.10; /// @title Execution Layer Fee Recipient Interface (v1) /// @author Kiln /// @notice This interface exposes methods to receive all the execution layer fees from the proposed blocks + bribes interface IELFeeRecipientV1 { /// @notice The storage river address has changed /// @param river The new river address event SetRiver(address indexed river); /// @notice The fallback has been triggered error InvalidCall(); /// @notice Initialize the fee recipient with the required arguments /// @param _riverAddress Address of River function initELFeeRecipientV1(address _riverAddress) external; /// @notice Pulls ETH to the River contract /// @dev Only callable by the River contract /// @param _maxAmount The maximum amount to pull into the system function pullELFees(uint256 _maxAmount) external; /// @notice Ether receiver receive() external payable; /// @notice Invalid fallback detector fallback() external payable; }
//SPDX-License-Identifier: BUSL-1.1 pragma solidity 0.8.10; import "../state/river/DailyCommittableLimits.sol"; import "./components/IConsensusLayerDepositManager.1.sol"; import "./components/IOracleManager.1.sol"; import "./components/ISharesManager.1.sol"; import "./components/IUserDepositManager.1.sol"; /// @title River Interface (v1) /// @author Kiln /// @notice The main system interface interface IRiverV1 is IConsensusLayerDepositManagerV1, IUserDepositManagerV1, ISharesManagerV1, IOracleManagerV1 { /// @notice Funds have been pulled from the Execution Layer Fee Recipient /// @param amount The amount pulled event PulledELFees(uint256 amount); /// @notice Funds have been pulled from the Coverage Fund /// @param amount The amount pulled event PulledCoverageFunds(uint256 amount); /// @notice Emitted when funds are pulled from the redeem manager /// @param amount The amount pulled event PulledRedeemManagerExceedingEth(uint256 amount); /// @notice Emitted when funds are pulled from the CL recipient /// @param pulledSkimmedEthAmount The amount of skimmed ETH pulled /// @param pullExitedEthAmount The amount of exited ETH pulled event PulledCLFunds(uint256 pulledSkimmedEthAmount, uint256 pullExitedEthAmount); /// @notice The stored Execution Layer Fee Recipient has been changed /// @param elFeeRecipient The new Execution Layer Fee Recipient event SetELFeeRecipient(address indexed elFeeRecipient); /// @notice The stored Coverage Fund has been changed /// @param coverageFund The new Coverage Fund event SetCoverageFund(address indexed coverageFund); /// @notice The stored Collector has been changed /// @param collector The new Collector event SetCollector(address indexed collector); /// @notice The stored Allowlist has been changed /// @param allowlist The new Allowlist event SetAllowlist(address indexed allowlist); /// @notice The stored Global Fee has been changed /// @param fee The new Global Fee event SetGlobalFee(uint256 fee); /// @notice The stored Operators Registry has been changed /// @param operatorRegistry The new Operators Registry event SetOperatorsRegistry(address indexed operatorRegistry); /// @notice The stored Metadata URI string has been changed /// @param metadataURI The new Metadata URI string event SetMetadataURI(string metadataURI); /// @notice The system underlying supply increased. This is a snapshot of the balances for accounting purposes /// @param _collector The address of the collector during this event /// @param _oldTotalUnderlyingBalance Old total ETH balance under management by River /// @param _oldTotalSupply Old total supply in shares /// @param _newTotalUnderlyingBalance New total ETH balance under management by River /// @param _newTotalSupply New total supply in shares event RewardsEarned( address indexed _collector, uint256 _oldTotalUnderlyingBalance, uint256 _oldTotalSupply, uint256 _newTotalUnderlyingBalance, uint256 _newTotalSupply ); /// @notice Emitted when the daily committable limits are changed /// @param minNetAmount The minimum amount that must be used as the daily committable amount /// @param maxRelativeAmount The maximum amount that can be used as the daily committable amount, relative to the total underlying supply event SetMaxDailyCommittableAmounts(uint256 minNetAmount, uint256 maxRelativeAmount); /// @notice Emitted when the redeem manager address is changed /// @param redeemManager The address of the redeem manager event SetRedeemManager(address redeemManager); /// @notice Emitted when the balance to deposit is updated /// @param oldAmount The old balance to deposit /// @param newAmount The new balance to deposit event SetBalanceToDeposit(uint256 oldAmount, uint256 newAmount); /// @notice Emitted when the balance to redeem is updated /// @param oldAmount The old balance to redeem /// @param newAmount The new balance to redeem event SetBalanceToRedeem(uint256 oldAmount, uint256 newAmount); /// @notice Emitted when the balance committed to deposit /// @param oldAmount The old balance committed to deposit /// @param newAmount The new balance committed to deposit event SetBalanceCommittedToDeposit(uint256 oldAmount, uint256 newAmount); /// @notice Emitted when the redeem manager received a withdraw event report /// @param redeemManagerDemand The total demand in LsETH of the redeem manager /// @param suppliedRedeemManagerDemand The amount of LsETH demand actually supplied /// @param suppliedRedeemManagerDemandInEth The amount in ETH of the supplied demand event ReportedRedeemManager( uint256 redeemManagerDemand, uint256 suppliedRedeemManagerDemand, uint256 suppliedRedeemManagerDemandInEth ); /// @notice Thrown when the amount received from the Withdraw contract doe not match the requested amount /// @param requested The amount that was requested /// @param received The amount that was received error InvalidPulledClFundsAmount(uint256 requested, uint256 received); /// @notice The computed amount of shares to mint is 0 error ZeroMintedShares(); /// @notice The access was denied /// @param account The account that was denied error Denied(address account); /// @notice Initializes the River system /// @param _depositContractAddress Address to make Consensus Layer deposits /// @param _elFeeRecipientAddress Address that receives the execution layer fees /// @param _withdrawalCredentials Credentials to use for every validator deposit /// @param _oracleAddress The address of the Oracle contract /// @param _systemAdministratorAddress Administrator address /// @param _allowlistAddress Address of the allowlist contract /// @param _operatorRegistryAddress Address of the operator registry /// @param _collectorAddress Address receiving the the global fee on revenue /// @param _globalFee Amount retained when the ETH balance increases and sent to the collector function initRiverV1( address _depositContractAddress, address _elFeeRecipientAddress, bytes32 _withdrawalCredentials, address _oracleAddress, address _systemAdministratorAddress, address _allowlistAddress, address _operatorRegistryAddress, address _collectorAddress, uint256 _globalFee ) external; /// @notice Initialized version 1.1 of the River System /// @param _redeemManager The redeem manager address /// @param _epochsPerFrame The amounts of epochs in a frame /// @param _slotsPerEpoch The slots inside an epoch /// @param _secondsPerSlot The seconds inside a slot /// @param _genesisTime The genesis timestamp /// @param _epochsToAssumedFinality The number of epochs before an epoch is considered final on-chain /// @param _annualAprUpperBound The reporting upper bound /// @param _relativeLowerBound The reporting lower bound /// @param _maxDailyNetCommittableAmount_ The net daily committable limit /// @param _maxDailyRelativeCommittableAmount_ The relative daily committable limit function initRiverV1_1( address _redeemManager, uint64 _epochsPerFrame, uint64 _slotsPerEpoch, uint64 _secondsPerSlot, uint64 _genesisTime, uint64 _epochsToAssumedFinality, uint256 _annualAprUpperBound, uint256 _relativeLowerBound, uint128 _maxDailyNetCommittableAmount_, uint128 _maxDailyRelativeCommittableAmount_ ) external; /// @notice Get the current global fee /// @return The global fee function getGlobalFee() external view returns (uint256); /// @notice Retrieve the allowlist address /// @return The allowlist address function getAllowlist() external view returns (address); /// @notice Retrieve the collector address /// @return The collector address function getCollector() external view returns (address); /// @notice Retrieve the execution layer fee recipient /// @return The execution layer fee recipient address function getELFeeRecipient() external view returns (address); /// @notice Retrieve the coverage fund /// @return The coverage fund address function getCoverageFund() external view returns (address); /// @notice Retrieve the redeem manager /// @return The redeem manager address function getRedeemManager() external view returns (address); /// @notice Retrieve the operators registry /// @return The operators registry address function getOperatorsRegistry() external view returns (address); /// @notice Retrieve the metadata uri string value /// @return The metadata uri string value function getMetadataURI() external view returns (string memory); /// @notice Retrieve the configured daily committable limits /// @return The daily committable limits structure function getDailyCommittableLimits() external view returns (DailyCommittableLimits.DailyCommittableLimitsStruct memory); /// @notice Resolves the provided redeem requests by calling the redeem manager /// @param _redeemRequestIds The list of redeem requests to resolve /// @return withdrawalEventIds The list of matching withdrawal events, or error codes function resolveRedeemRequests(uint32[] calldata _redeemRequestIds) external view returns (int64[] memory withdrawalEventIds); /// @notice Set the daily committable limits /// @param _dcl The Daily Committable Limits structure function setDailyCommittableLimits(DailyCommittableLimits.DailyCommittableLimitsStruct memory _dcl) external; /// @notice Retrieve the current balance to redeem /// @return The current balance to redeem function getBalanceToRedeem() external view returns (uint256); /// @notice Performs a redeem request on the redeem manager /// @param _lsETHAmount The amount of LsETH to redeem /// @param _recipient The address that will own the redeem request /// @return redeemRequestId The ID of the newly created redeem request function requestRedeem(uint256 _lsETHAmount, address _recipient) external returns (uint32 redeemRequestId); /// @notice Claims several redeem requests /// @param _redeemRequestIds The list of redeem requests to claim /// @param _withdrawalEventIds The list of resolved withdrawal event ids /// @return claimStatuses The operation status results function claimRedeemRequests(uint32[] calldata _redeemRequestIds, uint32[] calldata _withdrawalEventIds) external returns (uint8[] memory claimStatuses); /// @notice Changes the global fee parameter /// @param _newFee New fee value function setGlobalFee(uint256 _newFee) external; /// @notice Changes the allowlist address /// @param _newAllowlist New address for the allowlist function setAllowlist(address _newAllowlist) external; /// @notice Changes the collector address /// @param _newCollector New address for the collector function setCollector(address _newCollector) external; /// @notice Changes the execution layer fee recipient /// @param _newELFeeRecipient New address for the recipient function setELFeeRecipient(address _newELFeeRecipient) external; /// @notice Changes the coverage fund /// @param _newCoverageFund New address for the fund function setCoverageFund(address _newCoverageFund) external; /// @notice Sets the metadata uri string value /// @param _metadataURI The new metadata uri string value function setMetadataURI(string memory _metadataURI) external; /// @notice Input for execution layer fee earnings function sendELFees() external payable; /// @notice Input for consensus layer funds, containing both exit and skimming function sendCLFunds() external payable; /// @notice Input for coverage funds function sendCoverageFunds() external payable; /// @notice Input for the redeem manager funds function sendRedeemManagerExceedingFunds() external payable; }
//SPDX-License-Identifier: BUSL-1.1 pragma solidity 0.8.10; /// @title Consensys Layer Deposit Manager Interface (v1) /// @author Kiln /// @notice This interface exposes methods to handle the interactions with the official deposit contract interface IConsensusLayerDepositManagerV1 { /// @notice The stored deposit contract address changed /// @param depositContract Address of the deposit contract event SetDepositContractAddress(address indexed depositContract); /// @notice The stored withdrawal credentials changed /// @param withdrawalCredentials The withdrawal credentials to use for deposits event SetWithdrawalCredentials(bytes32 withdrawalCredentials); /// @notice Emitted when the deposited validator count is updated /// @param oldDepositedValidatorCount The old deposited validator count value /// @param newDepositedValidatorCount The new deposited validator count value event SetDepositedValidatorCount(uint256 oldDepositedValidatorCount, uint256 newDepositedValidatorCount); /// @notice Not enough funds to deposit one validator error NotEnoughFunds(); /// @notice The length of the BLS Public key is invalid during deposit error InconsistentPublicKeys(); /// @notice The length of the BLS Signature is invalid during deposit error InconsistentSignatures(); /// @notice The internal key retrieval returned no keys error NoAvailableValidatorKeys(); /// @notice The received count of public keys to deposit is invalid error InvalidPublicKeyCount(); /// @notice The received count of signatures to deposit is invalid error InvalidSignatureCount(); /// @notice The withdrawal credentials value is null error InvalidWithdrawalCredentials(); /// @notice An error occured during the deposit error ErrorOnDeposit(); /// @notice Returns the amount of ETH not yet committed for deposit /// @return The amount of ETH not yet committed for deposit function getBalanceToDeposit() external view returns (uint256); /// @notice Returns the amount of ETH committed for deposit /// @return The amount of ETH committed for deposit function getCommittedBalance() external view returns (uint256); /// @notice Retrieve the withdrawal credentials /// @return The withdrawal credentials function getWithdrawalCredentials() external view returns (bytes32); /// @notice Get the deposited validator count (the count of deposits made by the contract) /// @return The deposited validator count function getDepositedValidatorCount() external view returns (uint256); /// @notice Deposits current balance to the Consensus Layer by batches of 32 ETH /// @param _maxCount The maximum amount of validator keys to fund function depositToConsensusLayer(uint256 _maxCount) external; }
//SPDX-License-Identifier: BUSL-1.1 pragma solidity 0.8.10; import "../../state/river/CLSpec.sol"; import "../../state/river/ReportBounds.sol"; /// @title Oracle Manager (v1) /// @author Kiln /// @notice This interface exposes methods to handle the inputs provided by the oracle interface IOracleManagerV1 { /// @notice The stored oracle address changed /// @param oracleAddress The new oracle address event SetOracle(address indexed oracleAddress); /// @notice The consensus layer data provided by the oracle has been updated /// @param validatorCount The new count of validators running on the consensus layer /// @param validatorTotalBalance The new total balance sum of all validators /// @param roundId Round identifier event ConsensusLayerDataUpdate(uint256 validatorCount, uint256 validatorTotalBalance, bytes32 roundId); /// @notice The Consensus Layer Spec is changed /// @param epochsPerFrame The number of epochs inside a frame /// @param slotsPerEpoch The number of slots inside an epoch /// @param secondsPerSlot The number of seconds inside a slot /// @param genesisTime The genesis timestamp /// @param epochsToAssumedFinality The number of epochs before an epoch is considered final event SetSpec( uint64 epochsPerFrame, uint64 slotsPerEpoch, uint64 secondsPerSlot, uint64 genesisTime, uint64 epochsToAssumedFinality ); /// @notice The Report Bounds are changed /// @param annualAprUpperBound The reporting upper bound /// @param relativeLowerBound The reporting lower bound event SetBounds(uint256 annualAprUpperBound, uint256 relativeLowerBound); /// @notice The provided report has beend processed /// @param report The report that was provided /// @param trace The trace structure providing more insights on internals event ProcessedConsensusLayerReport( IOracleManagerV1.ConsensusLayerReport report, ConsensusLayerDataReportingTrace trace ); /// @notice The reported validator count is invalid /// @param providedValidatorCount The received validator count value /// @param depositedValidatorCount The number of deposits performed by the system /// @param lastReportedValidatorCount The last reported validator count error InvalidValidatorCountReport( uint256 providedValidatorCount, uint256 depositedValidatorCount, uint256 lastReportedValidatorCount ); /// @notice Thrown when an invalid epoch was reported /// @param epoch Invalid epoch error InvalidEpoch(uint256 epoch); /// @notice The balance increase is higher than the maximum allowed by the upper bound /// @param prevTotalEthIncludingExited The previous total balance, including all exited balance /// @param postTotalEthIncludingExited The post-report total balance, including all exited balance /// @param timeElapsed The time in seconds since last report /// @param annualAprUpperBound The upper bound value that was used error TotalValidatorBalanceIncreaseOutOfBound( uint256 prevTotalEthIncludingExited, uint256 postTotalEthIncludingExited, uint256 timeElapsed, uint256 annualAprUpperBound ); /// @notice The balance decrease is higher than the maximum allowed by the lower bound /// @param prevTotalEthIncludingExited The previous total balance, including all exited balance /// @param postTotalEthIncludingExited The post-report total balance, including all exited balance /// @param timeElapsed The time in seconds since last report /// @param relativeLowerBound The lower bound value that was used error TotalValidatorBalanceDecreaseOutOfBound( uint256 prevTotalEthIncludingExited, uint256 postTotalEthIncludingExited, uint256 timeElapsed, uint256 relativeLowerBound ); /// @notice The total exited balance decreased /// @param currentValidatorsExitedBalance The current exited balance /// @param newValidatorsExitedBalance The new exited balance error InvalidDecreasingValidatorsExitedBalance( uint256 currentValidatorsExitedBalance, uint256 newValidatorsExitedBalance ); /// @notice The total skimmed balance decreased /// @param currentValidatorsSkimmedBalance The current exited balance /// @param newValidatorsSkimmedBalance The new exited balance error InvalidDecreasingValidatorsSkimmedBalance( uint256 currentValidatorsSkimmedBalance, uint256 newValidatorsSkimmedBalance ); /// @notice Trace structure emitted via logs during reporting struct ConsensusLayerDataReportingTrace { uint256 rewards; uint256 pulledELFees; uint256 pulledRedeemManagerExceedingEthBuffer; uint256 pulledCoverageFunds; } /// @notice The format of the oracle report struct ConsensusLayerReport { // this is the epoch at which the report was performed // data should be fetched up to the state of this epoch by the oracles uint256 epoch; // the sum of all the validator balances on the consensus layer // when a validator enters the exit queue, the validator is considered stopped, its balance is accounted in both validatorsExitingBalance and validatorsBalance // when a validator leaves the exit queue and the funds are sweeped onto the execution layer, the balance is only accounted in validatorsExitedBalance and not in validatorsBalance // this value can decrease between reports uint256 validatorsBalance; // the sum of all the skimmings performed on the validators // these values can be found in the execution layer block bodies under the withdrawals field // a withdrawal is considered skimming if // - the epoch at which it happened is < validator.withdrawableEpoch // - the epoch at which it happened is >= validator.withdrawableEpoch and in that case we only account for what would be above 32 eth as skimming // this value cannot decrease over reports uint256 validatorsSkimmedBalance; // the sum of all the exits performed on the validators // these values can be found in the execution layer block bodies under the withdrawals field // a withdrawal is considered exit if // - the epoch at which it happened is >= validator.withdrawableEpoch and in that case we only account for what would be <= 32 eth as exit // this value cannot decrease over reports uint256 validatorsExitedBalance; // the sum of all the exiting balance, which is all the validators on their way to get sweeped and exited // this includes voluntary exits and slashings // this value can decrease between reports uint256 validatorsExitingBalance; // the count of activated validators // even validators that are exited are still accounted // this value cannot decrease over reports uint32 validatorsCount; // an array containing the count of stopped validators per operator // the first element of the array is the sum of all stopped validators // then index 1 would be operator 0 // these values cannot decrease over reports uint32[] stoppedValidatorCountPerOperator; // flag enabled by the oracles when the buffer rebalancing is activated // the activation logic is written in the oracle specification and all oracle members must agree on the activation // when active, the eth in the deposit buffer can be used to pay for exits in the redeem manager bool rebalanceDepositToRedeemMode; // flag enabled by the oracles when the slashing containment is activated // the activation logic is written in the oracle specification and all oracle members must agree on the activation // This flag is activated when a pre-defined threshold of slashed validators in our set of validators is reached // This flag is deactivated when a bottom threshold is met, this means that when we reach the upper threshold and activate the flag, we will deactivate it when we reach the bottom threshold and not before // when active, no more validator exits can be requested by the protocol bool slashingContainmentMode; } /// @notice The format of the oracle report in storage /// @notice These fields have the exact same function as the ones in ConsensusLayerReport, but this struct is optimized for storage struct StoredConsensusLayerReport { uint256 epoch; uint256 validatorsBalance; uint256 validatorsSkimmedBalance; uint256 validatorsExitedBalance; uint256 validatorsExitingBalance; uint32 validatorsCount; bool rebalanceDepositToRedeemMode; bool slashingContainmentMode; } /// @notice Get oracle address /// @return The oracle address function getOracle() external view returns (address); /// @notice Get CL validator total balance /// @return The CL Validator total balance function getCLValidatorTotalBalance() external view returns (uint256); /// @notice Get CL validator count (the amount of validator reported by the oracles) /// @return The CL validator count function getCLValidatorCount() external view returns (uint256); /// @notice Verifies if the provided epoch is valid /// @param epoch The epoch to lookup /// @return True if valid function isValidEpoch(uint256 epoch) external view returns (bool); /// @notice Retrieve the block timestamp /// @return The current timestamp from the EVM context function getTime() external view returns (uint256); /// @notice Retrieve expected epoch id /// @return The current expected epoch id function getExpectedEpochId() external view returns (uint256); /// @notice Retrieve the last completed epoch id /// @return The last completed epoch id function getLastCompletedEpochId() external view returns (uint256); /// @notice Retrieve the current epoch id based on block timestamp /// @return The current epoch id function getCurrentEpochId() external view returns (uint256); /// @notice Retrieve the current cl spec /// @return The Consensus Layer Specification function getCLSpec() external view returns (CLSpec.CLSpecStruct memory); /// @notice Retrieve the current frame details /// @return _startEpochId The epoch at the beginning of the frame /// @return _startTime The timestamp of the beginning of the frame in seconds /// @return _endTime The timestamp of the end of the frame in seconds function getCurrentFrame() external view returns (uint256 _startEpochId, uint256 _startTime, uint256 _endTime); /// @notice Retrieve the first epoch id of the frame of the provided epoch id /// @param _epochId Epoch id used to get the frame /// @return The first epoch id of the frame containing the given epoch id function getFrameFirstEpochId(uint256 _epochId) external view returns (uint256); /// @notice Retrieve the report bounds /// @return The report bounds function getReportBounds() external view returns (ReportBounds.ReportBoundsStruct memory); /// @notice Retrieve the last consensus layer report /// @return The stored consensus layer report function getLastConsensusLayerReport() external view returns (IOracleManagerV1.StoredConsensusLayerReport memory); /// @notice Set the oracle address /// @param _oracleAddress Address of the oracle function setOracle(address _oracleAddress) external; /// @notice Set the consensus layer spec /// @param _newValue The new consensus layer spec value function setCLSpec(CLSpec.CLSpecStruct calldata _newValue) external; /// @notice Set the report bounds /// @param _newValue The new report bounds value function setReportBounds(ReportBounds.ReportBoundsStruct calldata _newValue) external; /// @notice Performs all the reporting logics /// @param _report The consensus layer report structure function setConsensusLayerData(ConsensusLayerReport calldata _report) external; }
//SPDX-License-Identifier: BUSL-1.1 pragma solidity 0.8.10; import "openzeppelin-contracts/contracts/token/ERC20/IERC20.sol"; /// @title Shares Manager Interface (v1) /// @author Kiln /// @notice This interface exposes methods to handle the shares of the depositor and the ERC20 interface interface ISharesManagerV1 is IERC20 { /// @notice Emitted when the total supply is changed event SetTotalSupply(uint256 totalSupply); /// @notice Balance too low to perform operation error BalanceTooLow(); /// @notice Allowance too low to perform operation /// @param _from Account where funds are sent from /// @param _operator Account attempting the transfer /// @param _allowance Current allowance /// @param _value Requested transfer value in shares error AllowanceTooLow(address _from, address _operator, uint256 _allowance, uint256 _value); /// @notice Invalid empty transfer error NullTransfer(); /// @notice Invalid transfer recipients /// @param _from Account sending the funds in the invalid transfer /// @param _to Account receiving the funds in the invalid transfer error UnauthorizedTransfer(address _from, address _to); /// @notice Retrieve the token name /// @return The token name function name() external pure returns (string memory); /// @notice Retrieve the token symbol /// @return The token symbol function symbol() external pure returns (string memory); /// @notice Retrieve the decimal count /// @return The decimal count function decimals() external pure returns (uint8); /// @notice Retrieve the total token supply /// @return The total supply in shares function totalSupply() external view returns (uint256); /// @notice Retrieve the total underlying asset supply /// @return The total underlying asset supply function totalUnderlyingSupply() external view returns (uint256); /// @notice Retrieve the balance of an account /// @param _owner Address to be checked /// @return The balance of the account in shares function balanceOf(address _owner) external view returns (uint256); /// @notice Retrieve the underlying asset balance of an account /// @param _owner Address to be checked /// @return The underlying balance of the account function balanceOfUnderlying(address _owner) external view returns (uint256); /// @notice Retrieve the underlying asset balance from an amount of shares /// @param _shares Amount of shares to convert /// @return The underlying asset balance represented by the shares function underlyingBalanceFromShares(uint256 _shares) external view returns (uint256); /// @notice Retrieve the shares count from an underlying asset amount /// @param _underlyingAssetAmount Amount of underlying asset to convert /// @return The amount of shares worth the underlying asset amopunt function sharesFromUnderlyingBalance(uint256 _underlyingAssetAmount) external view returns (uint256); /// @notice Retrieve the allowance value for a spender /// @param _owner Address that issued the allowance /// @param _spender Address that received the allowance /// @return The allowance in shares for a given spender function allowance(address _owner, address _spender) external view returns (uint256); /// @notice Performs a transfer from the message sender to the provided account /// @param _to Address receiving the tokens /// @param _value Amount of shares to be sent /// @return True if success function transfer(address _to, uint256 _value) external returns (bool); /// @notice Performs a transfer between two recipients /// @param _from Address sending the tokens /// @param _to Address receiving the tokens /// @param _value Amount of shares to be sent /// @return True if success function transferFrom(address _from, address _to, uint256 _value) external returns (bool); /// @notice Approves an account for future spendings /// @dev An approved account can use transferFrom to transfer funds on behalf of the token owner /// @param _spender Address that is allowed to spend the tokens /// @param _value The allowed amount in shares, will override previous value /// @return True if success function approve(address _spender, uint256 _value) external returns (bool); /// @notice Increase allowance to another account /// @param _spender Spender that receives the allowance /// @param _additionalValue Amount of shares to add /// @return True if success function increaseAllowance(address _spender, uint256 _additionalValue) external returns (bool); /// @notice Decrease allowance to another account /// @param _spender Spender that receives the allowance /// @param _subtractableValue Amount of shares to subtract /// @return True if success function decreaseAllowance(address _spender, uint256 _subtractableValue) external returns (bool); }
//SPDX-License-Identifier: BUSL-1.1 pragma solidity 0.8.10; /// @title User Deposit Manager (v1) /// @author Kiln /// @notice This interface exposes methods to handle the inbound transfers cases or the explicit submissions interface IUserDepositManagerV1 { /// @notice User deposited ETH in the system /// @param depositor Address performing the deposit /// @param recipient Address receiving the minted shares /// @param amount Amount in ETH deposited event UserDeposit(address indexed depositor, address indexed recipient, uint256 amount); /// @notice And empty deposit attempt was made error EmptyDeposit(); /// @notice Explicit deposit method to mint on msg.sender function deposit() external payable; /// @notice Explicit deposit method to mint on msg.sender and transfer to _recipient /// @param _recipient Address receiving the minted LsETH function depositAndTransfer(address _recipient) external payable; /// @notice Implicit deposit method, when the user performs a regular transfer to the contract receive() external payable; /// @notice Invalid call, when the user sends a transaction with a data payload but no method matched fallback() external payable; }
//SPDX-License-Identifier: BUSL-1.1 pragma solidity 0.8.10; /// @title Lib Basis Points /// @notice Holds the basis points max value library LibBasisPoints { /// @notice The max value for basis points (represents 100%) uint256 internal constant BASIS_POINTS_MAX = 10_000; }
//SPDX-License-Identifier: MIT pragma solidity 0.8.10; /// @title Lib Errors /// @notice Library of common errors library LibErrors { /// @notice The operator is unauthorized for the caller /// @param caller Address performing the call error Unauthorized(address caller); /// @notice The call was invalid error InvalidCall(); /// @notice The argument was invalid error InvalidArgument(); /// @notice The address is zero error InvalidZeroAddress(); /// @notice The string is empty error InvalidEmptyString(); /// @notice The fee is invalid error InvalidFee(); }
//SPDX-License-Identifier: MIT pragma solidity 0.8.10; import "./LibErrors.sol"; import "./LibBasisPoints.sol"; /// @title Lib Sanitize /// @notice Utilities to sanitize input values library LibSanitize { /// @notice Reverts if address is 0 /// @param _address Address to check function _notZeroAddress(address _address) internal pure { if (_address == address(0)) { revert LibErrors.InvalidZeroAddress(); } } /// @notice Reverts if string is empty /// @param _string String to check function _notEmptyString(string memory _string) internal pure { if (bytes(_string).length == 0) { revert LibErrors.InvalidEmptyString(); } } /// @notice Reverts if fee is invalid /// @param _fee Fee to check function _validFee(uint256 _fee) internal pure { if (_fee > LibBasisPoints.BASIS_POINTS_MAX) { revert LibErrors.InvalidFee(); } } }
//SPDX-License-Identifier: MIT pragma solidity 0.8.10; /// @title Lib Uint256 /// @notice Utilities to perform uint operations library LibUint256 { /// @notice Converts a value to little endian (64 bits) /// @param _value The value to convert /// @return result The converted value function toLittleEndian64(uint256 _value) internal pure returns (uint256 result) { result = 0; uint256 tempValue = _value; result = tempValue & 0xFF; tempValue >>= 8; result = (result << 8) | (tempValue & 0xFF); tempValue >>= 8; result = (result << 8) | (tempValue & 0xFF); tempValue >>= 8; result = (result << 8) | (tempValue & 0xFF); tempValue >>= 8; result = (result << 8) | (tempValue & 0xFF); tempValue >>= 8; result = (result << 8) | (tempValue & 0xFF); tempValue >>= 8; result = (result << 8) | (tempValue & 0xFF); tempValue >>= 8; result = (result << 8) | (tempValue & 0xFF); tempValue >>= 8; assert(0 == tempValue); // fully converted result <<= (24 * 8); } /// @notice Returns the minimum value /// @param _a First value /// @param _b Second value /// @return Smallest value between _a and _b function min(uint256 _a, uint256 _b) internal pure returns (uint256) { return (_a > _b ? _b : _a); } /// @notice Returns the max value /// @param _a First value /// @param _b Second value /// @return Highest value between _a and _b function max(uint256 _a, uint256 _b) internal pure returns (uint256) { return (_a < _b ? _b : _a); } /// @notice Performs a ceiled division /// @param _a Numerator /// @param _b Denominator /// @return ceil(_a / _b) function ceil(uint256 _a, uint256 _b) internal pure returns (uint256) { return (_a / _b) + (_a % _b > 0 ? 1 : 0); } }
// SPDX-License-Identifier: MIT pragma solidity 0.8.10; /// @title Lib Unstructured Storage /// @notice Utilities to work with unstructured storage library LibUnstructuredStorage { /// @notice Retrieve a bool value at a storage slot /// @param _position The storage slot to retrieve /// @return data The bool value function getStorageBool(bytes32 _position) internal view returns (bool data) { // solhint-disable-next-line no-inline-assembly assembly { data := sload(_position) } } /// @notice Retrieve an address value at a storage slot /// @param _position The storage slot to retrieve /// @return data The address value function getStorageAddress(bytes32 _position) internal view returns (address data) { // solhint-disable-next-line no-inline-assembly assembly { data := sload(_position) } } /// @notice Retrieve a bytes32 value at a storage slot /// @param _position The storage slot to retrieve /// @return data The bytes32 value function getStorageBytes32(bytes32 _position) internal view returns (bytes32 data) { // solhint-disable-next-line no-inline-assembly assembly { data := sload(_position) } } /// @notice Retrieve an uint256 value at a storage slot /// @param _position The storage slot to retrieve /// @return data The uint256 value function getStorageUint256(bytes32 _position) internal view returns (uint256 data) { // solhint-disable-next-line no-inline-assembly assembly { data := sload(_position) } } /// @notice Sets a bool value at a storage slot /// @param _position The storage slot to set /// @param _data The bool value to set function setStorageBool(bytes32 _position, bool _data) internal { // solhint-disable-next-line no-inline-assembly assembly { sstore(_position, _data) } } /// @notice Sets an address value at a storage slot /// @param _position The storage slot to set /// @param _data The address value to set function setStorageAddress(bytes32 _position, address _data) internal { // solhint-disable-next-line no-inline-assembly assembly { sstore(_position, _data) } } /// @notice Sets a bytes32 value at a storage slot /// @param _position The storage slot to set /// @param _data The bytes32 value to set function setStorageBytes32(bytes32 _position, bytes32 _data) internal { // solhint-disable-next-line no-inline-assembly assembly { sstore(_position, _data) } } /// @notice Sets an uint256 value at a storage slot /// @param _position The storage slot to set /// @param _data The uint256 value to set function setStorageUint256(bytes32 _position, uint256 _data) internal { // solhint-disable-next-line no-inline-assembly assembly { sstore(_position, _data) } } }
//SPDX-License-Identifier: BUSL-1.1 pragma solidity 0.8.10; /// @title Consensus Layer Spec Storage /// @notice Utility to manage the Consensus Layer Spec in storage library CLSpec { /// @notice Storage slot of the Consensus Layer Spec bytes32 internal constant CL_SPEC_SLOT = bytes32(uint256(keccak256("river.state.clSpec")) - 1); /// @notice The Consensus Layer Spec structure struct CLSpecStruct { /// @custom:attribute The count of epochs per frame, 225 means 24h uint64 epochsPerFrame; /// @custom:attribute The count of slots in an epoch (32 on mainnet) uint64 slotsPerEpoch; /// @custom:attribute The seconds in a slot (12 on mainnet) uint64 secondsPerSlot; /// @custom:attribute The block timestamp of the first consensus layer block uint64 genesisTime; /// @custom:attribute The count of epochs before considering an epoch final on-chain uint64 epochsToAssumedFinality; } /// @notice The structure in storage struct Slot { /// @custom:attribute The structure in storage CLSpecStruct value; } /// @notice Retrieve the Consensus Layer Spec from storage /// @return The Consensus Layer Spec function get() internal view returns (CLSpecStruct memory) { bytes32 slot = CL_SPEC_SLOT; Slot storage r; // solhint-disable-next-line no-inline-assembly assembly { r.slot := slot } return r.value; } /// @notice Set the Consensus Layer Spec value in storage /// @param _newCLSpec The new value to set in storage function set(CLSpecStruct memory _newCLSpec) internal { bytes32 slot = CL_SPEC_SLOT; Slot storage r; // solhint-disable-next-line no-inline-assembly assembly { r.slot := slot } r.value = _newCLSpec; } }
//SPDX-License-Identifier: BUSL-1.1 pragma solidity 0.8.10; import "../../libraries/LibSanitize.sol"; /// @title Daily Committable Limits storage /// @notice Utility to manage the Daily Committable Limits in storage library DailyCommittableLimits { /// @notice Storage slot of the Daily Committable Limits storage bytes32 internal constant DAILY_COMMITTABLE_LIMITS_SLOT = bytes32(uint256(keccak256("river.state.dailyCommittableLimits")) - 1); /// @notice The daily committable limits structure struct DailyCommittableLimitsStruct { uint128 minDailyNetCommittableAmount; uint128 maxDailyRelativeCommittableAmount; } /// @notice The structure in storage struct Slot { /// @custom:attribute The structure in storage DailyCommittableLimitsStruct value; } /// @notice Retrieve the Daily Committable Limits from storage /// @return The Daily Committable Limits function get() internal view returns (DailyCommittableLimitsStruct memory) { bytes32 slot = DAILY_COMMITTABLE_LIMITS_SLOT; Slot storage r; // solhint-disable-next-line no-inline-assembly assembly { r.slot := slot } return r.value; } /// @notice Set the Daily Committable Limits value in storage /// @param _newValue The new value to set in storage function set(DailyCommittableLimitsStruct memory _newValue) internal { bytes32 slot = DAILY_COMMITTABLE_LIMITS_SLOT; Slot storage r; // solhint-disable-next-line no-inline-assembly assembly { r.slot := slot } r.value = _newValue; } }
//SPDX-License-Identifier: BUSL-1.1 pragma solidity 0.8.10; /// @title Report Bounds Storage /// @notice Utility to manage the Report Bounds in storage library ReportBounds { /// @notice Storage slot of the Report Bounds bytes32 internal constant REPORT_BOUNDS_SLOT = bytes32(uint256(keccak256("river.state.reportBounds")) - 1); /// @notice The Report Bounds structure struct ReportBoundsStruct { /// @custom:attribute The maximum allowed annual apr, checked before submitting a report to River uint256 annualAprUpperBound; /// @custom:attribute The maximum allowed balance decrease, also checked before submitting a report to River uint256 relativeLowerBound; } /// @notice The structure in storage struct Slot { /// @custom:attribute The structure in storage ReportBoundsStruct value; } /// @notice Retrieve the Report Bounds from storage /// @return The Report Bounds function get() internal view returns (ReportBoundsStruct memory) { bytes32 slot = REPORT_BOUNDS_SLOT; Slot storage r; // solhint-disable-next-line no-inline-assembly assembly { r.slot := slot } return r.value; } /// @notice Set the Report Bounds in storage /// @param _newReportBounds The new Report Bounds value function set(ReportBoundsStruct memory _newReportBounds) internal { bytes32 slot = REPORT_BOUNDS_SLOT; Slot storage r; // solhint-disable-next-line no-inline-assembly assembly { r.slot := slot } r.value = _newReportBounds; } }
//SPDX-License-Identifier: BUSL-1.1 pragma solidity 0.8.10; import "../../libraries/LibSanitize.sol"; import "../../libraries/LibUnstructuredStorage.sol"; /// @title River Address Storage /// @notice Utility to manage the River Address in storage library RiverAddress { /// @notice Storage slot of the River Address bytes32 internal constant RIVER_ADDRESS_SLOT = bytes32(uint256(keccak256("river.state.riverAddress")) - 1); /// @notice Retrieve the River Address /// @return The River Address function get() internal view returns (address) { return LibUnstructuredStorage.getStorageAddress(RIVER_ADDRESS_SLOT); } /// @notice Sets the River Address /// @param _newValue New River Address function set(address _newValue) internal { LibSanitize._notZeroAddress(_newValue); LibUnstructuredStorage.setStorageAddress(RIVER_ADDRESS_SLOT, _newValue); } }
//SPDX-License-Identifier: BUSL-1.1 pragma solidity 0.8.10; import "../../libraries/LibUnstructuredStorage.sol"; /// @title Version Storage /// @notice Utility to manage the Version in storage library Version { /// @notice Storage slot of the Version bytes32 public constant VERSION_SLOT = bytes32(uint256(keccak256("river.state.version")) - 1); /// @notice Retrieve the Version /// @return The Version function get() internal view returns (uint256) { return LibUnstructuredStorage.getStorageUint256(VERSION_SLOT); } /// @notice Sets the Version /// @param _newValue New Version function set(uint256 _newValue) internal { LibUnstructuredStorage.setStorageUint256(VERSION_SLOT, _newValue); } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.6.0) (token/ERC20/IERC20.sol) pragma solidity ^0.8.0; /** * @dev Interface of the ERC20 standard as defined in the EIP. */ interface IERC20 { /** * @dev Emitted when `value` tokens are moved from one account (`from`) to * another (`to`). * * Note that `value` may be zero. */ event Transfer(address indexed from, address indexed to, uint256 value); /** * @dev Emitted when the allowance of a `spender` for an `owner` is set by * a call to {approve}. `value` is the new allowance. */ event Approval(address indexed owner, address indexed spender, uint256 value); /** * @dev Returns the amount of tokens in existence. */ function totalSupply() external view returns (uint256); /** * @dev Returns the amount of tokens owned by `account`. */ function balanceOf(address account) external view returns (uint256); /** * @dev Moves `amount` tokens from the caller's account to `to`. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transfer(address to, uint256 amount) external returns (bool); /** * @dev Returns the remaining number of tokens that `spender` will be * allowed to spend on behalf of `owner` through {transferFrom}. This is * zero by default. * * This value changes when {approve} or {transferFrom} are called. */ function allowance(address owner, address spender) external view returns (uint256); /** * @dev Sets `amount` as the allowance of `spender` over the caller's tokens. * * Returns a boolean value indicating whether the operation succeeded. * * IMPORTANT: Beware that changing an allowance with this method brings the risk * that someone may use both the old and the new allowance by unfortunate * transaction ordering. One possible solution to mitigate this race * condition is to first reduce the spender's allowance to 0 and set the * desired value afterwards: * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 * * Emits an {Approval} event. */ function approve(address spender, uint256 amount) external returns (bool); /** * @dev Moves `amount` tokens from `from` to `to` using the * allowance mechanism. `amount` is then deducted from the caller's * allowance. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transferFrom( address from, address to, uint256 amount ) external returns (bool); }
{ "optimizer": { "enabled": true, "runs": 100 }, "outputSelection": { "*": { "*": [ "evm.bytecode", "evm.deployedBytecode", "abi" ] } } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[],"name":"InvalidCall","type":"error"},{"inputs":[{"internalType":"uint256","name":"version","type":"uint256"},{"internalType":"uint256","name":"expectedVersion","type":"uint256"}],"name":"InvalidInitialization","type":"error"},{"inputs":[],"name":"InvalidZeroAddress","type":"error"},{"inputs":[{"internalType":"address","name":"caller","type":"address"}],"name":"Unauthorized","type":"error"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"version","type":"uint256"},{"indexed":false,"internalType":"bytes","name":"cdata","type":"bytes"}],"name":"Initialize","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"river","type":"address"}],"name":"SetRiver","type":"event"},{"stateMutability":"payable","type":"fallback"},{"inputs":[{"internalType":"address","name":"_riverAddress","type":"address"}],"name":"initELFeeRecipientV1","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_maxAmount","type":"uint256"}],"name":"pullELFees","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]
Contract Creation Code
608060405234801561001057600080fd5b5061002660001961006960201b6102041760201c565b7f1809e49bba43f2d39fa57894b50cd6ccb428cc438230e065cac3eb24a1355a7160001960003660405161005c939291906100b1565b60405180910390a161010c565b6100aa61009760017f82055909238c0f5e63d6f174068ebb8f51bcec9bd37de63bb68f6551feec0cfd6100e7565b60001b826100ad60201b61023a1760201c565b50565b9055565b83815260406020820152816040820152818360608301376000818301606090810191909152601f909201601f1916010192915050565b60008282101561010757634e487b7160e01b600052601160045260246000fd5b500390565b6104108061011b6000396000f3fe60806040526004361061002d5760003560e01c80635404dd791461004d578063c8a6dfd31461006f57610034565b3661003457005b60405163574b16a760e11b815260040160405180910390fd5b34801561005957600080fd5b5061006d61006836600461031d565b61008f565b005b34801561007b57600080fd5b5061006d61008a366004610346565b61015f565b600061009961023e565b81146100cf57806100a861023e565b604051631cfd276760e31b8152600481019290925260248201526044015b60405180910390fd5b6100e26100dd826001610375565b610204565b6100eb82610277565b6040516001600160a01b038316907ffc0d749143b04e0d92a3b49edae84a45f6bc88b75e99d9118ec4d7e87fe626c590600090a27f1809e49bba43f2d39fa57894b50cd6ccb428cc438230e065cac3eb24a1355a71816000366040516101539392919061038d565b60405180910390a15050565b60006101696102ae565b9050336001600160a01b038216146101965760405163472511eb60e11b81523360048201526024016100c6565b60006101a283476102de565b905080156101ff57816001600160a01b031663efd60347826040518263ffffffff1660e01b81526004016000604051808303818588803b1580156101e557600080fd5b505af11580156101f9573d6000803e3d6000fd5b50505050505b505050565b61023761023260017f82055909238c0f5e63d6f174068ebb8f51bcec9bd37de63bb68f6551feec0cfd6103c3565b829055565b50565b9055565b600061027261026e60017f82055909238c0f5e63d6f174068ebb8f51bcec9bd37de63bb68f6551feec0cfd6103c3565b5490565b905090565b610280816102f6565b61023761023260017f1ec4138404500a2a0be2c2f9b103581c2a7fa783a934f91a6cc5cc924404973c6103c3565b600061027261026e60017f1ec4138404500a2a0be2c2f9b103581c2a7fa783a934f91a6cc5cc924404973c6103c3565b60008183116102ed57826102ef565b815b9392505050565b6001600160a01b0381166102375760405163f6b2911f60e01b815260040160405180910390fd5b60006020828403121561032f57600080fd5b81356001600160a01b03811681146102ef57600080fd5b60006020828403121561035857600080fd5b5035919050565b634e487b7160e01b600052601160045260246000fd5b600082198211156103885761038861035f565b500190565b83815260406020820152816040820152818360608301376000818301606090810191909152601f909201601f1916010192915050565b6000828210156103d5576103d561035f565b50039056fea26469706673582212204812aa7757cc4253508c05ff11bbd2ee5f94051eee03bbf4861c8f5f5ada80ee64736f6c634300080a0033
Deployed Bytecode
0x60806040526004361061002d5760003560e01c80635404dd791461004d578063c8a6dfd31461006f57610034565b3661003457005b60405163574b16a760e11b815260040160405180910390fd5b34801561005957600080fd5b5061006d61006836600461031d565b61008f565b005b34801561007b57600080fd5b5061006d61008a366004610346565b61015f565b600061009961023e565b81146100cf57806100a861023e565b604051631cfd276760e31b8152600481019290925260248201526044015b60405180910390fd5b6100e26100dd826001610375565b610204565b6100eb82610277565b6040516001600160a01b038316907ffc0d749143b04e0d92a3b49edae84a45f6bc88b75e99d9118ec4d7e87fe626c590600090a27f1809e49bba43f2d39fa57894b50cd6ccb428cc438230e065cac3eb24a1355a71816000366040516101539392919061038d565b60405180910390a15050565b60006101696102ae565b9050336001600160a01b038216146101965760405163472511eb60e11b81523360048201526024016100c6565b60006101a283476102de565b905080156101ff57816001600160a01b031663efd60347826040518263ffffffff1660e01b81526004016000604051808303818588803b1580156101e557600080fd5b505af11580156101f9573d6000803e3d6000fd5b50505050505b505050565b61023761023260017f82055909238c0f5e63d6f174068ebb8f51bcec9bd37de63bb68f6551feec0cfd6103c3565b829055565b50565b9055565b600061027261026e60017f82055909238c0f5e63d6f174068ebb8f51bcec9bd37de63bb68f6551feec0cfd6103c3565b5490565b905090565b610280816102f6565b61023761023260017f1ec4138404500a2a0be2c2f9b103581c2a7fa783a934f91a6cc5cc924404973c6103c3565b600061027261026e60017f1ec4138404500a2a0be2c2f9b103581c2a7fa783a934f91a6cc5cc924404973c6103c3565b60008183116102ed57826102ef565b815b9392505050565b6001600160a01b0381166102375760405163f6b2911f60e01b815260040160405180910390fd5b60006020828403121561032f57600080fd5b81356001600160a01b03811681146102ef57600080fd5b60006020828403121561035857600080fd5b5035919050565b634e487b7160e01b600052601160045260246000fd5b600082198211156103885761038861035f565b500190565b83815260406020820152816040820152818360608301376000818301606090810191909152601f909201601f1916010192915050565b6000828210156103d5576103d561035f565b50039056fea26469706673582212204812aa7757cc4253508c05ff11bbd2ee5f94051eee03bbf4861c8f5f5ada80ee64736f6c634300080a0033
Deployed Bytecode Sourcemap
416:888:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1282:13;;-1:-1:-1;;;1282:13:0;;;;;;;;;;;522:156;;;;;;;;;;-1:-1:-1;522:156:0;;;;;:::i;:::-;;:::i;:::-;;722:379;;;;;;;;;;-1:-1:-1;722:379:0;;;;;:::i;:::-;;:::i;522:156::-;589:1;1146:13:1;:11;:13::i;:::-;1134:8;:25;1130:109;;1204:8;1214:13;:11;:13::i;:::-;1182:46;;-1:-1:-1;;;1182:46:1;;;;;664:25:19;;;;705:18;;;698:34;637:18;;1182:46:1;;;;;;;;1130:109;1248:25;1260:12;:8;1271:1;1260:12;:::i;:::-;1248:11;:25::i;:::-;602:31:0::1;619:13;602:16;:31::i;:::-;648:23;::::0;-1:-1:-1;;;;;648:23:0;::::1;::::0;::::1;::::0;;;::::1;1343:30:1::0;1354:8;1364;;1343:30;;;;;;;;:::i;:::-;;;;;;;;522:156:0;;:::o;722:379::-;781:13;797:18;:16;:18::i;:::-;781:34;-1:-1:-1;829:10:0;-1:-1:-1;;;;;829:19:0;;;825:91;;871:34;;-1:-1:-1;;;871:34:0;;894:10;871:34;;;1618:51:19;1591:18;;871:34:0;1472:203:19;825:91:0;925:14;942:49;957:10;969:21;942:14;:49::i;:::-;925:66;-1:-1:-1;1006:10:0;;1002:93;;1049:5;-1:-1:-1;;;;;1032:35:0;;1075:6;1032:52;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1002:93;771:330;;722:379;:::o;627:123:17:-;678:65;308:45;352:1;316:32;308:45;:::i;:::-;733:9;3024:24:12;;2865:199;678:65:17;627:123;:::o;2865:199:12:-;3024:24;;2865:199::o;426:125:17:-;464:7;490:54;308:45;352:1;316:32;308:45;:::i;:::-;1622:16:12;;1442:212;490:54:17;483:61;;426:125;:::o;735:177:16:-;786:38;814:9;786:27;:38::i;:::-;834:71;381:50;430:1;389:37;381:50;:::i;516:131::-;554:7;580:60;381:50;430:1;389:37;381:50;:::i;1295:112:11:-;1355:7;1387:2;1382;:7;:17;;1397:2;1382:17;;;1392:2;1382:17;1374:26;1295:112;-1:-1:-1;;;1295:112:11:o;292:163:10:-;-1:-1:-1;;;;;363:22:10;;359:90;;408:30;;-1:-1:-1;;;408:30:10;;;;;;;;;;;14:286:19;73:6;126:2;114:9;105:7;101:23;97:32;94:52;;;142:1;139;132:12;94:52;168:23;;-1:-1:-1;;;;;220:31:19;;210:42;;200:70;;266:1;263;256:12;305:180;364:6;417:2;405:9;396:7;392:23;388:32;385:52;;;433:1;430;423:12;385:52;-1:-1:-1;456:23:19;;305:180;-1:-1:-1;305:180:19:o;743:127::-;804:10;799:3;795:20;792:1;785:31;835:4;832:1;825:15;859:4;856:1;849:15;875:128;915:3;946:1;942:6;939:1;936:13;933:39;;;952:18;;:::i;:::-;-1:-1:-1;988:9:19;;875:128::o;1008:459::-;1193:6;1182:9;1175:25;1236:2;1231;1220:9;1216:18;1209:30;1275:6;1270:2;1259:9;1255:18;1248:34;1332:6;1324;1319:2;1308:9;1304:18;1291:48;1388:1;1359:22;;;1383:2;1355:31;;;1348:42;;;;1451:2;1430:15;;;-1:-1:-1;;1426:29:19;1411:45;1407:54;;1008:459;-1:-1:-1;;1008:459:19:o;1680:125::-;1720:4;1748:1;1745;1742:8;1739:34;;;1753:18;;:::i;:::-;-1:-1:-1;1790:9:19;;1680:125::o
Swarm Source
ipfs://4812aa7757cc4253508c05ff11bbd2ee5f94051eee03bbf4861c8f5f5ada80ee
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 30 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
Loading...
Loading
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.