Skip to content

Commit 21310c1

Browse files
committed
chore: add analytics for external wallet connections
Signed-off-by: Brandon McAnsh <[email protected]>
1 parent 664d650 commit 21310c1

File tree

2 files changed

+110
-0
lines changed

2 files changed

+110
-0
lines changed

apps/flipcash/shared/onramp/deeplinks/src/main/kotlin/com/flipcash/app/onramp/ExternalWalletOnRampHandler.kt

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,8 +18,11 @@ import com.flipcash.app.onramp.internal.ExternalWalletState
1818
import com.flipcash.app.onramp.internal.buildConnectDeeplink
1919
import com.flipcash.app.onramp.internal.buildTransactionDeeplink
2020
import com.flipcash.app.router.Router
21+
import com.flipcash.services.analytics.FlipcashAnalyticsManager
22+
import com.flipcash.services.analytics.FlipcashAnalyticsService
2123
import com.flipcash.services.internal.model.thirdparty.OnRampProvider
2224
import com.flipcash.shared.onramp.deeplinks.R
25+
import com.getcode.libs.analytics.LocalAnalytics
2326
import com.getcode.manager.BottomBarAction
2427
import com.getcode.manager.BottomBarManager
2528
import com.getcode.navigation.core.CodeNavigator
@@ -46,6 +49,7 @@ fun ExternalWalletOnRampHandler(
4649
) {
4750
val permissions = LocalPermissionChecker.current
4851
val composeScope = rememberCoroutineScope()
52+
val analytics = LocalAnalytics.current as FlipcashAnalyticsService
4953

5054
fun close(exit: Boolean) {
5155
if (exit) {
@@ -91,6 +95,13 @@ fun ExternalWalletOnRampHandler(
9195
null -> ""
9296
}
9397
)
98+
99+
if (error is DeeplinkOnRampError.WalletProvidedError && error.code == DeeplinkError.UserRejectedRequest.code) {
100+
analytics.walletTransactionCancelled(state.provider!!)
101+
} else if (error is DeeplinkOnRampError.FailedToSendTransaction) {
102+
analytics.walletTransactionFailed(state.provider!!)
103+
}
104+
94105
trace(
95106
tag = TAG,
96107
message = "Something went wrong during deeplink onramp",
@@ -149,6 +160,7 @@ fun ExternalWalletOnRampHandler(
149160
message = "wallet connect uri: $uri",
150161
type = TraceType.Process
151162
)
163+
analytics.connectWallet(state.provider!!)
152164
uriHandler.openUri(uri.toString())
153165
state.deeplinkState = ExternalWalletState.CONNECTING
154166
}
@@ -185,6 +197,7 @@ fun ExternalWalletOnRampHandler(
185197
message = "wallet transact uri: $uri",
186198
type = TraceType.Process
187199
)
200+
analytics.amountSelectedForWalletTransfer(state.provider!!, state.amount!!)
188201
uriHandler.openUri(uri.toString())
189202
}
190203

@@ -211,6 +224,7 @@ fun ExternalWalletOnRampHandler(
211224
message = "transaction complete",
212225
type = TraceType.Process
213226
)
227+
analytics.transactionSubmittedToWallet(state.provider!!)
214228
state.reset()
215229
val hasPushPerms = permissions.isGranted(Manifest.permission.POST_NOTIFICATIONS)
216230
BottomBarManager.showMessage(

services/flipcash/src/main/kotlin/com/flipcash/services/analytics/Analytics.kt

Lines changed: 96 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
package com.flipcash.services.analytics
22

3+
import com.flipcash.services.internal.model.thirdparty.OnRampProvider
34
import com.getcode.ed25519.Ed25519.KeyPair
45
import com.getcode.libs.analytics.AnalyticsService
56
import com.getcode.libs.analytics.AppAction
@@ -46,6 +47,17 @@ interface FlipcashAnalyticsService : AnalyticsService {
4647
fun poolCreated(id: ID)
4748
fun placedBidInPool(id: ID)
4849
fun declaredOutcomeInPool(id: ID)
50+
51+
fun connectWallet(
52+
provider: OnRampProvider.UsesDeeplinks
53+
)
54+
fun amountSelectedForWalletTransfer(
55+
provider: OnRampProvider.UsesDeeplinks,
56+
amount: Fiat
57+
)
58+
fun transactionSubmittedToWallet(provider: OnRampProvider.UsesDeeplinks)
59+
fun walletTransactionFailed(provider: OnRampProvider.UsesDeeplinks)
60+
fun walletTransactionCancelled(provider: OnRampProvider.UsesDeeplinks)
4961
}
5062

5163
class FlipcashAnalyticsManager @Inject constructor(
@@ -122,6 +134,38 @@ class FlipcashAnalyticsManager @Inject constructor(
122134
track(event.name, *properties.toList().toTypedArray())
123135
}
124136

137+
override fun connectWallet(provider: OnRampProvider.UsesDeeplinks) {
138+
val event = AnalyticsEvent.WalletConnect(provider)
139+
val properties = event.properties()
140+
track(event.name, *properties.toList().toTypedArray())
141+
}
142+
143+
override fun amountSelectedForWalletTransfer(provider: OnRampProvider.UsesDeeplinks, amount: Fiat) {
144+
val event = AnalyticsEvent.WalletRequestAmount(provider)
145+
val properties = event.properties(
146+
nativeAmount = amount
147+
)
148+
track(event.name, *properties.toList().toTypedArray())
149+
}
150+
151+
override fun transactionSubmittedToWallet(provider: OnRampProvider.UsesDeeplinks) {
152+
val event = AnalyticsEvent.WalletSubmitTransaction(provider)
153+
val properties = event.properties()
154+
track(event.name, *properties.toList().toTypedArray())
155+
}
156+
157+
override fun walletTransactionFailed(provider: OnRampProvider.UsesDeeplinks) {
158+
val event = AnalyticsEvent.WalletTransactionFailed(provider)
159+
val properties = event.properties()
160+
track(event.name, *properties.toList().toTypedArray())
161+
}
162+
163+
override fun walletTransactionCancelled(provider: OnRampProvider.UsesDeeplinks) {
164+
val event = AnalyticsEvent.WalletTransactionCancelled(provider)
165+
val properties = event.properties()
166+
track(event.name, *properties.toList().toTypedArray())
167+
}
168+
125169
private fun track(name: String, vararg properties: Pair<String, String>) {
126170
if (BuildConfig.DEBUG) {
127171
trace(
@@ -219,6 +263,30 @@ sealed interface AnalyticsEvent {
219263
data class DeclaredOutcome(override val id: ID) : PoolEvent {
220264
override val name: String = "Pool: Declared Outcome"
221265
}
266+
267+
sealed interface WalletEvent : AnalyticsEvent {
268+
val provider: OnRampProvider.UsesDeeplinks
269+
}
270+
271+
data class WalletConnect(override val provider: OnRampProvider.UsesDeeplinks) : WalletEvent {
272+
override val name: String = "Wallet: Connect"
273+
}
274+
275+
data class WalletRequestAmount(override val provider: OnRampProvider.UsesDeeplinks) : WalletEvent {
276+
override val name: String = "Wallet: Request Amount"
277+
}
278+
279+
data class WalletSubmitTransaction(override val provider: OnRampProvider.UsesDeeplinks) : WalletEvent {
280+
override val name: String = "Wallet: Transactions Submitted"
281+
}
282+
283+
data class WalletTransactionFailed(override val provider: OnRampProvider.UsesDeeplinks) : WalletEvent {
284+
override val name: String = "Wallet: Transactions Failed"
285+
}
286+
287+
data class WalletTransactionCancelled(override val provider: OnRampProvider.UsesDeeplinks) : WalletEvent {
288+
override val name: String = "Wallet: Cancel"
289+
}
222290
}
223291

224292
private fun AnalyticsEvent.properties(
@@ -236,6 +304,16 @@ private fun AnalyticsEvent.properties(
236304
}
237305
}
238306

307+
val providerName = if (this@properties is AnalyticsEvent.WalletEvent) {
308+
when (provider) {
309+
OnRampProvider.Backpack -> "Backpack"
310+
OnRampProvider.Solflare -> "Solflare"
311+
OnRampProvider.Phantom -> "Phantom"
312+
}
313+
} else {
314+
""
315+
}
316+
239317
when (val event = this@properties) {
240318
is AnalyticsEvent.SentCashLink -> {
241319
if (event.clipboard == true) {
@@ -259,6 +337,24 @@ private fun AnalyticsEvent.properties(
259337
is AnalyticsEvent.PoolEvent -> {
260338
put("ID", event.id.base58)
261339
}
340+
341+
is AnalyticsEvent.WalletConnect -> {
342+
put("Provider", providerName)
343+
}
344+
is AnalyticsEvent.WalletRequestAmount -> {
345+
put("Provider", providerName)
346+
put("Fiat", nativeAmount?.doubleValue.toString())
347+
put("Currency", nativeAmount?.currencyCode?.name.orEmpty())
348+
}
349+
is AnalyticsEvent.WalletSubmitTransaction -> {
350+
put("Provider", providerName)
351+
}
352+
is AnalyticsEvent.WalletTransactionCancelled -> {
353+
put("Provider", providerName)
354+
}
355+
is AnalyticsEvent.WalletTransactionFailed -> {
356+
put("Provider", providerName)
357+
}
262358
}
263359

264360
if (localizedAmount != null) {

0 commit comments

Comments
 (0)