@mysten/sui
Version:
Sui TypeScript API
617 lines (468 loc) • 18.1 kB
Markdown
# Core API
> Transport-agnostic Core API shared by all Sui clients
The Core API is the transport-agnostic interface that all Sui clients implement. It provides a
consistent set of methods for interacting with the Sui blockchain, regardless of whether you're
using gRPC, GraphQL, or JSON-RPC.
## ClientWithCoreApi
The `ClientWithCoreApi` type represents any client that implements the Core API. Use this type when
building SDKs or libraries that should work with any transport:
```typescript
// Your SDK works with any client
class MySDK {
constructor(private client: ClientWithCoreApi) {}
async doSomething() {
// Use client.core for all operations
return this.client.core.getObject({ objectId: '0x...' });
}
}
```
## Object Methods
Object methods accept an optional `include` parameter to control what data is returned. By default,
every object comes with `objectId`, `version`, `digest`, `owner`, and `type`. The following fields
are only populated when requested:
| Option | Type | Description |
| --------------------- | --------- | ------------------------------------------------------------------------- |
| `content` | `boolean` | BCS-encoded Move struct content — pass this to generated BCS type parsers |
| `previousTransaction` | `boolean` | Digest of the transaction that last mutated this object |
| `json` | `boolean` | JSON representation of the object's Move struct content |
| `objectBcs` | `boolean` | Full BCS-encoded object envelope (rarely needed, see [below](#objectbcs)) |
| `display` | `boolean` | [Sui Display Standard](https://docs.sui.io/standards/display) metadata |
### getObject
Fetch a single object by ID.
```typescript
const { object } = await client.core.getObject({
objectId: '0x123...',
include: {
content: true, // Include BCS-encoded content
previousTransaction: true, // Include creating transaction digest
},
});
console.log(object.objectId);
console.log(object.version);
console.log(object.digest);
console.log(object.type); // e.g., "0x2::coin::Coin<0x2::sui::SUI>"
```
### getObjects
Fetch multiple objects in a single request.
```typescript
const { objects } = await client.core.getObjects({
objectIds: ['0x123...', '0x456...'],
include: { content: true },
});
for (const obj of objects) {
if (obj instanceof Error) {
console.log('Object not found:', obj.message);
} else {
console.log(obj.objectId, obj.type);
}
}
```
### listOwnedObjects
List objects owned by an address.
```typescript
const result = await client.core.listOwnedObjects({
owner: '0xabc...',
filter: {
StructType: '0x2::coin::Coin<0x2::sui::SUI>',
},
limit: 10,
});
for (const obj of result.objects) {
console.log(obj.objectId, obj.type);
}
// Paginate
if (result.cursor) {
const nextPage = await client.core.listOwnedObjects({
owner: '0xabc...',
cursor: result.cursor,
});
}
```
### Parsing object content
Use `include: { content: true }` to get the BCS-encoded Move struct bytes, then parse them with
generated types (from `@mysten/codegen`) or manual BCS definitions:
```typescript
const { object } = await client.core.getObject({
objectId: '0x123...',
include: { content: true },
});
const parsed = MyStruct.parse(object.content);
```
### `json` include option
You can also fetch a JSON representation of the object's content with `include: { json: true }`.
> **Warning:** The `json` field structure may vary between API implementations. For example,
> JSON-RPC returns UID fields as nested objects (`{ "id": { "id": "0x..." } }`), while gRPC and
> GraphQL flatten them (`{ "id": "0x..." }`). For consistent data across all clients, use `content`
> and parse BCS directly.
### `objectBcs`
The `objectBcs` option returns the full BCS-encoded object envelope — the struct content wrapped in
metadata (type, `hasPublicTransfer`, version, owner, previous transaction, storage rebate). Most of
this metadata is already available as fields on the object response, so you typically only need
`content`. If you do need `objectBcs`, parse it with `bcs.Object` from `@mysten/sui/bcs`:
```typescript
const envelope = bcs.Object.parse(object.objectBcs);
```
> **Error:** Do not pass `objectBcs` to a Move struct parser — it contains wrapping metadata that
> will cause parsing to fail or produce incorrect results. Use `content` for parsing Move struct
> fields.
### `display` include option
The `display` option fetches [Sui Display Standard](https://docs.sui.io/standards/display) metadata
for an object. Display templates define how an object should be presented in wallets and explorers —
fields like `name`, `description`, and `image_url`.
```typescript
const { object } = await client.core.getObject({
objectId: '0x123...',
include: { display: true },
});
if (object.display) {
// display is null if the object's type has no Display template
console.log(object.display.output?.name);
console.log(object.display.output?.image_url);
}
```
The `display` field is `null` when the object's type has no registered Display template, and
`undefined` when `display` was not requested. The `Display` type has two fields:
| Field | Type | Description |
| -------- | -------------------------------- | --------------------------------------------------------------- |
| `output` | `Record<string, string> \| null` | Interpolated display fields (template variables resolved) |
| `errors` | `Record<string, string> \| null` | Per-field errors if any template variable failed to interpolate |
`display` works with `getObject`, `getObjects`, and `listOwnedObjects`.
## Coin and Balance Methods
### getBalance
Get the balance of a specific coin type for an owner.
```typescript
const balance = await client.core.getBalance({
owner: '0xabc...',
coinType: '0x2::sui::SUI', // Optional, defaults to SUI
});
console.log(balance.totalBalance); // Total balance as bigint
console.log(balance.coinObjectCount); // Number of coin objects
```
### listBalances
List all coin balances for an owner.
```typescript
const { balances } = await client.core.listBalances({
owner: '0xabc...',
});
for (const balance of balances) {
console.log(balance.coinType, balance.totalBalance);
}
```
### listCoins
List coin objects of a specific type owned by an address.
```typescript
const result = await client.core.listCoins({
owner: '0xabc...',
coinType: '0x2::sui::SUI',
limit: 10,
});
for (const coin of result.coins) {
console.log(coin.objectId, coin.balance);
}
```
### getCoinMetadata
Get metadata for a coin type, including its name, symbol, decimals, and description.
```typescript
const { coinMetadata } = await client.core.getCoinMetadata({
coinType: '0x2::sui::SUI',
});
if (coinMetadata) {
console.log(coinMetadata.name, coinMetadata.symbol, coinMetadata.decimals);
// "Sui" "SUI" 9
}
```
## Dynamic Field Methods
### listDynamicFields
List dynamic fields on an object.
```typescript
const result = await client.core.listDynamicFields({
parentId: '0x123...',
limit: 10,
});
for (const field of result.dynamicFields) {
console.log(field.name, field.type);
}
```
### getDynamicField
Get a specific dynamic field by name.
```typescript
const { dynamicField } = await client.core.getDynamicField({
parentId: '0x123...',
name: {
type: 'u64',
bcs: bcs.u64().serialize(42).toBytes(),
},
});
console.log(dynamicField.name);
console.log(dynamicField.value.type);
console.log(dynamicField.value.bcs); // BCS-encoded value
```
### getDynamicObjectField
Get a dynamic object field, returning the referenced object. Supports the same
[object include options](#object-methods) as `getObject`.
```typescript
const { object } = await client.core.getDynamicObjectField({
parentId: '0x123...',
name: {
type: '0x2::object::ID',
bcs: bcs.Address.serialize('0x456...').toBytes(),
},
include: { content: true },
});
```
## Transaction Methods
Transaction methods accept an optional `include` parameter to control what data is returned. By
default, every transaction result includes `digest`, `signatures`, `epoch`, and `status`. The
following fields are only populated when requested:
| Option | Type | Description |
| ---------------- | --------- | -------------------------------------------------------------------- |
| `effects` | `boolean` | Parsed transaction effects (gas used, changed objects, status, etc.) |
| `events` | `boolean` | Events emitted during execution |
| `transaction` | `boolean` | Parsed transaction data (sender, gas config, inputs, commands) |
| `balanceChanges` | `boolean` | Balance changes caused by the transaction |
| `objectTypes` | `boolean` | Map of object IDs to their types for all changed objects |
| `bcs` | `boolean` | Raw BCS-encoded transaction bytes |
`simulateTransaction` also supports:
| Option | Type | Description |
| ---------------- | --------- | ------------------------------------------------------ |
| `commandResults` | `boolean` | Return values and mutated references from each command |
### executeTransaction
Execute a signed transaction.
```typescript
const result = await client.core.executeTransaction({
transaction: transactionBytes,
signatures: [signature],
include: {
effects: true,
events: true,
},
});
if (result.Transaction) {
console.log('Success:', result.Transaction.digest);
console.log('Effects:', result.Transaction.effects);
} else {
console.log('Failed:', result.FailedTransaction?.status.error);
}
```
### simulateTransaction
Simulate a transaction without executing it.
```typescript
const result = await client.core.simulateTransaction({
transaction: transactionBytes,
include: {
effects: true,
balanceChanges: true,
commandResults: true, // simulation-only option
},
});
// Check simulated effects before signing
console.log(result.effects);
console.log(result.balanceChanges);
```
#### Disabling Checks
By default, `simulateTransaction` runs with full transaction validation. For example when inspecting
non-public or non-entry Move functions set `checksEnabled: false`:
```typescript
const result = await client.core.simulateTransaction({
transaction: transactionBytes,
checksEnabled: false,
include: {
commandResults: true,
},
});
```
### signAndExecuteTransaction
Sign and execute a transaction in one step.
```typescript
const tx = new Transaction();
tx.transferObjects([tx.object('0x123...')], '0xrecipient...');
const result = await client.core.signAndExecuteTransaction({
transaction: tx,
signer: keypair,
include: { effects: true },
});
// Always check the result
if (result.FailedTransaction) {
throw new Error(`Failed: ${result.FailedTransaction.status.error}`);
}
console.log('Digest:', result.Transaction.digest);
```
### getTransaction
Fetch a transaction by digest.
```typescript
const result = await client.core.getTransaction({
digest: 'ABC123...',
include: {
effects: true,
events: true,
transaction: true,
},
});
console.log(result.Transaction?.digest);
console.log(result.Transaction?.effects);
console.log(result.Transaction?.transaction?.sender);
```
You can also fetch raw BCS-encoded transaction bytes:
```typescript
const result = await client.core.getTransaction({
digest: 'ABC123...',
include: { bcs: true },
});
// Raw BCS bytes for the transaction
console.log(result.Transaction?.bcs); // Uint8Array
```
### waitForTransaction
Wait for a transaction to be available.
```typescript
const result = await client.core.waitForTransaction({
digest: 'ABC123...',
timeout: 60_000, // 60 seconds
include: { effects: true },
});
```
You can also pass the result directly from `executeTransaction`:
```typescript
const executeResult = await client.core.executeTransaction({ ... });
const finalResult = await client.core.waitForTransaction({
result: executeResult,
include: { effects: true },
});
```
## System Methods
### getReferenceGasPrice
Get the current reference gas price.
```typescript
const { referenceGasPrice } = await client.core.getReferenceGasPrice();
console.log(referenceGasPrice); // bigint
```
### getCurrentSystemState
Get the current system state including epoch information.
```typescript
const systemState = await client.core.getCurrentSystemState();
console.log(systemState.epoch);
console.log(systemState.systemStateVersion);
```
### getChainIdentifier
Get the chain identifier for the network.
```typescript
const { chainIdentifier } = await client.core.getChainIdentifier();
console.log(chainIdentifier); // e.g., "4c78adac"
```
## Move Methods
### getMoveFunction
Get information about a Move function.
```typescript
const { function: fn } = await client.core.getMoveFunction({
packageId: '0x2',
moduleName: 'coin',
name: 'transfer',
});
console.log(fn.name);
console.log(fn.parameters);
console.log(fn.typeParameters);
```
## Name Service Methods
### defaultNameServiceName
Resolve an address to its default SuiNS name.
```typescript
const { name } = await client.core.defaultNameServiceName({
address: '0xabc...',
});
console.log(name); // e.g., "example.sui"
```
## MVR Methods
The client also exposes MVR (Move Registry) methods through `client.core.mvr`:
### resolveType
Resolve a type name (including `.move` names) to a fully qualified type.
```typescript
const { type } = await client.core.mvr.resolveType({
type: '@mysten/sui::coin::Coin<@mysten/sui::sui::SUI>',
});
console.log(type); // "0x2::coin::Coin<0x2::sui::SUI>"
```
## Error Handling
Methods that fetch objects may return errors in the result:
```typescript
const { objects } = await client.core.getObjects({
objectIds: ['0x123...', '0x456...'],
});
for (const obj of objects) {
if (obj instanceof Error) {
// Object not found or other error
console.error('Error:', obj.message);
} else {
// Successfully fetched
console.log(obj.objectId);
}
}
```
For transaction execution, always check the result type:
```typescript
const result = await client.core.executeTransaction({ ... });
if (result.Transaction) {
// Success
console.log(result.Transaction.digest);
} else if (result.FailedTransaction) {
// Transaction was executed but failed
throw new Error(result.FailedTransaction.status.error);
}
```
## SuiClientTypes Namespace
The `SuiClientTypes` namespace contains all type definitions for the Core API. Import it when you
need to type function parameters, return values, or variables:
```typescript
// Type function parameters
function processObject(obj: SuiClientTypes.Object<{ content: true }>) {
console.log(obj.objectId, obj.content);
}
// Type return values
async function fetchBalance(
client: ClientWithCoreApi,
owner: string,
): Promise<SuiClientTypes.CoinBalance> {
const { balance } = await client.core.getBalance({ owner });
return balance;
}
// Type options
const options: SuiClientTypes.GetObjectOptions<{ content: true }> = {
objectId: '0x123...',
include: { content: true },
};
```
### Common Types
| Type | Description |
| ---------------------- | ------------------------------------------- |
| `Object<Include>` | Fetched object with optional included data |
| `Coin` | Coin object with balance |
| `CoinBalance` | Balance summary for a coin type |
| `CoinMetadata` | Metadata for a coin type |
| `Transaction<Include>` | Executed transaction with optional data |
| `TransactionResult` | Success or failure result from execution |
| `TransactionEffects` | Detailed effects from transaction execution |
| `Event` | Emitted event from a transaction |
| `ObjectOwner` | Union of all owner types |
| `ExecutionStatus` | Success/failure status with error details |
| `DynamicFieldName` | Name identifier for dynamic fields |
| `FunctionResponse` | Move function metadata |
| `Network` | Network identifier type |
### Include Options Types
| Type | Description |
| ---------------------------- | --------------------------------------- |
| `ObjectInclude` | Options for object data inclusion |
| `TransactionInclude` | Options for transaction data inclusion |
| `SimulateTransactionInclude` | Extended options for simulation results |
### Method Options Types
| Type | Description |
| ---------------------------------- | --------------------------------------- |
| `GetObjectOptions` | Options for `getObject` |
| `GetObjectsOptions` | Options for `getObjects` |
| `ListOwnedObjectsOptions` | Options for `listOwnedObjects` |
| `ListCoinsOptions` | Options for `listCoins` |
| `GetBalanceOptions` | Options for `getBalance` |
| `ListBalancesOptions` | Options for `listBalances` |
| `GetCoinMetadataOptions` | Options for `getCoinMetadata` |
| `ExecuteTransactionOptions` | Options for `executeTransaction` |
| `SimulateTransactionOptions` | Options for `simulateTransaction` |
| `SignAndExecuteTransactionOptions` | Options for `signAndExecuteTransaction` |
| `GetTransactionOptions` | Options for `getTransaction` |
| `WaitForTransactionOptions` | Options for `waitForTransaction` |