diff --git a/CHANGELOG.md b/CHANGELOG.md index 5192a0db..1d59360a 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,6 +7,8 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ## [Unreleased] +- [Fix issue with state manager](https://github.com/multiversx/mx-sdk-dapp-core/pull/58) + ## [[0.0.0-alpha.10](https://github.com/multiversx/mx-sdk-dapp-core/pull/56)] - 2024-12-23 - [Added transactions interpretation helpers](https://github.com/multiversx/mx-sdk-dapp-core/pull/55) diff --git a/src/core/managers/LedgerConnectStateManager/LedgerConnectStateManager.ts b/src/core/managers/LedgerConnectStateManager/LedgerConnectStateManager.ts index 47d27e80..e5ac39fb 100644 --- a/src/core/managers/LedgerConnectStateManager/LedgerConnectStateManager.ts +++ b/src/core/managers/LedgerConnectStateManager/LedgerConnectStateManager.ts @@ -14,9 +14,6 @@ export class LedgerConnectStateManager< T extends IEventBus = IEventBus > { - private static instance: LedgerConnectStateManager< - IEventBus - > | null = null; public readonly addressesPerPage = 10; private eventBus: T = { @@ -61,25 +58,11 @@ export class LedgerConnectStateManager< private data: ILedgerConnectModalData = { ...this.initialData }; - private constructor(eventBus: T) { + constructor(eventBus: T) { this.eventBus = eventBus; this.resetData(); } - public static getInstance>( - eventBus?: U - ): LedgerConnectStateManager | null { - if (!eventBus) { - return null; - } - if (!LedgerConnectStateManager.instance) { - LedgerConnectStateManager.instance = new LedgerConnectStateManager( - eventBus - ); - } - return LedgerConnectStateManager.instance as LedgerConnectStateManager; - } - public updateAllAccounts(accounts: ILedgerAccount[]): void { this.allAccounts = accounts; this.accountScreenData.accounts = accounts; diff --git a/src/core/managers/PendingTransactionsStateManager/PendingTransactionsStateManagement.ts b/src/core/managers/PendingTransactionsStateManager/PendingTransactionsStateManagement.ts index c6abb547..8a8999bf 100644 --- a/src/core/managers/PendingTransactionsStateManager/PendingTransactionsStateManagement.ts +++ b/src/core/managers/PendingTransactionsStateManager/PendingTransactionsStateManagement.ts @@ -8,9 +8,6 @@ export class PendingTransactionsStateManager< T extends IEventBus = IEventBus > { - private static instance: PendingTransactionsStateManager< - IEventBus - > | null = null; private eventBus: T; private initialData: IPendingTransactionsModalData = { @@ -22,20 +19,10 @@ export class PendingTransactionsStateManager< private data: IPendingTransactionsModalData = { ...this.initialData }; - private constructor(eventBus: T) { + constructor(eventBus: T) { this.eventBus = eventBus; } - public static getInstance>( - eventBus: U - ): PendingTransactionsStateManager { - if (!PendingTransactionsStateManager.instance) { - PendingTransactionsStateManager.instance = - new PendingTransactionsStateManager(eventBus); - } - return PendingTransactionsStateManager.instance as PendingTransactionsStateManager; - } - public closeAndReset(): void { this.data.shouldClose = true; this.notifyDataUpdate(); diff --git a/src/core/managers/SignTransactionsStateManager/SignTransactionsStateManager.ts b/src/core/managers/SignTransactionsStateManager/SignTransactionsStateManager.ts index 044ffb16..31f016ef 100644 --- a/src/core/managers/SignTransactionsStateManager/SignTransactionsStateManager.ts +++ b/src/core/managers/SignTransactionsStateManager/SignTransactionsStateManager.ts @@ -13,9 +13,6 @@ export class SignTransactionsStateManager< T extends IEventBus = IEventBus > { - private static instance: SignTransactionsStateManager< - IEventBus - > | null = null; public readonly addressesPerPage = 10; private eventBus: T = { @@ -34,25 +31,11 @@ export class SignTransactionsStateManager< private data: ISignTransactionsModalData = { ...this.initialData }; - private constructor(eventBus: T) { + constructor(eventBus: T) { this.eventBus = eventBus; this.resetData(); } - public static getInstance>( - eventBus?: U - ): SignTransactionsStateManager | null { - if (!eventBus) { - return null; - } - if (!SignTransactionsStateManager.instance) { - SignTransactionsStateManager.instance = new SignTransactionsStateManager( - eventBus - ); - } - return SignTransactionsStateManager.instance as SignTransactionsStateManager; - } - public updateCommonData( members: Partial ): void { diff --git a/src/core/managers/WalletConnectStateManager/WalletConnectStateManager.ts b/src/core/managers/WalletConnectStateManager/WalletConnectStateManager.ts index a33d9cf6..c2cf60f5 100644 --- a/src/core/managers/WalletConnectStateManager/WalletConnectStateManager.ts +++ b/src/core/managers/WalletConnectStateManager/WalletConnectStateManager.ts @@ -8,9 +8,6 @@ export class WalletConnectStateManager< T extends IEventBus = IEventBus > { - private static instance: WalletConnectStateManager< - IEventBus - > | null = null; private eventBus: T; private initialData: IWalletConnectModalData = { @@ -20,21 +17,10 @@ export class WalletConnectStateManager< private data: IWalletConnectModalData = { ...this.initialData }; - private constructor(eventBus: T) { + constructor(eventBus: T) { this.eventBus = eventBus; } - public static getInstance>( - eventBus: U - ): WalletConnectStateManager { - if (!WalletConnectStateManager.instance) { - WalletConnectStateManager.instance = new WalletConnectStateManager( - eventBus - ); - } - return WalletConnectStateManager.instance as WalletConnectStateManager; - } - public closeAndReset(): void { this.data.shouldClose = true; this.notifyDataUpdate(); diff --git a/src/core/providers/strategies/CrossWindowProviderStrategy/CrossWindowProviderStrategy.ts b/src/core/providers/strategies/CrossWindowProviderStrategy/CrossWindowProviderStrategy.ts index 6e537cb0..be6192e5 100644 --- a/src/core/providers/strategies/CrossWindowProviderStrategy/CrossWindowProviderStrategy.ts +++ b/src/core/providers/strategies/CrossWindowProviderStrategy/CrossWindowProviderStrategy.ts @@ -220,7 +220,7 @@ export class CrossWindowProviderStrategy { throw new Error(ProviderErrorsEnum.eventBusError); } - const manager = PendingTransactionsStateManager.getInstance(eventBus); + const manager = new PendingTransactionsStateManager(eventBus); const onClose = (cancelAction = true) => { if (!this.provider) { diff --git a/src/core/providers/strategies/ExtensionProviderStrategy/ExtensionProviderStrategy.ts b/src/core/providers/strategies/ExtensionProviderStrategy/ExtensionProviderStrategy.ts index 131101e5..3942a9ee 100644 --- a/src/core/providers/strategies/ExtensionProviderStrategy/ExtensionProviderStrategy.ts +++ b/src/core/providers/strategies/ExtensionProviderStrategy/ExtensionProviderStrategy.ts @@ -1,20 +1,24 @@ -import { Transaction, Message } from '@multiversx/sdk-core/out'; -import { IDAppProviderOptions } from '@multiversx/sdk-dapp-utils/out'; +import { Message, Transaction } from '@multiversx/sdk-core/out'; import { ExtensionProvider } from '@multiversx/sdk-extension-provider/out/extensionProvider'; import { PendingTransactionsStateManager, PendingTransactionsEventsEnum } from 'core/managers'; -import { getAccount } from 'core/methods/account/getAccount'; import { getAddress } from 'core/methods/account/getAddress'; -import { IProvider } from 'core/providers/types/providerFactory.types'; +import { + IProvider, + ProviderTypeEnum +} from 'core/providers/types/providerFactory.types'; import { PendingTransactionsModal } from 'lib/sdkDappCoreUi'; -import { Nullable, ProviderErrorsEnum } from 'types'; +import { ProviderErrorsEnum } from 'types'; import { createModalElement } from 'utils/createModalElement'; export class ExtensionProviderStrategy { private address: string = ''; private provider: ExtensionProvider | null = null; + private _signTransactions: + | ((transactions: Transaction[]) => Promise) + | null = null; private _signMessage: ((message: Message) => Promise) | null = null; constructor(address?: string) { @@ -29,22 +33,22 @@ export class ExtensionProviderStrategy { await this.provider.init(); } + this._signTransactions = this.provider.signTransactions.bind(this.provider); this._signMessage = this.provider.signMessage.bind(this.provider); return this.buildProvider(); }; private buildProvider = () => { - const { address } = getAccount(); - if (!this.provider) { throw new Error(ProviderErrorsEnum.notInitialized); } const provider = this.provider as unknown as IProvider; + provider.signTransactions = this.signTransactions; provider.signMessage = this.signMessage; + provider.setAccount({ address: this.address }); - provider.setAccount({ address: this.address || address }); return provider; }; @@ -62,6 +66,35 @@ export class ExtensionProviderStrategy { this.address = address; }; + private signTransactions = async (transactions: Transaction[]) => { + if (!this.provider || !this._signTransactions) { + throw new Error(ProviderErrorsEnum.notInitialized); + } + + const modalElement = await createModalElement( + 'pending-transactions-modal' + ); + const { eventBus, manager, onClose } = + await this.getModalHandlers(modalElement); + + eventBus.subscribe(PendingTransactionsEventsEnum.CLOSE, onClose); + + manager.updateData({ + isPending: true, + title: 'Confirm on MultiversX DeFi Wallet', + subtitle: 'Check your MultiversX Wallet Extension to sign the transaction' + }); + try { + const signedTransactions: Transaction[] = + (await this._signTransactions(transactions)) ?? []; + + return signedTransactions; + } finally { + onClose(); + eventBus.unsubscribe(PendingTransactionsEventsEnum.CLOSE, onClose); + } + }; + private signMessage = async (message: Message) => { if (!this.provider || !this._signMessage) { throw new Error(ProviderErrorsEnum.notInitialized); @@ -102,7 +135,7 @@ export class ExtensionProviderStrategy { throw new Error(ProviderErrorsEnum.eventBusError); } - const manager = PendingTransactionsStateManager.getInstance(eventBus); + const manager = new PendingTransactionsStateManager(eventBus); const onClose = (cancelAction = true) => { if (!this.provider) { diff --git a/src/core/providers/strategies/IFrameProviderStrategy/IFrameProviderStrategy.ts b/src/core/providers/strategies/IFrameProviderStrategy/IFrameProviderStrategy.ts index 92b7e94a..5c50772c 100644 --- a/src/core/providers/strategies/IFrameProviderStrategy/IFrameProviderStrategy.ts +++ b/src/core/providers/strategies/IFrameProviderStrategy/IFrameProviderStrategy.ts @@ -150,7 +150,7 @@ export class IFrameProviderStrategy { throw new Error(ProviderErrorsEnum.eventBusError); } - const manager = PendingTransactionsStateManager.getInstance(eventBus); + const manager = new PendingTransactionsStateManager(eventBus); const onClose = (cancelAction = true) => { if (!this.provider) { diff --git a/src/core/providers/strategies/LedgerProviderStrategy/LedgerProviderStrategy.ts b/src/core/providers/strategies/LedgerProviderStrategy/LedgerProviderStrategy.ts index 676998e0..d0f2e422 100644 --- a/src/core/providers/strategies/LedgerProviderStrategy/LedgerProviderStrategy.ts +++ b/src/core/providers/strategies/LedgerProviderStrategy/LedgerProviderStrategy.ts @@ -62,7 +62,11 @@ export class LedgerProviderStrategy { const eventBus = await this.createEventBus(); - const manager = LedgerConnectStateManager.getInstance(eventBus); + if (!eventBus) { + throw new Error(ProviderErrorsEnum.eventBusError); + } + + const manager = new LedgerConnectStateManager(eventBus); this.manager = manager; if (!this.provider) { diff --git a/src/core/providers/strategies/WalletConnectProviderStrategy/WalletConnectProviderStrategy.ts b/src/core/providers/strategies/WalletConnectProviderStrategy/WalletConnectProviderStrategy.ts index ff6399ce..970b6a7c 100644 --- a/src/core/providers/strategies/WalletConnectProviderStrategy/WalletConnectProviderStrategy.ts +++ b/src/core/providers/strategies/WalletConnectProviderStrategy/WalletConnectProviderStrategy.ts @@ -76,7 +76,7 @@ export class WalletConnectProviderStrategy { const eventBus = await this.createEventBus(); if (eventBus) { - const manager = WalletConnectStateManager.getInstance(eventBus); + const manager = new WalletConnectStateManager(eventBus); this.manager = manager; } @@ -401,7 +401,7 @@ export class WalletConnectProviderStrategy { throw new Error(ProviderErrorsEnum.eventBusError); } - const manager = PendingTransactionsStateManager.getInstance(eventBus); + const manager = new PendingTransactionsStateManager(eventBus); const onClose = async (cancelAction = true) => { if (!this.provider) { diff --git a/src/core/providers/strategies/helpers/signTransactions/signTransactions.ts b/src/core/providers/strategies/helpers/signTransactions/signTransactions.ts index c8720d81..8d3d7d79 100644 --- a/src/core/providers/strategies/helpers/signTransactions/signTransactions.ts +++ b/src/core/providers/strategies/helpers/signTransactions/signTransactions.ts @@ -46,7 +46,7 @@ export async function signTransactions({ throw new Error('Event bus not provided for Ledger provider'); } - const manager = SignTransactionsStateManager.getInstance(eventBus); + const manager = new SignTransactionsStateManager(eventBus); if (!manager) { throw new Error('Unable to establish connection with sign screens'); }