This repository provides open source access to SolToolkit (Typescript) SDK.
npm i @solworks/soltoolkit-sdk
ConnectionManager is a singleton class that manages web3.js Connection(s). It takes the following parameters on initialization using the async getInstance()
method:
{
network: Cluster;
endpoint?: string;
endpoints?: string[];
config?: ConnectionConfig;
commitment?: Commitment;
mode?: Mode;
}
-
network
is the cluster to connect to, possible values are 'mainnet-beta', 'testnet', 'devnet', 'localnet'. This is required. If you do not pass in any values forendpoint
orendpoints
, the default endpoints for the network will be used. -
endpoint
is a single endpoint to connect to. This is optional. -
endpoints
is an array of endpoints to connect to. This is optional. -
config
is a web3.js ConnectionConfig object. This is optional. -
commitment
is the commitment level to use for transactions. This is optional, will default to 'max'. -
mode
is the Mode for the ConnectionManager. This is optional, will default to 'single'. Possible values are:- 'single' - Uses the
endpoint
param, that falls back to the first endpoint provided inendpoints
, that falls back to the default endpoints for the network. - 'first' - Uses the first endpoint provided in
endpoints
. Throws an error if no endpoints are provided. - 'last' - Uses the last endpoint provided in
endpoints
. Throws an error if no endpoints are provided. - 'round-robin' - Uses the endpoints provided in
endpoints
in a round-robin fashion (cycles through each endpoint in sequence starting from the first). Throws an error if no endpoints are provided. - 'random' - Uses a random endpoint provided in
endpoints
. Throws an error if no endpoints are provided. - 'fastest' - Uses the fastest endpoint provided in
endpoints
. Throws an error if no endpoints are provided. - 'highest-slot' - Uses the endpoint with the highest slot provided in
endpoints
. Throws an error if no endpoints are provided.
- 'single' - Uses the
-
getInstance()
- Returns the singleton instance of the ConnectionManager. This method is async and must be awaited. -
getInstanceSync()
- Returns the singleton instance of the ConnectionManager. This method is synchronous. This method should only be used after initializing the ConnectionManager withgetInstance()
. -
conn()
- Returns a web3.js connection. This method will update the summary for each RPC to determine the 'fastest' or 'highest slot' endpoint. This method is async and must be awaited. -
connSync()
- Returns a web3.js connection. This method will use fastest' or 'highest slot' endpoint determined during initialization. This method is synchronous.
import { ConnectionManager } from "@solworks/soltoolkit-sdk";
(async () => {
// create connection manager
const cm = await ConnectionManager.getInstance({
commitment: "max",
endpoints: [
"https://api.devnet.solana.com",
"https://solana-devnet-rpc.allthatnode.com",
"https://mango.devnet.rpcpool.com",
"https://rpc.ankr.com/solana_devnet",
],
mode: "fastest",
network: "devnet"
});
// get fastest endpoint
const fastestEndpoint = cm._fastestEndpoint;
console.log(`Fastest endpoint: ${fastestEndpoint}`);
})();
import { ConnectionManager, Logger } from "@solworks/soltoolkit-sdk";
(async () => {
// create connection manager
const cm = await ConnectionManager.getInstance({
commitment: "max",
endpoints: [
"https://api.devnet.solana.com",
"https://solana-devnet-rpc.allthatnode.com",
"https://mango.devnet.rpcpool.com",
"https://rpc.ankr.com/solana_devnet",
],
mode: "highest-slot",
network: "devnet"
});
// get highest slot endpoint
const highestSlotEndpoint = cm._highestSlotEndpoint;
console.log(`Highest slot endpoint: ${_highestSlotEndpoint}`);
})();
import { ConnectionManager, Logger } from "@solworks/soltoolkit-sdk";
(async () => {
const logger = new Logger("example");
// create connection manager
const cm = await ConnectionManager.getInstance({
commitment: "max",
endpoints: [
"https://api.devnet.solana.com",
"https://solana-devnet-rpc.allthatnode.com",
"https://mango.devnet.rpcpool.com",
"https://rpc.ankr.com/solana_devnet",
],
mode: "fastest",
network: "devnet"
});
// get summary of endpoint speeds
const summary = await cm.getEndpointsSummary();
logger.debug(JSON.stringify(summary, null, 2));
})();
import { Keypair, LAMPORTS_PER_SOL, Signer } from "@solana/web3.js";
import {
ConnectionManager,
TransactionBuilder,
TransactionWrapper,
Logger
} from "@solworks/soltoolkit-sdk";
const logger = new Logger("example");
const sender = Keypair.generate();
const receiver = Keypair.generate();
(async () => {
// create connection manager
const cm = await ConnectionManager.getInstance({
commitment: COMMITMENT,
endpoints: [
"https://api.devnet.solana.com",
"https://solana-devnet-rpc.allthatnode.com",
"https://mango.devnet.rpcpool.com",
"https://rpc.ankr.com/solana_devnet",
],
mode: "fastest",
network: "devnet",
});
// airdrop sol to the generated address
const airdropSig = await cm
.connSync({ airdrop: true })
.requestAirdrop(sender.publicKey, LAMPORTS_PER_SOL);
// confirm airdrop tx
await TransactionWrapper.confirmTx({
connectionManager: cm,
changeConn: false,
signature: airdropSig,
commitment: "max",
});
// create builder and add token transfer ix
var builder = TransactionBuilder
.create()
.addSolTransferIx({
from: sender.publicKey,
to: receiver.publicKey,
amountLamports: 10_000_000,
})
.addMemoIx({
memo: "gm",
signer: sender.publicKey,
});
// build the transaction
// returns a transaction with no fee payer or blockhash
let tx = builder.build();
// feed transaction into TransactionWrapper
const wrapper = await TransactionWrapper.create({
connectionManager: cm,
transaction: tx,
signer: sender.publicKey,
}).addBlockhashAndFeePayer();
// sign the transaction
const signedTx = await wrapper.sign({
signer: sender as Signer,
});
// send and confirm the transaction
const transferSig = await wrapper.sendAndConfirm({
serialisedTx: signedTx.serialize(),
});
})();
import { Keypair, LAMPORTS_PER_SOL, Signer } from "@solana/web3.js";
import {
ConnectionManager,
TransactionBuilder,
TransactionWrapper,
Logger
} from "@solworks/soltoolkit-sdk";
const logger = new Logger("example");
const sender = Keypair.generate();
const receiver = Keypair.generate();
(async () => {
// create connection manager
const cm = await ConnectionManager.getInstance({
commitment: COMMITMENT,
endpoints: [
"https://api.devnet.solana.com",
"https://solana-devnet-rpc.allthatnode.com",
"https://mango.devnet.rpcpool.com",
"https://rpc.ankr.com/solana_devnet",
],
mode: "fastest",
network: "devnet",
});
// airdrop sol to the generated address
const airdropSig = await cm
.connSync({ airdrop: true })
.requestAirdrop(sender.publicKey, LAMPORTS_PER_SOL);
// confirm airdrop tx
await TransactionWrapper.confirmTx({
connectionManager: cm,
changeConn: false,
signature: airdropSig,
commitment: "max",
});
// create builder and add token transfer ix
var builder = TransactionBuilder
.create()
.addMemoIx({
memo: "gm",
signer: sender.publicKey,
});
// build the transaction
// returns a transaction with no fee payer or blockhash
let tx = builder.build();
// feed transaction into TransactionWrapper
const wrapper = await TransactionWrapper.create({
connectionManager: cm,
transaction: tx,
signer: sender.publicKey,
}).addBlockhashAndFeePayer();
// sign the transaction
const signedTx = await wrapper.sign({
signer: sender as Signer,
});
// send and confirm the transaction
const transferSig = await wrapper.sendAndConfirm({
serialisedTx: signedTx.serialize(),
});
See example.
SolToolkit is licensed under Affero GPL.