Skip to content

Commit 4d474f3

Browse files
feat: implement onAssetsMarketData handler
1 parent 0d88118 commit 4d474f3

11 files changed

Lines changed: 3012 additions & 1253 deletions

File tree

package.json

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,7 @@
3636
]
3737
},
3838
"resolutions": {
39-
"@metamask/snaps-sdk": "8.1.0"
39+
"@metamask/snaps-sdk": "9.0.0"
4040
},
4141
"devDependencies": {
4242
"@commitlint/cli": "^17.7.1",
@@ -69,7 +69,7 @@
6969
"sharp": "^0.33.5",
7070
"typescript": "^5.6.3"
7171
},
72-
"packageManager": "yarn@4.9.2",
72+
"packageManager": "yarn@3.8.6",
7373
"engines": {
7474
"node": ">=20.17.0"
7575
},

packages/snap/package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,7 @@
4545
"@metamask/keyring-snap-sdk": "^4.0.0",
4646
"@metamask/snaps-cli": "^8.1.0",
4747
"@metamask/snaps-jest": "9.2.0",
48-
"@metamask/snaps-sdk": "^8.1.0",
48+
"@metamask/snaps-sdk": "^9.0.0",
4949
"@metamask/superstruct": "^3.1.0",
5050
"@metamask/utils": "11.4.0",
5151
"@noble/ed25519": "2.1.0",

packages/snap/snap.manifest.json

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -21,8 +21,7 @@
2121
]
2222
},
2323
"initialConnections": {
24-
"https://portfolio.metamask.io": {},
25-
"http://localhost:3000": {}
24+
"https://portfolio.metamask.io": {}
2625
},
2726
"initialPermissions": {
2827
"endowment:rpc": {
@@ -31,8 +30,7 @@
3130
},
3231
"endowment:keyring": {
3332
"allowedOrigins": [
34-
"https://portfolio.metamask.io",
35-
"http://localhost:3000"
33+
"https://portfolio.metamask.io"
3634
]
3735
},
3836
"snap_getBip32Entropy": [
@@ -100,6 +98,6 @@
10098
"snap_dialog": {},
10199
"snap_getPreferences": {}
102100
},
103-
"platformVersion": "8.1.0",
101+
"platformVersion": "9.0.0",
104102
"manifestVersion": "0.1"
105103
}

packages/snap/src/core/handlers/onAssetHistoricalPrice/onAssetHistoricalPrice.ts

Lines changed: 8 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -15,23 +15,15 @@ import logger from '../../utils/logger';
1515
export const onAssetHistoricalPrice: OnAssetHistoricalPriceHandler = async (
1616
params,
1717
) => {
18-
try {
19-
logger.log('[📈 onAssetHistoricalPrice]', params);
18+
logger.log('[📈 onAssetHistoricalPrice]', params);
2019

21-
const { from, to } = params;
22-
assert(from, CaipAssetTypeStruct);
23-
assert(to, CaipAssetTypeStruct);
20+
const { from, to } = params;
21+
assert(from, CaipAssetTypeStruct);
22+
assert(to, CaipAssetTypeStruct);
2423

25-
const historicalPrice = await tokenPricesService.getHistoricalPrice(
26-
from,
27-
to,
28-
);
24+
const historicalPrice = await tokenPricesService.getHistoricalPrice(from, to);
2925

30-
return {
31-
historicalPrice,
32-
};
33-
} catch (error: any) {
34-
logger.error('[📈 onAssetHistoricalPrice]', error);
35-
return null;
36-
}
26+
return {
27+
historicalPrice,
28+
};
3729
};
Lines changed: 8 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -1,25 +1,17 @@
1-
import {
2-
InternalError,
3-
type OnAssetsConversionHandler,
4-
} from '@metamask/snaps-sdk';
1+
import { type OnAssetsConversionHandler } from '@metamask/snaps-sdk';
52

63
import { tokenPricesService } from '../../../snapContext';
74
import logger from '../../utils/logger';
85

96
export const onAssetsConversion: OnAssetsConversionHandler = async (params) => {
10-
try {
11-
logger.log('[💱 onAssetsConversion]', params);
7+
logger.log('[💱 onAssetsConversion]', params);
128

13-
const { conversions } = params;
9+
const { conversions } = params;
1410

15-
const conversionRates =
16-
await tokenPricesService.getMultipleTokenConversions(conversions);
11+
const conversionRates =
12+
await tokenPricesService.getMultipleTokenConversions(conversions);
1713

18-
return {
19-
conversionRates,
20-
};
21-
} catch (error: any) {
22-
logger.error('[💱 onAssetsConversion]', error);
23-
throw new InternalError(error) as Error;
24-
}
14+
return {
15+
conversionRates,
16+
};
2517
};

packages/snap/src/core/handlers/onAssetsMarketData/onAssetsMarketData.test.ts

Lines changed: 0 additions & 120 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,4 @@
11
import type { FungibleAssetMarketData } from '@metamask/snaps-sdk';
2-
import { InternalError } from '@metamask/snaps-sdk';
32
import type { CaipAssetType } from '@metamask/utils';
43

54
import { assetsService } from '../../../snapContext';
@@ -231,101 +230,6 @@ describe('onAssetsMarketData', () => {
231230
});
232231
});
233232

234-
describe('error scenarios', () => {
235-
it('should throw InternalError when assetsService.getAssetsMarketData throws an error', async () => {
236-
const params = {
237-
assets: [{ asset: BTC, unit: USD }],
238-
};
239-
240-
const errorMessage = 'Failed to fetch market data';
241-
const mockError = new Error(errorMessage);
242-
mockAssetsService.getAssetsMarketData.mockRejectedValue(mockError);
243-
244-
await expect(onAssetsMarketData(params)).rejects.toThrow(InternalError);
245-
246-
expect(logger.log).toHaveBeenCalledWith(
247-
'[💰 onAssetsMarketData]',
248-
params,
249-
);
250-
expect(logger.error).toHaveBeenCalledWith(
251-
'[💰 onAssetsMarketData]',
252-
mockError,
253-
);
254-
expect(mockAssetsService.getAssetsMarketData).toHaveBeenCalledWith(
255-
params.assets,
256-
);
257-
});
258-
259-
it('should throw InternalError when assetsService.getAssetsMarketData throws a network error', async () => {
260-
const params = {
261-
assets: [{ asset: ETH, unit: USD }],
262-
};
263-
264-
const networkError = new Error('Network timeout');
265-
mockAssetsService.getAssetsMarketData.mockRejectedValue(networkError);
266-
267-
await expect(onAssetsMarketData(params)).rejects.toThrow(InternalError);
268-
269-
expect(logger.log).toHaveBeenCalledWith(
270-
'[💰 onAssetsMarketData]',
271-
params,
272-
);
273-
expect(logger.error).toHaveBeenCalledWith(
274-
'[💰 onAssetsMarketData]',
275-
networkError,
276-
);
277-
expect(mockAssetsService.getAssetsMarketData).toHaveBeenCalledWith(
278-
params.assets,
279-
);
280-
});
281-
282-
it('should throw InternalError when assetsService.getAssetsMarketData throws a validation error', async () => {
283-
const params = {
284-
assets: [{ asset: 'invalid-asset-type' as CaipAssetType, unit: USD }],
285-
};
286-
287-
const validationError = new Error('Invalid asset type');
288-
mockAssetsService.getAssetsMarketData.mockRejectedValue(validationError);
289-
290-
await expect(onAssetsMarketData(params)).rejects.toThrow(InternalError);
291-
292-
expect(logger.log).toHaveBeenCalledWith(
293-
'[💰 onAssetsMarketData]',
294-
params,
295-
);
296-
expect(logger.error).toHaveBeenCalledWith(
297-
'[💰 onAssetsMarketData]',
298-
validationError,
299-
);
300-
expect(mockAssetsService.getAssetsMarketData).toHaveBeenCalledWith(
301-
params.assets,
302-
);
303-
});
304-
305-
it('should handle and re-throw InternalError when assetsService throws InternalError', async () => {
306-
const params = {
307-
assets: [{ asset: BTC, unit: USD }],
308-
};
309-
310-
const internalError = new InternalError('Service unavailable');
311-
mockAssetsService.getAssetsMarketData.mockRejectedValue(internalError);
312-
313-
await expect(onAssetsMarketData(params)).rejects.toThrow(InternalError);
314-
315-
expect(logger.log).toHaveBeenCalledWith(
316-
'[💰 onAssetsMarketData]',
317-
params,
318-
);
319-
expect(logger.error).toHaveBeenCalledWith(
320-
'[💰 onAssetsMarketData]',
321-
internalError,
322-
);
323-
expect(mockAssetsService.getAssetsMarketData).toHaveBeenCalledWith(
324-
params.assets,
325-
);
326-
});
327-
});
328-
329233
describe('edge cases', () => {
330234
it('should handle assets with special characters in asset types', async () => {
331235
const specialAsset =
@@ -450,29 +354,5 @@ describe('onAssetsMarketData', () => {
450354
params,
451355
);
452356
});
453-
454-
it('should log errors correctly when service fails', async () => {
455-
const params = {
456-
assets: [{ asset: BTC, unit: USD }],
457-
};
458-
459-
const error = new Error('Service error');
460-
mockAssetsService.getAssetsMarketData.mockRejectedValue(error);
461-
462-
try {
463-
await onAssetsMarketData(params);
464-
} catch (thrownError) {
465-
// Expected to throw
466-
}
467-
468-
expect(logger.log).toHaveBeenCalledWith(
469-
'[💰 onAssetsMarketData]',
470-
params,
471-
);
472-
expect(logger.error).toHaveBeenCalledWith(
473-
'[💰 onAssetsMarketData]',
474-
error,
475-
);
476-
});
477357
});
478358
});
Lines changed: 4 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,20 +1,14 @@
11
import type { OnAssetsMarketDataHandler } from '@metamask/snaps-sdk';
2-
import { InternalError } from '@metamask/snaps-sdk';
32

43
import { assetsService } from '../../../snapContext';
54
import logger from '../../utils/logger';
65

76
export const onAssetsMarketData: OnAssetsMarketDataHandler = async (params) => {
8-
try {
9-
logger.log('[💰 onAssetsMarketData]', params);
7+
logger.log('[💰 onAssetsMarketData]', params);
108

11-
const { assets } = params;
9+
const { assets } = params;
1210

13-
const marketData = await assetsService.getAssetsMarketData(assets);
11+
const marketData = await assetsService.getAssetsMarketData(assets);
1412

15-
return { marketData };
16-
} catch (error: any) {
17-
logger.error('[💰 onAssetsMarketData]', error);
18-
throw new InternalError(error) as Error;
19-
}
13+
return { marketData };
2014
};

packages/snap/src/core/services/assets/AssetsService.test.ts

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -7,13 +7,13 @@ import { InMemoryCache } from '../../caching/InMemoryCache';
77
import { KnownCaip19Id, Network } from '../../constants/solana';
88
import type { Serializable } from '../../serialization/types';
99
import {
10-
SOLANA_MOCK_SPL_TOKENS,
11-
SOLANA_MOCK_TOKEN,
12-
SOLANA_MOCK_TOKEN_METADATA,
10+
SOLANA_MOCK_SPL_TOKENS,
11+
SOLANA_MOCK_TOKEN,
12+
SOLANA_MOCK_TOKEN_METADATA,
1313
} from '../../test/mocks/solana-assets';
1414
import {
15-
MOCK_SOLANA_KEYRING_ACCOUNT_0,
16-
MOCK_SOLANA_KEYRING_ACCOUNTS,
15+
MOCK_SOLANA_KEYRING_ACCOUNT_0,
16+
MOCK_SOLANA_KEYRING_ACCOUNTS,
1717
} from '../../test/mocks/solana-keyring-accounts';
1818
import logger from '../../utils/logger';
1919
import type { ConfigProvider } from '../config';

packages/snap/src/core/services/assets/AssetsService.ts

Lines changed: 12 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -310,18 +310,14 @@ export class AssetsService {
310310
`[refreshAssets] Found updated assets for ${account.address}`,
311311
);
312312

313-
await emitSnapKeyringEvent(
314-
snap as any,
315-
KeyringEvent.AccountAssetListUpdated,
316-
{
317-
assets: {
318-
[account.id]: {
319-
added: assetsAdded,
320-
removed: assetsDeleted,
321-
},
313+
await emitSnapKeyringEvent(snap, KeyringEvent.AccountAssetListUpdated, {
314+
assets: {
315+
[account.id]: {
316+
added: assetsAdded,
317+
removed: assetsDeleted,
322318
},
323319
},
324-
);
320+
});
325321
}
326322

327323
const accountBalances = await this.getAccountBalances(
@@ -345,18 +341,14 @@ export class AssetsService {
345341
`[BalancesService] Found updated balances for ${account.address}`,
346342
);
347343

348-
await emitSnapKeyringEvent(
349-
snap as any,
350-
KeyringEvent.AccountBalancesUpdated,
351-
{
352-
balances: {
353-
[account.id]: {
354-
...balancesAdded,
355-
...balancesChanged,
356-
},
344+
await emitSnapKeyringEvent(snap, KeyringEvent.AccountBalancesUpdated, {
345+
balances: {
346+
[account.id]: {
347+
...balancesAdded,
348+
...balancesChanged,
357349
},
358350
},
359-
);
351+
});
360352

361353
await this.#state.setKey(`assets.${account.id}`, accountBalances);
362354
}

0 commit comments

Comments
 (0)