track address book usage (#14382)

* track address book usage

* Update app/scripts/controllers/metametrics.js

Co-authored-by: Ariella Vu <20778143+digiwand@users.noreply.github.com>

* Update shared/constants/metametrics.js

Co-authored-by: Ariella Vu <20778143+digiwand@users.noreply.github.com>

Co-authored-by: Ariella Vu <20778143+digiwand@users.noreply.github.com>
feature/default_network_editable
Brad Decker 3 years ago committed by GitHub
parent 455d4a9825
commit 922ebd57cb
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
  1. 16
      app/scripts/controllers/metametrics.js
  2. 22
      app/scripts/controllers/metametrics.test.js
  3. 41
      shared/constants/metametrics.js

@ -1,4 +1,4 @@
import { isEqual, merge, omit, omitBy, pickBy } from 'lodash'; import { isEqual, merge, omit, omitBy, pickBy, size, sum } from 'lodash';
import { ObservableStore } from '@metamask/obs-store'; import { ObservableStore } from '@metamask/obs-store';
import { bufferToHex, keccak } from 'ethereumjs-util'; import { bufferToHex, keccak } from 'ethereumjs-util';
import { generateUUID } from 'pubnub'; import { generateUUID } from 'pubnub';
@ -31,6 +31,7 @@ const exceptionsToFilter = {
* @typedef {import('../../../shared/constants/metametrics').MetaMetricsPagePayload} MetaMetricsPagePayload * @typedef {import('../../../shared/constants/metametrics').MetaMetricsPagePayload} MetaMetricsPagePayload
* @typedef {import('../../../shared/constants/metametrics').MetaMetricsPageOptions} MetaMetricsPageOptions * @typedef {import('../../../shared/constants/metametrics').MetaMetricsPageOptions} MetaMetricsPageOptions
* @typedef {import('../../../shared/constants/metametrics').MetaMetricsEventFragment} MetaMetricsEventFragment * @typedef {import('../../../shared/constants/metametrics').MetaMetricsEventFragment} MetaMetricsEventFragment
* @typedef {import('../../../shared/constants/metametrics').MetaMetricsTraits} MetaMetricsTraits
*/ */
/** /**
@ -531,8 +532,21 @@ export default class MetaMetricsController {
}; };
} }
/**
* This method generates the MetaMetrics user traits object, omitting any
* traits that have not changed since the last invocation of this method.
*
* @param {object} metamaskState - Full metamask state object.
* @returns {MetaMetricsTraits | null} traits that have changed since last update
*/
_buildUserTraitsObject(metamaskState) { _buildUserTraitsObject(metamaskState) {
/**
* @type {MetaMetricsTraits}
*/
const currentTraits = { const currentTraits = {
[TRAITS.ADDRESS_BOOK_ENTRIES]: sum(
Object.values(metamaskState.addressBook).map(size),
),
[TRAITS.LEDGER_CONNECTION_TYPE]: metamaskState.ledgerTransportType, [TRAITS.LEDGER_CONNECTION_TYPE]: metamaskState.ledgerTransportType,
[TRAITS.NUMBER_OF_ACCOUNTS]: Object.values(metamaskState.identities) [TRAITS.NUMBER_OF_ACCOUNTS]: Object.values(metamaskState.identities)
.length, .length,

@ -646,9 +646,14 @@ describe('MetaMetricsController', function () {
}, },
}, },
threeBoxSyncingAllowed: false, threeBoxSyncingAllowed: false,
addressBook: {
[MAINNET_CHAIN_ID]: [{ address: '0x' }],
[ROPSTEN_CHAIN_ID]: [{ address: '0x' }, { address: '0x0' }],
},
}); });
assert.deepEqual(traits, { assert.deepEqual(traits, {
[TRAITS.ADDRESS_BOOK_ENTRIES]: 3,
[TRAITS.LEDGER_CONNECTION_TYPE]: 'web-hid', [TRAITS.LEDGER_CONNECTION_TYPE]: 'web-hid',
[TRAITS.NETWORKS_ADDED]: [MAINNET_CHAIN_ID, ROPSTEN_CHAIN_ID], [TRAITS.NETWORKS_ADDED]: [MAINNET_CHAIN_ID, ROPSTEN_CHAIN_ID],
[TRAITS.NUMBER_OF_ACCOUNTS]: 2, [TRAITS.NUMBER_OF_ACCOUNTS]: 2,
@ -667,6 +672,10 @@ describe('MetaMetricsController', function () {
ledgerTransportType: 'web-hid', ledgerTransportType: 'web-hid',
identities: [{}, {}], identities: [{}, {}],
threeBoxSyncingAllowed: false, threeBoxSyncingAllowed: false,
addressBook: {
[MAINNET_CHAIN_ID]: [{ address: '0x' }],
[ROPSTEN_CHAIN_ID]: [{ address: '0x' }, { address: '0x0' }],
},
}); });
const updatedTraits = metaMetricsController._buildUserTraitsObject({ const updatedTraits = metaMetricsController._buildUserTraitsObject({
@ -677,9 +686,14 @@ describe('MetaMetricsController', function () {
ledgerTransportType: 'web-hid', ledgerTransportType: 'web-hid',
identities: [{}, {}, {}], identities: [{}, {}, {}],
threeBoxSyncingAllowed: false, threeBoxSyncingAllowed: false,
addressBook: {
[MAINNET_CHAIN_ID]: [{ address: '0x' }, { address: '0x1' }],
[ROPSTEN_CHAIN_ID]: [{ address: '0x' }, { address: '0x0' }],
},
}); });
assert.deepEqual(updatedTraits, { assert.deepEqual(updatedTraits, {
[TRAITS.ADDRESS_BOOK_ENTRIES]: 4,
[TRAITS.NUMBER_OF_ACCOUNTS]: 3, [TRAITS.NUMBER_OF_ACCOUNTS]: 3,
}); });
}); });
@ -694,6 +708,10 @@ describe('MetaMetricsController', function () {
ledgerTransportType: 'web-hid', ledgerTransportType: 'web-hid',
identities: [{}, {}], identities: [{}, {}],
threeBoxSyncingAllowed: false, threeBoxSyncingAllowed: false,
addressBook: {
[MAINNET_CHAIN_ID]: [{ address: '0x' }],
[ROPSTEN_CHAIN_ID]: [{ address: '0x' }, { address: '0x0' }],
},
}); });
const updatedTraits = metaMetricsController._buildUserTraitsObject({ const updatedTraits = metaMetricsController._buildUserTraitsObject({
@ -704,6 +722,10 @@ describe('MetaMetricsController', function () {
ledgerTransportType: 'web-hid', ledgerTransportType: 'web-hid',
identities: [{}, {}], identities: [{}, {}],
threeBoxSyncingAllowed: false, threeBoxSyncingAllowed: false,
addressBook: {
[MAINNET_CHAIN_ID]: [{ address: '0x' }],
[ROPSTEN_CHAIN_ID]: [{ address: '0x' }, { address: '0x0' }],
},
}); });
assert.equal(updatedTraits, null); assert.equal(updatedTraits, null);

@ -156,16 +156,20 @@
/** /**
* @typedef {Object} Traits * @typedef {Object} Traits
* @property {string} [LEDGER_CONNECTION_TYPE] - when ledger live connnection * @property {'address_book_entries'} ADDRESS_BOOK_ENTRIES - When the user
* type is changed we identify the ledger_connection_type trait * adds or modifies addresses in address book the address_book_entries trait
* @property {string} [NETWORKS_ADDED] - when user modifies networks we * is identified.
* identify the networks_added trait * @property {'ledger_connection_type'} LEDGER_CONNECTION_TYPE - when ledger
* @property {string} [NUMBER_OF_ACCOUNTS] - when identities change, we * live connnection type is changed we identify the ledger_connection_type
* identify the new number_of_accounts trait * trait
* @property {number_of_nft_collections} [NUMBER_OF_NFT_COLLECTIONS] - user trait for number of * @property {'networks_added'} NETWORKS_ADDED - when user modifies networks
* unique NFT addresses * we identify the networks_added trait
* @property {string} [THREE_BOX_ENABLED] - when 3box feature is toggled we * @property {'number_of_accounts'} NUMBER_OF_ACCOUNTS - when identities
* identify the 3box_enabled trait * change, we identify the new number_of_accounts trait
* @property {'number_of_nft_collections'} NUMBER_OF_NFT_COLLECTIONS - user
* trait for number of unique NFT addresses
* @property {'three_box_enabled'} THREE_BOX_ENABLED - when 3box feature is
* toggled we identify the 3box_enabled trait
*/ */
/** /**
@ -174,6 +178,7 @@
*/ */
export const TRAITS = { export const TRAITS = {
ADDRESS_BOOK_ENTRIES: 'address_book_entries',
LEDGER_CONNECTION_TYPE: 'ledger_connection_type', LEDGER_CONNECTION_TYPE: 'ledger_connection_type',
NETWORKS_ADDED: 'networks_added', NETWORKS_ADDED: 'networks_added',
NUMBER_OF_ACCOUNTS: 'number_of_accounts', NUMBER_OF_ACCOUNTS: 'number_of_accounts',
@ -181,6 +186,22 @@ export const TRAITS = {
THREE_BOX_ENABLED: 'three_box_enabled', THREE_BOX_ENABLED: 'three_box_enabled',
}; };
/**
* @typedef {Object} MetaMetricsTraits
* @property {number} [address_book_entries] - The number of entries in the
* user's address book.
* @property {'ledgerLive' | 'webhid' | 'u2f'} [ledger_connection_type] - the
* type of ledger connection set by user preference.
* @property {Array<string>} [networks_added] - An array consisting of chainIds
* that indicate the networks a user has added to their MetaMask.
* @property {number} [number_of_accounts] - A number representing the number
* of identities(accounts) added to the user's MetaMask.
* @property {number} [number_of_nft_collections] - A number representing the
* amount of different NFT collections the user possesses an NFT from.
* @property {boolean} [three_box_enabled] - does the user have 3box sync
* enabled?
*/
// Mixpanel converts the zero address value to a truly anonymous event, which // Mixpanel converts the zero address value to a truly anonymous event, which
// speeds up reporting // speeds up reporting
export const METAMETRICS_ANONYMOUS_ID = '0x0000000000000000'; export const METAMETRICS_ANONYMOUS_ID = '0x0000000000000000';

Loading…
Cancel
Save