From 5239a3be55d7469fc1cc9540bfe94c0d62991623 Mon Sep 17 00:00:00 2001 From: Rafal Czajkowski Date: Wed, 26 Aug 2026 13:46:19 +0200 Subject: [PATCH 1/9] Disable the deposit button in dapp Deposits must stop while funds are recovered ahead of the allocator vault upgrade. Reuses the `ArrivingSoonTooltip` pattern already used by the paused Withdraw button, and drops the TVL-cap condition that `DEPOSIT_CAP_ENABLED` left permanently unreachable. --- .../pages/DashboardPage/PositionDetails.tsx | 22 ++++++------------- 1 file changed, 7 insertions(+), 15 deletions(-) diff --git a/dapp/src/pages/DashboardPage/PositionDetails.tsx b/dapp/src/pages/DashboardPage/PositionDetails.tsx index 09e2c2b4d..9650a845a 100644 --- a/dapp/src/pages/DashboardPage/PositionDetails.tsx +++ b/dapp/src/pages/DashboardPage/PositionDetails.tsx @@ -3,7 +3,6 @@ import { // useActivitiesCount, useBitcoinPosition, useTransactionModal, - useStatistics, useWallet, useMobileMode, useActivities, @@ -48,10 +47,6 @@ export default function PositionDetails() { const { data: activities } = useActivities() const isMobileMode = useMobileMode() - const statistics = useStatistics() - - const { tvl } = statistics.data - const { isConnected } = useWallet() const isDisabledForMobileMode = @@ -87,17 +82,14 @@ export default function PositionDetails() { - From 30527bf6ce2d03455e3357099318d542c36dec01 Mon Sep 17 00:00:00 2001 From: Rafal Czajkowski Date: Wed, 26 Aug 2026 13:46:29 +0200 Subject: [PATCH 2/9] Add deposit pause banner to dapp dashboard Users need to know deposits are paused before they try to deposit. No app-wide notice component existed: `MobileModeBanner` replaces the whole page and `WithdrawalStatusBanner` is per-activity, so this adds a small banner styled to match the latter and renders it full-width above the balance card. --- dapp/src/components/ProtocolPauseBanner.tsx | 27 +++++++++++++++++++++ dapp/src/pages/DashboardPage/index.tsx | 8 +++++- 2 files changed, 34 insertions(+), 1 deletion(-) create mode 100644 dapp/src/components/ProtocolPauseBanner.tsx diff --git a/dapp/src/components/ProtocolPauseBanner.tsx b/dapp/src/components/ProtocolPauseBanner.tsx new file mode 100644 index 000000000..c78b477e4 --- /dev/null +++ b/dapp/src/components/ProtocolPauseBanner.tsx @@ -0,0 +1,27 @@ +import React from "react" +import { Card, HStack, Icon, Text } from "@chakra-ui/react" +import { IconExclamationCircle } from "@tabler/icons-react" + +export default function ProtocolPauseBanner() { + return ( + + + + + + Attention: Deposits Paused and Vault Upgrade Scheduled for Fall 2026. + Withdrawals Remain Live. + + + + ) +} diff --git a/dapp/src/pages/DashboardPage/index.tsx b/dapp/src/pages/DashboardPage/index.tsx index 96c9b04f9..14829bee1 100644 --- a/dapp/src/pages/DashboardPage/index.tsx +++ b/dapp/src/pages/DashboardPage/index.tsx @@ -2,11 +2,12 @@ import React from "react" import { featureFlags } from "#/constants" import { useActivities, useTriggerConnectWalletModal, useWallet } from "#/hooks" import usePositionStats from "#/hooks/usePositionStats" -import { Card, Grid, VStack } from "@chakra-ui/react" +import { Box, Card, Grid, VStack } from "@chakra-ui/react" import Vaults from "#/components/Vaults" import WithdrawalStatusBanner, { WithdrawStatus, } from "#/components/WithdrawalStatusBanner" +import ProtocolPauseBanner from "#/components/ProtocolPauseBanner" import DashboardCard from "./DashboardCard" import AcrePointsCard from "./AcrePointsCard" import AcrePointsTemplateCard from "./AcrePointsTemplateCard" @@ -18,6 +19,7 @@ import EstimatedAPRCard from "./EstimatedAPRCard" const fullWidthGridColumn = { base: "1", md: "span 3" } const grid = { + notice: fullWidthGridColumn, dashboard: { base: "1", md: "span 2" }, points: { base: "1", md: "3 / span 1" }, withdrawals: fullWidthGridColumn, @@ -60,6 +62,10 @@ export default function DashboardPage() { gridGap={{ base: 4, "2xl": 8 }} templateColumns={{ base: "1fr ", md: "repeat(3, 1fr)" }} > + + + + {featureFlags.ACRE_POINTS_ENABLED ? ( From 2e55a9398b1064550a8c3be240ece771ff7e0db5 Mon Sep 17 00:00:00 2001 From: Rafal Czajkowski Date: Wed, 26 Aug 2026 13:46:38 +0200 Subject: [PATCH 3/9] Show current APY of 0% in dapp acreBTC earns Acre points only during the protocol upgrade, so the advertised 14% target APY is no longer accurate. Renames the card to `CurrentAPYCard` since it no longer shows a forward-looking estimate, and updates the duplicate figure reported to Ledger Live. --- .../useRegisterAcreEthereumAddressInLedgerLive.ts | 2 +- .../{EstimatedAPRCard.tsx => CurrentAPYCard.tsx} | 12 ++++++------ dapp/src/pages/DashboardPage/index.tsx | 4 ++-- 3 files changed, 9 insertions(+), 9 deletions(-) rename dapp/src/pages/DashboardPage/{EstimatedAPRCard.tsx => CurrentAPYCard.tsx} (56%) diff --git a/dapp/src/hooks/useRegisterAcreEthereumAddressInLedgerLive.ts b/dapp/src/hooks/useRegisterAcreEthereumAddressInLedgerLive.ts index d3ca9416a..0882f1c89 100644 --- a/dapp/src/hooks/useRegisterAcreEthereumAddressInLedgerLive.ts +++ b/dapp/src/hooks/useRegisterAcreEthereumAddressInLedgerLive.ts @@ -43,7 +43,7 @@ const useRegisterAcreEthereumAddressInLedgerLive = () => { tokenTicker: TOKEN_TICKER, meta: { protocol: "Acre", - apy: "14%", + apy: "0%", }, }) }, diff --git a/dapp/src/pages/DashboardPage/EstimatedAPRCard.tsx b/dapp/src/pages/DashboardPage/CurrentAPYCard.tsx similarity index 56% rename from dapp/src/pages/DashboardPage/EstimatedAPRCard.tsx rename to dapp/src/pages/DashboardPage/CurrentAPYCard.tsx index 791976b2e..091922aba 100644 --- a/dapp/src/pages/DashboardPage/EstimatedAPRCard.tsx +++ b/dapp/src/pages/DashboardPage/CurrentAPYCard.tsx @@ -4,21 +4,21 @@ import FeaturedMetricsCard, { } from "#/components/shared/FeaturedMetricsCard" import { IconTrendingUp } from "@tabler/icons-react" -type EstimatedAPRCardProps = Omit< +type CurrentAPYCardProps = Omit< FeaturedMetricsCardProps, "label" | "icon" | "value" | "infoContent" > -function EstimatedAPRCard(props: EstimatedAPRCardProps) { +function CurrentAPYCard(props: CurrentAPYCardProps) { return ( ) } -export default EstimatedAPRCard +export default CurrentAPYCard diff --git a/dapp/src/pages/DashboardPage/index.tsx b/dapp/src/pages/DashboardPage/index.tsx index 14829bee1..73378187c 100644 --- a/dapp/src/pages/DashboardPage/index.tsx +++ b/dapp/src/pages/DashboardPage/index.tsx @@ -14,7 +14,7 @@ import AcrePointsTemplateCard from "./AcrePointsTemplateCard" import TransactionHistory from "./TransactionHistory" import BTCDepositedCard from "./BTCDepositedCard" import RewardsEarnedCard from "./RewardsEarnedCard" -import EstimatedAPRCard from "./EstimatedAPRCard" +import CurrentAPYCard from "./CurrentAPYCard" const fullWidthGridColumn = { base: "1", md: "span 3" } @@ -100,7 +100,7 @@ export default function DashboardPage() { isLoading={isLoading} btcAmount={data?.earned} /> - + )} From 6978071ad8eb71e1b8269383fc46b08c97836cb7 Mon Sep 17 00:00:00 2001 From: Rafal Czajkowski Date: Wed, 26 Aug 2026 13:46:46 +0200 Subject: [PATCH 4/9] Remove Acre points drop countdown from dapp The daily drop cadence no longer reflects how points accrue during the upgrade, so the "Next drop in" countdown is misleading. Deletes `AcrePointsLabel` and trims the balance tooltips to drop the same claim. Balances still refresh on the existing poll interval, which the countdown's refetch callback was only supplementing. --- .../AcrePointsCard/AcrePointsLabel.tsx | 47 ------------------- .../AcrePointsCard/UserPointsLabel.tsx | 2 - .../DashboardPage/AcrePointsCard/index.tsx | 13 ++--- 3 files changed, 7 insertions(+), 55 deletions(-) delete mode 100644 dapp/src/pages/DashboardPage/AcrePointsCard/AcrePointsLabel.tsx diff --git a/dapp/src/pages/DashboardPage/AcrePointsCard/AcrePointsLabel.tsx b/dapp/src/pages/DashboardPage/AcrePointsCard/AcrePointsLabel.tsx deleted file mode 100644 index 95b4f3a0f..000000000 --- a/dapp/src/pages/DashboardPage/AcrePointsCard/AcrePointsLabel.tsx +++ /dev/null @@ -1,47 +0,0 @@ -import React from "react" -import { HStack, Text } from "@chakra-ui/react" -import Countdown from "#/components/shared/Countdown" -import { logPromiseFailure } from "#/utils" -import { useAcrePointsData, useUserPointsData } from "#/hooks" -import LabelWrapper from "./LabelWrapper" - -export function NextDropTimestampLabel() { - const { data: acrePointsData, refetch: acrePointsDataRefetch } = - useAcrePointsData() - const { refetch: userPointsDataRefetch } = useUserPointsData() - - const handleOnCountdownEnd = () => { - logPromiseFailure(acrePointsDataRefetch()) - logPromiseFailure(userPointsDataRefetch()) - } - - if (!acrePointsData?.nextDropTimestamp) return null - - return ( - - - Next drop in - - - - ) -} - -export default function AcrePointsLabel() { - const { data } = useAcrePointsData() - - if (!data) return null - - return ( - - - - ) -} diff --git a/dapp/src/pages/DashboardPage/AcrePointsCard/UserPointsLabel.tsx b/dapp/src/pages/DashboardPage/AcrePointsCard/UserPointsLabel.tsx index 1d2a492fc..d632c67e4 100644 --- a/dapp/src/pages/DashboardPage/AcrePointsCard/UserPointsLabel.tsx +++ b/dapp/src/pages/DashboardPage/AcrePointsCard/UserPointsLabel.tsx @@ -7,7 +7,6 @@ import TooltipIcon from "#/components/shared/TooltipIcon" import useDebounce from "#/hooks/useDebounce" import { time } from "#/constants" import LabelWrapper from "./LabelWrapper" -import { NextDropTimestampLabel } from "./AcrePointsLabel" function ClaimableBalanceLabel() { const { mutate: claimPoints } = useClaimPoints() @@ -79,7 +78,6 @@ export default function UserPointsLabel() { return ( - ) diff --git a/dapp/src/pages/DashboardPage/AcrePointsCard/index.tsx b/dapp/src/pages/DashboardPage/AcrePointsCard/index.tsx index 8fc0d98cd..d6271382c 100644 --- a/dapp/src/pages/DashboardPage/AcrePointsCard/index.tsx +++ b/dapp/src/pages/DashboardPage/AcrePointsCard/index.tsx @@ -13,7 +13,6 @@ import { useAcrePointsData, useUserPointsData, useWallet } from "#/hooks" import UserDataSkeleton from "#/components/shared/UserDataSkeleton" import TooltipIcon from "#/components/shared/TooltipIcon" import acrePointsIllustrationSrc from "#/assets/images/acre-points-illustration.png" -import AcrePointsLabel from "./AcrePointsLabel" import UserPointsLabel from "./UserPointsLabel" const { numberToLocaleString } = numbersUtils @@ -40,8 +39,8 @@ export default function AcrePointsCard(props: CardProps) { @@ -58,9 +57,11 @@ export default function AcrePointsCard(props: CardProps) { - - {isConnected ? : } - + {isConnected && ( + + + + )} ) From 5864885dee1be735f88359907a74e2d82ee77322 Mon Sep 17 00:00:00 2001 From: Rafal Czajkowski Date: Wed, 26 Aug 2026 13:46:54 +0200 Subject: [PATCH 5/9] Support token pages in block explorer links The vault details modal needs to link to the acreBTC token page, which `createBlockExplorerLink` could not build. Adds a `token` case so `BlockExplorerLink` stays the single path for explorer URLs rather than hand-rolling one at the call site. --- dapp/src/types/chain.ts | 2 +- dapp/src/utils/chainUtils.ts | 2 ++ 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/dapp/src/types/chain.ts b/dapp/src/types/chain.ts index 0e0c689ac..9df547759 100644 --- a/dapp/src/types/chain.ts +++ b/dapp/src/types/chain.ts @@ -1,3 +1,3 @@ export type Chain = "bitcoin" | "ethereum" -export type ExplorerDataType = "transaction" | "address" +export type ExplorerDataType = "transaction" | "address" | "token" diff --git a/dapp/src/utils/chainUtils.ts b/dapp/src/utils/chainUtils.ts index 431e19227..fe8b8ec4d 100644 --- a/dapp/src/utils/chainUtils.ts +++ b/dapp/src/utils/chainUtils.ts @@ -13,6 +13,8 @@ const createBlockExplorerLink = ( switch (type) { case "address": return `${prefix}/address/${id}` + case "token": + return `${prefix}/token/${id}` case "transaction": default: { return `${prefix}/tx/${id}` From e67a5de81c0278352210a34e241ca95f0a57b125 Mon Sep 17 00:00:00 2001 From: Rafal Czajkowski Date: Wed, 26 Aug 2026 13:47:01 +0200 Subject: [PATCH 6/9] Update dapp vault row for tBTC allocator vault The vault no longer runs blended-yield strategies and Midas has replaced Re7 Labs as the party named for it, so the row is retitled, the column header becomes Infrastructure Provider, and net APY drops to 0% with the "(est.)" suffix removed since zero is not an estimate. Also drops the `details` field, which was computed per row but never read because the modal rebuilds it. --- dapp/src/components/Vaults.tsx | 19 ++++--------------- dapp/src/constants/vaults.ts | 8 ++++---- 2 files changed, 8 insertions(+), 19 deletions(-) diff --git a/dapp/src/components/Vaults.tsx b/dapp/src/components/Vaults.tsx index 48d6d85aa..22ba27c7a 100644 --- a/dapp/src/components/Vaults.tsx +++ b/dapp/src/components/Vaults.tsx @@ -35,8 +35,6 @@ import { IconExclamationCircle, IconRefresh, } from "@tabler/icons-react" -import { getMidasVaultDetails } from "./MidasVaultDetails" -import { VaultDetails } from "./VaultDetailsModal" const { formatNumberToCompactString, getPercentValue } = numbersUtils @@ -47,7 +45,6 @@ type VaultItem = { tvl: number tvlCap: number curator: keyof typeof vaults.VAULT_CURATORS - details: VaultDetails } type VaultsRootProps = CardProps @@ -77,7 +74,7 @@ function VaultsRoot(props: VaultsRootProps) { Portfolio Weight NET APY TVL - Risk Manager + Infrastructure Provider @@ -152,7 +149,7 @@ function VaultTableRow({ vault }: { vault: VaultItem }) { {portfolioWeightPercentage}% - {aprPercentage}% (est.) + {aprPercentage}% {formattedTvl} @@ -192,8 +189,6 @@ function VaultTableRow({ vault }: { vault: VaultItem }) { function Vaults(props: VaultsRootProps) { const statistics = useStatistics() - const { data: depositFeePercentage } = useDepositFeePercentage() - const { data: withdrawalFeePercentage } = useWithdrawalFeePercentage() const handleRefetch = () => logPromiseFailure(statistics.refetch()) @@ -246,16 +241,10 @@ function Vaults(props: VaultsRootProps) { { provider: "tbtc", portfolioWeight: 1, - apr: 11, + apr: 0, tvl: statistics.data.tvl.usdValue, tvlCap: statistics.data.tvl.cap, - curator: "re7", - details: getMidasVaultDetails({ - depositFeePercentage, - withdrawalFeePercentage, - tvlCapInUsd: statistics.data.tvl.cap, - vaultTvlInUsd: statistics.data.tvl.usdValue, - }), + curator: "midas", }, ] diff --git a/dapp/src/constants/vaults.ts b/dapp/src/constants/vaults.ts index 7cfd2779b..bc7119c71 100644 --- a/dapp/src/constants/vaults.ts +++ b/dapp/src/constants/vaults.ts @@ -3,7 +3,7 @@ import externalHref from "./externalHref" const VAULT_PROVIDERS = { tbtc: { - label: "BTC-Neutral Blended Yield", + label: "tBTC Allocator Vault", icon: TbtcIcon, address: "0x6A6092d9c47A7E4C085f2ED9FD4a376124587Ae0", depositToken: "tBTC", @@ -11,9 +11,9 @@ const VAULT_PROVIDERS = { } const VAULT_CURATORS = { - re7: { - label: "Re7 Labs", - url: externalHref.RE7, + midas: { + label: "Midas", + url: externalHref.MIDAS, }, } From 7cd4c2b688923c16f51516b078061e5efeb00727 Mon Sep 17 00:00:00 2001 From: Rafal Czajkowski Date: Wed, 26 Aug 2026 13:47:17 +0200 Subject: [PATCH 7/9] Rewrite dapp vault details copy for Midas vault Describes what the vault actually does now: hold tBTC ahead of strategy deployment, redeemable on a ~72 hour cooldown. Names Midas as sole infrastructure provider, collapsing the separate risk manager row, and zeroes the APY figures that contradicted the 0% shown elsewhere. Transparency links are reduced to the three addresses that still matter -- available liquidity, the acreBTC token and the withdrawal queue -- and the modal footer no longer claims rewards auto-compound. --- dapp/src/components/MidasVaultDetails.tsx | 166 +++++++--------------- dapp/src/components/VaultDetailsModal.tsx | 5 +- dapp/src/constants/externalHref.ts | 3 - dapp/src/constants/transparency.ts | 4 +- 4 files changed, 57 insertions(+), 121 deletions(-) diff --git a/dapp/src/components/MidasVaultDetails.tsx b/dapp/src/components/MidasVaultDetails.tsx index 5173980c1..15fecc38b 100644 --- a/dapp/src/components/MidasVaultDetails.tsx +++ b/dapp/src/components/MidasVaultDetails.tsx @@ -1,6 +1,6 @@ import React from "react" import TbtcIcon from "#/assets/icons/TbtcIcon" -import { externalHref, transparency, vaults } from "#/constants" +import { externalHref, transparency } from "#/constants" import { addressUtils } from "#/utils" import { Button, Icon, Link, Text } from "@chakra-ui/react" import { IconArrowUpRight } from "@tabler/icons-react" @@ -15,46 +15,38 @@ import DeBankLink from "./shared/DeBankLink" export default function MidasVaultDetailsDescription() { return ( <> - This BTC-neutral vault generates yield from multiple sources: DeFi - (liquidity provision + delta-neutral strategies), options premia, and BTC - staking (Starknet).{" "} + This vault holds tBTC prior to the deployment to vetted strategies.{" "} Midas {" "} - provides algorithmic infrastructure and 24/7 portfolio monitoring. Risk - and strategy management are handled by{" "} - - Re7 Labs - - , the innovation arm of Re7 Capital and creators of the Re7 DeFi Ratings - framework. Risk parameters for the vault have been reviewed and approved - by the Acre Security Council, following the{" "} - - Acre Deployment Policy - - . A protocol fee of 20% on earned rewards will go to the Acre DAO and its - partners. Deposits and withdrawals are always under your direct control, - and all deployments, rewards, and redemptions are fully on-chain and - auditable. + is the infrastructure provider and reviews all deposits and redemptions + for accounting, security and additional infrastructure. The tBTC is ready + to request redeem from the Midas vault at any time with approximately 72 + hour cool down time. If redeeming back to Bitcoin, there is a 0.20% fee + from the Threshold Network bridge. ) } +function AddressValue({ children }: { children: React.ReactNode }) { + return ( + + {children} + + ) +} + export function getMidasVaultDetails({ depositFeePercentage, withdrawalFeePercentage, @@ -67,7 +59,7 @@ export function getMidasVaultDetails({ vaultTvlInUsd: number }) { return { - vaultName: "BTC-Neutral Blended Yield", + vaultName: "Midas acreBTC (macreBTC) Vault", description: , icon: TbtcIcon, sections: [ @@ -77,10 +69,10 @@ export function getMidasVaultDetails({ tooltip: "Annual Percentage Yield (APY) is the annual rate of return earned on an investment.", items: [ - { label: "Gross Annual", value: "4% (est.)" }, - { label: "Net Annual", value: "3% (est.)" }, - { label: "Net Monthly", value: "0.87% (est.)" }, - { label: "Net Weekly", value: "0.20% (est.)" }, + { label: "Gross Annual", value: "0%" }, + { label: "Net Annual", value: "0%" }, + { label: "Net Monthly", value: "0%" }, + { label: "Net Weekly", value: "0%" }, ], }, { @@ -132,81 +124,46 @@ export function getMidasVaultDetails({ label: "Transparency", items: [ { - label: "BTC-Neutral Blended Yield Vault", + label: "Available BTC (tBTC) Liquidity", value: ( - - - {addressUtils.truncateAddress( - vaults.VAULT_PROVIDERS.tbtc.address, - )} - - - - ), - }, - { - label: "Assets to be Deployed", - value: ( - - + + {addressUtils.truncateAddress( - transparency.ASSETS_TO_BE_DEPLOYED, + transparency.AVAILABLE_LIQUIDITY_BUFFER, )} - + ), }, { - label: "Onchain Wallets", + label: "AcreBTC", value: ( - - - {addressUtils.truncateAddress(transparency.ONCHAIN_WALLETS)} - + + + {addressUtils.truncateAddress(transparency.ACREBTC_TOKEN)} + - + ), }, { - label: "Available Liquidity Buffer", + label: "Withdrawal Queue", value: ( - - - {addressUtils.truncateAddress( - transparency.AVAILABLE_LIQUIDITY_BUFFER, - )} - + + + {addressUtils.truncateAddress(transparency.WITHDRAWAL_QUEUE)} + - + ), }, ], @@ -215,22 +172,7 @@ export function getMidasVaultDetails({ sectionKey: "misc", items: [ { - label: "Risk Manager", - value: ( - - ), - }, - { - label: "Vault Infrastructure Provider", + label: "Infrastructure Provider", value: (