Skip to content

Commit 3dbb640

Browse files
committed
Merge branch 'main' into test/test_maintenance_25_Jan
2 parents cd9d5b0 + e9fc484 commit 3dbb640

File tree

33 files changed

+371
-278
lines changed

33 files changed

+371
-278
lines changed

apps/browser-extension-wallet/package.json

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -41,15 +41,15 @@
4141
},
4242
"dependencies": {
4343
"@ant-design/icons": "^4.7.0",
44-
"@cardano-sdk/cardano-services-client": "0.23.6",
45-
"@cardano-sdk/core": "0.43.0",
46-
"@cardano-sdk/dapp-connector": "0.13.1",
47-
"@cardano-sdk/input-selection": "0.13.34",
48-
"@cardano-sdk/tx-construction": "0.24.4",
44+
"@cardano-sdk/cardano-services-client": "0.26.0",
45+
"@cardano-sdk/core": "0.45.0",
46+
"@cardano-sdk/dapp-connector": "0.13.3",
47+
"@cardano-sdk/input-selection": "0.14.1",
48+
"@cardano-sdk/tx-construction": "0.26.0",
4949
"@cardano-sdk/util": "0.15.5",
50-
"@cardano-sdk/util-rxjs": "0.9.2",
51-
"@cardano-sdk/wallet": "0.49.2",
52-
"@cardano-sdk/web-extension": "0.37.5",
50+
"@cardano-sdk/util-rxjs": "0.9.4",
51+
"@cardano-sdk/wallet": "0.51.3",
52+
"@cardano-sdk/web-extension": "0.38.3",
5353
"@emurgo/cip14-js": "~3.0.1",
5454
"@input-output-hk/lace-ui-toolkit": "1.21.0",
5555
"@lace/cardano": "0.1.0",
@@ -104,7 +104,7 @@
104104
"zustand": "3.5.14"
105105
},
106106
"devDependencies": {
107-
"@cardano-sdk/hardware-ledger": "0.13.2",
107+
"@cardano-sdk/hardware-ledger": "0.15.0",
108108
"@emurgo/cardano-message-signing-asmjs": "1.0.1",
109109
"@openpgp/web-stream-tools": "0.0.11-patch-0",
110110
"@pdfme/common": "^4.0.2",

apps/browser-extension-wallet/src/features/activity/components/Activity.tsx

Lines changed: 14 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ import { walletRoutePaths } from '@routes';
1212
import { PostHogAction } from '@providers/AnalyticsProvider/analyticsTracker';
1313
import { useAnalyticsContext } from '@providers';
1414
import { useWalletActivities } from '@hooks/useWalletActivities';
15+
import { Flex, Text } from '@input-output-hk/lace-ui-toolkit';
1516

1617
export const Activity = (): React.ReactElement => {
1718
const { t } = useTranslation();
@@ -24,9 +25,12 @@ export const Activity = (): React.ReactElement => {
2425
const sendAnalytics = useCallback(() => {
2526
analytics.sendEventToPostHog(PostHogAction.ActivityActivityActivityRowClick);
2627
}, [analytics]);
27-
const { walletActivities, walletActivitiesStatus, activitiesCount } = useWalletActivities({ sendAnalytics });
28+
const { walletActivities, walletActivitiesStatus } = useWalletActivities({
29+
sendAnalytics,
30+
withLimitedRewardsHistory: true
31+
});
2832

29-
const layoutSideText = `(${activitiesCount})`;
33+
const layoutSideText = `(${t('browserView.activity.titleSideText')})`;
3034
const isLoading = walletActivitiesStatus !== StateStatus.LOADED;
3135
const hasActivities = walletActivities?.length > 0;
3236

@@ -53,7 +57,14 @@ export const Activity = (): React.ReactElement => {
5357
{hasActivities ? (
5458
<GroupedAssetActivityList
5559
lists={walletActivities}
56-
infiniteScrollProps={{ scrollableTarget: 'contentLayout' }}
60+
infiniteScrollProps={{
61+
scrollableTarget: 'contentLayout',
62+
endMessage: (
63+
<Flex justifyContent="center">
64+
<Text.Label>{t('walletActivity.endMessage')}</Text.Label>
65+
</Flex>
66+
)
67+
}}
5768
/>
5869
) : (
5970
<div className={styles.emptyState}>

apps/browser-extension-wallet/src/hooks/useWalletActivities.ts

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -6,12 +6,14 @@ import noop from 'lodash/noop';
66

77
type UseWalletActivitiesProps = {
88
sendAnalytics: () => void;
9+
withLimitedRewardsHistory?: boolean;
910
};
1011
const noAnalyticsProps = { sendAnalytics: noop };
1112
type WalletActivities = Omit<WalletActivitiesSlice, 'getWalletActivities'>;
1213

1314
export const useWalletActivities = ({
14-
sendAnalytics
15+
sendAnalytics,
16+
withLimitedRewardsHistory
1517
}: UseWalletActivitiesProps = noAnalyticsProps): WalletActivities => {
1618
const { fiatCurrency } = useCurrencyStore();
1719
const { priceResult } = useFetchCoinPrice();
@@ -26,9 +28,10 @@ export const useWalletActivities = ({
2628
getWalletActivities({
2729
fiatCurrency,
2830
cardanoFiatPrice,
29-
sendAnalytics
31+
sendAnalytics,
32+
withLimitedRewardsHistory
3033
});
31-
}, [fiatCurrency, cardanoFiatPrice, getWalletActivities, sendAnalytics]);
34+
}, [fiatCurrency, cardanoFiatPrice, getWalletActivities, withLimitedRewardsHistory, sendAnalytics]);
3235

3336
useEffect(() => {
3437
fetchWalletActivities();

apps/browser-extension-wallet/src/hooks/useWalletManager.ts

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -167,13 +167,14 @@ const getExtendedAccountPublicKey = async (
167167
passphrase
168168
);
169169
const rootPrivateKeyBuffer = Buffer.from(rootPrivateKeyBytes);
170+
const bip32Ed25519 = await Wallet.getBip32Ed25519();
170171
const accountPrivateKey = await Wallet.KeyManagement.util.deriveAccountPrivateKey({
171-
bip32Ed25519: Wallet.bip32Ed25519,
172+
bip32Ed25519,
172173
accountIndex,
173174
rootPrivateKey: Wallet.Crypto.Bip32PrivateKeyHex(rootPrivateKeyBuffer.toString('hex')),
174175
purpose
175176
});
176-
const accountPublicKey = await Wallet.bip32Ed25519.getBip32PublicKey(accountPrivateKey);
177+
const accountPublicKey = bip32Ed25519.getBip32PublicKey(accountPrivateKey);
177178
clearBytes(passphrase);
178179
clearBytes(rootPrivateKeyBytes);
179180
clearBytes(rootPrivateKeyBuffer);
@@ -631,7 +632,7 @@ export const useWalletManager = (): UseWalletManager => {
631632
purpose: KeyManagement.KeyPurpose.STANDARD
632633
},
633634
{
634-
bip32Ed25519: Wallet.bip32Ed25519,
635+
bip32Ed25519: await Wallet.getBip32Ed25519(),
635636
logger
636637
}
637638
);

apps/browser-extension-wallet/src/lib/scripts/background/config.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -63,7 +63,7 @@ export const getProviders = async (chainName: Wallet.ChainName): Promise<Wallet.
6363
useDrepProviderOverrideActiveStatus: isExperimentEnabled(ExperimentName.USE_DREP_PROVIDER_OVERRIDE),
6464
useWebSocket: isExperimentEnabled(ExperimentName.WEBSOCKET_API),
6565
useBlockfrostAssetProvider: isExperimentEnabled(ExperimentName.BLOCKFROST_ASSET_PROVIDER),
66-
useBlockfrostChainHistoryProvider: isExperimentEnabled(ExperimentName.BLOCKFROST_CHAIN_HISTORY_PROVIDER),
66+
useBlockfrostChainHistoryProvider: true,
6767
useBlockfrostNetworkInfoProvider: isExperimentEnabled(ExperimentName.BLOCKFROST_NETWORK_INFO_PROVIDER),
6868
useBlockfrostRewardsProvider: isExperimentEnabled(ExperimentName.BLOCKFROST_REWARDS_PROVIDER),
6969
useBlockfrostTxSubmitProvider: isExperimentEnabled(ExperimentName.BLOCKFROST_TX_SUBMIT_PROVIDER),

apps/browser-extension-wallet/src/lib/scripts/background/storage/extension-document-store.ts

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@ export class ExtensionDocumentStore<T extends {}> extends ExtensionStore impleme
2929

3030
/**
3131
* @param docId unique document id within the store, used as extension storage key
32+
* @param logger
3233
*/
3334
constructor(protected docId: string, logger: Logger) {
3435
super(contextLogger(logger, `ExtensionStore(${docId})`));
@@ -44,6 +45,10 @@ export class ExtensionDocumentStore<T extends {}> extends ExtensionStore impleme
4445
);
4546
}
4647

48+
delete(): Observable<void> {
49+
return from(this.storage.remove(this.docId));
50+
}
51+
4752
get(): Observable<T> {
4853
return from(this.storage.get(this.docId)).pipe(
4954
mergeMap((values) => {

apps/browser-extension-wallet/src/lib/scripts/background/wallet.ts

Lines changed: 12 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -241,8 +241,9 @@ const pouchdbStoresFactory: StoresFactory = {
241241
inFlightTransactions: new storage.PouchDbInFlightTransactionsStore(docsDbName, 'transactionsInFlight_v3', logger),
242242
policyIds: new storage.PouchDbPolicyIdsStore(docsDbName, 'policyIds', logger),
243243
protocolParameters: new storage.PouchDbProtocolParametersStore(docsDbName, 'protocolParameters', logger),
244-
rewardsBalances: new storage.PouchDbRewardsBalancesStore(`${baseDbName}RewardsBalances`, logger),
245244
rewardsHistory: new storage.PouchDbRewardsHistoryStore(`${baseDbName}RewardsHistory`, logger),
245+
delegationPortfolio: new storage.PouchDbDelegationPortfolioStore(docsDbName, 'delegationPortfolio', logger),
246+
rewardAccountInfo: new storage.PouchDbRewardAccountInfoStore(`${baseDbName}RewardAccountsInfo`, logger),
246247
stakePools: new storage.PouchDbStakePoolsStore(`${baseDbName}StakePools`, logger),
247248
signedTransactions: new storage.PouchDbSignedTransactionsStore(baseDbName, 'signedTransactions', logger),
248249
tip: new storage.PouchDbTipStore(docsDbName, 'tip', logger),
@@ -294,7 +295,8 @@ export const extensionStorageStoresFactory: StoresFactory = {
294295
inFlightTransactions: new ExtensionDocumentStore(`${name}_transactionsInFlight`, logger),
295296
policyIds: new ExtensionDocumentStore(`${name}_handlePolicyIds`, logger),
296297
protocolParameters: new ExtensionDocumentStore(`${name}_protocolParameters`, logger),
297-
rewardsBalances: new ExtensionBlobKeyValueStore(`${name}_rewardsBalances`, logger),
298+
delegationPortfolio: new ExtensionDocumentStore(`${name}_delegationPortfolio`, logger),
299+
rewardAccountInfo: new ExtensionBlobKeyValueStore(`${name}_rewardAccountInfo`, logger),
298300
rewardsHistory: new ExtensionBlobKeyValueStore(`${name}_rewardsHistory`, logger),
299301
stakePools: new ExtensionBlobKeyValueStore(`${name}_stakePools`, logger),
300302
signedTransactions: new ExtensionDocumentStore(`${name}_signedTransactions`, logger),
@@ -306,26 +308,18 @@ export const extensionStorageStoresFactory: StoresFactory = {
306308
})
307309
};
308310

309-
// Used for migrations to get feature flags, which are enabled per chainId
310-
// This is coupled with WalletManager implementation (getWalletStoreId function)
311-
const getNetworkMagic = (storeName: string) => Number.parseInt(storeName.split('-')[1]) as Cardano.NetworkMagic;
312-
313311
const storesFactory: StoresFactory = {
314312
async create(props) {
315-
const featureFlags = await getFeatureFlags(getNetworkMagic(props.name));
316-
if (isExperimentEnabled(featureFlags, ExperimentName.EXTENSION_STORAGE)) {
317-
const extensionStores = await extensionStorageStoresFactory.create(props);
318-
if (await shouldAttemptWalletStoresMigration(extensionStores)) {
319-
const pouchdbStores = await pouchdbStoresFactory.create(props);
320-
if (await migrateWalletStores(pouchdbStores, extensionStores, logger)) {
321-
// TODO: safe to destroy pouchdb stores on successful migration
322-
// once EXTENSION_STORAGE experiment runs in production for some time
323-
// and we are sure that it's working well
324-
}
313+
const extensionStores = await extensionStorageStoresFactory.create(props);
314+
if (await shouldAttemptWalletStoresMigration(extensionStores)) {
315+
const pouchdbStores = await pouchdbStoresFactory.create(props);
316+
if (await migrateWalletStores(pouchdbStores, extensionStores, logger)) {
317+
// TODO: safe to destroy pouchdb stores on successful migration
318+
// once EXTENSION_STORAGE experiment runs in production for some time
319+
// and we are sure that it's working well
325320
}
326-
return extensionStores;
327321
}
328-
return pouchdbStoresFactory.create(props);
322+
return extensionStores;
329323
}
330324
};
331325

apps/browser-extension-wallet/src/lib/wallet-api-ui.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -55,7 +55,7 @@ export const walletRepository = consumeRemoteApi<WalletRepositoryApi<Wallet.Wall
5555
{ logger, runtime }
5656
);
5757

58-
export const keyAgentFactory = createKeyAgentFactory({ bip32Ed25519: Wallet.bip32Ed25519, logger });
58+
export const keyAgentFactory = createKeyAgentFactory({ getBip32Ed25519: Wallet.getBip32Ed25519, logger });
5959

6060
export const signingCoordinator = new SigningCoordinator<Wallet.WalletMetadata, Wallet.AccountMetadata>(
6161
{ hwOptions: { manifest: Wallet.manifest, communicationType: Wallet.KeyManagement.CommunicationType.Web } },

apps/browser-extension-wallet/src/stores/slices/blockchain-provider-slice.ts

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ export interface IBlockchainProvider {
1111
networkInfoProvider: Wallet.NetworkInfoProvider;
1212
utxoProvider: Wallet.UtxoProvider;
1313
chainHistoryProvider: Wallet.ChainHistoryProvider;
14+
rewardAccountInfoProvider: Wallet.RewardAccountInfoProvider;
1415
rewardsProvider: Wallet.RewardsProvider;
1516
drepProvider?: DRepProvider;
1617
inputResolver: Cardano.InputResolver;
@@ -25,6 +26,7 @@ export const IBlockchainProvider = {
2526
txSubmitProvider: providers?.txSubmitProvider,
2627
networkInfoProvider: providers?.networkInfoProvider,
2728
utxoProvider: providers?.utxoProvider,
29+
rewardAccountInfoProvider: providers?.rewardAccountInfoProvider,
2830
rewardsProvider: providers?.rewardsProvider,
2931
chainHistoryProvider: providers?.chainHistoryProvider,
3032
drepProvider: providers?.drepProvider,
@@ -36,6 +38,7 @@ export const IBlockchainProvider = {
3638
stakePoolProvider: providers?.stakePoolProvider,
3739
networkInfoProvider: providers?.networkInfoProvider,
3840
utxoProvider: providers?.utxoProvider,
41+
rewardAccountInfoProvider: providers?.rewardAccountInfoProvider,
3942
rewardsProvider: providers?.rewardsProvider,
4043
chainHistoryProvider: providers?.chainHistoryProvider,
4144
drepProvider: providers?.drepProvider,

apps/browser-extension-wallet/src/stores/slices/wallet-activities-slice.ts

Lines changed: 35 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,6 @@ import {
3939
} from '../types';
4040
import { getAssetsInformation } from '@src/utils/get-assets-information';
4141
import { rewardHistoryTransformer } from '@src/views/browser-view/features/activity/helpers/reward-history-transformer';
42-
import { createHistoricalOwnInputResolver } from '@src/utils/own-input-resolver';
4342
import { isKeyHashAddress } from '@cardano-sdk/wallet';
4443
import { ObservableWalletState } from '@hooks/useWalletState';
4544
import { IBlockchainProvider } from './blockchain-provider-slice';
@@ -49,6 +48,7 @@ export interface FetchWalletActivitiesProps {
4948
cardanoFiatPrice: number;
5049
assetId?: Wallet.Cardano.AssetId; // Allows to filter historicals tx by asset
5150
sendAnalytics?: () => void;
51+
withLimitedRewardsHistory?: boolean;
5252
}
5353

5454
interface FetchWalletActivitiesPropsWithSetter extends FetchWalletActivitiesProps {
@@ -124,18 +124,20 @@ const mapWalletActivities = memoize(
124124
assetInfo,
125125
delegation: { rewardsHistory }
126126
}: ObservableWalletState,
127-
{ fiatCurrency, cardanoFiatPrice, sendAnalytics }: FetchWalletActivitiesProps,
127+
{ fiatCurrency, cardanoFiatPrice, sendAnalytics, withLimitedRewardsHistory = false }: FetchWalletActivitiesProps,
128128
{
129129
assetDetails,
130130
assetProvider,
131131
cardanoCoin,
132132
setRewardsActivityDetail,
133133
setTransactionActivityDetail,
134-
isSharedWallet
134+
isSharedWallet,
135+
inputResolver
135136
}: Pick<UISlice['walletUI'], 'cardanoCoin'> &
136137
Pick<ActivityDetailSlice, 'setRewardsActivityDetail' | 'setTransactionActivityDetail'> &
137138
Pick<AssetDetailsSlice, 'assetDetails'> &
138139
Pick<IBlockchainProvider, 'assetProvider'> &
140+
Pick<IBlockchainProvider, 'inputResolver'> &
139141
Pick<WalletInfoSlice, 'isSharedWallet'>
140142
) => {
141143
const epochRewardsMapper = (earnedEpoch: Wallet.Cardano.EpochNo, rewards: Reward[]): ExtendedActivityProps => {
@@ -167,7 +169,6 @@ const mapWalletActivities = memoize(
167169
};
168170
};
169171

170-
const inputResolver = createHistoricalOwnInputResolver({ addresses, transactions });
171172
const resolveInput = inputResolver.resolveInput;
172173

173174
// eslint-disable-next-line unicorn/no-array-callback-reference
@@ -298,20 +299,26 @@ const mapWalletActivities = memoize(
298299
/**
299300
* Sanitizes historical rewards data
300301
*/
301-
const getRewardsHistory = () =>
302+
const getRewardsHistory = (oldestHistoricalTxDate?: Date) =>
302303
Object.entries(groupBy(rewardsHistory.all, ({ epoch }) => epoch.toString()))
303304
.map(([epoch, rewards]) => epochRewardsMapper(Number(epoch) as Wallet.Cardano.EpochNo, rewards))
304-
.filter((reward) => reward.date.getTime() < Date.now());
305+
.filter(
306+
(reward) =>
307+
reward.date.getTime() < Date.now() &&
308+
(!oldestHistoricalTxDate || reward.date.getTime() >= oldestHistoricalTxDate.getTime())
309+
);
305310

306311
/**
307312
* Emits the lists combined and sets current state for Zustand
308313
*/
309-
const [historicalTransactions, pendingTransactions, rewards] = await Promise.all([
314+
const [historicalTransactions, pendingTransactions] = await Promise.all([
310315
getHistoricalTransactions(),
311-
getPendingTransactions(),
312-
assetDetails ? [] : getRewardsHistory()
316+
getPendingTransactions()
313317
]);
314318

319+
const oldestHistoricalTxDate = withLimitedRewardsHistory ? historicalTransactions[0]?.date : undefined;
320+
const rewards = assetDetails ? [] : getRewardsHistory(oldestHistoricalTxDate);
321+
315322
const confirmedTxs = historicalTransactions;
316323
const pendingTxs = pendingTransactions;
317324
/* After the transaction is confirmed is not being removed from pendingTransactions$, so we have to remove it manually from pending list
@@ -423,7 +430,7 @@ const getWalletActivities = async ({
423430
setTransactionActivityDetail,
424431
setRewardsActivityDetail,
425432
assetDetails,
426-
blockchainProvider: { assetProvider },
433+
blockchainProvider: { assetProvider, inputResolver },
427434
isSharedWallet
428435
} = get();
429436
if (!walletState) {
@@ -440,7 +447,8 @@ const getWalletActivities = async ({
440447
setRewardsActivityDetail,
441448
setTransactionActivityDetail,
442449
assetDetails,
443-
isSharedWallet
450+
isSharedWallet,
451+
inputResolver
444452
}
445453
);
446454

@@ -461,7 +469,21 @@ export const walletActivitiesSlice: SliceCreator<
461469
WalletInfoSlice & WalletActivitiesSlice & ActivityDetailSlice & AssetDetailsSlice & UISlice & BlockchainProviderSlice,
462470
WalletActivitiesSlice
463471
> = ({ set, get }) => ({
464-
getWalletActivities: ({ fiatCurrency, cardanoFiatPrice, assetId, sendAnalytics }: FetchWalletActivitiesProps) =>
465-
getWalletActivities({ fiatCurrency, cardanoFiatPrice, assetId, sendAnalytics, set, get }),
472+
getWalletActivities: ({
473+
fiatCurrency,
474+
cardanoFiatPrice,
475+
assetId,
476+
sendAnalytics,
477+
withLimitedRewardsHistory
478+
}: FetchWalletActivitiesProps) =>
479+
getWalletActivities({
480+
fiatCurrency,
481+
cardanoFiatPrice,
482+
assetId,
483+
sendAnalytics,
484+
withLimitedRewardsHistory,
485+
set,
486+
get
487+
}),
466488
...initialState
467489
});

0 commit comments

Comments
 (0)