Prerequisite
The JS SDK is available at .
Add the Sova SDK by running:
Copy npm install @sova-labs/sdk
CAUTION: By default, each searcher enforces a limit of 5 requests per second. If you need to have a higher limit, you can send a request to hello@sova.network.
Create a SovaClient Instance for Testnet
Copy import {getTestnetClient, SovaClient} from "@sova-labs/sdk";
const sovaClient: SovaClient = getTestnetClient();
Authenticate the Client
If you need authenticated access, you can sign the challenge provided by the Sova Engine using your ED25519 private key. Replace the dummy private key with your actual 32-byte ED25519 key. If you choose to skip authentication, simply do not call this method.
Copy import {getTestnetClient, SovaClient} from "@sova-labs/sdk";
const sovaClient: SovaClient = getTestnetClient();
const dummyPrivateKey = Buffer.from([]);
sovaClient.authenticate(dummyPrivateKey);
Subscribe by addresses
Copy import {getTestnetClient, SovaClient} from "@sova-labs/sdk";
const sovaClient: SovaClient = getTestnetClient();
const searcher = sovaClient.getSearcher();
const stream = searcher.subscribeByAddresses([
"address 1",
"address 2",
]);
stream.on('data', (response) => {
console.log('Mempool packet received', response);
});
stream.on('end', () => {
console.log('Stream ended.');
});
stream.on('error', (error) => {
console.error('Stream error:', error);
});
stream.on('status', (status) => {
console.log('Stream status:', status);
});
Subscribe by Workchain
Copy import {getTestnetClient, SovaClient} from "@sova-labs/sdk";
const sovaClient: SovaClient = getTestnetClient();
const searcher = sovaClient.getSearcher();
const stream = searcher.subscribeByWorkchain(0);
stream.on('data', (response) => {
console.log('Mempool packet received', response);
});
stream.on('end', () => {
console.log('Stream ended.');
});
stream.on('error', (error) => {
console.error('Stream error:', error);
});
stream.on('status', (status) => {
console.log('Stream status:', status);
});
Subscribe by Workchain shard
Copy import {getTestnetClient, SovaClient} from "@sova-labs/sdk";
const sovaClient: SovaClient = getTestnetClient();
const searcher = sovaClient.getSearcher();
const stream = searcher.subscribeByWorkchainShard(
0,
Buffer.from('E000000000000000', 'hex')
);
stream.on('data', (response) => {
console.log('Mempool packet received', response);
});
stream.on('end', () => {
console.log('Stream ended.');
});
stream.on('error', (error) => {
console.error('Stream error:', error);
});
stream.on('status', (status) => {
console.log('Stream status:', status);
});
Subscribe by external out message body opcode
Copy import {getTestnetClient, SovaClient} from "@sova-labs/sdk";
const sovaClient: SovaClient = getTestnetClient();
const searcher = sovaClient.getSearcher();
const stream = searcher.subscribeByExternalOutMessageOpcode(
0,
Buffer.from('E000000000000000', 'hex'),
42
);
stream.on('data', (response) => {
console.log('Mempool packet received', response);
});
stream.on('end', () => {
console.log('Stream ended.');
});
stream.on('error', (error) => {
console.error('Stream error:', error);
});
stream.on('status', (status) => {
console.log('Stream status:', status);
});
Subscribe by internal message body opcode
Copy import {getTestnetClient, SovaClient} from "@sova-labs/sdk";
const sovaClient: SovaClient = getTestnetClient();
const searcher = sovaClient.getSearcher();
const stream = searcher.subscribeByInternalMessageOpcode(
0,
Buffer.from('E000000000000000', 'hex'),
42
);
stream.on('data', (response) => {
console.log('Mempool packet received', response);
});
stream.on('end', () => {
console.log('Stream ended.');
});
stream.on('error', (error) => {
console.error('Stream error:', error);
});
stream.on('status', (status) => {
console.log('Stream status:', status);
});
Bundles Submission
Bundles Results tracking