suix_getOwnedObjects
Returns a paginated list of all objects owned by a specific address on the Sui network, with support for filtering by object type.
Overview
The suix_getOwnedObjects
method is essential for querying all objects owned by an address. In Sui's object-centric model, everything is represented as objects - coins, NFTs, smart contracts, and custom data structures. This method allows you to discover and enumerate all objects belonging to a specific address, making it crucial for wallet implementations, portfolio trackers, and analytics tools.
Parameters
Parameter | Type | Required | Description |
---|---|---|---|
owner | string | Yes | The Sui address to query (66-character hex string with 0x prefix) |
query | object | No | Query options for filtering and pagination |
cursor | string | No | Pagination cursor from previous response |
limit | number | No | Maximum number of objects to return (default: 50, max: 200) |
Query Object
Field | Type | Description |
---|---|---|
MatchAll | array | Match all specified filters |
MatchAny | array | Match any of the specified filters |
MatchNone | array | Exclude objects matching these filters |
Filter Options
Filter Type | Description | Example |
---|---|---|
StructType | Filter by Move struct type | "0x2::coin::Coin<0x2::sui::SUI>" |
AddressOwner | Filter by address owner | Address string |
ObjectOwner | Filter by object owner | Object ID string |
ObjectId | Filter by specific object ID | Object ID string |
Version | Filter by object version | Version number |
Returns
Returns an object containing the paginated list of owned objects.
Field | Type | Description |
---|---|---|
data | array | Array of object information |
nextCursor | string | Cursor for next page (null if no more pages) |
hasNextPage | boolean | Whether more pages are available |
Object Information Structure
Field | Type | Description |
---|---|---|
objectId | string | Unique identifier of the object |
version | string | Current version of the object |
digest | string | Object content digest |
type | string | Move type of the object |
owner | object | Ownership information |
previousTransaction | string | Previous transaction digest |
storageRebate | string | Storage rebate amount |
display | object | Display metadata (if available) |
content | object | Object's fields and values (if requested) |
Code Examples
- cURL
- JavaScript
- Python
# Get all owned objects (basic query)
curl -X POST https://api-sui-mainnet-full.n.dwellir.com/YOUR_API_KEY \
-H "Content-Type: application/json" \
-d '{
"jsonrpc": "2.0",
"method": "suix_getOwnedObjects",
"params": [
"0xac5bceec1b789ff840d7d4e6ce4ce61c90d190a7f8c4f4ddf0bff6ee2413c33c"
],
"id": 1
}'
# Get only SUI coin objects
curl -X POST https://api-sui-mainnet-full.n.dwellir.com/YOUR_API_KEY \
-H "Content-Type: application/json" \
-d '{
"jsonrpc": "2.0",
"method": "suix_getOwnedObjects",
"params": [
"0xac5bceec1b789ff840d7d4e6ce4ce61c90d190a7f8c4f4ddf0bff6ee2413c33c",
{
"filter": {
"StructType": "0x2::coin::Coin<0x2::sui::SUI>"
}
},
null,
50
],
"id": 1
}'
# Get objects with content and display info
curl -X POST https://api-sui-mainnet-full.n.dwellir.com/YOUR_API_KEY \
-H "Content-Type: application/json" \
-d '{
"jsonrpc": "2.0",
"method": "suix_getOwnedObjects",
"params": [
"0xac5bceec1b789ff840d7d4e6ce4ce61c90d190a7f8c4f4ddf0bff6ee2413c33c",
{
"filter": null,
"options": {
"showType": true,
"showOwner": true,
"showPreviousTransaction": true,
"showDisplay": true,
"showContent": true,
"showBcs": false,
"showStorageRebate": true
}
},
null,
25
],
"id": 1
}'
import { SuiClient } from '@mysten/sui.js/client';
const client = new SuiClient({
url: 'https://api-sui-mainnet-full.n.dwellir.com/YOUR_API_KEY'
});
// Get all owned objects
async function getAllOwnedObjects(address) {
const result = await client.getOwnedObjects({
owner: address,
options: {
showType: true,
showOwner: true,
showContent: true,
showDisplay: true
}
});
console.log(`Found ${result.data.length} objects`);
return result;
}
// Get specific object type (e.g., SUI coins)
async function getSUICoins(address) {
const result = await client.getOwnedObjects({
owner: address,
filter: {
StructType: '0x2::coin::Coin<0x2::sui::SUI>'
},
options: {
showContent: true
}
});
const coins = result.data.map(obj => ({
objectId: obj.data?.objectId,
balance: obj.data?.content?.fields?.balance,
version: obj.data?.version
}));
return coins;
}
// Get all objects with pagination
async function getAllObjectsPaginated(address, maxPages = 10) {
let allObjects = [];
let cursor = null;
let pageCount = 0;
while (pageCount < maxPages) {
const result = await client.getOwnedObjects({
owner: address,
cursor: cursor,
limit: 50,
options: {
showType: true,
showContent: true
}
});
allObjects.push(...result.data);
console.log(`Page ${pageCount + 1}: ${result.data.length} objects`);
if (!result.hasNextPage) break;
cursor = result.nextCursor;
pageCount++;
}
return allObjects;
}
// Categorize owned objects by type
async function categorizeOwnedObjects(address) {
const allObjects = await getAllObjectsPaginated(address);
const categories = {
coins: [],
nfts: [],
packages: [],
other: []
};
allObjects.forEach(obj => {
const type = obj.data?.type || '';
if (type.includes('::coin::Coin<')) {
categories.coins.push({
objectId: obj.data.objectId,
coinType: type.match(/<(.+)>/)?.[1] || 'Unknown',
balance: obj.data.content?.fields?.balance || '0'
});
} else if (type.includes('::nft::') || obj.data?.display) {
categories.nfts.push({
objectId: obj.data.objectId,
type: type,
name: obj.data.display?.data?.name || 'Unknown NFT',
description: obj.data.display?.data?.description || '',
imageUrl: obj.data.display?.data?.image_url || ''
});
} else if (type.includes('::package::')) {
categories.packages.push({
objectId: obj.data.objectId,
type: type
});
} else {
categories.other.push({
objectId: obj.data.objectId,
type: type
});
}
});
return {
summary: {
totalObjects: allObjects.length,
coinObjects: categories.coins.length,
nftObjects: categories.nfts.length,
packageObjects: categories.packages.length,
otherObjects: categories.other.length
},
categories: categories
};
}
// Portfolio analysis
async function analyzePortfolio(address) {
const objects = await categorizeOwnedObjects(address);
// Analyze coin balances
const coinAnalysis = {};
let totalSUIBalance = 0;
objects.categories.coins.forEach(coin => {
const coinType = coin.coinType;
const balance = parseInt(coin.balance || '0');
if (!coinAnalysis[coinType]) {
coinAnalysis[coinType] = {
totalBalance: 0,
objectCount: 0,
objects: []
};
}
coinAnalysis[coinType].totalBalance += balance;
coinAnalysis[coinType].objectCount++;
coinAnalysis[coinType].objects.push(coin.objectId);
if (coinType === '0x2::sui::SUI') {
totalSUIBalance += balance;
}
});
// Format balances for display
const formattedBalances = Object.entries(coinAnalysis).map(([coinType, data]) => {
const isStandardCoin = coinType === '0x2::sui::SUI';
const decimals = isStandardCoin ? 9 : 6; // Default assumption
return {
coinType: coinType,
symbol: isStandardCoin ? 'SUI' : coinType.split('::').pop(),
totalBalance: data.totalBalance,
formattedBalance: (data.totalBalance / Math.pow(10, decimals)).toFixed(isStandardCoin ? 4 : 2),
objectCount: data.objectCount
};
});
return {
summary: objects.summary,
coinBalances: formattedBalances,
nftCollection: objects.categories.nfts,
totalSUIBalance: totalSUIBalance,
formattedSUIBalance: (totalSUIBalance / 1_000_000_000).toFixed(4)
};
}
// Monitor object changes
async function monitorObjectChanges(address, callback, intervalMs = 30000) {
let lastObjectCount = 0;
let knownObjects = new Set();
console.log(`Starting object monitoring for ${address}`);
const checkForChanges = async () => {
try {
const result = await client.getOwnedObjects({
owner: address,
options: { showType: true },
limit: 200
});
const currentObjects = new Set(
result.data.map(obj => obj.data?.objectId).filter(Boolean)
);
// Detect new objects
const newObjects = [...currentObjects].filter(id => !knownObjects.has(id));
// Detect removed objects
const removedObjects = [...knownObjects].filter(id => !currentObjects.has(id));
if (newObjects.length > 0 || removedObjects.length > 0) {
callback({
type: 'objects_changed',
newObjects: newObjects,
removedObjects: removedObjects,
totalObjects: currentObjects.size,
timestamp: new Date().toISOString()
});
}
knownObjects = currentObjects;
lastObjectCount = currentObjects.size;
} catch (error) {
console.error('Error monitoring objects:', error);
}
};
// Initial check
await checkForChanges();
// Set up interval monitoring
const intervalId = setInterval(checkForChanges, intervalMs);
return () => {
clearInterval(intervalId);
console.log('Object monitoring stopped');
};
}
// Usage examples
const address = '0xac5bceec1b789ff840d7d4e6ce4ce61c90d190a7f8c4f4ddf0bff6ee2413c33c';
// Basic query
const basicObjects = await getAllOwnedObjects(address);
console.log('Basic objects:', basicObjects.data.length);
// Get SUI coins
const suiCoins = await getSUICoins(address);
console.log('SUI coins:', suiCoins.length);
// Portfolio analysis
const portfolio = await analyzePortfolio(address);
console.log('Portfolio Analysis:', portfolio.summary);
console.log('Total SUI Balance:', portfolio.formattedSUIBalance, 'SUI');
// Monitor changes
const stopMonitoring = await monitorObjectChanges(address, (changes) => {
console.log('📦 Object changes detected:', changes);
});
// Stop monitoring after 10 minutes
setTimeout(stopMonitoring, 10 * 60 * 1000);
import requests
import json
from typing import List, Dict, Any, Optional, Set, Callable
from dataclasses import dataclass
from collections import defaultdict
import time
import asyncio
@dataclass
class ObjectFilter:
struct_type: Optional[str] = None
address_owner: Optional[str] = None
object_owner: Optional[str] = None
object_id: Optional[str] = None
version: Optional[int] = None
@dataclass
class QueryOptions:
show_type: bool = True
show_owner: bool = True
show_previous_transaction: bool = False
show_display: bool = True
show_content: bool = True
show_bcs: bool = False
show_storage_rebate: bool = False
class SuiOwnedObjectsClient:
def __init__(self, rpc_url: str):
self.rpc_url = rpc_url
def get_owned_objects(
self,
owner: str,
query_filter: Optional[ObjectFilter] = None,
options: Optional[QueryOptions] = None,
cursor: Optional[str] = None,
limit: int = 50
) -> Dict[str, Any]:
"""Get objects owned by an address"""
# Build filter
filter_dict = None
if query_filter:
if query_filter.struct_type:
filter_dict = {"StructType": query_filter.struct_type}
elif query_filter.address_owner:
filter_dict = {"AddressOwner": query_filter.address_owner}
elif query_filter.object_owner:
filter_dict = {"ObjectOwner": query_filter.object_owner}
elif query_filter.object_id:
filter_dict = {"ObjectId": query_filter.object_id}
elif query_filter.version:
filter_dict = {"Version": query_filter.version}
# Build options
options_dict = {}
if options:
options_dict = {
"showType": options.show_type,
"showOwner": options.show_owner,
"showPreviousTransaction": options.show_previous_transaction,
"showDisplay": options.show_display,
"showContent": options.show_content,
"showBcs": options.show_bcs,
"showStorageRebate": options.show_storage_rebate
}
# Build query object
query_obj = {}
if filter_dict:
query_obj["filter"] = filter_dict
if options_dict:
query_obj["options"] = options_dict
payload = {
"jsonrpc": "2.0",
"method": "suix_getOwnedObjects",
"params": [owner, query_obj, cursor, limit],
"id": 1
}
response = requests.post(
self.rpc_url,
headers={'Content-Type': 'application/json'},
data=json.dumps(payload)
)
result = response.json()
if 'error' in result:
raise Exception(f"RPC Error: {result['error']}")
return result['result']
def get_all_owned_objects_paginated(
self,
owner: str,
query_filter: Optional[ObjectFilter] = None,
options: Optional[QueryOptions] = None,
max_pages: int = 100
) -> List[Dict[str, Any]]:
"""Get all owned objects using pagination"""
all_objects = []
cursor = None
page = 0
while page < max_pages:
result = self.get_owned_objects(
owner=owner,
query_filter=query_filter,
options=options,
cursor=cursor,
limit=50
)
all_objects.extend(result['data'])
print(f"Page {page + 1}: {len(result['data'])} objects")
if not result['hasNextPage']:
break
cursor = result['nextCursor']
page += 1
print(f"Total objects retrieved: {len(all_objects)}")
return all_objects
def get_sui_coins(self, owner: str) -> List[Dict[str, Any]]:
"""Get all SUI coin objects owned by address"""
sui_filter = ObjectFilter(struct_type="0x2::coin::Coin<0x2::sui::SUI>")
options = QueryOptions(show_content=True, show_type=True)
objects = self.get_all_owned_objects_paginated(
owner=owner,
query_filter=sui_filter,
options=options
)
coins = []
for obj in objects:
if obj.get('data'):
coin_info = {
'object_id': obj['data']['objectId'],
'version': obj['data']['version'],
'balance': obj['data'].get('content', {}).get('fields', {}).get('balance', '0'),
'type': obj['data'].get('type', '')
}
coins.append(coin_info)
return coins
def categorize_owned_objects(self, owner: str) -> Dict[str, Any]:
"""Categorize all owned objects by type"""
options = QueryOptions(
show_type=True,
show_content=True,
show_display=True
)
all_objects = self.get_all_owned_objects_paginated(
owner=owner,
options=options
)
categories = {
'coins': [],
'nfts': [],
'packages': [],
'other': []
}
for obj in all_objects:
if not obj.get('data'):
continue
data = obj['data']
obj_type = data.get('type', '')
if '::coin::Coin<' in obj_type:
# Extract coin type
coin_type_match = obj_type.split('<')
coin_type = coin_type_match[1].rstrip('>') if len(coin_type_match) > 1 else 'Unknown'
coin_info = {
'object_id': data['objectId'],
'coin_type': coin_type,
'balance': data.get('content', {}).get('fields', {}).get('balance', '0'),
'version': data['version']
}
categories['coins'].append(coin_info)
elif '::nft::' in obj_type or data.get('display'):
display_data = data.get('display', {}).get('data', {})
nft_info = {
'object_id': data['objectId'],
'type': obj_type,
'name': display_data.get('name', 'Unknown NFT'),
'description': display_data.get('description', ''),
'image_url': display_data.get('image_url', ''),
'version': data['version']
}
categories['nfts'].append(nft_info)
elif '::package::' in obj_type:
package_info = {
'object_id': data['objectId'],
'type': obj_type,
'version': data['version']
}
categories['packages'].append(package_info)
else:
other_info = {
'object_id': data['objectId'],
'type': obj_type,
'version': data['version']
}
categories['other'].append(other_info)
summary = {
'total_objects': len(all_objects),
'coin_objects': len(categories['coins']),
'nft_objects': len(categories['nfts']),
'package_objects': len(categories['packages']),
'other_objects': len(categories['other'])
}
return {
'summary': summary,
'categories': categories
}
def analyze_portfolio(self, owner: str) -> Dict[str, Any]:
"""Comprehensive portfolio analysis"""
categorized = self.categorize_owned_objects(owner)
# Analyze coin balances
coin_analysis = defaultdict(lambda: {
'total_balance': 0,
'object_count': 0,
'objects': []
})
total_sui_balance = 0
for coin in categorized['categories']['coins']:
coin_type = coin['coin_type']
balance = int(coin['balance'])
coin_analysis[coin_type]['total_balance'] += balance
coin_analysis[coin_type]['object_count'] += 1
coin_analysis[coin_type]['objects'].append(coin['object_id'])
if coin_type == '0x2::sui::SUI':
total_sui_balance += balance
# Format balances for display
formatted_balances = []
for coin_type, data in coin_analysis.items():
is_sui = coin_type == '0x2::sui::SUI'
decimals = 9 if is_sui else 6 # Default assumption
symbol = 'SUI' if is_sui else coin_type.split('::')[-1]
formatted_balances.append({
'coin_type': coin_type,
'symbol': symbol,
'total_balance': data['total_balance'],
'formatted_balance': data['total_balance'] / (10 ** decimals),
'object_count': data['object_count']
})
return {
'summary': categorized['summary'],
'coin_balances': formatted_balances,
'nft_collection': categorized['categories']['nfts'],
'total_sui_balance': total_sui_balance,
'formatted_sui_balance': total_sui_balance / 1_000_000_000
}
def find_objects_by_type(
self,
owner: str,
object_type: str,
include_content: bool = True
) -> List[Dict[str, Any]]:
"""Find all objects of a specific type"""
type_filter = ObjectFilter(struct_type=object_type)
options = QueryOptions(
show_type=True,
show_content=include_content,
show_display=True
)
objects = self.get_all_owned_objects_paginated(
owner=owner,
query_filter=type_filter,
options=options
)
return [obj['data'] for obj in objects if obj.get('data')]
def get_object_history(
self,
owner: str,
object_type: Optional[str] = None,
days_back: int = 30
) -> Dict[str, Any]:
"""Track object ownership changes over time"""
query_filter = ObjectFilter(struct_type=object_type) if object_type else None
options = QueryOptions(
show_type=True,
show_previous_transaction=True,
show_content=True
)
current_objects = self.get_all_owned_objects_paginated(
owner=owner,
query_filter=query_filter,
options=options
)
# Group objects by type for analysis
type_analysis = defaultdict(lambda: {
'count': 0,
'objects': [],
'recent_transactions': set()
})
for obj in current_objects:
if not obj.get('data'):
continue
data = obj['data']
obj_type = data.get('type', 'Unknown')
type_analysis[obj_type]['count'] += 1
type_analysis[obj_type]['objects'].append({
'object_id': data['objectId'],
'version': data['version'],
'previous_transaction': data.get('previousTransaction')
})
if data.get('previousTransaction'):
type_analysis[obj_type]['recent_transactions'].add(
data['previousTransaction']
)
# Convert sets to lists for JSON serialization
for type_info in type_analysis.values():
type_info['recent_transactions'] = list(type_info['recent_transactions'])
return {
'owner': owner,
'total_objects': len(current_objects),
'type_breakdown': dict(type_analysis),
'analysis_timestamp': time.time()
}
def monitor_object_changes(
self,
owner: str,
callback: Callable,
interval_seconds: int = 60,
max_duration_minutes: int = 60
):
"""Monitor for object ownership changes"""
known_objects: Set[str] = set()
start_time = time.time()
max_duration_seconds = max_duration_minutes * 60
print(f"Starting object monitoring for {owner}")
# Initial state
try:
initial_result = self.get_owned_objects(
owner=owner,
options=QueryOptions(show_type=True),
limit=200
)
known_objects = {
obj['data']['objectId']
for obj in initial_result['data']
if obj.get('data')
}
print(f"Initial state: {len(known_objects)} objects")
except Exception as e:
print(f"Error in initial object fetch: {e}")
return
while (time.time() - start_time) < max_duration_seconds:
try:
time.sleep(interval_seconds)
current_result = self.get_owned_objects(
owner=owner,
options=QueryOptions(show_type=True),
limit=200
)
current_objects = {
obj['data']['objectId']
for obj in current_result['data']
if obj.get('data')
}
# Detect changes
new_objects = current_objects - known_objects
removed_objects = known_objects - current_objects
if new_objects or removed_objects:
changes = {
'timestamp': time.time(),
'new_objects': list(new_objects),
'removed_objects': list(removed_objects),
'total_objects': len(current_objects)
}
print(f"📦 Object changes detected: +{len(new_objects)}, -{len(removed_objects)}")
callback(changes)
known_objects = current_objects
except Exception as e:
print(f"Error in object monitoring: {e}")
print("Object monitoring completed")
# Usage examples
client = SuiOwnedObjectsClient('https://api-sui-mainnet-full.n.dwellir.com/YOUR_API_KEY')
# Example 1: Get all owned objects
address = '0xac5bceec1b789ff840d7d4e6ce4ce61c90d190a7f8c4f4ddf0bff6ee2413c33c'
basic_objects = client.get_owned_objects(address)
print(f"Found {len(basic_objects['data'])} objects")
# Example 2: Get SUI coins only
sui_coins = client.get_sui_coins(address)
total_sui = sum(int(coin['balance']) for coin in sui_coins)
print(f"SUI coins: {len(sui_coins)}, Total balance: {total_sui / 1_000_000_000:.4f} SUI")
# Example 3: Portfolio analysis
portfolio = client.analyze_portfolio(address)
print(f"\nPortfolio Summary:")
print(f"Total objects: {portfolio['summary']['total_objects']}")
print(f"Coin objects: {portfolio['summary']['coin_objects']}")
print(f"NFT objects: {portfolio['summary']['nft_objects']}")
print(f"Total SUI balance: {portfolio['formatted_sui_balance']:.4f} SUI")
# Example 4: Find specific object types
nft_objects = client.find_objects_by_type(
address,
"0x2::devnet_nft::DevNetNFT" # Example NFT type
)
print(f"Found {len(nft_objects)} NFT objects")
# Example 5: Monitor object changes
def on_object_change(changes):
print(f"Objects changed at {changes['timestamp']}")
print(f"New objects: {changes['new_objects']}")
print(f"Removed objects: {changes['removed_objects']}")
# Monitor for 5 minutes
client.monitor_object_changes(
address,
on_object_change,
interval_seconds=30,
max_duration_minutes=5
)
Response Example
{
"jsonrpc": "2.0",
"id": 1,
"result": {
"data": [
{
"data": {
"objectId": "0x001252886305b870c052d5318badfad8aaf534feb0712609b473f7b96b641b7a",
"version": "572463983",
"digest": "DuWWnJBDdxNkP3aBSPUH75TLsm2WCoBuTCYkT8LK5WF7",
"type": "0x2::coin::Coin<0x2::sui::SUI>",
"owner": {
"AddressOwner": "0xac5bceec1b789ff840d7d4e6ce4ce61c90d190a7f8c4f4ddf0bff6ee2413c33c"
},
"previousTransaction": "BfkQnYXcs65bH9fqrYwSmKiEug2scNaP7gMvBpgt8BFC",
"storageRebate": "988000",
"display": {
"data": null,
"error": null
},
"content": {
"dataType": "moveObject",
"type": "0x2::coin::Coin<0x2::sui::SUI>",
"hasPublicTransfer": true,
"fields": {
"balance": "1",
"id": {
"id": "0x001252886305b870c052d5318badfad8aaf534feb0712609b473f7b96b641b7a"
}
}
}
}
},
{
"data": {
"objectId": "0x001605877a9230849dcb4a7a7e647a619ea7038bbc371493218733d2f3989684",
"version": "576096045",
"digest": "HFju3NQwSQ8Y8P8PV6iDYJbvCtJhntEHnDpwXSJEx15K",
"type": "0x2::coin::Coin<0x549e8b69270defbfafd4f94e17ec44cdbdd99820b33bda2278dea3b9a32d3f55::cert::CERT>",
"owner": {
"AddressOwner": "0xac5bceec1b789ff840d7d4e6ce4ce61c90d190a7f8c4f4ddf0bff6ee2413c33c"
},
"previousTransaction": "BL5jDXkqmgf3TutxkDC7xVTssAcsi3NQ97WG9FgyMCnQ",
"storageRebate": "1322400",
"display": {
"data": null,
"error": null
},
"content": {
"dataType": "moveObject",
"type": "0x2::coin::Coin<0x549e8b69270defbfafd4f94e17ec44cdbdd99820b33bda2278dea3b9a32d3f55::cert::CERT>",
"hasPublicTransfer": true,
"fields": {
"balance": "2",
"id": {
"id": "0x001605877a9230849dcb4a7a7e647a619ea7038bbc371493218733d2f3989684"
}
}
}
}
},
{
"data": {
"objectId": "0x00174237e34225cdde2aae44e7564997d27fff62bd9856f54590a2c0391e774e",
"version": "565350797",
"digest": "BP4kWd4w9Rn4APzXwgzGj4HS29d1nyVn7d5wniMn26eW",
"type": "0x2::coin::Coin<0x7016aae72cfc67f2fadf55769c0a7dd54291a583b63051a5ed71081cce836ac6::sca::SCA>",
"owner": {
"AddressOwner": "0xac5bceec1b789ff840d7d4e6ce4ce61c90d190a7f8c4f4ddf0bff6ee2413c33c"
},
"previousTransaction": "FTc82Avq5SSY7Xn2EyMtWbTK3QVX53tKBesBV4hHwPn",
"storageRebate": "1307200",
"display": {
"data": null,
"error": null
},
"content": {
"dataType": "moveObject",
"type": "0x2::coin::Coin<0x7016aae72cfc67f2fadf55769c0a7dd54291a583b63051a5ed71081cce836ac6::sca::SCA>",
"hasPublicTransfer": true,
"fields": {
"balance": "1",
"id": {
"id": "0x00174237e34225cdde2aae44e7564997d27fff62bd9856f54590a2c0391e774e"
}
}
}
}
},
{
"data": {
"objectId": "0x001f9dacde28a18cfe9193b91c08bbed9f2b55408e4c44c81e1160cf06e2a157",
"version": "607720496",
"digest": "D6XzYGv594K2JWXVz5qkDqAqQXyxR8H5C3HiguRxvN51",
"type": "0x2::coin::Coin<0xdba34672e30cb065b1f93e3ab55318768fd6fef66c15942c9f7cb846e2f900e7::usdc::USDC>",
"owner": {
"AddressOwner": "0xac5bceec1b789ff840d7d4e6ce4ce61c90d190a7f8c4f4ddf0bff6ee2413c33c"
},
"previousTransaction": "4egnVDMQSt2a365FjBGeyaszTjdJ2Qbbjnqi1TEYu7Ut",
"storageRebate": "1322400",
"display": {
"data": null,
"error": null
},
"content": {
"dataType": "moveObject",
"type": "0x2::coin::Coin<0xdba34672e30cb065b1f93e3ab55318768fd6fef66c15942c9f7cb846e2f900e7::usdc::USDC>",
"hasPublicTransfer": true,
"fields": {
"balance": "1",
"id": {
"id": "0x001f9dacde28a18cfe9193b91c08bbed9f2b55408e4c44c81e1160cf06e2a157"
}
}
}
}
},
{
"data": {
"objectId": "0x0024ba0bf74cdfbfde1d7f4aed32faa5335f71c42de87d21e8ce09189391692d",
"version": "578586800",
"digest": "CkTyp8SgUNXMivsTwn9s6Zc99RPddsvdHgHBXCRpACTQ",
"type": "0x2::coin::Coin<0x2::sui::SUI>",
"owner": {
"AddressOwner": "0xac5bceec1b789ff840d7d4e6ce4ce61c90d190a7f8c4f4ddf0bff6ee2413c33c"
},
"previousTransaction": "Bm2c7ge1gymWKJZUvbonUJRqGJzuwauZP8wnX6kHZxRE",
"storageRebate": "988000",
"display": {
"data": null,
"error": null
},
"content": {
"dataType": "moveObject",
"type": "0x2::coin::Coin<0x2::sui::SUI>",
"hasPublicTransfer": true,
"fields": {
"balance": "1",
"id": {
"id": "0x0024ba0bf74cdfbfde1d7f4aed32faa5335f71c42de87d21e8ce09189391692d"
}
}
}
}
},
{
"data": {
"objectId": "0x0028f7506f818892d2748939d9d623f21583b4b259b40486006368ca58a91e59",
"version": "600503237",
"digest": "66KmtbnhhQzQVpsiXm36GY7PwKijEApuLcxMxekUYa3E",
"type": "0x2::coin::Coin<0xdba34672e30cb065b1f93e3ab55318768fd6fef66c15942c9f7cb846e2f900e7::usdc::USDC>",
"owner": {
"AddressOwner": "0xac5bceec1b789ff840d7d4e6ce4ce61c90d190a7f8c4f4ddf0bff6ee2413c33c"
},
"previousTransaction": "Ektq4Wwm1B1Wf39m7RBRGAiTMs7Xd8dRXNCyxu8M2YBK",
"storageRebate": "1322400",
"display": {
"data": null,
"error": null
},
"content": {
"dataType": "moveObject",
"type": "0x2::coin::Coin<0xdba34672e30cb065b1f93e3ab55318768fd6fef66c15942c9f7cb846e2f900e7::usdc::USDC>",
"hasPublicTransfer": true,
"fields": {
"balance": "1",
"id": {
"id": "0x0028f7506f818892d2748939d9d623f21583b4b259b40486006368ca58a91e59"
}
}
}
}
},
{
"data": {
"objectId": "0x00348dffc06530ed16765d4194af7554170ac6e63394b5fce735ceb8ef6af1ce",
"version": "570994278",
"digest": "9Xfdeq1TjWtv9TdYK2icxN7VEW8irYHmk62HXmUDedBY",
"type": "0x2::coin::Coin<0xdba34672e30cb065b1f93e3ab55318768fd6fef66c15942c9f7cb846e2f900e7::usdc::USDC>",
"owner": {
"AddressOwner": "0xac5bceec1b789ff840d7d4e6ce4ce61c90d190a7f8c4f4ddf0bff6ee2413c33c"
},
"previousTransaction": "GhtodA439s2mT7xan2gUhwtC5WtMLjqAKRQFHKYizgvm",
"storageRebate": "1322400",
"display": {
"data": null,
"error": null
},
"content": {
"dataType": "moveObject",
"type": "0x2::coin::Coin<0xdba34672e30cb065b1f93e3ab55318768fd6fef66c15942c9f7cb846e2f900e7::usdc::USDC>",
"hasPublicTransfer": true,
"fields": {
"balance": "1",
"id": {
"id": "0x00348dffc06530ed16765d4194af7554170ac6e63394b5fce735ceb8ef6af1ce"
}
}
}
}
},
{
"data": {
"objectId": "0x0041576aede4f926fff31f4b3f13646b9952707317be662570339d9d1c0d57db",
"version": "598436635",
"digest": "5Y5oGYLdirWHh4yiA9bGY4LwGdw4uArBB7kMoM2dtzug",
"type": "0x2::coin::Coin<0xc5b61b1e1f7f88511c9c0c6f475f823c66cc4e2d39a49beb6777059710be8404::toilet::TOILET>",
"owner": {
"AddressOwner": "0xac5bceec1b789ff840d7d4e6ce4ce61c90d190a7f8c4f4ddf0bff6ee2413c33c"
},
"previousTransaction": "69CP9ovPD7jn24QD8MDhARM8XQbzN3EgpvcEKJG5XpYc",
"storageRebate": "1352800",
"display": {
"data": null,
"error": null
},
"content": {
"dataType": "moveObject",
"type": "0x2::coin::Coin<0xc5b61b1e1f7f88511c9c0c6f475f823c66cc4e2d39a49beb6777059710be8404::toilet::TOILET>",
"hasPublicTransfer": true,
"fields": {
"balance": "1",
"id": {
"id": "0x0041576aede4f926fff31f4b3f13646b9952707317be662570339d9d1c0d57db"
}
}
}
}
},
{
"data": {
"objectId": "0x004d83b46588c8ed46580c05876a28650e6f46dc6374216741df890ba7649eae",
"version": "576461812",
"digest": "7AXdGKpAsc8uPyzFQBTadc5BJ5Gae3cYfs1QJJfmjaip",
"type": "0x2::coin::Coin<0xdba34672e30cb065b1f93e3ab55318768fd6fef66c15942c9f7cb846e2f900e7::usdc::USDC>",
"owner": {
"AddressOwner": "0xac5bceec1b789ff840d7d4e6ce4ce61c90d190a7f8c4f4ddf0bff6ee2413c33c"
},
"previousTransaction": "85oeDE1NfFscaeE1LQKNYWfsLU9fw6Qk7tz3z6HnKAcz",
"storageRebate": "1322400",
"display": {
"data": null,
"error": null
},
"content": {
"dataType": "moveObject",
"type": "0x2::coin::Coin<0xdba34672e30cb065b1f93e3ab55318768fd6fef66c15942c9f7cb846e2f900e7::usdc::USDC>",
"hasPublicTransfer": true,
"fields": {
"balance": "1",
"id": {
"id": "0x004d83b46588c8ed46580c05876a28650e6f46dc6374216741df890ba7649eae"
}
}
}
}
},
{
"data": {
"objectId": "0x004e1146cd1fe67f5f2c262842bd25b9cbc18e39cc5a5b4a1baf5d1cbbf3155d",
"version": "570426980",
"digest": "6TXY8E58XLJBRv6srN9WDTrHj23n7VHuHx476L2G3As4",
"type": "0x2::coin::Coin<0x2::sui::SUI>",
"owner": {
"AddressOwner": "0xac5bceec1b789ff840d7d4e6ce4ce61c90d190a7f8c4f4ddf0bff6ee2413c33c"
},
"previousTransaction": "Fj7BnzwGDufnnEFwRR1PwEM6o8jRx35DLaw2hfdWMtGC",
"storageRebate": "988000",
"display": {
"data": null,
"error": null
},
"content": {
"dataType": "moveObject",
"type": "0x2::coin::Coin<0x2::sui::SUI>",
"hasPublicTransfer": true,
"fields": {
"balance": "1",
"id": {
"id": "0x004e1146cd1fe67f5f2c262842bd25b9cbc18e39cc5a5b4a1baf5d1cbbf3155d"
}
}
}
}
},
{
"data": {
"objectId": "0x004ecc2d9bc0dc810bb62091d4791b76c84a37852a14227f9898b9fb18996078",
"version": "577864738",
"digest": "ApT3Yb74zMaE2UgFmSsg5vu3kHTyjRW2vMPY1ib2U9Y5",
"type": "0x2::coin::Coin<0x5d4b302506645c37ff133b98c4b50a5ae14841659738d6d733d59d0d217a93bf::coin::COIN>",
"owner": {
"AddressOwner": "0xac5bceec1b789ff840d7d4e6ce4ce61c90d190a7f8c4f4ddf0bff6ee2413c33c"
},
"previousTransaction": "Fsscn3KZRtwJfhRx9ogfU7b3NWVQwENTPGTAtyPPFwXm",
"storageRebate": "1322400",
"display": {
"data": null,
"error": null
},
"content": {
"dataType": "moveObject",
"type": "0x2::coin::Coin<0x5d4b302506645c37ff133b98c4b50a5ae14841659738d6d733d59d0d217a93bf::coin::COIN>",
"hasPublicTransfer": true,
"fields": {
"balance": "2",
"id": {
"id": "0x004ecc2d9bc0dc810bb62091d4791b76c84a37852a14227f9898b9fb18996078"
}
}
}
}
},
{
"data": {
"objectId": "0x005486bfe3febcd3d7b1c4899923132d6e872a53aa67d80ac97001f730292b28",
"version": "572617577",
"digest": "6Y9CQVtueva1icjonS2oqijwmaBCHY9Y1nBB5u87Xy9k",
"type": "0x2::coin::Coin<0xdba34672e30cb065b1f93e3ab55318768fd6fef66c15942c9f7cb846e2f900e7::usdc::USDC>",
"owner": {
"AddressOwner": "0xac5bceec1b789ff840d7d4e6ce4ce61c90d190a7f8c4f4ddf0bff6ee2413c33c"
},
"previousTransaction": "EcquFPeqKCLHtdfhXmY4HfTvqTLfaWfdy1Ca24F54ka2",
"storageRebate": "1322400",
"display": {
"data": null,
"error": null
},
"content": {
"dataType": "moveObject",
"type": "0x2::coin::Coin<0xdba34672e30cb065b1f93e3ab55318768fd6fef66c15942c9f7cb846e2f900e7::usdc::USDC>",
"hasPublicTransfer": true,
"fields": {
"balance": "1",
"id": {
"id": "0x005486bfe3febcd3d7b1c4899923132d6e872a53aa67d80ac97001f730292b28"
}
}
}
}
},
{
"data": {
"objectId": "0x0056a16006453296c31a824b5f3fcb900a60238f80f16f0a8f9f2b5560e08a9d",
"version": "571830865",
"digest": "CUeN8DdKSgjeT4FSGRFgtaqrn3nJBC7jezmdSc62fykY",
"type": "0x2::coin::Coin<0xdba34672e30cb065b1f93e3ab55318768fd6fef66c15942c9f7cb846e2f900e7::usdc::USDC>",
"owner": {
"AddressOwner": "0xac5bceec1b789ff840d7d4e6ce4ce61c90d190a7f8c4f4ddf0bff6ee2413c33c"
},
"previousTransaction": "7j7kUuSc2hMuGwmdqMXfh7jxiD9BkaEUA1ko53AWwhPQ",
"storageRebate": "1322400",
"display": {
"data": null,
"error": null
},
"content": {
"dataType": "moveObject",
"type": "0x2::coin::Coin<0xdba34672e30cb065b1f93e3ab55318768fd6fef66c15942c9f7cb846e2f900e7::usdc::USDC>",
"hasPublicTransfer": true,
"fields": {
"balance": "1",
"id": {
"id": "0x0056a16006453296c31a824b5f3fcb900a60238f80f16f0a8f9f2b5560e08a9d"
}
}
}
}
},
{
"data": {
"objectId": "0x005833079ed542caa136560f01ea30b0d4f60951d26f460c15276d2e1074822a",
"version": "593373069",
"digest": "69k3gKu8mx2xmiQBxdRp22WfwWpWbYXGVTEcxDevNobF",
"type": "0x2::coin::Coin<0xc5b61b1e1f7f88511c9c0c6f475f823c66cc4e2d39a49beb6777059710be8404::toilet::TOILET>",
"owner": {
"AddressOwner": "0xac5bceec1b789ff840d7d4e6ce4ce61c90d190a7f8c4f4ddf0bff6ee2413c33c"
},
"previousTransaction": "D5dCHG1Cc9ZxXDGDfiLCKeLLv5xFs1kSF6Ni7A8hQV3B",
"storageRebate": "1352800",
"display": {
"data": null,
"error": null
},
"content": {
"dataType": "moveObject",
"type": "0x2::coin::Coin<0xc5b61b1e1f7f88511c9c0c6f475f823c66cc4e2d39a49beb6777059710be8404::toilet::TOILET>",
"hasPublicTransfer": true,
"fields": {
"balance": "1",
"id": {
"id": "0x005833079ed542caa136560f01ea30b0d4f60951d26f460c15276d2e1074822a"
}
}
}
}
},
{
"data": {
"objectId": "0x0061efff3422608289e9b2c1bfdb8ffa8e62a83c500a633acdd685e2d4150398",
"version": "565563178",
"digest": "Ez2L2Aa1aoSERH5HvkshAFM6xoZ65X7EoMtJ4nQQCNNL",
"type": "0x2::coin::Coin<0xd1b72982e40348d069bb1ff701e634c117bb5f741f44dff91e472d3b01461e55::stsui::STSUI>",
"owner": {
"AddressOwner": "0xac5bceec1b789ff840d7d4e6ce4ce61c90d190a7f8c4f4ddf0bff6ee2413c33c"
},
"previousTransaction": "UohR1oFHt3m6DY3qMXESyWbr26KBfHJKiCZieuPTKwj",
"storageRebate": "1337600",
"display": {
"data": null,
"error": null
},
"content": {
"dataType": "moveObject",
"type": "0x2::coin::Coin<0xd1b72982e40348d069bb1ff701e634c117bb5f741f44dff91e472d3b01461e55::stsui::STSUI>",
"hasPublicTransfer": true,
"fields": {
"balance": "1",
"id": {
"id": "0x0061efff3422608289e9b2c1bfdb8ffa8e62a83c500a633acdd685e2d4150398"
}
}
}
}
},
{
"data": {
"objectId": "0x006bbb46da8ddde7f7947f4f1be4f309b8fbbcc5a6ca6e5e4319da6cb873169e",
"version": "570735724",
"digest": "8rwnVW9GxquCM9rrQxH7sw87x1xAAPGqDxwMcrdBXVJw",
"type": "0x2::coin::Coin<0x2::sui::SUI>",
"owner": {
"AddressOwner": "0xac5bceec1b789ff840d7d4e6ce4ce61c90d190a7f8c4f4ddf0bff6ee2413c33c"
},
"previousTransaction": "7moxFChqKTk7fPwRiJ4zRJHCnt1dtxcU2Z5Yav5kWhaH",
"storageRebate": "988000",
"display": {
"data": null,
"error": null
},
"content": {
"dataType": "moveObject",
"type": "0x2::coin::Coin<0x2::sui::SUI>",
"hasPublicTransfer": true,
"fields": {
"balance": "1",
"id": {
"id": "0x006bbb46da8ddde7f7947f4f1be4f309b8fbbcc5a6ca6e5e4319da6cb873169e"
}
}
}
}
},
{
"data": {
"objectId": "0x007000940cc1b30f39b32e2fdf3be7cfaaacee588a49a3b189eaf89887ffd66a",
"version": "569571382",
"digest": "AiNE5zDkNMmS6PpgiUCVY4mMkzGG7ggrD1F1KnZ2p9sT",
"type": "0x2::coin::Coin<0xdba34672e30cb065b1f93e3ab55318768fd6fef66c15942c9f7cb846e2f900e7::usdc::USDC>",
"owner": {
"AddressOwner": "0xac5bceec1b789ff840d7d4e6ce4ce61c90d190a7f8c4f4ddf0bff6ee2413c33c"
},
"previousTransaction": "4fLUiEwuhAu2s4fA3du4jL931mEXHoYsGfrRCa4DV6H9",
"storageRebate": "1322400",
"display": {
"data": null,
"error": null
},
"content": {
"dataType": "moveObject",
"type": "0x2::coin::Coin<0xdba34672e30cb065b1f93e3ab55318768fd6fef66c15942c9f7cb846e2f900e7::usdc::USDC>",
"hasPublicTransfer": true,
"fields": {
"balance": "1",
"id": {
"id": "0x007000940cc1b30f39b32e2fdf3be7cfaaacee588a49a3b189eaf89887ffd66a"
}
}
}
}
},
{
"data": {
"objectId": "0x008b09c2f37d426576488456cfca0d472a9c9dbbaf850d36a47d879eca608867",
"version": "577503692",
"digest": "HrG1YNBB56ardU6tvuETsWYmLXKDPE46MRtwiQMhvP3q",
"type": "0x2::coin::Coin<0x2::sui::SUI>",
"owner": {
"AddressOwner": "0xac5bceec1b789ff840d7d4e6ce4ce61c90d190a7f8c4f4ddf0bff6ee2413c33c"
},
"previousTransaction": "Bzmmpm6bkgSGeS42AvQe5cr5FV8sBD8goWodgJ4QnTgK",
"storageRebate": "988000",
"display": {
"data": null,
"error": null
},
"content": {
"dataType": "moveObject",
"type": "0x2::coin::Coin<0x2::sui::SUI>",
"hasPublicTransfer": true,
"fields": {
"balance": "1",
"id": {
"id": "0x008b09c2f37d426576488456cfca0d472a9c9dbbaf850d36a47d879eca608867"
}
}
}
}
},
{
"data": {
"objectId": "0x009c9627132dc048c4abf5f1dd89c7f4a055ce1b0c0dfbe8bf0422c25c727b71",
"version": "575943876",
"digest": "ECfTDtFfsuSNXBY6rHngFmaYj6YGf5ymUY22ZWR1wH8b",
"type": "0x2::coin::Coin<0xdba34672e30cb065b1f93e3ab55318768fd6fef66c15942c9f7cb846e2f900e7::usdc::USDC>",
"owner": {
"AddressOwner": "0xac5bceec1b789ff840d7d4e6ce4ce61c90d190a7f8c4f4ddf0bff6ee2413c33c"
},
"previousTransaction": "AeH8kJZkxMPi4HtZFvnETHxFqynnFy7BaNXk3D3rhUiv",
"storageRebate": "1322400",
"display": {
"data": null,
"error": null
},
"content": {
"dataType": "moveObject",
"type": "0x2::coin::Coin<0xdba34672e30cb065b1f93e3ab55318768fd6fef66c15942c9f7cb846e2f900e7::usdc::USDC>",
"hasPublicTransfer": true,
"fields": {
"balance": "2",
"id": {
"id": "0x009c9627132dc048c4abf5f1dd89c7f4a055ce1b0c0dfbe8bf0422c25c727b71"
}
}
}
}
},
{
"data": {
"objectId": "0x00a3fa4578f1394c17041a1afa69a81eeed5ef5ac38157e69ec6d3f7f561f36f",
"version": "581751835",
"digest": "Am6NGnxsWjjzQm7qtP7YKUidtCKr2s9FBs96SbX7nBDv",
"type": "0x2::coin::Coin<0x960b531667636f39e85867775f52f6b1f220a058c4de786905bdf761e06a56bb::usdy::USDY>",
"owner": {
"AddressOwner": "0xac5bceec1b789ff840d7d4e6ce4ce61c90d190a7f8c4f4ddf0bff6ee2413c33c"
},
"previousTransaction": "8y5kJLTVQWqLBHXYGnMvdiX7qcthkFx1NdBedxb81sfa",
"storageRebate": "1322400",
"display": {
"data": null,
"error": null
},
"content": {
"dataType": "moveObject",
"type": "0x2::coin::Coin<0x960b531667636f39e85867775f52f6b1f220a058c4de786905bdf761e06a56bb::usdy::USDY>",
"hasPublicTransfer": true,
"fields": {
"balance": "2",
"id": {
"id": "0x00a3fa4578f1394c17041a1afa69a81eeed5ef5ac38157e69ec6d3f7f561f36f"
}
}
}
}
},
{
"data": {
"objectId": "0x00ae57b4a86b8342d7afaaaf3d79cee783e703ab871ab58fb616a5ec9f1bffa4",
"version": "569570303",
"digest": "BjnWkE6WRX8XYpaG5K5fyr9nNG7AddUKGHu5HcfwmkCE",
"type": "0x2::coin::Coin<0x356a26eb9e012a68958082340d4c4116e7f55615cf27affcff209cf0ae544f59::wal::WAL>",
"owner": {
"AddressOwner": "0xac5bceec1b789ff840d7d4e6ce4ce61c90d190a7f8c4f4ddf0bff6ee2413c33c"
},
"previousTransaction": "4ckbRkeJVn1o58Dp5kFwcZzdkuGM457TPgD8DBVMiahr",
"storageRebate": "1307200",
"display": {
"data": null,
"error": null
},
"content": {
"dataType": "moveObject",
"type": "0x2::coin::Coin<0x356a26eb9e012a68958082340d4c4116e7f55615cf27affcff209cf0ae544f59::wal::WAL>",
"hasPublicTransfer": true,
"fields": {
"balance": "6826",
"id": {
"id": "0x00ae57b4a86b8342d7afaaaf3d79cee783e703ab871ab58fb616a5ec9f1bffa4"
}
}
}
}
},
{
"data": {
"objectId": "0x00b2de5a2c58b01f116305d343b181ed739ea9f376151079b9fd7b8b69c514ba",
"version": "576372824",
"digest": "JAVmD5q7qM94vaiSAJHTvHstS7RFUpfRDcnTcLXnQwR2",
"type": "0x2::coin::Coin<0xdba34672e30cb065b1f93e3ab55318768fd6fef66c15942c9f7cb846e2f900e7::usdc::USDC>",
"owner": {
"AddressOwner": "0xac5bceec1b789ff840d7d4e6ce4ce61c90d190a7f8c4f4ddf0bff6ee2413c33c"
},
"previousTransaction": "DTihi1bt3h9MoZHEqFmYvrjnPDd6H2behP89kNEPLqPc",
"storageRebate": "1322400",
"display": {
"data": null,
"error": null
},
"content": {
"dataType": "moveObject",
"type": "0x2::coin::Coin<0xdba34672e30cb065b1f93e3ab55318768fd6fef66c15942c9f7cb846e2f900e7::usdc::USDC>",
"hasPublicTransfer": true,
"fields": {
"balance": "1",
"id": {
"id": "0x00b2de5a2c58b01f116305d343b181ed739ea9f376151079b9fd7b8b69c514ba"
}
}
}
}
},
{
"data": {
"objectId": "0x00b2faab31322c721ea1cfe77e40d7f59464389554a8b92e5672ca4fa57bea1f",
"version": "570661070",
"digest": "81hR2ezgQtBXXcZ69oxtbhZnRuJvbnoeV5DFnvUh6a5",
"type": "0x2::coin::Coin<0x2::sui::SUI>",
"owner": {
"AddressOwner": "0xac5bceec1b789ff840d7d4e6ce4ce61c90d190a7f8c4f4ddf0bff6ee2413c33c"
},
"previousTransaction": "8oNJTWi8nAbEM5bRZyQWWD7j7YBR8KAdW56ExFYaRxcw",
"storageRebate": "988000",
"display": {
"data": null,
"error": null
},
"content": {
"dataType": "moveObject",
"type": "0x2::coin::Coin<0x2::sui::SUI>",
"hasPublicTransfer": true,
"fields": {
"balance": "1",
"id": {
"id": "0x00b2faab31322c721ea1cfe77e40d7f59464389554a8b92e5672ca4fa57bea1f"
}
}
}
}
},
{
"data": {
"objectId": "0x00b6bb0bd85eda04d35098b3ae59e8878efa7654f6f90b1afb3798aea5b32256",
"version": "572675785",
"digest": "GGRimVf8U9VLiChFW39syh4Z6amiKtfKfDFxjcLnSN9u",
"type": "0x2::coin::Coin<0xdba34672e30cb065b1f93e3ab55318768fd6fef66c15942c9f7cb846e2f900e7::usdc::USDC>",
"owner": {
"AddressOwner": "0xac5bceec1b789ff840d7d4e6ce4ce61c90d190a7f8c4f4ddf0bff6ee2413c33c"
},
"previousTransaction": "Bi5Tn9s7Vv9UPiXscVQjJEtGyGehAUXM1mKm42fibaK",
"storageRebate": "1322400",
"display": {
"data": null,
"error": null
},
"content": {
"dataType": "moveObject",
"type": "0x2::coin::Coin<0xdba34672e30cb065b1f93e3ab55318768fd6fef66c15942c9f7cb846e2f900e7::usdc::USDC>",
"hasPublicTransfer": true,
"fields": {
"balance": "3",
"id": {
"id": "0x00b6bb0bd85eda04d35098b3ae59e8878efa7654f6f90b1afb3798aea5b32256"
}
}
}
}
},
{
"data": {
"objectId": "0x00be5ffcddfb8a434370ae35e21e8cfc0726843349bb985f1f507d072b687c33",
"version": "570077610",
"digest": "7R7RCYoSPJCtGmKvLVgzHeimG7MFzpCVxXyNSnkKh5mC",
"type": "0x2::coin::Coin<0x2::sui::SUI>",
"owner": {
"AddressOwner": "0xac5bceec1b789ff840d7d4e6ce4ce61c90d190a7f8c4f4ddf0bff6ee2413c33c"
},
"previousTransaction": "6fc1oZqewajJoANfL3LYNf93qVr2oUeVscoM1GPLThJh",
"storageRebate": "988000",
"display": {
"data": null,
"error": null
},
"content": {
"dataType": "moveObject",
"type": "0x2::coin::Coin<0x2::sui::SUI>",
"hasPublicTransfer": true,
"fields": {
"balance": "1",
"id": {
"id": "0x00be5ffcddfb8a434370ae35e21e8cfc0726843349bb985f1f507d072b687c33"
}
}
}
}
}
],
"nextCursor": "0x00be5ffcddfb8a434370ae35e21e8cfc0726843349bb985f1f507d072b687c33",
"hasNextPage": true
}
}
Common Use Cases
1. Wallet Asset Discovery
async function buildWalletAssets(address) {
const portfolio = await analyzePortfolio(address);
return {
balances: portfolio.coinBalances.map(coin => ({
symbol: coin.symbol,
balance: coin.formattedBalance,
usdValue: 0, // Would need price feed integration
objectCount: coin.objectCount
})),
collectibles: portfolio.nftCollection.map(nft => ({
name: nft.name,
image: nft.imageUrl,
collection: nft.type.split('::')[0] // Extract package ID
})),
totalAssets: portfolio.summary.totalObjects
};
}
2. Object Type Analytics
async function analyzeObjectTypes(addresses) {
const typeDistribution = {};
for (const address of addresses) {
const objects = await getAllObjectsPaginated(address);
objects.forEach(obj => {
const type = obj.data?.type || 'Unknown';
typeDistribution[type] = (typeDistribution[type] || 0) + 1;
});
}
return Object.entries(typeDistribution)
.sort(([,a], [,b]) => b - a)
.slice(0, 20); // Top 20 types
}
3. NFT Collection Management
async function manageNFTCollection(address) {
const categorized = await categorizeOwnedObjects(address);
const nfts = categorized.categories.nfts;
// Group by collection (package)
const collections = {};
nfts.forEach(nft => {
const collection = nft.type.split('::')[0];
if (!collections[collection]) {
collections[collection] = [];
}
collections[collection].push(nft);
});
return Object.entries(collections).map(([packageId, nfts]) => ({
packageId: packageId,
name: nfts[0]?.type.split('::')[1] || 'Unknown Collection',
count: nfts.length,
items: nfts.map(nft => ({
objectId: nft.objectId,
name: nft.name,
image: nft.imageUrl
}))
}));
}
Best Practices
- Use pagination for addresses with many objects to avoid timeouts
- Filter by type when you only need specific object categories
- Request minimal data by configuring options appropriately
- Cache results for frequently accessed data to improve performance
- Handle empty results gracefully for addresses with no objects
- Monitor changes for real-time applications using periodic polling
Error Handling
async function safeGetOwnedObjects(address, options = {}) {
try {
const result = await client.getOwnedObjects({
owner: address,
...options
});
return {
success: true,
data: result
};
} catch (error) {
if (error.message.includes('Invalid address')) {
return {
success: false,
error: 'Invalid Sui address format'
};
}
return {
success: false,
error: 'Failed to fetch objects',
details: error.message
};
}
}
Related Methods
- sui_getObject - Get detailed object information
- suix_getBalance - Query coin balances
- suix_getCoins - Get coin objects with balances
Need help? Contact our support team or check the Sui documentation.