From f0ff7afba16a875e7ed791fdfd93ad1e7aed0180 Mon Sep 17 00:00:00 2001 From: Polybius93 Date: Tue, 27 Jun 2023 12:22:51 +0200 Subject: [PATCH] feat: extended rpcmethods with bitcoin contract related case, added routes and success/failure pages --- .../send/broadcast-error/broadcast-error.tsx | 8 ++- .../locked-bitcoin-summary.tsx | 65 +++++++++++++++++ src/app/routes/app-routes.tsx | 14 ++++ .../messaging/rpc-message-handler.ts | 6 ++ .../rpc-methods/accept-bitcoin-contract.ts | 70 +++++++++++++++++++ src/shared/route-urls.ts | 6 ++ .../rpc/methods/accept-bitcoin-contract.ts | 26 +++++++ src/shared/rpc/rpc-methods.ts | 3 +- 8 files changed, 194 insertions(+), 4 deletions(-) create mode 100644 src/app/pages/send/locked-bitcoin-summary/locked-bitcoin-summary.tsx create mode 100644 src/background/messaging/rpc-methods/accept-bitcoin-contract.ts create mode 100644 src/shared/rpc/methods/accept-bitcoin-contract.ts diff --git a/src/app/pages/send/broadcast-error/broadcast-error.tsx b/src/app/pages/send/broadcast-error/broadcast-error.tsx index 4a5687ff..18e36460 100644 --- a/src/app/pages/send/broadcast-error/broadcast-error.tsx +++ b/src/app/pages/send/broadcast-error/broadcast-error.tsx @@ -11,16 +11,18 @@ export function BroadcastError() { const { state } = useLocation(); const analytics = useAnalytics(); const msg = get(state, 'error.message', 'Unknown error response'); + const title = get(state, 'title', 'There was an error broadcasting your transaction'); + const body = get(state, 'body', 'Unable to broadcast transaction'); - useOnMount(() => void analytics.track('bitcoin_broadcast_tx_error', { msg })); + useOnMount(() => void analytics.track('bitcoin_contract_error', { msg })); return ( ); } diff --git a/src/app/pages/send/locked-bitcoin-summary/locked-bitcoin-summary.tsx b/src/app/pages/send/locked-bitcoin-summary/locked-bitcoin-summary.tsx new file mode 100644 index 00000000..360ca8a9 --- /dev/null +++ b/src/app/pages/send/locked-bitcoin-summary/locked-bitcoin-summary.tsx @@ -0,0 +1,65 @@ +import { toast } from 'react-hot-toast'; +import { FiCheck, FiCopy, FiExternalLink } from 'react-icons/fi'; +import { useLocation } from 'react-router-dom'; + +import { Stack, useClipboard } from '@stacks/ui'; +import { Text } from '@stacks/ui'; + +import { useAnalytics } from '@app/common/hooks/analytics/use-analytics'; +import { useExplorerLink } from '@app/common/hooks/use-explorer-link'; +import { useRouteHeader } from '@app/common/hooks/use-route-header'; +import { satToBtc } from '@app/common/money/unit-conversion'; +import { + InfoCard, + InfoCardAssetValue, + InfoCardBtn, + InfoCardFooter, +} from '@app/components/info-card/info-card'; +import { ModalHeader } from '@app/components/modal-header'; + +export function LockBitcoinSummary() { + const { state } = useLocation(); + + const { txId, txMoney, txFiatValue, txFiatValueSymbol, symbol, txLink } = state; + + const { onCopy } = useClipboard(txId); + const { handleOpenTxLink } = useExplorerLink(); + const analytics = useAnalytics(); + + function onClickLink() { + void analytics.track('view_transaction_confirmation', { symbol: 'BTC' }); + handleOpenTxLink(txLink); + } + + function onClickCopy() { + onCopy(); + toast.success('ID copied!'); + } + + useRouteHeader(); + + return ( + + + + Success! Your bitcoin has been locked securely. All + that's left is for it to be confirmed on the blockchain. After confirmation, you can proceed + with borrowing against it. + + + + + + + + + ); +} diff --git a/src/app/routes/app-routes.tsx b/src/app/routes/app-routes.tsx index a43d09a1..706dc544 100644 --- a/src/app/routes/app-routes.tsx +++ b/src/app/routes/app-routes.tsx @@ -24,6 +24,7 @@ import { AddNetwork } from '@app/features/message-signer/add-network/add-network import { RetrieveTaprootToNativeSegwit } from '@app/features/retrieve-taproot-to-native-segwit/retrieve-taproot-to-native-segwit'; import { ThemesDrawer } from '@app/features/theme-drawer/theme-drawer'; import { AllowDiagnosticsPage } from '@app/pages/allow-diagnostics/allow-diagnostics'; +import { BitcoinContractRequest } from '@app/pages/bitcoin-contract-request/bitcoin-contract-request'; import { ChooseAccount } from '@app/pages/choose-account/choose-account'; import { FundPage } from '@app/pages/fund/fund'; import { Home } from '@app/pages/home/home'; @@ -42,6 +43,7 @@ import { rpcSendTransferRoutes } from '@app/pages/rpc-send-transfer/rpc-send-tra import { RpcSignPsbt } from '@app/pages/rpc-sign-psbt/rpc-sign-psbt'; import { SelectNetwork } from '@app/pages/select-network/select-network'; import { BroadcastError } from '@app/pages/send/broadcast-error/broadcast-error'; +import { LockBitcoinSummary } from '@app/pages/send/locked-bitcoin-summary/locked-bitcoin-summary'; import { SendInscriptionContainer } from '@app/pages/send/ordinal-inscription/components/send-inscription-container'; import { SendInscriptionChooseFee } from '@app/pages/send/ordinal-inscription/send-inscription-choose-fee'; import { SendInscriptionForm } from '@app/pages/send/ordinal-inscription/send-inscription-form'; @@ -136,6 +138,18 @@ function useAppRoutes() { {settingsModalRoutes} {ledgerStacksTxSigningRoutes} + + }> + + + + } + > + } /> + } /> ; +type BitcoinContractResponse = RpcResponse; +export type AcceptBitcoinContract = DefineRpcMethod< + BitcoinContractRequest, + BitcoinContractResponse +>; diff --git a/src/shared/rpc/rpc-methods.ts b/src/shared/rpc/rpc-methods.ts index c55d4292..6c4a61f3 100644 --- a/src/shared/rpc/rpc-methods.ts +++ b/src/shared/rpc/rpc-methods.ts @@ -2,11 +2,12 @@ import { BtcKitMethodMap, ExtractErrorResponse, ExtractSuccessResponse } from '@ import { ValueOf } from '@shared/utils/type-utils'; +import { AcceptBitcoinContract } from './methods/accept-bitcoin-contract'; import { SignPsbt } from './methods/sign-psbt'; import { SupportedMethods } from './methods/supported-methods'; // Supports BtcKit methods, as well as custom Hiro Wallet methods -export type WalletMethodMap = BtcKitMethodMap & SupportedMethods & SignPsbt; +export type WalletMethodMap = BtcKitMethodMap & SupportedMethods & SignPsbt & AcceptBitcoinContract; export type WalletRequests = ValueOf['request']; export type WalletResponses = ValueOf['response'];