Sui Dart SDK

Pub

⚠️ JSON-RPC is being decommissioned by Sui (public endpoints shut down July 2026, fully off 2026-07-31). Use the new gRPC-web client (SuiGrpcClient) for reads/writes and GraphQL (SuiGraphQLClient) for advanced queries — see gRPC-web API (recommended) below. The legacy SuiClient (JSON-RPC) API is kept for compatibility but is @Deprecated and will stop working.

Note: This branch is in active development and may introduce breaking changes. If you don’t need Transaction v2 feature, use the v1 branch.

Installation

dependencies:
  sui: ^0.4.0

Demo

https://sui-dart.pages.dev/

Accounts

SuiAccount is transport-agnostic — it works with both the new and legacy clients.

Create account with private key

/// Ed25519 account
final ed25519 = SuiAccount.ed25519Account();
final ed25519Import = SuiAccount.fromPrivateKey(ed25519.privateKey());

/// Secp256k1 account
final secp256k1 = SuiAccount.secp256k1Account();
final sepc256k1Import = SuiAccount.fromPrivateKey(secp256k1.privateKey());

/// Secp256r1 account
final secp256r1 = SuiAccount.secp256r1Account();
final sepc256r1Import = SuiAccount.fromPrivateKey(secp256r1.privateKey());

Create account with mnemonic

/// create mnemonics
final mnemonics = SuiAccount.generateMnemonic();

/// Ed25519 account
final ed25519 = SuiAccount.fromMnemonics(mnemonics, SignatureScheme.Ed25519);

/// Secp256k1 account
final secp256k1 = SuiAccount.fromMnemonics(mnemonics, SignatureScheme.Secp256k1);

/// Secp256r1 account
final secp256r1 = SuiAccount.fromMnemonics(mnemonics, SignatureScheme.Secp256r1);

The SuiGrpcClient talks to Sui full nodes over gRPC-web — it works uniformly on Mobile, Web and Desktop (no proxy required) and replaces the deprecated JSON-RPC client.

Connecting

import 'package:sui/sui.dart';

final client = SuiGrpcClient(network: SuiNetwork.testnet);
// networks: SuiNetwork.mainnet | testnet | devnet | localnet

Faucet (testnet)

The faucet only serves /v2/gas now (v0/v1 are removed) and is rate-limited.

import 'package:dio/dio.dart';

await Dio().post('https://faucet.testnet.sui.io/v2/gas',
    data: {'FixedAmountRequest': {'recipient': account.getAddress()}});

Reading

// Balance / coins (transport-neutral models)
final balance = await client.balanceOf(owner);        // SuiBalance
final coins   = await client.listCoins(owner);        // SuiCoinPage

// Objects
final object  = await client.objectInfo(objectId);    // SuiObjectInfo
final objects = await client.getObjects([id1, id2]);  // raw proto (batch)

// Transactions
final tx = await client.getTransaction(digest);
await client.waitForTransaction(digest);              // poll until available

// Chain / system
final gasPrice    = await client.getReferenceGasPrice();
final systemState = await client.getCurrentSystemState();
final epoch       = await client.getEpoch();

// Dynamic fields (name derived on-chain)
final field = await client.getDynamicFieldObject(parentId, 'u64', nameBcs);

Writing (auto gas)

signAndExecuteTransaction handles gas price, gas-coin selection and budget estimation (via simulateTransaction) for you.

final account = SuiAccount.ed25519Account(); // fund it first (see Faucet above)

final tx = Transaction();
final coin = tx.splitCoins(tx.gas, [tx.pureInt(1000000)]);
tx.transferObjects([coin], tx.pureAddress(account.getAddress()));

final executed = await client.signAndExecuteTransaction(account, tx);
print('${executed.digest} success=${executed.effects.status.success}');

Move call (with an object argument, and optional Move Registry @org/app names):

final tx = Transaction();
tx.moveCall('0x2::clock::timestamp_ms', arguments: [tx.object('0x6')]);
// MVR names like '@org/app::module::fn' are auto-resolved on build.
final executed = await client.signAndExecuteTransaction(account, tx);

Subscriptions (checkpoints)

Replaces the deprecated JSON-RPC WebSocket subscriptions.

final sub = client.subscribeCheckpoints().listen((res) {
  print('checkpoint ${res.checkpoint.sequenceNumber}');
});
// later: await sub.cancel();

Signature verification

final signed = account.keyPair.signPersonalMessage(message);
final result = await client.verifySignature(
  message,
  Uint8List.fromList(base64Decode(signed.signature)),
  intentScope: IntentScope.personalMessage,
  address: account.getAddress(),
);
print(result.isValid);

Move Registry (MVR)

final pkg = await client.mvr?.resolvePackage('@mvr/core'); // -> 0x…

GraphQL (advanced queries)

GraphQL is served by an indexer (not full nodes) and covers query patterns gRPC can't — filtered transaction/event queries, validators, stakes. Public endpoints: graphql.<network>.sui.io/graphql.

final gql = SuiGraphQLClient.forNetwork(SuiNetwork.testnet);

final page   = await gql.queryTransactionsBySender(address, first: 10);
final events = await gql.queryEventsByModule('0x2', 'coin', first: 10);
final vals   = await gql.getActiveValidators(first: 5);
final stakes = await gql.getStakes(address);
final epoch  = await gql.getEpochSummary();

Legacy API (JSON-RPC — deprecated)

⚠️ The SuiClient API below uses JSON-RPC, which Sui removes on 2026-07-31. New code should use SuiGrpcClient / SuiGraphQLClient above. Kept for reference and migration.

Connecting to Sui Network

/// connect to devnet
final devnetClient = SuiClient(SuiUrls.devnet);

/// connect to testnet
final testnetClient = SuiClient(SuiUrls.testnet);

/// connect to mainnet
final mainnetClient = SuiClient(SuiUrls.mainnet);

Getting coins from the faucet

Faucet V0

final faucet = FaucetClient(SuiUrls.faucetDev);
await faucet.requestSuiFromFaucetV0('0xa2d8bb82df40770ac5bc8628d8070b041a13386fef17db27b32f3b0f316ae5a2');

Faucet V1

final faucet = FaucetClient(SuiUrls.faucetDev);
await faucet.requestSuiFromFaucetV1('0xa2d8bb82df40770ac5bc8628d8070b041a13386fef17db27b32f3b0f316ae5a2');

Writing APIs

Transfer Object

final account = SuiAccount.fromMnemonics(mnemonics, SignatureScheme.Ed25519);
final client = SuiClient(SuiUrls.devnet);

final tx = Transaction();
tx.transferObjects(
    [tx.objectId('0x2619f581cb1864d07c89453a69611202669fdc4784fb59b9cb4278ec60756011')], 
    account.getAddress()
);

final result = await client.signAndExecuteTransactionBlock(account, tx);
print(result.digest);

Split and Transfer Coins

final account = SuiAccount.fromMnemonics(mnemonics, SignatureScheme.Ed25519);
final client = SuiClient(SuiUrls.devnet);

final tx = Transaction();
final coin = tx.splitCoins(tx.gas, [1000]);
tx.transferObjects(
    [coin],
    account.getAddress()
);

final result = await client.signAndExecuteTransactionBlock(account, tx);
print(result.digest);

Merge Coins

final account = SuiAccount.fromMnemonics(mnemonics, SignatureScheme.Ed25519);
final client = SuiClient(SuiUrls.devnet);

final tx = Transaction();
tx.mergeCoins(tx.objectId('0x922ec73939b3288f6da39ebefb0cb88c6c54817441254d448bd2491ac4dd0cbd'), 
    [tx.objectId('0x8dafc96dec7f8d635e052a6da9a4153e37bc4d59ed44c45006e4e9d17d07f80d')]
);

final result = await client.signAndExecuteTransactionBlock(account, tx);
print(result.digest);

Move Call

final account = SuiAccount.fromMnemonics(mnemonics, SignatureScheme.Ed25519);
final client = SuiClient(SuiUrls.devnet);

const packageObjectId = '0x...';
final tx = Transaction();
tx.moveCall('$packageObjectId::nft::mint', arguments: [tx.pureString('Example NFT')]);

final result = await client.signAndExecuteTransactionBlock(account, tx);
print(result.digest);

Publish Modules

final account = SuiAccount.fromMnemonics(mnemonics, SignatureScheme.Ed25519);
final client = SuiClient(SuiUrls.devnet);

const moduels = <String>[];
const dependencies = <String>[];
final tx = Transaction();
final upgradeCap = tx.publish(moduels, dependencies);
tx.transferObjects([upgradeCap], account.getAddress());

final result = await client.signAndExecuteTransactionBlock(account, tx);
print(result.digest);

Reading APIs

Get Owned Objects

final client = SuiClient(SuiUrls.devnet);

final objects = await client.getOwnedObjects('0xa2d8bb82df40770ac5bc8628d8070b041a13386fef17db27b32f3b0f316ae5a2');

Get Objects

final client = SuiClient(SuiUrls.devnet);

final obj = await client.getObject('0x0d49dbda185cd0941b71315edb594276731f21b2232d8713f319b02c462a2da7',
    options: SuiObjectDataOptions(showContent: true)
);

final objs = await client.multiGetObjects([
    '0x0d49dbda185cd0941b71315edb594276731f21b2232d8713f319b02c462a2da7',
    '0x922ec73939b3288f6da39ebefb0cb88c6c54817441254d448bd2491ac4dd0cbd'
], options: SuiObjectDataOptions(showType: true));

Get Transaction

final client = SuiClient(SuiUrls.devnet);

final txn = await client.getTransactionBlock('6oH779AUs2WpwW77xCVGbYqK1FYVamRqHjV6A5wCV8Qj',
    options: SuiTransactionBlockResponseOptions(showEffects: true)
);

final txns = await client.multiGetTransactionBlocks([
    '9znMGToLRRa8yZvjCUfj1FJmq4gpb8QwpibFAUffuto1',
    '4CEFMajEtM62MthwY1xR3Bcddoh2h5wc7jeKEy7WWsbv'
], options: SuiTransactionBlockResponseOptions(showInput: true, showEffects: true));

Get Checkpoints

final client = SuiClient(SuiUrls.devnet);

final checkpoint = await client.getCheckpoint('338000');

final checkpoints = await client.getCheckpoints(descendingOrder: true);

Get Coins

final client = SuiClient(SuiUrls.devnet);

final coins = await client.getCoins(
    '0xa2d8bb82df40770ac5bc8628d8070b041a13386fef17db27b32f3b0f316ae5a2',
    coinType: '0x2::sui::SUI');

final allCoins = await client.getAllCoins('0xa2d8bb82df40770ac5bc8628d8070b041a13386fef17db27b32f3b0f316ae5a2');

final suiBalance = await client.getBalance('0xa2d8bb82df40770ac5bc8628d8070b041a13386fef17db27b32f3b0f316ae5a2');

Events APIs

Querying events

final client = SuiClient(SuiUrls.devnet);

final events = await client.queryEvents(
    {"Sender": "0xa2d8bb82df40770ac5bc8628d8070b041a13386fef17db27b32f3b0f316ae5a2"}, 
    limit: 2
);

/// Or with EventFilter

final events = await client.queryEventsByFilter(
    EventFilter(sender: "0xa2d8bb82df40770ac5bc8628d8070b041a13386fef17db27b32f3b0f316ae5a2"), 
    limit: 2
);

WebsocketClient subscribeEvent

final client = WebsocketClient(SuiUrls.webSocketDevnet);

final subscription = client.subscribeEvent({"Sender": "0xa2d8bb82df40770ac5bc8628d8070b041a13386fef17db27b32f3b0f316ae5a2"})
.listen((event) {
    debugPrint(event);
}, onError: (e) {
    debugPrint(e.toString());
});

Libraries

bcs/sui_bcs
bcs/type_tag_serializer
builder/commands
builder/hash
builder/inputs
builder/pure
builder/serializer
builder/transaction
builder/transaction_block_data
builder/transaction_builder_client
builder/transactions
builder/v1
client/core_client
client/mvr_client
client/network
client/sui_models
compat/legacy_names
compat/sui_grpc_compat
constants
cryptography/bip32/bip32
cryptography/bip32/crypto
cryptography/bip32/ecurve
cryptography/bip32/wif
cryptography/bip39/bip39
cryptography/bip39/english
cryptography/bip39/pbkdf2
cryptography/ed25519_keypair
cryptography/ed25519_publickey
cryptography/helper
cryptography/intent
cryptography/keypair
cryptography/mnemonics
cryptography/multisig
cryptography/secp256
cryptography/secp256_publickey
cryptography/secp256k1_keypair
cryptography/secp256r1_keypair
cryptography/signature
graphql/graphql_transport
graphql/sui_graphql_client
grpc/grpc_builder_adapter
grpc/grpc_core_client
grpc/grpc_transaction_executor
grpc/proto/google/protobuf/any.pb
grpc/proto/google/protobuf/any.pbenum
grpc/proto/google/protobuf/any.pbjson
grpc/proto/google/protobuf/duration.pb
grpc/proto/google/protobuf/duration.pbenum
grpc/proto/google/protobuf/duration.pbjson
grpc/proto/google/protobuf/empty.pb
grpc/proto/google/protobuf/empty.pbenum
grpc/proto/google/protobuf/empty.pbjson
grpc/proto/google/protobuf/field_mask.pb
grpc/proto/google/protobuf/field_mask.pbenum
grpc/proto/google/protobuf/field_mask.pbjson
grpc/proto/google/protobuf/struct.pb
grpc/proto/google/protobuf/struct.pbenum
grpc/proto/google/protobuf/struct.pbjson
grpc/proto/google/protobuf/timestamp.pb
grpc/proto/google/protobuf/timestamp.pbenum
grpc/proto/google/protobuf/timestamp.pbjson
grpc/proto/google/rpc/error_details.pb
grpc/proto/google/rpc/error_details.pbenum
grpc/proto/google/rpc/error_details.pbjson
grpc/proto/google/rpc/status.pb
grpc/proto/google/rpc/status.pbenum
grpc/proto/google/rpc/status.pbjson
grpc/proto/sui/rpc/v2/argument.pb
grpc/proto/sui/rpc/v2/argument.pbenum
grpc/proto/sui/rpc/v2/argument.pbjson
grpc/proto/sui/rpc/v2/balance_change.pb
grpc/proto/sui/rpc/v2/balance_change.pbenum
grpc/proto/sui/rpc/v2/balance_change.pbjson
grpc/proto/sui/rpc/v2/bcs.pb
grpc/proto/sui/rpc/v2/bcs.pbenum
grpc/proto/sui/rpc/v2/bcs.pbjson
grpc/proto/sui/rpc/v2/checkpoint.pb
grpc/proto/sui/rpc/v2/checkpoint.pbenum
grpc/proto/sui/rpc/v2/checkpoint.pbjson
grpc/proto/sui/rpc/v2/checkpoint_contents.pb
grpc/proto/sui/rpc/v2/checkpoint_contents.pbenum
grpc/proto/sui/rpc/v2/checkpoint_contents.pbjson
grpc/proto/sui/rpc/v2/checkpoint_summary.pb
grpc/proto/sui/rpc/v2/checkpoint_summary.pbenum
grpc/proto/sui/rpc/v2/checkpoint_summary.pbjson
grpc/proto/sui/rpc/v2/effects.pb
grpc/proto/sui/rpc/v2/effects.pbenum
grpc/proto/sui/rpc/v2/effects.pbjson
grpc/proto/sui/rpc/v2/epoch.pb
grpc/proto/sui/rpc/v2/epoch.pbenum
grpc/proto/sui/rpc/v2/epoch.pbjson
grpc/proto/sui/rpc/v2/error_reason.pb
grpc/proto/sui/rpc/v2/error_reason.pbenum
grpc/proto/sui/rpc/v2/error_reason.pbjson
grpc/proto/sui/rpc/v2/event.pb
grpc/proto/sui/rpc/v2/event.pbenum
grpc/proto/sui/rpc/v2/event.pbjson
grpc/proto/sui/rpc/v2/executed_transaction.pb
grpc/proto/sui/rpc/v2/executed_transaction.pbenum
grpc/proto/sui/rpc/v2/executed_transaction.pbjson
grpc/proto/sui/rpc/v2/execution_status.pb
grpc/proto/sui/rpc/v2/execution_status.pbenum
grpc/proto/sui/rpc/v2/execution_status.pbjson
grpc/proto/sui/rpc/v2/gas_cost_summary.pb
grpc/proto/sui/rpc/v2/gas_cost_summary.pbenum
grpc/proto/sui/rpc/v2/gas_cost_summary.pbjson
grpc/proto/sui/rpc/v2/input.pb
grpc/proto/sui/rpc/v2/input.pbenum
grpc/proto/sui/rpc/v2/input.pbjson
grpc/proto/sui/rpc/v2/jwk.pb
grpc/proto/sui/rpc/v2/jwk.pbenum
grpc/proto/sui/rpc/v2/jwk.pbjson
grpc/proto/sui/rpc/v2/ledger_service.pb
grpc/proto/sui/rpc/v2/ledger_service.pbenum
grpc/proto/sui/rpc/v2/ledger_service.pbjson
grpc/proto/sui/rpc/v2/ledger_service.pbserver
grpc/proto/sui/rpc/v2/move_package.pb
grpc/proto/sui/rpc/v2/move_package.pbenum
grpc/proto/sui/rpc/v2/move_package.pbjson
grpc/proto/sui/rpc/v2/move_package_service.pb
grpc/proto/sui/rpc/v2/move_package_service.pbenum
grpc/proto/sui/rpc/v2/move_package_service.pbjson
grpc/proto/sui/rpc/v2/move_package_service.pbserver
grpc/proto/sui/rpc/v2/name_service.pb
grpc/proto/sui/rpc/v2/name_service.pbenum
grpc/proto/sui/rpc/v2/name_service.pbjson
grpc/proto/sui/rpc/v2/name_service.pbserver
grpc/proto/sui/rpc/v2/object.pb
grpc/proto/sui/rpc/v2/object.pbenum
grpc/proto/sui/rpc/v2/object.pbjson
grpc/proto/sui/rpc/v2/object_reference.pb
grpc/proto/sui/rpc/v2/object_reference.pbenum
grpc/proto/sui/rpc/v2/object_reference.pbjson
grpc/proto/sui/rpc/v2/owner.pb
grpc/proto/sui/rpc/v2/owner.pbenum
grpc/proto/sui/rpc/v2/owner.pbjson
grpc/proto/sui/rpc/v2/protocol_config.pb
grpc/proto/sui/rpc/v2/protocol_config.pbenum
grpc/proto/sui/rpc/v2/protocol_config.pbjson
grpc/proto/sui/rpc/v2/signature.pb
grpc/proto/sui/rpc/v2/signature.pbenum
grpc/proto/sui/rpc/v2/signature.pbjson
grpc/proto/sui/rpc/v2/signature_scheme.pb
grpc/proto/sui/rpc/v2/signature_scheme.pbenum
grpc/proto/sui/rpc/v2/signature_scheme.pbjson
grpc/proto/sui/rpc/v2/signature_verification_service.pb
grpc/proto/sui/rpc/v2/signature_verification_service.pbenum
grpc/proto/sui/rpc/v2/signature_verification_service.pbjson
grpc/proto/sui/rpc/v2/signature_verification_service.pbserver
grpc/proto/sui/rpc/v2/state_service.pb
grpc/proto/sui/rpc/v2/state_service.pbenum
grpc/proto/sui/rpc/v2/state_service.pbjson
grpc/proto/sui/rpc/v2/state_service.pbserver
grpc/proto/sui/rpc/v2/subscription_service.pb
grpc/proto/sui/rpc/v2/subscription_service.pbenum
grpc/proto/sui/rpc/v2/subscription_service.pbjson
grpc/proto/sui/rpc/v2/subscription_service.pbserver
grpc/proto/sui/rpc/v2/system_state.pb
grpc/proto/sui/rpc/v2/system_state.pbenum
grpc/proto/sui/rpc/v2/system_state.pbjson
grpc/proto/sui/rpc/v2/transaction.pb
grpc/proto/sui/rpc/v2/transaction.pbenum
grpc/proto/sui/rpc/v2/transaction.pbjson
grpc/proto/sui/rpc/v2/transaction_execution_service.pb
grpc/proto/sui/rpc/v2/transaction_execution_service.pbenum
grpc/proto/sui/rpc/v2/transaction_execution_service.pbjson
grpc/proto/sui/rpc/v2/transaction_execution_service.pbserver
grpc/sui_grpc_client
grpc/transport/grpc_web_transport
http/http
http/http_native
http/http_web
http/interceptor
models/checkpoint
models/dev_inspect_results
models/dynamic_field
models/object_read
models/paged
models/sui_event
models/validators_apys
multisig/multsig_publickey
providers/json_rpc_provider
rpc/client
rpc/faucet_client
rpc/websocket_client
signers/raw_signer
signers/signer_with_provider
signers/txn_data_serializers/rpc_txn_data_serializer
signers/txn_data_serializers/txn_data_serializer
sui
A cross-platform Dart SDK for the Sui blockchain — mobile, web and desktop.
sui_account
sui_client
sui_urls
types/coins
types/common
types/event_filter
types/events
types/faucet
types/framework
types/normalized
types/objects
types/sui_bcs
types/transactions
types/validator
types/version
utils/bech32/bech32
utils/bech32/exception
utils/dynamic_fields
utils/ed25519_hd_key
utils/error
utils/hex
utils/sha
utils/suins
zklogin/address
zklogin/bcs
zklogin/jwt_utils
zklogin/publickey
zklogin/signature
zklogin/types
zklogin/utils
zklogin/zklogin