UNPKG

@mysten/sui

Version:
236 lines (184 loc) 7.79 kB
# SuiJsonRpcClient > Connect to Sui via JSON-RPC with SuiJsonRpcClient > **Warning:** The Sui JSON-RPC API has been deprecated. We recommend migration to > [SuiGrpcClient](/sui/clients/grpc) or [SuiGraphQLClient](/sui/clients/graphql) as soon as > possible. The `SuiJsonRpcClient` connects to a Sui network's JSON-RPC server. It implements the [Core API](/sui/clients/core), so it can be used with any SDK that accepts `ClientWithCoreApi`. ```typescript const client = new SuiJsonRpcClient({ url: getJsonRpcFullnodeUrl('mainnet'), network: 'mainnet', }); // Use the Core API const { object } = await client.core.getObject({ objectId: '0x...' }); ``` ## Connecting to a Sui network To establish a connection to a network, import `SuiJsonRpcClient` from `@mysten/sui/client` 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. ```typescript // use getJsonRpcFullnodeUrl to define Devnet RPC location const rpcUrl = getJsonRpcFullnodeUrl('devnet'); // create a client connected to devnet const client = new SuiJsonRpcClient({ url: rpcUrl, network: 'devnet' }); // get coins owned by an address // replace <OWNER_ADDRESS> with actual address in the form of 0x123... await client.getCoins({ owner: '<OWNER_ADDRESS>', }); ``` 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](https://docs.sui.io/guides/developer/getting-started/local-network) 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. ```typescript 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](https://docs.sui.io/references/sui-api). ## 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. ```typescript 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: ```ts 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` ```tsx 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` ```tsx const tx = new Transaction(); // add transaction data to tx... const result = await client.signAndExecuteTransaction({ transaction: tx, signer: keypair, options: { showEffects: true, }, }); // IMPORTANT: Always check the transaction status if (result.$kind === 'FailedTransaction') { throw new Error(`Transaction failed: ${result.FailedTransaction.status.error?.message}`); } ``` #### 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. ```tsx const tx = new Transaction(); const result = await client.signAndExecuteTransaction({ transaction: tx, signer: keypair, }); // Check transaction status if (result.$kind === 'FailedTransaction') { throw new Error(`Transaction failed: ${result.FailedTransaction.status.error?.message}`); } const transaction = await client.waitForTransaction({ digest: result.Transaction.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