diff --git a/packages/wallet-sdk/package.json b/packages/wallet-sdk/package.json index 948cecd6ad..72fdd9b7a5 100644 --- a/packages/wallet-sdk/package.json +++ b/packages/wallet-sdk/package.json @@ -1,6 +1,6 @@ { "name": "@coinbase/wallet-sdk", - "version": "3.9.7", + "version": "3.9.8", "description": "Coinbase Wallet JavaScript SDK", "keywords": [ "cipher", diff --git a/packages/wallet-sdk/src/core/util.ts b/packages/wallet-sdk/src/core/util.ts index 13f2beea7a..0fc6583acc 100644 --- a/packages/wallet-sdk/src/core/util.ts +++ b/packages/wallet-sdk/src/core/util.ts @@ -3,6 +3,7 @@ import BN from 'bn.js'; +import { getCommerceCorrelationId } from '../telemetry/commerceCorrelationId'; import { standardErrors } from './error'; import { AddressString, BigIntString, HexString, IntNumber, RegExpString } from './type'; @@ -200,9 +201,11 @@ export function createQrUrl( serverUrl: string, isParentConnection: boolean, version: string, - chainId: number + chainId: number, + isMobileRelay?: boolean | undefined ): string { const sessionIdKey = isParentConnection ? 'parent-id' : 'id'; + const commerceCorrelationId = getCommerceCorrelationId(); const query = new URLSearchParams({ [sessionIdKey]: sessionId, @@ -210,6 +213,9 @@ export function createQrUrl( server: serverUrl, v: version, chainId: chainId.toString(), + pl: 't', // this is custom build of SDK for Payment Link + ...(isMobileRelay ? { m: 't' } : {}), + ...(commerceCorrelationId ? { cid: commerceCorrelationId } : {}), }).toString(); const qrUrl = `${serverUrl}/#/link?${query}`; diff --git a/packages/wallet-sdk/src/index.ts b/packages/wallet-sdk/src/index.ts index 978558612b..3e4f084c17 100644 --- a/packages/wallet-sdk/src/index.ts +++ b/packages/wallet-sdk/src/index.ts @@ -8,6 +8,8 @@ export { CoinbaseWalletSDK } from './CoinbaseWalletSDK'; export { CoinbaseWalletProvider } from './provider/CoinbaseWalletProvider'; export default CoinbaseWalletSDK; +export { setCommerceCorrelationId } from './telemetry/commerceCorrelationId'; + declare global { interface Window { CoinbaseWalletSDK: typeof CoinbaseWalletSDK; diff --git a/packages/wallet-sdk/src/provider/CoinbaseWalletProvider.ts b/packages/wallet-sdk/src/provider/CoinbaseWalletProvider.ts index 38c235f49d..69677e45d7 100644 --- a/packages/wallet-sdk/src/provider/CoinbaseWalletProvider.ts +++ b/packages/wallet-sdk/src/provider/CoinbaseWalletProvider.ts @@ -27,6 +27,13 @@ import { RelayEventManager } from '../relay/RelayEventManager'; import { Session } from '../relay/Session'; import { EthereumTransactionParams } from '../relay/walletlink/type/EthereumTransactionParams'; import { isErrorResponse, Web3Response } from '../relay/walletlink/type/Web3Response'; +import { getCommerceCorrelationId } from '../telemetry/commerceCorrelationId'; +import { + logRequestCompleted, + logRequestError, + logRequestStarted, +} from '../telemetry/events/provider'; +import { parseErrorMessageFromAny } from '../telemetry/utils'; import eip712 from '../vendor-js/eth-eip712-util'; import { DiagnosticLogger, EVENTS } from './DiagnosticLogger'; import { FilterPolyfill } from './FilterPolyfill'; @@ -37,8 +44,6 @@ import { SubscriptionResult, } from './SubscriptionManager'; import { RequestArguments, Web3Provider } from './Web3Provider'; -import { logRequestCompleted, logRequestError, logRequestStarted } from '../telemetry/events/provider'; -import { parseErrorMessageFromAny } from '../telemetry/utils'; const DEFAULT_CHAIN_ID_KEY = 'DefaultChainId'; const DEFAULT_JSON_RPC_URL = 'DefaultJsonRpcUrl'; @@ -471,17 +476,19 @@ export class CoinbaseWalletProvider extends EventEmitter implements Web3Provider } public async request(args: RequestArguments): Promise { - logRequestStarted({ method: args.method }); + const commerceCorrelationId = getCommerceCorrelationId(); + logRequestStarted({ method: args.method, commerceCorrelationId }); try { const result = await this._request(args).catch((error) => { throw serializeError(error, args.method); }); - logRequestCompleted({ method: args.method }); + logRequestCompleted({ method: args.method, commerceCorrelationId }); return result; } catch (error) { logRequestError({ method: args.method, errorMessage: parseErrorMessageFromAny(error), + commerceCorrelationId, }); return Promise.reject(serializeError(error, args.method)); } diff --git a/packages/wallet-sdk/src/relay/mobile/MobileRelay.ts b/packages/wallet-sdk/src/relay/mobile/MobileRelay.ts index 12df68c412..8f75d74674 100644 --- a/packages/wallet-sdk/src/relay/mobile/MobileRelay.ts +++ b/packages/wallet-sdk/src/relay/mobile/MobileRelay.ts @@ -1,4 +1,6 @@ -import { getLocation } from '../../core/util'; +import { createQrUrl, getLocation } from '../../core/util'; +import { getCommerceCorrelationId } from '../../telemetry/commerceCorrelationId'; +import { logMobileWalletLinkRequestAccountsDeeplinked } from '../../telemetry/events/walletlink'; import { CancelablePromise } from '../RelayAbstract'; import { WalletLinkResponseEventData } from '../walletlink/type/WalletLinkEventData'; import { Web3Request } from '../walletlink/type/Web3Request'; @@ -41,10 +43,13 @@ export class MobileRelay extends WalletLinkRelay { // For mobile relay requests, open the Coinbase Wallet app switch (request.method) { case 'requestEthereumAccounts': - case 'connectAndSignIn': + case 'connectAndSignIn': { navigatedToCBW = true; + const commerceCorrelationId = getCommerceCorrelationId(); + logMobileWalletLinkRequestAccountsDeeplinked({ commerceCorrelationId }); this.ui.openCoinbaseWalletDeeplink(this.getQRCodeUrl()); break; + } case 'switchEthereumChain': // switchEthereumChain doesn't need to open the app return; @@ -73,6 +78,19 @@ export class MobileRelay extends WalletLinkRelay { } } + // override + getQRCodeUrl() { + return createQrUrl( + this._session.id, + this._session.secret, + this.linkAPIUrl, + false, + this.options.version, + this.dappDefaultChain, + true // adding isMobileWalletlink flag to the query params + ); + } + // override handleWeb3ResponseMessage(message: WalletLinkResponseEventData) { super.handleWeb3ResponseMessage(message); diff --git a/packages/wallet-sdk/src/relay/walletlink/WalletLinkRelay.ts b/packages/wallet-sdk/src/relay/walletlink/WalletLinkRelay.ts index 78c3c61821..4aca44b644 100644 --- a/packages/wallet-sdk/src/relay/walletlink/WalletLinkRelay.ts +++ b/packages/wallet-sdk/src/relay/walletlink/WalletLinkRelay.ts @@ -49,9 +49,9 @@ export interface WalletLinkRelayOptions { export class WalletLinkRelay extends RelayAbstract implements WalletLinkConnectionUpdateListener { private static accountRequestCallbackIds = new Set(); - private readonly linkAPIUrl: string; + protected readonly linkAPIUrl: string; protected readonly storage: ScopedLocalStorage; - private _session: Session; + protected _session: Session; private readonly relayEventManager: RelayEventManager; protected readonly diagnostic?: DiagnosticLogger; protected connection: WalletLinkConnection; @@ -59,7 +59,7 @@ export class WalletLinkRelay extends RelayAbstract implements WalletLinkConnecti private chainCallbackParams = { chainId: '', jsonRpcUrl: '' }; // to implement distinctUntilChanged private chainCallback: ((chainId: string, jsonRpcUrl: string) => void) | null = null; protected dappDefaultChain = 1; - private readonly options: WalletLinkRelayOptions; + protected readonly options: WalletLinkRelayOptions; protected ui: RelayUI; diff --git a/packages/wallet-sdk/src/telemetry/commerceCorrelationId.ts b/packages/wallet-sdk/src/telemetry/commerceCorrelationId.ts new file mode 100644 index 0000000000..264947dc3a --- /dev/null +++ b/packages/wallet-sdk/src/telemetry/commerceCorrelationId.ts @@ -0,0 +1,9 @@ +let commerceCorrelationId: string | null = null; + +export function setCommerceCorrelationId(id: string) { + commerceCorrelationId = id; +} + +export function getCommerceCorrelationId() { + return commerceCorrelationId; +} diff --git a/packages/wallet-sdk/src/telemetry/events/provider.ts b/packages/wallet-sdk/src/telemetry/events/provider.ts index e5a41f47e6..cd3ba808a6 100644 --- a/packages/wallet-sdk/src/telemetry/events/provider.ts +++ b/packages/wallet-sdk/src/telemetry/events/provider.ts @@ -1,12 +1,19 @@ import { ActionType, AnalyticsEventImportance, ComponentType, logEvent } from '../logEvent'; -export function logRequestStarted({ method }: { method: string }) { +export function logRequestStarted({ + method, + commerceCorrelationId, +}: { + method: string; + commerceCorrelationId: string | null; +}) { logEvent( 'commerce.sdk.request_started', { action: ActionType.measurement, componentType: ComponentType.unknown, method, + commerceCorrelationId: commerceCorrelationId ?? '', }, AnalyticsEventImportance.high ); @@ -15,9 +22,11 @@ export function logRequestStarted({ method }: { method: string }) { export function logRequestError({ method, errorMessage, + commerceCorrelationId, }: { method: string; errorMessage: string; + commerceCorrelationId: string | null; }) { logEvent( 'commerce.sdk.request_error', @@ -26,18 +35,26 @@ export function logRequestError({ componentType: ComponentType.unknown, method, errorMessage, + commerceCorrelationId: commerceCorrelationId ?? '', }, AnalyticsEventImportance.high ); } -export function logRequestCompleted({ method }: { method: string }) { +export function logRequestCompleted({ + method, + commerceCorrelationId, +}: { + method: string; + commerceCorrelationId: string | null; +}) { logEvent( 'commerce.sdk.request_completed', { action: ActionType.measurement, componentType: ComponentType.unknown, method, + commerceCorrelationId: commerceCorrelationId ?? '', }, AnalyticsEventImportance.high ); diff --git a/packages/wallet-sdk/src/telemetry/events/walletlink.ts b/packages/wallet-sdk/src/telemetry/events/walletlink.ts index 1815cc9f6e..9bcb9892a4 100644 --- a/packages/wallet-sdk/src/telemetry/events/walletlink.ts +++ b/packages/wallet-sdk/src/telemetry/events/walletlink.ts @@ -20,4 +20,20 @@ export const logWalletLinkConnectionFetchUnseenEventsFailed = () => { }, AnalyticsEventImportance.high ); +}; + +export const logMobileWalletLinkRequestAccountsDeeplinked = ({ + commerceCorrelationId, +}: { + commerceCorrelationId: string | null; +}) => { + logEvent( + 'commerce.walletlink_connection.mobile_request_accounts_deeplinked', + { + action: ActionType.measurement, + componentType: ComponentType.unknown, + commerceCorrelationId: commerceCorrelationId ?? '', + }, + AnalyticsEventImportance.high + ); }; \ No newline at end of file diff --git a/packages/wallet-sdk/src/version.ts b/packages/wallet-sdk/src/version.ts index ae103bbfa2..554387942a 100644 --- a/packages/wallet-sdk/src/version.ts +++ b/packages/wallet-sdk/src/version.ts @@ -1 +1 @@ -export const LIB_VERSION = '3.9.7'; +export const LIB_VERSION = '3.9.8';