Mysten Labs SDKs

JsonRpcClient

The Sui JSON RPC API has been deprecated, but is still heavily used across the Sui ecosystem. A new version of the @mysten/sui SDK will be released soon with better support for the gRPC and GraphQL APIs. Until this is ready, the SuiJsonRpcClient can still be used when working with SDKs that depend on SuiClient.

The SuiGrpcClient and SuiGraphQLClient can already be used for most read use-cases and will be fully supported by all Mysten SDKs in the near future.

The Sui TypeScript SDK provides a SuiJsonRpcClient class (exported as SuiClient for backward compatibility) to connect to a network's JSON-RPC server.

Throughout the documentation, you may see references to SuiClient. This is an alias for SuiJsonRpcClient and can be used interchangeably.

Connecting to a Sui network

To establish a connection to a network, import SuiJsonRpcClient from @mysten/sui/jsonRpc and pass the relevant URL to the url parameter. The following example establishes a connection to Devnet and get all Coin<coin_type> objects owned by an address.

import { SuiJsonRpcClient } from '@mysten/sui/jsonRpc';

// create a client connected to devnet
const client = new SuiJsonRpcClient({
	url: 'https://fullnode.devnet.sui.io:443',
});

// get coins owned by an address
// replace <OWNER_ADDRESS> with actual address in the form of 0x123...
await client.getCoins({
	owner: '<OWNER_ADDRESS>',
});

Alternatively, you can use the SuiClient alias from @mysten/sui/client for backward compatibility:

import { SuiClient } from '@mysten/sui/client';

const client = new SuiClient({
	url: 'https://fullnode.devnet.sui.io:443',
});

Network URLs:

  • localnet: http://127.0.0.1:9000
  • devnet: https://fullnode.devnet.sui.io:443
  • testnet: https://fullnode.testnet.sui.io:443

For local development, you can run cargo run --bin sui -- start --with-faucet --force-regenesis to spin up a local network with a local validator, a Full node, and a faucet server. Refer to the Local Network guide for more information.

Manually calling unsupported RPC methods

You can use SuiJsonRpcClient to call any RPC method the node you're connecting to exposes. Most RPC methods are built into SuiJsonRpcClient, but you can use call to leverage any methods available in the RPC.

import { SuiJsonRpcClient } from '@mysten/sui/jsonRpc';

const client = new SuiJsonRpcClient({
	url: 'https://fullnode.devnet.sui.io:443',
});

// asynchronously call suix_getCommitteeInfo
const committeeInfo = await client.call('suix_getCommitteeInfo', []);

For a full list of available RPC methods, see the RPC documentation.

Customizing the transport

The SuiJsonRpcClient uses a Transport class to manage connections to the RPC node. The default SuiHTTPTransport (alias for JsonRpcHTTPTransport) makes both JSON RPC requests, as well as websocket requests for subscriptions. You can construct a custom transport instance if you need to pass any custom options, such as headers or timeout values.

import { SuiJsonRpcClient, JsonRpcHTTPTransport } from '@mysten/sui/jsonRpc';

const client = new SuiJsonRpcClient({
	transport: new JsonRpcHTTPTransport({
		url: 'https://fullnode.devnet.sui.io:443',
		websocket: {
			reconnectTimeout: 1000,
			url: 'wss://fullnode.devnet.sui.io:443',
		},
		rpc: {
			headers: {
				'x-custom-header': 'custom value',
			},
		},
	}),
});

Pagination

SuiJsonRpcClient exposes a number of RPC methods that return paginated results. These methods return a result object with 3 fields:

  • data: The list of results for the current page
  • nextCursor: a cursor pointing to the next page of results
  • hasNextPage: a boolean indicating whether there are more pages of results

Some APIs also accept an order option that can be set to either ascending or descending to change the order in which the results are returned.

You can pass the nextCursor to the cursor option of the RPC method to retrieve the next page, along with a limit to specify the page size:

const page1 = await client.getCheckpoints({
	descendingOrder: false,
	limit: 10,
});

const page2 =
	page1.hasNextPage &&
	(await client.getCheckpoints({
		descendingOrder: false,
		cursor: page1.nextCursor,
		limit: 10,
	}));

Methods

In addition to the RPC methods mentioned above, SuiJsonRpcClient also exposes some methods for working with Transactions.

executeTransactionBlock

const tx = new Transaction();

// add transaction data to tx...

const { bytes, signature } = await tx.sign({ client, signer: keypair });

const result = await client.executeTransactionBlock({
	transactionBlock: bytes,
	signature,
	options: {
		showEffects: true,
	},
});

Arguments

  • transactionBlock - either a Transaction or BCS serialized transaction data bytes as a Uint8Array or as a base-64 encoded string.
  • signature - A signature, or list of signatures committed to the intent message of the transaction data, as a base-64 encoded string.
  • options:
    • showBalanceChanges: Whether to show balance_changes. Default to be False
    • showEffects: Whether to show transaction effects. Default to be False
    • showEvents: Whether to show transaction events. Default to be False
    • showInput: Whether to show transaction input data. Default to be False
    • showObjectChanges: Whether to show object_changes. Default to be False
    • showRawInput: Whether to show bcs-encoded transaction input data

signAndExecuteTransaction

const tx = new Transaction();

// add transaction data to tx...

const result = await client.signAndExecuteTransaction({
	transaction: tx,
	signer: keypair,
	options: {
		showEffects: true,
	},
});

Arguments

  • transaction - BCS serialized transaction data bytes as a Uint8Array or as a base-64 encoded string.
  • signer - A Keypair instance to sign the transaction
  • options:
    • showBalanceChanges: Whether to show balance_changes. Default to be False
    • showEffects: Whether to show transaction effects. Default to be False
    • showEvents: Whether to show transaction events. Default to be False
    • showInput: Whether to show transaction input data. Default to be False
    • showObjectChanges: Whether to show object_changes. Default to be False
    • showRawInput: Whether to show bcs-encoded transaction input data

waitForTransaction

Wait for a transaction result to be available over the API. This can be used in conjunction with signAndExecuteTransaction to wait for the transaction to be available via the API. This currently polls the getTransactionBlock API to check for the transaction.

const tx = new Transaction();

const result = await client.signAndExecuteTransaction({
	transaction: tx,
	signer: keypair,
});

const transaction = await client.waitForTransaction({
	digest: result.digest,
	options: {
		showEffects: true,
	},
});

Arguments

  • digest - the digest of the queried transaction
  • signal - An optional abort signal that can be used to cancel the request
  • timeout - The amount of time to wait for a transaction. Defaults to one minute.
  • pollInterval - The amount of time to wait between checks for the transaction. Defaults to 2 seconds.
  • options:
    • showBalanceChanges: Whether to show balance_changes. Default to be False
    • showEffects: Whether to show transaction effects. Default to be False
    • showEvents: Whether to show transaction events. Default to be False
    • showInput: Whether to show transaction input data. Default to be False
    • showObjectChanges: Whether to show object_changes. Default to be False
    • showRawInput: Whether to show bcs-encoded transaction input data