# Introduction

<figure><img src="/files/B6ZtSaKi3v8r0X8YvInR" alt=""><figcaption></figcaption></figure>

## What is Acre?

Acre’s mission is simple: Compound bitcoin without compromising its principles of decentralization, transparency, or financial sovereignty.

Compounding Your Bitcoin: the platform where bitcoin earns more bitcoin

* Acre is a platform that allows bitcoin holders to compound their bitcoin by earning additional BTC on their holdings while retaining control of their assets.
* When users deposit their BTC, Acre dispatches it to economically secure protocols like lending, insurance, liquidity bootstrapping, and layer 2 networks. These protocols use the BTC to bootstrap and secure these systems, creating a cycle of value: bitcoin strengthens the networks, and these networks pay for that security which Acre compounds into bitcoin.
* Acre connects bitcoin to these opportunities trustlessly, without centralized custodians or exposure to other tokens or chains.

<figure><img src="/files/ZzBSNsXpDbNIZb0mp36R" alt=""><figcaption><p>Acre Flow of Funds Diagram</p></figcaption></figure>

## Why?

Until recently, the idea of bitcoin as an asset that provides economic security was uncommon, given bitcoin is a proof-of-work chain. However, recent technological breakthroughs in decentralized tokenized BTC have opened up new opportunities to integrate bitcoin more deeply in the expansive crypto ecosystem.

Acre is designed to feature a "bitcoin in, bitcoin out" experience, which means you can interact with the Acre protocol directly from your bitcoin wallet, without needing to switch chains, wallets, or deposit with a centralized custodian. Acre offers users the ability to earn rewards on their bitcoin, without the need for deep technical or financial expertise.<br>

## Bitcoin should work for bitcoin holders

Acre’s mission is simple: Compound bitcoin without compromising its principles of decentralization, transparency, or financial sovereignty.

Contribute to Bitcoin scaling; put your bitcoin to work.&#x20;


# FAQ

## What is Acre?

Acre’s mission is simple: Compound bitcoin without compromising its principles of decentralization, transparency, or financial sovereignty.

Compounding Your Bitcoin: the platform where bitcoin earns more bitcoin

* Acre is a platform that allows bitcoin holders to compound their bitcoin by earning additional BTC on their holdings while retaining control of their assets.
* When users deposit their BTC, Acre dispatches it to economically secure protocols like lending, insurance, liquidity bootstrapping, and layer 2 networks. These protocols use the BTC to bootstrap and secure these systems, creating a cycle of value: bitcoin strengthens the networks, and these networks pay for that security which Acre compounds into bitcoin.
* Acre connects bitcoin to these opportunities trustlessly, without centralized custodians or exposure to other tokens or chains.

## What happens to my Bitcoin when I deposit?

Bitcoin deposited in Acre is used for economic security across chains and protocols. First the BTC is bridged, then dispatched to a highly vetted vault system approved by the Acre Security Council and DAO. All BTC movements with Acre can be tracked in the smart contracts on EVM compatible networks. No black boxes.

## How are my assets secured?

Acre has selected a decentralized custodian (tBTC). The underlying BTC is held in a 51-of-100 multisig operated by decentralized nodes. Nodes reach a consensus before executing any kind of mint or redemption of the BTC, which makes it highly secure and decentralized.  That 1:1 bitcoin on Ethereum is then deployed via the Acre dispatcher smart contract to projects and protocols in order to provide economic security. Each protocol vault built atop Acre is vetted and approved by the Acre DAO.


# Overview

Acre is a simple bitcoin-in bitcoin-out experience, to compound your bitcoin.

## Flow of Funds

Bitcoin deposits into Acre are first used to mint tBTC (a fully permissionless and decentralized wrapped-bitcoin token) to Ethereum. tBTC is then used to provide economic security to protocols such as bitcoin-L2s, re-staking protocols, lending, and insurance markets across the EVM ecosystem and beyond.

Bitcoin L2s are similar to all other proof-of-stake chains and provide rewards in exchange for economic security and bootstrapping liquidity. These rewards auto-compound into tBTC and are fully-redeemable to mainnet bitcoin.

In the future, Acre may support additional forms of tokenized bitcoin for deposit in addition to the minting and movement of acreBTC, the deposit receipt ERC-4626 token for DeFi.&#x20;

## Withdrawals

BTC rewards can be withdrawn at any time, however there is a withdrawal delay and fee associated with each transaction. This withdrawal delay is due to pulling the underlying tokenized Bitcoin out of the smart contract and trustlessly redeeming back to the Bitcoin network.


# Deposit & Withdraw Durations

Acre deposits and withdrawals involve on chain transactions and confirmation times may vary based on network congestion. Deposits may take 1-3 hours to confirm fully on-chain.

**Deposit Times:**

* **Bitcoin Confirmations:** The time required for deposit depends on the amount of BTC:
  * Less than 0.1 BTC: 1 confirmation, \~10 minutes.
  * Between 0.1 BTC and 1 BTC: 3 confirmations, \~30 minutes.
  * 1 BTC or more: 6 confirmations, \~60 minutes.
* Ethereum Confirmations: These are typically \~1-5 minutes.
* **Optimistic Minting:** After the necessary confirmations, there is an additional 1-hour delay for the tBTC optimistic minting process.

**Lockups:**

* **None**

**Withdrawal Cooldown:**

* **Up to 72 hours for bridging between tBTC -> BTC**
* 14 days for withdrawals to be processed by Midas.


# Fees

The Acre protocol includes the following fees. Any and all changes are subject to governance approval.

## Deposit Fee

**There is no deposit fee**

## Withdrawal Fee

**There is a flat 0.20% fee on withdrawals to cover the bridge from tBTC to BTC.**

* tBTC bridging fee (0.2%)

## Protocol Fee

**There is a 20% protocol fee on all yield**

* Fee is split between Acre DAO and vault partners (strategy, infrastructure)

## Network Fees

**There are no network fees with Acre**

* All network fees are covered by deposit and withdrawal fees&#x20;


# Supported Wallets

Acre app currently supports Unisat, OKX, and Xverse wallets as browser extensions.&#x20;

:warning: <mark style="background-color:$warning;">To use your Ledger hardware wallet, you use must it through Xverse</mark>

All Bitcoin address types are supported, except for Taproot. When you connect your wallet, **please ensure you use one of the following address types:**

| Name          | Script Type | Address Prefix |
| ------------- | ----------- | -------------- |
| Legacy        | P2PKH       | 1              |
| Native SegWit | P2WPKH      | bc1q           |
| Nested SegWit | P2SH-P2WPKH | 3              |


# No Lockups

Acre has a 0 lockup time for all deposits on mainnet. With any of our vault partners built atop Acre and integrated with the Acre Dispatch Service we maintain no required lock time and you can withdraw at any time. \
\
The withdrawal times may vary depending on vault partners and specific parameters. Acre is committed to maintaining transparency and sovereignty.&#x20;


# Key Concepts


# Acre Security Council

### **What is the Acre Security Council?**

The **Acre Security Council (ASC)** is a committee responsible for managing risks, overseeing protocol upgrades, and executing emergency actions within the Acre ecosystem.

Its key responsibilities include reviewing and approving vault strategies built on Acre before they proceed to a full DAO vote.<br>

### **What does the Acre Security Council do?**&#x20;

The Acre Security Council approves vaults, partners, and strategists.

The Council engages with diverse stakeholders, involving parties related to Acre, such as users, apps, wallets, SDKs, node operators, and other community members, in early decision-making for network upgrades and other related ecosystem strategy around vault integrations.

The Council supports transparent decision-making, facilitating a clear process for discussions and updates, and ensuring all relevant parties are informed.

### **How does the Acre Security Council communicate?**&#x20;

The ASC uses the public discussion platform site: <https://forum.acre.fi/> for communications, proposals, and open discourse.

The ASC established an initial meeting on **July 22, 2025 at 10:00am EDT (14:00 UTC)** to introduce our inaugural council members, introduce our first governance vote, discuss and review items included in this vote, and provide instructions on how and where to cast votes.

### **What is the ASC Governance Process?**

Proposals set forth to the ASC must have sponsorship from an active Security Council member, in order to move onto a tabulated vote.

Proposals are set forth using the public forum: <https://forum.acre.fi/>.

Once a proposal has received sponsorship and has had ample time for discussion, a member of the ASC may call for a Council vote.

### **What is the Voting Process?**&#x20;

ASC voting procedure takes place asynchronously unless there is a time-sensitive vote requiring immediate attention.

The ASC utilizes Snapshot, an offchain voting platform that acts as a temperature check, found here: <https://snapshot.box/#/s:acrebitcoin.eth>

Voting procedures utilize a 6/9 quorum, all active ACS members have 1 vote.

Snapshots must run for a minimum period of 5 days. The snapshot platform automatically starts a time clock once a vote has been released.


# Acre Deployment Policy

Deployment Policy Adopted by Acre DAO Security Council vote on Jul 27, 2025

The Acre Deployment policy has been created to establish a governance framework for deploying assets deposited into the Acre Protocol. This framework supports Acre’s long term growth and sustainability while providing risk-adjusted rewards for our depositors.

The Acre Deployment Policy was presented to the Acre Security Council for review and discussion, and voted into effect on July 27th, 2025. The voting information can be accessed at <https://snapshot.box/#/s:acrebitcoin.eth> and voting discussion at <https://forum.acre.fi/>.&#x20;

This inaugural ASC vote was an important initial step in the decentralization of the Acre Protocol, establishing the implementation of the Acre Deployment Policy as a key aspect of Acre’s governance.

## **1. Purpose**&#x20;

1.1. This Deployment Policy establishes the governance framework for deploying Acre-deposited assets into Bitcoin-native reward opportunities. The objective is to generate sustainable, risk-adjusted rewards while preserving capital, maintaining liquidity, and supporting Acre’s long-term resilience and the growth and sustainability of the BitcoinFi ecosystem.

## **2. Scope**&#x20;

2.1. This policy governs all deployments made by the protocol smart contracts using deposited assets for which the Acre DAO has dispatch governance. All deployments must adhere to this policy unless amended through proper DAO governance, as outlined in the Acre DAO Constitution.

## **3. Deployment Objectives**&#x20;

**3.1. Reward Generation:** Maximize risk-adjusted returns from Bitcoin-native and Bitcoin-adjacent protocols. \
**3.2. Ecosystem Alignment:** Prioritize protocols advancing and strengthening the BitcoinFi stack \
**3.3. Capital Preservation:** Protect deposits through diversification and risk management. \
**3.4. Liquidity Maintenance:** Ensure sufficient liquidity to meet protocol obligations (e.g. redemptions, incentive programs, and internal rebalancing). \
**3.5. On-Chain Transparency:** All deployments must be trackable, auditable, and verifiable on-chain.<br>

## **4. Eligible Deployment Categories**

Subject to DAO review and smart contract implementation, eligible deployments include:&#x20;

**4.1. Bitcoin-native Staking or Liquidity Programs** \
4.1.1. Projects offering native BTC or wrapped BTC rewards \
4.1.2. Examples: DLCs, Lightning channel leasing, or Layer 2 liquidity provisioning&#x20;

**4.2. Bitcoin-aligned Lending Protocols** \
4.2.1. Decentralized lending platforms that accept BTC or chain-native BTC derivatives including tBTC. Minimum requirement: overcollateralized positions and transparent risk modeling&#x20;

**4.3. Reward Aggregators and Vault Strategies** \
4.3.1. Audited vaults built on protocols with audited smart contracts \
4.3.2. Risk disclosures must be public and verifiable&#x20;

**4.4. Strategic Ecosystem Grants or LP Positions** \
4.4.1. DAO-approved deployments in early-stage Bitcoin-focused or Bitcoin native projects \
4.4.2. Subject to vesting, milestone-based disbursement and clawback terms where applicable.

## **5. Risk Management**&#x20;

**5.1.1. Maximum Exposure Limits:** No more than 50% of deposits in a single vetted protocol, and no more than 25% in a single product \
5.1.2. Minimum 2% held in reserve as BTC or tBTC and remain liquid (redeemable <48 hours)\
\
**5.2. Diversification Standard** \
5.2.1. Minimum 2 active deployments or 2+ protocols across distinct yield verticals \
\
**5.3. Due Diligence Standards** \
5.3.1. Audits or formal verification of all smart contracts

5.3.2. Public documentation of counterparty risk and technical architecture \
5.3.3. DAO or security committee review before new strategy whitelisting

**5.4. Rebalancing and Exit Criteria:** \
5.4.1. Periodic reviews every 90 days \
5.4.2. Auto-withdrawal if exploits occur, \
5.4.3. DAO vote mandates exit

## **6. Governance and Implementation**&#x20;

6.1. All deployment actions must be executed by DAO-approved smart contracts or authorized multi-sig agents with predefined logic. Changes to this policy require a formal DAO proposal and approval, as outlined in the Acre DAO Constitution. \
6.2. Emergency actions (e.g. mass withdrawal) may be executed by predefined smart contract logic or DAO emergency powers, as outlined in the Acre DAO Constitution.

## **7. Reporting**&#x20;

7.1. Rewards, performance, and risk metrics will be reported on-chain.

## **8. Policy Review**&#x20;

8.1. This Deployment Policy shall be reviewed at least once per year or upon major protocol upgrades, market shifts, change in DAO governance or treasury composition.


# acreBTC Deposit Token

**acreBTC is a non-rebasing ERC4626 deposit token**, which represents bitcoin deposited into Acre.

The ERC4626 standard is a tokenized vault standard, which is designed for the efficient management of vaults and rewards.

### How Rewards Accrue

**As Acre vaults generate rewards, these will automatically accrue to the acreBTC ERC4626 vault.** When a user withdraws their bitcoin, or redeems acreBTC, they will receive their deposited bitcoin amount--plus rewards that have accrued during the period of their deposit.<br>

### Rebasing vs Non-rebasing tokens

**acreBTC is a non-rebasing token, which means that the balance of acreBTC does NOT increase in a users wallet as rewards accrue.** Instead, the amount of bitcoin that acreBTC can be redeemed for increases.

### Using acreBTC outside of the Acre DApp

You can view your acreBTC balance anytime inside the Acre DApp. Note that there is no way to mint or move your acreBTC deposit token outside of the Acre Dapp. Any future decision to allow for minting or moving acreBTC will be voted on by the Acre DAO. <br>


# stBTC -> acreBTC Migration

**Acre v2 will be available on ETH Mainnet the week of October 13, 2025.**&#x20;

With this release, Acre's deposit token name will change from stBTC to acreBTC; all current v1 deposits will be securely migrated to the v2 vault and will immediately begin to earn Bitcoin-on-Bitcoin yield.

Here's what Acre depositors need to know:

* If you wish to continue earning with Acre, **no action is required**. All deposits will be securely migrated from the v1 vault to the new v2 vault.
* If you wish to redeem your Bitcoin before the migration, you can do so anytime prior to October 13 from the v1 app at <https://bitcoin.acre.fi/>.
* All points balances (Acre Points & Season 1 partner mats) will carry over to the Acre v2.&#x20;
* Acre Points will continue to accrue in the v2 vault.

On or soon after October 13th, the migration will take place and and the v2 UI will replace the v1 UI at <https://bitcoin.acre.fi/>. V2 redemptions will go live before the migration to yield-bearing acreBTC, ensuring a smooth transition for all users.

Contact us at anytime on the [Acre Discord](https://discord.com/invite/acre) if you have questions or need assistance.


# Acre Dispatch Service

The governed dispatch service reviewed and managed by the Acre Security Council and DAO.

The Acre Dispatcher manages how bitcoin is placed within the Acre Protocol vaults. Its role is to maintain and update a weighted allocation of bitcoin between vaults which include protocols, applications and Layer 2's built atop Acre. The dispatcher is controlled by Acre DAO governance.


# tBTC Decentralized Bitcoin Bridge

Acre has selected a permissionless, decentralized bridged bitcoin (tBTC) as part of the infrastructure behind the Acre protocol.

Built atop [tBTC](https://tbtc.network/), Acre selected a non-custodial and decentralized bitcoin tokenization service for launch allowing mainnet bitcoin to be securely bridged on Ethereum and beyond. Maintained and operated by the [Threshold Network DAO](https://docs.threshold.network/), it relies on a system of decentralized nodes rather than a single centralized custodian.\
\
Supported on the largest DeFi, restaking and bitcoin L2 protocols, this choice for a permissionless bridge increases the different vault partners for Acre without sacrificing security.

## Security

Fully backed and redeemable for BTC, this bridge requires a threshold majority signature (51 out of 100) before node operators mint or redeem the underlying asset. You can learn more about tBTC minting [here](https://docs.threshold.network/applications/tbtc-v2).


# Acre DApp

The Acre Dapp can be accessed from the <https://acre.fi/> homepage.

Detailed instructions are provided in the next sections for accessing the dashboard, signing into the application, depositing into your Acre account, and withdrawing funds.


# Acre Dashboard

Activities and Acre Points can be viewed on the Acre DApp at [https://bitcoin.acre.fi/dashboard](https://v2.acre.fi/dashboard).&#x20;

Depositors control their assets with a bitcoin transaction once they sign in with a bitcoin wallet. The dashboard supports key functions such as deposit, withdraw, and claiming Acre points.

<figure><img src="/files/CuPRGUZgheimEqQZCb9I" alt=""><figcaption></figcaption></figure>

The dashboard also displays helpful statistics such as:

* Position: how much and for how long have you had your BTC in Acre.
* View points: Acre points are claimable within the Acre dashboard.
* Transaction History: easily see your previous Acre transactions and link to the corresponding transaction.


# How to Sign In

The basics of connecting your wallet and signing in to Acre.

:warning: <mark style="background-color:$warning;">To sign into Acre, you must use one of the following</mark> <mark style="background-color:$warning;"></mark><mark style="background-color:$warning;">**Bitcoin browser extension wallets**</mark><mark style="background-color:$warning;">:</mark>

* <mark style="background-color:$warning;">**OKX**</mark> <mark style="background-color:$warning;"></mark><mark style="background-color:$warning;">(</mark>[<mark style="background-color:$warning;">download here</mark>](https://chromewebstore.google.com/detail/okx-wallet/mcohilncbfahbmgdjkbpemcciiolgcge)<mark style="background-color:$warning;">)</mark>
* <mark style="background-color:$warning;">**Unisat**</mark> <mark style="background-color:$warning;"></mark><mark style="background-color:$warning;">(</mark>[<mark style="background-color:$warning;">download here</mark>](https://chromewebstore.google.com/detail/unisat-wallet/ppbibelpcjmhbdihakflkdcoccbgbkpo)<mark style="background-color:$warning;">)</mark>
* <mark style="background-color:$warning;">**XVerse**</mark> <mark style="background-color:$warning;"></mark><mark style="background-color:$warning;">(</mark>[<mark style="background-color:$warning;">download here</mark>](https://chromewebstore.google.com/detail/xverse-bitcoin-crypto-wal/idnnbdplmphpflfnlkomgpfbpcgelopg)<mark style="background-color:$warning;">)</mark>

:warning: <mark style="background-color:$warning;">**To use your Ledger device with Acre**</mark><mark style="background-color:$warning;">, you must use it through the Xverse extension.</mark>&#x20;

#### **Here's how to get started:**

**Step 1:** Visit <https://v2.acre.fi/dashboard> in your browser to get started.

<figure><img src="/files/74IpIvKR5YECh6bXqrwA" alt=""><figcaption></figcaption></figure>

**Step 2:** Click through the information screens and learn about Acre.

<figure><img src="/files/SoM1nNTIYykz4HiJ7UUC" alt=""><figcaption></figcaption></figure>

**Step 3:** Click the “Connect wallet” button in the top right corner.

<figure><img src="/files/SX2hFh28Wtkk7ilBVNau" alt=""><figcaption></figcaption></figure>

**Step 4:** Select your preferred bitcoin wallet from the pop up menu.&#x20;

The following sections provide specific details on connecting each wallet.

<figure><img src="/files/BKPh8VUjPt8d0ft1xIXR" alt=""><figcaption></figcaption></figure>


# Sign in with Ledger (via Xverse)

**Here's how to get started:**

⚠️ **To use your Ledger device with Acre**, you must connect through the Xverse extension.

* **XVerse** ([download here](https://chromewebstore.google.com/detail/xverse-bitcoin-crypto-wal/idnnbdplmphpflfnlkomgpfbpcgelopg))
* Once you have installed the Xverse extension proceed to the steps below

**Step 1:** Visit [https://bitcoin.acre.fi/dashboard](https://v2.acre.fi/dashboard) in your browser to get started.

<figure><img src="/files/zHjuXNj1lmCry2FCnObx" alt=""><figcaption></figcaption></figure>

**Step 2:** Click through the information screens and learn about Acre.

<figure><img src="/files/6CezyezVkksOrHJKS8aW" alt=""><figcaption></figcaption></figure>

**Step 3:** Click the “Connect wallet” button in the top right corner.

<figure><img src="/files/y0hN8SLXKu5rDTRDaVWs" alt=""><figcaption></figcaption></figure>

**Step 4:** Select Xverse wallet from the pop up menu.

<figure><img src="/files/4k1UqkRAJaFV4hbE2k7N" alt=""><figcaption></figcaption></figure>

**Step 5:** This automatically triggers a connection request inside the Xverse wallet extension. Click “Accept” to complete this action.

<figure><img src="/files/vxC0tHn49vr5fuh3lPGU" alt=""><figcaption></figcaption></figure>

**Step 6:** The Xverse wallet extension requires 2 actions to connect to the Acre Dapp. The second action will automatically load, triggering a signature request.

<figure><img src="/files/sKl6yQVUpWZCVfv18Gza" alt=""><figcaption></figcaption></figure>

**Step 7:** Once the signature request is loaded into the Xverse browser extension, verify your wallet address and sign the on screen request, inside of the Xverse browser extension window.

<figure><img src="/files/HvRs3Kl1ovCZTrDQePFQ" alt=""><figcaption></figcaption></figure>

**Step 8:** You will then be asked to connect your Ledger device to the Xverse browser extension. Ensure your Ledger device is unlocked, and the Bitcoin application is open. Click “Connect”.

<figure><img src="/files/2Ki6Fp1V29VzKbJIQ8Jz" alt=""><figcaption></figcaption></figure>

**Step 9:** Next you will confirm the signature on your Ledger device. Follow the steps on the screen of your Ledger device and confirm the transaction directly on the Ledger device.

<figure><img src="/files/NSmEOx8mnPWOqXYxFyQ8" alt=""><figcaption></figcaption></figure>

**Step 10:** Once you have confirmed the transaction and completed the signature request, the Acre Dapp dashboard will automatically load.

<figure><img src="/files/0BKTjhcNJbGa3yISYyAJ" alt=""><figcaption></figcaption></figure>

**Step 11:** You are now logged into your account!

<figure><img src="/files/brO38GuksFa4rbdSTNxA" alt=""><figcaption></figcaption></figure>


# Sign in with Xverse

**Here's how to get started:**

**Step 1:** Visit [https://bitcoin.acre.fi/dashboard](https://v2.acre.fi/dashboard) in your browser to get started.

<figure><img src="/files/0yTrAvyuY0vxkfC6G2Uv" alt=""><figcaption></figcaption></figure>

**Step 2:** Click through the information screens and learn about Acre.

<figure><img src="/files/rbsEbFhNhGAZe2t1XNQ7" alt=""><figcaption></figcaption></figure>

**Step 3:** Click the “Connect wallet” button in the top right corner.

<figure><img src="/files/HUMvOJRgQPHoCPAP4N7V" alt=""><figcaption></figcaption></figure>

**Step 4:** Select Xverse wallet from the pop up menu.

<figure><img src="/files/82Dv8H1fotrB8EPAgRL6" alt=""><figcaption></figcaption></figure>

**Step 5:** Xverse wallet requires (2) actions to connect to the Acre Dapp.

<figure><img src="/files/a8RPvujt2HK9pfTWV4Uf" alt=""><figcaption></figcaption></figure>

**Step 6:** The first action will load automatically and connects the Xverse Browser extension to the Acre Dapp. Click “Accept”.

<figure><img src="/files/FyRiUnyCgMjr2NmLroh3" alt=""><figcaption></figcaption></figure>

**Step 7:** The second action creates a signature in your browser’s wallet extension and completes the sign-in process. Sign the message in your wallet extension.

<figure><img src="/files/UiFbaq8Zb7meyVphiZMV" alt=""><figcaption></figcaption></figure>

**Step 8:** Your Xverse wallet is now connected!

<figure><img src="/files/zR3sxs1FO4lwngQMIt0C" alt=""><figcaption></figcaption></figure>

**Step 9:** The Acre Dapp dashboard will automatically load. You are now logged into your account!

<figure><img src="/files/9U3wO0lZSYkaZcLcerIA" alt=""><figcaption></figcaption></figure>


# Sign in with Unisat

**Here's how to get started:**

**Step 1:** Visit [https://bitcoin.acre.fi/dashboard](https://v2.acre.fi/dashboard) in your browser to get started.

<figure><img src="/files/UuqB9I3fUVX0KT2YYvK7" alt=""><figcaption></figcaption></figure>

**Step 2:** Click through the information screens and learn about Acre.

<figure><img src="/files/oPWVLG6szItuaoEMlOAE" alt=""><figcaption></figcaption></figure>

**Step 3:** Click the “Connect wallet” button in the top right corner.

<figure><img src="/files/mKwZ6N3eZcv1ZRrGmUtF" alt=""><figcaption></figcaption></figure>

**Step 4:** Select Unisat wallet from the pop up menu.

<figure><img src="/files/yjiwjr7pf33XJCiN9AIL" alt=""><figcaption></figcaption></figure>

**Step 5:** Unisat wallet requires (2) actions to connect to the Acre Dapp. The first action is triggered automatically and connects the Unisat browser extension to the Acre Dapp.

<figure><img src="/files/DYjEYuJclKjTpr77Jx6R" alt=""><figcaption></figcaption></figure>

**Step 6:** The second action creates a signature request in your browser’s wallet extension.

<figure><img src="/files/mXyTCmLnH6AL3Io47QwG" alt=""><figcaption></figcaption></figure>

**Step 7:** Sign this message to complete the connection process.

<figure><img src="/files/jaGZsJTj04AzahpaBOtf" alt=""><figcaption></figcaption></figure>

**Step 8:** Your Unisat wallet is now connected!

<figure><img src="/files/wZxi0sW11vr3C9PKqVap" alt=""><figcaption></figcaption></figure>

**Step 9:** The Acre Dapp dashboard will automatically load. You are now logged into your account!

<figure><img src="/files/I3DrdBC4Rl6prEgM3wxw" alt=""><figcaption></figcaption></figure>


# Sign in with OKX

**Here's how to get started:**

**Step 1:** Visit [https://bitcoin.acre.fi/dashboard](https://v2.acre.fi/dashboard) in your browser to get started.

<figure><img src="/files/UYw2RsoL6C50IslNFcSi" alt=""><figcaption></figcaption></figure>

**Step 2:** Click through the information screens and learn about Acre.

<figure><img src="/files/aYmVgyWQYubLU7FMQC4b" alt=""><figcaption></figcaption></figure>

**Step 3:** Click the “Connect wallet” button in the top right corner.

<figure><img src="/files/FMDJeOLYeLhJrfH2iAwA" alt=""><figcaption></figcaption></figure>

**Step 4:** Select OKX wallet from the pop up menu.

<figure><img src="/files/zWbZl3v76ydoZ1M7rzO8" alt=""><figcaption></figcaption></figure>

**Step 5: OKX** wallet requires (2) actions to connect to the Acre Dapp. The first action is triggered automatically and connects the OKX browser extension to the Acre Dapp.

<figure><img src="/files/wCTiSuT3Ef0ZTgx1a95H" alt=""><figcaption></figcaption></figure>

**Step 6:** The second action creates a signature request in your browser’s wallet extension.

<figure><img src="/files/tCnzbuzNGW887fdxe9Rw" alt=""><figcaption></figcaption></figure>

**Step 7:** Sign this message to complete the connection process.

<figure><img src="/files/jXpVWhlTl5I2VcrMdKRM" alt=""><figcaption></figcaption></figure>

**Step 8:** Your OKX wallet is now connected!

<figure><img src="/files/8VRE8IlFDeehZ83to5o8" alt=""><figcaption></figcaption></figure>

**Step 9:** The Acre Dapp dashboard will automatically load. You are now logged into your account!

<figure><img src="/files/C1TaMIq4Bebn8KMO0eUi" alt=""><figcaption></figcaption></figure>


# How to Deposit

A simple guide to get you started with Acre.

**Step 1:** Visit [https://bitcoin.acre.fi/dashboard](https://v2.acre.fi/dashboard) and sign in with your Bitcoin wallet.

<figure><img src="/files/mlszLfZGl5iHYNix4c29" alt=""><figcaption></figcaption></figure>

**Step 2:** Press the orange “Deposit” button.

<figure><img src="/files/8xh8hKAfwxUfdNkUc0d7" alt=""><figcaption></figcaption></figure>

**Step 3:** Enter the amount of BTC you would like to deposit in the box labelled “Amount.”

<figure><img src="/files/VFrQ6Kw1UvIERzK5zxvn" alt=""><figcaption></figcaption></figure>

**Step 4:** Press the deposit button to trigger your wallet for signing.

<figure><img src="/files/BSxLPBZoQsa29Gn0OAVq" alt=""><figcaption></figcaption></figure>

**Step 5:** Confirm the transaction in your Bitcoin wallet.

<figure><img src="/files/DEdz9amETBPdbdauxx88" alt=""><figcaption></figcaption></figure>

**Step 6:** You deposit is on it’s way!&#x20;

This process depends on Bitcoin mainnet finality so it may take about an hour, depending on network congestion.

<figure><img src="/files/uX0PFmvLaVwCVgDrvUm9" alt=""><figcaption></figcaption></figure>

**Step 7:** Sit back and relax while your deposit transaction completes in the background.&#x20;

You can see your pending transaction on the dashboard, and click the arrow to view the transaction data.&#x20;

Points will begin to accrue while you wait.

**Step 8:** Your deposit is complete!&#x20;

Rewards and points will automatically accrue to your account.

<figure><img src="/files/3VEV6aWx18PkdN07j5BM" alt=""><figcaption></figcaption></figure>

**Remember: Acre** Points can be claimed every 24 hours, so make sure to check back to monitor your progress!


# Deposit with Ledger (via Xverse)

⚠️ **To use your Ledger device with Acre**, you must use it through the Xverse extension.

* **Xverse** ([download here](https://chromewebstore.google.com/detail/xverse-bitcoin-crypto-wal/idnnbdplmphpflfnlkomgpfbpcgelopg))

#### **Here's how to get started:**

**Step 1:** Visit [https://bitcoin.acre.fi/dashboard](https://v2.acre.fi/dashboard) and sign in with your Bitcoin wallet.

After your wallet is connected to the Dashboard, click the orange Deposit Button in the upper left hand corner of the dash, to begin the deposit.

<figure><img src="/files/qX83M5MFsS1JMlPOFBB9" alt=""><figcaption></figcaption></figure>

**Step 2:** The Deposit button will open a deposit interface window.

<figure><img src="/files/HA19vv9BbzSpIVbqHwU0" alt=""><figcaption></figcaption></figure>

**Step 3:** Enter the amount of BTC you would like to deposit in the box labelled “Amount.” Note: there is a minimum deposit amount of 0.015 Bitcoin.

<figure><img src="/files/wowj3tPrulOZlUCjcIZl" alt=""><figcaption></figcaption></figure>

**Step 4:** Press the deposit button to initiate the transaction.

<figure><img src="/files/PXvWRmCRZoSa8oVGkLSe" alt=""><figcaption></figcaption></figure>

**Step 5:** Clicking the deposit button will open a dialog box and wallet signature request.

<figure><img src="/files/Z0LPUDxtv8tjfOybCkXj" alt=""><figcaption></figcaption></figure>

**Step 6:** You will be asked to complete the first of (2) actions inside the Xverse wallet extension dialog box. Review the transaction and click “Confirm”.

<figure><img src="/files/iO4N2P7V6z2GFHwL7qGn" alt=""><figcaption></figcaption></figure>

**Step 7:** You will now be asked to complete the second of (2) actions.&#x20;

⚠️ Note: Ensure your Ledger device is unlocked, and the Bitcoin app is open.

Click “Connect” to initiate the signature. The dialog box will close automatically.

<figure><img src="/files/lhHocxZkuzGftbfY6owm" alt=""><figcaption></figcaption></figure>

**Step 8:** You will be asked to confirm the transaction on your Ledger device. Follow the instruction on your ledger device screen, and authorize the signature request.

<figure><img src="/files/8SZ5cPW8plNpIcH57pW2" alt=""><figcaption></figcaption></figure>

**Step 9:** Once you sign the request on your Ledger device, the transaction will be broadcast. You may view the transaction on Explorer, and copy the transaction ID.&#x20;

Please close this window when you have finished.

<figure><img src="/files/aiRRVFBSSUnqHgYKche1" alt=""><figcaption></figcaption></figure>

**Step 10:** The Acre Dapp will communicate with your wallet and confirm the transaction, this can take up to a minute.

<figure><img src="/files/hbCMRODiOuPFkAi82Nhb" alt=""><figcaption></figcaption></figure>

**Step 11:** Your deposit has been received! The Dapp will continue to process your deposit transaction in the background. This can take up to 2 hours. You may close this window.

<figure><img src="/files/DZAnlP0FLhKRUudWMRpF" alt=""><figcaption></figcaption></figure>

**Step 12:** Your deposit will be recorded in the transactions log, this can take up to 2 hours. You may exit the Dapp and return while this process completes.

<figure><img src="/files/ssBD7INhji6BNG08KRiM" alt=""><figcaption></figcaption></figure>

**Step 13:** Your deposit is complete! The deposited amount, minus the deposit fee, will be reflected in the Account Summery tab.

<figure><img src="/files/VaV3OgcrTiNLkQSlL5wj" alt=""><figcaption></figcaption></figure>


# Deposit with OXK

#### **Here's how to get started:**

**Step 1:** Visit [https://bitcoin.acre.fi/dashboard](https://v2.acre.fi/dashboard) and sign in with your Bitcoin wallet.

After your wallet is connected to the Dashboard, click the orange Deposit Button in the upper left hand corner of the dash, to begin the deposit.

<figure><img src="/files/6qldRBpQh7GzRFPc4i2V" alt=""><figcaption></figcaption></figure>

**Step 2:** The Deposit button will open a deposit interface window.

<figure><img src="/files/BGgNsa07ifb0RfXfItLr" alt=""><figcaption></figcaption></figure>

**Step 3:** Enter the amount of BTC you would like to deposit in the box labelled “Amount.” Note: there is a minimum deposit amount of 0.015 Bitcoin.

<figure><img src="/files/S5B9ki1pTj5rxmoDEoV0" alt=""><figcaption></figcaption></figure>

**Step 4:** Press the deposit button to initiate the transaction.

<figure><img src="/files/jqWR07W9FWDxgKpvCPxJ" alt=""><figcaption></figcaption></figure>

**Step 5:** You will be asked to confirm the transaction in your OKX browser extension. Verify your wallet address in the dialog box, then click “Confirm”.

<figure><img src="/files/fSKuEi0reNS3eJ7Z1TxV" alt=""><figcaption></figcaption></figure>

**Step 6:** You deposit is on it’s way!

The Acre Dapp will communicate the transaction with your OKX wallet. This can take up to a minute, and will close automatically.

<figure><img src="/files/LbSbE2m5qvPlvEGztdvM" alt=""><figcaption></figcaption></figure>

**Step 7:** Your deposit has been received! The Dapp will continue to process your deposit transaction in the background. This can take up to 2 hours. You may close this window.

<figure><img src="/files/w6k4NrwmN2xbWXi7Gxdo" alt=""><figcaption></figcaption></figure>

**Step 8:** Your deposit will be recorded in the transactions log, this can take up to 2 hours. You may exit the Dapp and return while this process completes.

<figure><img src="/files/vzjlEniMu9cViz7FyDmy" alt=""><figcaption></figcaption></figure>

**Step 9:** Your deposit is complete! The deposited amount, minus the deposit fee, will be reflected in the Account Summery tab.

<figure><img src="/files/eC4jIYnnmq51kwyDEfcn" alt=""><figcaption></figcaption></figure>


# Deposit with Unisat

#### **Here's how to get started:**

**Step 1:** Visit [https://bitcoin.acre.fi/dashboard](https://v2.acre.fi/dashboard) and sign in with your Bitcoin wallet.

After your wallet is connected to the Dashboard, click the orange Deposit Button in the upper left hand corner of the dash, to begin the deposit.

<figure><img src="/files/AcdGdX5frMbARiorj3sv" alt=""><figcaption></figcaption></figure>

**Step 2:** The Deposit button will open a deposit interface window.

<figure><img src="/files/gqvQuQRJXQlBx0oos94t" alt=""><figcaption></figcaption></figure>

**Step 3:** Enter the amount of BTC you would like to deposit in the box labelled “Amount.” Note: there is a minimum deposit amount of 0.015 Bitcoin.

<figure><img src="/files/yVE7AgdQMIg4iP0aQXdS" alt=""><figcaption></figcaption></figure>

**Step 4:** Press the deposit button to initiate the transaction.

<figure><img src="/files/hi5hBaLrwkZCiGRPPpbI" alt=""><figcaption></figcaption></figure>

**Step 5:** You will be asked to confirm the transaction in your Unisat browser extension.

Click “Sign & Pay”.

<figure><img src="/files/AhWFlc6TStXRFO2X7psl" alt=""><figcaption></figcaption></figure>

**Step 6:** You deposit is on it’s way!

The Acre Dapp will communicate the transaction with your OKX wallet. This can take up to a minute, the dialog box will close automatically.

<figure><img src="/files/TRYFnxhKddqY1xTgChi0" alt=""><figcaption></figcaption></figure>

**Step 7:** Your deposit has been received! The Dapp will continue to process your deposit transaction in the background. This can take up to 2 hours. You may close this window.

<figure><img src="/files/ImTV7loHmkgYuSO12gOV" alt=""><figcaption></figcaption></figure>

**Step 8:** Your deposit will be recorded in the transactions log, this can take up to 2 hours. You may exit the Dapp and return while this process completes.

<figure><img src="/files/wbNWkeSERoBr2Ryms9u4" alt=""><figcaption></figcaption></figure>

**Step 9:** Your deposit is complete! The deposited amount, minus the deposit fee, will be reflected in the Account Summery tab.

<figure><img src="/files/CCldA1Ylz4YBHxYLa5X2" alt=""><figcaption></figcaption></figure>


# Deposit with Xverse

#### **Here's how to get started:**

**Step 1:** Visit [https://bitcoin.acre.fi/dashboard](https://v2.acre.fi/dashboard) and sign in with your Bitcoin wallet.

After your wallet is connected to the Dashboard, click the orange Deposit Button in the upper left hand corner of the dash, to begin the deposit.

<figure><img src="/files/OtI2DxB70o7Ui3GxrfQu" alt=""><figcaption></figcaption></figure>

**Step 2:** The Deposit button will open a deposit interface window.

<figure><img src="/files/JuP5aiPiHvuHAjR2RCkF" alt=""><figcaption></figcaption></figure>

**Step 3:** Enter the amount of BTC you would like to deposit in the box labelled “Amount.”&#x20;

Note: there is a minimum deposit amount of 0.015 Bitcoin.

<figure><img src="/files/yLqj734kGrYkiMS5hoTW" alt=""><figcaption></figcaption></figure>

**Step 4:** Press the deposit button to initiate the transaction.

<figure><img src="/files/VuMlLcAZpAwu3a1dJ8E7" alt=""><figcaption></figcaption></figure>

**Step 5:** The Acre Dapp will automatically connect to your Xverse wallet extension and request a signature.

<figure><img src="/files/eEMyGodSuIqYCdS67IDs" alt=""><figcaption></figcaption></figure>

**Step 6:** Your wallet will open a dialog box. You will be asked to confirm the transaction in your Xverse browser extension. Verify your wallet address in the dialog box, then click “Confirm”.

<figure><img src="/files/yhfbh9disIM2KiXdIPbY" alt=""><figcaption></figcaption></figure>

**Step 7:** Once you sign the request in your Xverse extension window, the transaction will be broadcast. You may view the transaction on Explorer, and copy the transaction ID.

Please close this window when you have finished.

<figure><img src="/files/WhPZONIOoegrEpSLV8QP" alt=""><figcaption></figcaption></figure>

**Step 8:** You deposit is on it’s way!

The Acre Dapp will communicate the transaction with your Xverse wallet. This can take up to a minute, and will close automatically.

<figure><img src="/files/TNQ5XuODSwIBvcKS6he4" alt=""><figcaption></figcaption></figure>

**Step 9:** Your deposit has been received! The Dapp will continue to process your deposit transaction in the background. This can take up to 2 hours. You may close this window.

<figure><img src="/files/60nnqvAq7kCiUN3XmJzJ" alt=""><figcaption></figcaption></figure>

**Step 10:** Your deposit will be recorded in the transactions log, this can take up to 2 hours. You may close this window and exit the Dapp and return while this process completes.

<figure><img src="/files/059IJueYIv9EzBesS8Xg" alt=""><figcaption></figcaption></figure>

**Step 9:** Your deposit is complete! The deposited amount, minus the deposit fee, will be reflected in the Account Summery tab.

<figure><img src="/files/j3yvk0dvI3Jk8gynuf4A" alt=""><figcaption></figcaption></figure>


# How to Withdraw

A simple guide to get you started with Acre.

**Step 1:** Visit [https://bitcoin.acre.fi/dashboard](https://v2.acre.fi/dashboard) and sign in with your Bitcoin wallet.

<figure><img src="/files/4mdO4BSQDMB7sJCfMBeh" alt=""><figcaption></figcaption></figure>

**Step 2:** Press the “Withdraw” button on the Acre dashboard.

<figure><img src="/files/FIO1HOqyw7yyFgNT3oXm" alt=""><figcaption></figcaption></figure>

**Step 3:** Enter the amount of BTC you would like to withdraw in the box labelled “Amount”. Alternatively, you can press “Max” to withdraw your entire balance.

<figure><img src="/files/G2tLfkvXZeaNE4kC3b9o" alt=""><figcaption></figcaption></figure>

**Step 4:** Press the “Withdraw” button to trigger your wallet for signing.

<figure><img src="/files/kFV10Rxjfpo7NgJ0jn5x" alt=""><figcaption></figcaption></figure>

**Step 5:** Wait while your transaction is built. This can take a few minutes.

<figure><img src="/files/CwPZFVz0TgRFpezgIVa2" alt=""><figcaption></figcaption></figure>

**Step 6:** Sign the transaction in your Bitcoin wallet.

<figure><img src="/files/BVORZhJ20aQzbvYmqou3" alt=""><figcaption></figcaption></figure>

**Step 6:** You withdrawal is on it’s way! This process depends on Bitcoin mainnet finality, as well as a tBTC unmint process, so it may take about a 6 hours.

<figure><img src="/files/igg8I2GkPmD0yVrfGrIy" alt=""><figcaption></figcaption></figure>

**Step 7:** Sit back and relax while your withdrawal transaction completes in the background. You can see your pending transaction on the dashboard, and click the arrow to view the transaction data.

<figure><img src="/files/IbQ6gluMZHpcrDB5dLeZ" alt=""><figcaption></figcaption></figure>

**Step 8:** Your withdrawal is complete!

<figure><img src="/files/U5Y6R0a0anhZc4c8wTQT" alt=""><figcaption></figcaption></figure>


# tBTC Withdrawal Guide

Withdrawing tBTC Directly from the acreBTC Contract

*Withdrawing tBTC directly from the acreBTC contract.*

Only users who deposited tBTC may withdraw tBTC directly from the acreBTC vault through Etherscan using any supported EVM wallet. {% endhint %}

### Overview

The withdrawal process is the reverse of the deposit process. The Acre dapp does not currently support direct EVM wallet interactions for acreBTC withdrawals — but if you deposited directly through Etherscan, you can also withdraw directly through Etherscan by redeeming your acreBTC shares for tBTC with the `requestRedeem` function.

**acreBTC contract address:**

```
0x19531C886339dd28b9923d903F6B235C45396ded
```

### Etherscan step-by-step

#### 1. Visit the acreBTC contract

1. Visit the [acreBTC Etherscan page](https://etherscan.io/address/0x19531C886339dd28b9923d903F6B235C45396ded#writeProxyContract).
2. Navigate to **Contract → Write as Proxy**.
3. Open **11. requestRedeem**.
4. Click **Connect to Web3** and connect the wallet that holds the acreBTC tokens.

#### 2. Complete the requestRedeem function (Section 11)

`requestRedeem` requests a redemption through the withdrawal queue. Complete the three fields:

| Parameter  | Type      | What to enter                                                                                                                                                           |
| ---------- | --------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `shares`   | `uint256` | Amount of **acreBTC shares** to redeem, entered in **18 decimals**. Tip: use the **Scale** helper to type a human-readable amount and let Etherscan apply the decimals. |
| `receiver` | `address` | The wallet address that will receive the withdrawn **tBTC**. Most users click **Self** or use their connected wallet address.                                           |
| `owner`    | `address` | The address currently holding the **acreBTC position** (the owner of the shares). Most users click **Self** or use their connected wallet address.                      |

**Decimal examples for `shares`:**

```
1 acreBTC   = 1000000000000000000
0.5 acreBTC =  500000000000000000
```

**Note:** You withdraw by redeeming **acreBTC shares** — not by entering a tBTC amount. The vault converts your shares into the corresponding amount of tBTC and routes the redemption through the withdrawal queue.&#x20;

#### 3. Submit the transaction

1. Click **Write** (optionally click **Simulate** first to preview the result).
2. Approve the wallet transaction.
3. Wait for Ethereum confirmation.

Your acreBTC shares will be redeemed and tBTC will be returned to the specified **receiver** address through the withdrawal queue.&#x20;

#### 4. Verify the withdrawal

1. View the transaction on Etherscan.
2. Confirm the tBTC balance appears in your wallet (you may need to manually add the tBTC token).
3. Confirm your acreBTC balance has decreased.

### Troubleshooting

**Insufficient acreBTC balance** — You are attempting to withdraw more than you own. Reduce the `shares` value to an amount within your acreBTC balance.

**Wrong owner address** — The `owner` must match the wallet that holds the acreBTC position. Use **Self** or your connected wallet address.

**Gas fee errors** — Ensure sufficient **ETH** is available in your wallet to cover gas.&#x20;


# Ledger Clear Signing

## What is Clear Signing?

Clear signing is a new security feature that provides a transparent and detailed view of every transaction directly on a Ledger device before it is approved. Unlike "blind signing," where users must authorize transactions without understanding the details, clear signing ensures that every operation—whether it's staking, swapping, or interacting with smart contracts—is fully visible and understandable. This eliminates ambiguity, mitigates risks of fraud.

***

## An Industry First

Acre is the first clear sign-enabled Bitcoin dApp on Ledger Live and sets a new standard for secure blockchain interactions. Our integration with Ledger ensures users confidently engage with decentralized finance without compromising security.By prioritizing clear signing, Acre removes blind signing risks and demonstrates an unwavering commitment to user risk management.

***

## Why Clear Signing Matters

* **Puts Security First:** See every transaction detail before approving it.
* **Eliminates Blind Signing:** Avoids the risks of unclear or vague transaction requests.
* **Offers Full Transparency:** Remain in control of assets at every step.


# Acre Points

Overview of Community and Depositor Points

Bitcoin holders aren't all the same, and neither are their ways of participating in the ecosystem. Some prefer to focus quietly on compounding their Bitcoin, maintaining sovereignty while letting their assets work for them. Others thrive on active engagement, learning, and contributing to the community's knowledge base. Both paths are valuable, and both deserve recognition.

Whether you're depositing within the Acre dashboard or interacting with the Acre community, there's ways in which to earn points from Acre ecosystem and with our ecosystem partners.&#x20;

**How to Get Started Today**

1. Deposit your BTC in Acre, start earning [Acre Points](https://app.gitbook.com/o/bu6adn99cLMEzOGcedjG/s/wazS1tmdLmu2nyuiWFr8/~/changes/60/acre-points-program/points-for-bitcoin-depositors/acre-points) and mats with your bitcoin! Visit [https://bitcoin.acre.fi/dashboard](https://v2.acre.fi/dashboard) to participate.&#x20;

Acre ecosystem points programs are designed purely for interaction within the Acre ecosystem—**they hold no monetary value and cannot be exchanged for Acre tokens or other currencies.**&#x20;


# Acre Points

### What are Acre points?

The Acre Points Program is an off-chain incentive mechanism that rewards users for depositing Bitcoin into Acre. Depositors earn Acre Points based on both the amount and the duration of their deposits. \
\
For every Bitcoin deposited, depositors earn 10,000 points each day. The more bitcoin deposited and the longer it remains on the platform, the more Acre points are accumulated. Acre points are viewable via the dashboard where you monitor your position.

Points acknowledge and represent a depositor's early commitment to Acre.&#x20;

The program encourages long-term engagement, and is one of many methods in which depositors are rewarded for their early participation.&#x20;

### How to participate

1. **Deposit BTC:** Simply deposit your BTC into Acre at <https://v2.acre.fi/dashboard>.
2. **Track Your Points:** Once deposited, your BTC will start earning points automatically which you can claim and monitor via the Acre dashboard.

### How It Works

* **Regular Snapshots:** Points are calculated at regular intervals by taking a snapshot of your BTC balance. Points are added based on the amount of BTC and the duration it has been deposited.
* **Daily Points Rate:** Points accrue at a daily rate of 10,000 points/bitcoin.
* **Bonus Points:** Acre depositors will also earn points from participating programs that are integrated with Acre. Look for updates on future programs on the Acre.fi website and in the Acre Discord.

### Points FAQ

#### Do I have to lock my bitcoin?

No, there are no lock-ups or minimum deposit periods to join the points program for Acre or with any of our partners.

#### If I withdraw my bitcoin do I lose my points?

No, you retain all points you earn, regardless of your deposit status.

#### What can I do with my points?

Points serve as a measure of your participation and commitment to the Acre protocol. They don’t have a utility or monetary value, they are simply a measure of contribution.

#### Are there referrals?

The Acre Points Program does not include a public referral system at this time. Some key partners have received referral URLs to help to promote and expand the Acre community.


# Vault Partner 1 Mezo: mats (July 2024-July 2025)

Acre and Mezo have partnered for the mainnet launch of vault 1 on Acre to give access to mats for depositors.

### Mezo <> Acre mats - What are mats?

mats earned via Acre are collectible points earned by the Mezo Testnet Vault on the Acre Protocol.  \
\
mats, or "magic satoshis," are Mezo's way of recognizing and rewarding participation through a point system. These points earned via Acre are designed purely for the integration of deposits from Acre in the [Mezo ecosystem](https://info.mezo.org/user-guides/mats)—**they hold no monetary value and cannot be exchanged for Mezo tokens or other currencies.**

With Acre <> Mezo there is <kbd>**no lockup required**</kbd> and a minimum of **1,000 mats per bitcoin per day** are earned by depositing into the Acre dashboard with our first vault partner. \
\ <br>


# Community Engagement Points

The Acre Community utilizes DripBot to provide an enhanced user engagement experience.

This points system was built to track and reward community engagement across a number of channels including

* Discord: General Chat, Shill Squad, and Doc Crews all participated&#x20;
* Social Platforms: X, Telegram, Tik Tok, and LinkedIn to name a few!&#x20;
* Web 3 community outreach and ambassador involvement&#x20;

The purpose of FryFi and HiveFi Discord Points system is to reward our most engaged community members for spending their time, energy and attention with the Acre community and our partners.&#x20;

It's critical for us to have a vibrant community that understands the protocol, shares knowledge and has a lot of fun because Acre is committed to accessibility.&#x20;

Engagement points allows us to recognize the contributions whether big or small.

<br>


# FryFi: tots

The Acre FryFi tots system recognizes those who help build our collective knowledge and strengthen our community through active participation.&#x20;

Whether you're sharing insights, helping others learn, or contributing to community initiatives, tots rewards those who make our ecosystem richer.

Join the Acre Discord start earning tots by:

* Daily lootboxes
* Learn and earn with Acre on Workshop Wednesdays and beyond
* Attending Community Calls and Events
* And more...

**tots hold no monetary value and cannot be exchanged for Acre tokens or other currencies.**&#x20;


# HiveFi: bees

HiveFi allowed the Acre Team to  “Pollinate” our server with bees. Acre welcomed over 26,000 new members during this period and when initially launched on 9/25/2024 with fewer than 7,000 members.&#x20;

Community-focused launch HiveFi had limited access through the Acre Discord and it quickly grew in popularity with new bee holders and members joining each week.&#x20;

Partner communities including Mezo, Ammalgam, Avalon, Babylonians, Across, Humble Tractors, Huh, to name a few all joined in creating unique roles and community activities earning bees.&#x20;

The final week of HiveFi Closed on February 10th 2025 with 6,082 participating bee holders! \
\
All bee holders from the HiveFi program maintain their earned bees and have been given a role in the community commemorating their participation and identifying them as an early participant for new and existing members of the Acre Community.&#x20;

**bees hold no monetary value and cannot be exchanged for Acre tokens or other currencies.**&#x20;


# Technical Architecture

This diagram below visualizes Acre's core architecture:

* Users deposit BTC through the Acre dApp, which auto-bridges native BTC to tBTC (ETH L1) and interfaces with the **tBTC Depositor** (manages deposits) and **tBTC Redeemer** (manages withdrawals) contracts at the **tBTC Bridge Integration Layer**
* Deposited tBTC is converted to the **acreBTC** deposit token and flows through the **Acre Dispatcher**, which dispatches tBTC to **Acre Vaults** approved by the **Acre Security Council**.&#x20;
* tBTC rewards generated by the vaults are then routed back to the acreBTC vault and reinvested.

(To view a diagram of the first Acre vault (**Vault "A" below**), check out [macreBTC1 Architecture](https://docs.acre.fi/~/revisions/nx8vZBscxS1DgbAO0Urh/technical-architecture/macrebtc1-architecture).)

<figure><img src="/files/vQayjygxyAoeJAMQw2Rr" alt=""><figcaption></figcaption></figure>


# macreBTC1 Architecture

This diagram details tBTC flows for macreBTC1, the first vault approved by the Acre Security Council:

* The **Acre Dispatcher** routes tBTC to the **Midas Minter Vault** via a **ERC4626 adapter** and returns **macreBTC1** deposit tokens back to the acreBTC vault.
* The tBTC is received by the **Proceeds Reicipient wallet** (processes deposits) and then moved to the **SMA** for allocation.
* From the SMA, tBTC is then deployed locally or routed to mRe7BTC or (after Aaave/Morpho borrow) into mRe7YIELD.

<figure><img src="/files/Ow2fMK9AnFvfNkhziWea" alt=""><figcaption></figcaption></figure>


# Contracts

## Acre V2 Contracts

<table><thead><tr><th width="205">Contract</th><th>Address</th></tr></thead><tbody><tr><td>acreBTC</td><td><a href="https://etherscan.io/address/0x19531C886339dd28b9923d903F6B235C45396ded">0x19531C886339dd28b9923d903F6B235C45396ded</a></td></tr><tr><td>BitcoinDepositorV2</td><td><a href="https://etherscan.io/address/0xe5F48D3d31baf15dfF89fb394F10A5362711c777">0xe5F48D3d31baf15dfF89fb394F10A5362711c777</a></td></tr><tr><td>BitcoinRedeemerV2</td><td><a href="https://etherscan.io/address/0x42A5f91586DDf041A6084494B0b375CdA34d55e9">0x42A5f91586DDf041A6084494B0b375CdA34d55e9</a></td></tr><tr><td>MidasAllocator</td><td><a href="https://etherscan.io/address/0xD72b0C95398058345842499975171368d49659Bb">0xD72b0C95398058345842499975171368d49659Bb</a></td></tr><tr><td>WithdrawalQueue</td><td><a href="https://etherscan.io/address/0xe7b8c14cA8Fb4f226C0A3e45e636b84809BB5D06">0xe7b8c14cA8Fb4f226C0A3e45e636b84809BB5D06</a></td></tr></tbody></table>


# macreBTC1 Contracts

## macreBTC1 Contracts

**macreBTC1** is the first vault to which acreBC is dispatching its underlying tBTC, as [approved in July 2025 by the Acre Security Countil](https://forum.acre.fi/t/ascp-acre-security-council-proposal-ascp-01/37). Vault infrastructure is provided by [Midas](https://midas.app/), and the strategy manager is [Re7 Labs](https://www.re7labs.xyz/).

<table><thead><tr><th width="205">Contract</th><th>Address</th></tr></thead><tbody><tr><td><strong>Proceeds Recipient</strong> (Receives deposits)</td><td><a href="https://debank.com/profile/0xbA53a278D6d68c2C8F6d600eA93581a702A6006A">0xbA53a278D6d68c2C8F6d600eA93581a702A6006A</a></td></tr><tr><td><strong>Allocation Wallet</strong> (Deploys into strategies)</td><td><a href="https://debank.com/profile/0x7C819F438250CD9331D3E8EA540B72B3FF702f07">0x7C819F438250CD9331D3E8EA540B72B3FF702f07</a></td></tr><tr><td><strong>Request Redeemer</strong> (Liquidity for Withdrawals)</td><td><a href="https://debank.com/profile/0x910CA844Fb578f670Ca5190c1cF4ab851155Bf99">0x910CA844Fb578f670Ca5190c1cF4ab851155Bf99</a></td></tr></tbody></table>

The bulk of tBTC routed to macreBTC1 is routed to two downstream vaults: **mRe7BTC** and **mRe7YIELD**:

### mRe7BTC Contracts

<table><thead><tr><th width="207.57421875">Contract</th><th>Address</th></tr></thead><tbody><tr><td>mRe7BTC Minter Vault - Ethereum</td><td><a href="https://etherscan.io/address/0x5E154946561AEA4E750AAc6DeaD23D37e00E47f6">0x5E154946561AEA4E750AAc6DeaD23D37e00E47f6</a></td></tr><tr><td>mRe7BTC Redemption Vault - Ethereum</td><td><a href="https://etherscan.io/address/0x4Fd4DD7171D14e5bD93025ec35374d2b9b4321b0">0x4Fd4DD7171D14e5bD93025ec35374d2b9b4321b0</a></td></tr><tr><td>Proceeds Recipient</td><td><a href="https://etherscan.io/address/0xbD899C31b81Ef3BD78D02FBF43826fb092738b17">0xbD899C31b81Ef3BD78D02FBF43826fb092738b17</a></td></tr><tr><td>Allocation Wallet (SMA wallet)</td><td><a href="https://etherscan.io/address/0x8E75F95B3337678785aA2C78B20a15f87A1CBcCb">0x8E75F95B3337678785aA2C78B20a15f87A1CBcCb</a></td></tr><tr><td>Request Redeemer</td><td><a href="https://etherscan.io/address/0xDc318e9C581A80655100AFfE641d9782dF62d4Cf">0xDc318e9C581A80655100AFfE641d9782dF62d4Cf</a></td></tr></tbody></table>

View full details here: <https://midas.app/mre7btc>

### mRe7YIELD

<table><thead><tr><th width="210.93359375">Contract</th><th>Address</th></tr></thead><tbody><tr><td>mRe7YIELD Minter Vault - Ethereum</td><td><a href="/users/aWUfmj46ZaSvnKKsEjf2YYodeXr1">0xcE0A2953a5d46400Af601a9857235312d1924aC7</a></td></tr><tr><td>mRe7YIELD Redemption Vault - Ethereum</td><td><a href="/users/aWUfmj46ZaSvnKKsEjf2YYodeXr1">0x5356B8E06589DE894D86B24F4079c629E8565234</a></td></tr><tr><td>Proceeds Recipient</td><td><a href="https://etherscan.io/address/0x748C6D9E78FEF3858BCae488400509E952d44c9f">0x748C6D9E78FEF3858BCae488400509E952d44c9f</a></td></tr><tr><td>Allocation Wallet (SMA wallet)</td><td><a href="/users/aWUfmj46ZaSvnKKsEjf2YYodeXr1">0xfa8E54aD80D5A0C25d225c04e44fb993Ad88e487</a></td></tr><tr><td>Request Redeemer</td><td><a href="https://etherscan.io/address/0x4331397Cc899947a6CD94d0F766CBCE7e3705b56">0x4331397Cc899947a6CD94d0F766CBCE7e3705b56</a></td></tr></tbody></table>

View full details here: <https://midas.app/mre7yield>


# Testnet Contracts

<table><thead><tr><th width="204">Contract</th><th>Address</th></tr></thead><tbody><tr><td>stBTC</td><td><a href="https://sepolia.etherscan.io/address/0x7e184179b1F95A9ca398E6a16127f06b81Cb37a3">0x7e184179b1F95A9ca398E6a16127f06b81Cb37a3</a></td></tr><tr><td>BitcoinDepositor</td><td><a href="https://sepolia.etherscan.io/address/0x6c2c643c90383Cba125E4b8DD01344eA35A75F27">0x6c2c643c90383Cba125E4b8DD01344eA35A75F27</a></td></tr><tr><td>BitcoinRedeemer</td><td><a href="https://sepolia.etherscan.io/address/0xF4011FD0C77Bd4d909Ae05c7390b88455294dAeA">0xF4011FD0C77Bd4d909Ae05c7390b88455294dAeA</a></td></tr><tr><td>MezoAllocator</td><td><a href="https://sepolia.etherscan.io/address/0xd5EbDD6fF384a465D56562D3a489c8CCE1B92dd0">0xd5EbDD6fF384a465D56562D3a489c8CCE1B92dd0</a></td></tr></tbody></table>


# API


# stBTC

This contract implements the ERC-4626 tokenized vault standard. Bitcoin deposits are tracked with a receipt token called stBTC, commonly referred to as "shares". Users have the flexibility to redeem stBTC, enabling them to withdraw their deposited tBTC along with any accrued rewards.

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

## dispatcher

```solidity
contract IDispatcher dispatcher
```

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

## treasury

```solidity
address treasury
```

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

## minimumDepositAmount

```solidity
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

```solidity
uint256 entryFeeBasisPoints
```

Entry fee basis points applied to entry fee calculation.

## exitFeeBasisPoints

```solidity
uint256 exitFeeBasisPoints
```

Exit fee basis points applied to exit fee calculation.

## allowedDebt

```solidity
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

```solidity
mapping(address => uint256) currentDebt
```

Returns the current debt of the debtor.

## totalDebt

```solidity
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

```solidity
event TreasuryUpdated(address oldTreasury, address newTreasury)
```

Emitted when the treasury wallet address is updated.

### Parameters

| Name        | Type    | Description                         |
| ----------- | ------- | ----------------------------------- |
| oldTreasury | address | Address of the old treasury wallet. |
| newTreasury | address | Address of the new treasury wallet. |

## MinimumDepositAmountUpdated

```solidity
event MinimumDepositAmountUpdated(uint256 minimumDepositAmount)
```

Emitted when deposit parameters are updated.

### Parameters

| Name                 | Type    | Description                              |
| -------------------- | ------- | ---------------------------------------- |
| minimumDepositAmount | uint256 | New value of the minimum deposit amount. |

## DispatcherUpdated

```solidity
event DispatcherUpdated(address oldDispatcher, address newDispatcher)
```

Emitted when the dispatcher contract is updated.

### Parameters

| Name          | Type    | Description                             |
| ------------- | ------- | --------------------------------------- |
| oldDispatcher | address | Address of the old dispatcher contract. |
| newDispatcher | address | Address of the new dispatcher contract. |

## EntryFeeBasisPointsUpdated

```solidity
event EntryFeeBasisPointsUpdated(uint256 entryFeeBasisPoints)
```

Emitted when the entry fee basis points are updated.

### Parameters

| Name                | Type    | Description                        |
| ------------------- | ------- | ---------------------------------- |
| entryFeeBasisPoints | uint256 | New value of the fee basis points. |

## ExitFeeBasisPointsUpdated

```solidity
event ExitFeeBasisPointsUpdated(uint256 exitFeeBasisPoints)
```

Emitted when the exit fee basis points are updated.

### Parameters

| Name               | Type    | Description                        |
| ------------------ | ------- | ---------------------------------- |
| exitFeeBasisPoints | uint256 | New value of the fee basis points. |

## DebtAllowanceUpdated

```solidity
event DebtAllowanceUpdated(address debtor, uint256 newAllowance)
```

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

### Parameters

| Name         | Type    | Description                           |
| ------------ | ------- | ------------------------------------- |
| debtor       | address | Address of the debtor.                |
| newAllowance | uint256 | Maximum debt allowance of the debtor. |

## DebtMinted

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

Emitted when debt is minted.

### Parameters

| Name        | Type    | Description                                    |
| ----------- | ------- | ---------------------------------------------- |
| debtor      | address | Address of the debtor.                         |
| currentDebt | uint256 | Current debt of the debtor.                    |
| assets      | uint256 | Amount of assets for which debt will be taken. |
| shares      | uint256 | Amount of shares minted.                       |

## DebtRepaid

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

Emitted when debt is repaid.

### Parameters

| Name        | Type    | Description                         |
| ----------- | ------- | ----------------------------------- |
| debtor      | address | Address of the debtor.              |
| currentDebt | uint256 | Current debt of the debtor.         |
| assets      | uint256 | Amount of assets repaying the debt. |
| shares      | uint256 | Amount of shares burned.            |

## LessThanMinDeposit

```solidity
error LessThanMinDeposit(uint256 amount, uint256 min)
```

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

### Parameters

| Name   | Type    | Description                               |
| ------ | ------- | ----------------------------------------- |
| amount | uint256 | Amount to check.                          |
| min    | uint256 | Minimum amount to check 'amount' against. |

## DisallowedAddress

```solidity
error DisallowedAddress()
```

Reverts if the address is disallowed.

## ExceedsMaxFeeBasisPoints

```solidity
error ExceedsMaxFeeBasisPoints()
```

Reverts if the fee basis points exceed the maximum value.

## SameTreasury

```solidity
error SameTreasury()
```

Reverts if the treasury address is the same.

## SameDispatcher

```solidity
error SameDispatcher()
```

Reverts if the dispatcher address is the same.

## InsufficientDebtAllowance

```solidity
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

| Name      | Type    | Description                             |
| --------- | ------- | --------------------------------------- |
| debtor    | address | Address of the debtor.                  |
| allowance | uint256 | Maximum debt allowance of the debtor.   |
| needed    | uint256 | Requested amount of debt of the debtor. |

## ExcessiveDebtRepayment

```solidity
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

| Name   | Type    | Description                                   |
| ------ | ------- | --------------------------------------------- |
| debtor | address | Address of the debtor.                        |
| debt   | uint256 | Current debt of the debtor.                   |
| needed | uint256 | Requested amount of assets repaying the debt. |

## constructor

```solidity
constructor() public
```

## initialize

```solidity
function initialize(contract IERC20 asset, address _treasury) public
```

## updateTreasury

```solidity
function updateTreasury(address newTreasury) external
```

Updates treasury wallet address.

### Parameters

| Name        | Type    | Description                  |
| ----------- | ------- | ---------------------------- |
| newTreasury | address | New treasury wallet address. |

## updateMinimumDepositAmount

```solidity
function updateMinimumDepositAmount(uint256 newMinimumDepositAmount) external
```

Updates minimum deposit amount.

### Parameters

| Name                    | Type    | Description                                                                                       |
| ----------------------- | ------- | ------------------------------------------------------------------------------------------------- |
| newMinimumDepositAmount | uint256 | New value of the minimum deposit amount. It is the minimum amount for a single deposit operation. |

## updateDispatcher

```solidity
function updateDispatcher(contract IDispatcher newDispatcher) external
```

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

### Parameters

| Name          | Type                 | Description                             |
| ------------- | -------------------- | --------------------------------------- |
| newDispatcher | contract IDispatcher | Address of the new dispatcher contract. |

## updateEntryFeeBasisPoints

```solidity
function updateEntryFeeBasisPoints(uint256 newEntryFeeBasisPoints) external
```

Update the entry fee basis points.

### Parameters

| Name                   | Type    | Description                        |
| ---------------------- | ------- | ---------------------------------- |
| newEntryFeeBasisPoints | uint256 | New value of the fee basis points. |

## updateExitFeeBasisPoints

```solidity
function updateExitFeeBasisPoints(uint256 newExitFeeBasisPoints) external
```

Update the exit fee basis points.

### Parameters

| Name                  | Type    | Description                        |
| --------------------- | ------- | ---------------------------------- |
| newExitFeeBasisPoints | uint256 | New value of the fee basis points. |

## approveAndCall

```solidity
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

| Name      | Type    | Description                             |
| --------- | ------- | --------------------------------------- |
| spender   | address | The address which will spend the funds. |
| value     | uint256 | The amount of tokens to be spent.       |
| extraData | bytes   | Additional data.                        |

### Return Values

| Name | Type | Description                                                  |
| ---- | ---- | ------------------------------------------------------------ |
| \[0] | bool | True if both approval and `receiveApproval` calls succeeded. |

## disableNonFungibleWithdrawals

```solidity
function disableNonFungibleWithdrawals() external
```

Disables non-fungible withdrawals.

## updateDebtAllowance

```solidity
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

| Name         | Type    | Description                           |
| ------------ | ------- | ------------------------------------- |
| debtor       | address | Address of the debtor.                |
| newAllowance | uint256 | Maximum debt allowance of the debtor. |

## mintDebt

```solidity
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

| Name     | Type    | Description                   |
| -------- | ------- | ----------------------------- |
| shares   | uint256 | The amount of shares to mint. |
| receiver | address | The receiver of the shares.   |

### Return Values

| Name   | Type    | Description                                           |
| ------ | ------- | ----------------------------------------------------- |
| assets | uint256 | The debt amount in asset taken for the shares minted. |

## mintReceipt

```solidity
function mintReceipt(address to, uint256 amount) external
```

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

## repayDebt

```solidity
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

| Name   | Type    | Description                     |
| ------ | ------- | ------------------------------- |
| shares | uint256 | The amount of shares to return. |

### Return Values

| Name   | Type    | Description                           |
| ------ | ------- | ------------------------------------- |
| assets | uint256 | The amount of debt in asset paid off. |

## burnReceipt

```solidity
function burnReceipt(uint256 amount) external
```

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

## deposit

```solidity
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

| Name     | Type    | Description                                                                                |
| -------- | ------- | ------------------------------------------------------------------------------------------ |
| assets   | uint256 | Approved amount of tBTC tokens to deposit. This includes treasury fees for deposited tBTC. |
| receiver | address | The address to which the shares will be minted.                                            |

### Return Values

| Name | Type    | Description                                                |
| ---- | ------- | ---------------------------------------------------------- |
| \[0] | uint256 | Minted shares adjusted for the fees taken by the treasury. |

## mint

```solidity
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

| Name     | Type    | Description                                     |
| -------- | ------- | ----------------------------------------------- |
| shares   | uint256 | Amount of shares to mint.                       |
| receiver | address | The address to which the shares will be minted. |

### Return Values

| Name   | Type    | Description                 |
| ------ | ------- | --------------------------- |
| assets | uint256 | Used assets to mint shares. |

## withdraw

```solidity
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

| Name     | Type    | Description                                          |
| -------- | ------- | ---------------------------------------------------- |
| 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

```solidity
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

| Name     | Type    | Description                                          |
| -------- | ------- | ---------------------------------------------------- |
| 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

```solidity
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

```solidity
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

```solidity
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

```solidity
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

```solidity
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

```solidity
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

| Name    | Type    | Description              |
| ------- | ------- | ------------------------ |
| account | address | The owner of the shares. |

### Return Values

| Name | Type    | Description           |
| ---- | ------- | --------------------- |
| \[0] | uint256 | The amount of assets. |

## previewRepayDebt

```solidity
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

```solidity
function _entryFeeBasisPoints() internal view returns (uint256)
```

### Return Values

| Name | Type    | Description                                     |
| ---- | ------- | ----------------------------------------------- |
| \[0] | uint256 | Returns entry fee basis point used in deposits. |

## \_exitFeeBasisPoints

```solidity
function _exitFeeBasisPoints() internal view returns (uint256)
```

### Return Values

| Name | Type    | Description                                       |
| ---- | ------- | ------------------------------------------------- |
| \[0] | uint256 | Returns exit fee basis point used in withdrawals. |

## \_feeRecipient

```solidity
function _feeRecipient() internal view returns (address)
```

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


# BitcoinDepositor

The contract integrates Acre depositing with tBTC minting. User who wants to deposit BTC in Acre should submit a Bitcoin transaction to the most recently created off-chain ECDSA wallets of the tBTC Bridge using pay-to-script-hash (P2SH) or pay-to-witness-script-hash (P2WSH) containing hashed information about this Depositor contract address, and deposit owner's Ethereum address. Then, the deposit owner initiates tBTC minting by revealing their Ethereum address along with their deposit blinding factor, refund public key hash and refund locktime on the tBTC Bridge through this Depositor contract. The off-chain ECDSA wallet and Optimistic Minting bots listen for these sorts of messages and when they get one, they check the Bitcoin network to make sure the deposit lines up. Majority of tBTC minting is finalized by the Optimistic Minting process, where Minter bot initializes minting process and if there is no veto from the Guardians, the process is finalized and tBTC minted to the Depositor address. If the revealed deposit is not handled by the Optimistic Minting process the off-chain ECDSA wallet may decide to pick the deposit transaction for sweeping, and when the sweep operation is confirmed on the Bitcoin network, the tBTC Bridge and tBTC vault mint the tBTC token to the Depositor address. After tBTC is minted to the Depositor, on the deposit finalization tBTC is deposited in Acre and stBTC shares are emitted to the deposit owner.

## DepositState

Reflects the deposit state: - Unknown deposit has not been initialized yet. - Initialized deposit has been initialized with a call to `initializeDeposit` function and is known to this contract. - Finalized deposit led to tBTC ERC20 minting and was finalized with a call to `finalizeDeposit` function that deposited tBTC to the stBTC contract.

```solidity
enum DepositState {
  Unknown,
  Initialized,
  Finalized
}
```

## deposits

```solidity
mapping(uint256 => enum BitcoinDepositor.DepositState) deposits
```

Holds the deposit state, keyed by the deposit key calculated for the individual deposit during the call to `initializeDeposit` function.

## tbtcToken

```solidity
contract IERC20 tbtcToken
```

tBTC Token contract.

## stbtc

```solidity
contract stBTC stbtc
```

stBTC contract.

## minDepositAmount

```solidity
uint256 minDepositAmount
```

Minimum amount of a single deposit (in tBTC token precision).

*This parameter should be set to a value exceeding the minimum deposit amount supported by the tBTC Bridge.*

## depositorFeeDivisor

```solidity
uint64 depositorFeeDivisor
```

Divisor used to compute the depositor fee taken from each deposit and transferred to the treasury upon deposit finalization.

*That fee is computed as follows: `depositorFee = depositedAmount / depositorFeeDivisor` for example, if the depositor fee needs to be 2% of each deposit, the `depositorFeeDivisor` should be set to `50` because `1/50 = 0.02 = 2%`.*

## DepositInitialized

```solidity
event DepositInitialized(uint256 depositKey, address caller, address depositOwner, uint256 initialAmount)
```

Emitted when a deposit is initialized.

*Deposit details can be fetched from {{ Bridge.DepositRevealed }} event emitted in the same transaction.*

### Parameters

| Name          | Type    | Description                                           |
| ------------- | ------- | ----------------------------------------------------- |
| depositKey    | uint256 | Deposit key identifying the deposit.                  |
| caller        | address | Address that initialized the deposit.                 |
| depositOwner  | address | The address to which the stBTC shares will be minted. |
| initialAmount | uint256 | Amount of funding transaction.                        |

## DepositFinalized

```solidity
event DepositFinalized(uint256 depositKey, address caller, uint16 referral, uint256 initialAmount, uint256 bridgedAmount, uint256 depositorFee)
```

Emitted when a deposit is finalized.

*Deposit details can be fetched from {{ ERC4626.Deposit }} event emitted in the same transaction.*

### Parameters

| Name          | Type    | Description                                                |
| ------------- | ------- | ---------------------------------------------------------- |
| depositKey    | uint256 | Deposit key identifying the deposit.                       |
| caller        | address | Address that finalized the deposit.                        |
| referral      | uint16  | Data used for referral program.                            |
| initialAmount | uint256 | Amount of funding transaction.                             |
| bridgedAmount | uint256 | Amount of tBTC tokens that was bridged by the tBTC bridge. |
| depositorFee  | uint256 | Depositor fee amount.                                      |

## MinDepositAmountUpdated

```solidity
event MinDepositAmountUpdated(uint256 minDepositAmount)
```

Emitted when a minimum single deposit amount is updated.

### Parameters

| Name             | Type    | Description                                                               |
| ---------------- | ------- | ------------------------------------------------------------------------- |
| minDepositAmount | uint256 | New value of the minimum single deposit amount (in tBTC token precision). |

## DepositorFeeDivisorUpdated

```solidity
event DepositorFeeDivisorUpdated(uint64 depositorFeeDivisor)
```

Emitted when a depositor fee divisor is updated.

### Parameters

| Name                | Type   | Description                             |
| ------------------- | ------ | --------------------------------------- |
| depositorFeeDivisor | uint64 | New value of the depositor fee divisor. |

## TbtcTokenZeroAddress

```solidity
error TbtcTokenZeroAddress()
```

Reverts if the tBTC Token address is zero.

## StbtcZeroAddress

```solidity
error StbtcZeroAddress()
```

Reverts if the stBTC address is zero.

## DepositOwnerIsZeroAddress

```solidity
error DepositOwnerIsZeroAddress()
```

*Deposit owner address is zero.*

## UnexpectedDepositState

```solidity
error UnexpectedDepositState(enum BitcoinDepositor.DepositState actualState, enum BitcoinDepositor.DepositState expectedState)
```

*Attempted to execute function for deposit in unexpected current state.*

## DepositorFeeExceedsBridgedAmount

```solidity
error DepositorFeeExceedsBridgedAmount(uint256 depositorFee, uint256 bridgedAmount)
```

*Calculated depositor fee exceeds the amount of minted tBTC tokens.*

## MinDepositAmountLowerThanBridgeMinDeposit

```solidity
error MinDepositAmountLowerThanBridgeMinDeposit(uint256 minDepositAmount, uint256 bridgeMinDepositAmount)
```

*Attempted to set minimum deposit amount to a value lower than the tBTC Bridge deposit dust threshold.*

## constructor

```solidity
constructor() public
```

## initialize

```solidity
function initialize(address bridge, address tbtcVault, address _tbtcToken, address _stbtc) public
```

Bitcoin Depositor contract initializer.

### Parameters

| Name        | Type    | Description                    |
| ----------- | ------- | ------------------------------ |
| bridge      | address | tBTC Bridge contract instance. |
| tbtcVault   | address | tBTC Vault contract instance.  |
| \_tbtcToken | address | tBTC token contract instance.  |
| \_stbtc     | address | stBTC contract instance.       |

## initializeDeposit

```solidity
function initializeDeposit(struct IBridgeTypes.BitcoinTxInfo fundingTx, struct IBridgeTypes.DepositRevealInfo reveal, address depositOwner, uint16 referral) external
```

This function allows depositing process initialization for a Bitcoin deposit made by an user with a P2(W)SH transaction. It uses the supplied information to reveal a deposit to the tBTC Bridge contract.

*Requirements: - The revealed vault address must match the TBTCVault address, - All requirements from {Bridge#revealDepositWithExtraData} function must be met. - `depositOwner` must be the deposit owner address used in the P2(W)SH BTC deposit transaction as part of the extra data. - `referral` must be the referral info used in the P2(W)SH BTC deposit transaction as part of the extra data. - BTC deposit for the given `fundingTxHash`, `fundingOutputIndex` can be revealed only one time.*

### Parameters

| Name         | Type                                  | Description                                                         |
| ------------ | ------------------------------------- | ------------------------------------------------------------------- |
| fundingTx    | struct IBridgeTypes.BitcoinTxInfo     | Bitcoin funding transaction data, see `IBridgeTypes.BitcoinTxInfo`. |
| reveal       | struct IBridgeTypes.DepositRevealInfo | Deposit reveal data, see `IBridgeTypes.DepositRevealInfo`.          |
| depositOwner | address                               | The address to which the stBTC shares will be minted.               |
| referral     | uint16                                | Data used for referral program.                                     |

## finalizeDeposit

```solidity
function finalizeDeposit(uint256 depositKey) external
```

This function should be called for previously initialized deposit request, after tBTC minting process completed, meaning tBTC was minted to this contract.

\_It calculates the amount to deposit based on the approximate minted tBTC amount reduced by the depositor fee. IMPORTANT NOTE: The minted tBTC amount used by this function is an approximation. See documentation of the {{AbstractTBTCDepositor#*calculateTbtcAmount}} responsible for calculating this value for more details.*

### Parameters

| Name       | Type    | Description                          |
| ---------- | ------- | ------------------------------------ |
| depositKey | uint256 | Deposit key identifying the deposit. |

## updateMinDepositAmount

```solidity
function updateMinDepositAmount(uint256 newMinDepositAmount) external
```

Updates the minimum deposit amount.

*It requires that the new value is greater or equal to the tBTC Bridge deposit dust threshold, to ensure deposit will be able to be bridged.*

### Parameters

| Name                | Type    | Description                                     |
| ------------------- | ------- | ----------------------------------------------- |
| newMinDepositAmount | uint256 | New minimum deposit amount (in tBTC precision). |

## updateDepositorFeeDivisor

```solidity
function updateDepositorFeeDivisor(uint64 newDepositorFeeDivisor) external
```

Updates the depositor fee divisor.

### Parameters

| Name                   | Type   | Description                      |
| ---------------------- | ------ | -------------------------------- |
| newDepositorFeeDivisor | uint64 | New depositor fee divisor value. |

## encodeExtraData

```solidity
function encodeExtraData(address depositOwner, uint16 referral) public pure returns (bytes32)
```

Encodes deposit owner address and referral as extra data.

*Packs the data to bytes32: 20 bytes of deposit owner address and 2 bytes of referral, 10 bytes of trailing zeros.*

### Parameters

| Name         | Type    | Description                                           |
| ------------ | ------- | ----------------------------------------------------- |
| depositOwner | address | The address to which the stBTC shares will be minted. |
| referral     | uint16  | Data used for referral program.                       |

### Return Values

| Name | Type    | Description         |
| ---- | ------- | ------------------- |
| \[0] | bytes32 | Encoded extra data. |

## decodeExtraData

```solidity
function decodeExtraData(bytes32 extraData) public pure returns (address depositOwner, uint16 referral)
```

Decodes deposit owner address and referral from extra data.

*Unpacks the data from bytes32: 20 bytes of deposit owner address and 2 bytes of referral, 10 bytes of trailing zeros.*

### Parameters

| Name      | Type    | Description         |
| --------- | ------- | ------------------- |
| extraData | bytes32 | Encoded extra data. |

### Return Values

| Name         | Type    | Description                                           |
| ------------ | ------- | ----------------------------------------------------- |
| depositOwner | address | The address to which the stBTC shares will be minted. |
| referral     | uint16  | Data used for referral program.                       |


# BitcoinRedeemer

This contract facilitates redemption of stBTC tokens to Bitcoin through tBTC redemption process.

## tbtcToken

```solidity
contract ITBTCToken tbtcToken
```

Interface for tBTC token contract.

## stbtc

```solidity
contract stBTC stbtc
```

stBTC token contract.

## tbtcVault

```solidity
address tbtcVault
```

Address of the TBTCVault contract.

## TbtcVaultUpdated

```solidity
event TbtcVaultUpdated(address oldTbtcVault, address newTbtcVault)
```

Emitted when the TBTCVault contract address is updated.

### Parameters

| Name         | Type    | Description                            |
| ------------ | ------- | -------------------------------------- |
| oldTbtcVault | address | Address of the old TBTCVault contract. |
| newTbtcVault | address | Address of the new TBTCVault contract. |

## RedemptionRequested

```solidity
event RedemptionRequested(address owner, uint256 shares, uint256 tbtcAmount)
```

Emitted when redemption is requested.

### Parameters

| Name       | Type    | Description             |
| ---------- | ------- | ----------------------- |
| owner      | address | Owner of stBTC tokens.  |
| shares     | uint256 | Number of stBTC tokens. |
| tbtcAmount | uint256 | Number of tBTC tokens.  |

## TbtcTokenZeroAddress

```solidity
error TbtcTokenZeroAddress()
```

Reverts if the tBTC Token address is zero.

## StbtcZeroAddress

```solidity
error StbtcZeroAddress()
```

Reverts if the stBTC address is zero.

## TbtcVaultZeroAddress

```solidity
error TbtcVaultZeroAddress()
```

Reverts if the TBTCVault address is zero.

## CallerNotAllowed

```solidity
error CallerNotAllowed(address caller)
```

Attempted to call receiveApproval by supported token.

## EmptyExtraData

```solidity
error EmptyExtraData()
```

Attempted to call receiveApproval with empty data.

## UnexpectedTbtcTokenOwner

```solidity
error UnexpectedTbtcTokenOwner()
```

Attempted to call \_redeemSharesAndUnmint with unexpected tBTC token owner.

## RedeemerNotOwner

```solidity
error RedeemerNotOwner(address redeemer, address owner)
```

Reverts if the redeemer is not the deposit owner.

## ApproveAndCallFailed

```solidity
error ApproveAndCallFailed()
```

Reverts when approveAndCall to tBTC contract fails.

## NotTbtcTokenOwner

```solidity
error NotTbtcTokenOwner()
```

Reverts if the new TBTCVault contract is not tBTC token owner.

## constructor

```solidity
constructor() public
```

## initialize

```solidity
function initialize(address _tbtcToken, address _stbtc, address _tbtcVault) public
```

Initializes the contract with tBTC token and stBTC token addresses.

### Parameters

| Name        | Type    | Description                              |
| ----------- | ------- | ---------------------------------------- |
| \_tbtcToken | address | The address of the tBTC token contract.  |
| \_stbtc     | address | The address of the stBTC token contract. |
| \_tbtcVault | address | The address of the TBTCVault contract.   |

## receiveApproval

```solidity
function receiveApproval(address from, uint256 amount, address, bytes extraData) external
```

Redeems shares for tBTC and requests bridging to Bitcoin.

### Parameters

| Name      | Type    | Description                                                                                                         |
| --------- | ------- | ------------------------------------------------------------------------------------------------------------------- |
| from      | address | Shares token holder executing redemption.                                                                           |
| amount    | uint256 | Amount of shares to redeem.                                                                                         |
|           | address |                                                                                                                     |
| extraData | bytes   | Redemption data in a format expected from `redemptionData` parameter of Bridge's `receiveBalanceApproval` function. |

## updateTbtcVault

```solidity
function updateTbtcVault(address newTbtcVault) external
```

Updates TBTCVault contract address.

### Parameters

| Name         | Type    | Description                     |
| ------------ | ------- | ------------------------------- |
| newTbtcVault | address | New TBTCVault contract address. |

## \_redeemSharesAndUnmint

```solidity
function _redeemSharesAndUnmint(address owner, uint256 shares, bytes tbtcRedemptionData) internal
```

Initiates the redemption process by exchanging stBTC tokens for tBTC tokens and requesting bridging to Bitcoin.

*Redeems stBTC shares to receive tBTC and requests redemption of tBTC to Bitcoin via tBTC Bridge. Redemption data in a format expected from `redemptionData` parameter of Bridge's `receiveBalanceApproval`. It uses tBTC token owner which is the TBTCVault contract as spender of tBTC requested for redemption. tBTC Bridge redemption process has a path where request can timeout. It is a scenario that is unlikely to happen with the current Bridge setup. This contract remains upgradable to have flexibility to handle adjustments to tBTC Bridge changes. Redemption data should include a `redeemer` address matching the address of the deposit owner who is redeeming the shares. In case anything goes wrong during the tBTC unminting process, the redeemer will be able to claim the tBTC tokens back from the tBTC Bank contract.*

### Parameters

| Name               | Type    | Description                                                                                                                          |
| ------------------ | ------- | ------------------------------------------------------------------------------------------------------------------------------------ |
| owner              | address | The owner of the stBTC tokens.                                                                                                       |
| shares             | uint256 | The number of stBTC tokens to redeem.                                                                                                |
| tbtcRedemptionData | bytes   | Additional data required for the tBTC redemption. See `redemptionData` parameter description of `Bridge.requestRedemption` function. |


# MezoAllocator

## IMezoPortal

*Interface for the Mezo's Portal contract connected to dispatcher.*

### DepositInfo

DepositInfo keeps track of the deposit balance and unlock time. Each deposit is tracked separately and associated with a specific token. Some tokens can be deposited but can not be locked - in that case the unlockAt is the block timestamp of when the deposit was created. The same is true for tokens that can be locked but the depositor decided not to lock them. Some deposits can mint a receipt tokens against them: receiptMinted is the amount of receipt tokens minted against a deposit, while feeOwed is the fee owed by the deposit to Portal, and the lastFeeIntegral is the last updated value of the fee integral.

```solidity
struct DepositInfo {
  uint96 balance;
  uint32 unlockAt;
  uint96 receiptMinted;
  uint96 feeOwed;
  uint88 lastFeeIntegral;
}
```

### deposit

```solidity
function deposit(address token, uint96 amount, uint32 lockPeriod) external
```

Deposit and optionally lock tokens for the given period.

*Lock period will be normalized to weeks. If non-zero, it must not be shorter than the minimum lock period and must not be longer than the maximum lock period.*

#### Parameters

| Name       | Type    | Description                                       |
| ---------- | ------- | ------------------------------------------------- |
| token      | address | token address to deposit                          |
| amount     | uint96  | amount of tokens to deposit                       |
| lockPeriod | uint32  | lock period in seconds, 0 to not lock the deposit |

### withdraw

```solidity
function withdraw(address token, uint256 depositId) external
```

Withdraws all deposited tokens.

```
    Deposited lockable tokens can be withdrawn at any time if
    there is no lock set on the deposit or the lock period has passed.
    There is no way to withdraw locked deposit. Tokens that are not
    lockable can be withdrawn at any time.

    Deposits for which receipt tokens were minted and not fully
    repaid can not be withdrawn even if the lock expired. Repaying
    all receipt tokens is a must to withdraw the deposit. Upon
    withdrawing a deposit for which the receipt tokens were minted,
    the fee is collected based on the annual fee and the amount
    of minted receipt tokens.

    This function withdraws all deposited tokens. For partial
    withdrawals, use `withdrawPartially`.
```

#### Parameters

| Name      | Type    | Description             |
| --------- | ------- | ----------------------- |
| token     | address | deposited token address |
| depositId | uint256 | id of the deposit       |

### withdrawPartially

```solidity
function withdrawPartially(address token, uint256 depositId, uint96 amount) external
```

Withdraws part of the deposited tokens.

```
    Deposited lockable tokens can be withdrawn at any time if
    there is no lock set on the deposit or the lock period has passed.
    There is no way to withdraw locked deposit. Tokens that are not
    lockable can be withdrawn at any time.

    Deposits for which receipt tokens were minted and fully repaid
    can not be partially withdrawn even if the lock expired.
    Repaying all receipt tokens is a must to partially withdraw the
    deposit. If the fee for receipt tokens minted is non-zero, the
    deposit can not be partially withdrawn and only a full
    withdrawal is possible.

    This function allows only for partial withdrawals. For full
    withdrawals, use `withdraw`.
```

#### Parameters

| Name      | Type    | Description                |
| --------- | ------- | -------------------------- |
| token     | address | deposited token address    |
| depositId | uint256 | id of the deposit          |
| amount    | uint96  | the amount to be withdrawn |

### depositCount

```solidity
function depositCount() external view returns (uint256)
```

The number of deposits created. Includes the deposits that were fully withdrawn. This is also the identifier of the most recently created deposit.

### getDeposit

```solidity
function getDeposit(address depositor, address token, uint256 depositId) external view returns (struct IMezoPortal.DepositInfo)
```

Get the balance and unlock time of a given deposit.

#### Parameters

| Name      | Type    | Description                      |
| --------- | ------- | -------------------------------- |
| depositor | address | depositor address                |
| token     | address | token address to get the balance |
| depositId | uint256 | id of the deposit                |

## MezoAllocator

MezoAllocator routes tBTC to/from MezoPortal.

### mezoPortal

```solidity
contract IMezoPortal mezoPortal
```

Address of the MezoPortal contract.

### tbtc

```solidity
contract IERC20 tbtc
```

tBTC token contract.

### stbtc

```solidity
contract stBTC stbtc
```

stBTC token vault contract.

### isMaintainer

```solidity
mapping(address => bool) isMaintainer
```

Keeps track of the addresses that are allowed to trigger deposit allocations.

### maintainers

```solidity
address[] maintainers
```

List of maintainers.

### depositId

```solidity
uint256 depositId
```

keeps track of the latest deposit ID assigned in Mezo Portal.

### depositBalance

```solidity
uint96 depositBalance
```

Keeps track of the total amount of tBTC allocated to MezoPortal.

### DepositAllocated

```solidity
event DepositAllocated(uint256 oldDepositId, uint256 newDepositId, uint256 addedAmount, uint256 newDepositAmount)
```

Emitted when tBTC is deposited to MezoPortal.

### DepositWithdrawn

```solidity
event DepositWithdrawn(uint256 depositId, uint256 amount)
```

Emitted when tBTC is withdrawn from MezoPortal.

### MaintainerAdded

```solidity
event MaintainerAdded(address maintainer)
```

Emitted when the maintainer address is updated.

### MaintainerRemoved

```solidity
event MaintainerRemoved(address maintainer)
```

Emitted when the maintainer address is updated.

### DepositReleased

```solidity
event DepositReleased(uint256 depositId, uint256 amount)
```

Emitted when tBTC is released from MezoPortal.

### CallerNotMaintainer

```solidity
error CallerNotMaintainer()
```

Reverts if the caller is not a maintainer.

### CallerNotStbtc

```solidity
error CallerNotStbtc()
```

Reverts if the caller is not the stBTC contract.

### MaintainerNotRegistered

```solidity
error MaintainerNotRegistered()
```

Reverts if the maintainer is not registered.

### MaintainerAlreadyRegistered

```solidity
error MaintainerAlreadyRegistered()
```

Reverts if the maintainer has been already registered.

### onlyMaintainer

```solidity
modifier onlyMaintainer()
```

### constructor

```solidity
constructor() public
```

### initialize

```solidity
function initialize(address _mezoPortal, address _tbtc, address _stbtc) public
```

Initializes the MezoAllocator contract.

#### Parameters

| Name         | Type    | Description                         |
| ------------ | ------- | ----------------------------------- |
| \_mezoPortal | address | Address of the MezoPortal contract. |
| \_tbtc       | address | Address of the tBTC token contract. |
| \_stbtc      | address |                                     |

### allocate

```solidity
function allocate() external
```

Allocate tBTC to MezoPortal. Each allocation creates a new "rolling" deposit meaning that the previous Acre's deposit is fully withdrawn before a new deposit with added amount is created. This mimics a "top up" functionality with the difference that a new deposit id is created and the previous deposit id is no longer in use.

*This function can be invoked periodically by a maintainer.*

### withdraw

```solidity
function withdraw(uint256 amount) external
```

Withdraws tBTC from MezoPortal and transfers it to stBTC. This function can withdraw partial or a full amount of tBTC from MezoPortal for a given deposit id.

#### Parameters

| Name   | Type    | Description                 |
| ------ | ------- | --------------------------- |
| amount | uint256 | Amount of tBTC to withdraw. |

### releaseDeposit

```solidity
function releaseDeposit() external
```

Releases deposit in full from MezoPortal.

*This is a special function that can be used to migrate funds during allocator upgrade or in case of emergencies.*

### addMaintainer

```solidity
function addMaintainer(address maintainerToAdd) external
```

Adds a new maintainer address.

#### Parameters

| Name            | Type    | Description                    |
| --------------- | ------- | ------------------------------ |
| maintainerToAdd | address | Address of the new maintainer. |

### removeMaintainer

```solidity
function removeMaintainer(address maintainerToRemove) external
```

Removes the maintainer address.

#### Parameters

| Name               | Type    | Description                          |
| ------------------ | ------- | ------------------------------------ |
| maintainerToRemove | address | Address of the maintainer to remove. |

### totalAssets

```solidity
function totalAssets() external view returns (uint256)
```

Returns the total amount of tBTC allocated to MezoPortal including the amount that is currently hold by this contract.

### getMaintainers

```solidity
function getMaintainers() external view returns (address[])
```

Returns the list of maintainers.


# Governance

## Introduction

The Acre DAO is designed to support the long term stability and growth of the Acre protocol. The role of the Acre DAO is to maintain certain governable protocol parameters and deploy upgrades to the protocol.

ACRE tokenholders are able to participate in protocol governance with their ACRE tokens. Furthermore, Acre DAO manages protocol owned liquidity and token incentives, which are used to grow the Acre protocol.

There will be a total of 1 billion ACRE tokens minted.

## The ACRE Token

ACRE is the utility token of the Acre Protocol and Acre DAO.

## Other Protocol Matters

ACRE holders have the option to vote to add or remove bitcoin strategies from the Acre Dispatcher, elect DAO representatives and manage the Acre treasury. Protocol fees may be subject to change depending on protocol governance.


# Tokenomics

## ACRE Token

ACRE is the Acre DAO’s membership token, and is used for DAO governance.

## ACRE Distribution

There will be a total of 1 billion ACRE tokens minted, to be distributed based on DAO vote.&#x20;

## veACRE

veACRE is the voting token on Acre and is used to make collective decisions regarding the Acre treasury, stBTC specifications, and other protocol matters.

veACRE holders are able to direct the allocation of deposited BTC.

Acre DAO participation requires users to hold a balance of vote-escrowed ACRE, known as veACRE.

veACRE is a non-transferable ERC20 token token designed to allow users to vote and participate in the Acre Protocol. The balance of veACRE that a user holds is the measure of their voting power in Acre DAO governance.

Votes can be used to:

* Create and vote on Acre DAO governance proposals.
* Govern protocol parameters.
* Add or remove validators from the L2 validator pool.
* Direct ACRE emissions to stBTC gauges.
* Receive incentives from third party protocols to vote on their gauges.

## How locks work

* Users receive veACRE by locking their ACRE tokens for a period of up to 4 years.
* ACRE locked for the maximum 4 year period receive 1 veACRE for each ACRE locked.
* The amount of veACRE a user has decays linearly over the duration of their lock.
* It is possible to have multiple locks of different durations.
* Locks can be set to automatically re-locked to maintain the maximum veACRE position.
* Locks can be split (by extending the duration of only a portion of the lock), or merged (by extending one locks duration to the same duration as another lock).
* Every Thursday, the number of weeks for a lock decreases by 1. When a locks duration reaches 0, the ACRE can be withdrawn without penalty.
* It is possible to exit a veACRE position early by paying a withdrawal fee, which accrues to the DAO treasury. The fee to exit early starts at 100% and decays linearly based on the number of weeks remaining until the tokens unlock.


# Dispatcher

## BTC Allocation

The proportion of BTC allocated to a particular Layer 2 protocol is determined by a yield and risk optimized strategy.

Every month (also referred to as epoch), veACRE holders vote to determine how BTC is allocated to L2 protocols. Votes are are measured via Snapshot and executed by the Acre Security Council.

Each Layer 2 will receive an allocation based on the proportion of yield it contributes, and it’s risk score relative to other protocols.

$$
L2Allocation = YieldWeight\*(\frac{L2Yield}{TotalYield}) + RiskWeight(\frac{L2Risk}{TotalRisk})
$$

Acre DAO can decide upon the yield-to-risk ratio by setting the Yield\_Weight and Risk\_Weight values. The risk score of each protocol will be determined by a risk assessment rubric.

In the future, the DAO can vote to implement an allocation system based on direct veACRE votes. Supported Layer 2 protocols can incentivise veACRE voters to vote for their respective protocols, in the same way that liquidity pools on Curve can be incentivised via veCRV votes.


# Addresses


