diff --git a/packages/networks/evm-chains/src/models/Transaction.ts b/packages/networks/evm-chains/src/models/Transaction.ts index 9f7e844..c45b61f 100644 --- a/packages/networks/evm-chains/src/models/Transaction.ts +++ b/packages/networks/evm-chains/src/models/Transaction.ts @@ -1,5 +1,6 @@ import type { TransactionInterface } from '@multiplechain/types' import { TransactionStatusEnum } from '@multiplechain/types' +import { Provider } from '../services/Provider.ts' export class Transaction implements TransactionInterface { /** @@ -7,15 +8,32 @@ export class Transaction implements TransactionInterface { */ id: string + /** + * Provider instance + */ + private readonly provider: Provider + constructor(id: string) { this.id = id + this.provider = Provider.instance } /** * @returns Raw transaction data that is taken by blockchain network via RPC. */ - getData(): object { - return {} + async getData(): Promise { + try { + const data = (await this.provider.ethers.getTransaction(this.id)) ?? {} + const receipt = (await this.provider.ethers.getTransactionReceipt(this.id)) ?? {} + const result: object = { ...data, ...receipt } + return Object.keys(result).length !== 0 ? result : null + } catch (error) { + const e = error as Error + if (String(e.message).includes('timeout')) { + throw new Error('rpc-timeout') + } + throw new Error('data-request-failed') + } } /** diff --git a/packages/networks/evm-chains/src/services/Ethers.ts b/packages/networks/evm-chains/src/services/Ethers.ts index df59428..2eb2c49 100644 --- a/packages/networks/evm-chains/src/services/Ethers.ts +++ b/packages/networks/evm-chains/src/services/Ethers.ts @@ -36,11 +36,11 @@ export class Ethers { } } - get getJsonRpc(): JsonRpcProvider { + public get jsonRpc(): JsonRpcProvider { return this.jsonRpcProvider } - get getWebsocket(): WebSocketProvider | undefined { + public get websocket(): WebSocketProvider | undefined { return this.websocketProvider } diff --git a/packages/networks/evm-chains/src/services/Provider.ts b/packages/networks/evm-chains/src/services/Provider.ts index f271677..9c9ef70 100644 --- a/packages/networks/evm-chains/src/services/Provider.ts +++ b/packages/networks/evm-chains/src/services/Provider.ts @@ -24,37 +24,38 @@ export class Provider implements Omit { /** * Ethers service */ - private ethers: Ethers + private _ethers: Ethers /** * Static instance of the provider */ - private static instance: Provider + private static _instance: Provider /** * @param network - Network configuration of the provider */ constructor(network: EvmNetworkConfigInterface) { this.network = network - this.ethers = new Ethers(network) + Provider._instance = this + this._ethers = new Ethers(network) } /** * @returns Ethers service instance */ - get getEthers(): Ethers { - return this.ethers + get ethers(): Ethers { + return this._ethers } /** * Get the static instance of the provider * @returns Provider */ - static get getInstance(): Provider { - if (Provider.instance === undefined) { + static get instance(): Provider { + if (Provider._instance === undefined) { throw new Error('Provider is not initialized') } - return Provider.instance + return Provider._instance } /** @@ -62,7 +63,7 @@ export class Provider implements Omit { * @param network - Network configuration of the provider */ static initialize(network: EvmNetworkConfigInterface): void { - Provider.instance = new Provider(network) + Provider._instance = new Provider(network) } /** @@ -71,7 +72,8 @@ export class Provider implements Omit { */ update(network: EvmNetworkConfigInterface): void { this.network = network - this.ethers = new Ethers(network) + Provider._instance = this + this._ethers = new Ethers(network) } /** diff --git a/packages/networks/evm-chains/tests/models.spec.ts b/packages/networks/evm-chains/tests/models.spec.ts index 748ec48..7d82624 100644 --- a/packages/networks/evm-chains/tests/models.spec.ts +++ b/packages/networks/evm-chains/tests/models.spec.ts @@ -1,7 +1,16 @@ import { describe, it, expect } from 'vitest' +import { Transaction } from '../src/models/Transaction.ts' + +const txId = '0x566002399664e92f82ed654c181095bdd7ff3d3f1921d963257585891f622251' + describe('Tests for models', () => { - it('should load models', async () => { - expect(1).toBe(1) + const tx = new Transaction(txId) + it('Transaction Id', async () => { + expect(tx.getId()).toBe(txId) + }) + + it('Transaction Data', async () => { + expect(await tx.getData()).toBeTypeOf('object') }) }) diff --git a/packages/networks/evm-chains/tests/setup.ts b/packages/networks/evm-chains/tests/setup.ts new file mode 100644 index 0000000..59e6837 --- /dev/null +++ b/packages/networks/evm-chains/tests/setup.ts @@ -0,0 +1,15 @@ +import { Provider } from '../src/services/Provider.ts' + +export const provider = new Provider({ + id: 11155111, + hexId: '0xaa36a7', + mainnetId: 1, + name: 'Ethereum Sepolia Testnet (QR)', + rpcUrl: 'https://sepolia.infura.io/v3/9aa3d95b3bc440fa88ea12eaa4456161', + wsUrl: 'wss://sepolia.infura.io/ws/v3/9aa3d95b3bc440fa88ea12eaa4456161', + explorerUrl: 'https://sepolia.etherscan.io/', + nativeCurrency: { + symbol: 'ETH', + decimals: 18 + } +}) diff --git a/vitest.config.ts b/vitest.config.ts index 318a4a0..791dee3 100644 --- a/vitest.config.ts +++ b/vitest.config.ts @@ -8,7 +8,8 @@ export default mergeConfig( test: { environment: 'jsdom', exclude: [...configDefaults.exclude, 'e2e/*'], - root: fileURLToPath(new URL('./', import.meta.url)) + root: fileURLToPath(new URL('./', import.meta.url)), + setupFiles: ['./packages/networks/evm-chains/tests/setup.ts'] } }) )