From e73bd56ab82bd2e8caf23f4efc4c2e613dd1acb3 Mon Sep 17 00:00:00 2001 From: marc2332 Date: Fri, 22 Mar 2024 09:13:00 +0100 Subject: [PATCH 1/9] feat: Sync SDK types --- .../TransactionActivityTileContent.svelte | 2 +- .../utils/getNetworkIdFromNetworkName.ts | 2 +- .../utils/outputs/preprocessGroupedOutputs.ts | 35 +++++++------------ .../outputs/preprocessOutgoingTransaction.ts | 9 +++-- 4 files changed, 18 insertions(+), 30 deletions(-) diff --git a/packages/shared/components/tiles/tileContents/TransactionActivityTileContent.svelte b/packages/shared/components/tiles/tileContents/TransactionActivityTileContent.svelte index 7620eb1adbe..2f449f81011 100644 --- a/packages/shared/components/tiles/tileContents/TransactionActivityTileContent.svelte +++ b/packages/shared/components/tiles/tileContents/TransactionActivityTileContent.svelte @@ -21,7 +21,7 @@ activity.direction === ActivityDirection.SelfTransaction ? localize('general.internalTransaction') : localize(isIncoming ? 'general.fromAddress' : 'general.toAddress', { - values: { account: getSubjectLocaleFromActivity(activity) }, + values: { address: getSubjectLocaleFromActivity(activity) }, }) $: amount = getFormattedAmountFromActivity(activity) diff --git a/packages/shared/lib/core/network/utils/getNetworkIdFromNetworkName.ts b/packages/shared/lib/core/network/utils/getNetworkIdFromNetworkName.ts index e9078c25d84..73e5391c05f 100644 --- a/packages/shared/lib/core/network/utils/getNetworkIdFromNetworkName.ts +++ b/packages/shared/lib/core/network/utils/getNetworkIdFromNetworkName.ts @@ -14,7 +14,7 @@ export function getNetworkIdFromNetworkName(networkName: string): NetworkId { case 'testnet-1': case 'testnet-2': case 'docker': - case 'docker-1709894432': + case 'docker-1711022286': return NetworkId.Testnet default: return NetworkId.Custom diff --git a/packages/shared/lib/core/wallet/utils/outputs/preprocessGroupedOutputs.ts b/packages/shared/lib/core/wallet/utils/outputs/preprocessGroupedOutputs.ts index 343218bd9ae..c25b510fbf3 100644 --- a/packages/shared/lib/core/wallet/utils/outputs/preprocessGroupedOutputs.ts +++ b/packages/shared/lib/core/wallet/utils/outputs/preprocessGroupedOutputs.ts @@ -1,10 +1,9 @@ -import { CommonOutput, OutputData, OutputResponse, UTXOInput } from '@iota/sdk/out/types' +import { CommonOutput, OutputData, OutputWithMetadata, UTXOInput } from '@iota/sdk/out/types' import { IWalletState } from '@core/wallet/interfaces' import { InclusionState, ActivityDirection } from '../../enums' import { IProcessedTransaction, IWrappedOutput } from '../../interfaces' import { getRecipientAddressFromOutput } from './getRecipientAddressFromOutput' import { getSenderAddressFromInputs } from '../transactions' -import { getOutputIdFromTransactionIdAndIndex } from './getOutputIdFromTransactionIdAndIndex' import { getUnixTimestampFromNodeInfoAndSlotIndex, nodeInfoProtocolParameters } from '@core/network' import { get } from 'svelte/store' import { MILLISECONDS_PER_SECOND } from '@core/utils' @@ -12,14 +11,11 @@ import { MILLISECONDS_PER_SECOND } from '@core/utils' // TODO(2.0) Fix all usages export function preprocessGroupedOutputs( outputDatas: OutputData[], - transactionInputs: OutputResponse[], + transactionInputs: OutputWithMetadata[], wallet: IWalletState ): IProcessedTransaction { const transactionMetadata = outputDatas[0]?.metadata - const wrappedInputs = convertTransactionOutputResponsesToWrappedOutputs( - transactionMetadata?.included.transactionId, - transactionInputs - ) + const wrappedInputs = convertTransactionOutputResponsesToWrappedOutputs(transactionInputs) const utxoInputs = getUtxoInputsFromWrappedInputs(wrappedInputs) const direction = getDirectionForOutputs(outputDatas, wrappedInputs, wallet.depositAddress) const wrappedOutputs = outputDatas.map((outputData) => ({ @@ -75,25 +71,18 @@ function getDirectionForOutputs( } } -function convertTransactionOutputResponsesToWrappedOutputs( - transactionId: string, - outputResponses: OutputResponse[] -): IWrappedOutput[] { - return outputResponses.map((outputResponse) => - convertTransactionOutputResponseToWrappedOutput(transactionId, outputResponse) - ) +function convertTransactionOutputResponsesToWrappedOutputs(outputResponses: OutputWithMetadata[]): IWrappedOutput[] { + return outputResponses.map((outputResponse) => convertTransactionOutputResponseToWrappedOutput(outputResponse)) } -function convertTransactionOutputResponseToWrappedOutput( - transactionId: string, - outputResponse: OutputResponse -): IWrappedOutput { - const outputId = getOutputIdFromTransactionIdAndIndex(transactionId, outputResponse.metadata.outputIndex) - return { outputId, output: outputResponse.output, metadata: outputResponse.metadata } +function convertTransactionOutputResponseToWrappedOutput(outputResponse: OutputWithMetadata): IWrappedOutput { + return { + outputId: outputResponse.metadata.outputId, + output: outputResponse.output, + metadata: outputResponse.metadata, + } } function getUtxoInputsFromWrappedInputs(wrappedInputs: IWrappedOutput[]): UTXOInput[] { - return ( - wrappedInputs?.map((input) => new UTXOInput(input.metadata?.transactionId, input.metadata?.outputIndex)) ?? [] - ) + return wrappedInputs?.map((input) => UTXOInput.fromOutputId(input.outputId)) ?? [] } diff --git a/packages/shared/lib/core/wallet/utils/outputs/preprocessOutgoingTransaction.ts b/packages/shared/lib/core/wallet/utils/outputs/preprocessOutgoingTransaction.ts index c0a17230174..ee2f605550a 100644 --- a/packages/shared/lib/core/wallet/utils/outputs/preprocessOutgoingTransaction.ts +++ b/packages/shared/lib/core/wallet/utils/outputs/preprocessOutgoingTransaction.ts @@ -15,11 +15,11 @@ export async function preprocessOutgoingTransaction( const outputs = convertTransactionsOutputTypesToWrappedOutputs(transactionId, regularTransactionEssence.outputs) const direction = getDirectionFromOutgoingTransaction(outputs, wallet.depositAddress) - const utxoInputs = regularTransactionEssence.inputs.map((i) => i as UTXOInput) const inputIds = await Promise.all( - utxoInputs.map((input) => { - const transactionId = input.transactionId - const transactionOutputIndex = input.transactionOutputIndex + regularTransactionEssence.inputs.map((input) => { + const _input = input as UTXOInput + const transactionId = _input.transactionId + const transactionOutputIndex = _input.transactionOutputIndex return computeOutputId(transactionId, transactionOutputIndex) }) ) @@ -33,7 +33,6 @@ export async function preprocessOutgoingTransaction( time: new Date(Number(transaction.timestamp)), inclusionState: transaction.inclusionState, wrappedInputs: inputs, - utxoInputs, } } From 4d28457ca318902a46ec915172c39988219fe5c5 Mon Sep 17 00:00:00 2001 From: marc2332 Date: Fri, 22 Mar 2024 09:29:33 +0100 Subject: [PATCH 2/9] feat: stop generating txs out of outputs --- .../actions/activities/generateAndStoreActivitiesForWallet.ts | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/packages/shared/lib/core/wallet/actions/activities/generateAndStoreActivitiesForWallet.ts b/packages/shared/lib/core/wallet/actions/activities/generateAndStoreActivitiesForWallet.ts index 8e8cb8c2fb8..181d241a91a 100644 --- a/packages/shared/lib/core/wallet/actions/activities/generateAndStoreActivitiesForWallet.ts +++ b/packages/shared/lib/core/wallet/actions/activities/generateAndStoreActivitiesForWallet.ts @@ -2,7 +2,6 @@ import { IWalletState } from '@core/wallet/interfaces' import { setOutgoingAsyncActivitiesToClaimed } from '../setOutgoingAsyncActivitiesToClaimed' import { preprocessTransactionsForWallet } from './preprocessTransactionsForWallet' -import { preprocessOutputsForWallet } from './preprocessOutputsForWallet' import { linkTransactionsWithClaimingTransactions } from './linkTransactionsWithClaimingTransactions' import { hideActivitiesForFoundries } from './hideActivitiesForFoundries' import { generateActivitiesFromProcessedTransactions } from './generateActivitiesFromProcessedTransactions' @@ -13,7 +12,7 @@ export async function generateAndStoreActivitiesForWallet(wallet: IWalletState): // Step 1: process wallet transactions and outputs into processed transactions const processedTransactions = [ ...(await preprocessTransactionsForWallet(wallet)), - ...(await preprocessOutputsForWallet(wallet)), + // ...(await preprocessOutputsForWallet(wallet)), ] // Step 2: link transactions with corresponding claiming transactions From 71f88e7aeac24bb1285bb47bb675b111f849ad69 Mon Sep 17 00:00:00 2001 From: cpl121 Date: Fri, 22 Mar 2024 17:44:13 +0100 Subject: [PATCH 3/9] fix: tx history: include account output in average txs --- .../preprocessTransactionsForWallet.ts | 14 +++- .../generateActivity/generateActivities.ts | 5 +- .../generateActivitiesFromBasicOutputs.ts | 76 ++++++++++--------- .../wallet/utils/outputs/computeOutputId.ts | 2 +- .../lib/core/wallet/utils/outputs/index.ts | 1 + .../outputs/preprocessIncomingTransaction.ts | 57 ++++++++++++++ .../outputs/preprocessOutgoingTransaction.ts | 25 +++--- .../getDirectionFromOutgoingTransaction.ts | 9 +-- 8 files changed, 131 insertions(+), 58 deletions(-) create mode 100644 packages/shared/lib/core/wallet/utils/outputs/preprocessIncomingTransaction.ts diff --git a/packages/shared/lib/core/wallet/actions/activities/preprocessTransactionsForWallet.ts b/packages/shared/lib/core/wallet/actions/activities/preprocessTransactionsForWallet.ts index fb072035e2c..f1ff39c8341 100644 --- a/packages/shared/lib/core/wallet/actions/activities/preprocessTransactionsForWallet.ts +++ b/packages/shared/lib/core/wallet/actions/activities/preprocessTransactionsForWallet.ts @@ -1,11 +1,10 @@ import { IWalletState } from '@core/wallet/interfaces' -import { preprocessOutgoingTransaction } from '../../utils' +import { preprocessIncomingTransaction, preprocessOutgoingTransaction } from '../../utils' import { IProcessedTransaction } from '../../interfaces/processed-transaction.interface' export async function preprocessTransactionsForWallet(wallet: IWalletState): Promise { - const transactions = await wallet.transactions() - const processedTransactions: IProcessedTransaction[] = [] + const transactions = await wallet.transactions() for (const transaction of transactions) { try { @@ -15,5 +14,14 @@ export async function preprocessTransactionsForWallet(wallet: IWalletState): Pro console.error(err) } } + const incomingTransactions = await wallet.incomingTransactions() + for (const incomingTransaction of incomingTransactions) { + try { + const processedTransaction = preprocessIncomingTransaction(incomingTransaction) + processedTransactions.push(processedTransaction) + } catch (err) { + console.error(err) + } + } return processedTransactions } diff --git a/packages/shared/lib/core/wallet/utils/generateActivity/generateActivities.ts b/packages/shared/lib/core/wallet/utils/generateActivity/generateActivities.ts index c6904ab32c2..7e54cc2ce2c 100644 --- a/packages/shared/lib/core/wallet/utils/generateActivity/generateActivities.ts +++ b/packages/shared/lib/core/wallet/utils/generateActivity/generateActivities.ts @@ -47,8 +47,11 @@ async function generateActivitiesFromProcessedTransactionsWithInputs( activities.push(...nftActivities) } + const containsAccountInInputs = wrappedInputs.some((input) => input.output.type === OutputType.Account) const containsAccountActivity = - outputs.some((output) => output.output.type === OutputType.Account) && !containsFoundryActivity + !containsAccountInInputs && + outputs.some((output) => output.output.type === OutputType.Account) && + !containsFoundryActivity if (containsAccountActivity) { const accountActivities = await generateActivitiesFromAccountOutputs(processedTransaction, wallet) activities.push(...accountActivities) diff --git a/packages/shared/lib/core/wallet/utils/generateActivity/generateActivitiesFromBasicOutputs.ts b/packages/shared/lib/core/wallet/utils/generateActivity/generateActivitiesFromBasicOutputs.ts index d08cd5a7067..2554635b9d4 100644 --- a/packages/shared/lib/core/wallet/utils/generateActivity/generateActivitiesFromBasicOutputs.ts +++ b/packages/shared/lib/core/wallet/utils/generateActivity/generateActivitiesFromBasicOutputs.ts @@ -29,54 +29,56 @@ export async function generateActivitiesFromBasicOutputs( const burnedNftInputs = getBurnedNftInputs(processedTransaction) for (const basicOutput of basicOutputs) { let activity: Activity + const isRemainder = basicOutput.remainder - const isSelfTransaction = processedTransaction.direction === ActivityDirection.SelfTransaction const burnedNftInputIndex = burnedNftInputs.findIndex( (input) => input.output.amount === basicOutput.output.amount ) const burnedNativeToken = burnedNftInputIndex < 0 ? getBurnedNativeTokens(processedTransaction) : undefined - if (isSelfTransaction && burnedNftInputIndex >= 0) { - const wrappedInput = burnedNftInputs[burnedNftInputIndex] - const nftInput = wrappedInput.output as NftOutput - activity = await generateSingleNftActivity( - wallet, - { - action: ActivityAction.Burn, + if (!isRemainder) { + if (burnedNftInputIndex >= 0) { + const wrappedInput = burnedNftInputs[burnedNftInputIndex] + const nftInput = wrappedInput.output as NftOutput + activity = await generateSingleNftActivity( + wallet, + { + action: ActivityAction.Burn, + processedTransaction, + wrappedOutput: basicOutput, + }, + getNftId(nftInput.nftId, wrappedInput.outputId) + ) + const nft = buildNftFromNftOutput(wrappedInput, wallet.depositAddress, false) + addOrUpdateNftInAllWalletNfts(wallet.id, nft) + + burnedNftInputs.splice(burnedNftInputIndex, 1) + } else if (burnedNativeToken) { + activity = await generateSingleBasicActivity( + wallet, + { + action: ActivityAction.Burn, + processedTransaction, + wrappedOutput: basicOutput, + }, + burnedNativeToken.assetId, + burnedNativeToken.amount + ) + } else if (isConsolidation(basicOutput, processedTransaction)) { + activity = await generateSingleConsolidationActivity(wallet, { + action: ActivityAction.Send, processedTransaction, wrappedOutput: basicOutput, - }, - getNftId(nftInput.nftId, wrappedInput.outputId) - ) - const nft = buildNftFromNftOutput(wrappedInput, wallet.depositAddress, false) - addOrUpdateNftInAllWalletNfts(wallet.id, nft) - - burnedNftInputs.splice(burnedNftInputIndex, 1) - } else if (isSelfTransaction && burnedNativeToken) { - activity = await generateSingleBasicActivity( - wallet, - { - action: ActivityAction.Burn, + }) + } else { + activity = await generateSingleBasicActivity(wallet, { + action: ActivityAction.Send, processedTransaction, wrappedOutput: basicOutput, - }, - burnedNativeToken.assetId, - burnedNativeToken.amount - ) - } else if (isSelfTransaction && isConsolidation(basicOutput, processedTransaction)) { - activity = await generateSingleConsolidationActivity(wallet, { - action: ActivityAction.Send, - processedTransaction, - wrappedOutput: basicOutput, - }) - } else { - activity = await generateSingleBasicActivity(wallet, { - action: ActivityAction.Send, - processedTransaction, - wrappedOutput: basicOutput, - }) + }) + } + activities.push(activity) } - activities.push(activity) } return activities } diff --git a/packages/shared/lib/core/wallet/utils/outputs/computeOutputId.ts b/packages/shared/lib/core/wallet/utils/outputs/computeOutputId.ts index 1727a96081e..7c95944ed0a 100644 --- a/packages/shared/lib/core/wallet/utils/outputs/computeOutputId.ts +++ b/packages/shared/lib/core/wallet/utils/outputs/computeOutputId.ts @@ -1,6 +1,6 @@ import { TransactionId, OutputId } from '@iota/sdk/out/types' import { api } from '@core/api' -export function computeOutputId(id: TransactionId, index: number): Promise { +export function computeOutputId(id: TransactionId, index: number): OutputId { return api.computeOutputId(id, index) } diff --git a/packages/shared/lib/core/wallet/utils/outputs/index.ts b/packages/shared/lib/core/wallet/utils/outputs/index.ts index 55778a6cb4e..625a9c13668 100644 --- a/packages/shared/lib/core/wallet/utils/outputs/index.ts +++ b/packages/shared/lib/core/wallet/utils/outputs/index.ts @@ -21,3 +21,4 @@ export * from './preprocessOutgoingTransaction' export * from './getOutputIdFromTransactionIdAndIndex' export * from './getRequiredStorageDepositForMinimalBasicOutput' export * from './getSerialNumberFromAccountAddress' +export * from './preprocessIncomingTransaction' diff --git a/packages/shared/lib/core/wallet/utils/outputs/preprocessIncomingTransaction.ts b/packages/shared/lib/core/wallet/utils/outputs/preprocessIncomingTransaction.ts new file mode 100644 index 00000000000..448b2715aac --- /dev/null +++ b/packages/shared/lib/core/wallet/utils/outputs/preprocessIncomingTransaction.ts @@ -0,0 +1,57 @@ +import { IProcessedTransaction, IWrappedOutput } from '../../interfaces' +import { Output, OutputType, OutputWithMetadata, TransactionWithMetadata, UTXOInput } from '@iota/sdk/out/types' +// import { computeOutputId } from './computeOutputId' +import { getOutputIdFromTransactionIdAndIndex } from './getOutputIdFromTransactionIdAndIndex' +import { ActivityDirection } from '../../enums' + +export function preprocessIncomingTransaction(transaction: TransactionWithMetadata): IProcessedTransaction { + const regularTransactionEssence = transaction.payload.transaction + const transactionId = transaction?.transactionId?.toString() + + const outputs = convertTransactionsOutputTypesToWrappedOutputs(transactionId, regularTransactionEssence.outputs) + + const utxoInputs = regularTransactionEssence.inputs.map((i) => i as UTXOInput) + // const inputIds = utxoInputs.map((input) => { + // const transactionId = input.transactionId + // const transactionOutputIndex = input.transactionOutputIndex + // return computeOutputId(transactionId, transactionOutputIndex) + // }) + // const inputs = await Promise.all(inputIds.map((inputId) => wallet.getOutput(inputId))) + + return { + outputs: outputs, + transactionId, + direction: ActivityDirection.Incoming, + time: new Date(Number(transaction.timestamp)), + inclusionState: transaction.inclusionState, + wrappedInputs: [], + // wrappedInputs: inputs, + utxoInputs, + } +} + +function convertTransactionsOutputTypesToWrappedOutputs( + transactionId: string, + outputTypes: Output[] +): IWrappedOutput[] { + return outputTypes.map((outputType, index) => + convertTransactionOutputTypeToWrappedOutput(transactionId, index, outputType) + ) +} + +function convertTransactionOutputTypeToWrappedOutput( + transactionId: string, + index: number, + outputType: Output +): IWrappedOutput { + const outputId = getOutputIdFromTransactionIdAndIndex(transactionId, index) + OutputWithMetadata + return { + outputId, + output: outputType, + remainder: + index === 0 || (outputType.type !== OutputType.Basic && outputType.type !== OutputType.Account) + ? false + : true, // when sending prepared output in the resulting transactions outputs array it will always be first output(index = 0) + } +} diff --git a/packages/shared/lib/core/wallet/utils/outputs/preprocessOutgoingTransaction.ts b/packages/shared/lib/core/wallet/utils/outputs/preprocessOutgoingTransaction.ts index ee2f605550a..b49ab348049 100644 --- a/packages/shared/lib/core/wallet/utils/outputs/preprocessOutgoingTransaction.ts +++ b/packages/shared/lib/core/wallet/utils/outputs/preprocessOutgoingTransaction.ts @@ -1,5 +1,5 @@ import { IProcessedTransaction, IWrappedOutput } from '../../interfaces' -import { Output, OutputType, TransactionWithMetadata, UTXOInput } from '@iota/sdk/out/types' +import { Output, OutputType, OutputWithMetadata, TransactionWithMetadata, UTXOInput } from '@iota/sdk/out/types' import { computeOutputId } from './computeOutputId' import { getOutputIdFromTransactionIdAndIndex } from './getOutputIdFromTransactionIdAndIndex' import { getDirectionFromOutgoingTransaction } from '../transactions' @@ -14,15 +14,13 @@ export async function preprocessOutgoingTransaction( const outputs = convertTransactionsOutputTypesToWrappedOutputs(transactionId, regularTransactionEssence.outputs) - const direction = getDirectionFromOutgoingTransaction(outputs, wallet.depositAddress) - const inputIds = await Promise.all( - regularTransactionEssence.inputs.map((input) => { - const _input = input as UTXOInput - const transactionId = _input.transactionId - const transactionOutputIndex = _input.transactionOutputIndex - return computeOutputId(transactionId, transactionOutputIndex) - }) - ) + const direction = getDirectionFromOutgoingTransaction(regularTransactionEssence.outputs, await wallet.address()) + const utxoInputs = regularTransactionEssence.inputs.map((i) => i as UTXOInput) + const inputIds = utxoInputs.map((input) => { + const transactionId = input.transactionId + const transactionOutputIndex = input.transactionOutputIndex + return computeOutputId(transactionId, transactionOutputIndex) + }) const inputs = await Promise.all(inputIds.map((inputId) => wallet.getOutput(inputId))) @@ -33,6 +31,7 @@ export async function preprocessOutgoingTransaction( time: new Date(Number(transaction.timestamp)), inclusionState: transaction.inclusionState, wrappedInputs: inputs, + utxoInputs, } } @@ -51,9 +50,13 @@ function convertTransactionOutputTypeToWrappedOutput( outputType: Output ): IWrappedOutput { const outputId = getOutputIdFromTransactionIdAndIndex(transactionId, index) + OutputWithMetadata return { outputId, output: outputType, - remainder: index === 0 || outputType.type !== OutputType.Basic ? false : true, // when sending prepared output in the resulting transactions outputs array it will always be first output(index = 0) + remainder: + index === 0 || (outputType.type !== OutputType.Basic && outputType.type !== OutputType.Account) + ? false + : true, // when sending prepared output in the resulting transactions outputs array it will always be first output(index = 0) } } diff --git a/packages/shared/lib/core/wallet/utils/transactions/getDirectionFromOutgoingTransaction.ts b/packages/shared/lib/core/wallet/utils/transactions/getDirectionFromOutgoingTransaction.ts index 6182044ba1a..094bd920052 100644 --- a/packages/shared/lib/core/wallet/utils/transactions/getDirectionFromOutgoingTransaction.ts +++ b/packages/shared/lib/core/wallet/utils/transactions/getDirectionFromOutgoingTransaction.ts @@ -1,15 +1,14 @@ -import { IWrappedOutput } from '../../interfaces' import { getRecipientAddressFromOutput } from '../outputs/getRecipientAddressFromOutput' import { ActivityDirection } from '@core/wallet/enums' -import { CommonOutput } from '@iota/sdk/out/types' +import { CommonOutput, Output } from '@iota/sdk/out/types' export function getDirectionFromOutgoingTransaction( - wrappedOutputs: IWrappedOutput[], + outputs: Output[], walletDepositAddress: string ): ActivityDirection { // Check if any output is not destined for the wallet - const containsNonWalletRecipient = wrappedOutputs.some((outputData) => { - const outputRecipient = getRecipientAddressFromOutput(outputData.output as CommonOutput) + const containsNonWalletRecipient = outputs.some((output) => { + const outputRecipient = getRecipientAddressFromOutput(output as CommonOutput) return walletDepositAddress !== outputRecipient }) From e499fa4519c6e869ceb44b8522e2ef53a95212f0 Mon Sep 17 00:00:00 2001 From: marc2332 Date: Mon, 25 Mar 2024 13:44:55 +0100 Subject: [PATCH 4/9] fix: Fix incorrect timestamp in Incoming txs --- .../utils/outputs/preprocessIncomingTransaction.ts | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/packages/shared/lib/core/wallet/utils/outputs/preprocessIncomingTransaction.ts b/packages/shared/lib/core/wallet/utils/outputs/preprocessIncomingTransaction.ts index 448b2715aac..36ca70ac4cb 100644 --- a/packages/shared/lib/core/wallet/utils/outputs/preprocessIncomingTransaction.ts +++ b/packages/shared/lib/core/wallet/utils/outputs/preprocessIncomingTransaction.ts @@ -3,10 +3,17 @@ import { Output, OutputType, OutputWithMetadata, TransactionWithMetadata, UTXOIn // import { computeOutputId } from './computeOutputId' import { getOutputIdFromTransactionIdAndIndex } from './getOutputIdFromTransactionIdAndIndex' import { ActivityDirection } from '../../enums' +import { getUnixTimestampFromNodeInfoAndSlotIndex, nodeInfoProtocolParameters } from '@core/network' +import { get } from 'svelte/store' +import { MILLISECONDS_PER_SECOND } from '@core/utils' export function preprocessIncomingTransaction(transaction: TransactionWithMetadata): IProcessedTransaction { const regularTransactionEssence = transaction.payload.transaction const transactionId = transaction?.transactionId?.toString() + const nodeProtocolParameters = get(nodeInfoProtocolParameters) + const slotUnixTimestamp = nodeProtocolParameters + ? getUnixTimestampFromNodeInfoAndSlotIndex(nodeProtocolParameters, regularTransactionEssence.creationSlot) + : 0 const outputs = convertTransactionsOutputTypesToWrappedOutputs(transactionId, regularTransactionEssence.outputs) @@ -22,7 +29,7 @@ export function preprocessIncomingTransaction(transaction: TransactionWithMetada outputs: outputs, transactionId, direction: ActivityDirection.Incoming, - time: new Date(Number(transaction.timestamp)), + time: new Date(slotUnixTimestamp * MILLISECONDS_PER_SECOND), inclusionState: transaction.inclusionState, wrappedInputs: [], // wrappedInputs: inputs, From 40986724c36b4397f9695bacfe5525c9ffe8d066 Mon Sep 17 00:00:00 2001 From: marc2332 Date: Mon, 25 Mar 2024 17:14:33 +0100 Subject: [PATCH 5/9] fix: Receive funds to implicit account address --- .../generateActivity/generateActivities.ts | 10 ++++++++-- .../generateActivitiesFromBasicOutputs.ts | 2 +- .../outputs/preprocessIncomingTransaction.ts | 18 ++++++++---------- ...tNonRemainderBasicOutputsFromTransaction.ts | 6 +++--- 4 files changed, 20 insertions(+), 16 deletions(-) diff --git a/packages/shared/lib/core/wallet/utils/generateActivity/generateActivities.ts b/packages/shared/lib/core/wallet/utils/generateActivity/generateActivities.ts index 7e54cc2ce2c..69f1ac2375e 100644 --- a/packages/shared/lib/core/wallet/utils/generateActivity/generateActivities.ts +++ b/packages/shared/lib/core/wallet/utils/generateActivity/generateActivities.ts @@ -1,5 +1,5 @@ import { IWalletState } from '@core/wallet/interfaces' -import { ActivityAction, ActivityType, IProcessedTransaction } from '@core/wallet' +import { ActivityAction, ActivityType, IProcessedTransaction, getSenderAddressFromInputs } from '@core/wallet' import { Activity } from '@core/wallet/types' import { isParticipationOutput } from '@contexts/governance/utils' import { generateSingleAccountActivity } from './generateSingleAccountActivity' @@ -33,6 +33,8 @@ async function generateActivitiesFromProcessedTransactionsWithInputs( wallet: IWalletState ): Promise { const { outputs, wrappedInputs } = processedTransaction + const sender = getSenderAddressFromInputs(wrappedInputs) + const isSentToImplicitAccountCreationAddress = sender === (await wallet.implicitAccountCreationAddress()) const activities: Activity[] = [] const containsFoundryActivity = outputs.some((output) => output.output.type === OutputType.Foundry) @@ -75,7 +77,11 @@ async function generateActivitiesFromProcessedTransactionsWithInputs( const anchorActivities = await generateActivitiesFromAnchorOutputs(processedTransaction, wallet) activities.push(...anchorActivities) } - if (!containsFoundryActivity && !containsNftActivity && !containsAccountActivity && !governanceOutput) { + + if ( + (!containsFoundryActivity && !containsNftActivity && !containsAccountActivity && !governanceOutput) || + isSentToImplicitAccountCreationAddress + ) { const basicActivities = await generateActivitiesFromBasicOutputs(processedTransaction, wallet) activities.push(...basicActivities) } diff --git a/packages/shared/lib/core/wallet/utils/generateActivity/generateActivitiesFromBasicOutputs.ts b/packages/shared/lib/core/wallet/utils/generateActivity/generateActivitiesFromBasicOutputs.ts index 2554635b9d4..2dcd8d34649 100644 --- a/packages/shared/lib/core/wallet/utils/generateActivity/generateActivitiesFromBasicOutputs.ts +++ b/packages/shared/lib/core/wallet/utils/generateActivity/generateActivitiesFromBasicOutputs.ts @@ -23,7 +23,7 @@ export async function generateActivitiesFromBasicOutputs( const basicOutputs = getNonRemainderBasicOutputsFromTransaction( processedTransaction.outputs, - wallet.depositAddress, + [wallet.depositAddress, await wallet.implicitAccountCreationAddress()], processedTransaction.direction ) const burnedNftInputs = getBurnedNftInputs(processedTransaction) diff --git a/packages/shared/lib/core/wallet/utils/outputs/preprocessIncomingTransaction.ts b/packages/shared/lib/core/wallet/utils/outputs/preprocessIncomingTransaction.ts index 36ca70ac4cb..fc4037b45c1 100644 --- a/packages/shared/lib/core/wallet/utils/outputs/preprocessIncomingTransaction.ts +++ b/packages/shared/lib/core/wallet/utils/outputs/preprocessIncomingTransaction.ts @@ -1,6 +1,5 @@ import { IProcessedTransaction, IWrappedOutput } from '../../interfaces' import { Output, OutputType, OutputWithMetadata, TransactionWithMetadata, UTXOInput } from '@iota/sdk/out/types' -// import { computeOutputId } from './computeOutputId' import { getOutputIdFromTransactionIdAndIndex } from './getOutputIdFromTransactionIdAndIndex' import { ActivityDirection } from '../../enums' import { getUnixTimestampFromNodeInfoAndSlotIndex, nodeInfoProtocolParameters } from '@core/network' @@ -18,21 +17,20 @@ export function preprocessIncomingTransaction(transaction: TransactionWithMetada const outputs = convertTransactionsOutputTypesToWrappedOutputs(transactionId, regularTransactionEssence.outputs) const utxoInputs = regularTransactionEssence.inputs.map((i) => i as UTXOInput) - // const inputIds = utxoInputs.map((input) => { - // const transactionId = input.transactionId - // const transactionOutputIndex = input.transactionOutputIndex - // return computeOutputId(transactionId, transactionOutputIndex) - // }) - // const inputs = await Promise.all(inputIds.map((inputId) => wallet.getOutput(inputId))) + const inputs = transaction.inputs.map((input) => ({ + output: input.output, + outputId: input.metadata.outputId, + metadata: input.metadata, + remainder: true, + })) return { - outputs: outputs, + outputs, transactionId, direction: ActivityDirection.Incoming, time: new Date(slotUnixTimestamp * MILLISECONDS_PER_SECOND), inclusionState: transaction.inclusionState, - wrappedInputs: [], - // wrappedInputs: inputs, + wrappedInputs: inputs, utxoInputs, } } diff --git a/packages/shared/lib/core/wallet/utils/transactions/getNonRemainderBasicOutputsFromTransaction.ts b/packages/shared/lib/core/wallet/utils/transactions/getNonRemainderBasicOutputsFromTransaction.ts index 31ae0147492..e5e78d0dfe3 100644 --- a/packages/shared/lib/core/wallet/utils/transactions/getNonRemainderBasicOutputsFromTransaction.ts +++ b/packages/shared/lib/core/wallet/utils/transactions/getNonRemainderBasicOutputsFromTransaction.ts @@ -5,16 +5,16 @@ import { CommonOutput } from '@iota/sdk/out/types' export function getNonRemainderBasicOutputsFromTransaction( wrappedOutputs: IWrappedOutput[], - walletDepositAddress: string, + validAddresses: string[], direction: ActivityDirection ): IWrappedOutput[] { return wrappedOutputs.filter((outputData) => { const recipientAddress = getRecipientAddressFromOutput(outputData.output as CommonOutput) if (direction === ActivityDirection.Incoming || direction === ActivityDirection.SelfTransaction) { - return !outputData.remainder && walletDepositAddress === recipientAddress + return !outputData.remainder && validAddresses.includes(recipientAddress) } else { - return walletDepositAddress !== recipientAddress + return !validAddresses.includes(recipientAddress) } }) } From a4f5c787dad179f1bdc88dae127a63d96fa2b3d9 Mon Sep 17 00:00:00 2001 From: cpl121 Date: Tue, 26 Mar 2024 11:41:08 +0100 Subject: [PATCH 6/9] feat: add mana to txs in tx activities and activity details Co-authored-by: Marc Espin --- .../GenericActivityInformation.svelte | 9 ++++++-- .../processed-transaction.interface.ts | 1 + .../types/activities/base-activity.type.ts | 1 + .../generateSingleAccountActivity.ts | 3 ++- .../generateSingleAnchorActivity.ts | 3 ++- .../generateSingleBasicActivity.ts | 3 ++- .../generateSingleConsolidationActivity.ts | 3 ++- .../generateSingleFoundryActivity.ts | 3 ++- .../generateSingleGovernanceActivity.ts | 3 ++- .../generateSingleNftActivity.ts | 3 ++- .../generateVestingActivity.ts | 3 ++- .../outputs/preprocessIncomingTransaction.ts | 8 +++++-- .../outputs/preprocessOutgoingTransaction.ts | 22 ++++++++++++++++++- packages/shared/locales/en.json | 3 ++- 14 files changed, 54 insertions(+), 14 deletions(-) diff --git a/packages/shared/components/activity-info/GenericActivityInformation.svelte b/packages/shared/components/activity-info/GenericActivityInformation.svelte index 9676ae27aa6..9713e0ce988 100644 --- a/packages/shared/components/activity-info/GenericActivityInformation.svelte +++ b/packages/shared/components/activity-info/GenericActivityInformation.svelte @@ -2,8 +2,8 @@ import { KeyValueBox } from '@ui' import { getFormattedTimeStamp, localize } from '@core/i18n' import { activeProfile, getBaseToken } from '@core/profile' - import { Activity, formatTokenAmountPrecise } from '@core/wallet' - import { ExplorerEndpoint } from '@core/network' + import { Activity, ActivityDirection, formatTokenAmountBestMatch, formatTokenAmountPrecise } from '@core/wallet' + import { DEFAULT_MANA, ExplorerEndpoint } from '@core/network' import { getOfficialExplorerUrl } from '@core/network/utils' import { openUrlInBrowser } from '@core/app' import { IKeyValueBoxList, truncateString } from '@core/utils' @@ -28,6 +28,8 @@ $: formattedGiftedStorageDeposit = formatTokenAmountPrecise(activity?.giftedStorageDeposit ?? 0, getBaseToken()) $: formattedSurplus = formatTokenAmountPrecise(activity?.surplus ?? 0, getBaseToken()) $: formattedGasFee = formatTokenAmountPrecise(Number(gasFee ?? 0), getBaseToken()) + $: formattedManaPrefix = activity.direction === ActivityDirection.Incoming ? '' : '- ' + $: formattedMana = formattedManaPrefix + formatTokenAmountBestMatch(Number(activity?.mana ?? 0), DEFAULT_MANA) let transactionDetailsList: IKeyValueBoxList $: transactionDetailsList = { @@ -62,6 +64,9 @@ timelockDate: { data: formattedTimelockDate, isTooltipVisible: true }, }), ...(claimedTime && { claimedTime: { data: claimedTime } }), + ...(typeof activity?.mana === 'number' && { + mana: { data: formattedMana }, + }), } function onTransactionIdClick(): void { diff --git a/packages/shared/lib/core/wallet/interfaces/processed-transaction.interface.ts b/packages/shared/lib/core/wallet/interfaces/processed-transaction.interface.ts index 70add6741e7..aad822312de 100644 --- a/packages/shared/lib/core/wallet/interfaces/processed-transaction.interface.ts +++ b/packages/shared/lib/core/wallet/interfaces/processed-transaction.interface.ts @@ -11,6 +11,7 @@ export interface IProcessedTransaction { utxoInputs: UTXOInput[] wrappedInputs: IWrappedOutput[] claimingData?: IClaimData + mana: number } export interface IClaimData { diff --git a/packages/shared/lib/core/wallet/types/activities/base-activity.type.ts b/packages/shared/lib/core/wallet/types/activities/base-activity.type.ts index 99de5e6d85e..ee4adc4f68b 100644 --- a/packages/shared/lib/core/wallet/types/activities/base-activity.type.ts +++ b/packages/shared/lib/core/wallet/types/activities/base-activity.type.ts @@ -23,6 +23,7 @@ export type BaseActivity = { asyncData: AsyncData destinationNetwork?: string parsedLayer2Metadata?: Partial + mana: number } export type AsyncData = { diff --git a/packages/shared/lib/core/wallet/utils/generateActivity/generateSingleAccountActivity.ts b/packages/shared/lib/core/wallet/utils/generateActivity/generateSingleAccountActivity.ts index 14a0ed61d20..ecd5d3168df 100644 --- a/packages/shared/lib/core/wallet/utils/generateActivity/generateSingleAccountActivity.ts +++ b/packages/shared/lib/core/wallet/utils/generateActivity/generateSingleAccountActivity.ts @@ -18,7 +18,7 @@ export async function generateSingleAccountActivity( wallet: IWalletState, { action, processedTransaction, wrappedOutput }: IActivityGenerationParameters ): Promise { - const { transactionId, claimingData, direction, time, inclusionState } = processedTransaction + const { transactionId, claimingData, direction, time, inclusionState, mana } = processedTransaction const output = wrappedOutput.output as AccountOutput const outputId = wrappedOutput.outputId @@ -57,6 +57,7 @@ export async function generateSingleAccountActivity( inclusionState, containsValue, asyncData, + mana, ...sendingInfo, } } diff --git a/packages/shared/lib/core/wallet/utils/generateActivity/generateSingleAnchorActivity.ts b/packages/shared/lib/core/wallet/utils/generateActivity/generateSingleAnchorActivity.ts index 63cf04b62b0..538d4ea6702 100644 --- a/packages/shared/lib/core/wallet/utils/generateActivity/generateSingleAnchorActivity.ts +++ b/packages/shared/lib/core/wallet/utils/generateActivity/generateSingleAnchorActivity.ts @@ -17,7 +17,7 @@ export async function generateSingleAnchorActivity( wallet: IWalletState, { action, processedTransaction, wrappedOutput }: IActivityGenerationParameters ): Promise { - const { transactionId, claimingData, direction, time, inclusionState } = processedTransaction + const { transactionId, claimingData, direction, time, inclusionState, mana } = processedTransaction const output = wrappedOutput.output as AnchorOutput const outputId = wrappedOutput.outputId @@ -56,6 +56,7 @@ export async function generateSingleAnchorActivity( inclusionState, containsValue, asyncData, + mana, ...sendingInfo, } } diff --git a/packages/shared/lib/core/wallet/utils/generateActivity/generateSingleBasicActivity.ts b/packages/shared/lib/core/wallet/utils/generateActivity/generateSingleBasicActivity.ts index 40eeee55d6b..10ac98d2ebd 100644 --- a/packages/shared/lib/core/wallet/utils/generateActivity/generateSingleBasicActivity.ts +++ b/packages/shared/lib/core/wallet/utils/generateActivity/generateSingleBasicActivity.ts @@ -23,7 +23,7 @@ export async function generateSingleBasicActivity( fallbackAssetId?: string, fallbackAmount?: number ): Promise { - const { transactionId, direction, claimingData, time, inclusionState } = processedTransaction + const { transactionId, direction, claimingData, time, inclusionState, mana } = processedTransaction const isHidden = false const isAssetHidden = false @@ -102,6 +102,7 @@ export async function generateSingleBasicActivity( asyncData, destinationNetwork, parsedLayer2Metadata, + mana, ...sendingInfo, } } diff --git a/packages/shared/lib/core/wallet/utils/generateActivity/generateSingleConsolidationActivity.ts b/packages/shared/lib/core/wallet/utils/generateActivity/generateSingleConsolidationActivity.ts index f7277940f3b..fe040b760f0 100644 --- a/packages/shared/lib/core/wallet/utils/generateActivity/generateSingleConsolidationActivity.ts +++ b/packages/shared/lib/core/wallet/utils/generateActivity/generateSingleConsolidationActivity.ts @@ -16,7 +16,7 @@ export async function generateSingleConsolidationActivity( wallet: IWalletState, { action, processedTransaction, wrappedOutput }: IActivityGenerationParameters ): Promise { - const { transactionId, direction, claimingData, time, inclusionState, wrappedInputs } = processedTransaction + const { transactionId, direction, claimingData, time, inclusionState, wrappedInputs, mana } = processedTransaction const isHidden = false const isAssetHidden = false @@ -54,6 +54,7 @@ export async function generateSingleConsolidationActivity( tag, asyncData, amountConsolidatedInputs, + mana, ...sendingInfo, } } diff --git a/packages/shared/lib/core/wallet/utils/generateActivity/generateSingleFoundryActivity.ts b/packages/shared/lib/core/wallet/utils/generateActivity/generateSingleFoundryActivity.ts index e90b2e74454..6d643efd84b 100644 --- a/packages/shared/lib/core/wallet/utils/generateActivity/generateSingleFoundryActivity.ts +++ b/packages/shared/lib/core/wallet/utils/generateActivity/generateSingleFoundryActivity.ts @@ -23,7 +23,7 @@ export async function generateSingleFoundryActivity( wallet: IWalletState, { action, processedTransaction, wrappedOutput }: IActivityGenerationParameters ): Promise { - const { transactionId, claimingData, time, direction, inclusionState } = processedTransaction + const { transactionId, claimingData, time, direction, inclusionState, mana } = processedTransaction const output = wrappedOutput.output as FoundryOutput const outputId = wrappedOutput.outputId @@ -78,6 +78,7 @@ export async function generateSingleFoundryActivity( metadata, tag, asyncData, + mana, ...sendingInfo, } } diff --git a/packages/shared/lib/core/wallet/utils/generateActivity/generateSingleGovernanceActivity.ts b/packages/shared/lib/core/wallet/utils/generateActivity/generateSingleGovernanceActivity.ts index d9ceb743c48..a7dd900c068 100644 --- a/packages/shared/lib/core/wallet/utils/generateActivity/generateSingleGovernanceActivity.ts +++ b/packages/shared/lib/core/wallet/utils/generateActivity/generateSingleGovernanceActivity.ts @@ -17,7 +17,7 @@ export async function generateSingleGovernanceActivity( wallet: IWalletState, { action, processedTransaction, wrappedOutput }: IActivityGenerationParameters ): Promise { - const { transactionId, direction, time, inclusionState, wrappedInputs } = processedTransaction + const { transactionId, direction, time, inclusionState, wrappedInputs, mana } = processedTransaction const isHidden = false const isAssetHidden = false @@ -55,6 +55,7 @@ export async function generateSingleGovernanceActivity( metadata, tag, asyncData: null, + mana, ...governanceInfo, ...sendingInfo, } diff --git a/packages/shared/lib/core/wallet/utils/generateActivity/generateSingleNftActivity.ts b/packages/shared/lib/core/wallet/utils/generateActivity/generateSingleNftActivity.ts index fee8c755beb..eab435c6618 100644 --- a/packages/shared/lib/core/wallet/utils/generateActivity/generateSingleNftActivity.ts +++ b/packages/shared/lib/core/wallet/utils/generateActivity/generateSingleNftActivity.ts @@ -19,7 +19,7 @@ export async function generateSingleNftActivity( { action, processedTransaction, wrappedOutput }: IActivityGenerationParameters, nftIdFromInput?: string ): Promise { - const { claimingData, time, inclusionState, transactionId, direction } = processedTransaction + const { claimingData, time, inclusionState, transactionId, direction, mana } = processedTransaction const outputId = wrappedOutput.outputId const output = wrappedOutput.output as NftOutput const id = outputId || transactionId @@ -81,5 +81,6 @@ export async function generateSingleNftActivity( direction, destinationNetwork, parsedLayer2Metadata, + mana, } } diff --git a/packages/shared/lib/core/wallet/utils/generateActivity/generateVestingActivity.ts b/packages/shared/lib/core/wallet/utils/generateActivity/generateVestingActivity.ts index 7b2b27a492c..7731b4e5d4b 100644 --- a/packages/shared/lib/core/wallet/utils/generateActivity/generateVestingActivity.ts +++ b/packages/shared/lib/core/wallet/utils/generateActivity/generateVestingActivity.ts @@ -19,7 +19,7 @@ export async function generateVestingActivity( wallet: IWalletState, { action, processedTransaction, wrappedOutput }: IActivityGenerationParameters ): Promise { - const { transactionId, direction, claimingData, time, inclusionState } = processedTransaction + const { transactionId, direction, claimingData, time, inclusionState, mana } = processedTransaction const isHidden = false const isAssetHidden = false @@ -63,6 +63,7 @@ export async function generateVestingActivity( tag, asyncData, destinationNetwork, + mana, ...sendingInfo, ...parsedLayer2Metadata, } diff --git a/packages/shared/lib/core/wallet/utils/outputs/preprocessIncomingTransaction.ts b/packages/shared/lib/core/wallet/utils/outputs/preprocessIncomingTransaction.ts index fc4037b45c1..df339a85cea 100644 --- a/packages/shared/lib/core/wallet/utils/outputs/preprocessIncomingTransaction.ts +++ b/packages/shared/lib/core/wallet/utils/outputs/preprocessIncomingTransaction.ts @@ -1,5 +1,5 @@ import { IProcessedTransaction, IWrappedOutput } from '../../interfaces' -import { Output, OutputType, OutputWithMetadata, TransactionWithMetadata, UTXOInput } from '@iota/sdk/out/types' +import { Output, OutputType, TransactionWithMetadata, UTXOInput } from '@iota/sdk/out/types' import { getOutputIdFromTransactionIdAndIndex } from './getOutputIdFromTransactionIdAndIndex' import { ActivityDirection } from '../../enums' import { getUnixTimestampFromNodeInfoAndSlotIndex, nodeInfoProtocolParameters } from '@core/network' @@ -24,6 +24,10 @@ export function preprocessIncomingTransaction(transaction: TransactionWithMetada remainder: true, })) + const manaCost = outputs + .filter((output) => !output.remainder) + .reduce((acc, output) => acc + Number(output.output.mana), 0) + return { outputs, transactionId, @@ -31,6 +35,7 @@ export function preprocessIncomingTransaction(transaction: TransactionWithMetada time: new Date(slotUnixTimestamp * MILLISECONDS_PER_SECOND), inclusionState: transaction.inclusionState, wrappedInputs: inputs, + mana: manaCost, utxoInputs, } } @@ -50,7 +55,6 @@ function convertTransactionOutputTypeToWrappedOutput( outputType: Output ): IWrappedOutput { const outputId = getOutputIdFromTransactionIdAndIndex(transactionId, index) - OutputWithMetadata return { outputId, output: outputType, diff --git a/packages/shared/lib/core/wallet/utils/outputs/preprocessOutgoingTransaction.ts b/packages/shared/lib/core/wallet/utils/outputs/preprocessOutgoingTransaction.ts index 86b555726a9..1bb2fe0aebb 100644 --- a/packages/shared/lib/core/wallet/utils/outputs/preprocessOutgoingTransaction.ts +++ b/packages/shared/lib/core/wallet/utils/outputs/preprocessOutgoingTransaction.ts @@ -1,9 +1,17 @@ import { IProcessedTransaction, IWrappedOutput } from '../../interfaces' -import { Output, OutputType, OutputWithMetadata, TransactionWithMetadata, UTXOInput } from '@iota/sdk/out/types' +import { + AccountOutput, + Output, + OutputType, + OutputWithMetadata, + TransactionWithMetadata, + UTXOInput, +} from '@iota/sdk/out/types' import { computeOutputId } from './computeOutputId' import { getOutputIdFromTransactionIdAndIndex } from './getOutputIdFromTransactionIdAndIndex' import { getDirectionFromOutgoingTransaction } from '../transactions' import { IWalletState } from '@core/wallet/interfaces' +import { getPassiveManaForOutput } from 'shared/lib/core/network' export async function preprocessOutgoingTransaction( transaction: TransactionWithMetadata, @@ -24,12 +32,24 @@ export async function preprocessOutgoingTransaction( const inputs = await Promise.all(inputIds.map((inputId) => wallet.getOutput(inputId))) + let manaCost = 0 + const prevAccountOutput = inputs.find((input) => (input.output as AccountOutput).accountId) + if (prevAccountOutput) { + const prevMana = getPassiveManaForOutput(prevAccountOutput) ?? 0 + const postAccountOutput = outputs.find( + (output) => + (prevAccountOutput.output as AccountOutput).accountId === (output.output as AccountOutput).accountId + ) + manaCost = prevMana - Number(postAccountOutput?.output?.mana ?? 0) + } + return { outputs: outputs, transactionId, direction, time: new Date(Number(transaction.timestamp)), inclusionState: transaction.inclusionState, + mana: manaCost, wrappedInputs: inputs, } } diff --git a/packages/shared/locales/en.json b/packages/shared/locales/en.json index 10f0807a96f..29a0030e60c 100644 --- a/packages/shared/locales/en.json +++ b/packages/shared/locales/en.json @@ -1720,7 +1720,8 @@ "manaCost": "Estimated Mana cost", "availableMana": "Available mana", "insufficientMana": "Insufficient {availableMana}.", - "secondsToRefreshManaCost": "{seconds} seconds to refresh the mana cost" + "secondsToRefreshManaCost": "{seconds} seconds to refresh the mana cost", + "mana": "Mana" }, "filters":{ "title": "Filters", From a0f9cb26076ea3f8dda7b6450152adeb4a4c5473 Mon Sep 17 00:00:00 2001 From: marc2332 Date: Tue, 26 Mar 2024 13:17:45 +0100 Subject: [PATCH 7/9] fix: Use sdk types for inclusion state --- .../handleTransactionInclusionEventForShimmerClaiming.ts | 4 ++-- .../activities/updateClaimingTransactionInclusion.ts | 3 ++- .../events-handlers/handleTransactionInclusionEvent.ts | 9 +++++++-- .../shared/lib/core/wallet/enums/inclusion-state.enum.ts | 6 ------ packages/shared/lib/core/wallet/enums/index.ts | 1 - .../wallet/interfaces/processed-transaction.interface.ts | 4 ++-- .../core/wallet/types/activities/base-activity.type.ts | 3 ++- .../shared/lib/core/wallet/utils/getActivityTileTitle.ts | 3 ++- .../shared/lib/core/wallet/utils/isVisibleActivity.ts | 3 ++- .../wallet/utils/outputs/preprocessGroupedOutputs.ts | 4 ++-- packages/shared/lib/core/wallet/utils/send/sendUtils.ts | 3 ++- 11 files changed, 23 insertions(+), 20 deletions(-) delete mode 100644 packages/shared/lib/core/wallet/enums/inclusion-state.enum.ts diff --git a/packages/shared/lib/contexts/onboarding/actions/handleTransactionInclusionEventForShimmerClaiming.ts b/packages/shared/lib/contexts/onboarding/actions/handleTransactionInclusionEventForShimmerClaiming.ts index cc94cf1cbb2..7987864389c 100644 --- a/packages/shared/lib/contexts/onboarding/actions/handleTransactionInclusionEventForShimmerClaiming.ts +++ b/packages/shared/lib/contexts/onboarding/actions/handleTransactionInclusionEventForShimmerClaiming.ts @@ -1,9 +1,9 @@ import { get } from 'svelte/store' -import { Event, TransactionInclusionWalletEvent, WalletEventType } from '@iota/sdk/out/types' +import { Event, InclusionState, TransactionInclusionWalletEvent, WalletEventType } from '@iota/sdk/out/types' import { localize } from '@core/i18n' -import { InclusionState, MissingTransactionIdError, validateWalletApiEvent } from '@core/wallet' +import { MissingTransactionIdError, validateWalletApiEvent } from '@core/wallet' import { showAppNotification } from '@auxiliary/notification' import { ShimmerClaimingWalletState } from '../enums' diff --git a/packages/shared/lib/core/wallet/actions/activities/updateClaimingTransactionInclusion.ts b/packages/shared/lib/core/wallet/actions/activities/updateClaimingTransactionInclusion.ts index 2b748e6d733..77b367a5832 100644 --- a/packages/shared/lib/core/wallet/actions/activities/updateClaimingTransactionInclusion.ts +++ b/packages/shared/lib/core/wallet/actions/activities/updateClaimingTransactionInclusion.ts @@ -1,8 +1,9 @@ -import { ActivityAsyncStatus, ActivityType, InclusionState } from '@core/wallet/enums' +import { ActivityAsyncStatus, ActivityType } from '@core/wallet/enums' import { addClaimedActivity, allWalletActivities } from '@core/wallet/stores' import { showAppNotification } from '@auxiliary/notification' import { localize } from '@core/i18n' import { updateActivityFromPartialActivity } from '@core/wallet/utils/generateActivity/helper' +import { InclusionState } from '@iota/sdk/out/types' export function updateClaimingTransactionInclusion( transactionId: string, diff --git a/packages/shared/lib/core/wallet/actions/events-handlers/handleTransactionInclusionEvent.ts b/packages/shared/lib/core/wallet/actions/events-handlers/handleTransactionInclusionEvent.ts index 5378ea07cec..bb10cbd74f0 100644 --- a/packages/shared/lib/core/wallet/actions/events-handlers/handleTransactionInclusionEvent.ts +++ b/packages/shared/lib/core/wallet/actions/events-handlers/handleTransactionInclusionEvent.ts @@ -1,5 +1,11 @@ import { closePopup, openPopup, PopupId } from '@auxiliary/popup' -import { AccountOutput, TransactionInclusionWalletEvent, WalletEvent, WalletEventType } from '@iota/sdk/out/types' +import { + AccountOutput, + InclusionState, + TransactionInclusionWalletEvent, + WalletEvent, + WalletEventType, +} from '@iota/sdk/out/types' import { updateParticipationOverview } from '@contexts/governance/stores' import { isWalletVoting } from '@contexts/governance/utils/isWalletVoting' import { updateNftInAllWalletNfts } from '@core/nfts' @@ -14,7 +20,6 @@ import { ActivityDirection, ActivityType, GovernanceActivity, - InclusionState, WalletApiEventHandler, } from '@core/wallet' import { getWalletById, updateActiveWallet } from '@core/profile' diff --git a/packages/shared/lib/core/wallet/enums/inclusion-state.enum.ts b/packages/shared/lib/core/wallet/enums/inclusion-state.enum.ts deleted file mode 100644 index c4f6e494f34..00000000000 --- a/packages/shared/lib/core/wallet/enums/inclusion-state.enum.ts +++ /dev/null @@ -1,6 +0,0 @@ -export enum InclusionState { - Pending = 'Pending', - Confirmed = 'Confirmed', - Conflicting = 'Conflicting', - UnknownPruned = 'UnknownPruned', -} diff --git a/packages/shared/lib/core/wallet/enums/index.ts b/packages/shared/lib/core/wallet/enums/index.ts index d19f36744b3..4a72b8d964a 100644 --- a/packages/shared/lib/core/wallet/enums/index.ts +++ b/packages/shared/lib/core/wallet/enums/index.ts @@ -8,7 +8,6 @@ export * from './not-verified-status.enum' export * from './token-standard.enum' export * from './verified-status.enum' export * from './return-strategy.enum' -export * from './inclusion-state.enum' export * from './irc27-version.enum' export * from './subject.enum' export * from './wallet-colors.enum' diff --git a/packages/shared/lib/core/wallet/interfaces/processed-transaction.interface.ts b/packages/shared/lib/core/wallet/interfaces/processed-transaction.interface.ts index aad822312de..73b027a734e 100644 --- a/packages/shared/lib/core/wallet/interfaces/processed-transaction.interface.ts +++ b/packages/shared/lib/core/wallet/interfaces/processed-transaction.interface.ts @@ -1,6 +1,6 @@ -import { ActivityDirection, InclusionState } from '@core/wallet/enums' +import { ActivityDirection } from '@core/wallet/enums' import { IWrappedOutput } from './wrapped-output.interface' -import { UTXOInput } from '@iota/sdk/out/types' +import { InclusionState, UTXOInput } from '@iota/sdk/out/types' export interface IProcessedTransaction { outputs: IWrappedOutput[] diff --git a/packages/shared/lib/core/wallet/types/activities/base-activity.type.ts b/packages/shared/lib/core/wallet/types/activities/base-activity.type.ts index ee4adc4f68b..a9a23206c45 100644 --- a/packages/shared/lib/core/wallet/types/activities/base-activity.type.ts +++ b/packages/shared/lib/core/wallet/types/activities/base-activity.type.ts @@ -1,4 +1,5 @@ -import { ActivityAsyncStatus, ActivityDirection, InclusionState, ActivityAction } from '../../enums' +import { InclusionState } from '@iota/sdk/out/types' +import { ActivityAsyncStatus, ActivityDirection, ActivityAction } from '../../enums' import { Subject } from '../subject.type' import { Layer2Metadata } from '@core/layer-2' diff --git a/packages/shared/lib/core/wallet/utils/getActivityTileTitle.ts b/packages/shared/lib/core/wallet/utils/getActivityTileTitle.ts index e1ce4e31372..46428c9ecd1 100644 --- a/packages/shared/lib/core/wallet/utils/getActivityTileTitle.ts +++ b/packages/shared/lib/core/wallet/utils/getActivityTileTitle.ts @@ -1,4 +1,5 @@ -import { ActivityAction, ActivityDirection, ActivityType, GovernanceAction, InclusionState } from '../enums' +import { InclusionState } from '@iota/sdk/out/types' +import { ActivityAction, ActivityDirection, ActivityType, GovernanceAction } from '../enums' import { Activity } from '../types' export function getActivityTileTitle(activity: Activity): string { diff --git a/packages/shared/lib/core/wallet/utils/isVisibleActivity.ts b/packages/shared/lib/core/wallet/utils/isVisibleActivity.ts index 5081f99e778..6151c15b2d7 100644 --- a/packages/shared/lib/core/wallet/utils/isVisibleActivity.ts +++ b/packages/shared/lib/core/wallet/utils/isVisibleActivity.ts @@ -2,7 +2,7 @@ import { get } from 'svelte/store' import { Activity } from '../types' import { activityFilter } from '../stores' import { getAssetFromPersistedAssets } from './getAssetFromPersistedAssets' -import { ActivityAsyncStatus, InclusionState, ActivityType } from '../enums' +import { ActivityAsyncStatus, ActivityType } from '../enums' import { dateIsAfterOtherDate, dateIsBeforeOtherDate, datesOnSameDay } from '@core/utils' import { ActivityFilter } from '../interfaces' import { convertToRawAmount } from '.' @@ -15,6 +15,7 @@ import { NumberFilterOption, StatusFilterOption, } from '@core/utils/enums/filters' +import { InclusionState } from '@iota/sdk/out/types' // Filters activities based on activity properties. If none of the conditionals are valid, then activity is shown. export function isVisibleActivity(activity: Activity): boolean { diff --git a/packages/shared/lib/core/wallet/utils/outputs/preprocessGroupedOutputs.ts b/packages/shared/lib/core/wallet/utils/outputs/preprocessGroupedOutputs.ts index c25b510fbf3..601772883db 100644 --- a/packages/shared/lib/core/wallet/utils/outputs/preprocessGroupedOutputs.ts +++ b/packages/shared/lib/core/wallet/utils/outputs/preprocessGroupedOutputs.ts @@ -1,6 +1,6 @@ -import { CommonOutput, OutputData, OutputWithMetadata, UTXOInput } from '@iota/sdk/out/types' +import { CommonOutput, InclusionState, OutputData, OutputWithMetadata, UTXOInput } from '@iota/sdk/out/types' import { IWalletState } from '@core/wallet/interfaces' -import { InclusionState, ActivityDirection } from '../../enums' +import { ActivityDirection } from '../../enums' import { IProcessedTransaction, IWrappedOutput } from '../../interfaces' import { getRecipientAddressFromOutput } from './getRecipientAddressFromOutput' import { getSenderAddressFromInputs } from '../transactions' diff --git a/packages/shared/lib/core/wallet/utils/send/sendUtils.ts b/packages/shared/lib/core/wallet/utils/send/sendUtils.ts index 8f0070bcbbc..a6dd6effdc2 100644 --- a/packages/shared/lib/core/wallet/utils/send/sendUtils.ts +++ b/packages/shared/lib/core/wallet/utils/send/sendUtils.ts @@ -1,6 +1,6 @@ import { NewTransactionDetails, NftActivity, Subject, TransactionActivity, VestingActivity } from '@core/wallet/types' import { NewTransactionType } from '@core/wallet/stores' -import { ActivityAction, ActivityDirection, ActivityType, InclusionState } from '@core/wallet/enums' +import { ActivityAction, ActivityDirection, ActivityType } from '@core/wallet/enums' import { TimePeriod } from '@core/utils' import { getAddressFromSubject } from '../getAddressFromSubject' import { @@ -11,6 +11,7 @@ import { TRANSFER_ALLOWANCE, getDestinationNetworkFromAddress, } from '@core/layer-2' +import { InclusionState } from '@iota/sdk/out/types' export enum SendFormTab { SendToken = 'general.sendToken', From a9e69c187d4c4e760eba9988703e9c58706ef449 Mon Sep 17 00:00:00 2001 From: marc2332 Date: Tue, 26 Mar 2024 13:23:21 +0100 Subject: [PATCH 8/9] fix --- .../shared/components/pills/ActivityInclusionStatusPill.svelte | 2 +- packages/shared/components/tiles/ActivityTile.svelte | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/shared/components/pills/ActivityInclusionStatusPill.svelte b/packages/shared/components/pills/ActivityInclusionStatusPill.svelte index c300964eb52..9e658ee7179 100644 --- a/packages/shared/components/pills/ActivityInclusionStatusPill.svelte +++ b/packages/shared/components/pills/ActivityInclusionStatusPill.svelte @@ -1,7 +1,7 @@