From 6f20486b71c1f1f1f093f99f3e75134feb4f8c13 Mon Sep 17 00:00:00 2001 From: Maxim Kucherov Date: Tue, 9 Aug 2022 15:43:54 +0300 Subject: [PATCH] Refactor blockchain provider; Add getToolkit methods --- src/atomex/atomex.ts | 11 ++++----- src/blockchain/atomexBlockchainProvider.ts | 24 ++++++++++++++++++- .../atomexBlockchainProvider.test.ts | 19 ++++++++------- tests/testHelpers/testCurrenciesProvider.ts | 6 ++--- 4 files changed, 42 insertions(+), 18 deletions(-) diff --git a/src/atomex/atomex.ts b/src/atomex/atomex.ts index 5399c896..dc283260 100644 --- a/src/atomex/atomex.ts +++ b/src/atomex/atomex.ts @@ -14,8 +14,7 @@ export class Atomex implements AtomexService { readonly exchangeManager: ExchangeManager; readonly swapManager: SwapManager; readonly signers: SignersManager; - - protected readonly atomexContext: AtomexContext; + readonly atomexContext: AtomexContext; private _isStarted = false; @@ -29,7 +28,7 @@ export class Atomex implements AtomexService { if (options.blockchains) for (const blockchainName of Object.keys(options.blockchains)) // eslint-disable-next-line @typescript-eslint/no-non-null-assertion - this.addBlockchain(_context => options.blockchains![blockchainName]!); + this.addBlockchain(_context => [blockchainName, options.blockchains![blockchainName]!]); } get atomexNetwork() { @@ -68,12 +67,12 @@ export class Atomex implements AtomexService { await this.options.blockchains?.[signer.blockchain]?.mainnet.blockchainToolkitProvider?.addSigner(signer); } - addBlockchain(factoryMethod: (context: AtomexContext) => AtomexBlockchainOptions) { - const blockchainOptions = factoryMethod(this.atomexContext); + addBlockchain(factoryMethod: (context: AtomexContext) => [blockchain: string, options: AtomexBlockchainOptions]) { + const [blockchain, blockchainOptions] = factoryMethod(this.atomexContext); const networkOptions = this.atomexNetwork == 'mainnet' ? blockchainOptions.mainnet : blockchainOptions.testnet; if (networkOptions) - this.atomexContext.providers.blockchainProvider.addBlockchain(networkOptions); + this.atomexContext.providers.blockchainProvider.addBlockchain(blockchain, networkOptions); } getCurrency(currencyId: Currency['id']) { diff --git a/src/blockchain/atomexBlockchainProvider.ts b/src/blockchain/atomexBlockchainProvider.ts index 8c47ff36..07e02410 100644 --- a/src/blockchain/atomexBlockchainProvider.ts +++ b/src/blockchain/atomexBlockchainProvider.ts @@ -17,8 +17,14 @@ export interface CurrencyInfo { export class AtomexBlockchainProvider implements CurrenciesProvider { protected readonly currencyInfoMap: Map = new Map(); + protected readonly blockchainToolkitProviderMap: Map = new Map(); + + addBlockchain(blockchain: string, networkOptions: AtomexBlockchainNetworkOptions) { + if (this.blockchainToolkitProviderMap.has(blockchain)) + throw new Error('There is already blockchain added with the same key'); + + this.blockchainToolkitProviderMap.set(blockchain, networkOptions.blockchainToolkitProvider); - addBlockchain(networkOptions: AtomexBlockchainNetworkOptions) { for (const currency of networkOptions.currencies) { if (this.currencyInfoMap.has(currency.id)) throw new Error('There is already currency added with the same key'); @@ -39,6 +45,22 @@ export class AtomexBlockchainProvider implements CurrenciesProvider { return this.getCurrencyInfo(currencyId)?.currency; } + getReadonlyToolkit(blockchain: string, toolkitId: string): Promise { + const provider = this.blockchainToolkitProviderMap.get(blockchain); + if (!provider || provider.toolkitId !== toolkitId) + return Promise.resolve(undefined); + + return provider.getReadonlyToolkit(); + } + + getToolkit(blockchain: string, address: string, toolkitId: string): Promise { + const provider = this.blockchainToolkitProviderMap.get(blockchain); + if (!provider || provider.toolkitId !== toolkitId) + return Promise.resolve(undefined); + + return provider.getToolkit(address); + } + getCurrencyInfo(currencyId: Currency['id']): CurrencyInfo | undefined { const options = this.currencyInfoMap.get(currencyId); diff --git a/tests/blockchain/atomexBlockchainProvider.test.ts b/tests/blockchain/atomexBlockchainProvider.test.ts index ea0ee84e..2794a6dc 100644 --- a/tests/blockchain/atomexBlockchainProvider.test.ts +++ b/tests/blockchain/atomexBlockchainProvider.test.ts @@ -2,7 +2,7 @@ import type { AtomexBlockchainNetworkOptions, AtomexCurrencyOptions } from '../. import { AtomexBlockchainProvider } from '../../src/blockchain/atomexBlockchainProvider'; import type { Currency } from '../../src/common/index'; import { - EthereumBalancesProvider, EthereumBlockchainToolkitProvider, EthereumSwapTransactionsProvider + EthereumBalancesProvider, Web3BlockchainToolkitProvider, EthereumSwapTransactionsProvider } from '../../src/ethereum/index'; import { TezosBalancesProvider, TezosBlockchainToolkitProvider, TezosCurrency, TezosSwapTransactionsProvider @@ -39,8 +39,9 @@ describe('Atomex Blockchain Provider', () => { test('applies blockchain options and returns them', () => { const tezosNetworkOptions: AtomexBlockchainNetworkOptions = { + rpcUrl: '', balancesProvider: new TezosBalancesProvider(), - blockchainToolkitProvider: new TezosBlockchainToolkitProvider(), + blockchainToolkitProvider: new TezosBlockchainToolkitProvider(''), swapTransactionsProvider: new TezosSwapTransactionsProvider(), currencies: [tezosNativeCurrency], currencyOptions: { @@ -49,15 +50,16 @@ describe('Atomex Blockchain Provider', () => { }; const ethereumNetworkOptions: AtomexBlockchainNetworkOptions = { + rpcUrl: '', balancesProvider: new EthereumBalancesProvider(), - blockchainToolkitProvider: new EthereumBlockchainToolkitProvider(), + blockchainToolkitProvider: new Web3BlockchainToolkitProvider(''), swapTransactionsProvider: new EthereumSwapTransactionsProvider(), currencies: [ethereumNativeCurrency], currencyOptions: {} }; - provider.addBlockchain(tezosNetworkOptions); - provider.addBlockchain(ethereumNetworkOptions); + provider.addBlockchain('tezos', tezosNetworkOptions); + provider.addBlockchain('ethereum', ethereumNetworkOptions); const tezosCurrencyInfo = provider.getCurrencyInfo(tezosNativeCurrency.id); expect(tezosCurrencyInfo?.currency).toBe(tezosNativeCurrency); @@ -75,8 +77,9 @@ describe('Atomex Blockchain Provider', () => { expect.assertions(1); try { const networkOptions: AtomexBlockchainNetworkOptions = { + rpcUrl: '', balancesProvider: new TezosBalancesProvider(), - blockchainToolkitProvider: new TezosBlockchainToolkitProvider(), + blockchainToolkitProvider: new TezosBlockchainToolkitProvider(''), swapTransactionsProvider: new TezosSwapTransactionsProvider(), currencies: [tezosNativeCurrency], currencyOptions: { @@ -84,8 +87,8 @@ describe('Atomex Blockchain Provider', () => { } }; - provider.addBlockchain(networkOptions); - provider.addBlockchain(networkOptions); + provider.addBlockchain('tezos', networkOptions); + provider.addBlockchain('ethereum', networkOptions); } catch (e) { expect((e as Error).message).toMatch('same key'); } diff --git a/tests/testHelpers/testCurrenciesProvider.ts b/tests/testHelpers/testCurrenciesProvider.ts index fd374e06..403efa04 100644 --- a/tests/testHelpers/testCurrenciesProvider.ts +++ b/tests/testHelpers/testCurrenciesProvider.ts @@ -1,8 +1,8 @@ import { InMemoryCurrenciesProvider } from '../../src/common/index'; -import { ethereumMainnetCurrencies } from '../../src/ethereum/currencies'; -import type { ERC20EthereumCurrency } from '../../src/ethereum/models/currency'; +import { ethereumMainnetCurrencies } from '../../src/ethereum/index'; +import type { ERC20EthereumCurrency } from '../../src/ethereum/models/index'; import type { Currency, TezosFA12Currency } from '../../src/index'; -import { tezosMainnetCurrencies } from '../../src/tezos/currencies'; +import { tezosMainnetCurrencies } from '../../src/tezos/index'; const btcCurrency: Currency = { id: 'BTC',