stBTC

This contract implements the ERC-4626 tokenized vault standard. By staking tBTC, users acquire a liquid staking token called stBTC, commonly referred to as "shares". Users have the flexibility to redeem stBTC, enabling them to withdraw their deposited tBTC along with the accrued yield.

ERC-4626 is a standard to optimize and unify the technical parameters of yield-bearing vaults. This contract facilitates the minting and burning of shares (stBTC), which are represented as standard ERC20 tokens, providing a seamless exchange with tBTC tokens.

dispatcher

contract IDispatcher dispatcher

Dispatcher contract that routes tBTC from stBTC to a given allocation contract and back.

treasury

address treasury

Address of the treasury wallet, where fees should be transferred to.

minimumDepositAmount

uint256 minimumDepositAmount

Minimum amount for a single deposit operation. The value should be set low enough so the deposits routed through Bitcoin Depositor contract won't be rejected. It means that minimumDepositAmount should be lower than tBTC protocol's depositDustThreshold reduced by all the minting fees taken before depositing in the Acre contract.

entryFeeBasisPoints

uint256 entryFeeBasisPoints

Entry fee basis points applied to entry fee calculation.

exitFeeBasisPoints

uint256 exitFeeBasisPoints

Exit fee basis points applied to exit fee calculation.

allowedDebt

mapping(address => uint256) allowedDebt

Returns the maximum amount of the underlying asset for which the shares can be minted without the coverage in deposited assets.

currentDebt

mapping(address => uint256) currentDebt

Returns the current debt of the debtor.

totalDebt

uint256 totalDebt

Total amount of debt across all debtors.

This is the total amount of assets for which shares have been minted without the coverage in deposited assets. The value is used to adjust the total assets held by the vault.

TreasuryUpdated

event TreasuryUpdated(address oldTreasury, address newTreasury)

Emitted when the treasury wallet address is updated.

Parameters

MinimumDepositAmountUpdated

event MinimumDepositAmountUpdated(uint256 minimumDepositAmount)

Emitted when deposit parameters are updated.

Parameters

DispatcherUpdated

event DispatcherUpdated(address oldDispatcher, address newDispatcher)

Emitted when the dispatcher contract is updated.

Parameters

EntryFeeBasisPointsUpdated

event EntryFeeBasisPointsUpdated(uint256 entryFeeBasisPoints)

Emitted when the entry fee basis points are updated.

Parameters

ExitFeeBasisPointsUpdated

event ExitFeeBasisPointsUpdated(uint256 exitFeeBasisPoints)

Emitted when the exit fee basis points are updated.

Parameters

DebtAllowanceUpdated

event DebtAllowanceUpdated(address debtor, uint256 newAllowance)

Emitted when the maximum debt allowance of the debtor is updated.

Parameters

DebtMinted

event DebtMinted(address debtor, uint256 currentDebt, uint256 assets, uint256 shares)

Emitted when debt is minted.

Parameters

DebtRepaid

event DebtRepaid(address debtor, uint256 currentDebt, uint256 assets, uint256 shares)

Emitted when debt is repaid.

Parameters

LessThanMinDeposit

error LessThanMinDeposit(uint256 amount, uint256 min)

Reverts if the amount is less than the minimum deposit amount.

Parameters

DisallowedAddress

error DisallowedAddress()

Reverts if the address is disallowed.

ExceedsMaxFeeBasisPoints

error ExceedsMaxFeeBasisPoints()

Reverts if the fee basis points exceed the maximum value.

SameTreasury

error SameTreasury()

Reverts if the treasury address is the same.

SameDispatcher

error SameDispatcher()

Reverts if the dispatcher address is the same.

InsufficientDebtAllowance

error InsufficientDebtAllowance(address debtor, uint256 allowance, uint256 needed)

Emitted when the debt allowance of a debtor is insufficient.

Used in the debt minting function.

Parameters

ExcessiveDebtRepayment

error ExcessiveDebtRepayment(address debtor, uint256 debt, uint256 needed)

Emitted when the debt of the debtor is insufficient - the debtor tries to repay more than they borrowed.

Used in the debt repayment function.

Parameters

constructor

constructor() public

initialize

function initialize(contract IERC20 asset, address _treasury) public

updateTreasury

function updateTreasury(address newTreasury) external

Updates treasury wallet address.

Parameters

updateMinimumDepositAmount

function updateMinimumDepositAmount(uint256 newMinimumDepositAmount) external

Updates minimum deposit amount.

Parameters

updateDispatcher

function updateDispatcher(contract IDispatcher newDispatcher) external

Updates the dispatcher contract and gives it an unlimited allowance to transfer deposited tBTC.

Parameters

updateEntryFeeBasisPoints

function updateEntryFeeBasisPoints(uint256 newEntryFeeBasisPoints) external

Update the entry fee basis points.

Parameters

updateExitFeeBasisPoints

function updateExitFeeBasisPoints(uint256 newExitFeeBasisPoints) external

Update the exit fee basis points.

Parameters

approveAndCall

function approveAndCall(address spender, uint256 value, bytes extraData) external returns (bool)

Calls receiveApproval function on spender previously approving the spender to withdraw from the caller multiple times, up to the value amount. If this function is called again, it overwrites the current allowance with value. Reverts if the approval reverted or if receiveApproval call on the spender reverted.

If the value is set to type(uint256).max then transferFrom and burnFrom will not reduce an allowance.

Parameters

Return Values

disableNonFungibleWithdrawals

function disableNonFungibleWithdrawals() external

Disables non-fungible withdrawals.

updateDebtAllowance

function updateDebtAllowance(address debtor, uint256 newAllowance) external

Sets the maximum debt allowance of the debtor.

The current debt value is intentionally not checked to allow the governance reduce the debt allowance in case the depositor becomes risky or malicious.

Parameters

mintDebt

function mintDebt(uint256 shares, address receiver) public returns (uint256 assets)

Mints the requested amount of shares and registers a debt in asset corresponding to the minted amount of shares.

The debt is calculated based on the current conversion rate from the shares to assets.

Parameters

Return Values

mintReceipt

function mintReceipt(address to, uint256 amount) external

This function proxies mintDebt call and provides compatibility with Mezo IReceiptToken interface.

repayDebt

function repayDebt(uint256 shares) public returns (uint256 assets)

Repay the asset debt, fully of partially with the provided shares.

The debt to be repaid is calculated based on the current conversion rate from the shares to assets. The debtor has to approve the transfer of the shares. To determine the asset debt that is going to be repaid, the caller can use the previewRepayDebt function.

Parameters

Return Values

burnReceipt

function burnReceipt(uint256 amount) external

This function proxies repayDebt call and provides compatibility with Mezo IReceiptToken interface.

deposit

function deposit(uint256 assets, address receiver) public returns (uint256)

Mints shares to receiver by depositing exactly amount of tBTC tokens.

Takes into account a deposit parameter, minimum deposit amount, which determines the minimum amount for a single deposit operation. The amount of the assets has to be pre-approved in the tBTC contract.

Parameters

Return Values

mint

function mint(uint256 shares, address receiver) public returns (uint256 assets)

Mints shares to receiver by depositing tBTC tokens.

Takes into account a deposit parameter, minimum deposit amount, which determines the minimum amount for a single deposit operation. The amount of the assets has to be pre-approved in the tBTC contract. The msg.sender is required to grant approval for the transfer of a certain amount of tBTC, and in addition, approval for the associated fee. Specifically, the total amount to be approved (amountToApprove) should be equal to the sum of the deposited amount and the fee. To determine the total assets amount necessary for approval corresponding to a given share amount, use the previewMint function.

Parameters

Return Values

withdraw

function withdraw(uint256 assets, address receiver, address owner) public returns (uint256)

Withdraws assets from the vault and transfers them to the receiver.

Withdraw unallocated assets first and and if not enough, then pull the assets from the dispatcher.

Parameters

redeem

function redeem(uint256 shares, address receiver, address owner) public returns (uint256)

Redeems shares for assets and transfers them to the receiver.

Redeem unallocated assets first and and if not enough, then pull the assets from the dispatcher.

Parameters

totalAssets

function totalAssets() public view returns (uint256)

Returns the total amount of assets held by the vault across all allocations and this contract.

The value contains virtual assets reflecting the debt minted by the debtors. The debt is not backed by the deposited assets, and it is used to adjust the total assets held by the vault, to allow shares and assets conversion calculations.

maxDeposit

function maxDeposit(address) public view returns (uint256)

Returns the maximum amount of the underlying asset that can be deposited into the Vault for the receiver, through a deposit call. If the Vault is paused, returns 0.

maxMint

function maxMint(address) public view returns (uint256)

Returns the maximum amount of the Vault shares that can be minted for the receiver, through a mint call. If the Vault is paused, returns 0.

maxWithdraw

function maxWithdraw(address owner) public view returns (uint256)

Returns the maximum amount of the underlying asset that can be withdrawn from the owner balance in the Vault, through a withdraw call. If the Vault is paused, returns 0.

maxRedeem

function maxRedeem(address owner) public view returns (uint256)

Returns the maximum amount of Vault shares that can be redeemed from the owner balance in the Vault, through a redeem call. If the Vault is paused, returns 0.

assetsBalanceOf

function assetsBalanceOf(address account) public view returns (uint256)

Returns the number of assets that corresponds to the amount of shares held by the specified account.

This function is used to convert shares to assets position for the given account. It does not take fees into account.

Parameters

Return Values

previewRepayDebt

function previewRepayDebt(uint256 shares) public view returns (uint256)

Previews the amount of assets that will be burned for the given amount of repaid shares.

_entryFeeBasisPoints

function _entryFeeBasisPoints() internal view returns (uint256)

Return Values

_exitFeeBasisPoints

function _exitFeeBasisPoints() internal view returns (uint256)

Return Values

_feeRecipient

function _feeRecipient() internal view returns (address)

Returns the address of the treasury wallet, where fees should be transferred to.

Last updated