Abstraction over getting account updates from Solana. Supports RPC out of the box but can support other protocols through custom implementations.
npm i @staratlas/data-source
import { Connection } from '@solana/web3.js';
import { readAllFromRPC } from '@staratlas/data-source';
import { Fleet, SageIDLProgram } from '@staratlas/sage';
export async function readAllFleetsWarpStatus(
connection: Connection,
sageProgram: SageIDLProgram
): Promise<void> {
const fleets = (await readAllFromRPC(connection, sageProgram, Fleet)).map(
(fleet) => fleet.type === 'ok' && fleet.data
);
const currentUnixTimestamp = Date.now() / 1000 | 0;
for (const fleet of fleets) {
const secondsUntilWarpable = fleet.data.warpCooldownExpiresAt.toNumber() - currentUnixTimestamp;
if (secondsUntilWarpable > 0)
console.log(`Fleet ${fleet.key.toBase58()} can warp again in ${secondsUntilWarpable} seconds`);
else
console.log(`Fleet ${fleet.key.toBase58()} warp engines are ready to use`);
}
}
import { Connection, Finality, TransactionSignature } from '@solana/web3.js';
import {
AsyncSigner,
buildDynamicTransactions,
InstructionReturn,
sendTransaction,
} from '@staratlas/data-source';
export async function sendDynamicTransaction(
instructions: InstructionReturn[],
signer: AsyncSigner,
connection: Connection,
commitment: Finality = 'confirmed'
): Promise<TransactionSignature> {
const txs = await buildDynamicTransactions(instructions, signer, {
connection,
});
if (txs.isErr()) {
throw txs.error;
}
let txSignature: TransactionSignature;
for (const tx of txs.value) {
const result = await sendTransaction(tx, connection, {
commitment,
sendOptions: {
skipPreflight: false,
},
});
if (result.value.isErr()) {
throw result.value.error;
}
txSignature = result.value.value;
}
return txSignature;
}