diff --git a/src/antelope/chains/EVMChainSettings.ts b/src/antelope/chains/EVMChainSettings.ts index 3f5e974b3..514534afd 100644 --- a/src/antelope/chains/EVMChainSettings.ts +++ b/src/antelope/chains/EVMChainSettings.ts @@ -294,7 +294,7 @@ export default abstract class EVMChainSettings implements ChainSettings { abstract getSystemTokens(): TokenClass[]; abstract getIndexerApiEndpoint(): string; abstract hasIndexerSupport(): boolean; - abstract trackAnalyticsEvent(params: Record): void; + abstract trackAnalyticsEvent(eventName: string): void; async getApy(): Promise { const response = await this.api.get('apy/evm'); diff --git a/src/antelope/chains/NativeChainSettings.ts b/src/antelope/chains/NativeChainSettings.ts index d5b05ed24..8c71c31ab 100644 --- a/src/antelope/chains/NativeChainSettings.ts +++ b/src/antelope/chains/NativeChainSettings.ts @@ -149,7 +149,7 @@ export default abstract class NativeChainSettings implements ChainSettings { abstract getMapDisplay(): boolean; abstract getTheme(): Theme; abstract getFiltersSupported(prop: string): boolean; - abstract trackAnalyticsEvent(params: Record): void; + abstract trackAnalyticsEvent(eventName: string): void; /** * Retrieves the list of IDs for the important tokens. diff --git a/src/antelope/chains/chain-constants.ts b/src/antelope/chains/chain-constants.ts index f77fabd88..53f0cd569 100644 --- a/src/antelope/chains/chain-constants.ts +++ b/src/antelope/chains/chain-constants.ts @@ -3,17 +3,19 @@ import { NETWORK as telosTestnetEvmNetwork } from 'src/antelope/chains/evm/telos export const TELOS_CHAIN_IDS = ['40', '41']; export const TELOS_NETWORK_NAMES = [telosEvmNetwork, telosTestnetEvmNetwork]; -export const TELOS_ANALYTICS_EVENT_IDS = { - loginStarted: 'JXIYBP1S', - loginSuccessful: 'HIP11SFR', - loginSuccessfulMetamask: 'ABGMND23', - loginFailedMetamask: 'ZFGE6TFS', - loginSuccessfulSafepal: 'LKCBKDU2', - loginFailedSafepal: '6PSIWGNV', - loginSuccessfulOreId: 'MSXMDDNK', - loginFailedOreId: 'UFX3JYRJ', - loginFailedWalletConnect: '9V4IV1BV', - loginSuccessfulWalletConnect: '2EG2OR3H', +export const TELOS_ANALYTICS_EVENT_NAMES = { + loginStarted: 'Login Started', + loginSuccessful: 'Login Successful', + loginSuccessfulMetamask: 'Login Successful - Metamask', + loginFailedMetamask: 'Login Failed - Metamask', + loginSuccessfulSafepal: 'Login Successful - Safepal', + loginFailedSafepal: 'Login Failed - Safepal', + loginSuccessfulOreId: 'Login Successful - OreId', + loginFailedOreId: 'Login Failed - OreId', + loginFailedWalletConnect: 'Login Failed - WalletConnect', + loginSuccessfulWalletConnect: 'Login Successful - WalletConnect', + loginSuccessfulBrave: 'Login Successful - Brave', + loginFailedBrave: 'Login Failed - Brave', }; export const ZERO_ADDRESS = '0x'.concat('0'.repeat(40)); diff --git a/src/antelope/chains/evm/telos-evm-testnet/index.ts b/src/antelope/chains/evm/telos-evm-testnet/index.ts index 9f0297307..d0d08f93e 100644 --- a/src/antelope/chains/evm/telos-evm-testnet/index.ts +++ b/src/antelope/chains/evm/telos-evm-testnet/index.ts @@ -59,7 +59,7 @@ const NETWORK_EVM_ENDPOINT = 'https://testnet.telos.net'; const INDEXER_ENDPOINT = 'https://api.testnet.teloscan.io'; const CONTRACTS_BUCKET = 'https://verified-evm-contracts-testnet.s3.amazonaws.com'; -declare const fathom: { trackGoal: (eventId: string, value: 0) => void }; +declare const fathom: { trackEvent: (eventName: string) => void }; export default class TelosEVMTestnet extends EVMChainSettings { isTestnet() { @@ -149,7 +149,7 @@ export default class TelosEVMTestnet extends EVMChainSettings { } getBuyMoreOfTokenLink(): string { - return 'https://www.telos.net/#buy-tlos-simplex'; + return 'https://telos.net/ecosystem?category=Exchanges'; } getSystemTokens(): TokenClass[] { @@ -164,13 +164,12 @@ export default class TelosEVMTestnet extends EVMChainSettings { return true; } - trackAnalyticsEvent(params: Record): void { + trackAnalyticsEvent(eventName: string): void { if (typeof fathom === 'undefined') { - console.warn(`Failed to track event with ID ${params.id}: Fathom Analytics not loaded`); + console.warn(`Failed to track event with name '${eventName}': Fathom Analytics not loaded`); return; } - const id = params.id as string; - fathom.trackGoal(id, 0); + fathom.trackEvent(eventName); } } diff --git a/src/antelope/chains/evm/telos-evm/index.ts b/src/antelope/chains/evm/telos-evm/index.ts index 91b1a8533..9e2e6ed3b 100644 --- a/src/antelope/chains/evm/telos-evm/index.ts +++ b/src/antelope/chains/evm/telos-evm/index.ts @@ -59,7 +59,7 @@ const NETWORK_EVM_ENDPOINT = 'https://mainnet.telos.net'; const INDEXER_ENDPOINT = 'https://api.teloscan.io'; const CONTRACTS_BUCKET = 'https://verified-evm-contracts.s3.amazonaws.com'; -declare const fathom: { trackGoal: (eventId: string, value: 0) => void }; +declare const fathom: { trackEvent: (eventName: string) => void }; export default class TelosEVMTestnet extends EVMChainSettings { getNetwork(): string { @@ -145,7 +145,7 @@ export default class TelosEVMTestnet extends EVMChainSettings { } getBuyMoreOfTokenLink(): string { - return 'https://www.telos.net/#buy-tlos-simplex'; + return 'https://telos.net/ecosystem?category=Exchanges'; } getSystemTokens(): TokenClass[] { @@ -160,13 +160,12 @@ export default class TelosEVMTestnet extends EVMChainSettings { return true; } - trackAnalyticsEvent(params: Record): void { + trackAnalyticsEvent(eventName: string): void { if (typeof fathom === 'undefined') { - console.warn(`Failed to track event with ID ${params.id}: Fathom Analytics not loaded`); + console.warn(`Failed to track event with name '${eventName}': Fathom Analytics not loaded`); return; } - const id = params.id as string; - fathom.trackGoal(id, 0); + fathom.trackEvent(eventName); } } diff --git a/src/antelope/types/ChainSettings.ts b/src/antelope/types/ChainSettings.ts index 36a081469..62c33e7fb 100644 --- a/src/antelope/types/ChainSettings.ts +++ b/src/antelope/types/ChainSettings.ts @@ -26,6 +26,6 @@ export interface ChainSettings { getSystemTokens(): TokenClass[]; getNftsForAccount(address: string, filter: IndexerAccountNftsFilter): Promise; getNftsForCollection(contract: string, filter: IndexerCollectionNftsFilter): Promise; - trackAnalyticsEvent(params: Record): void; + trackAnalyticsEvent(eventName: string): void; getApy(): Promise; } diff --git a/src/antelope/wallets/authenticators/InjectedProviderAuth.ts b/src/antelope/wallets/authenticators/InjectedProviderAuth.ts index 4439ec142..94026a185 100644 --- a/src/antelope/wallets/authenticators/InjectedProviderAuth.ts +++ b/src/antelope/wallets/authenticators/InjectedProviderAuth.ts @@ -12,8 +12,8 @@ import { addressString, } from 'src/antelope/types'; import { EVMAuthenticator } from 'src/antelope/wallets'; -import { TELOS_NETWORK_NAMES, TELOS_ANALYTICS_EVENT_IDS } from 'src/antelope/chains/chain-constants'; -import { MetamaskAuthName, SafePalAuthName } from 'src/antelope/wallets'; +import { TELOS_NETWORK_NAMES, TELOS_ANALYTICS_EVENT_NAMES } from 'src/antelope/chains/chain-constants'; +import { BraveAuthName, MetamaskAuthName, SafePalAuthName } from 'src/antelope/wallets'; export abstract class InjectedProviderAuth extends EVMAuthenticator { onReady = new BehaviorSubject(false); @@ -32,31 +32,27 @@ export abstract class InjectedProviderAuth extends EVMAuthenticator { useFeedbackStore().setLoading(`${this.getName()}.login`); this.trace('login', 'trackAnalyticsEvent -> login started'); - chainSettings.trackAnalyticsEvent( - { id: TELOS_ANALYTICS_EVENT_IDS.loginStarted }, - ); + chainSettings.trackAnalyticsEvent(TELOS_ANALYTICS_EVENT_NAMES.loginStarted); const response = await super.login(network).then((res) => { if (TELOS_NETWORK_NAMES.includes(network)) { - let successfulLoginEventId = ''; + let successfulLoginEventName = ''; if (authName === MetamaskAuthName) { - successfulLoginEventId = TELOS_ANALYTICS_EVENT_IDS.loginSuccessfulMetamask; + successfulLoginEventName = TELOS_ANALYTICS_EVENT_NAMES.loginSuccessfulMetamask; } else if (authName === SafePalAuthName) { - successfulLoginEventId = TELOS_ANALYTICS_EVENT_IDS.loginSuccessfulSafepal; + successfulLoginEventName = TELOS_ANALYTICS_EVENT_NAMES.loginSuccessfulSafepal; + } else if (authName === BraveAuthName) { + successfulLoginEventName = TELOS_ANALYTICS_EVENT_NAMES.loginSuccessfulBrave; } - if (successfulLoginEventId) { - this.trace('login', 'trackAnalyticsEvent -> login succeeded', authName, successfulLoginEventId); - chainSettings.trackAnalyticsEvent( - { id: successfulLoginEventId }, - ); + if (successfulLoginEventName) { + this.trace('login', 'trackAnalyticsEvent -> login succeeded', authName, successfulLoginEventName); + chainSettings.trackAnalyticsEvent(successfulLoginEventName); } - this.trace('login', 'trackAnalyticsEvent -> generic login succeeded', TELOS_ANALYTICS_EVENT_IDS.loginSuccessful); - chainSettings.trackAnalyticsEvent( - { id: TELOS_ANALYTICS_EVENT_IDS.loginSuccessful }, - ); + this.trace('login', 'trackAnalyticsEvent -> generic login succeeded', authName, TELOS_ANALYTICS_EVENT_NAMES.loginSuccessful); + chainSettings.trackAnalyticsEvent(TELOS_ANALYTICS_EVENT_NAMES.loginSuccessful); } return res; @@ -69,16 +65,16 @@ export abstract class InjectedProviderAuth extends EVMAuthenticator { let failedLoginEventId = ''; if (authName === MetamaskAuthName) { - failedLoginEventId = TELOS_ANALYTICS_EVENT_IDS.loginFailedMetamask; + failedLoginEventId = TELOS_ANALYTICS_EVENT_NAMES.loginFailedMetamask; } else if (authName === SafePalAuthName) { - failedLoginEventId = TELOS_ANALYTICS_EVENT_IDS.loginFailedSafepal; + failedLoginEventId = TELOS_ANALYTICS_EVENT_NAMES.loginFailedSafepal; + } else if (authName === BraveAuthName) { + failedLoginEventId = TELOS_ANALYTICS_EVENT_NAMES.loginFailedBrave; } if (failedLoginEventId) { this.trace('login', 'trackAnalyticsEvent -> login failed', authName, failedLoginEventId); - chainSettings.trackAnalyticsEvent( - { id: failedLoginEventId }, - ); + chainSettings.trackAnalyticsEvent(failedLoginEventId); } } }).finally(() => { diff --git a/src/antelope/wallets/authenticators/OreIdAuth.ts b/src/antelope/wallets/authenticators/OreIdAuth.ts index 15dff2034..3dc365a9f 100644 --- a/src/antelope/wallets/authenticators/OreIdAuth.ts +++ b/src/antelope/wallets/authenticators/OreIdAuth.ts @@ -14,7 +14,7 @@ import { import { useFeedbackStore } from 'src/antelope/stores/feedback'; import { useChainStore } from 'src/antelope/stores/chain'; import { RpcEndpoint } from 'universal-authenticator-library'; -import { TELOS_ANALYTICS_EVENT_IDS } from 'src/antelope/chains/chain-constants'; +import { TELOS_ANALYTICS_EVENT_NAMES } from 'src/antelope/chains/chain-constants'; const name = 'OreId'; export const OreIdAuthName = name; @@ -64,14 +64,10 @@ export class OreIdAuth extends EVMAuthenticator { this.trace('login', network); const chainSettings = this.getChainSettings(); const trackSuccessfulLogin = () => { - this.trace('login', 'trackAnalyticsEvent -> generic login succeeded', TELOS_ANALYTICS_EVENT_IDS.loginSuccessful); - chainSettings.trackAnalyticsEvent( - { id: TELOS_ANALYTICS_EVENT_IDS.loginSuccessful }, - ); - this.trace('login', 'trackAnalyticsEvent -> login succeeded', this.getName(), TELOS_ANALYTICS_EVENT_IDS.loginSuccessfulOreId); - chainSettings.trackAnalyticsEvent( - { id: TELOS_ANALYTICS_EVENT_IDS.loginSuccessfulOreId }, - ); + this.trace('login', 'trackAnalyticsEvent -> generic login succeeded', TELOS_ANALYTICS_EVENT_NAMES.loginSuccessful); + chainSettings.trackAnalyticsEvent(TELOS_ANALYTICS_EVENT_NAMES.loginSuccessful); + this.trace('login', 'trackAnalyticsEvent -> login succeeded', this.getName(), TELOS_ANALYTICS_EVENT_NAMES.loginSuccessfulOreId); + chainSettings.trackAnalyticsEvent(TELOS_ANALYTICS_EVENT_NAMES.loginSuccessfulOreId); }; useFeedbackStore().setLoading(`${this.getName()}.login`); @@ -93,18 +89,14 @@ export class OreIdAuth extends EVMAuthenticator { this.trace('login', 'userChainAccount', this.userChainAccount); // track the login start for auto-login procceess this.trace('login', 'trackAnalyticsEvent -> login started'); - chainSettings.trackAnalyticsEvent( - { id: TELOS_ANALYTICS_EVENT_IDS.loginStarted }, - ); + chainSettings.trackAnalyticsEvent(TELOS_ANALYTICS_EVENT_NAMES.loginStarted); // then track the successful login trackSuccessfulLogin(); return chainAccount; } this.trace('login', 'trackAnalyticsEvent -> login started'); - chainSettings.trackAnalyticsEvent( - { id: TELOS_ANALYTICS_EVENT_IDS.loginStarted }, - ); + chainSettings.trackAnalyticsEvent(TELOS_ANALYTICS_EVENT_NAMES.loginStarted); // launch the login flow await oreId.popup.auth({ provider: this.provider as AuthProvider }); @@ -118,10 +110,8 @@ export class OreIdAuth extends EVMAuthenticator { const appName = this.options.appName; const networkName = useChainStore().getNetworkSettings(network).getDisplay(); - this.trace('login', 'trackAnalyticsEvent -> login failed', this.getName(), TELOS_ANALYTICS_EVENT_IDS.loginFailedOreId); - chainSettings.trackAnalyticsEvent( - { id: TELOS_ANALYTICS_EVENT_IDS.loginFailedOreId }, - ); + this.trace('login', 'trackAnalyticsEvent -> login failed', this.getName(), TELOS_ANALYTICS_EVENT_NAMES.loginFailedOreId); + chainSettings.trackAnalyticsEvent(TELOS_ANALYTICS_EVENT_NAMES.loginFailedOreId); throw new AntelopeError('antelope.wallets.error_oreid_no_chain_account', { networkName, diff --git a/src/antelope/wallets/authenticators/WalletConnectAuth.ts b/src/antelope/wallets/authenticators/WalletConnectAuth.ts index 5010b55c5..5bdb6de7b 100644 --- a/src/antelope/wallets/authenticators/WalletConnectAuth.ts +++ b/src/antelope/wallets/authenticators/WalletConnectAuth.ts @@ -17,7 +17,7 @@ import { } from '@web3modal/ethereum'; import { Web3Modal, Web3ModalConfig } from '@web3modal/html'; import { BigNumber, ethers } from 'ethers'; -import { TELOS_ANALYTICS_EVENT_IDS } from 'src/antelope/chains/chain-constants'; +import { TELOS_ANALYTICS_EVENT_NAMES } from 'src/antelope/chains/chain-constants'; import { useChainStore } from 'src/antelope/stores/chain'; import { useContractStore } from 'src/antelope/stores/contract'; import { useFeedbackStore } from 'src/antelope/stores/feedback'; @@ -106,19 +106,15 @@ export class WalletConnectAuth extends EVMAuthenticator { 'login', 'trackAnalyticsEvent -> login successful', 'WalletConnect', - TELOS_ANALYTICS_EVENT_IDS.loginSuccessfulWalletConnect, - ); - chainSettings.trackAnalyticsEvent( - { id: TELOS_ANALYTICS_EVENT_IDS.loginSuccessfulWalletConnect }, + TELOS_ANALYTICS_EVENT_NAMES.loginSuccessfulWalletConnect, ); + chainSettings.trackAnalyticsEvent(TELOS_ANALYTICS_EVENT_NAMES.loginSuccessfulWalletConnect); this.trace( 'login', 'trackAnalyticsEvent -> generic login successful', - TELOS_ANALYTICS_EVENT_IDS.loginSuccessful, - ); - chainSettings.trackAnalyticsEvent( - { id: TELOS_ANALYTICS_EVENT_IDS.loginSuccessful }, + TELOS_ANALYTICS_EVENT_NAMES.loginSuccessful, ); + chainSettings.trackAnalyticsEvent(TELOS_ANALYTICS_EVENT_NAMES.loginSuccessful); return address; } catch (e) { @@ -128,12 +124,10 @@ export class WalletConnectAuth extends EVMAuthenticator { 'walletConnectLogin', 'trackAnalyticsEvent -> login failed', 'WalletConnect', - TELOS_ANALYTICS_EVENT_IDS.loginFailedWalletConnect, + TELOS_ANALYTICS_EVENT_NAMES.loginFailedWalletConnect, ); const chainSettings = this.getChainSettings(); - chainSettings.trackAnalyticsEvent( - { id: TELOS_ANALYTICS_EVENT_IDS.loginFailedWalletConnect }, - ); + chainSettings.trackAnalyticsEvent(TELOS_ANALYTICS_EVENT_NAMES.loginFailedWalletConnect); throw new AntelopeError('antelope.evm.error_login'); } finally { useFeedbackStore().unsetLoading(`${this.getName()}.login`); @@ -152,11 +146,9 @@ export class WalletConnectAuth extends EVMAuthenticator { 'login', 'trackAnalyticsEvent -> login started', 'WalletConnect', - TELOS_ANALYTICS_EVENT_IDS.loginStarted, - ); - chainSettings.trackAnalyticsEvent( - { id: TELOS_ANALYTICS_EVENT_IDS.loginStarted }, + TELOS_ANALYTICS_EVENT_NAMES.loginStarted, ); + chainSettings.trackAnalyticsEvent(TELOS_ANALYTICS_EVENT_NAMES.loginStarted); return this.walletConnectLogin(network); } else { return new Promise(async (resolve) => { @@ -170,11 +162,9 @@ export class WalletConnectAuth extends EVMAuthenticator { 'login', 'trackAnalyticsEvent -> login started', 'WalletConnect', - TELOS_ANALYTICS_EVENT_IDS.loginStarted, - ); - chainSettings.trackAnalyticsEvent( - { id: TELOS_ANALYTICS_EVENT_IDS.loginStarted }, + TELOS_ANALYTICS_EVENT_NAMES.loginStarted, ); + chainSettings.trackAnalyticsEvent(TELOS_ANALYTICS_EVENT_NAMES.loginStarted); } if (newState.open === false) { @@ -185,11 +175,9 @@ export class WalletConnectAuth extends EVMAuthenticator { 'login', 'trackAnalyticsEvent -> login failed', 'WalletConnect', - TELOS_ANALYTICS_EVENT_IDS.loginFailedWalletConnect, - ); - chainSettings.trackAnalyticsEvent( - { id: TELOS_ANALYTICS_EVENT_IDS.loginFailedWalletConnect }, + TELOS_ANALYTICS_EVENT_NAMES.loginFailedWalletConnect, ); + chainSettings.trackAnalyticsEvent(TELOS_ANALYTICS_EVENT_NAMES.loginFailedWalletConnect); } // this prevents multiple subscribers from being attached to the web3Modal diff --git a/src/antelope/wallets/index.ts b/src/antelope/wallets/index.ts index d09b2caf6..3f42a76ec 100644 --- a/src/antelope/wallets/index.ts +++ b/src/antelope/wallets/index.ts @@ -4,4 +4,5 @@ export * from 'src/antelope/wallets/authenticators/MetamaskAuth'; export * from 'src/antelope/wallets/authenticators/OreIdAuth'; export * from 'src/antelope/wallets/authenticators/WalletConnectAuth'; export * from 'src/antelope/wallets/authenticators/SafePalAuth'; +export * from 'src/antelope/wallets/authenticators/BraveAuth'; export * from 'src/antelope/wallets/AntelopeWallets'; diff --git a/src/boot/ual.js b/src/boot/ual.js index bee935b1a..3f988b301 100644 --- a/src/boot/ual.js +++ b/src/boot/ual.js @@ -26,7 +26,7 @@ export default boot(async ({ app, store }) => { if (localStorage.getItem('autoLogin') === 'cleos') { accountName = localStorage.getItem('account'); } else { - await new Promise((resolve) => { + await new Promise((resolve, reject) => { Dialog.create({ class: 'cleos-auth-dialog', color: 'primary', @@ -43,11 +43,13 @@ export default boot(async ({ app, store }) => { accountName = data !== '' ? data : 'eosio'; }) .onCancel(() => { - throw 'Cancelled!'; + reject('cancelled'); }) .onDismiss(() => { resolve(true); }); + }).catch((e) => { + throw e; }); if (store.state.account.justViewer) { permission = 'active'; @@ -73,7 +75,7 @@ export default boot(async ({ app, store }) => { permission = data; }) .onCancel(() => { - throw 'Cancelled!'; + throw 'cancelled'; }) .onDismiss(() => { resolve(true); @@ -133,7 +135,7 @@ export default boot(async ({ app, store }) => { }); }) .onCancel(() => { - throw 'Cancelled!'; + throw 'cancelled'; }) .onDismiss(() => { resolve(true); @@ -142,8 +144,8 @@ export default boot(async ({ app, store }) => { } const authenticators = [ - new Wombat([chain], { appName: process.env.APP_NAME }), new Anchor([chain], { appName: process.env.APP_NAME }), + new Wombat([chain], { appName: process.env.APP_NAME }), new CleosAuthenticator([chain], { appName: process.env.APP_NAME, loginHandler, diff --git a/src/components/evm/AppNav.vue b/src/components/evm/AppNav.vue index 2d8765378..64dc2e8bb 100644 --- a/src/components/evm/AppNav.vue +++ b/src/components/evm/AppNav.vue @@ -147,6 +147,10 @@ export default defineComponent({ const network = this.loggedAccount.network; window.open(chainStore.getEcosystemUrl(network), '_blank'); }, + goToExplorer() { + const network = this.loggedAccount.network; + window.open(chainStore.getExplorerUrl(network), '_blank'); + }, }, }); @@ -252,25 +256,6 @@ export default defineComponent({ /> {{ $t('nav.wallet') }} -
  • + + +