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.

TreasuryUpdated

event TreasuryUpdated(address oldTreasury, address newTreasury)

Emitted when the treasury wallet address is updated.

Parameters

NameTypeDescription

oldTreasury

address

Address of the old treasury wallet.

newTreasury

address

Address of the new treasury wallet.

MinimumDepositAmountUpdated

event MinimumDepositAmountUpdated(uint256 minimumDepositAmount)

Emitted when deposit parameters are updated.

Parameters

NameTypeDescription

minimumDepositAmount

uint256

New value of the minimum deposit amount.

DispatcherUpdated

event DispatcherUpdated(address oldDispatcher, address newDispatcher)

Emitted when the dispatcher contract is updated.

Parameters

NameTypeDescription

oldDispatcher

address

Address of the old dispatcher contract.

newDispatcher

address

Address of the new dispatcher contract.

EntryFeeBasisPointsUpdated

event EntryFeeBasisPointsUpdated(uint256 entryFeeBasisPoints)

Emitted when the entry fee basis points are updated.

Parameters

NameTypeDescription

entryFeeBasisPoints

uint256

New value of the fee basis points.

ExitFeeBasisPointsUpdated

event ExitFeeBasisPointsUpdated(uint256 exitFeeBasisPoints)

Emitted when the exit fee basis points are updated.

Parameters

NameTypeDescription

exitFeeBasisPoints

uint256

New value of the fee basis points.

LessThanMinDeposit

error LessThanMinDeposit(uint256 amount, uint256 min)

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

Parameters

NameTypeDescription

amount

uint256

Amount to check.

min

uint256

Minimum amount to check 'amount' against.

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.

constructor

constructor() public

initialize

function initialize(contract IERC20 asset, address _treasury) public

updateTreasury

function updateTreasury(address newTreasury) external

Updates treasury wallet address.

Parameters

NameTypeDescription

newTreasury

address

New treasury wallet address.

updateMinimumDepositAmount

function updateMinimumDepositAmount(uint256 newMinimumDepositAmount) external

Updates minimum deposit amount.

Parameters

NameTypeDescription

newMinimumDepositAmount

uint256

New value of the minimum deposit amount. It is the minimum amount for a single deposit operation.

updateDispatcher

function updateDispatcher(contract IDispatcher newDispatcher) external

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

Parameters

NameTypeDescription

newDispatcher

contract IDispatcher

Address of the new dispatcher contract.

updateEntryFeeBasisPoints

function updateEntryFeeBasisPoints(uint256 newEntryFeeBasisPoints) external

Update the entry fee basis points.

Parameters

NameTypeDescription

newEntryFeeBasisPoints

uint256

New value of the fee basis points.

updateExitFeeBasisPoints

function updateExitFeeBasisPoints(uint256 newExitFeeBasisPoints) external

Update the exit fee basis points.

Parameters

NameTypeDescription

newExitFeeBasisPoints

uint256

New value of the fee basis points.

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

NameTypeDescription

spender

address

The address which will spend the funds.

value

uint256

The amount of tokens to be spent.

extraData

bytes

Additional data.

Return Values

NameTypeDescription

[0]

bool

True if both approval and receiveApproval calls succeeded.

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

NameTypeDescription

assets

uint256

Approved amount of tBTC tokens to deposit. This includes treasury fees for staking tBTC.

receiver

address

The address to which the shares will be minted.

Return Values

NameTypeDescription

[0]

uint256

Minted shares adjusted for the fees taken by the treasury.

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

NameTypeDescription

shares

uint256

Amount of shares to mint.

receiver

address

The address to which the shares will be minted.

Return Values

NameTypeDescription

assets

uint256

Used assets to mint shares.

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

NameTypeDescription

assets

uint256

Amount of assets to withdraw.

receiver

address

The address to which the assets will be transferred.

owner

address

The address of the owner of the shares.

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

NameTypeDescription

shares

uint256

Amount of shares to redeem.

receiver

address

The address to which the assets will be transferred.

owner

address

The address of the owner of the shares.

totalAssets

function totalAssets() public view returns (uint256)

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

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

NameTypeDescription

account

address

The owner of the shares.

Return Values

NameTypeDescription

[0]

uint256

The amount of assets.

_entryFeeBasisPoints

function _entryFeeBasisPoints() internal view returns (uint256)

Return Values

NameTypeDescription

[0]

uint256

Returns entry fee basis point used in deposits.

_exitFeeBasisPoints

function _exitFeeBasisPoints() internal view returns (uint256)

Return Values

NameTypeDescription

[0]

uint256

Returns exit fee basis point used in withdrawals.

_feeRecipient

function _feeRecipient() internal view returns (address)

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

Last updated