From bcf5b87817b3b4fcaf3aafa553cc9c428e1bc14a Mon Sep 17 00:00:00 2001 From: Antonio Regadas Date: Thu, 12 Jun 2025 13:26:50 +0100 Subject: [PATCH 01/22] chore: adds snap_trackEvent and origin param --- .../onClientRequest/ClientRequestHandler.ts | 1 + .../backgroundEvents/onTransactionAdded.ts | 4 +- .../backgroundEvents/onTransactionApproved.ts | 4 +- .../onTransactionFinalized.ts | 6 +- .../backgroundEvents/onTransactionRejected.ts | 4 +- .../onTransactionSubmitted.ts | 11 ++- .../core/handlers/onKeyringRequest/Keyring.ts | 2 + .../services/analytics/AnalyticsService.ts | 97 ++++++++++++++++++- .../confirmation/ConfirmationHandler.ts | 4 + .../src/core/services/wallet/WalletService.ts | 3 + 10 files changed, 124 insertions(+), 12 deletions(-) diff --git a/packages/snap/src/core/handlers/onClientRequest/ClientRequestHandler.ts b/packages/snap/src/core/handlers/onClientRequest/ClientRequestHandler.ts index 468883fed..8f81d40e5 100644 --- a/packages/snap/src/core/handlers/onClientRequest/ClientRequestHandler.ts +++ b/packages/snap/src/core/handlers/onClientRequest/ClientRequestHandler.ts @@ -81,6 +81,7 @@ export class ClientRequestHandler { account, base64EncodedTransaction, scope, + undefined, options, ); } diff --git a/packages/snap/src/core/handlers/onCronjob/backgroundEvents/onTransactionAdded.ts b/packages/snap/src/core/handlers/onCronjob/backgroundEvents/onTransactionAdded.ts index 9abe32549..24449467b 100644 --- a/packages/snap/src/core/handlers/onCronjob/backgroundEvents/onTransactionAdded.ts +++ b/packages/snap/src/core/handlers/onCronjob/backgroundEvents/onTransactionAdded.ts @@ -19,6 +19,7 @@ export const OnTransactionAddedRequestStruct = object({ /** The base64 encoded transaction or transaction message. */ base64EncodedTransaction: Base64Struct, scope: NetworkStruct, + origin: string(), }), }); @@ -35,7 +36,7 @@ export const onTransactionAdded: OnCronjobHandler = async ({ request }) => { assert(request, OnTransactionAddedRequestStruct); - const { accountId, base64EncodedTransaction, scope } = request.params; + const { accountId, base64EncodedTransaction, scope, origin } = request.params; const account = await keyring.getAccountOrThrow(accountId); @@ -43,6 +44,7 @@ export const onTransactionAdded: OnCronjobHandler = async ({ request }) => { account, base64EncodedTransaction, scope, + origin, ); } catch (error) { logger.error(error); diff --git a/packages/snap/src/core/handlers/onCronjob/backgroundEvents/onTransactionApproved.ts b/packages/snap/src/core/handlers/onCronjob/backgroundEvents/onTransactionApproved.ts index 1deb8329c..ec8bb48b3 100644 --- a/packages/snap/src/core/handlers/onCronjob/backgroundEvents/onTransactionApproved.ts +++ b/packages/snap/src/core/handlers/onCronjob/backgroundEvents/onTransactionApproved.ts @@ -19,6 +19,7 @@ export const OnTransactionApprovedRequestStruct = object({ /** The base64 encoded transaction or transaction message. */ base64EncodedTransaction: Base64Struct, scope: NetworkStruct, + origin: string(), }), }); @@ -35,7 +36,7 @@ export const onTransactionApproved: OnCronjobHandler = async ({ request }) => { assert(request, OnTransactionApprovedRequestStruct); - const { accountId, base64EncodedTransaction, scope } = request.params; + const { accountId, base64EncodedTransaction, scope, origin } = request.params; const account = await keyring.getAccountOrThrow(accountId); @@ -43,6 +44,7 @@ export const onTransactionApproved: OnCronjobHandler = async ({ request }) => { account, base64EncodedTransaction, scope, + origin, ); } catch (error) { logger.error(error); diff --git a/packages/snap/src/core/handlers/onCronjob/backgroundEvents/onTransactionFinalized.ts b/packages/snap/src/core/handlers/onCronjob/backgroundEvents/onTransactionFinalized.ts index 6dbb29e26..e29470398 100644 --- a/packages/snap/src/core/handlers/onCronjob/backgroundEvents/onTransactionFinalized.ts +++ b/packages/snap/src/core/handlers/onCronjob/backgroundEvents/onTransactionFinalized.ts @@ -9,7 +9,7 @@ import { transactionsService, } from '../../../../snapContext'; import logger from '../../../utils/logger'; -import { UuidStruct } from '../../../validation/structs'; +import { NetworkStruct, UuidStruct } from '../../../validation/structs'; import { ScheduleBackgroundEventMethod } from './ScheduleBackgroundEventMethod'; export const OnTransactionFinalizedRequestStruct = object({ @@ -19,6 +19,7 @@ export const OnTransactionFinalizedRequestStruct = object({ params: object({ accountId: UuidStruct, transaction: TransactionStruct, + origin: string(), }), }); @@ -36,7 +37,7 @@ export const onTransactionFinalized: OnCronjobHandler = async ({ request }) => { assert(request, OnTransactionFinalizedRequestStruct); - const { accountId, transaction } = request.params; + const { accountId, transaction, origin } = request.params; const account = await keyring.getAccountOrThrow(accountId); @@ -64,6 +65,7 @@ export const onTransactionFinalized: OnCronjobHandler = async ({ request }) => { const trackEventPromise = analyticsService.trackEventTransactionFinalized( account, transaction, + origin, ); await Promise.all([ diff --git a/packages/snap/src/core/handlers/onCronjob/backgroundEvents/onTransactionRejected.ts b/packages/snap/src/core/handlers/onCronjob/backgroundEvents/onTransactionRejected.ts index 7e078c53d..c459c851c 100644 --- a/packages/snap/src/core/handlers/onCronjob/backgroundEvents/onTransactionRejected.ts +++ b/packages/snap/src/core/handlers/onCronjob/backgroundEvents/onTransactionRejected.ts @@ -19,6 +19,7 @@ export const OnTransactionRejectedRequestStruct = object({ /** The base64 encoded transaction or transaction message. */ base64EncodedTransaction: Base64Struct, scope: NetworkStruct, + origin: string(), }), }); @@ -35,7 +36,7 @@ export const onTransactionRejected: OnCronjobHandler = async ({ request }) => { assert(request, OnTransactionRejectedRequestStruct); - const { accountId, base64EncodedTransaction, scope } = request.params; + const { accountId, base64EncodedTransaction, scope, origin } = request.params; const account = await keyring.getAccountOrThrow(accountId); @@ -43,6 +44,7 @@ export const onTransactionRejected: OnCronjobHandler = async ({ request }) => { account, base64EncodedTransaction, scope, + origin, ); } catch (error) { logger.error(error); diff --git a/packages/snap/src/core/handlers/onCronjob/backgroundEvents/onTransactionSubmitted.ts b/packages/snap/src/core/handlers/onCronjob/backgroundEvents/onTransactionSubmitted.ts index ac15281f3..34439a26e 100644 --- a/packages/snap/src/core/handlers/onCronjob/backgroundEvents/onTransactionSubmitted.ts +++ b/packages/snap/src/core/handlers/onCronjob/backgroundEvents/onTransactionSubmitted.ts @@ -20,6 +20,7 @@ export const OnTransactionSubmittedRequestStruct = object({ transactionMessageBase64Encoded: Base64Struct, signature: string(), scope: NetworkStruct, + origin: string(), }), }); @@ -36,8 +37,13 @@ export const onTransactionSubmitted: OnCronjobHandler = async ({ request }) => { assert(request, OnTransactionSubmittedRequestStruct); - const { accountId, transactionMessageBase64Encoded, signature, scope } = - request.params; + const { + accountId, + transactionMessageBase64Encoded, + signature, + scope, + origin, + } = request.params; const account = await keyring.getAccountOrThrow(accountId); @@ -46,6 +52,7 @@ export const onTransactionSubmitted: OnCronjobHandler = async ({ request }) => { transactionMessageBase64Encoded, signature, scope, + origin, ); } catch (error) { logger.error(error); diff --git a/packages/snap/src/core/handlers/onKeyringRequest/Keyring.ts b/packages/snap/src/core/handlers/onKeyringRequest/Keyring.ts index 7a2a6f61e..2a3fede7b 100644 --- a/packages/snap/src/core/handlers/onKeyringRequest/Keyring.ts +++ b/packages/snap/src/core/handlers/onKeyringRequest/Keyring.ts @@ -407,6 +407,7 @@ export class SolanaKeyring implements Keyring { request: { method, params }, scope, account: accountId, + origin, } = request; const account = await this.getAccountOrThrow(accountId); @@ -441,6 +442,7 @@ export class SolanaKeyring implements Keyring { account, base64EncodedTransaction, scope, + origin, options, ); } diff --git a/packages/snap/src/core/services/analytics/AnalyticsService.ts b/packages/snap/src/core/services/analytics/AnalyticsService.ts index 15ccebb1a..119fa596c 100644 --- a/packages/snap/src/core/services/analytics/AnalyticsService.ts +++ b/packages/snap/src/core/services/analytics/AnalyticsService.ts @@ -20,24 +20,58 @@ export class AnalyticsService { account: SolanaKeyringAccount, base64EncodedTransaction: string, scope: Network, + origin?: string, ): Promise { this.#logger.log(`[📣 AnalyticsService] Tracking event transaction added`); assert(base64EncodedTransaction, Base64Struct); - // TODO: Implement + + await snap.request({ + method: 'snap_trackEvent', + params: { + event: { + event: 'Transaction Added', + properties: { + message: 'Snap transaction added', + origin: origin || null, + account_id: account.id, + account_address: account.address, + account_type: account.type, + chain_id: scope, + }, + }, + }, + }); } async trackEventTransactionApproved( account: SolanaKeyringAccount, base64EncodedTransaction: string, scope: Network, + origin?: string, ): Promise { this.#logger.log( `[📣 AnalyticsService] Tracking event transaction approved`, ); assert(base64EncodedTransaction, Base64Struct); - // TODO: Implement + + await snap.request({ + method: 'snap_trackEvent', + params: { + event: { + event: 'Transaction Approved', + properties: { + message: 'Snap transaction approved', + origin: origin || null, + account_id: account.id, + account_address: account.address, + account_type: account.type, + chain_id: scope, + }, + }, + }, + }); } async trackEventTransactionSubmitted( @@ -45,35 +79,88 @@ export class AnalyticsService { transactionMessageBase64Encoded: string, signature: string, scope: Network, + origin?: string, ): Promise { this.#logger.log( `[📣 AnalyticsService] Tracking event transaction submitted`, ); assert(transactionMessageBase64Encoded, Base64Struct); - // TODO: Implement + + await snap.request({ + method: 'snap_trackEvent', + params: { + event: { + event: 'Transaction Submitted', + properties: { + message: 'Snap transaction submitted', + origin: origin || null, + account_id: account.id, + account_address: account.address, + account_type: account.type, + chain_id: scope, + }, + }, + }, + }); } async trackEventTransactionFinalized( account: SolanaKeyringAccount, transaction: Transaction, + origin?: string, ): Promise { this.#logger.log( `[📣 AnalyticsService] Tracking event transaction finalized`, ); - // TODO: Implement + + await snap.request({ + method: 'snap_trackEvent', + params: { + event: { + event: 'Transaction Finalized', + properties: { + message: 'Snap transaction finalized', + origin: origin || null, + account_id: account.id, + account_address: account.address, + account_type: account.type, + chain_id: transaction.chain, + transaction_status: transaction.status, + transaction_type: transaction.type, + }, + }, + }, + }); } async trackEventTransactionRejected( account: SolanaKeyringAccount, base64EncodedTransaction: string, scope: Network, + origin?: string, ): Promise { this.#logger.log( `[📣 AnalyticsService] Tracking event transaction rejected`, ); assert(base64EncodedTransaction, Base64Struct); - // TODO: Implement + + await snap.request({ + method: 'snap_trackEvent', + params: { + event: { + event: 'Transaction Rejected', + properties: { + message: 'Snap transaction rejected', + origin: origin || null, + account_id: account.id, + account_address: account.address, + account_type: account.type, + chain_id: scope, + }, + }, + }, + }); } } diff --git a/packages/snap/src/core/services/confirmation/ConfirmationHandler.ts b/packages/snap/src/core/services/confirmation/ConfirmationHandler.ts index 2c03c48a0..1fd8e45b7 100644 --- a/packages/snap/src/core/services/confirmation/ConfirmationHandler.ts +++ b/packages/snap/src/core/services/confirmation/ConfirmationHandler.ts @@ -79,6 +79,7 @@ export class ConfirmationHandler { }, scope, account: accountId, + origin, } = request; // Trigger the side effects that need to happen when the transaction is shown in confirmation UI @@ -92,6 +93,7 @@ export class ConfirmationHandler { accountId, base64EncodedTransaction, scope, + origin, }, }, }, @@ -118,6 +120,7 @@ export class ConfirmationHandler { accountId, base64EncodedTransaction, scope, + origin, }, }, }, @@ -137,6 +140,7 @@ export class ConfirmationHandler { accountId, base64EncodedTransaction, scope, + origin, }, }, }, diff --git a/packages/snap/src/core/services/wallet/WalletService.ts b/packages/snap/src/core/services/wallet/WalletService.ts index 6a9d5c6fa..ec1142d0f 100644 --- a/packages/snap/src/core/services/wallet/WalletService.ts +++ b/packages/snap/src/core/services/wallet/WalletService.ts @@ -220,6 +220,7 @@ export class WalletService { account: SolanaKeyringAccount, transactionMessageBase64Encoded: string, scope: Network, + origin?: string, options?: SolanaSignAndSendTransactionOptions, ): Promise { const signConfig: DecompileTransactionMessageFetchingLookupTablesConfig = @@ -285,6 +286,7 @@ export class WalletService { transactionMessageBase64Encoded, signature, scope, + origin: origin || null, }, }, }, @@ -340,6 +342,7 @@ export class WalletService { params: { accountId: account.id, transaction: mappedTransactionWithAccountId, + origin: origin || null, }, }, }, From 13806e1ed57294d915acdcc2601bc52f625d0e01 Mon Sep 17 00:00:00 2001 From: Antonio Regadas Date: Thu, 12 Jun 2025 13:57:09 +0100 Subject: [PATCH 02/22] chore: lint and prettier --- .../ClientRequestHandler.test.ts | 1 + .../backgroundEvents/onTransactionAdded.ts | 3 ++- .../backgroundEvents/onTransactionApproved.ts | 3 ++- .../onTransactionFinalized.test.ts | 4 ++++ .../backgroundEvents/onTransactionRejected.ts | 3 ++- .../core/services/analytics/AnalyticsService.ts | 17 +++++++++-------- .../core/services/wallet/WalletService.test.ts | 3 +++ .../src/core/services/wallet/WalletService.ts | 5 +++-- 8 files changed, 26 insertions(+), 13 deletions(-) diff --git a/packages/snap/src/core/handlers/onClientRequest/ClientRequestHandler.test.ts b/packages/snap/src/core/handlers/onClientRequest/ClientRequestHandler.test.ts index 7cd1076c8..c6df8479f 100644 --- a/packages/snap/src/core/handlers/onClientRequest/ClientRequestHandler.test.ts +++ b/packages/snap/src/core/handlers/onClientRequest/ClientRequestHandler.test.ts @@ -101,6 +101,7 @@ describe('ClientRequestHandler', () => { MOCK_SOLANA_KEYRING_ACCOUNT_0, mockTransaction, Network.Testnet, + undefined, { commitment: 'confirmed', skipPreflight: false, diff --git a/packages/snap/src/core/handlers/onCronjob/backgroundEvents/onTransactionAdded.ts b/packages/snap/src/core/handlers/onCronjob/backgroundEvents/onTransactionAdded.ts index 24449467b..291c8929d 100644 --- a/packages/snap/src/core/handlers/onCronjob/backgroundEvents/onTransactionAdded.ts +++ b/packages/snap/src/core/handlers/onCronjob/backgroundEvents/onTransactionAdded.ts @@ -36,7 +36,8 @@ export const onTransactionAdded: OnCronjobHandler = async ({ request }) => { assert(request, OnTransactionAddedRequestStruct); - const { accountId, base64EncodedTransaction, scope, origin } = request.params; + const { accountId, base64EncodedTransaction, scope, origin } = + request.params; const account = await keyring.getAccountOrThrow(accountId); diff --git a/packages/snap/src/core/handlers/onCronjob/backgroundEvents/onTransactionApproved.ts b/packages/snap/src/core/handlers/onCronjob/backgroundEvents/onTransactionApproved.ts index ec8bb48b3..9b63b89d2 100644 --- a/packages/snap/src/core/handlers/onCronjob/backgroundEvents/onTransactionApproved.ts +++ b/packages/snap/src/core/handlers/onCronjob/backgroundEvents/onTransactionApproved.ts @@ -36,7 +36,8 @@ export const onTransactionApproved: OnCronjobHandler = async ({ request }) => { assert(request, OnTransactionApprovedRequestStruct); - const { accountId, base64EncodedTransaction, scope, origin } = request.params; + const { accountId, base64EncodedTransaction, scope, origin } = + request.params; const account = await keyring.getAccountOrThrow(accountId); diff --git a/packages/snap/src/core/handlers/onCronjob/backgroundEvents/onTransactionFinalized.test.ts b/packages/snap/src/core/handlers/onCronjob/backgroundEvents/onTransactionFinalized.test.ts index b7e34824a..bd644241d 100644 --- a/packages/snap/src/core/handlers/onCronjob/backgroundEvents/onTransactionFinalized.test.ts +++ b/packages/snap/src/core/handlers/onCronjob/backgroundEvents/onTransactionFinalized.test.ts @@ -47,6 +47,7 @@ describe('onTransactionFinalized', () => { it('refreshes assets, balances and transactions for all accounts that are involved in the transaction', async () => { const mockAccountId = MOCK_SOLANA_KEYRING_ACCOUNT_0.id; + const mockOrigin = 'https://metamask.io'; // A special transaction with multiple senders and recipients that are all owned by the keyring const mockTransaction: Transaction = { @@ -117,6 +118,7 @@ describe('onTransactionFinalized', () => { params: { accountId: mockAccountId, transaction: mockTransaction, + origin: mockOrigin, }, }, }); @@ -144,6 +146,7 @@ describe('onTransactionFinalized', () => { it('refreshes balances and transactions for the sender only if it is the only account involved in the transaction', async () => { const mockAccountId = MOCK_SOLANA_KEYRING_ACCOUNT_0.id; + const mockOrigin = 'https://metamask.io'; // Transaction with only one owned sender, and one non-owned recipient const mockTransaction: Transaction = { @@ -187,6 +190,7 @@ describe('onTransactionFinalized', () => { params: { accountId: mockAccountId, transaction: mockTransaction, + origin: mockOrigin, }, }, }); diff --git a/packages/snap/src/core/handlers/onCronjob/backgroundEvents/onTransactionRejected.ts b/packages/snap/src/core/handlers/onCronjob/backgroundEvents/onTransactionRejected.ts index c459c851c..086ebda0f 100644 --- a/packages/snap/src/core/handlers/onCronjob/backgroundEvents/onTransactionRejected.ts +++ b/packages/snap/src/core/handlers/onCronjob/backgroundEvents/onTransactionRejected.ts @@ -36,7 +36,8 @@ export const onTransactionRejected: OnCronjobHandler = async ({ request }) => { assert(request, OnTransactionRejectedRequestStruct); - const { accountId, base64EncodedTransaction, scope, origin } = request.params; + const { accountId, base64EncodedTransaction, scope, origin } = + request.params; const account = await keyring.getAccountOrThrow(accountId); diff --git a/packages/snap/src/core/services/analytics/AnalyticsService.ts b/packages/snap/src/core/services/analytics/AnalyticsService.ts index 119fa596c..5ebcbf371 100644 --- a/packages/snap/src/core/services/analytics/AnalyticsService.ts +++ b/packages/snap/src/core/services/analytics/AnalyticsService.ts @@ -1,3 +1,4 @@ +/* eslint-disable @typescript-eslint/naming-convention */ import type { Transaction } from '@metamask/keyring-api'; import { assert } from '@metamask/superstruct'; @@ -25,7 +26,7 @@ export class AnalyticsService { this.#logger.log(`[📣 AnalyticsService] Tracking event transaction added`); assert(base64EncodedTransaction, Base64Struct); - + await snap.request({ method: 'snap_trackEvent', params: { @@ -33,7 +34,7 @@ export class AnalyticsService { event: 'Transaction Added', properties: { message: 'Snap transaction added', - origin: origin || null, + origin: origin ?? null, account_id: account.id, account_address: account.address, account_type: account.type, @@ -63,7 +64,7 @@ export class AnalyticsService { event: 'Transaction Approved', properties: { message: 'Snap transaction approved', - origin: origin || null, + origin: origin ?? null, account_id: account.id, account_address: account.address, account_type: account.type, @@ -86,7 +87,7 @@ export class AnalyticsService { ); assert(transactionMessageBase64Encoded, Base64Struct); - + await snap.request({ method: 'snap_trackEvent', params: { @@ -94,7 +95,7 @@ export class AnalyticsService { event: 'Transaction Submitted', properties: { message: 'Snap transaction submitted', - origin: origin || null, + origin: origin ?? null, account_id: account.id, account_address: account.address, account_type: account.type, @@ -121,7 +122,7 @@ export class AnalyticsService { event: 'Transaction Finalized', properties: { message: 'Snap transaction finalized', - origin: origin || null, + origin: origin ?? null, account_id: account.id, account_address: account.address, account_type: account.type, @@ -145,7 +146,7 @@ export class AnalyticsService { ); assert(base64EncodedTransaction, Base64Struct); - + await snap.request({ method: 'snap_trackEvent', params: { @@ -153,7 +154,7 @@ export class AnalyticsService { event: 'Transaction Rejected', properties: { message: 'Snap transaction rejected', - origin: origin || null, + origin: origin ?? null, account_id: account.id, account_address: account.address, account_type: account.type, diff --git a/packages/snap/src/core/services/wallet/WalletService.test.ts b/packages/snap/src/core/services/wallet/WalletService.test.ts index f976a76ad..f1f39b661 100644 --- a/packages/snap/src/core/services/wallet/WalletService.test.ts +++ b/packages/snap/src/core/services/wallet/WalletService.test.ts @@ -258,6 +258,7 @@ describe('WalletService', () => { fromAccount, transactionMessageBase64Encoded, scope, + 'https://metamask.io', {}, ); @@ -275,6 +276,7 @@ describe('WalletService', () => { fromAccount, transactionMessageBase64Encoded, scope, + 'https://metamask.io', { commitment: 'finalized', }, @@ -294,6 +296,7 @@ describe('WalletService', () => { fromAccount, transactionMessageBase64Encoded, scope, + 'https://metamask.io', { commitment: 'processed', }, diff --git a/packages/snap/src/core/services/wallet/WalletService.ts b/packages/snap/src/core/services/wallet/WalletService.ts index ec1142d0f..efb67c52d 100644 --- a/packages/snap/src/core/services/wallet/WalletService.ts +++ b/packages/snap/src/core/services/wallet/WalletService.ts @@ -209,6 +209,7 @@ export class WalletService { * @param account - The account to sign and send the transaction. * @param transactionMessageBase64Encoded - The transaction message base64 encoded. * @param scope - The scope of the transaction. + * @param origin - The origin of the transaction. * @param options - The options for the transaction. * @param options.minContextSlot - The minimum context slot. * @param options.preflightCommitment - The preflight commitment. @@ -286,7 +287,7 @@ export class WalletService { transactionMessageBase64Encoded, signature, scope, - origin: origin || null, + origin: origin ?? null, }, }, }, @@ -342,7 +343,7 @@ export class WalletService { params: { accountId: account.id, transaction: mappedTransactionWithAccountId, - origin: origin || null, + origin: origin ?? null, }, }, }, From 95b44eefff55cfeea92c17cdb77c7fce8b856f07 Mon Sep 17 00:00:00 2001 From: Antonio Regadas Date: Thu, 12 Jun 2025 14:02:40 +0100 Subject: [PATCH 03/22] chore: shasum --- packages/snap/snap.manifest.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/snap/snap.manifest.json b/packages/snap/snap.manifest.json index 13f26e43c..180d93cfa 100644 --- a/packages/snap/snap.manifest.json +++ b/packages/snap/snap.manifest.json @@ -7,7 +7,7 @@ "url": "https://github.com/MetaMask/snap-solana-wallet.git" }, "source": { - "shasum": "WkwHuMRrHCDJcjBTlRH2F585oAj+/2fs5mSxWBaTZh8=", + "shasum": "EGGUPYai59gRqh4hElI0w8LM4ghzDfHMWxVomsaPLl8=", "location": { "npm": { "filePath": "dist/bundle.js", From 71f04fd396b88f0019576c0a4c1f3b50d9da7ce1 Mon Sep 17 00:00:00 2001 From: Antonio Regadas Date: Thu, 12 Jun 2025 14:24:56 +0100 Subject: [PATCH 04/22] chore: adds tests for AnalyticsService --- .../analytics/AnalyticsService.test.ts | 440 ++++++++++++++++++ 1 file changed, 440 insertions(+) create mode 100644 packages/snap/src/core/services/analytics/AnalyticsService.test.ts diff --git a/packages/snap/src/core/services/analytics/AnalyticsService.test.ts b/packages/snap/src/core/services/analytics/AnalyticsService.test.ts new file mode 100644 index 000000000..d41dcde37 --- /dev/null +++ b/packages/snap/src/core/services/analytics/AnalyticsService.test.ts @@ -0,0 +1,440 @@ +import type { Transaction } from '@metamask/keyring-api'; + +import { Network } from '../../constants/solana'; +import { MOCK_SOLANA_KEYRING_ACCOUNT_0 } from '../../test/mocks/solana-keyring-accounts'; +import logger from '../../utils/logger'; +import { AnalyticsService } from './AnalyticsService'; + +const mockSnapRequest = jest.fn(); +const snap = { + request: mockSnapRequest, +}; +(globalThis as any).snap = snap; + +describe('AnalyticsService', () => { + let analyticsService: AnalyticsService; + let loggerSpy: jest.SpyInstance; + + const mockAccount = MOCK_SOLANA_KEYRING_ACCOUNT_0; + const mockBase64Transaction = 'dGVzdCB0cmFuc2FjdGlvbiBkYXRh'; + const mockScope = Network.Mainnet; + const mockOrigin = 'https://metamask.io'; + const mockSignature = 'mockedSignature'; + + beforeEach(() => { + jest.clearAllMocks(); + analyticsService = new AnalyticsService(); + loggerSpy = jest.spyOn(logger, 'log').mockImplementation(); + mockSnapRequest.mockResolvedValue(undefined); + }); + + afterEach(() => { + loggerSpy.mockRestore(); + }); + + describe('trackEventTransactionAdded', () => { + it('tracks transaction added event with origin', async () => { + await analyticsService.trackEventTransactionAdded( + mockAccount, + mockBase64Transaction, + mockScope, + mockOrigin, + ); + + expect(loggerSpy).toHaveBeenCalledWith( + '[📣 AnalyticsService] Tracking event transaction added', + ); + + expect(mockSnapRequest).toHaveBeenCalledWith({ + method: 'snap_trackEvent', + params: { + event: { + event: 'Transaction Added', + properties: { + message: 'Snap transaction added', + origin: mockOrigin, + account_id: mockAccount.id, + account_address: mockAccount.address, + account_type: mockAccount.type, + chain_id: mockScope, + }, + }, + }, + }); + }); + + it('tracks transaction added event without origin', async () => { + await analyticsService.trackEventTransactionAdded( + mockAccount, + mockBase64Transaction, + mockScope, + ); + + expect(mockSnapRequest).toHaveBeenCalledWith({ + method: 'snap_trackEvent', + params: { + event: { + event: 'Transaction Added', + properties: { + message: 'Snap transaction added', + origin: null, + account_id: mockAccount.id, + account_address: mockAccount.address, + account_type: mockAccount.type, + chain_id: mockScope, + }, + }, + }, + }); + }); + + it('throws error for invalid base64 transaction', async () => { + const invalidBase64 = 'invalid-base64!@#'; + + await expect( + analyticsService.trackEventTransactionAdded( + mockAccount, + invalidBase64, + mockScope, + mockOrigin, + ), + ).rejects.toThrow(); + }); + }); + + describe('trackEventTransactionApproved', () => { + it('tracks transaction approved event with origin', async () => { + await analyticsService.trackEventTransactionApproved( + mockAccount, + mockBase64Transaction, + mockScope, + mockOrigin, + ); + + expect(loggerSpy).toHaveBeenCalledWith( + '[📣 AnalyticsService] Tracking event transaction approved', + ); + + expect(mockSnapRequest).toHaveBeenCalledWith({ + method: 'snap_trackEvent', + params: { + event: { + event: 'Transaction Approved', + properties: { + message: 'Snap transaction approved', + origin: mockOrigin, + account_id: mockAccount.id, + account_address: mockAccount.address, + account_type: mockAccount.type, + chain_id: mockScope, + }, + }, + }, + }); + }); + + it('tracks transaction approved event without origin', async () => { + await analyticsService.trackEventTransactionApproved( + mockAccount, + mockBase64Transaction, + mockScope, + ); + + expect(mockSnapRequest).toHaveBeenCalledWith({ + method: 'snap_trackEvent', + params: { + event: { + event: 'Transaction Approved', + properties: { + message: 'Snap transaction approved', + origin: null, + account_id: mockAccount.id, + account_address: mockAccount.address, + account_type: mockAccount.type, + chain_id: mockScope, + }, + }, + }, + }); + }); + + it('throws error for invalid base64 transaction', async () => { + const invalidBase64 = 'invalid-base64!@#'; + + await expect( + analyticsService.trackEventTransactionApproved( + mockAccount, + invalidBase64, + mockScope, + mockOrigin, + ), + ).rejects.toThrow(); + }); + }); + + describe('trackEventTransactionSubmitted', () => { + it('tracks transaction submitted event with origin', async () => { + await analyticsService.trackEventTransactionSubmitted( + mockAccount, + mockBase64Transaction, + mockSignature, + mockScope, + mockOrigin, + ); + + expect(loggerSpy).toHaveBeenCalledWith( + '[📣 AnalyticsService] Tracking event transaction submitted', + ); + + expect(mockSnapRequest).toHaveBeenCalledWith({ + method: 'snap_trackEvent', + params: { + event: { + event: 'Transaction Submitted', + properties: { + message: 'Snap transaction submitted', + origin: mockOrigin, + account_id: mockAccount.id, + account_address: mockAccount.address, + account_type: mockAccount.type, + chain_id: mockScope, + }, + }, + }, + }); + }); + + it('tracks transaction submitted event without origin', async () => { + await analyticsService.trackEventTransactionSubmitted( + mockAccount, + mockBase64Transaction, + mockSignature, + mockScope, + ); + + expect(mockSnapRequest).toHaveBeenCalledWith({ + method: 'snap_trackEvent', + params: { + event: { + event: 'Transaction Submitted', + properties: { + message: 'Snap transaction submitted', + origin: null, + account_id: mockAccount.id, + account_address: mockAccount.address, + account_type: mockAccount.type, + chain_id: mockScope, + }, + }, + }, + }); + }); + + it('throws error for invalid base64 transaction', async () => { + const invalidBase64 = 'invalid-base64!@#'; + + await expect( + analyticsService.trackEventTransactionSubmitted( + mockAccount, + invalidBase64, + mockSignature, + mockScope, + mockOrigin, + ), + ).rejects.toThrow(); + }); + }); + + describe('trackEventTransactionFinalized', () => { + const mockTransaction: Transaction = { + id: 'mock-transaction-id', + account: mockAccount.id, + chain: mockScope, + status: 'confirmed', + type: 'send', + timestamp: 1736500242, + from: [ + { + address: mockAccount.address, + asset: { + fungible: true, + type: 'solana:5eykt4UsFv8P8NJdTREpY1vzqKqZKvdp/slip44:501', + unit: 'SOL', + amount: '0.1', + }, + }, + ], + to: [ + { + address: '6LfawjK4CQE7pHApWYA6s6PCH5jfgrcRcV6xE6vtiyjY', + asset: { + fungible: true, + type: 'solana:5eykt4UsFv8P8NJdTREpY1vzqKqZKvdp/slip44:501', + unit: 'SOL', + amount: '0.1', + }, + }, + ], + fees: [ + { + type: 'base', + asset: { + fungible: true, + type: 'solana:5eykt4UsFv8P8NJdTREpY1vzqKqZKvdp/slip44:501', + unit: 'SOL', + amount: '0.000005', + }, + }, + ], + events: [ + { + status: 'confirmed', + timestamp: 1736500242, + }, + ], + }; + + it('tracks transaction finalized event with origin', async () => { + await analyticsService.trackEventTransactionFinalized( + mockAccount, + mockTransaction, + mockOrigin, + ); + + expect(loggerSpy).toHaveBeenCalledWith( + '[📣 AnalyticsService] Tracking event transaction finalized', + ); + + expect(mockSnapRequest).toHaveBeenCalledWith({ + method: 'snap_trackEvent', + params: { + event: { + event: 'Transaction Finalized', + properties: { + message: 'Snap transaction finalized', + origin: mockOrigin, + account_id: mockAccount.id, + account_address: mockAccount.address, + account_type: mockAccount.type, + chain_id: mockTransaction.chain, + transaction_status: mockTransaction.status, + transaction_type: mockTransaction.type, + }, + }, + }, + }); + }); + + it('tracks transaction finalized event without origin', async () => { + await analyticsService.trackEventTransactionFinalized( + mockAccount, + mockTransaction, + ); + + expect(mockSnapRequest).toHaveBeenCalledWith({ + method: 'snap_trackEvent', + params: { + event: { + event: 'Transaction Finalized', + properties: { + message: 'Snap transaction finalized', + origin: null, + account_id: mockAccount.id, + account_address: mockAccount.address, + account_type: mockAccount.type, + chain_id: mockTransaction.chain, + transaction_status: mockTransaction.status, + transaction_type: mockTransaction.type, + }, + }, + }, + }); + }); + }); + + describe('trackEventTransactionRejected', () => { + it('tracks transaction rejected event with origin', async () => { + await analyticsService.trackEventTransactionRejected( + mockAccount, + mockBase64Transaction, + mockScope, + mockOrigin, + ); + + expect(loggerSpy).toHaveBeenCalledWith( + '[📣 AnalyticsService] Tracking event transaction rejected', + ); + + expect(mockSnapRequest).toHaveBeenCalledWith({ + method: 'snap_trackEvent', + params: { + event: { + event: 'Transaction Rejected', + properties: { + message: 'Snap transaction rejected', + origin: mockOrigin, + account_id: mockAccount.id, + account_address: mockAccount.address, + account_type: mockAccount.type, + chain_id: mockScope, + }, + }, + }, + }); + }); + + it('tracks transaction rejected event without origin', async () => { + await analyticsService.trackEventTransactionRejected( + mockAccount, + mockBase64Transaction, + mockScope, + ); + + expect(mockSnapRequest).toHaveBeenCalledWith({ + method: 'snap_trackEvent', + params: { + event: { + event: 'Transaction Rejected', + properties: { + message: 'Snap transaction rejected', + origin: null, + account_id: mockAccount.id, + account_address: mockAccount.address, + account_type: mockAccount.type, + chain_id: mockScope, + }, + }, + }, + }); + }); + + it('throws error for invalid base64 transaction', async () => { + const invalidBase64 = 'invalid-base64!@#'; + + await expect( + analyticsService.trackEventTransactionRejected( + mockAccount, + invalidBase64, + mockScope, + mockOrigin, + ), + ).rejects.toThrow(); + }); + }); + + describe('error handling', () => { + it('handles snap.request errors gracefully', async () => { + const error = new Error('Snap request failed'); + mockSnapRequest.mockRejectedValue(error); + + await expect( + analyticsService.trackEventTransactionAdded( + mockAccount, + mockBase64Transaction, + mockScope, + mockOrigin, + ), + ).rejects.toThrow('Snap request failed'); + }); + }); +}); From b71589365b95536e440781f56c1b3323a99a6527 Mon Sep 17 00:00:00 2001 From: Antonio Regadas Date: Thu, 12 Jun 2025 14:31:34 +0100 Subject: [PATCH 05/22] chore: adds eslint-disable --- .../snap/src/core/services/analytics/AnalyticsService.test.ts | 2 ++ 1 file changed, 2 insertions(+) diff --git a/packages/snap/src/core/services/analytics/AnalyticsService.test.ts b/packages/snap/src/core/services/analytics/AnalyticsService.test.ts index d41dcde37..9c7ab0a83 100644 --- a/packages/snap/src/core/services/analytics/AnalyticsService.test.ts +++ b/packages/snap/src/core/services/analytics/AnalyticsService.test.ts @@ -1,3 +1,5 @@ +/* eslint-disable @typescript-eslint/naming-convention */ +/* eslint-disable jest/require-to-throw-message */ import type { Transaction } from '@metamask/keyring-api'; import { Network } from '../../constants/solana'; From e6a6c076bd9c6eb4a1efc7b2e29429204aba1e14 Mon Sep 17 00:00:00 2001 From: Antonio Regadas Date: Thu, 12 Jun 2025 15:46:30 +0100 Subject: [PATCH 06/22] chore: adds nullable for origin --- .../onCronjob/backgroundEvents/onTransactionAdded.ts | 6 +++--- .../onCronjob/backgroundEvents/onTransactionApproved.ts | 6 +++--- .../onCronjob/backgroundEvents/onTransactionFinalized.ts | 6 +++--- .../onCronjob/backgroundEvents/onTransactionRejected.ts | 6 +++--- .../onCronjob/backgroundEvents/onTransactionSubmitted.ts | 6 +++--- 5 files changed, 15 insertions(+), 15 deletions(-) diff --git a/packages/snap/src/core/handlers/onCronjob/backgroundEvents/onTransactionAdded.ts b/packages/snap/src/core/handlers/onCronjob/backgroundEvents/onTransactionAdded.ts index 291c8929d..8c0b4dd69 100644 --- a/packages/snap/src/core/handlers/onCronjob/backgroundEvents/onTransactionAdded.ts +++ b/packages/snap/src/core/handlers/onCronjob/backgroundEvents/onTransactionAdded.ts @@ -1,5 +1,5 @@ import { InternalError, type OnCronjobHandler } from '@metamask/snaps-sdk'; -import { assert, literal, object, string } from '@metamask/superstruct'; +import { assert, literal, nullable, object, string } from '@metamask/superstruct'; import { analyticsService, keyring } from '../../../../snapContext'; import logger from '../../../utils/logger'; @@ -19,7 +19,7 @@ export const OnTransactionAddedRequestStruct = object({ /** The base64 encoded transaction or transaction message. */ base64EncodedTransaction: Base64Struct, scope: NetworkStruct, - origin: string(), + origin: nullable(string()), }), }); @@ -45,7 +45,7 @@ export const onTransactionAdded: OnCronjobHandler = async ({ request }) => { account, base64EncodedTransaction, scope, - origin, + origin ?? undefined, ); } catch (error) { logger.error(error); diff --git a/packages/snap/src/core/handlers/onCronjob/backgroundEvents/onTransactionApproved.ts b/packages/snap/src/core/handlers/onCronjob/backgroundEvents/onTransactionApproved.ts index 9b63b89d2..6a89a5029 100644 --- a/packages/snap/src/core/handlers/onCronjob/backgroundEvents/onTransactionApproved.ts +++ b/packages/snap/src/core/handlers/onCronjob/backgroundEvents/onTransactionApproved.ts @@ -1,5 +1,5 @@ import { InternalError, type OnCronjobHandler } from '@metamask/snaps-sdk'; -import { assert, literal, object, string } from '@metamask/superstruct'; +import { assert, literal, nullable, object, string } from '@metamask/superstruct'; import { analyticsService, keyring } from '../../../../snapContext'; import logger from '../../../utils/logger'; @@ -19,7 +19,7 @@ export const OnTransactionApprovedRequestStruct = object({ /** The base64 encoded transaction or transaction message. */ base64EncodedTransaction: Base64Struct, scope: NetworkStruct, - origin: string(), + origin: nullable(string()), }), }); @@ -45,7 +45,7 @@ export const onTransactionApproved: OnCronjobHandler = async ({ request }) => { account, base64EncodedTransaction, scope, - origin, + origin ?? undefined, ); } catch (error) { logger.error(error); diff --git a/packages/snap/src/core/handlers/onCronjob/backgroundEvents/onTransactionFinalized.ts b/packages/snap/src/core/handlers/onCronjob/backgroundEvents/onTransactionFinalized.ts index e29470398..8a2c428f9 100644 --- a/packages/snap/src/core/handlers/onCronjob/backgroundEvents/onTransactionFinalized.ts +++ b/packages/snap/src/core/handlers/onCronjob/backgroundEvents/onTransactionFinalized.ts @@ -1,6 +1,6 @@ import { TransactionStruct } from '@metamask/keyring-api'; import { InternalError, type OnCronjobHandler } from '@metamask/snaps-sdk'; -import { assert, literal, object, string } from '@metamask/superstruct'; +import { assert, literal, nullable, object, string } from '@metamask/superstruct'; import { analyticsService, @@ -19,7 +19,7 @@ export const OnTransactionFinalizedRequestStruct = object({ params: object({ accountId: UuidStruct, transaction: TransactionStruct, - origin: string(), + origin: nullable(string()), }), }); @@ -65,7 +65,7 @@ export const onTransactionFinalized: OnCronjobHandler = async ({ request }) => { const trackEventPromise = analyticsService.trackEventTransactionFinalized( account, transaction, - origin, + origin ?? undefined, ); await Promise.all([ diff --git a/packages/snap/src/core/handlers/onCronjob/backgroundEvents/onTransactionRejected.ts b/packages/snap/src/core/handlers/onCronjob/backgroundEvents/onTransactionRejected.ts index 086ebda0f..2cde19ec9 100644 --- a/packages/snap/src/core/handlers/onCronjob/backgroundEvents/onTransactionRejected.ts +++ b/packages/snap/src/core/handlers/onCronjob/backgroundEvents/onTransactionRejected.ts @@ -1,5 +1,5 @@ import { InternalError, type OnCronjobHandler } from '@metamask/snaps-sdk'; -import { assert, literal, object, string } from '@metamask/superstruct'; +import { assert, literal, nullable, object, string } from '@metamask/superstruct'; import { analyticsService, keyring } from '../../../../snapContext'; import logger from '../../../utils/logger'; @@ -19,7 +19,7 @@ export const OnTransactionRejectedRequestStruct = object({ /** The base64 encoded transaction or transaction message. */ base64EncodedTransaction: Base64Struct, scope: NetworkStruct, - origin: string(), + origin: nullable(string()), }), }); @@ -45,7 +45,7 @@ export const onTransactionRejected: OnCronjobHandler = async ({ request }) => { account, base64EncodedTransaction, scope, - origin, + origin ?? undefined, ); } catch (error) { logger.error(error); diff --git a/packages/snap/src/core/handlers/onCronjob/backgroundEvents/onTransactionSubmitted.ts b/packages/snap/src/core/handlers/onCronjob/backgroundEvents/onTransactionSubmitted.ts index 34439a26e..fa8325345 100644 --- a/packages/snap/src/core/handlers/onCronjob/backgroundEvents/onTransactionSubmitted.ts +++ b/packages/snap/src/core/handlers/onCronjob/backgroundEvents/onTransactionSubmitted.ts @@ -1,5 +1,5 @@ import { InternalError, type OnCronjobHandler } from '@metamask/snaps-sdk'; -import { assert, literal, object, string } from '@metamask/superstruct'; +import { assert, literal, nullable, object, string } from '@metamask/superstruct'; import { analyticsService, keyring } from '../../../../snapContext'; import logger from '../../../utils/logger'; @@ -20,7 +20,7 @@ export const OnTransactionSubmittedRequestStruct = object({ transactionMessageBase64Encoded: Base64Struct, signature: string(), scope: NetworkStruct, - origin: string(), + origin: nullable(string()), }), }); @@ -52,7 +52,7 @@ export const onTransactionSubmitted: OnCronjobHandler = async ({ request }) => { transactionMessageBase64Encoded, signature, scope, - origin, + origin ?? undefined, ); } catch (error) { logger.error(error); From 4d5e30e8ed06022a82b6c8a84bc5288e7664b810 Mon Sep 17 00:00:00 2001 From: Antonio Regadas Date: Thu, 12 Jun 2025 16:08:19 +0100 Subject: [PATCH 07/22] chore: prettier --- .../onCronjob/backgroundEvents/onTransactionAdded.ts | 8 +++++++- .../onCronjob/backgroundEvents/onTransactionApproved.ts | 8 +++++++- .../onCronjob/backgroundEvents/onTransactionFinalized.ts | 8 +++++++- .../onCronjob/backgroundEvents/onTransactionRejected.ts | 8 +++++++- .../onCronjob/backgroundEvents/onTransactionSubmitted.ts | 8 +++++++- 5 files changed, 35 insertions(+), 5 deletions(-) diff --git a/packages/snap/src/core/handlers/onCronjob/backgroundEvents/onTransactionAdded.ts b/packages/snap/src/core/handlers/onCronjob/backgroundEvents/onTransactionAdded.ts index 8c0b4dd69..bd6498d9f 100644 --- a/packages/snap/src/core/handlers/onCronjob/backgroundEvents/onTransactionAdded.ts +++ b/packages/snap/src/core/handlers/onCronjob/backgroundEvents/onTransactionAdded.ts @@ -1,5 +1,11 @@ import { InternalError, type OnCronjobHandler } from '@metamask/snaps-sdk'; -import { assert, literal, nullable, object, string } from '@metamask/superstruct'; +import { + assert, + literal, + nullable, + object, + string, +} from '@metamask/superstruct'; import { analyticsService, keyring } from '../../../../snapContext'; import logger from '../../../utils/logger'; diff --git a/packages/snap/src/core/handlers/onCronjob/backgroundEvents/onTransactionApproved.ts b/packages/snap/src/core/handlers/onCronjob/backgroundEvents/onTransactionApproved.ts index 6a89a5029..a10ffbbb9 100644 --- a/packages/snap/src/core/handlers/onCronjob/backgroundEvents/onTransactionApproved.ts +++ b/packages/snap/src/core/handlers/onCronjob/backgroundEvents/onTransactionApproved.ts @@ -1,5 +1,11 @@ import { InternalError, type OnCronjobHandler } from '@metamask/snaps-sdk'; -import { assert, literal, nullable, object, string } from '@metamask/superstruct'; +import { + assert, + literal, + nullable, + object, + string, +} from '@metamask/superstruct'; import { analyticsService, keyring } from '../../../../snapContext'; import logger from '../../../utils/logger'; diff --git a/packages/snap/src/core/handlers/onCronjob/backgroundEvents/onTransactionFinalized.ts b/packages/snap/src/core/handlers/onCronjob/backgroundEvents/onTransactionFinalized.ts index 8a2c428f9..b0085889e 100644 --- a/packages/snap/src/core/handlers/onCronjob/backgroundEvents/onTransactionFinalized.ts +++ b/packages/snap/src/core/handlers/onCronjob/backgroundEvents/onTransactionFinalized.ts @@ -1,6 +1,12 @@ import { TransactionStruct } from '@metamask/keyring-api'; import { InternalError, type OnCronjobHandler } from '@metamask/snaps-sdk'; -import { assert, literal, nullable, object, string } from '@metamask/superstruct'; +import { + assert, + literal, + nullable, + object, + string, +} from '@metamask/superstruct'; import { analyticsService, diff --git a/packages/snap/src/core/handlers/onCronjob/backgroundEvents/onTransactionRejected.ts b/packages/snap/src/core/handlers/onCronjob/backgroundEvents/onTransactionRejected.ts index 2cde19ec9..29c468980 100644 --- a/packages/snap/src/core/handlers/onCronjob/backgroundEvents/onTransactionRejected.ts +++ b/packages/snap/src/core/handlers/onCronjob/backgroundEvents/onTransactionRejected.ts @@ -1,5 +1,11 @@ import { InternalError, type OnCronjobHandler } from '@metamask/snaps-sdk'; -import { assert, literal, nullable, object, string } from '@metamask/superstruct'; +import { + assert, + literal, + nullable, + object, + string, +} from '@metamask/superstruct'; import { analyticsService, keyring } from '../../../../snapContext'; import logger from '../../../utils/logger'; diff --git a/packages/snap/src/core/handlers/onCronjob/backgroundEvents/onTransactionSubmitted.ts b/packages/snap/src/core/handlers/onCronjob/backgroundEvents/onTransactionSubmitted.ts index fa8325345..d438c745d 100644 --- a/packages/snap/src/core/handlers/onCronjob/backgroundEvents/onTransactionSubmitted.ts +++ b/packages/snap/src/core/handlers/onCronjob/backgroundEvents/onTransactionSubmitted.ts @@ -1,5 +1,11 @@ import { InternalError, type OnCronjobHandler } from '@metamask/snaps-sdk'; -import { assert, literal, nullable, object, string } from '@metamask/superstruct'; +import { + assert, + literal, + nullable, + object, + string, +} from '@metamask/superstruct'; import { analyticsService, keyring } from '../../../../snapContext'; import logger from '../../../utils/logger'; From 2a8f57a1501ffba4c3ccafb839a7f0ef9ff82ebc Mon Sep 17 00:00:00 2001 From: Antonio Regadas Date: Thu, 12 Jun 2025 16:15:11 +0100 Subject: [PATCH 08/22] chore: shasum --- packages/snap/snap.manifest.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/snap/snap.manifest.json b/packages/snap/snap.manifest.json index 180d93cfa..22088a225 100644 --- a/packages/snap/snap.manifest.json +++ b/packages/snap/snap.manifest.json @@ -7,7 +7,7 @@ "url": "https://github.com/MetaMask/snap-solana-wallet.git" }, "source": { - "shasum": "EGGUPYai59gRqh4hElI0w8LM4ghzDfHMWxVomsaPLl8=", + "shasum": "7HPZTKQiA1U8iDDfA1vTbxJUocgwVyTOoiPaNdApkiM=", "location": { "npm": { "filePath": "dist/bundle.js", From 00f79cf078718e871c9a770187b4e0c99ba21122 Mon Sep 17 00:00:00 2001 From: Antonio Regadas Date: Fri, 13 Jun 2025 15:07:32 +0100 Subject: [PATCH 09/22] chore: adds the metadata object --- packages/snap/src/core/constants/solana.ts | 5 +++ .../backgroundEvents/onTransactionAdded.ts | 12 +++--- .../backgroundEvents/onTransactionApproved.ts | 12 +++--- .../onTransactionFinalized.test.ts | 10 ++++- .../onTransactionFinalized.ts | 9 ++-- .../backgroundEvents/onTransactionRejected.ts | 12 +++--- .../onTransactionSubmitted.ts | 18 ++++---- .../analytics/AnalyticsService.test.ts | 42 +++++++++---------- .../services/analytics/AnalyticsService.ts | 36 +++++++--------- .../confirmation/ConfirmationHandler.ts | 18 +++++--- .../src/core/services/wallet/WalletService.ts | 11 +++-- .../features/send/views/SendForm/events.tsx | 5 ++- .../views/TransactionConfirmation/events.tsx | 10 ++++- 13 files changed, 111 insertions(+), 89 deletions(-) diff --git a/packages/snap/src/core/constants/solana.ts b/packages/snap/src/core/constants/solana.ts index 02e5f9150..838ba084a 100644 --- a/packages/snap/src/core/constants/solana.ts +++ b/packages/snap/src/core/constants/solana.ts @@ -51,6 +51,11 @@ export type TokenInfo = { decimals: number; }; +export type TransactionMetadata = { + scope: Network; + origin: string | null; +}; + export const TokenMetadata = { [KnownCaip19Id.SolMainnet]: { symbol: 'SOL', diff --git a/packages/snap/src/core/handlers/onCronjob/backgroundEvents/onTransactionAdded.ts b/packages/snap/src/core/handlers/onCronjob/backgroundEvents/onTransactionAdded.ts index bd6498d9f..146c62447 100644 --- a/packages/snap/src/core/handlers/onCronjob/backgroundEvents/onTransactionAdded.ts +++ b/packages/snap/src/core/handlers/onCronjob/backgroundEvents/onTransactionAdded.ts @@ -24,8 +24,10 @@ export const OnTransactionAddedRequestStruct = object({ accountId: UuidStruct, /** The base64 encoded transaction or transaction message. */ base64EncodedTransaction: Base64Struct, - scope: NetworkStruct, - origin: nullable(string()), + metadata: object({ + scope: NetworkStruct, + origin: nullable(string()), + }), }), }); @@ -42,16 +44,14 @@ export const onTransactionAdded: OnCronjobHandler = async ({ request }) => { assert(request, OnTransactionAddedRequestStruct); - const { accountId, base64EncodedTransaction, scope, origin } = - request.params; + const { accountId, base64EncodedTransaction, metadata } = request.params; const account = await keyring.getAccountOrThrow(accountId); await analyticsService.trackEventTransactionAdded( account, base64EncodedTransaction, - scope, - origin ?? undefined, + metadata, ); } catch (error) { logger.error(error); diff --git a/packages/snap/src/core/handlers/onCronjob/backgroundEvents/onTransactionApproved.ts b/packages/snap/src/core/handlers/onCronjob/backgroundEvents/onTransactionApproved.ts index a10ffbbb9..f17a69053 100644 --- a/packages/snap/src/core/handlers/onCronjob/backgroundEvents/onTransactionApproved.ts +++ b/packages/snap/src/core/handlers/onCronjob/backgroundEvents/onTransactionApproved.ts @@ -24,8 +24,10 @@ export const OnTransactionApprovedRequestStruct = object({ accountId: UuidStruct, /** The base64 encoded transaction or transaction message. */ base64EncodedTransaction: Base64Struct, - scope: NetworkStruct, - origin: nullable(string()), + metadata: object({ + scope: NetworkStruct, + origin: nullable(string()), + }), }), }); @@ -42,16 +44,14 @@ export const onTransactionApproved: OnCronjobHandler = async ({ request }) => { assert(request, OnTransactionApprovedRequestStruct); - const { accountId, base64EncodedTransaction, scope, origin } = - request.params; + const { accountId, base64EncodedTransaction, metadata } = request.params; const account = await keyring.getAccountOrThrow(accountId); await analyticsService.trackEventTransactionApproved( account, base64EncodedTransaction, - scope, - origin ?? undefined, + metadata, ); } catch (error) { logger.error(error); diff --git a/packages/snap/src/core/handlers/onCronjob/backgroundEvents/onTransactionFinalized.test.ts b/packages/snap/src/core/handlers/onCronjob/backgroundEvents/onTransactionFinalized.test.ts index bd644241d..15d976126 100644 --- a/packages/snap/src/core/handlers/onCronjob/backgroundEvents/onTransactionFinalized.test.ts +++ b/packages/snap/src/core/handlers/onCronjob/backgroundEvents/onTransactionFinalized.test.ts @@ -118,7 +118,10 @@ describe('onTransactionFinalized', () => { params: { accountId: mockAccountId, transaction: mockTransaction, - origin: mockOrigin, + metadata: { + scope: Network.Testnet, + origin: mockOrigin, + }, }, }, }); @@ -190,7 +193,10 @@ describe('onTransactionFinalized', () => { params: { accountId: mockAccountId, transaction: mockTransaction, - origin: mockOrigin, + metadata: { + scope: Network.Testnet, + origin: mockOrigin, + }, }, }, }); diff --git a/packages/snap/src/core/handlers/onCronjob/backgroundEvents/onTransactionFinalized.ts b/packages/snap/src/core/handlers/onCronjob/backgroundEvents/onTransactionFinalized.ts index b0085889e..6ae4aacf1 100644 --- a/packages/snap/src/core/handlers/onCronjob/backgroundEvents/onTransactionFinalized.ts +++ b/packages/snap/src/core/handlers/onCronjob/backgroundEvents/onTransactionFinalized.ts @@ -25,7 +25,10 @@ export const OnTransactionFinalizedRequestStruct = object({ params: object({ accountId: UuidStruct, transaction: TransactionStruct, - origin: nullable(string()), + metadata: object({ + scope: NetworkStruct, + origin: nullable(string()), + }), }), }); @@ -43,7 +46,7 @@ export const onTransactionFinalized: OnCronjobHandler = async ({ request }) => { assert(request, OnTransactionFinalizedRequestStruct); - const { accountId, transaction, origin } = request.params; + const { accountId, transaction, metadata } = request.params; const account = await keyring.getAccountOrThrow(accountId); @@ -71,7 +74,7 @@ export const onTransactionFinalized: OnCronjobHandler = async ({ request }) => { const trackEventPromise = analyticsService.trackEventTransactionFinalized( account, transaction, - origin ?? undefined, + metadata, ); await Promise.all([ diff --git a/packages/snap/src/core/handlers/onCronjob/backgroundEvents/onTransactionRejected.ts b/packages/snap/src/core/handlers/onCronjob/backgroundEvents/onTransactionRejected.ts index 29c468980..a98db2ab7 100644 --- a/packages/snap/src/core/handlers/onCronjob/backgroundEvents/onTransactionRejected.ts +++ b/packages/snap/src/core/handlers/onCronjob/backgroundEvents/onTransactionRejected.ts @@ -24,8 +24,10 @@ export const OnTransactionRejectedRequestStruct = object({ accountId: UuidStruct, /** The base64 encoded transaction or transaction message. */ base64EncodedTransaction: Base64Struct, - scope: NetworkStruct, - origin: nullable(string()), + metadata: object({ + scope: NetworkStruct, + origin: nullable(string()), + }), }), }); @@ -42,16 +44,14 @@ export const onTransactionRejected: OnCronjobHandler = async ({ request }) => { assert(request, OnTransactionRejectedRequestStruct); - const { accountId, base64EncodedTransaction, scope, origin } = - request.params; + const { accountId, base64EncodedTransaction, metadata } = request.params; const account = await keyring.getAccountOrThrow(accountId); await analyticsService.trackEventTransactionRejected( account, base64EncodedTransaction, - scope, - origin ?? undefined, + metadata, ); } catch (error) { logger.error(error); diff --git a/packages/snap/src/core/handlers/onCronjob/backgroundEvents/onTransactionSubmitted.ts b/packages/snap/src/core/handlers/onCronjob/backgroundEvents/onTransactionSubmitted.ts index d438c745d..08f64abc1 100644 --- a/packages/snap/src/core/handlers/onCronjob/backgroundEvents/onTransactionSubmitted.ts +++ b/packages/snap/src/core/handlers/onCronjob/backgroundEvents/onTransactionSubmitted.ts @@ -25,8 +25,10 @@ export const OnTransactionSubmittedRequestStruct = object({ /** The base64 encoded transaction message. */ transactionMessageBase64Encoded: Base64Struct, signature: string(), - scope: NetworkStruct, - origin: nullable(string()), + metadata: object({ + scope: NetworkStruct, + origin: nullable(string()), + }), }), }); @@ -43,13 +45,8 @@ export const onTransactionSubmitted: OnCronjobHandler = async ({ request }) => { assert(request, OnTransactionSubmittedRequestStruct); - const { - accountId, - transactionMessageBase64Encoded, - signature, - scope, - origin, - } = request.params; + const { accountId, transactionMessageBase64Encoded, signature, metadata } = + request.params; const account = await keyring.getAccountOrThrow(accountId); @@ -57,8 +54,7 @@ export const onTransactionSubmitted: OnCronjobHandler = async ({ request }) => { account, transactionMessageBase64Encoded, signature, - scope, - origin ?? undefined, + metadata, ); } catch (error) { logger.error(error); diff --git a/packages/snap/src/core/services/analytics/AnalyticsService.test.ts b/packages/snap/src/core/services/analytics/AnalyticsService.test.ts index 9c7ab0a83..5686e57d2 100644 --- a/packages/snap/src/core/services/analytics/AnalyticsService.test.ts +++ b/packages/snap/src/core/services/analytics/AnalyticsService.test.ts @@ -22,6 +22,10 @@ describe('AnalyticsService', () => { const mockScope = Network.Mainnet; const mockOrigin = 'https://metamask.io'; const mockSignature = 'mockedSignature'; + const mockMetadata = { + scope: mockScope, + origin: mockOrigin, + }; beforeEach(() => { jest.clearAllMocks(); @@ -39,8 +43,7 @@ describe('AnalyticsService', () => { await analyticsService.trackEventTransactionAdded( mockAccount, mockBase64Transaction, - mockScope, - mockOrigin, + mockMetadata, ); expect(loggerSpy).toHaveBeenCalledWith( @@ -69,7 +72,7 @@ describe('AnalyticsService', () => { await analyticsService.trackEventTransactionAdded( mockAccount, mockBase64Transaction, - mockScope, + mockMetadata, ); expect(mockSnapRequest).toHaveBeenCalledWith({ @@ -97,8 +100,7 @@ describe('AnalyticsService', () => { analyticsService.trackEventTransactionAdded( mockAccount, invalidBase64, - mockScope, - mockOrigin, + mockMetadata, ), ).rejects.toThrow(); }); @@ -109,8 +111,7 @@ describe('AnalyticsService', () => { await analyticsService.trackEventTransactionApproved( mockAccount, mockBase64Transaction, - mockScope, - mockOrigin, + mockMetadata, ); expect(loggerSpy).toHaveBeenCalledWith( @@ -139,7 +140,7 @@ describe('AnalyticsService', () => { await analyticsService.trackEventTransactionApproved( mockAccount, mockBase64Transaction, - mockScope, + mockMetadata, ); expect(mockSnapRequest).toHaveBeenCalledWith({ @@ -167,8 +168,7 @@ describe('AnalyticsService', () => { analyticsService.trackEventTransactionApproved( mockAccount, invalidBase64, - mockScope, - mockOrigin, + mockMetadata, ), ).rejects.toThrow(); }); @@ -180,8 +180,7 @@ describe('AnalyticsService', () => { mockAccount, mockBase64Transaction, mockSignature, - mockScope, - mockOrigin, + mockMetadata, ); expect(loggerSpy).toHaveBeenCalledWith( @@ -211,7 +210,7 @@ describe('AnalyticsService', () => { mockAccount, mockBase64Transaction, mockSignature, - mockScope, + mockMetadata, ); expect(mockSnapRequest).toHaveBeenCalledWith({ @@ -240,8 +239,7 @@ describe('AnalyticsService', () => { mockAccount, invalidBase64, mockSignature, - mockScope, - mockOrigin, + mockMetadata, ), ).rejects.toThrow(); }); @@ -300,7 +298,7 @@ describe('AnalyticsService', () => { await analyticsService.trackEventTransactionFinalized( mockAccount, mockTransaction, - mockOrigin, + mockMetadata, ); expect(loggerSpy).toHaveBeenCalledWith( @@ -331,6 +329,7 @@ describe('AnalyticsService', () => { await analyticsService.trackEventTransactionFinalized( mockAccount, mockTransaction, + mockMetadata, ); expect(mockSnapRequest).toHaveBeenCalledWith({ @@ -359,8 +358,7 @@ describe('AnalyticsService', () => { await analyticsService.trackEventTransactionRejected( mockAccount, mockBase64Transaction, - mockScope, - mockOrigin, + mockMetadata, ); expect(loggerSpy).toHaveBeenCalledWith( @@ -389,7 +387,7 @@ describe('AnalyticsService', () => { await analyticsService.trackEventTransactionRejected( mockAccount, mockBase64Transaction, - mockScope, + mockMetadata, ); expect(mockSnapRequest).toHaveBeenCalledWith({ @@ -417,8 +415,7 @@ describe('AnalyticsService', () => { analyticsService.trackEventTransactionRejected( mockAccount, invalidBase64, - mockScope, - mockOrigin, + mockMetadata, ), ).rejects.toThrow(); }); @@ -433,8 +430,7 @@ describe('AnalyticsService', () => { analyticsService.trackEventTransactionAdded( mockAccount, mockBase64Transaction, - mockScope, - mockOrigin, + mockMetadata, ), ).rejects.toThrow('Snap request failed'); }); diff --git a/packages/snap/src/core/services/analytics/AnalyticsService.ts b/packages/snap/src/core/services/analytics/AnalyticsService.ts index 5ebcbf371..4cc8b5d72 100644 --- a/packages/snap/src/core/services/analytics/AnalyticsService.ts +++ b/packages/snap/src/core/services/analytics/AnalyticsService.ts @@ -3,7 +3,7 @@ import type { Transaction } from '@metamask/keyring-api'; import { assert } from '@metamask/superstruct'; import type { SolanaKeyringAccount } from '../../../entities'; -import type { Network } from '../../constants/solana'; +import type { TransactionMetadata } from '../../constants/solana'; import logger from '../../utils/logger'; import { Base64Struct } from '../../validation/structs'; @@ -20,8 +20,7 @@ export class AnalyticsService { async trackEventTransactionAdded( account: SolanaKeyringAccount, base64EncodedTransaction: string, - scope: Network, - origin?: string, + metadata: TransactionMetadata, ): Promise { this.#logger.log(`[📣 AnalyticsService] Tracking event transaction added`); @@ -34,11 +33,11 @@ export class AnalyticsService { event: 'Transaction Added', properties: { message: 'Snap transaction added', - origin: origin ?? null, + origin: metadata.origin ?? null, account_id: account.id, account_address: account.address, account_type: account.type, - chain_id: scope, + chain_id: metadata.scope, }, }, }, @@ -48,8 +47,7 @@ export class AnalyticsService { async trackEventTransactionApproved( account: SolanaKeyringAccount, base64EncodedTransaction: string, - scope: Network, - origin?: string, + metadata: TransactionMetadata, ): Promise { this.#logger.log( `[📣 AnalyticsService] Tracking event transaction approved`, @@ -64,11 +62,11 @@ export class AnalyticsService { event: 'Transaction Approved', properties: { message: 'Snap transaction approved', - origin: origin ?? null, + origin: metadata.origin ?? null, account_id: account.id, account_address: account.address, account_type: account.type, - chain_id: scope, + chain_id: metadata.scope, }, }, }, @@ -79,8 +77,7 @@ export class AnalyticsService { account: SolanaKeyringAccount, transactionMessageBase64Encoded: string, signature: string, - scope: Network, - origin?: string, + metadata: TransactionMetadata, ): Promise { this.#logger.log( `[📣 AnalyticsService] Tracking event transaction submitted`, @@ -95,11 +92,11 @@ export class AnalyticsService { event: 'Transaction Submitted', properties: { message: 'Snap transaction submitted', - origin: origin ?? null, + origin: metadata.origin ?? null, account_id: account.id, account_address: account.address, account_type: account.type, - chain_id: scope, + chain_id: metadata.scope, }, }, }, @@ -109,7 +106,7 @@ export class AnalyticsService { async trackEventTransactionFinalized( account: SolanaKeyringAccount, transaction: Transaction, - origin?: string, + metadata: TransactionMetadata, ): Promise { this.#logger.log( `[📣 AnalyticsService] Tracking event transaction finalized`, @@ -122,11 +119,11 @@ export class AnalyticsService { event: 'Transaction Finalized', properties: { message: 'Snap transaction finalized', - origin: origin ?? null, + origin: metadata.origin ?? null, account_id: account.id, account_address: account.address, account_type: account.type, - chain_id: transaction.chain, + chain_id: metadata.scope, transaction_status: transaction.status, transaction_type: transaction.type, }, @@ -138,8 +135,7 @@ export class AnalyticsService { async trackEventTransactionRejected( account: SolanaKeyringAccount, base64EncodedTransaction: string, - scope: Network, - origin?: string, + metadata: TransactionMetadata, ): Promise { this.#logger.log( `[📣 AnalyticsService] Tracking event transaction rejected`, @@ -154,11 +150,11 @@ export class AnalyticsService { event: 'Transaction Rejected', properties: { message: 'Snap transaction rejected', - origin: origin ?? null, + origin: metadata.origin ?? null, account_id: account.id, account_address: account.address, account_type: account.type, - chain_id: scope, + chain_id: metadata.scope, }, }, }, diff --git a/packages/snap/src/core/services/confirmation/ConfirmationHandler.ts b/packages/snap/src/core/services/confirmation/ConfirmationHandler.ts index 1fd8e45b7..cb343d88c 100644 --- a/packages/snap/src/core/services/confirmation/ConfirmationHandler.ts +++ b/packages/snap/src/core/services/confirmation/ConfirmationHandler.ts @@ -92,8 +92,10 @@ export class ConfirmationHandler { params: { accountId, base64EncodedTransaction, - scope, - origin, + metadata: { + scope, + origin, + }, }, }, }, @@ -119,8 +121,10 @@ export class ConfirmationHandler { params: { accountId, base64EncodedTransaction, - scope, - origin, + metadata: { + scope, + origin, + }, }, }, }, @@ -139,8 +143,10 @@ export class ConfirmationHandler { params: { accountId, base64EncodedTransaction, - scope, - origin, + metadata: { + scope, + origin, + }, }, }, }, diff --git a/packages/snap/src/core/services/wallet/WalletService.ts b/packages/snap/src/core/services/wallet/WalletService.ts index efb67c52d..db68f6dee 100644 --- a/packages/snap/src/core/services/wallet/WalletService.ts +++ b/packages/snap/src/core/services/wallet/WalletService.ts @@ -286,8 +286,10 @@ export class WalletService { accountId: account.id, transactionMessageBase64Encoded, signature, - scope, - origin: origin ?? null, + metadata: { + scope, + origin: origin ?? null, + }, }, }, }, @@ -343,7 +345,10 @@ export class WalletService { params: { accountId: account.id, transaction: mappedTransactionWithAccountId, - origin: origin ?? null, + metadata: { + scope, + origin: origin ?? null, + }, }, }, }, diff --git a/packages/snap/src/features/send/views/SendForm/events.tsx b/packages/snap/src/features/send/views/SendForm/events.tsx index e788ffa0c..1c4504e1a 100644 --- a/packages/snap/src/features/send/views/SendForm/events.tsx +++ b/packages/snap/src/features/send/views/SendForm/events.tsx @@ -466,7 +466,10 @@ async function onSendButtonClick({ params: { accountId: context.fromAccountId, base64EncodedTransaction: context.transactionMessage, - scope: context.scope, + metadata: { + scope: context.scope, + origin: null, + }, }, }, }, diff --git a/packages/snap/src/features/send/views/TransactionConfirmation/events.tsx b/packages/snap/src/features/send/views/TransactionConfirmation/events.tsx index 1b931673b..afbfa3d29 100644 --- a/packages/snap/src/features/send/views/TransactionConfirmation/events.tsx +++ b/packages/snap/src/features/send/views/TransactionConfirmation/events.tsx @@ -68,7 +68,10 @@ async function onCancelButtonClick({ params: { accountId: fromAccountId, base64EncodedTransaction: transactionMessage, - scope, + metadata: { + scope, + origin: null, + }, }, }, }, @@ -115,7 +118,10 @@ async function onConfirmButtonClick({ params: { accountId: context.fromAccountId, base64EncodedTransaction: context.transactionMessage, - scope: context.scope, + metadata: { + scope: context.scope, + origin: null, + }, }, }, }, From 1a2976778660764dea3d7b8d6cc0f2efb3da8d01 Mon Sep 17 00:00:00 2001 From: Antonio Regadas Date: Fri, 13 Jun 2025 15:13:53 +0100 Subject: [PATCH 10/22] chore: clean up --- .../services/analytics/AnalyticsService.test.ts | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/packages/snap/src/core/services/analytics/AnalyticsService.test.ts b/packages/snap/src/core/services/analytics/AnalyticsService.test.ts index 5686e57d2..c91ccc7f2 100644 --- a/packages/snap/src/core/services/analytics/AnalyticsService.test.ts +++ b/packages/snap/src/core/services/analytics/AnalyticsService.test.ts @@ -26,6 +26,10 @@ describe('AnalyticsService', () => { scope: mockScope, origin: mockOrigin, }; + const mockMetadataWithoutOrigin = { + scope: mockScope, + origin: null, + }; beforeEach(() => { jest.clearAllMocks(); @@ -72,7 +76,7 @@ describe('AnalyticsService', () => { await analyticsService.trackEventTransactionAdded( mockAccount, mockBase64Transaction, - mockMetadata, + mockMetadataWithoutOrigin, ); expect(mockSnapRequest).toHaveBeenCalledWith({ @@ -140,7 +144,7 @@ describe('AnalyticsService', () => { await analyticsService.trackEventTransactionApproved( mockAccount, mockBase64Transaction, - mockMetadata, + mockMetadataWithoutOrigin, ); expect(mockSnapRequest).toHaveBeenCalledWith({ @@ -210,7 +214,7 @@ describe('AnalyticsService', () => { mockAccount, mockBase64Transaction, mockSignature, - mockMetadata, + mockMetadataWithoutOrigin, ); expect(mockSnapRequest).toHaveBeenCalledWith({ @@ -329,7 +333,7 @@ describe('AnalyticsService', () => { await analyticsService.trackEventTransactionFinalized( mockAccount, mockTransaction, - mockMetadata, + mockMetadataWithoutOrigin, ); expect(mockSnapRequest).toHaveBeenCalledWith({ @@ -387,7 +391,7 @@ describe('AnalyticsService', () => { await analyticsService.trackEventTransactionRejected( mockAccount, mockBase64Transaction, - mockMetadata, + mockMetadataWithoutOrigin, ); expect(mockSnapRequest).toHaveBeenCalledWith({ From aa38f8ba0da0b77265218a635103b674e14615cf Mon Sep 17 00:00:00 2001 From: Antonio Regadas Date: Fri, 13 Jun 2025 15:18:22 +0100 Subject: [PATCH 11/22] chore: shasum --- packages/snap/snap.manifest.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/snap/snap.manifest.json b/packages/snap/snap.manifest.json index 22088a225..460a70e1f 100644 --- a/packages/snap/snap.manifest.json +++ b/packages/snap/snap.manifest.json @@ -7,7 +7,7 @@ "url": "https://github.com/MetaMask/snap-solana-wallet.git" }, "source": { - "shasum": "7HPZTKQiA1U8iDDfA1vTbxJUocgwVyTOoiPaNdApkiM=", + "shasum": "fpSK1djM7LPLNKV8vvy2MHMzG4excQx3Y1qzQpcLcqE=", "location": { "npm": { "filePath": "dist/bundle.js", From af4b98d3c869c23c60fd3e290511fb8a41b6d2ed Mon Sep 17 00:00:00 2001 From: Antonio Regadas Date: Fri, 13 Jun 2025 15:39:23 +0100 Subject: [PATCH 12/22] chore: fix --- .../snap/src/core/services/analytics/AnalyticsService.ts | 2 +- .../src/core/services/confirmation/ConfirmationHandler.ts | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/packages/snap/src/core/services/analytics/AnalyticsService.ts b/packages/snap/src/core/services/analytics/AnalyticsService.ts index 4cc8b5d72..ff5084c5c 100644 --- a/packages/snap/src/core/services/analytics/AnalyticsService.ts +++ b/packages/snap/src/core/services/analytics/AnalyticsService.ts @@ -123,7 +123,7 @@ export class AnalyticsService { account_id: account.id, account_address: account.address, account_type: account.type, - chain_id: metadata.scope, + chain_id: transaction.chain, transaction_status: transaction.status, transaction_type: transaction.type, }, diff --git a/packages/snap/src/core/services/confirmation/ConfirmationHandler.ts b/packages/snap/src/core/services/confirmation/ConfirmationHandler.ts index cb343d88c..8f375e4ab 100644 --- a/packages/snap/src/core/services/confirmation/ConfirmationHandler.ts +++ b/packages/snap/src/core/services/confirmation/ConfirmationHandler.ts @@ -94,7 +94,7 @@ export class ConfirmationHandler { base64EncodedTransaction, metadata: { scope, - origin, + origin: origin ?? null, }, }, }, @@ -123,7 +123,7 @@ export class ConfirmationHandler { base64EncodedTransaction, metadata: { scope, - origin, + origin: origin ?? null, }, }, }, @@ -145,7 +145,7 @@ export class ConfirmationHandler { base64EncodedTransaction, metadata: { scope, - origin, + origin: origin ?? null, }, }, }, From 8873435fd96bbde7027ba01397d0c769312f28f8 Mon Sep 17 00:00:00 2001 From: Antonio Regadas Date: Fri, 13 Jun 2025 15:43:13 +0100 Subject: [PATCH 13/22] chore: shasum --- packages/snap/snap.manifest.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/snap/snap.manifest.json b/packages/snap/snap.manifest.json index 04e242f1a..b5323e57d 100644 --- a/packages/snap/snap.manifest.json +++ b/packages/snap/snap.manifest.json @@ -7,7 +7,7 @@ "url": "https://github.com/MetaMask/snap-solana-wallet.git" }, "source": { - "shasum": "fpSK1djM7LPLNKV8vvy2MHMzG4excQx3Y1qzQpcLcqE=", + "shasum": "x3HW8KRRDyLlfHoWtHxjKnQppnBshP4O+YlTeVgjhzo=", "location": { "npm": { "filePath": "dist/bundle.js", From dd4e160099ed2cca95c00721e7cf903f3e6caaaf Mon Sep 17 00:00:00 2001 From: Antonio Regadas Date: Tue, 17 Jun 2025 14:36:22 +0100 Subject: [PATCH 14/22] chore: update value to be 'metamask' --- .../core/handlers/onClientRequest/ClientRequestHandler.test.ts | 2 +- .../src/core/handlers/onClientRequest/ClientRequestHandler.ts | 2 +- .../src/features/send/views/TransactionConfirmation/events.tsx | 1 + 3 files changed, 3 insertions(+), 2 deletions(-) diff --git a/packages/snap/src/core/handlers/onClientRequest/ClientRequestHandler.test.ts b/packages/snap/src/core/handlers/onClientRequest/ClientRequestHandler.test.ts index c6df8479f..4e9314ce8 100644 --- a/packages/snap/src/core/handlers/onClientRequest/ClientRequestHandler.test.ts +++ b/packages/snap/src/core/handlers/onClientRequest/ClientRequestHandler.test.ts @@ -101,7 +101,7 @@ describe('ClientRequestHandler', () => { MOCK_SOLANA_KEYRING_ACCOUNT_0, mockTransaction, Network.Testnet, - undefined, + 'metamask', { commitment: 'confirmed', skipPreflight: false, diff --git a/packages/snap/src/core/handlers/onClientRequest/ClientRequestHandler.ts b/packages/snap/src/core/handlers/onClientRequest/ClientRequestHandler.ts index 8f81d40e5..d98522f8d 100644 --- a/packages/snap/src/core/handlers/onClientRequest/ClientRequestHandler.ts +++ b/packages/snap/src/core/handlers/onClientRequest/ClientRequestHandler.ts @@ -81,7 +81,7 @@ export class ClientRequestHandler { account, base64EncodedTransaction, scope, - undefined, + 'metamask', options, ); } diff --git a/packages/snap/src/features/send/views/TransactionConfirmation/events.tsx b/packages/snap/src/features/send/views/TransactionConfirmation/events.tsx index afbfa3d29..4b357bfbd 100644 --- a/packages/snap/src/features/send/views/TransactionConfirmation/events.tsx +++ b/packages/snap/src/features/send/views/TransactionConfirmation/events.tsx @@ -145,6 +145,7 @@ async function onConfirmButtonClick({ account, transactionMessage, scope, + 'metamask', ); signature = response.signature; From ada31f6f32f7846cc608a9b13958163da1fea71e Mon Sep 17 00:00:00 2001 From: Antonio Regadas Date: Tue, 17 Jun 2025 14:40:08 +0100 Subject: [PATCH 15/22] chore: shasum --- packages/snap/snap.manifest.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/snap/snap.manifest.json b/packages/snap/snap.manifest.json index b5323e57d..f72ff1215 100644 --- a/packages/snap/snap.manifest.json +++ b/packages/snap/snap.manifest.json @@ -7,7 +7,7 @@ "url": "https://github.com/MetaMask/snap-solana-wallet.git" }, "source": { - "shasum": "x3HW8KRRDyLlfHoWtHxjKnQppnBshP4O+YlTeVgjhzo=", + "shasum": "KXhISDaGOjj6/PUOyTboFbAIFnKCQIImi63YeNoAexY=", "location": { "npm": { "filePath": "dist/bundle.js", From 8aee9ae5055b56ab2eed119e6add5cdaa9aa9c6b Mon Sep 17 00:00:00 2001 From: Antonio Regadas Date: Tue, 17 Jun 2025 15:14:37 +0100 Subject: [PATCH 16/22] chore: adds the METAMASK_ORIGIN --- packages/snap/src/core/constants/solana.ts | 1 + packages/snap/src/features/send/views/SendForm/events.tsx | 4 ++-- .../features/send/views/TransactionConfirmation/events.tsx | 5 +++-- 3 files changed, 6 insertions(+), 4 deletions(-) diff --git a/packages/snap/src/core/constants/solana.ts b/packages/snap/src/core/constants/solana.ts index 838ba084a..47b6e2a37 100644 --- a/packages/snap/src/core/constants/solana.ts +++ b/packages/snap/src/core/constants/solana.ts @@ -7,6 +7,7 @@ export const SOL_IMAGE_URL = export const MICRO_LAMPORTS_PER_LAMPORTS = 1_000_000n; export const LAMPORTS_PER_SOL = 1_000_000_000; export const DEFAULT_NETWORK_BLOCK_EXPLORER_URL = 'https://solscan.io'; +export const METAMASK_ORIGIN = 'metamask'; /** * Solana CAIP-2 Networks diff --git a/packages/snap/src/features/send/views/SendForm/events.tsx b/packages/snap/src/features/send/views/SendForm/events.tsx index b8c21176a..24a12005c 100644 --- a/packages/snap/src/features/send/views/SendForm/events.tsx +++ b/packages/snap/src/features/send/views/SendForm/events.tsx @@ -2,7 +2,7 @@ import type { InputChangeEvent } from '@metamask/snaps-sdk'; import BigNumber from 'bignumber.js'; import { merge } from 'lodash'; -import { Networks } from '../../../../core/constants/solana'; +import { METAMASK_ORIGIN, Networks } from '../../../../core/constants/solana'; import { ScheduleBackgroundEventMethod } from '../../../../core/handlers/onCronjob/backgroundEvents/ScheduleBackgroundEventMethod'; import { buildUrl } from '../../../../core/utils/buildUrl'; import { @@ -470,7 +470,7 @@ async function onSendButtonClick({ base64EncodedTransaction: context.transactionMessage, metadata: { scope: context.scope, - origin: null, + origin: METAMASK_ORIGIN, }, }, }, diff --git a/packages/snap/src/features/send/views/TransactionConfirmation/events.tsx b/packages/snap/src/features/send/views/TransactionConfirmation/events.tsx index 4b357bfbd..1f772e368 100644 --- a/packages/snap/src/features/send/views/TransactionConfirmation/events.tsx +++ b/packages/snap/src/features/send/views/TransactionConfirmation/events.tsx @@ -1,3 +1,4 @@ +import { METAMASK_ORIGIN } from '../../../../core/constants/solana'; import { ScheduleBackgroundEventMethod } from '../../../../core/handlers/onCronjob/backgroundEvents/ScheduleBackgroundEventMethod'; import { resolveInterface, @@ -70,7 +71,7 @@ async function onCancelButtonClick({ base64EncodedTransaction: transactionMessage, metadata: { scope, - origin: null, + origin: METAMASK_ORIGIN, }, }, }, @@ -120,7 +121,7 @@ async function onConfirmButtonClick({ base64EncodedTransaction: context.transactionMessage, metadata: { scope: context.scope, - origin: null, + origin: METAMASK_ORIGIN, }, }, }, From bb5a22f37fbfa4667df2e27dc925918fab44d67a Mon Sep 17 00:00:00 2001 From: Antonio Regadas Date: Tue, 17 Jun 2025 15:19:18 +0100 Subject: [PATCH 17/22] chore: shasum --- packages/snap/snap.manifest.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/snap/snap.manifest.json b/packages/snap/snap.manifest.json index f72ff1215..c8d88779a 100644 --- a/packages/snap/snap.manifest.json +++ b/packages/snap/snap.manifest.json @@ -7,7 +7,7 @@ "url": "https://github.com/MetaMask/snap-solana-wallet.git" }, "source": { - "shasum": "KXhISDaGOjj6/PUOyTboFbAIFnKCQIImi63YeNoAexY=", + "shasum": "1epK2Xl/6dQJDvHgKZAQpbSAKCvGQQQ/kCbN1zCTPoE=", "location": { "npm": { "filePath": "dist/bundle.js", From c3e461f4accf18681c4f3ce445ab3ef81d37e881 Mon Sep 17 00:00:00 2001 From: Antonio Regadas Date: Tue, 17 Jun 2025 15:47:16 +0100 Subject: [PATCH 18/22] chore: clean up from null values --- packages/snap/src/core/constants/solana.ts | 2 +- .../backgroundEvents/onTransactionAdded.ts | 2 +- .../backgroundEvents/onTransactionApproved.ts | 2 +- .../onTransactionFinalized.ts | 2 +- .../backgroundEvents/onTransactionRejected.ts | 2 +- .../onTransactionSubmitted.ts | 2 +- .../analytics/AnalyticsService.test.ts | 132 ------------------ .../services/analytics/AnalyticsService.ts | 10 +- .../confirmation/ConfirmationHandler.ts | 6 +- .../src/core/services/wallet/WalletService.ts | 6 +- 10 files changed, 17 insertions(+), 149 deletions(-) diff --git a/packages/snap/src/core/constants/solana.ts b/packages/snap/src/core/constants/solana.ts index 47b6e2a37..261190969 100644 --- a/packages/snap/src/core/constants/solana.ts +++ b/packages/snap/src/core/constants/solana.ts @@ -54,7 +54,7 @@ export type TokenInfo = { export type TransactionMetadata = { scope: Network; - origin: string | null; + origin: string; }; export const TokenMetadata = { diff --git a/packages/snap/src/core/handlers/onCronjob/backgroundEvents/onTransactionAdded.ts b/packages/snap/src/core/handlers/onCronjob/backgroundEvents/onTransactionAdded.ts index 146c62447..4afe51066 100644 --- a/packages/snap/src/core/handlers/onCronjob/backgroundEvents/onTransactionAdded.ts +++ b/packages/snap/src/core/handlers/onCronjob/backgroundEvents/onTransactionAdded.ts @@ -26,7 +26,7 @@ export const OnTransactionAddedRequestStruct = object({ base64EncodedTransaction: Base64Struct, metadata: object({ scope: NetworkStruct, - origin: nullable(string()), + origin: string(), }), }), }); diff --git a/packages/snap/src/core/handlers/onCronjob/backgroundEvents/onTransactionApproved.ts b/packages/snap/src/core/handlers/onCronjob/backgroundEvents/onTransactionApproved.ts index f17a69053..29428debb 100644 --- a/packages/snap/src/core/handlers/onCronjob/backgroundEvents/onTransactionApproved.ts +++ b/packages/snap/src/core/handlers/onCronjob/backgroundEvents/onTransactionApproved.ts @@ -26,7 +26,7 @@ export const OnTransactionApprovedRequestStruct = object({ base64EncodedTransaction: Base64Struct, metadata: object({ scope: NetworkStruct, - origin: nullable(string()), + origin: string(), }), }), }); diff --git a/packages/snap/src/core/handlers/onCronjob/backgroundEvents/onTransactionFinalized.ts b/packages/snap/src/core/handlers/onCronjob/backgroundEvents/onTransactionFinalized.ts index 6ae4aacf1..17271743f 100644 --- a/packages/snap/src/core/handlers/onCronjob/backgroundEvents/onTransactionFinalized.ts +++ b/packages/snap/src/core/handlers/onCronjob/backgroundEvents/onTransactionFinalized.ts @@ -27,7 +27,7 @@ export const OnTransactionFinalizedRequestStruct = object({ transaction: TransactionStruct, metadata: object({ scope: NetworkStruct, - origin: nullable(string()), + origin: string(), }), }), }); diff --git a/packages/snap/src/core/handlers/onCronjob/backgroundEvents/onTransactionRejected.ts b/packages/snap/src/core/handlers/onCronjob/backgroundEvents/onTransactionRejected.ts index a98db2ab7..8caadfa1f 100644 --- a/packages/snap/src/core/handlers/onCronjob/backgroundEvents/onTransactionRejected.ts +++ b/packages/snap/src/core/handlers/onCronjob/backgroundEvents/onTransactionRejected.ts @@ -26,7 +26,7 @@ export const OnTransactionRejectedRequestStruct = object({ base64EncodedTransaction: Base64Struct, metadata: object({ scope: NetworkStruct, - origin: nullable(string()), + origin: string(), }), }), }); diff --git a/packages/snap/src/core/handlers/onCronjob/backgroundEvents/onTransactionSubmitted.ts b/packages/snap/src/core/handlers/onCronjob/backgroundEvents/onTransactionSubmitted.ts index 08f64abc1..1dee7bb96 100644 --- a/packages/snap/src/core/handlers/onCronjob/backgroundEvents/onTransactionSubmitted.ts +++ b/packages/snap/src/core/handlers/onCronjob/backgroundEvents/onTransactionSubmitted.ts @@ -27,7 +27,7 @@ export const OnTransactionSubmittedRequestStruct = object({ signature: string(), metadata: object({ scope: NetworkStruct, - origin: nullable(string()), + origin: string(), }), }), }); diff --git a/packages/snap/src/core/services/analytics/AnalyticsService.test.ts b/packages/snap/src/core/services/analytics/AnalyticsService.test.ts index c91ccc7f2..44368788a 100644 --- a/packages/snap/src/core/services/analytics/AnalyticsService.test.ts +++ b/packages/snap/src/core/services/analytics/AnalyticsService.test.ts @@ -26,10 +26,6 @@ describe('AnalyticsService', () => { scope: mockScope, origin: mockOrigin, }; - const mockMetadataWithoutOrigin = { - scope: mockScope, - origin: null, - }; beforeEach(() => { jest.clearAllMocks(); @@ -72,31 +68,6 @@ describe('AnalyticsService', () => { }); }); - it('tracks transaction added event without origin', async () => { - await analyticsService.trackEventTransactionAdded( - mockAccount, - mockBase64Transaction, - mockMetadataWithoutOrigin, - ); - - expect(mockSnapRequest).toHaveBeenCalledWith({ - method: 'snap_trackEvent', - params: { - event: { - event: 'Transaction Added', - properties: { - message: 'Snap transaction added', - origin: null, - account_id: mockAccount.id, - account_address: mockAccount.address, - account_type: mockAccount.type, - chain_id: mockScope, - }, - }, - }, - }); - }); - it('throws error for invalid base64 transaction', async () => { const invalidBase64 = 'invalid-base64!@#'; @@ -140,31 +111,6 @@ describe('AnalyticsService', () => { }); }); - it('tracks transaction approved event without origin', async () => { - await analyticsService.trackEventTransactionApproved( - mockAccount, - mockBase64Transaction, - mockMetadataWithoutOrigin, - ); - - expect(mockSnapRequest).toHaveBeenCalledWith({ - method: 'snap_trackEvent', - params: { - event: { - event: 'Transaction Approved', - properties: { - message: 'Snap transaction approved', - origin: null, - account_id: mockAccount.id, - account_address: mockAccount.address, - account_type: mockAccount.type, - chain_id: mockScope, - }, - }, - }, - }); - }); - it('throws error for invalid base64 transaction', async () => { const invalidBase64 = 'invalid-base64!@#'; @@ -209,32 +155,6 @@ describe('AnalyticsService', () => { }); }); - it('tracks transaction submitted event without origin', async () => { - await analyticsService.trackEventTransactionSubmitted( - mockAccount, - mockBase64Transaction, - mockSignature, - mockMetadataWithoutOrigin, - ); - - expect(mockSnapRequest).toHaveBeenCalledWith({ - method: 'snap_trackEvent', - params: { - event: { - event: 'Transaction Submitted', - properties: { - message: 'Snap transaction submitted', - origin: null, - account_id: mockAccount.id, - account_address: mockAccount.address, - account_type: mockAccount.type, - chain_id: mockScope, - }, - }, - }, - }); - }); - it('throws error for invalid base64 transaction', async () => { const invalidBase64 = 'invalid-base64!@#'; @@ -328,33 +248,6 @@ describe('AnalyticsService', () => { }, }); }); - - it('tracks transaction finalized event without origin', async () => { - await analyticsService.trackEventTransactionFinalized( - mockAccount, - mockTransaction, - mockMetadataWithoutOrigin, - ); - - expect(mockSnapRequest).toHaveBeenCalledWith({ - method: 'snap_trackEvent', - params: { - event: { - event: 'Transaction Finalized', - properties: { - message: 'Snap transaction finalized', - origin: null, - account_id: mockAccount.id, - account_address: mockAccount.address, - account_type: mockAccount.type, - chain_id: mockTransaction.chain, - transaction_status: mockTransaction.status, - transaction_type: mockTransaction.type, - }, - }, - }, - }); - }); }); describe('trackEventTransactionRejected', () => { @@ -387,31 +280,6 @@ describe('AnalyticsService', () => { }); }); - it('tracks transaction rejected event without origin', async () => { - await analyticsService.trackEventTransactionRejected( - mockAccount, - mockBase64Transaction, - mockMetadataWithoutOrigin, - ); - - expect(mockSnapRequest).toHaveBeenCalledWith({ - method: 'snap_trackEvent', - params: { - event: { - event: 'Transaction Rejected', - properties: { - message: 'Snap transaction rejected', - origin: null, - account_id: mockAccount.id, - account_address: mockAccount.address, - account_type: mockAccount.type, - chain_id: mockScope, - }, - }, - }, - }); - }); - it('throws error for invalid base64 transaction', async () => { const invalidBase64 = 'invalid-base64!@#'; diff --git a/packages/snap/src/core/services/analytics/AnalyticsService.ts b/packages/snap/src/core/services/analytics/AnalyticsService.ts index ff5084c5c..053038d07 100644 --- a/packages/snap/src/core/services/analytics/AnalyticsService.ts +++ b/packages/snap/src/core/services/analytics/AnalyticsService.ts @@ -33,7 +33,7 @@ export class AnalyticsService { event: 'Transaction Added', properties: { message: 'Snap transaction added', - origin: metadata.origin ?? null, + origin: metadata.origin, account_id: account.id, account_address: account.address, account_type: account.type, @@ -62,7 +62,7 @@ export class AnalyticsService { event: 'Transaction Approved', properties: { message: 'Snap transaction approved', - origin: metadata.origin ?? null, + origin: metadata.origin, account_id: account.id, account_address: account.address, account_type: account.type, @@ -92,7 +92,7 @@ export class AnalyticsService { event: 'Transaction Submitted', properties: { message: 'Snap transaction submitted', - origin: metadata.origin ?? null, + origin: metadata.origin, account_id: account.id, account_address: account.address, account_type: account.type, @@ -119,7 +119,7 @@ export class AnalyticsService { event: 'Transaction Finalized', properties: { message: 'Snap transaction finalized', - origin: metadata.origin ?? null, + origin: metadata.origin, account_id: account.id, account_address: account.address, account_type: account.type, @@ -150,7 +150,7 @@ export class AnalyticsService { event: 'Transaction Rejected', properties: { message: 'Snap transaction rejected', - origin: metadata.origin ?? null, + origin: metadata.origin, account_id: account.id, account_address: account.address, account_type: account.type, diff --git a/packages/snap/src/core/services/confirmation/ConfirmationHandler.ts b/packages/snap/src/core/services/confirmation/ConfirmationHandler.ts index 8f375e4ab..cb343d88c 100644 --- a/packages/snap/src/core/services/confirmation/ConfirmationHandler.ts +++ b/packages/snap/src/core/services/confirmation/ConfirmationHandler.ts @@ -94,7 +94,7 @@ export class ConfirmationHandler { base64EncodedTransaction, metadata: { scope, - origin: origin ?? null, + origin, }, }, }, @@ -123,7 +123,7 @@ export class ConfirmationHandler { base64EncodedTransaction, metadata: { scope, - origin: origin ?? null, + origin, }, }, }, @@ -145,7 +145,7 @@ export class ConfirmationHandler { base64EncodedTransaction, metadata: { scope, - origin: origin ?? null, + origin, }, }, }, diff --git a/packages/snap/src/core/services/wallet/WalletService.ts b/packages/snap/src/core/services/wallet/WalletService.ts index db68f6dee..e45bd8a1c 100644 --- a/packages/snap/src/core/services/wallet/WalletService.ts +++ b/packages/snap/src/core/services/wallet/WalletService.ts @@ -221,7 +221,7 @@ export class WalletService { account: SolanaKeyringAccount, transactionMessageBase64Encoded: string, scope: Network, - origin?: string, + origin: string, options?: SolanaSignAndSendTransactionOptions, ): Promise { const signConfig: DecompileTransactionMessageFetchingLookupTablesConfig = @@ -288,7 +288,7 @@ export class WalletService { signature, metadata: { scope, - origin: origin ?? null, + origin, }, }, }, @@ -347,7 +347,7 @@ export class WalletService { transaction: mappedTransactionWithAccountId, metadata: { scope, - origin: origin ?? null, + origin, }, }, }, From 2dc8c19287050e5231784336df34a84e365843d6 Mon Sep 17 00:00:00 2001 From: Antonio Regadas Date: Tue, 17 Jun 2025 15:47:50 +0100 Subject: [PATCH 19/22] chore: update test --- packages/snap/src/core/services/wallet/WalletService.test.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/snap/src/core/services/wallet/WalletService.test.ts b/packages/snap/src/core/services/wallet/WalletService.test.ts index f1f39b661..964becf57 100644 --- a/packages/snap/src/core/services/wallet/WalletService.test.ts +++ b/packages/snap/src/core/services/wallet/WalletService.test.ts @@ -245,7 +245,7 @@ describe('WalletService', () => { fromAccount, transactionMessageBase64Encoded, scope, - undefined, + 'https://metamask.io', ); expect(result).toStrictEqual({ From 92efdd56e0aa6dc275e7d9c4a8f39f62a657862d Mon Sep 17 00:00:00 2001 From: Antonio Regadas Date: Tue, 17 Jun 2025 15:57:51 +0100 Subject: [PATCH 20/22] chore: shasum update --- packages/snap/snap.manifest.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/snap/snap.manifest.json b/packages/snap/snap.manifest.json index c8d88779a..e69735389 100644 --- a/packages/snap/snap.manifest.json +++ b/packages/snap/snap.manifest.json @@ -7,7 +7,7 @@ "url": "https://github.com/MetaMask/snap-solana-wallet.git" }, "source": { - "shasum": "1epK2Xl/6dQJDvHgKZAQpbSAKCvGQQQ/kCbN1zCTPoE=", + "shasum": "2ueakOADTLG0wSM+ebeYvaXhtJ8fzBkXZ7q0DtEMweQ=", "location": { "npm": { "filePath": "dist/bundle.js", From 59106b51fdc276e3b63faf8d714293078fa49f7c Mon Sep 17 00:00:00 2001 From: Antonio Regadas Date: Wed, 18 Jun 2025 09:40:07 +0100 Subject: [PATCH 21/22] chore: quick fix --- .../src/core/handlers/onClientRequest/ClientRequestHandler.ts | 3 ++- .../src/features/send/views/TransactionConfirmation/events.tsx | 2 +- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/packages/snap/src/core/handlers/onClientRequest/ClientRequestHandler.ts b/packages/snap/src/core/handlers/onClientRequest/ClientRequestHandler.ts index d98522f8d..1689d3615 100644 --- a/packages/snap/src/core/handlers/onClientRequest/ClientRequestHandler.ts +++ b/packages/snap/src/core/handlers/onClientRequest/ClientRequestHandler.ts @@ -6,6 +6,7 @@ import { } from '@metamask/snaps-sdk'; import { assert } from '@metamask/superstruct'; +import { METAMASK_ORIGIN } from '../../constants/solana'; import type { WalletService } from '../../services/wallet/WalletService'; import type { ILogger } from '../../utils/logger'; import type { SolanaKeyring } from '../onKeyringRequest/Keyring'; @@ -81,7 +82,7 @@ export class ClientRequestHandler { account, base64EncodedTransaction, scope, - 'metamask', + METAMASK_ORIGIN, options, ); } diff --git a/packages/snap/src/features/send/views/TransactionConfirmation/events.tsx b/packages/snap/src/features/send/views/TransactionConfirmation/events.tsx index 1f772e368..6f89a4c5b 100644 --- a/packages/snap/src/features/send/views/TransactionConfirmation/events.tsx +++ b/packages/snap/src/features/send/views/TransactionConfirmation/events.tsx @@ -146,7 +146,7 @@ async function onConfirmButtonClick({ account, transactionMessage, scope, - 'metamask', + METAMASK_ORIGIN, ); signature = response.signature; From 043627a6890b9ab893b65f0e59fbd9573995aed4 Mon Sep 17 00:00:00 2001 From: Antonio Regadas Date: Wed, 18 Jun 2025 09:44:20 +0100 Subject: [PATCH 22/22] chore: shasum update --- packages/snap/snap.manifest.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/snap/snap.manifest.json b/packages/snap/snap.manifest.json index e69735389..aa6141684 100644 --- a/packages/snap/snap.manifest.json +++ b/packages/snap/snap.manifest.json @@ -7,7 +7,7 @@ "url": "https://github.com/MetaMask/snap-solana-wallet.git" }, "source": { - "shasum": "2ueakOADTLG0wSM+ebeYvaXhtJ8fzBkXZ7q0DtEMweQ=", + "shasum": "X1gc72IbqI/j7C0NA0rxAJHeJXlcsFYXVqNrfllJ4n4=", "location": { "npm": { "filePath": "dist/bundle.js",