From f1f897d56f1795ca17b96bfc3f87393c9456e0e7 Mon Sep 17 00:00:00 2001 From: Lukas Kotol Date: Mon, 12 Feb 2024 10:58:38 +0100 Subject: [PATCH] ALL-4448 - Add Solana lb for archive methods --- CHANGELOG.md | 6 +++ package.json | 2 +- src/e2e/rpc/other/tatum.rpc.solana.spec.ts | 39 +++++++++---------- ...Rpc.ts => SolanaArchiveLoadBalancerRpc.ts} | 21 ++++++++-- src/util/util.shared.ts | 4 +- 5 files changed, 46 insertions(+), 26 deletions(-) rename src/service/rpc/other/{SolanaLoadBalancerRpc.ts => SolanaArchiveLoadBalancerRpc.ts} (63%) diff --git a/CHANGELOG.md b/CHANGELOG.md index 343279c9d7..ec39f42a55 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,9 @@ +## [4.2.6] - 2024.2.12 + +### Added + +- Added support for Solana load balancer based on the method name. + ## [4.2.5] - 2024.1.31 ### Added diff --git a/package.json b/package.json index b33d5181d8..897c966d10 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@tatumio/tatum", - "version": "4.2.5", + "version": "4.2.6", "description": "Tatum JS SDK", "author": "Tatum", "repository": "https://github.com/tatumio/tatum-js", diff --git a/src/e2e/rpc/other/tatum.rpc.solana.spec.ts b/src/e2e/rpc/other/tatum.rpc.solana.spec.ts index 8c7e79d0ff..c81ad76368 100644 --- a/src/e2e/rpc/other/tatum.rpc.solana.spec.ts +++ b/src/e2e/rpc/other/tatum.rpc.solana.spec.ts @@ -59,26 +59,6 @@ describe('Solana', () => { }) }) - // Too unstable - describe.skip('getBlock', () => { - it('should return a recent block', async () => { - const tatum = await getClient() - const { result: slot } = await tatum.rpc.getSlot() - const { result } = await tatum.rpc.getBlock(slot || 0, { - encoding: Encoding.JsonParsed, - maxSupportedTransactionVersion: 0, - }) - await tatum.destroy() - expect(result).toHaveProperty('blockhash') - expect(result?.blockhash).toBeTruthy() - expect(result?.previousBlockhash).toBeTruthy() - expect(result?.blockHeight).toBeGreaterThan(0) - expect(result?.parentSlot).toBeGreaterThan(0) - expect(result?.blockTime).toBeGreaterThan(0) - expect(Array.isArray(result?.transactions)).toBe(true) - }) - }) - describe('getBlockProduction', () => { it('should return block production information', async () => { const tatum = await getClient() @@ -410,5 +390,24 @@ describe('Solana', () => { expect(result?.totalStake).toBeGreaterThan(0) }) }) + + describe('getBlock', () => { + it('should return a recent block', async () => { + const tatum = await getClient(true) + const { result: slot } = await tatum.rpc.getSlot() + const { result } = await tatum.rpc.getBlock(slot || 0, { + encoding: Encoding.JsonParsed, + maxSupportedTransactionVersion: 0, + }) + await tatum.destroy() + expect(result).toHaveProperty('blockhash') + expect(result?.blockhash).toBeTruthy() + expect(result?.previousBlockhash).toBeTruthy() + expect(result?.blockHeight).toBeGreaterThan(0) + expect(result?.parentSlot).toBeGreaterThan(0) + expect(result?.blockTime).toBeGreaterThan(0) + expect(Array.isArray(result?.transactions)).toBe(true) + }) + }) }) }) diff --git a/src/service/rpc/other/SolanaLoadBalancerRpc.ts b/src/service/rpc/other/SolanaArchiveLoadBalancerRpc.ts similarity index 63% rename from src/service/rpc/other/SolanaLoadBalancerRpc.ts rename to src/service/rpc/other/SolanaArchiveLoadBalancerRpc.ts index ce88c0f4e3..a862f519b4 100644 --- a/src/service/rpc/other/SolanaLoadBalancerRpc.ts +++ b/src/service/rpc/other/SolanaArchiveLoadBalancerRpc.ts @@ -8,11 +8,11 @@ import { AbstractSolanaRpc } from './AbstractSolanaRpc' @Service({ factory: (data: { id: string }) => { - return new SolanaLoadBalancerRpc(data.id) + return new SolanaArchiveLoadBalancerRpc(data.id) }, transient: true, }) -export class SolanaLoadBalancerRpc extends AbstractSolanaRpc implements SolanaRpcSuite { +export class SolanaArchiveLoadBalancerRpc extends AbstractSolanaRpc implements SolanaRpcSuite { protected readonly loadBalancer: LoadBalancer constructor(id: string) { @@ -22,7 +22,22 @@ export class SolanaLoadBalancerRpc extends AbstractSolanaRpc implements SolanaRp protected async rpcCall(method: string, params?: unknown[]): Promise { const preparedCall = Utils.prepareRpcCall(method, params) - return (await this.loadBalancer.rawRpcCall(preparedCall)) as T + const isArchive = this.isArchiveMethod(preparedCall) + return (await this.loadBalancer.rawRpcCall(preparedCall, isArchive)) as T + } + + private isArchiveMethod(body: JsonRpcCall): boolean { + const archiveMethods = [ + 'getBlock', + 'getBlocks', + 'getBlocksWithLimit', + 'getBlockTime', + 'getInflationReward', + 'getProgramAccounts', + 'getSignaturesForAddress', + 'getConfirmedSignaturesForAddress2', + ] + return archiveMethods.some((method) => body.method.includes(method)) } async rawRpcCall(body: JsonRpcCall): Promise> { diff --git a/src/util/util.shared.ts b/src/util/util.shared.ts index bc34b7c375..29f16fff61 100644 --- a/src/util/util.shared.ts +++ b/src/util/util.shared.ts @@ -94,7 +94,7 @@ import { BnbLoadBalancerRpc } from '../service/rpc/other/BnbLoadBalancerRpc' import { CardanoLoadBalancerRpc } from '../service/rpc/other/CardanoLoadBalancerRpc' import { EosLoadBalancerRpc } from '../service/rpc/other/EosLoadBalancerRpc' import { EosRpc } from '../service/rpc/other/EosRpc' -import { SolanaLoadBalancerRpc } from '../service/rpc/other/SolanaLoadBalancerRpc' +import { SolanaArchiveLoadBalancerRpc } from '../service/rpc/other/SolanaArchiveLoadBalancerRpc' import { StellarLoadBalancerRpc } from '../service/rpc/other/StellarLoadBalancerRpc' import { StellarRpc } from '../service/rpc/other/StellarRpc' import { TezosLoadBalancerRpc } from '../service/rpc/other/TezosLoadBalancerRpc' @@ -178,7 +178,7 @@ export const Utils = { } if (isSolanaNetwork(network)) { - return Container.of(id).get(SolanaLoadBalancerRpc) as T + return Container.of(id).get(SolanaArchiveLoadBalancerRpc) as T } if (isTronLoadBalancerNetwork(network)) {