Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -9,3 +9,4 @@ deployment-keyguard-next
dist
.ts-out
src/translations/index.js
CLAUDE.md
23 changes: 18 additions & 5 deletions client/src/PublicRequest.ts
Original file line number Diff line number Diff line change
Expand Up @@ -55,6 +55,9 @@ export type TransactionInfo = {
flags?: number,
};

// TransactionInfo without keyPath (keyPath is at request level for multi-transaction support)
export type TransactionData = Omit<TransactionInfo, 'keyPath'>;

export enum BitcoinTransactionInputType {
STANDARD = 'standard',
HTLC_REDEEM = 'htlc-redeem',
Expand Down Expand Up @@ -167,10 +170,17 @@ export type ExportResult = {

type SignTransactionRequestCommon = SimpleRequest & TransactionInfo;

export type SignTransactionRequestStandard = SignTransactionRequestCommon & {
// Standard layout supports both single and multiple transactions
export type SignTransactionRequestStandard = SimpleRequest & {
keyPath: string,
layout?: 'standard',
recipientLabel?: string,
};
recipientLabel?: string, // Only used for single-tx display
} & (
// Option A: Single transaction (backward compatible - fields directly on request)
TransactionData |
// Option B: Multiple transactions
{ transactions: TransactionData[] | Uint8Array[] }
);
Comment on lines 171 to +183
Copy link
Copy Markdown
Member

@danimoh danimoh Apr 13, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The name SignTransactionRequestCommon is not adequate anymore if it's not used in SignTransactionRequestStandard anymore, as it's then in fact not common to all SignTransactionRequests.
This can be circumvented by actually using the type here, as is still proves useful:

export type SignTransactionRequestStandard = (
    SignTransactionRequestCommon
    | (SimpleRequest & {
        keyPath: string,
        transactions: TransactionData[] | Uint8Array[],
    })
) & {
    layout?: 'standard',
    recipientLabel?: string, // Only used for single-tx display
};

Or to go further, and explicitly allow senderLabel and recipientLabel only for a single transaction:

Suggested change
type SignTransactionRequestCommon = SimpleRequest & TransactionInfo;
export type SignTransactionRequestStandard = SignTransactionRequestCommon & {
// Standard layout supports both single and multiple transactions
export type SignTransactionRequestStandard = SimpleRequest & {
keyPath: string,
layout?: 'standard',
recipientLabel?: string,
};
recipientLabel?: string, // Only used for single-tx display
} & (
// Option A: Single transaction (backward compatible - fields directly on request)
TransactionData |
// Option B: Multiple transactions
{ transactions: TransactionData[] | Uint8Array[] }
);
export type SignTransactionRequestStandard = ((
// Legacy request type for a single transaction
SignTransactionRequestCommon & {
recipientLabel?: string,
}
) | (
// New request type for a single transaction. senderLabel and recipientLabel are supported.
SimpleRequest & {
keyPath: string,
recipientLabel?: string,
transactions: [TransactionData] | [Uint8Array],
}
) | (
// New request type for multiple transactions. senderLabel and recipientLabel are not supported
SimpleRequest & {
keyPath: string,
transactions: Omit<TransactionData, 'senderLabel'>[] | Uint8Array[],
}
)) & {
layout?: 'standard',
};


export type SignTransactionRequestCheckout = SignTransactionRequestCommon & {
layout: 'checkout',
Expand Down Expand Up @@ -616,6 +626,8 @@ export type ListLegacyResult = LegacyKeyInfoObject[];
export type SignTransactionResult = SignatureResult & {
serializedTx: Uint8Array,
};
// Array result type for multi-transaction signing
export type SignTransactionResults = SignTransactionResult[];
Comment on lines +629 to +630
Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Not sure whether it's worth introducing a type alias for this. Imo, just using SignTransactionResult[] would also be fine.

export type SignStakingResult = SignatureResult & {
transaction: Uint8Array,
};
Expand Down Expand Up @@ -653,6 +665,7 @@ export type RedirectResult
| SignatureResult
| ConnectResult
| SignTransactionResult
| SignTransactionResults
| SignStakingResult[]
| SignedBitcoinTransaction
| SignedPolygonTransaction
Expand All @@ -667,7 +680,7 @@ export type Result = RedirectResult | IFrameResult;

export type ResultType<T extends RedirectRequest> =
T extends Is<T, SignMessageRequest> ? SignatureResult :
T extends Is<T, SignTransactionRequest> ? SignTransactionResult :
T extends Is<T, SignTransactionRequest> ? SignTransactionResult | SignTransactionResults :
T extends Is<T, SignMultisigTransactionRequest> ? SignatureResult :
T extends Is<T, SignStakingRequest> ? SignStakingResult[] :
T extends Is<T, ConnectRequest> ? ConnectResult :
Expand All @@ -684,7 +697,7 @@ export type ResultType<T extends RedirectRequest> =

export type ResultByCommand<T extends KeyguardCommand> =
T extends KeyguardCommand.SIGN_MESSAGE ? SignatureResult :
T extends KeyguardCommand.SIGN_TRANSACTION ? SignTransactionResult :
T extends KeyguardCommand.SIGN_TRANSACTION ? SignTransactionResult | SignTransactionResults :
T extends KeyguardCommand.SIGN_MULTISIG_TRANSACTION ? SignatureResult :
T extends KeyguardCommand.SIGN_STAKING ? SignStakingResult[] :
T extends KeyguardCommand.CONNECT_ACCOUNT ? ConnectResult :
Expand Down
Loading
Loading