Skip to content
This repository has been archived by the owner on Jan 13, 2025. It is now read-only.

Commit

Permalink
Add isSolanaRequest helper (#3195)
Browse files Browse the repository at this point in the history
This PR adds a new `isSolanaRequest` helper function that checks if a given `RpcRequest` comes from the Solana RPC API.

This will be used — in a subsequent PR — to create a new Solana-RPC-specific HTTP transport that prevents loss of precision for large integers.
  • Loading branch information
lorisleiva authored Sep 11, 2024
1 parent 6b43588 commit 89a25aa
Show file tree
Hide file tree
Showing 2 changed files with 81 additions and 0 deletions.
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
import { isSolanaRequest } from '../is-solana-request';

describe('isSolanaRequest', () => {
it('returns true if the method name is from the Solana RPC API', () => {
const payload = { jsonrpc: '2.0', method: 'getBalance', params: ['1234..5678'] };
expect(isSolanaRequest(payload)).toBe(true);
});
it('returns false if the method name is not from the Solana RPC API', () => {
const payload = { jsonrpc: '2.0', method: 'getAssetsByAuthority', params: ['1234..5678'] };
expect(isSolanaRequest(payload)).toBe(false);
});
});
69 changes: 69 additions & 0 deletions packages/rpc-transport-http/src/is-solana-request.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,69 @@
import { isJsonRpcPayload } from '@solana/rpc-spec';

const SOLANA_RPC_METHODS = [
'getAccountInfo',
'getBalance',
'getBlock',
'getBlockCommitment',
'getBlockHeight',
'getBlockProduction',
'getBlocks',
'getBlocksWithLimit',
'getBlockTime',
'getClusterNodes',
'getEpochInfo',
'getEpochSchedule',
'getFeeForMessage',
'getFirstAvailableBlock',
'getGenesisHash',
'getHealth',
'getHighestSnapshotSlot',
'getIdentity',
'getInflationGovernor',
'getInflationRate',
'getInflationReward',
'getLargestAccounts',
'getLatestBlockhash',
'getLeaderSchedule',
'getMaxRetransmitSlot',
'getMaxShredInsertSlot',
'getMinimumBalanceForRentExemption',
'getMultipleAccounts',
'getProgramAccounts',
'getRecentPerformanceSamples',
'getRecentPrioritizationFees',
'getSignaturesForAddress',
'getSignatureStatuses',
'getSlot',
'getSlotLeader',
'getSlotLeaders',
'getStakeActivation',
'getStakeMinimumDelegation',
'getSupply',
'getTokenAccountBalance',
'getTokenAccountsByDelegate',
'getTokenAccountsByOwner',
'getTokenLargestAccounts',
'getTokenSupply',
'getTransaction',
'getTransactionCount',
'getVersion',
'getVoteAccounts',
'index',
'isBlockhashValid',
'minimumLedgerSlot',
'requestAirdrop',
'sendTransaction',
'simulateTransaction',
] as const;

/**
* Helper function that checks if a given `RpcRequest` comes from the Solana RPC API.
*/
export function isSolanaRequest(payload: unknown): payload is Readonly<{
jsonrpc: '2.0';
method: (typeof SOLANA_RPC_METHODS)[number];
params: unknown;
}> {
return isJsonRpcPayload(payload) && (SOLANA_RPC_METHODS as readonly string[]).includes(payload.method);
}

0 comments on commit 89a25aa

Please sign in to comment.