Skip to content

Commit

Permalink
Refactor blockchain provider; Add getToolkit methods
Browse files Browse the repository at this point in the history
  • Loading branch information
maxima-net committed Aug 11, 2022
1 parent b8969b1 commit 6f20486
Show file tree
Hide file tree
Showing 4 changed files with 42 additions and 18 deletions.
11 changes: 5 additions & 6 deletions src/atomex/atomex.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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;

Expand All @@ -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() {
Expand Down Expand Up @@ -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']) {
Expand Down
24 changes: 23 additions & 1 deletion src/blockchain/atomexBlockchainProvider.ts
Original file line number Diff line number Diff line change
Expand Up @@ -17,8 +17,14 @@ export interface CurrencyInfo {

export class AtomexBlockchainProvider implements CurrenciesProvider {
protected readonly currencyInfoMap: Map<Currency['id'], CurrencyInfo> = new Map();
protected readonly blockchainToolkitProviderMap: Map<string, BlockchainToolkitProvider> = 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');
Expand All @@ -39,6 +45,22 @@ export class AtomexBlockchainProvider implements CurrenciesProvider {
return this.getCurrencyInfo(currencyId)?.currency;
}

getReadonlyToolkit(blockchain: string, toolkitId: string): Promise<unknown | undefined> {
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<unknown | undefined> {
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);

Expand Down
19 changes: 11 additions & 8 deletions tests/blockchain/atomexBlockchainProvider.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -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: {
Expand All @@ -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);
Expand All @@ -75,17 +77,18 @@ 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: {
[tezosNativeCurrency.id]: tezosNativeCurrencyOptions
}
};

provider.addBlockchain(networkOptions);
provider.addBlockchain(networkOptions);
provider.addBlockchain('tezos', networkOptions);
provider.addBlockchain('ethereum', networkOptions);
} catch (e) {
expect((e as Error).message).toMatch('same key');
}
Expand Down
6 changes: 3 additions & 3 deletions tests/testHelpers/testCurrenciesProvider.ts
Original file line number Diff line number Diff line change
@@ -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',
Expand Down

0 comments on commit 6f20486

Please sign in to comment.