From e06347fa2a4bd50d07d198735e9cd05174be2d0f Mon Sep 17 00:00:00 2001 From: Alexandru Popenta Date: Mon, 2 Feb 2026 16:08:27 +0200 Subject: [PATCH 1/4] changes for supernova release --- package-lock.json | 4 ++-- package.json | 2 +- src/core/constants.ts | 5 +++++ src/core/transactionStatus.ts | 8 +++++++- src/core/transactionWatcher.spec.ts | 29 +++++++++++++++++++++++++++ src/core/transactionWatcher.ts | 11 +++++++--- src/networkProviders/constants.ts | 2 +- src/networkProviders/networkStatus.ts | 7 +++++++ 8 files changed, 60 insertions(+), 8 deletions(-) diff --git a/package-lock.json b/package-lock.json index 75f46ef87..a3f8de5aa 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "@multiversx/sdk-core", - "version": "15.3.2", + "version": "15.4.0", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "@multiversx/sdk-core", - "version": "15.3.2", + "version": "15.4.0", "license": "MIT", "dependencies": { "@multiversx/sdk-transaction-decoder": "1.0.2", diff --git a/package.json b/package.json index 612804a83..487e93773 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@multiversx/sdk-core", - "version": "15.3.2", + "version": "15.4.0", "description": "MultiversX SDK for JavaScript and TypeScript", "author": "MultiversX", "homepage": "https://multiversx.com", diff --git a/src/core/constants.ts b/src/core/constants.ts index a398c7ef9..e03c23c99 100644 --- a/src/core/constants.ts +++ b/src/core/constants.ts @@ -30,3 +30,8 @@ export const UNKNOWN_SIGNER = "unknown"; export const EGLD_IDENTIFIER_FOR_MULTI_ESDTNFT_TRANSFER = "EGLD-000000"; export const EXTRA_GAS_LIMIT_FOR_GUARDED_TRANSACTIONS = 50_000; export const EXTRA_GAS_LIMIT_FOR_RELAYED_TRANSACTIONS = 50_000; + +export const DEFAULT_TRANSACTION_AWAITING_POLLING_TIMEOUT_IN_MILLISECONDS = 600; +export const DEFAULT_TRANSACTION_AWAITING_TIMEOUT_IN_MILLISECONDS = + 15 * DEFAULT_TRANSACTION_AWAITING_POLLING_TIMEOUT_IN_MILLISECONDS; +export const DEFAULT_ACCOUNT_AWAITING_PATIENCE_IN_MILLISECONDS = 0; diff --git a/src/core/transactionStatus.ts b/src/core/transactionStatus.ts index 797b6c70f..cc6fbb687 100644 --- a/src/core/transactionStatus.ts +++ b/src/core/transactionStatus.ts @@ -46,7 +46,13 @@ export class TransactionStatus { * Returns whether the transaction has been executed, but with a failure. */ isFailed(): boolean { - return this.status == "fail" || this.status == "failed" || this.status == "unsuccessful" || this.isInvalid(); + return ( + this.status == "fail" || + this.status == "failed" || + this.status == "unsuccessful" || + this.isInvalid() || + this.status == "not-executable-in-block" + ); } /** diff --git a/src/core/transactionWatcher.spec.ts b/src/core/transactionWatcher.spec.ts index 967be8037..3a6d84be5 100644 --- a/src/core/transactionWatcher.spec.ts +++ b/src/core/transactionWatcher.spec.ts @@ -62,4 +62,33 @@ describe("test transactionWatcher", () => { assert.isTrue((await provider.getTransactionStatus(hash)).isCompleted()); }); + + it("should await status == not-executable-in-block using transaction", async () => { + let hash = "abbaabbaabbaabbaabbaabbaabbaabbaabbaabbaabbaabbaabbaabbaabbaabba"; + let provider = new MockNetworkProvider(); + let watcher = new TransactionWatcher(provider, { + pollingIntervalMilliseconds: 42, + timeoutMilliseconds: 42 * 42, + }); + + provider.mockPutTransaction( + hash, + new TransactionOnNetwork({ + status: new TransactionStatus("unknown"), + }), + ); + + await Promise.all([ + provider.mockTransactionTimelineByHash(hash, [ + new Wait(40), + new TransactionStatus("pending"), + new Wait(40), + new TransactionStatus("not-executable-in-block"), + new MarkCompleted(), + ]), + watcher.awaitCompleted(hash), + ]); + + assert.isTrue((await provider.getTransactionStatus(hash)).isFailed()); + }); }); diff --git a/src/core/transactionWatcher.ts b/src/core/transactionWatcher.ts index 0f1826b83..08fa75394 100644 --- a/src/core/transactionWatcher.ts +++ b/src/core/transactionWatcher.ts @@ -1,4 +1,9 @@ import { AsyncTimer } from "./asyncTimer"; +import { + DEFAULT_ACCOUNT_AWAITING_PATIENCE_IN_MILLISECONDS, + DEFAULT_TRANSACTION_AWAITING_POLLING_TIMEOUT_IN_MILLISECONDS, + DEFAULT_TRANSACTION_AWAITING_TIMEOUT_IN_MILLISECONDS, +} from "./constants"; import { Err, ErrExpectedTransactionEventsNotFound, @@ -17,9 +22,9 @@ export type PredicateIsAwaitedStatus = (status: TransactionStatus) => boolean; * TransactionWatcher allows one to continuously watch (monitor), by means of polling, the status of a given transaction. */ export class TransactionWatcher { - private static DefaultPollingInterval: number = 6000; - private static DefaultTimeout: number = TransactionWatcher.DefaultPollingInterval * 15; - private static DefaultPatience: number = 0; + private static DefaultPollingInterval: number = DEFAULT_TRANSACTION_AWAITING_POLLING_TIMEOUT_IN_MILLISECONDS; + private static DefaultTimeout: number = DEFAULT_TRANSACTION_AWAITING_TIMEOUT_IN_MILLISECONDS; + private static DefaultPatience: number = DEFAULT_ACCOUNT_AWAITING_PATIENCE_IN_MILLISECONDS; static NoopOnStatusReceived = (_: TransactionStatus) => {}; diff --git a/src/networkProviders/constants.ts b/src/networkProviders/constants.ts index f31aee782..345ea70b4 100644 --- a/src/networkProviders/constants.ts +++ b/src/networkProviders/constants.ts @@ -6,7 +6,7 @@ export const EsdtContractAddress = new Address("erd1qqqqqqqqqqqqqqqpqqqqqqqqqqqq export const BaseUserAgent = "multiversx-sdk"; export const UnknownClientName = "unknown"; -export const DEFAULT_ACCOUNT_AWAITING_POLLING_TIMEOUT_IN_MILLISECONDS = 6000; +export const DEFAULT_ACCOUNT_AWAITING_POLLING_TIMEOUT_IN_MILLISECONDS = 600; export const DEFAULT_ACCOUNT_AWAITING_TIMEOUT_IN_MILLISECONDS = 15 * DEFAULT_ACCOUNT_AWAITING_POLLING_TIMEOUT_IN_MILLISECONDS; export const DEFAULT_ACCOUNT_AWAITING_PATIENCE_IN_MILLISECONDS = 0; diff --git a/src/networkProviders/networkStatus.ts b/src/networkProviders/networkStatus.ts index 0988a1707..3d83b664c 100644 --- a/src/networkProviders/networkStatus.ts +++ b/src/networkProviders/networkStatus.ts @@ -9,6 +9,11 @@ export class NetworkStatus { */ public blockTimestamp: number; + /** + * The block timestamp in milliseconds. + */ + public blockTimestampMs: number; + /** * The block nonce. */ @@ -35,6 +40,7 @@ export class NetworkStatus { this.highestFinalNonce = 0n; this.blockNonce = 0n; this.blockTimestamp = 0; + this.blockTimestampMs = 0; } /** @@ -49,6 +55,7 @@ export class NetworkStatus { networkStatus.highestFinalNonce = BigInt(payload["erd_highest_final_nonce"]); networkStatus.blockNonce = BigInt(payload["erd_nonce"]); networkStatus.blockTimestamp = Number(payload["erd_block_timestamp"]); + networkStatus.blockTimestampMs = Number(payload["erd_block_timestamp_ms"]); return networkStatus; } From 03fb3e4aee9ed77d95483e58805a098b6a0531a8 Mon Sep 17 00:00:00 2001 From: Alexandru Popenta Date: Mon, 2 Feb 2026 16:58:40 +0200 Subject: [PATCH 2/4] fix test --- src/core/transactionWatcher.spec.ts | 1 - 1 file changed, 1 deletion(-) diff --git a/src/core/transactionWatcher.spec.ts b/src/core/transactionWatcher.spec.ts index 3a6d84be5..7f433071a 100644 --- a/src/core/transactionWatcher.spec.ts +++ b/src/core/transactionWatcher.spec.ts @@ -84,7 +84,6 @@ describe("test transactionWatcher", () => { new TransactionStatus("pending"), new Wait(40), new TransactionStatus("not-executable-in-block"), - new MarkCompleted(), ]), watcher.awaitCompleted(hash), ]); From 667dcdf69d1dc2b3a62e03740f4435a817b30046 Mon Sep 17 00:00:00 2001 From: Alexandru Popenta Date: Mon, 2 Feb 2026 17:21:26 +0200 Subject: [PATCH 3/4] rename constant --- src/core/constants.ts | 2 +- src/core/transactionWatcher.ts | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/core/constants.ts b/src/core/constants.ts index e03c23c99..97700e11e 100644 --- a/src/core/constants.ts +++ b/src/core/constants.ts @@ -34,4 +34,4 @@ export const EXTRA_GAS_LIMIT_FOR_RELAYED_TRANSACTIONS = 50_000; export const DEFAULT_TRANSACTION_AWAITING_POLLING_TIMEOUT_IN_MILLISECONDS = 600; export const DEFAULT_TRANSACTION_AWAITING_TIMEOUT_IN_MILLISECONDS = 15 * DEFAULT_TRANSACTION_AWAITING_POLLING_TIMEOUT_IN_MILLISECONDS; -export const DEFAULT_ACCOUNT_AWAITING_PATIENCE_IN_MILLISECONDS = 0; +export const DEFAULT_TRANSACTION_AWAITING_PATIENCE_IN_MILLISECONDS = 0; diff --git a/src/core/transactionWatcher.ts b/src/core/transactionWatcher.ts index 08fa75394..e9e6e0cea 100644 --- a/src/core/transactionWatcher.ts +++ b/src/core/transactionWatcher.ts @@ -1,6 +1,6 @@ import { AsyncTimer } from "./asyncTimer"; import { - DEFAULT_ACCOUNT_AWAITING_PATIENCE_IN_MILLISECONDS, + DEFAULT_TRANSACTION_AWAITING_PATIENCE_IN_MILLISECONDS, DEFAULT_TRANSACTION_AWAITING_POLLING_TIMEOUT_IN_MILLISECONDS, DEFAULT_TRANSACTION_AWAITING_TIMEOUT_IN_MILLISECONDS, } from "./constants"; @@ -24,7 +24,7 @@ export type PredicateIsAwaitedStatus = (status: TransactionStatus) => boolean; export class TransactionWatcher { private static DefaultPollingInterval: number = DEFAULT_TRANSACTION_AWAITING_POLLING_TIMEOUT_IN_MILLISECONDS; private static DefaultTimeout: number = DEFAULT_TRANSACTION_AWAITING_TIMEOUT_IN_MILLISECONDS; - private static DefaultPatience: number = DEFAULT_ACCOUNT_AWAITING_PATIENCE_IN_MILLISECONDS; + private static DefaultPatience: number = DEFAULT_TRANSACTION_AWAITING_PATIENCE_IN_MILLISECONDS; static NoopOnStatusReceived = (_: TransactionStatus) => {}; From e5a758099a02392325a24e484a97482423d12b88 Mon Sep 17 00:00:00 2001 From: Alexandru Popenta Date: Tue, 10 Feb 2026 14:31:34 +0200 Subject: [PATCH 4/4] remove not-exec-in-block status from isFailed check --- src/core/transactionStatus.ts | 17 +++++++++-------- src/core/transactionWatcher.spec.ts | 4 ++-- 2 files changed, 11 insertions(+), 10 deletions(-) diff --git a/src/core/transactionStatus.ts b/src/core/transactionStatus.ts index cc6fbb687..e42c4eed6 100644 --- a/src/core/transactionStatus.ts +++ b/src/core/transactionStatus.ts @@ -29,7 +29,7 @@ export class TransactionStatus { } /** - * Returns whether the transaction has been conpleted (not necessarily with success). + * Returns whether the transaction has been completed (not necessarily with success). */ isCompleted(): boolean { return this.isSuccessful() || this.isFailed() || this.isInvalid(); @@ -46,13 +46,7 @@ export class TransactionStatus { * Returns whether the transaction has been executed, but with a failure. */ isFailed(): boolean { - return ( - this.status == "fail" || - this.status == "failed" || - this.status == "unsuccessful" || - this.isInvalid() || - this.status == "not-executable-in-block" - ); + return this.status == "fail" || this.status == "failed" || this.status == "unsuccessful" || this.isInvalid(); } /** @@ -62,6 +56,13 @@ export class TransactionStatus { return this.status == "invalid"; } + /** + * Returns whether the transaction cannot be executed in the current block. + */ + isNotExecutableInBlock(): boolean { + return this.status == "not-executable-in-block"; + } + toString(): string { return this.status; } diff --git a/src/core/transactionWatcher.spec.ts b/src/core/transactionWatcher.spec.ts index 7f433071a..5281a0031 100644 --- a/src/core/transactionWatcher.spec.ts +++ b/src/core/transactionWatcher.spec.ts @@ -85,9 +85,9 @@ describe("test transactionWatcher", () => { new Wait(40), new TransactionStatus("not-executable-in-block"), ]), - watcher.awaitCompleted(hash), + watcher.awaitOnCondition(hash, (tx) => tx.status.isNotExecutableInBlock()), ]); - assert.isTrue((await provider.getTransactionStatus(hash)).isFailed()); + assert.isTrue((await provider.getTransactionStatus(hash)).isNotExecutableInBlock()); }); });