Skip to content

Commit

Permalink
feat: move transaction models to it's own file, rename funding to dep…
Browse files Browse the repository at this point in the history
…osit
  • Loading branch information
Polybius93 committed Feb 14, 2025
1 parent d0488ab commit 257a506
Show file tree
Hide file tree
Showing 8 changed files with 72 additions and 120 deletions.
42 changes: 0 additions & 42 deletions netlify/functions/fetch-attestor-group-public-key.ts

This file was deleted.

Original file line number Diff line number Diff line change
Expand Up @@ -18,15 +18,15 @@ import { modalActions } from '@store/slices/modal/modal.actions';
import { NetworkType } from '@shared/constants/network.constants';

interface DepositTransactionScreenProps {
handleSignFundingTransaction: (vaultUUID: string, depositAmount: number) => Promise<void>;
handleSignDepositTransaction: (vaultUUID: string, depositAmount: number) => Promise<void>;
isBitcoinWalletLoading: [boolean, string];
userEthereumAddressRiskLevel: string;
fetchUserEthereumAddressRiskLevel: () => Promise<string>;
isUserEthereumAddressRiskLevelLoading: boolean;
}

export function DepositTransactionScreen({
handleSignFundingTransaction,
handleSignDepositTransaction,
isBitcoinWalletLoading,
userEthereumAddressRiskLevel,
fetchUserEthereumAddressRiskLevel,
Expand Down Expand Up @@ -62,7 +62,7 @@ export function DepositTransactionScreen({
const currentRisk = await fetchUserEthereumAddressRiskLevel();
if (currentRisk === 'High') throw new Error('Risk Level is too high');
}
await handleSignFundingTransaction(currentVault.uuid, depositAmount);
await handleSignDepositTransaction(currentVault.uuid, depositAmount);
} catch (error: any) {
setIsSubmitting(false);
toast({
Expand Down
4 changes: 2 additions & 2 deletions src/app/components/mint-unmint/components/mint/mint.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@ import { Walkthrough } from '../walkthrough/walkthrough';
import { MintLayout } from './components/mint.layout';

export function Mint(): React.JSX.Element {
const { handleSignFundingTransaction, isLoading: isBitcoinWalletLoading } = usePSBT();
const { handleSignDepositTransaction, isLoading: isBitcoinWalletLoading } = usePSBT();
const { networkType } = useContext(NetworkConfigurationContext);

const { mintStep } = useSelector((state: RootState) => state.mintunmint);
Expand All @@ -28,7 +28,7 @@ export function Mint(): React.JSX.Element {
{[0].includes(mintStep.step) && <SetupVaultScreen />}
{[1, 2].includes(mintStep.step) && (
<DepositTransactionScreen
handleSignFundingTransaction={handleSignFundingTransaction}
handleSignDepositTransaction={handleSignDepositTransaction}
isBitcoinWalletLoading={isBitcoinWalletLoading ?? [false, '']}
userEthereumAddressRiskLevel={risk!}
fetchUserEthereumAddressRiskLevel={fetchUserAddressRisk}
Expand Down
16 changes: 0 additions & 16 deletions src/app/functions/attestor-request.functions.ts

This file was deleted.

1 change: 0 additions & 1 deletion src/app/hooks/use-ledger.ts
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,6 @@ import { LedgerError } from '@models/error-types';
import { LEDGER_APPS_MAP } from '@models/ledger';
import { SupportedPaymentType } from '@models/supported-payment-types';
import { BitcoinWalletAction, BitcoinWalletType } from '@models/wallet';
import { bytesToHex } from '@noble/hashes/utils';
import {
BitcoinWalletContext,
BitcoinWalletContextState,
Expand Down
83 changes: 28 additions & 55 deletions src/app/hooks/use-psbt.ts
Original file line number Diff line number Diff line change
@@ -1,6 +1,13 @@
import { useContext } from 'react';

import { BitcoinError } from '@models/error-types';
import {
HandlerType,
PSBTSubmissionParams,
TransactionHandlers,
TransactionParams,
TransactionType,
} from '@models/transaction.models';
import { BitcoinWalletType } from '@models/wallet';
import { bytesToHex } from '@noble/hashes/utils';
import { BitcoinWalletContext } from '@providers/bitcoin-wallet-context-provider';
Expand All @@ -9,7 +16,7 @@ import {
submitFundingPSBT,
submitWithdrawDepositPSBT,
} from 'dlc-btc-lib/attestor-request-functions';
import { AttestorChainID, RawVault, Transaction, VaultState } from 'dlc-btc-lib/models';
import { VaultState } from 'dlc-btc-lib/models';
import { equals } from 'ramda';

import { useAttestorChainID } from './use-attestor-chain-id';
Expand All @@ -21,47 +28,14 @@ import { useLedger } from './use-ledger';
import { useUnisatFordefi } from './use-unisat-fordefi';
import { useUserAddress } from './use-user-address';

interface TransactionParams {
vault: RawVault;
amount: number;
extendedAttestorGroupPublicKey: string;
feeRecipient: string;
bitcoinFeeRateMultiplier: number;
}

type TransactionHandler = (
vault: RawVault,
amount: number,
extendedAttestorGroupPublicKey: string,
feeRecipient: string,
bitcoinFeeRateMultiplier: number
) => Promise<Transaction>;

interface PSBTSubmissionParams {
transaction: Transaction;
vault: RawVault;
userAddress: string;
dlcHandler: LeatherDLCHandler | LedgerDLCHandler | UnisatFordefiDLCHandler;
coordinatorURL: string;
attestorChainID: AttestorChainID;
}

interface TransactionHandlers {
handleFundingTransaction: Record<BitcoinWalletType, TransactionHandler>;
handleWithdrawTransaction: Record<BitcoinWalletType, TransactionHandler>;
handleDepositTransaction: Record<BitcoinWalletType, TransactionHandler>;
}

type HandlerType = keyof TransactionHandlers;

interface RequiredDependencies {
dlcHandler: LeatherDLCHandler | LedgerDLCHandler | UnisatFordefiDLCHandler;
bitcoinWalletType: BitcoinWalletType;
userAddress: string;
}

interface UsePSBTReturnType {
handleSignFundingTransaction: (vaultUUID: string, depositAmount: number) => Promise<void>;
handleSignDepositTransaction: (vaultUUID: string, depositAmount: number) => Promise<void>;
handleSignWithdrawTransaction: (vaultUUID: string, withdrawAmount: number) => Promise<void>;
isLoading: [boolean, string] | undefined;
}
Expand Down Expand Up @@ -116,18 +90,21 @@ export function usePSBT(): UsePSBTReturnType {
}: PSBTSubmissionParams): Promise<void> => {
const transactionPSBT = bytesToHex(transaction.toPSBT());

return equals(vault.status, VaultState.READY)
? submitFundingPSBT([coordinatorURL], {
switch (equals(vault.status, VaultState.READY)) {
case true:
return submitFundingPSBT([coordinatorURL], {
vaultUUID: vault.uuid,
fundingPSBT: transactionPSBT,
userEthereumAddress: userAddress,
userBitcoinTaprootPublicKey: dlcHandler.getUserTaprootPublicKey(),
attestorChainID,
})
: submitWithdrawDepositPSBT([coordinatorURL], {
});
default:
return submitWithdrawDepositPSBT([coordinatorURL], {
vaultUUID: vault.uuid,
withdrawDepositPSBT: transactionPSBT,
});
}
};

const getPSBTParameters = async (
Expand Down Expand Up @@ -157,17 +134,19 @@ export function usePSBT(): UsePSBTReturnType {
return { dlcHandler, bitcoinWalletType, userAddress };
};

const throwTransactionError = (type: TransactionType, error: any): never => {
if (error instanceof Error) {
throw new BitcoinError(`Error signing ${type} Transaction: ${error.message}`);
}
throw new BitcoinError(`Unknown error signing ${type} Transaction`);
};

const handlerTypeMap = {
withdraw: (): HandlerType => 'handleWithdrawTransaction',
funding: (valueLocked: number): HandlerType =>
deposit: (valueLocked: number): HandlerType =>
equals(valueLocked, 0) ? 'handleFundingTransaction' : 'handleDepositTransaction',
} as const;

const getHandlerType = (type: TransactionType, valueLocked: number): HandlerType =>
handlerTypeMap[type](valueLocked);

type TransactionType = 'withdraw' | 'funding';

const createTransactionHandler =
(type: TransactionType) =>
async (vaultUUID: string, value: number): Promise<void> => {
Expand All @@ -182,7 +161,7 @@ export function usePSBT(): UsePSBTReturnType {
bitcoinFeeRateMultiplier,
} = await getPSBTParameters(vaultUUID, value);

const handlerType = getHandlerType(type, vault.valueLocked.toNumber());
const handlerType = handlerTypeMap[type](vault.valueLocked.toNumber());

const transactionHandler = transactionHandlers[handlerType][bitcoinWalletType];

Expand All @@ -205,16 +184,10 @@ export function usePSBT(): UsePSBTReturnType {

resetBitcoinWalletContext();
} catch (error) {
if (error instanceof Error) {
throw new BitcoinError(`Error signing ${type} Transaction: ${error.message}`);
}
throw new BitcoinError(`Unknown error signing ${type} Transaction`);
throwTransactionError(type, error);
}
};

const handleSignFundingTransaction = createTransactionHandler('funding');
const handleSignWithdrawTransaction = createTransactionHandler('withdraw');

const loadingStates = {
[BitcoinWalletType.Ledger]: ledgerTransactionHandler.isLoading,
[BitcoinWalletType.Leather]: leatherTransactionHandler.isLoading,
Expand All @@ -223,8 +196,8 @@ export function usePSBT(): UsePSBTReturnType {
};

return {
handleSignFundingTransaction,
handleSignWithdrawTransaction,
handleSignDepositTransaction: createTransactionHandler('deposit'),
handleSignWithdrawTransaction: createTransactionHandler('withdraw'),
isLoading: loadingStates[bitcoinWalletType!],
};
}
1 change: 0 additions & 1 deletion src/app/hooks/use-unisat-fordefi.ts
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,6 @@ import { ALL_SUPPORTED_BITCOIN_NETWORK_PREFIX } from '@models/configuration';
import { UnisatFordefiError } from '@models/error-types';
import { BitcoinTaprootAccount } from '@models/software-wallet.models';
import { BitcoinWalletAction, BitcoinWalletType } from '@models/wallet';
import { bytesToHex } from '@noble/hashes/utils';
import {
BitcoinWalletContext,
BitcoinWalletContextState,
Expand Down
39 changes: 39 additions & 0 deletions src/shared/models/transaction.models.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@
import { LeatherDLCHandler, LedgerDLCHandler, UnisatFordefiDLCHandler } from 'dlc-btc-lib';
import { AttestorChainID, RawVault, Transaction } from 'dlc-btc-lib/models';

import { BitcoinWalletType } from './wallet';

export interface TransactionParams {
vault: RawVault;
amount: number;
extendedAttestorGroupPublicKey: string;
feeRecipient: string;
bitcoinFeeRateMultiplier: number;
}

type TransactionHandler = (
vault: RawVault,
amount: number,
extendedAttestorGroupPublicKey: string,
feeRecipient: string,
bitcoinFeeRateMultiplier: number
) => Promise<Transaction>;

export interface PSBTSubmissionParams {
transaction: Transaction;
vault: RawVault;
userAddress: string;
dlcHandler: LeatherDLCHandler | LedgerDLCHandler | UnisatFordefiDLCHandler;
coordinatorURL: string;
attestorChainID: AttestorChainID;
}

export interface TransactionHandlers {
handleFundingTransaction: Record<BitcoinWalletType, TransactionHandler>;
handleWithdrawTransaction: Record<BitcoinWalletType, TransactionHandler>;
handleDepositTransaction: Record<BitcoinWalletType, TransactionHandler>;
}

export type HandlerType = keyof TransactionHandlers;

export type TransactionType = 'withdraw' | 'deposit';

0 comments on commit 257a506

Please sign in to comment.