InfraredBERA

Git Source

Inherits: ERC20Upgradeable, Upgradeable, IInfraredBERA

Infrared BERA is a liquid staking token for Berachain

This is the main "Front-End" contract for the whole BERA staking system.

State Variables

withdrawalsEnabled

Withdrawals are not enabled by default, not supported by https://github.com/berachain/beacon-kit yet.

bool public withdrawalsEnabled;

_initialized

Whether the contract has been initialized

bool private _initialized;

feeDivisorShareholders

The fee divisor for protocol + operator + voter fees. 1/N, where N is the divisor. example 100 = 1/100 = 1%

uint16 public feeDivisorShareholders;

infrared

The Infrared.sol smart contract.

address public infrared;

depositor

The InfraredBERADepositor.sol smart contract.

address public depositor;

withdrawor

The InfraredBERAWithdrawor.sol smart contract.

address public withdrawor;

receivor

The InfraredBERAFeeReceivor.sol smart contract.

address public receivor;

deposits

The total amount of BERA deposited by the system.

uint256 public deposits;

_stakes

Mapping of validator pubkeyHash to their stake in BERA.

mapping(bytes32 pubkeyHash => uint256 stake) internal _stakes;

_staked

Mapping of validator pubkeyHash to whether they have recieved stake from this contract.

mapping(bytes32 pubkeyHash => bool isStaked) internal _staked;

_exited

Mapping of validator pubkeyHash to whether they have exited from this contract. (voluntarily or force).

mapping(bytes32 pubkeyHash => bool hasExited) internal _exited;

_signatures

Mapping of validator pubkeyHash to their deposit signature. All validators MUST have their signiture amounts set to INITIAL_DEPOSIT to be valid.

mapping(bytes32 pubkeyHash => bytes) internal _signatures;

__gap

Reserve storage slots for future upgrades for safety

uint256[40] private __gap;

Functions

initialize

Initiializer for InfraredBERA.

function initialize(
    address _gov,
    address _keeper,
    address _infrared,
    address _depositor,
    address _withdrawor,
    address _receivor
) external payable initializer;

Parameters

NameTypeDescription
_govaddressThe address of the governance contract.
_keeperaddressThe address of the keeper contract.
_infraredaddressThe address of the Infrared.sol contract.
_depositoraddressThe address of the InfraredBERADepositor.sol contract.
_withdraworaddressThe address of the InfraredBERAWithdrawor.sol contract.
_receivoraddressThe address of the InfraredBERAFeeReceivor.sol contract.

governor

Checks if account has the governance role.

function governor(address account) public view returns (bool);

Parameters

NameTypeDescription
accountaddressThe address to check.

Returns

NameTypeDescription
<none>boolTrue if the account has the governance role.

keeper

Checks if account has the keeper role.

function keeper(address account) public view returns (bool);

Parameters

NameTypeDescription
accountaddressThe address to check.

Returns

NameTypeDescription
<none>boolTrue if the account has the keeper role.

validator

Checks if a given pubkey is a validator in the Infrared contract.

function validator(bytes calldata pubkey) external view returns (bool);

Parameters

NameTypeDescription
pubkeybytesThe pubkey to check.

Returns

NameTypeDescription
<none>boolTrue if the pubkey is a validator.

setWithdrawalsEnabled

Allows withdrawals to be enabled or disabled.

Only callable by the governor.

function setWithdrawalsEnabled(bool flag) external onlyGovernor;

Parameters

NameTypeDescription
flagboolThe flag to set for withdrawals.

setFeeDivisorShareholders

Sets the fee shareholders taken on yield from EL coinbase priority fees + MEV

function setFeeDivisorShareholders(uint16 to) external onlyGovernor;

Parameters

NameTypeDescription
touint16The new fee shareholders represented as an integer denominator (1/x)%

setDepositSignature

Sets the deposit signature for a given pubkey. Ensure that the pubkey has signed the correct deposit amount of INITIAL_DEPOSIT.

Only callable by the governor.

function setDepositSignature(bytes calldata pubkey, bytes calldata signature)
    external
    onlyGovernor;

Parameters

NameTypeDescription
pubkeybytesThe pubkey to set the deposit signature for.
signaturebytesThe signature to set for the pubkey.

mint

Mints ibera to the receiver in exchange for bera.

takes in msg.value as amount to mint ibera with.

function mint(address receiver) public payable returns (uint256 shares);

Parameters

NameTypeDescription
receiveraddressThe address to mint ibera to.

Returns

NameTypeDescription
sharesuint256The amount of ibera minted.

burn

Burns ibera from the msg.sender and sets a receiver to get the BERA in exchange for iBERA.

function burn(address receiver, uint256 shares)
    external
    payable
    returns (uint256 nonce, uint256 amount);

Parameters

NameTypeDescription
receiveraddressThe address to send the BERA to.
sharesuint256The amount of ibera to burn.

Returns

NameTypeDescription
nonceuint256The nonce of the withdrawal. Queue based system for withdrawals.
amountuint256The amount of BERA withdrawn for the exchange of iBERA.

_deposit

Internal function to update top level accounting and minimum deposit.

function _deposit(uint256 amount) internal;

Parameters

NameTypeDescription
amountuint256The amount of BERA to deposit.

_withdraw

Internal function to update top level accounting.

function _withdraw(address receiver, uint256 amount, uint256 fee)
    private
    returns (uint256 nonce);

Parameters

NameTypeDescription
receiveraddressThe address to withdraw BERA to.
amountuint256The amount of BERA to withdraw.
feeuint256The fee to pay for the withdrawal.

previewMint

Previews the amount of InfraredBERA shares that would be minted for a given BERA amount

function previewMint(uint256 beraAmount) public view returns (uint256 shares);

Parameters

NameTypeDescription
beraAmountuint256The amount of BERA to simulate depositing

Returns

NameTypeDescription
sharesuint256The amount of InfraredBERA shares that would be minted, returns 0 if the operation would fail

previewBurn

Previews the amount of BERA that would be received for burning InfraredBERA shares

function previewBurn(uint256 shareAmount)
    public
    view
    returns (uint256 beraAmount, uint256 fee);

Parameters

NameTypeDescription
shareAmountuint256The amount of InfraredBERA shares to simulate burning

Returns

NameTypeDescription
beraAmountuint256The amount of BERA that would be received, returns 0 if the operation would fail
feeuint256The fee that would be charged for the burn operation

stakes

Returns the amount of BERA staked in validator with given pubkey

function stakes(bytes calldata pubkey) external view returns (uint256);

Returns

NameTypeDescription
<none>uint256The amount of BERA staked in validator

staked

Returns whether initial deposit has been staked to validator with given pubkey

function staked(bytes calldata pubkey) external view returns (bool);

Returns

NameTypeDescription
<none>boolWhethere initial deposit has been staked to validator

pending

Pending deposits yet to be forwarded to CL

function pending() public view returns (uint256);

Returns

NameTypeDescription
<none>uint256The amount of BERA yet to be deposited to CL

confirmed

Confirmed deposits sent to CL, total - future deposits

function confirmed() external view returns (uint256);

Returns

NameTypeDescription
<none>uint256The amount of BERA confirmed to be deposited to CL

compound

Internal function to update top level accounting and compound rewards

function compound() public;

sweep

Compounds accumulated EL yield in fee receivor into deposits

Called internally at bof whenever InfraredBERA minted or burned

Only sweeps if amount transferred from fee receivor would exceed min deposit thresholds

function sweep() external payable;

collect

Collects yield from fee receivor and mints ibera shares to Infrared

Called in RewardsLib::harvestOperatorRewards() in Infrared.sol

Only Infrared can call this function

function collect() external returns (uint256 sharesMinted);

Returns

NameTypeDescription
sharesMinteduint256The amount of ibera shares

register

Updates the accounted for stake of a validator pubkey.

This does NOT mean its the balance on the CL, edge case is if another user has staked to the pubkey.

function register(bytes calldata pubkey, int256 delta) external;

Parameters

NameTypeDescription
pubkeybytesThe pubkey of the validator.
deltaint256The change in stake.

hasExited

Returns whether a validator pubkey has exited.

function hasExited(bytes calldata pubkey) external view returns (bool);

signatures

Returns the deposit signature to use for given pubkey

function signatures(bytes calldata pubkey)
    external
    view
    returns (bytes memory);

Returns

NameTypeDescription
<none>bytesThe deposit signature for pubkey