Skip to content

Commit

Permalink
Reset analytics data and stop listening to blocks on logout
Browse files Browse the repository at this point in the history
  • Loading branch information
ccali11 committed Jul 14, 2023
1 parent b177a9a commit 787508a
Show file tree
Hide file tree
Showing 9 changed files with 113 additions and 65 deletions.
42 changes: 24 additions & 18 deletions apps/web/src/composables/ethers.ts
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@ declare const window: ethereumWindow

const { createSiweMessage, signInWithEthereum } = useAuth()
const { ethereumUrl } = useEnvironment()
const provider = new ethers.providers.JsonRpcProvider(ethereumUrl)

export default function useEthers() {
const ethersProviderList = ['BraveWallet', 'CoinbaseWallet', 'MetaMask', 'OkxWallet', 'TrustWallet']
Expand All @@ -30,6 +31,23 @@ export default function useEthers() {
}
}

async function blockListener (blockNumber: number) {
const { manager, refreshBreakdown } = useContracts()
const { user } = useUsers()
console.log('blockNumber :>> ', blockNumber)
const addresses = (user.value as UserWithAccounts).accounts.map((account: Account) => account.address) as string[]
const block = await provider.getBlockWithTransactions(blockNumber)
const transactions = block.transactions
transactions.map(async (tx) => {
if (addresses.includes(tx.from.toLowerCase())) {
console.log('tx :>> ', tx)
const response = manager.interface.parseTransaction({ data: tx.data })
console.log('response :>> ', response)
await refreshBreakdown()
}
})
}

/**
* Estimate gas fee using EIP 1559 methodology
* @returns string in ETH
Expand Down Expand Up @@ -112,7 +130,6 @@ export default function useEthers() {
}

async function getEthersBalance(address: string) : Promise<GLfloat> {
const provider = new ethers.providers.JsonRpcProvider(ethereumUrl)
const balance = await provider.getBalance(address)
return parseFloat(ethers.utils.formatEther(balance))
}
Expand Down Expand Up @@ -152,23 +169,7 @@ export default function useEthers() {
}

async function listenForTransactions() {
const { manager, refreshBreakdown } = useContracts()
const { user } = useUsers()
const provider = new ethers.providers.JsonRpcProvider(ethereumUrl)
provider.on('block', async (blockNumber: number) => {
console.log('blockNumber :>> ', blockNumber)
const addresses = (user.value as UserWithAccounts).accounts.map((account: Account) => account.address) as string[]
const block = await provider.getBlockWithTransactions(blockNumber)
const transactions = block.transactions
transactions.map(async (tx) => {
if (addresses.includes(tx.from.toLowerCase())) {
console.log('tx :>> ', tx)
const response = manager.interface.parseTransaction({ data: tx.data })
console.log('response :>> ', response)
await refreshBreakdown()
}
})
})
provider.on('block', blockListener as ethers.providers.Listener)
await new Promise(() => {
// Wait indefinitely using a Promise that never resolves
})
Expand Down Expand Up @@ -232,6 +233,10 @@ export default function useEthers() {
return signature
}

function stopListeningForTransactions() {
provider.off('block', blockListener as ethers.providers.Listener)
}

async function switchEthersNetwork (providerString: ProviderString, chainId: string) {
const provider = getBrowserProvider(providerString)
const currentChainId = await provider.networkVersion
Expand Down Expand Up @@ -275,6 +280,7 @@ export default function useEthers() {
requestEthersAccount,
sendEthersTransaction,
signEthersMessage,
stopListeningForTransactions,
switchEthersNetwork
}
}
Expand Down
80 changes: 44 additions & 36 deletions apps/web/src/composables/users.ts
Original file line number Diff line number Diff line change
@@ -1,18 +1,14 @@
import { ref, readonly } from 'vue'
import { Account, AddAccountOptions, ProviderString, RemoveAccountOptions, UserWithAccounts, ApiResponse } from '@casimir/types'
import { Account, AddAccountOptions, ProviderString, RemoveAccountOptions, UserWithAccounts, ApiResponse, UserAnalyticsData } from '@casimir/types'
import useEnvironment from '@/composables/environment'
import useEthers from './ethers'
import * as Session from 'supertokens-web-js/recipe/session'
import useTxData from '../mockData/mock_transaction_data'

const { txData } = useTxData()

const { usersUrl } = useEnvironment()

// 0xd557a5745d4560B24D36A68b52351ffF9c86A212
const session = ref<boolean>(false)
const user = ref<UserWithAccounts | null>(null)
const userAnalytics = ref<any>({
const userAnalyticsInit = {
oneMonth: {
labels: [],
data: []
Expand All @@ -29,7 +25,12 @@ const userAnalytics = ref<any>({
labels: [],
data: []
}
})
}

// 0xd557a5745d4560B24D36A68b52351ffF9c86A212
const session = ref<boolean>(false)
const user = ref<UserWithAccounts | undefined>(undefined)
const userAnalytics = ref<UserAnalyticsData>(userAnalyticsInit)
const rawUserAnalytics = ref<any>(null)
const userAddresses = ref<Array<string>>([])

Expand Down Expand Up @@ -119,8 +120,8 @@ export default function useUsers() {
}
}

function setUserAnalytics() {
const result = userAnalytics.value
function computeUserAnalytics() {
// const result = userAnalytics.value
const sortedTransactions = rawUserAnalytics.value.sort((a: any, b: any) => {
new Date(a.receivedAt).getTime() - new Date(b.receivedAt).getTime()
})
Expand All @@ -140,58 +141,58 @@ export default function useUsers() {
sortedTransactions.forEach((tx: any) => {
const { receivedAt, walletAddress, walletBalance } = tx
/* Historical */
if (!result.historical.data.find((obj: any) => obj.walletAddress === walletAddress)) {
result.historical.data.push({ walletAddress, walletBalance: Array(12).fill(0) })
if (!userAnalytics.value.historical.data.find((obj: any) => obj.walletAddress === walletAddress)) {
userAnalytics.value.historical.data.push({ walletAddress, walletBalance: Array(12).fill(0) })
// Determine which interval the receivedAt falls into
const intervalIndex = Math.floor((new Date(receivedAt).getTime() - earliest) / historicalInterval)
// Set the value of the intervalIndex to the walletBalance
result.historical.data.find((obj: any) => obj.walletAddress === walletAddress).walletBalance[intervalIndex] = walletBalance
userAnalytics.value.historical.data.find((obj: any) => obj.walletAddress === walletAddress).walletBalance[intervalIndex] = walletBalance
} else {
// Determine which interval the receivedAt falls into
const intervalIndex = Math.floor((new Date(receivedAt).getTime() - earliest) / historicalInterval)
// Set the value of the intervalIndex to the walletBalance
result.historical.data.find((obj: any) => obj.walletAddress === walletAddress).walletBalance[intervalIndex] = walletBalance
userAnalytics.value.historical.data.find((obj: any) => obj.walletAddress === walletAddress).walletBalance[intervalIndex] = walletBalance
}

/* One Year */
if (new Date(receivedAt).getTime() > oneYear) {
if (!result.oneYear.data.find((obj: any) => obj.walletAddress === walletAddress)) {
result.oneYear.data.push({ walletAddress, walletBalance: Array(12).fill(0) })
if (!userAnalytics.value.oneYear.data.find((obj: any) => obj.walletAddress === walletAddress)) {
userAnalytics.value.oneYear.data.push({ walletAddress, walletBalance: Array(12).fill(0) })
const monthsAgo = (new Date().getFullYear() - new Date(receivedAt).getFullYear()) * 12 + (new Date().getMonth() - new Date(receivedAt).getMonth())
const intervalIndex = 11 - monthsAgo
result.oneYear.data.find((obj: any) => obj.walletAddress === walletAddress).walletBalance[intervalIndex] = walletBalance
userAnalytics.value.oneYear.data.find((obj: any) => obj.walletAddress === walletAddress).walletBalance[intervalIndex] = walletBalance
} else {
const monthsAgo = (new Date().getFullYear() - new Date(receivedAt).getFullYear()) * 12 + (new Date().getMonth() - new Date(receivedAt).getMonth())
const intervalIndex = 11 - monthsAgo
result.oneYear.data.find((obj: any) => obj.walletAddress === walletAddress).walletBalance[intervalIndex] = walletBalance
userAnalytics.value.oneYear.data.find((obj: any) => obj.walletAddress === walletAddress).walletBalance[intervalIndex] = walletBalance
}
}

/* Six Months */
if (new Date(receivedAt).getTime() > sixMonths) {
if (!result.sixMonth.data.find((obj: any) => obj.walletAddress === walletAddress)) {
result.sixMonth.data.push({ walletAddress, walletBalance: Array(6).fill(0) })
if (!userAnalytics.value.sixMonth.data.find((obj: any) => obj.walletAddress === walletAddress)) {
userAnalytics.value.sixMonth.data.push({ walletAddress, walletBalance: Array(6).fill(0) })
const monthsAgo = (new Date().getFullYear() - new Date(receivedAt).getFullYear()) * 12 + (new Date().getMonth() - new Date(receivedAt).getMonth())
const intervalIndex = 5 - monthsAgo
result.sixMonth.data.find((obj: any) => obj.walletAddress === walletAddress).walletBalance[intervalIndex] = walletBalance
userAnalytics.value.sixMonth.data.find((obj: any) => obj.walletAddress === walletAddress).walletBalance[intervalIndex] = walletBalance
} else {
const monthsAgo = (new Date().getFullYear() - new Date(receivedAt).getFullYear()) * 12 + (new Date().getMonth() - new Date(receivedAt).getMonth())
const intervalIndex = 5 - monthsAgo
result.sixMonth.data.find((obj: any) => obj.walletAddress === walletAddress).walletBalance[intervalIndex] = walletBalance
userAnalytics.value.sixMonth.data.find((obj: any) => obj.walletAddress === walletAddress).walletBalance[intervalIndex] = walletBalance
}
}

/* One Month */
if (new Date(receivedAt).getTime() > oneMonth) {
if (!result.oneMonth.data.find((obj: any) => obj.walletAddress === walletAddress)) {
result.oneMonth.data.push({ walletAddress, walletBalance: Array(30).fill(0) })
if (!userAnalytics.value.oneMonth.data.find((obj: any) => obj.walletAddress === walletAddress)) {
userAnalytics.value.oneMonth.data.push({ walletAddress, walletBalance: Array(30).fill(0) })
const daysAgo = Math.floor((new Date().getTime() - new Date(receivedAt).getTime()) / 86400000)
const intervalIndex = 29 - daysAgo
result.oneMonth.data.find((obj: any) => obj.walletAddress === walletAddress).walletBalance[intervalIndex] = walletBalance
userAnalytics.value.oneMonth.data.find((obj: any) => obj.walletAddress === walletAddress).walletBalance[intervalIndex] = walletBalance
} else {
const daysAgo = Math.floor((new Date().getTime() - new Date(receivedAt).getTime()) / 86400000)
const intervalIndex = 29 - daysAgo
result.oneMonth.data.find((obj: any) => obj.walletAddress === walletAddress).walletBalance[intervalIndex] = walletBalance
userAnalytics.value.oneMonth.data.find((obj: any) => obj.walletAddress === walletAddress).walletBalance[intervalIndex] = walletBalance
}
}
})
Expand All @@ -200,7 +201,7 @@ export default function useUsers() {

// Set the historical labels array to the interval labels
let previousMonth: any = null
result.historical.labels = Array(12).fill(0).map((_, i) => {
userAnalytics.value.historical.labels = Array(12).fill(0).map((_, i) => {
const date = new Date(earliest + (historicalInterval * i))
const currentMonth = date.getMonth()
if (!previousMonth) {
Expand All @@ -216,26 +217,26 @@ export default function useUsers() {
})

// Set the oneYear labels array to the interval labels
result.oneYear.labels = Array(12).fill(0).map((_, i) => {
userAnalytics.value.oneYear.labels = Array(12).fill(0).map((_, i) => {
const date = new Date (new Date().setDate(1))
const monthIndex = new Date(date.setMonth(date.getMonth() - (11 - i)))
return `${months[monthIndex.getMonth()]} ${monthIndex.getFullYear()}`
})

// Set the sixMonth labels array to the interval labels
result.sixMonth.labels = Array(6).fill(0).map((_, i) => {
userAnalytics.value.sixMonth.labels = Array(6).fill(0).map((_, i) => {
const date = new Date (new Date().setDate(1))
const monthIndex = new Date(date.setMonth(date.getMonth() - (5 - i)))
return `${months[monthIndex.getMonth()]} ${monthIndex.getFullYear()}`
})

// Set the oneMonth labels array to the interval labels
result.oneMonth.labels = []
userAnalytics.value.oneMonth.labels = []
for (let i = 30; i > 0; i--) {
const date = new Date().getTime() - ((i - 1) * 86400000)
result.oneMonth.labels.push(`${new Date(date).getMonth() + 1}/${new Date(date).getDate()}`)
userAnalytics.value.oneMonth.labels.push(`${new Date(date).getMonth() + 1}/${new Date(date).getDate()}`)
}
userAnalytics.value = result
// userAnalytics.value = result
}

async function getUserAnalytics() {
Expand All @@ -250,11 +251,9 @@ export default function useUsers() {
const { error, message, data } = await response.json()
if (error) throw new Error(message)

// TODO: Swap this when the API / data is ready
// rawUserAnalytics.value = data
rawUserAnalytics.value = txData.value

setUserAnalytics()
// TODO: Pass data from above when the API / data is ready
setRawAnalytics(txData.value)
computeUserAnalytics()
return { error, message, data }
} catch (error: any) {
throw new Error(error.message || 'Error getting user analytics')
Expand Down Expand Up @@ -314,6 +313,14 @@ export default function useUsers() {
userAddresses.value = newUser?.accounts.map(account => account.address) as Array<string>
}

function setUserAnalytics(data: UserAnalyticsData = userAnalyticsInit) {
userAnalytics.value = data
}

function setRawAnalytics(data: UserAnalyticsData = userAnalyticsInit) {
rawUserAnalytics.value = data
}

async function setUserAccountBalances() {
try {
if (user?.value?.accounts) {
Expand Down Expand Up @@ -372,6 +379,7 @@ export default function useUsers() {
removeAccount,
setUser,
setUserAccountBalances,
setUserAnalytics,
updatePrimaryAddress,
updateUserAgreement
}
Expand Down
12 changes: 6 additions & 6 deletions apps/web/src/composables/wallet.ts
Original file line number Diff line number Diff line change
Expand Up @@ -37,11 +37,11 @@ const toAddress = ref<string>('0x728474D29c2F81eb17a669a7582A2C17f1042b57')

export default function useWallet() {
const { listenForContractEvents, refreshBreakdown } = useContracts()
const { estimateEIP1559GasFee, ethersProviderList, getEthersAddressWithBalance, getEthersBalance, sendEthersTransaction, signEthersMessage, listenForTransactions, loginWithEthers, getEthersBrowserProviderSelectedCurrency, switchEthersNetwork } = useEthers()
const { estimateEIP1559GasFee, ethersProviderList, getEthersAddressWithBalance, getEthersBalance, sendEthersTransaction, signEthersMessage, listenForTransactions, loginWithEthers, getEthersBrowserProviderSelectedCurrency, stopListeningForTransactions, switchEthersNetwork } = useEthers()
const { getLedgerAddress, loginWithLedger, sendLedgerTransaction, signLedgerMessage } = useLedger()
// const { solanaProviderList, sendSolanaTransaction, signSolanaMessage } = useSolana()
const { getTrezorAddress, loginWithTrezor, sendTrezorTransaction, signTrezorMessage } = useTrezor()
const { addAccount, getUser, checkIfSecondaryAddress, checkIfPrimaryUserExists, removeAccount, setUser, setUserAccountBalances, updatePrimaryAddress, user } = useUsers()
const { addAccount, getUser, checkIfSecondaryAddress, checkIfPrimaryUserExists, removeAccount, setUser, setUserAnalytics, setUserAccountBalances, updatePrimaryAddress, user } = useUsers()
const { getWalletConnectAddress, loginWithWalletConnect, sendWalletConnectTransaction, signWalletConnectMessage } = useWalletConnect()

function getColdStorageAddress(provider: ProviderString, currency: Currency = 'ETH') {
Expand Down Expand Up @@ -173,17 +173,17 @@ export default function useWallet() {
}

async function logout() {
console.log('clicked log out')
loadingUserWallets.value = true
await Session.signOut()
stopListeningForTransactions()
setUser(undefined)
setSelectedAddress('')
setSelectedProvider('')
setSelectedCurrency('')
setUser(undefined)
setPrimaryAddress('')
loadingUserWallets.value = false
setUserAnalytics()
// loadingUserWallets.value = false
console.log('user.value :>> ', user.value)
// router.push('/auth')
}

async function removeConnectedAccount() {
Expand Down
7 changes: 6 additions & 1 deletion apps/web/src/pages/overview/components/BreakdownChart.vue
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@ import useUsers from '@/composables/users'
import { ProviderString } from '@casimir/types'
const { currentStaked, refreshBreakdown, stakingRewards, totalWalletBalance } = useContracts()
const { user, getUserAnalytics, userAnalytics } = useUsers()
const { user, getUserAnalytics, setUserAnalytics, userAnalytics } = useUsers()
const chardId = ref('cross_provider_chart')
const selectedTimeframe = ref('historical')
Expand Down Expand Up @@ -54,6 +54,7 @@ const formatLegendLabel = (address: string) => {
}
const setChartData = () => {
console.log('setting chart data in BreakdownChart.vue')
let labels
let data = []
switch (selectedTimeframe.value) {
Expand Down Expand Up @@ -101,13 +102,17 @@ onMounted(async () => {
await getUserAnalytics()
setChartData()
await refreshBreakdown()
} else {
setUserAnalytics()
}
})
watch(user, async () => {
if (user.value?.id) {
await getUserAnalytics()
setChartData()
} else {
setUserAnalytics()
}
})
Expand Down
15 changes: 11 additions & 4 deletions apps/web/src/pages/overview/components/Staking.vue
Original file line number Diff line number Diff line change
Expand Up @@ -140,10 +140,17 @@ watch(formattedAmountToStake, async () => {
})
watch(user, async () => {
aggregateAddressesByProvider()
termsOfServiceCheckbox.value = user.value?.agreedToTermsOfService as boolean
address_balance.value = (Math.round( await getEthersBalance(user.value?.address as string) * 100) / 100 ) + ' ETH'
selectedWallet.value = user.value?.address as string
if (user.value?.id) {
aggregateAddressesByProvider()
termsOfServiceCheckbox.value = user.value?.agreedToTermsOfService as boolean
address_balance.value = (Math.round( await getEthersBalance(user.value?.address as string) * 100) / 100 ) + ' ETH'
selectedWallet.value = user.value?.address as string
} else {
selectedProvider.value = ''
selectedWallet.value = null
formattedAmountToStake.value = ''
address_balance.value = null
}
})
onMounted(async () => {
Expand Down
2 changes: 2 additions & 0 deletions common/types/src/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,7 @@ import { RemoveAccountOptions } from './interfaces/RemoveAccountOptions'
import { User } from './interfaces/User'
import { UserAddedSuccess } from './interfaces/UserAddedSuccess'
import { UserWithAccounts } from './interfaces/UserWithAccounts'
import { UserAnalyticsData } from './interfaces/UserAnalyticsData'
import { Validator } from './interfaces/Validator'

export type {
Expand Down Expand Up @@ -60,6 +61,7 @@ export type {
RemoveAccountOptions,
User,
UserAddedSuccess,
UserAnalyticsData,
UserWithAccounts,
Validator,
}
Loading

0 comments on commit 787508a

Please sign in to comment.