Skip to content

Commit bf09dd4

Browse files
committed
feat: support stake key message signing
1 parent 56e3ff7 commit bf09dd4

File tree

3 files changed

+44
-10
lines changed

3 files changed

+44
-10
lines changed

apps/browser-extension-wallet/src/views/browser-view/features/sign-message/useSignMessageState.tsx

Lines changed: 22 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ import { useSecrets } from '@lace/core';
1313
import { parseError } from '@src/utils/parse-error';
1414

1515
interface SignMessageState {
16-
usedAddresses: { address: string; id: number }[];
16+
usedAddresses: { address: string; id: number; type: 'payment' | 'stake' }[];
1717
isSigningInProgress: boolean;
1818
signatureObject: Cip30DataSignature | undefined;
1919
error: string;
@@ -37,6 +37,7 @@ export const useSignMessageState = (): SignMessageState => {
3737
const [hardwareWalletError, setHardwareWalletError] = useState<string>('');
3838

3939
const addresses = useObservable(inMemoryWallet?.addresses$);
40+
const rewardAccounts = useObservable(inMemoryWallet?.delegation.rewardAccounts$);
4041

4142
const resetSigningState = useCallback(() => {
4243
setIsSigningInProgress(false);
@@ -57,10 +58,16 @@ export const useSignMessageState = (): SignMessageState => {
5758
isHardwareWallet
5859
? analytics.sendEventToPostHog(PostHogAction.SignMessageAskingHardwareWalletInteraction)
5960
: analytics.sendEventToPostHog(PostHogAction.SignMessageAskingForPassword);
61+
62+
// Determine if the address is a payment address or reward account
63+
const isRewardAccount = Wallet.Cardano.isRewardAccount(address);
64+
6065
const signatureGenerated = await withSignDataConfirmation(
6166
async () =>
6267
await inMemoryWallet.signData({
63-
signWith: address as Wallet.Cardano.PaymentAddress,
68+
signWith: isRewardAccount
69+
? (address as Wallet.Cardano.RewardAccount)
70+
: (address as Wallet.Cardano.PaymentAddress),
6471
payload
6572
}),
6673
!isHardwareWallet ? password : {},
@@ -92,11 +99,20 @@ export const useSignMessageState = (): SignMessageState => {
9299
[isHardwareWallet, analytics, clearSecrets, inMemoryWallet, t]
93100
);
94101

95-
const usedAddresses =
96-
addresses?.map((address, index) => ({
102+
const usedAddresses = [
103+
// Payment addresses
104+
...(addresses?.map((address, index) => ({
97105
address: address.address.toString(),
98-
id: index
99-
})) || [];
106+
id: index,
107+
type: 'payment' as const
108+
})) || []),
109+
// Reward accounts (stake addresses)
110+
...(rewardAccounts?.map((rewardAccount, index) => ({
111+
address: rewardAccount.address,
112+
id: addresses?.length ? addresses.length + index : index,
113+
type: 'stake' as const
114+
})) || [])
115+
];
100116

101117
return {
102118
usedAddresses,

packages/core/src/ui/components/WalletOwnAddressesDropdown/WalletOwnAddressDropdown.tsx

Lines changed: 20 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ import { useTranslation } from 'react-i18next';
99
export interface AddressSchema {
1010
id: number;
1111
address: string;
12+
type?: 'payment' | 'stake';
1213
}
1314

1415
export type WalletOwnAddressDropdownProps = {
@@ -40,10 +41,25 @@ export const WalletOwnAddressDropdown = ({
4041
}
4142
};
4243

43-
const items: MenuProps['items'] = addresses.map((address) => ({
44-
key: address.id.toString(),
45-
label: addEllipsis(address.address, FIRST_PART_ADDRESS_LENGTH, LAST_PART_ADDRESS_LENGTH)
46-
}));
44+
const getAddressTypeDisplay = (addressType?: 'payment' | 'stake'): string => {
45+
if (addressType === 'stake') {
46+
return ` (${t('core.signMessage.addressTypeStake')})`;
47+
}
48+
if (addressType === 'payment') {
49+
return ` (${t('core.signMessage.addressTypePayment')})`;
50+
}
51+
return '';
52+
};
53+
54+
const items: MenuProps['items'] = addresses.map((address) => {
55+
const shortenedAddress = addEllipsis(address.address, FIRST_PART_ADDRESS_LENGTH, LAST_PART_ADDRESS_LENGTH);
56+
const addressType = getAddressTypeDisplay(address.type);
57+
58+
return {
59+
key: address.id.toString(),
60+
label: `${shortenedAddress}${addressType}`
61+
};
62+
});
4763

4864
const menuProps: MenuProps = {
4965
items,

packages/translation/src/lib/translations/core/en.json

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -237,6 +237,8 @@
237237
"core.signMessage.signButton": "Sign message",
238238
"core.signMessage.signWithHardwareWalletButton": "Sign message with hardware wallet",
239239
"core.signMessage.hardwareWalletNotConnected": "Make sure your hardware wallet is connected and unlocked.",
240+
"core.signMessage.addressTypePayment": "Payment",
241+
"core.signMessage.addressTypeStake": "Stake",
240242
"core.Burn.title": "Confirm transaction",
241243
"core.coinInputSelection.assetSelection": "Select tokens or NFTs",
242244
"core.coinInputSelection.nfts": "NFTs",

0 commit comments

Comments
 (0)