Skip to content

Commit

Permalink
refactor: activity generation (#5464)
Browse files Browse the repository at this point in the history
* refactor: add wrapped inputs to processedTransaction

* refactor: initial separation of activity generation functions

Co-authored-by: MarkNerdi <MarkNerdi@users.noreply.github.com>

* refactor: exclude remainder

* refactor: extract tile title calculation

* refactor: update all inclusionsstates if transaction is confirmed

* chore: improve empty inputs check

* fix: fix type narrowing

* chore: move functions to own files

* fix: fix generation with inputs

* enhancement: create multiple

* refactor: create multiple activities from the same type in one transaction

Co-authored-by: Jason Kraft <jason.kraft@iota.org>

* chore: remove unused functions

* chore: rename generator functions

* chore: extract functions into own files

* Update packages/shared/lib/core/wallet/utils/getActivityTileTitle.ts

Co-authored-by: Jason Kraft <jason.kraft@iota.org>

* Update packages/shared/locales/en.json

Co-authored-by: Jason Kraft <jason.kraft@iota.org>

* fix: fix empty activity list

Co-authored-by: Nicole O'Brien <nicole.obrien@iota.org>
Co-authored-by: MarkNerdi <MarkNerdi@users.noreply.github.com>
Co-authored-by: Jason Kraft <jason.kraft@iota.org>
Co-authored-by: Jason Kraft <developer.kraft@gmail.com>
  • Loading branch information
5 people committed Dec 22, 2022
1 parent a653a30 commit 8228842
Show file tree
Hide file tree
Showing 45 changed files with 423 additions and 264 deletions.
@@ -1,11 +1,13 @@
<script lang="typescript">
import { localize } from '@core/i18n'
import { InclusionState, AliasActivity } from '@core/wallet'
import { AliasActivity, getActivityTileTitle } from '@core/wallet'
import { truncateString } from '@core/utils'
import { Text, Icon, FontWeight } from 'shared/components'
import { Icon as IconEnum } from '@lib/auxiliary/icon'
export let activity: AliasActivity
$: title = getActivityTileTitle(activity)
</script>

<div class="relative flex w-8 h-8">
Expand All @@ -25,9 +27,7 @@
lineHeight="140"
classes="overflow-hidden overflow-ellipsis multiwrap-line2"
>
{localize(
activity.inclusionState === InclusionState.Confirmed ? 'general.aliasCreated' : 'general.creatingAlias'
)}
{localize(title)}
</Text>
</div>
<div class="flex flex-row">
Expand Down
Expand Up @@ -2,9 +2,9 @@
import { localize } from '@core/i18n'
import {
FoundryActivity,
getActivityTileTitle,
getAssetFromPersistedAssets,
getFormattedAmountFromActivity,
InclusionState,
IPersistedAsset,
selectedAccountAssets,
} from '@core/wallet'
Expand All @@ -15,6 +15,7 @@
let asset: IPersistedAsset
$: $selectedAccountAssets, (asset = getAssetFromPersistedAssets(activity.assetId))
$: title = getActivityTileTitle(activity)
$: amount = getFormattedAmountFromActivity(activity)
</script>

Expand All @@ -26,7 +27,7 @@
lineHeight="140"
classes="overflow-hidden overflow-ellipsis multiwrap-line2"
>
{localize(activity.inclusionState === InclusionState.Confirmed ? 'general.minted' : 'general.minting')}
{localize(title)}
</Text>
<Text fontWeight={FontWeight.semibold} lineHeight="140" color="blue-700" classes="whitespace-nowrap">
{amount}
Expand Down
@@ -1,6 +1,6 @@
<script lang="typescript">
import { localize } from '@core/i18n'
import { ActivityAction, ActivityDirection, InclusionState, NftActivity, Subject } from '@core/wallet'
import { ActivityDirection, getActivityTileTitle, NftActivity, Subject } from '@core/wallet'
import { truncateString } from '@core/utils'
import { Text, FontWeight, NftImageOrIconBox } from 'shared/components'
import { networkHrp } from '@core/network'
Expand All @@ -11,29 +11,11 @@
$: isIncoming =
activity.direction === ActivityDirection.Incoming || activity.direction === ActivityDirection.SelfTransaction
$: title = getTitle(activity)
$: title = getActivityTileTitle(activity)
$: subjectLocale = getSubjectLocale(activity.subject)
$: nft = getNftByIdFromAllAccountNfts($selectedAccountIndex, activity.nftId)
function getTitle(_activity: NftActivity): string {
const { isInternal, direction, inclusionState, action } = _activity
const isConfirmed = inclusionState === InclusionState.Confirmed
if (action === ActivityAction.Mint) {
return isConfirmed ? 'general.minted' : 'general.minting'
}
if (isInternal) {
return isConfirmed ? 'general.transfer' : 'general.transferring'
}
if (direction === ActivityDirection.Incoming || direction === ActivityDirection.SelfTransaction) {
return isConfirmed ? 'general.received' : 'general.receiving'
}
if (direction === ActivityDirection.Outgoing) {
return isConfirmed ? 'general.sent' : 'general.sending'
}
}
function getSubjectLocale(subject: Subject): string {
let description
if (subject?.type === 'account') {
Expand Down
Expand Up @@ -3,12 +3,12 @@
import { networkHrp } from '@core/network'
import {
ActivityDirection,
InclusionState,
IPersistedAsset,
getFormattedAmountFromActivity,
TransactionActivity,
selectedAccountAssets,
getAssetFromPersistedAssets,
getActivityTileTitle,
} from '@core/wallet'
import { truncateString } from '@core/utils'
import { Text, AssetIcon, FontWeight } from 'shared/components'
Expand All @@ -17,30 +17,12 @@
let asset: IPersistedAsset
$: $selectedAccountAssets, (asset = getAssetFromPersistedAssets(activity.assetId))
$: title = getTitle(activity)
$: title = getActivityTileTitle(activity)
$: subjectLocale = getSubjectLocale(activity)
$: amount = getFormattedAmountFromActivity(activity)
$: isIncoming =
activity.direction === ActivityDirection.Incoming || activity.direction === ActivityDirection.SelfTransaction
function getTitle(_activity: TransactionActivity): string {
const { isShimmerClaiming, isInternal, direction, inclusionState } = _activity
const isConfirmed = inclusionState === InclusionState.Confirmed
if (isShimmerClaiming) {
return isConfirmed ? 'general.shimmerClaimed' : 'general.shimmerClaiming'
}
if (isInternal) {
return isConfirmed ? 'general.transfer' : 'general.transferring'
}
if (direction === ActivityDirection.Incoming || direction === ActivityDirection.SelfTransaction) {
return isConfirmed ? 'general.received' : 'general.receiving'
}
if (direction === ActivityDirection.Outgoing) {
return isConfirmed ? 'general.sent' : 'general.sending'
}
}
function getSubjectLocale(_activity: TransactionActivity): string {
const { isShimmerClaiming, subject } = _activity
if (isShimmerClaiming) {
Expand Down
Expand Up @@ -4,10 +4,10 @@
import { localize } from '@core/i18n'
import { checkActiveProfileAuth, activeProfile } from '@core/profile'
import {
addActivityToAccountActivitiesInAllAccountActivities,
addActivitiesToAccountActivitiesInAllAccountActivities,
convertBech32ToHexAddress,
formatTokenAmountPrecise,
generateActivity,
generateActivities,
EMPTY_HEX_ID,
preprocessTransaction,
UNLOCK_CONDITION_GOVERNOR_ADDRESS,
Expand Down Expand Up @@ -59,8 +59,8 @@
updateSelectedAccount({ isTransferring: true })
const transaction = await $selectedAccount.createAliasOutput()
const processedTransaction = await preprocessTransaction(transaction, $selectedAccount)
const activity = generateActivity(processedTransaction, $selectedAccount)
addActivityToAccountActivitiesInAllAccountActivities($selectedAccount.index, activity)
const activities = generateActivities(processedTransaction, $selectedAccount)
addActivitiesToAccountActivitiesInAllAccountActivities($selectedAccount.index, activities)
closePopup()
} catch (err) {
handleError(err)
Expand Down
@@ -1,11 +1,11 @@
import { get } from 'svelte/store'
import { selectedAccount, updateSelectedAccount } from '@core/account'
import {
addActivityToAccountActivitiesInAllAccountActivities,
generateActivity,
addActivitiesToAccountActivitiesInAllAccountActivities,
generateActivities,
preprocessTransaction,
} from '@core/wallet'
import { Transaction } from '@iota/wallet'
import { get } from 'svelte/store'

export async function setVotingPower(rawAmount: string): Promise<void> {
try {
Expand All @@ -31,6 +31,6 @@ export async function setVotingPower(rawAmount: string): Promise<void> {
async function processAndAddToActivities(transaction: Transaction): Promise<void> {
const account = get(selectedAccount)
const preprocessedTransaction = await preprocessTransaction(transaction, account)
const activity = generateActivity(preprocessedTransaction, account)
addActivityToAccountActivitiesInAllAccountActivities(account.index, activity)
const activities = generateActivities(preprocessedTransaction, account)
addActivitiesToAccountActivitiesInAllAccountActivities(account.index, activities)
}
@@ -1,10 +1,10 @@
import { syncBalance } from '@core/account/actions/syncBalance'
import { addOrUpdateNftInAllAccountNfts, buildNftFromNftOutput, getIsSpendableFromUnspentNftOutput } from '@core/nfts'
import { activeAccounts } from '@core/profile/stores'
import { ActivityType, addPersistedAsset, generateActivity, getOrRequestAssetFromPersistedAssets } from '@core/wallet'
import { ActivityType, addPersistedAsset, generateActivities, getOrRequestAssetFromPersistedAssets } from '@core/wallet'
import { OUTPUT_TYPE_ALIAS, OUTPUT_TYPE_NFT } from '@core/wallet/constants'
import {
addActivityToAccountActivitiesInAllAccountActivities,
addActivitiesToAccountActivitiesInAllAccountActivities,
allAccountActivities,
} from '@core/wallet/stores/all-account-activities.store'
import { getBech32AddressFromAddressTypes } from '@core/wallet/utils/getBech32AddressFromAddressTypes'
Expand Down Expand Up @@ -40,12 +40,14 @@ export async function handleNewOutputEventInternal(

const processedOutput = preprocessGroupedOutputs([output], payload?.transactionInputs ?? [], account)

const activity = generateActivity(processedOutput, account)
if (activity.type === ActivityType.Basic || activity.type === ActivityType.Foundry) {
const asset = await getOrRequestAssetFromPersistedAssets(activity.assetId)
addPersistedAsset(asset)
const activities = generateActivities(processedOutput, account)
for (const activity of activities) {
if (activity.type === ActivityType.Basic || activity.type === ActivityType.Foundry) {
const asset = await getOrRequestAssetFromPersistedAssets(activity.assetId)
addPersistedAsset(asset)
}
}
addActivityToAccountActivitiesInAllAccountActivities(account.index, activity)
addActivitiesToAccountActivitiesInAllAccountActivities(account.index, activities)
}

if (isNftOutput) {
Expand Down
@@ -1,7 +1,7 @@
import { IAccountState } from '@core/account'
import { IProcessedTransaction } from '@core/wallet/interfaces/processed-transaction.interface'
import { Activity } from '@core/wallet/types'
import { generateActivity } from '@core/wallet/utils'
import { generateActivities } from '@core/wallet/utils'

export function generateActivitiesFromProcessedTransactions(
processedTransactions: IProcessedTransaction[],
Expand All @@ -10,8 +10,8 @@ export function generateActivitiesFromProcessedTransactions(
const activities: Activity[] = []
for (const _preparedActivity of processedTransactions) {
try {
const activity = generateActivity(_preparedActivity, account)
activities.push(activity)
const activitiesToAdd = generateActivities(_preparedActivity, account)
activities.push(...activitiesToAdd)
} catch (err) {
console.error(err)
}
Expand Down
8 changes: 4 additions & 4 deletions packages/shared/lib/core/wallet/actions/burnAsset.ts
Expand Up @@ -6,8 +6,8 @@ import { handleLedgerError } from '@core/ledger'
import { activeProfile, ProfileType } from '@core/profile'
import { Converter } from '@core/utils'
import { get } from 'svelte/store'
import { addActivityToAccountActivitiesInAllAccountActivities } from '../stores'
import { generateActivity, preprocessTransaction } from '../utils'
import { addActivitiesToAccountActivitiesInAllAccountActivities } from '../stores'
import { generateActivities, preprocessTransaction } from '../utils'

export async function burnAsset(assetId: string, rawAmount: string): Promise<void> {
const account = get(selectedAccount)
Expand All @@ -20,8 +20,8 @@ export async function burnAsset(assetId: string, rawAmount: string): Promise<voi

// Generate Activity
const processedTransaction = await preprocessTransaction(burnTokenTransaction, account)
const activity = generateActivity(processedTransaction, account)
addActivityToAccountActivitiesInAllAccountActivities(account.index, activity)
const activities = generateActivities(processedTransaction, account)
addActivitiesToAccountActivitiesInAllAccountActivities(account.index, activities)

showAppNotification({
type: 'success',
Expand Down
8 changes: 4 additions & 4 deletions packages/shared/lib/core/wallet/actions/burnNft.ts
Expand Up @@ -6,8 +6,8 @@ import { handleLedgerError } from '@core/ledger'
import { updateNftInAllAccountNfts } from '@core/nfts'
import { activeProfile, ProfileType } from '@core/profile'
import { get } from 'svelte/store'
import { addActivityToAccountActivitiesInAllAccountActivities } from '../stores'
import { generateActivity, preprocessTransaction } from '../utils'
import { addActivitiesToAccountActivitiesInAllAccountActivities } from '../stores'
import { generateActivities, preprocessTransaction } from '../utils'

export async function burnNft(nftId: string): Promise<void> {
const account = get(selectedAccount)
Expand All @@ -17,8 +17,8 @@ export async function burnNft(nftId: string): Promise<void> {

// Generate Activity
const processedTransaction = await preprocessTransaction(burnNftTransaction, account)
const activity = generateActivity(processedTransaction, account)
addActivityToAccountActivitiesInAllAccountActivities(account.index, activity)
const activities = generateActivities(processedTransaction, account)
addActivitiesToAccountActivitiesInAllAccountActivities(account.index, activities)

// Update NFT
updateNftInAllAccountNfts(account.index, nftId, { isSpendable: false })
Expand Down
8 changes: 4 additions & 4 deletions packages/shared/lib/core/wallet/actions/consolidateOutputs.ts
Expand Up @@ -3,17 +3,17 @@ import { handleError } from '@core/error/handlers/handleError'
import { handleLedgerError } from '@core/ledger'
import { activeProfile, ProfileType } from '@core/profile'
import { get } from 'svelte/store'
import { addActivityToAccountActivitiesInAllAccountActivities } from '../stores'
import { generateActivity, preprocessTransaction } from '../utils'
import { addActivitiesToAccountActivitiesInAllAccountActivities } from '../stores'
import { generateActivities, preprocessTransaction } from '../utils'

export async function consolidateOutputs(): Promise<void> {
const account = get(selectedAccount)
const _activeProfile = get(activeProfile)
try {
const transaction = await account.consolidateOutputs(false, 2)
const processedTransaction = await preprocessTransaction(transaction, account)
const activity = generateActivity(processedTransaction, account)
addActivityToAccountActivitiesInAllAccountActivities(account.index, activity)
const activities = generateActivities(processedTransaction, account)
addActivitiesToAccountActivitiesInAllAccountActivities(account.index, activities)
} catch (err) {
if (_activeProfile.type === ProfileType.Ledger) {
handleLedgerError(err)
Expand Down
22 changes: 10 additions & 12 deletions packages/shared/lib/core/wallet/actions/mintNativeToken.ts
@@ -1,17 +1,17 @@
import { get } from 'svelte/store'
import { showAppNotification } from '@auxiliary/notification'
import { selectedAccount, updateSelectedAccount } from '@core/account'
import { localize } from '@core/i18n'
import { NativeTokenOptions, TransactionOptions } from '@iota/wallet'
import { Converter } from '@core/utils'
import { showAppNotification } from '@auxiliary/notification'
import { activeProfile, ProfileType } from '@core/profile'
import { handleLedgerError } from '@core/ledger'
import { activeProfile, ProfileType } from '@core/profile'
import { Converter } from '@core/utils'
import { NativeTokenOptions, TransactionOptions } from '@iota/wallet'
import { get } from 'svelte/store'
import { VerifiedStatus } from '../enums'
import { buildPersistedAssetFromIrc30Metadata } from '../helpers'
import { IIrc30Metadata, IPersistedAsset } from '../interfaces'
import { addActivityToAccountActivitiesInAllAccountActivities, resetMintTokenDetails } from '../stores'
import { addActivitiesToAccountActivitiesInAllAccountActivities, resetMintTokenDetails } from '../stores'
import { addPersistedAsset } from '../stores/persisted-assets.store'
import { generateActivity, preprocessTransaction } from '../utils'
import { VerifiedStatus } from '../enums'
import { generateActivities, preprocessTransaction } from '../utils'

export async function mintNativeToken(
maximumSupply: number,
Expand All @@ -38,10 +38,8 @@ export async function mintNativeToken(
)
const processedTransaction = await preprocessTransaction(mintTokenTransaction.transaction, account)
addPersistedAsset(persistedAsset)
addActivityToAccountActivitiesInAllAccountActivities(
account.index,
generateActivity(processedTransaction, account)
)
const activities = generateActivities(processedTransaction, account)
addActivitiesToAccountActivitiesInAllAccountActivities(account.index, activities)
showAppNotification({
type: 'success',
message: localize('notifications.mintNativeToken.success'),
Expand Down
32 changes: 21 additions & 11 deletions packages/shared/lib/core/wallet/actions/mintNft.ts
Expand Up @@ -5,14 +5,14 @@ import { handleLedgerError } from '@core/ledger'
import { addOrUpdateNftInAllAccountNfts, buildNftFromNftOutput, IIrc27Metadata } from '@core/nfts'
import { activeProfile, ProfileType } from '@core/profile'
import { Converter } from '@core/utils'
import { INftOutput } from '@iota/types'
import { NftOptions } from '@iota/wallet'
import { get } from 'svelte/store'
import { DEFAULT_TRANSACTION_OPTIONS } from '../constants'
import { DEFAULT_TRANSACTION_OPTIONS, OUTPUT_TYPE_NFT } from '../constants'
import { ActivityAction } from '../enums'
import { addActivityToAccountActivitiesInAllAccountActivities, resetMintNftDetails } from '../stores'
import { NftActivity } from '../types'
import { getNftOutputFromTransaction, preprocessTransaction } from '../utils'
import { generateActivity } from '../utils/generateActivity'
import { preprocessTransaction } from '../utils'
import { generateSingleNftActivity } from '../utils/generateActivity/generateSingleNftActivity'

export async function mintNft(metadata: IIrc27Metadata, amount: number): Promise<void> {
try {
Expand All @@ -35,15 +35,25 @@ export async function mintNft(metadata: IIrc27Metadata, amount: number): Promise
alert: true,
})

// Generate Activity
const processedTransaction = await preprocessTransaction(mintNftTransaction, account)
const activity: NftActivity = generateActivity(processedTransaction, account) as NftActivity
addActivityToAccountActivitiesInAllAccountActivities(account.index, activity)
const outputs = processedTransaction.outputs

// Store NFT
const output = getNftOutputFromTransaction(processedTransaction.outputs)
const nft = buildNftFromNftOutput(output.output as INftOutput, activity.outputId, false)
addOrUpdateNftInAllAccountNfts(account.index, nft)
// Generate Activities
for (const output of outputs) {
if (output.output.type === OUTPUT_TYPE_NFT) {
// For each minted NFT, generate a new activity
const activity: NftActivity = generateSingleNftActivity(account, {
action: ActivityAction.Mint,
processedTransaction,
wrappedOutput: output,
}) as NftActivity
addActivityToAccountActivitiesInAllAccountActivities(account.index, activity)

// Store NFT metadata for each minted NFT
const nft = buildNftFromNftOutput(output.output, activity.outputId, false)
addOrUpdateNftInAllAccountNfts(account.index, nft)
}
}

return Promise.resolve()
} catch (err) {
Expand Down

0 comments on commit 8228842

Please sign in to comment.