From 2b6a1f823997504df8f92b665500019d9a32895a Mon Sep 17 00:00:00 2001 From: Timur Sultanov Date: Mon, 1 Sep 2025 18:59:55 +0300 Subject: [PATCH 1/7] fix: reject BTC dust transactions in chat when node validation fails --- src/store/modules/btc-base/btc-base-actions.js | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/src/store/modules/btc-base/btc-base-actions.js b/src/store/modules/btc-base/btc-base-actions.js index d3698584b..bde2f7645 100644 --- a/src/store/modules/btc-base/btc-base-actions.js +++ b/src/store/modules/btc-base/btc-base-actions.js @@ -233,6 +233,18 @@ function createActions(options) { } catch (error) { context.commit('transactions', [{ hash: signedTransaction.txid, status: 'REJECTED' }]) PendingTxStore.remove(context.state.crypto) + + if (admAddress) { + context.commit( + 'chat/updateMessage', + { + partnerId: admAddress, + id: signedTransaction.txid, + status: 'REJECTED' + }, + { root: true } + ) + } throw error } }, From 8fa4885d8779b16916e23cf64f5c3067743159e7 Mon Sep 17 00:00:00 2001 From: Timur Sultanov Date: Tue, 2 Sep 2025 18:15:04 +0300 Subject: [PATCH 2/7] chore: add changes in release notes --- release-notes.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/release-notes.md b/release-notes.md index 0a47ca93d..9297f8343 100644 --- a/release-notes.md +++ b/release-notes.md @@ -5,11 +5,13 @@ All notable changes in this release are listed below. ## [Unreleased] ### New Features + - Test screen for developers is now available [#815](https://github.com/Adamant-im/adamant-im/pull/815) — [@Linhead](https://github.com/Linhead) - Universal macOS build added [#840](https://github.com/Adamant-im/adamant-im/pull/840) — [@S-FrontendDev](https://github.com/S-FrontendDev) - Release notes file added [#853](https://github.com/Adamant-im/adamant-im/pull/853) — [@S-FrontendDev](https://github.com/S-FrontendDev) ### Improvements + - APK name changed in GitHub workflow [#839](https://github.com/Adamant-im/adamant-im/pull/839) — [@S-FrontendDev](https://github.com/S-FrontendDev) - Wallets UI updated for better usability [#846](https://github.com/Adamant-im/adamant-im/pull/846) — [@Linhead](https://github.com/Linhead), [@adamant-al](https://github.com/adamant-al) - ESLint updated to improve code quality [#849](https://github.com/Adamant-im/adamant-im/pull/849) — [@graycraft](https://github.com/graycraft) @@ -17,7 +19,9 @@ All notable changes in this release are listed below. - GitHub Actions workflow and Husky postinstall git hook for ESLint [#858](https://github.com/Adamant-im/adamant-im/pull/858) — [@graycraft](https://github.com/graycraft) ### Bug Fixes + - Transaction fee calculation for ETH & ERC20 fixed [#805](https://github.com/Adamant-im/adamant-im/pull/805) — [@Linhead](https://github.com/Linhead) - Layout issue on "Export keys" page fixed [#841](https://github.com/Adamant-im/adamant-im/pull/841) — [@kalpovskii](https://github.com/kalpovskii), [@adamant-al](https://github.com/adamant-al) - Add disabled input field in the Welcome to ADAMANT chat, impoved paddings [#842](https://github.com/Adamant-im/adamant-im/pull/842) — [@kalpovskii](https://github.com/kalpovskii) - Resolve source code issues with ESLint 9 [#852](https://github.com/Adamant-im/adamant-im/pull/852) — [@graycraft](https://github.com/graycraft) +- Fixed status rejected BTC dust transactions in chat when node validation fails [#857](https://github.com/Adamant-im/adamant-im/pull/857) — [@Linhead](https://github.com/Linhead) From 15da56289eed661f4e94c10370e20aae897babcd Mon Sep 17 00:00:00 2001 From: Timur Sultanov Date: Wed, 3 Sep 2025 11:15:08 +0300 Subject: [PATCH 3/7] fix: remove unnecessary retry on 404 response for BTC transactions --- src/hooks/queries/transaction/utils.ts | 7 ++++++- src/store/modules/btc-base/btc-base-actions.js | 12 ------------ 2 files changed, 6 insertions(+), 13 deletions(-) diff --git a/src/hooks/queries/transaction/utils.ts b/src/hooks/queries/transaction/utils.ts index 36e60525c..86b8681d3 100644 --- a/src/hooks/queries/transaction/utils.ts +++ b/src/hooks/queries/transaction/utils.ts @@ -15,7 +15,12 @@ import { export function retryFactory(crypto: CryptoSymbol, transactionId: string) { const txFetchInfo = getTxFetchInfo(crypto) - return (failureCount: number): boolean => { + return (failureCount: number, error: any): boolean => { + // Don't retry BTC transactions on 404 (dust amount rejections) + if (crypto === 'BTC' && error?.response?.status === 404) { + return false + } + const pendingTransaction = PendingTxStore.get(crypto) const isPendingTransaction = pendingTransaction?.id === transactionId diff --git a/src/store/modules/btc-base/btc-base-actions.js b/src/store/modules/btc-base/btc-base-actions.js index bde2f7645..d3698584b 100644 --- a/src/store/modules/btc-base/btc-base-actions.js +++ b/src/store/modules/btc-base/btc-base-actions.js @@ -233,18 +233,6 @@ function createActions(options) { } catch (error) { context.commit('transactions', [{ hash: signedTransaction.txid, status: 'REJECTED' }]) PendingTxStore.remove(context.state.crypto) - - if (admAddress) { - context.commit( - 'chat/updateMessage', - { - partnerId: admAddress, - id: signedTransaction.txid, - status: 'REJECTED' - }, - { root: true } - ) - } throw error } }, From 273bd60edd1629cab0e156924c22d5e82ddd9b3a Mon Sep 17 00:00:00 2001 From: Timur Sultanov Date: Thu, 11 Sep 2025 19:49:45 +0300 Subject: [PATCH 4/7] fix: fix status rejected BTC and BTC based due to dust amount transactions in chat --- src/hooks/queries/transaction/useBtcTransactionQuery.ts | 9 ++++++++- src/hooks/queries/transaction/useDashTransactionQuery.ts | 9 ++++++++- src/hooks/queries/transaction/useDogeTransactionQuery.ts | 9 ++++++++- src/hooks/queries/transaction/utils.ts | 7 +------ src/store/modules/btc-base/btc-base-actions.js | 8 ++++++++ src/store/modules/btc-base/btc-base-mutations.js | 4 ++++ src/store/modules/btc-base/btc-base-state.js | 3 ++- 7 files changed, 39 insertions(+), 10 deletions(-) diff --git a/src/hooks/queries/transaction/useBtcTransactionQuery.ts b/src/hooks/queries/transaction/useBtcTransactionQuery.ts index 9631ebef7..f610c10ce 100644 --- a/src/hooks/queries/transaction/useBtcTransactionQuery.ts +++ b/src/hooks/queries/transaction/useBtcTransactionQuery.ts @@ -27,7 +27,14 @@ export function useBtcTransactionQuery( return pendingTransaction } }, - retry: retryFactory(Cryptos.BTC, unref(transactionId)), + retry: (failureCount: number): boolean => { + // Don't retry dust amount BTC transactions + const dustedIds = store.state.btc.dustedTransactionsIds || [] + if (dustedIds.length > 0 && dustedIds.includes(unref(transactionId))) { + return false + } + return retryFactory(Cryptos.BTC, unref(transactionId))(failureCount) + }, retryDelay: retryDelayFactory(Cryptos.BTC, unref(transactionId)), refetchInterval: ({ state }) => refetchIntervalFactory(Cryptos.BTC, state.status, state.data), refetchOnWindowFocus: false, diff --git a/src/hooks/queries/transaction/useDashTransactionQuery.ts b/src/hooks/queries/transaction/useDashTransactionQuery.ts index fbe9f8ca7..3387c2c66 100644 --- a/src/hooks/queries/transaction/useDashTransactionQuery.ts +++ b/src/hooks/queries/transaction/useDashTransactionQuery.ts @@ -27,7 +27,14 @@ export function useDashTransactionQuery( return pendingTransaction } }, - retry: retryFactory(Cryptos.DASH, unref(transactionId)), + retry: (failureCount: number): boolean => { + // Don't retry dust amount DASH transactions + const dustedIds = store.state.dash.dustedTransactionsIds || [] + if (dustedIds.length > 0 && dustedIds.includes(unref(transactionId))) { + return false + } + return retryFactory(Cryptos.DASH, unref(transactionId))(failureCount) + }, retryDelay: retryDelayFactory(Cryptos.DASH, unref(transactionId)), refetchInterval: ({ state }) => refetchIntervalFactory(Cryptos.DASH, state.status, state.data), refetchOnWindowFocus: false, diff --git a/src/hooks/queries/transaction/useDogeTransactionQuery.ts b/src/hooks/queries/transaction/useDogeTransactionQuery.ts index a83fa6b32..b03b14c86 100644 --- a/src/hooks/queries/transaction/useDogeTransactionQuery.ts +++ b/src/hooks/queries/transaction/useDogeTransactionQuery.ts @@ -27,7 +27,14 @@ export function useDogeTransactionQuery( return pendingTransaction } }, - retry: retryFactory(Cryptos.DOGE, unref(transactionId)), + retry: (failureCount: number): boolean => { + // Don't retry dust amount DOGE transactions + const dustedIds = store.state.doge.dustedTransactionsIds || [] + if (dustedIds.length > 0 && dustedIds.includes(unref(transactionId))) { + return false + } + return retryFactory(Cryptos.DOGE, unref(transactionId))(failureCount) + }, retryDelay: retryDelayFactory(Cryptos.DOGE, unref(transactionId)), refetchInterval: ({ state }) => refetchIntervalFactory(Cryptos.DOGE, state.status, state.data), refetchOnWindowFocus: false, diff --git a/src/hooks/queries/transaction/utils.ts b/src/hooks/queries/transaction/utils.ts index 86b8681d3..36e60525c 100644 --- a/src/hooks/queries/transaction/utils.ts +++ b/src/hooks/queries/transaction/utils.ts @@ -15,12 +15,7 @@ import { export function retryFactory(crypto: CryptoSymbol, transactionId: string) { const txFetchInfo = getTxFetchInfo(crypto) - return (failureCount: number, error: any): boolean => { - // Don't retry BTC transactions on 404 (dust amount rejections) - if (crypto === 'BTC' && error?.response?.status === 404) { - return false - } - + return (failureCount: number): boolean => { const pendingTransaction = PendingTxStore.get(crypto) const isPendingTransaction = pendingTransaction?.id === transactionId diff --git a/src/store/modules/btc-base/btc-base-actions.js b/src/store/modules/btc-base/btc-base-actions.js index d3698584b..509c10223 100644 --- a/src/store/modules/btc-base/btc-base-actions.js +++ b/src/store/modules/btc-base/btc-base-actions.js @@ -231,7 +231,15 @@ function createActions(options) { return hash } catch (error) { + if (error.response && error.response.data) { + if ( + ((crypto === 'BTC' || crypto === 'DOGE') && error.response.data.includes('dust')) || + (crypto === 'DASH' && error.response.data.error.message.includes('dust')) + ) + context.commit('dustedTransactionsIds', signedTransaction.txid) + } context.commit('transactions', [{ hash: signedTransaction.txid, status: 'REJECTED' }]) + PendingTxStore.remove(context.state.crypto) throw error } diff --git a/src/store/modules/btc-base/btc-base-mutations.js b/src/store/modules/btc-base/btc-base-mutations.js index f9ec4930b..ee02ebc89 100644 --- a/src/store/modules/btc-base/btc-base-mutations.js +++ b/src/store/modules/btc-base/btc-base-mutations.js @@ -44,6 +44,10 @@ export default (initialState) => ({ }) }, + dustedTransactionsIds(state, dustedTransactionId) { + state.dustedTransactionsIds.push(dustedTransactionId) + }, + areOlderLoading(state, areLoading) { state.areOlderLoading = areLoading }, diff --git a/src/store/modules/btc-base/btc-base-state.js b/src/store/modules/btc-base/btc-base-state.js index f201ab1a6..01de994cc 100644 --- a/src/store/modules/btc-base/btc-base-state.js +++ b/src/store/modules/btc-base/btc-base-state.js @@ -9,5 +9,6 @@ export default () => ({ areTransactionsLoading: false, areRecentLoading: false, areOlderLoading: false, - bottomReached: false + bottomReached: false, + dustedTransactionsIds: [] }) From 496489d55edec877349e6f0964d235fa495bba00 Mon Sep 17 00:00:00 2001 From: Linhead <33072067+Linhead@users.noreply.github.com> Date: Fri, 12 Sep 2025 11:12:52 +0300 Subject: [PATCH 5/7] Update src/store/modules/btc-base/btc-base-mutations.js Co-authored-by: skranee <125743202+skranee@users.noreply.github.com> --- src/store/modules/btc-base/btc-base-mutations.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/store/modules/btc-base/btc-base-mutations.js b/src/store/modules/btc-base/btc-base-mutations.js index ee02ebc89..0861aa50b 100644 --- a/src/store/modules/btc-base/btc-base-mutations.js +++ b/src/store/modules/btc-base/btc-base-mutations.js @@ -44,7 +44,7 @@ export default (initialState) => ({ }) }, - dustedTransactionsIds(state, dustedTransactionId) { + addDustedTransactionsId(state, dustedTransactionId) { state.dustedTransactionsIds.push(dustedTransactionId) }, From 1f9223277ac96bc0c7a2c3a515a7e8459393a4b7 Mon Sep 17 00:00:00 2001 From: Linhead <33072067+Linhead@users.noreply.github.com> Date: Fri, 12 Sep 2025 15:48:06 +0300 Subject: [PATCH 6/7] Update src/store/modules/btc-base/btc-base-actions.js Co-authored-by: Izar Konti <147433669+adamantmm@users.noreply.github.com> --- src/store/modules/btc-base/btc-base-actions.js | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/store/modules/btc-base/btc-base-actions.js b/src/store/modules/btc-base/btc-base-actions.js index 509c10223..96dcbdfa8 100644 --- a/src/store/modules/btc-base/btc-base-actions.js +++ b/src/store/modules/btc-base/btc-base-actions.js @@ -231,7 +231,10 @@ function createActions(options) { return hash } catch (error) { - if (error.response && error.response.data) { +if (error.response?.data?.includes?.('dust') || + error.response?.data?.error?.message?.includes?.('dust')) { + context.commit('dustedTransactionsIds', signedTransaction.txid); +} if ( ((crypto === 'BTC' || crypto === 'DOGE') && error.response.data.includes('dust')) || (crypto === 'DASH' && error.response.data.error.message.includes('dust')) From 1efdacf431a87af3ba090e8ad445796c14b2808f Mon Sep 17 00:00:00 2001 From: Timur Sultanov Date: Fri, 12 Sep 2025 16:01:28 +0300 Subject: [PATCH 7/7] fix: code-review fixes --- .../queries/transaction/useBtcTransactionQuery.ts | 2 +- .../queries/transaction/useDashTransactionQuery.ts | 2 +- .../queries/transaction/useDogeTransactionQuery.ts | 2 +- src/store/modules/btc-base/btc-base-actions.js | 14 +++++--------- src/store/modules/btc-base/btc-base-mutations.js | 2 +- 5 files changed, 9 insertions(+), 13 deletions(-) diff --git a/src/hooks/queries/transaction/useBtcTransactionQuery.ts b/src/hooks/queries/transaction/useBtcTransactionQuery.ts index f610c10ce..5ddc09ac8 100644 --- a/src/hooks/queries/transaction/useBtcTransactionQuery.ts +++ b/src/hooks/queries/transaction/useBtcTransactionQuery.ts @@ -30,7 +30,7 @@ export function useBtcTransactionQuery( retry: (failureCount: number): boolean => { // Don't retry dust amount BTC transactions const dustedIds = store.state.btc.dustedTransactionsIds || [] - if (dustedIds.length > 0 && dustedIds.includes(unref(transactionId))) { + if (dustedIds.includes(unref(transactionId))) { return false } return retryFactory(Cryptos.BTC, unref(transactionId))(failureCount) diff --git a/src/hooks/queries/transaction/useDashTransactionQuery.ts b/src/hooks/queries/transaction/useDashTransactionQuery.ts index 3387c2c66..7ea4e8bb7 100644 --- a/src/hooks/queries/transaction/useDashTransactionQuery.ts +++ b/src/hooks/queries/transaction/useDashTransactionQuery.ts @@ -30,7 +30,7 @@ export function useDashTransactionQuery( retry: (failureCount: number): boolean => { // Don't retry dust amount DASH transactions const dustedIds = store.state.dash.dustedTransactionsIds || [] - if (dustedIds.length > 0 && dustedIds.includes(unref(transactionId))) { + if (dustedIds.includes(unref(transactionId))) { return false } return retryFactory(Cryptos.DASH, unref(transactionId))(failureCount) diff --git a/src/hooks/queries/transaction/useDogeTransactionQuery.ts b/src/hooks/queries/transaction/useDogeTransactionQuery.ts index b03b14c86..ee6e9ac4a 100644 --- a/src/hooks/queries/transaction/useDogeTransactionQuery.ts +++ b/src/hooks/queries/transaction/useDogeTransactionQuery.ts @@ -30,7 +30,7 @@ export function useDogeTransactionQuery( retry: (failureCount: number): boolean => { // Don't retry dust amount DOGE transactions const dustedIds = store.state.doge.dustedTransactionsIds || [] - if (dustedIds.length > 0 && dustedIds.includes(unref(transactionId))) { + if (dustedIds.includes(unref(transactionId))) { return false } return retryFactory(Cryptos.DOGE, unref(transactionId))(failureCount) diff --git a/src/store/modules/btc-base/btc-base-actions.js b/src/store/modules/btc-base/btc-base-actions.js index 96dcbdfa8..92f340f43 100644 --- a/src/store/modules/btc-base/btc-base-actions.js +++ b/src/store/modules/btc-base/btc-base-actions.js @@ -231,15 +231,11 @@ function createActions(options) { return hash } catch (error) { -if (error.response?.data?.includes?.('dust') || - error.response?.data?.error?.message?.includes?.('dust')) { - context.commit('dustedTransactionsIds', signedTransaction.txid); -} - if ( - ((crypto === 'BTC' || crypto === 'DOGE') && error.response.data.includes('dust')) || - (crypto === 'DASH' && error.response.data.error.message.includes('dust')) - ) - context.commit('dustedTransactionsIds', signedTransaction.txid) + if ( + error.response?.data?.includes('dust') || + error.response?.data?.error?.message?.includes('dust') + ) { + context.commit('addDustedTransactionId', signedTransaction.txid) } context.commit('transactions', [{ hash: signedTransaction.txid, status: 'REJECTED' }]) diff --git a/src/store/modules/btc-base/btc-base-mutations.js b/src/store/modules/btc-base/btc-base-mutations.js index 0861aa50b..f69ad8fa2 100644 --- a/src/store/modules/btc-base/btc-base-mutations.js +++ b/src/store/modules/btc-base/btc-base-mutations.js @@ -44,7 +44,7 @@ export default (initialState) => ({ }) }, - addDustedTransactionsId(state, dustedTransactionId) { + addDustedTransactionId(state, dustedTransactionId) { state.dustedTransactionsIds.push(dustedTransactionId) },