From 3eaecdb84a7e3afc0cf2b03827049b526bb07fdb Mon Sep 17 00:00:00 2001 From: Jean Ribeiro Date: Wed, 8 Mar 2023 19:08:27 -0300 Subject: [PATCH] fix: not visible surplus (#5968) * feat: adds surplus to base activity type * feat: adds surplus to GenericActivityInformation * fix: adds visible surplus * fix: adds surplus not supported in base asset error * fix: hide gift toggle if it is disabled and not active * fix: adds gifted storage deposit calculation if sending base token * fix --------- Co-authored-by: Nicole O'Brien Co-authored-by: Matthew Maxwell <44885822+maxwellmattryan@users.noreply.github.com> --- .../popups/send/SendConfirmationPopup.svelte | 16 +++++++++++++--- .../GenericActivityInformation.svelte | 4 ++++ .../lib/auxiliary/deep-link/errors/index.ts | 1 + .../errors/surplus-not-supported.error.ts | 14 ++++++++++++++ .../handleDeepLinkSendConfirmationOperation.ts | 5 ++++- .../types/activities/base-activity.type.ts | 1 + .../helper/getStorageDepositFromOutput.ts | 7 ++++++- packages/shared/locales/en.json | 1 + 8 files changed, 44 insertions(+), 5 deletions(-) create mode 100644 packages/shared/lib/auxiliary/deep-link/errors/surplus-not-supported.error.ts diff --git a/packages/desktop/components/popups/send/SendConfirmationPopup.svelte b/packages/desktop/components/popups/send/SendConfirmationPopup.svelte index 3da13824c6..71ea092d23 100644 --- a/packages/desktop/components/popups/send/SendConfirmationPopup.svelte +++ b/packages/desktop/components/popups/send/SendConfirmationPopup.svelte @@ -63,6 +63,7 @@ } = get(newTransactionDetails) let storageDeposit = 0 + let visibleSurplus = 0 let preparedOutput: Output let outputOptions: OutputOptions let expirationTimePicker: ExpirationTimePicker @@ -75,8 +76,9 @@ $: isInternal = recipient.type === 'account' $: expirationTimePicker?.setNull(giftStorageDeposit) $: hideGiftToggle = - transactionDetails.type === NewTransactionType.TokenTransfer && - transactionDetails.assetId === $selectedAccountAssets?.baseCoin?.id + (transactionDetails.type === NewTransactionType.TokenTransfer && + transactionDetails.assetId === $selectedAccountAssets?.baseCoin?.id) || + (disableToggleGift && !giftStorageDeposit) $: expirationDate, giftStorageDeposit, refreshSendConfirmationState() $: isTransferring = $selectedAccount.isTransferring @@ -86,6 +88,7 @@ subject: recipient, isInternal, giftedStorageDeposit: 0, + surplus: visibleSurplus, type: ActivityType.Basic, direction: ActivityDirection.Outgoing, inclusionState: InclusionState.Pending, @@ -145,8 +148,15 @@ } function setStorageDeposit(preparedOutput: Output, surplus?: number): void { + const rawAmount = + transactionDetails.type === NewTransactionType.TokenTransfer ? transactionDetails.rawAmount : '0' + const { storageDeposit: _storageDeposit, giftedStorageDeposit: _giftedStorageDeposit } = - getStorageDepositFromOutput(preparedOutput) + getStorageDepositFromOutput(preparedOutput, rawAmount) + + if (surplus > _storageDeposit) { + visibleSurplus = Number(surplus) + } if (giftStorageDeposit) { // Only giftedStorageDeposit needs adjusting, since that is derived diff --git a/packages/shared/components/molecules/activity-info/GenericActivityInformation.svelte b/packages/shared/components/molecules/activity-info/GenericActivityInformation.svelte index d32996781b..675134eaa5 100644 --- a/packages/shared/components/molecules/activity-info/GenericActivityInformation.svelte +++ b/packages/shared/components/molecules/activity-info/GenericActivityInformation.svelte @@ -24,6 +24,7 @@ $: baseToken = BASE_TOKEN[$activeProfile?.networkProtocol] $: formattedStorageDeposit = formatTokenAmountPrecise(activity.storageDeposit ?? 0, baseToken) $: formattedGiftedStorageDeposit = formatTokenAmountPrecise(activity.giftedStorageDeposit ?? 0, baseToken) + $: formattedSurplus = formatTokenAmountPrecise(activity.surplus ?? 0, baseToken) $: formattedGasBudget = formatTokenAmountPrecise(Number(gasBudget ?? 0), baseToken) let transactionDetailsList: IKeyValueBoxList @@ -43,6 +44,9 @@ ...(hasStorageDeposit && { storageDeposit: { data: formattedStorageDeposit, isTooltipVisible: true }, }), + ...(activity?.surplus && { + surplus: { data: formattedSurplus }, + }), ...(activity?.giftedStorageDeposit && { giftedStorageDeposit: { data: formattedGiftedStorageDeposit, isTooltipVisible: true }, }), diff --git a/packages/shared/lib/auxiliary/deep-link/errors/index.ts b/packages/shared/lib/auxiliary/deep-link/errors/index.ts index f0ba065a1f..066181b1df 100644 --- a/packages/shared/lib/auxiliary/deep-link/errors/index.ts +++ b/packages/shared/lib/auxiliary/deep-link/errors/index.ts @@ -5,4 +5,5 @@ export * from './metadata-length.error' export * from './no-address-specified.error' export * from './tag-length.error' export * from './surplus-not-a-number.error' +export * from './surplus-not-supported.error' export * from './unknown-asset.error' diff --git a/packages/shared/lib/auxiliary/deep-link/errors/surplus-not-supported.error.ts b/packages/shared/lib/auxiliary/deep-link/errors/surplus-not-supported.error.ts new file mode 100644 index 0000000000..2fdb81510c --- /dev/null +++ b/packages/shared/lib/auxiliary/deep-link/errors/surplus-not-supported.error.ts @@ -0,0 +1,14 @@ +import { BaseError } from '@core/error' +import { localize } from '@core/i18n' + +export class SurplusNotSupportedError extends BaseError { + constructor() { + const message = localize('notifications.deepLinkingRequest.surplusNotSupported') + super({ + message, + showNotification: true, + saveToErrorLog: true, + logToConsole: true, + }) + } +} diff --git a/packages/shared/lib/auxiliary/deep-link/handlers/wallet/operations/handleDeepLinkSendConfirmationOperation.ts b/packages/shared/lib/auxiliary/deep-link/handlers/wallet/operations/handleDeepLinkSendConfirmationOperation.ts index 41696a18c0..c38d5029dd 100644 --- a/packages/shared/lib/auxiliary/deep-link/handlers/wallet/operations/handleDeepLinkSendConfirmationOperation.ts +++ b/packages/shared/lib/auxiliary/deep-link/handlers/wallet/operations/handleDeepLinkSendConfirmationOperation.ts @@ -14,10 +14,11 @@ import { openPopup, PopupId } from '@auxiliary/popup' import { SendOperationParameter } from '../../../enums' import { - SurplusNotANumberError, InvalidAddressError, MetadataLengthError, NoAddressSpecifiedError, + SurplusNotANumberError, + SurplusNotSupportedError, TagLengthError, UnknownAssetError, } from '../../../errors' @@ -72,6 +73,8 @@ function parseSendConfirmationOperation(searchParams: URLSearchParams): NewTrans const surplus = searchParams.get(SendOperationParameter.Surplus) if (surplus && parseInt(surplus).toString() !== surplus) { throw new SurplusNotANumberError(surplus) + } else if (surplus && asset.id === baseAsset.id) { + throw new SurplusNotSupportedError() } const metadata = searchParams.get(SendOperationParameter.Metadata) 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 2f91e36724..16e53c916f 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 @@ -16,6 +16,7 @@ export type BaseActivity = { isInternal: boolean storageDeposit: number giftedStorageDeposit: number + surplus?: number subject: Subject metadata?: string tag?: string diff --git a/packages/shared/lib/core/wallet/utils/generateActivity/helper/getStorageDepositFromOutput.ts b/packages/shared/lib/core/wallet/utils/generateActivity/helper/getStorageDepositFromOutput.ts index fde043fcc0..0b433bb671 100644 --- a/packages/shared/lib/core/wallet/utils/generateActivity/helper/getStorageDepositFromOutput.ts +++ b/packages/shared/lib/core/wallet/utils/generateActivity/helper/getStorageDepositFromOutput.ts @@ -2,7 +2,10 @@ import { Output } from '@core/wallet/types' import { IStorageDepositReturnUnlockCondition } from '@iota/types' import { OUTPUT_TYPE_NFT, UNLOCK_CONDITION_STORAGE_DEPOSIT_RETURN } from '../../../constants' -export function getStorageDepositFromOutput(output: Output): { +export function getStorageDepositFromOutput( + output: Output, + rawAmount?: string +): { storageDeposit: number giftedStorageDeposit: number } { @@ -15,6 +18,8 @@ export function getStorageDepositFromOutput(output: Output): { return { storageDeposit: Number(storageDepositReturnUnlockCondition.amount), giftedStorageDeposit: 0 } } else if (output.type === OUTPUT_TYPE_NFT || (output?.nativeTokens?.length > 0 && Number(output?.amount) > 0)) { return { storageDeposit: 0, giftedStorageDeposit: Number(output?.amount) } + } else if (rawAmount && Number(rawAmount) > 0 && Number(output?.amount) > Number(rawAmount)) { + return { storageDeposit: 0, giftedStorageDeposit: Number(output?.amount) - Number(rawAmount) } } else { return { storageDeposit: 0, giftedStorageDeposit: 0 } } diff --git a/packages/shared/locales/en.json b/packages/shared/locales/en.json index 80b12c2443..df366eccb7 100644 --- a/packages/shared/locales/en.json +++ b/packages/shared/locales/en.json @@ -1717,6 +1717,7 @@ "invalidFormat": "The deep link you followed is invalid", "invalidAmount": "The amount in deep link is not an integer number {amount}", "invalidSurplus": "The surplus in deep link is not a number {surplus}", + "surplusNotSupported": "The surplus is only supported for native tokens", "governance": { "unrecognizedOperation": "Unrecognized Governance operation: {operation}" },