APIリファレンス: getOwnedObjects
特定の 32 バイトの Sui ウォレットアドレスが所有するオンチェーンオブジェクトのリストを、ページ単位で取得します。
このメソッドを使用して、ウォレットのダッシュボード、ユーザーのインベントリ画面、トークン残高リストにデータを取り込むことができます。1つのアカウントが数千ものオブジェクトを保有している可能性があるため、Sui JSON-RPC APIはカーソルベースのページネーションを使用して、所有オブジェクトを個別のページ単位で返します。getOwnedObjects はフルノードのローカル状態から直接提供される読み取り操作であるため、トランザクションを送信したりガスを消費したりすることなく、即座に実行されます。
- クラス:
SuiClient - パッケージ:
@mysten/sui/client - 操作タイプ: 読み取り操作(ガス不要、ウォレット署名不要)
概要
getOwnedObjects を呼び出すと、フルノードのインデックスに対して、対象アドレス(AddressOwner)に所有権が割り当てられているオブジェクトが照会されます。高いレイテンシやネットワークタイムアウトを回避するため、フルノードは結果を一度にすべて返すのではなく、ページ分割して返します。
ページネーションループの可視化
- Mermaid (画像)
- Mermaid (コード)
- ASCII
flowchart TD
Start([ページネーションを開始]) --> Init["cursor = null を初期化<br/>allObjects = []"]
Init --> Query["getOwnedObjects を呼び出す<br/>(cursor, limit: 50)"]
Query --> Resp["応答を受信:<br/>data[], hasNextPage, nextCursor"]
Resp --> Append["allObjects 配列に<br/>項目を追加"]
Append --> Check{"hasNextPage == true?"}
Check -->|はい| Update["cursor = nextCursor に更新"]
Check -->|いいえ| Done([蓄積されたすべてのオブジェクトを返す])
Update -.->|次のページ| Query
ページネーションの流れ(カーソルループ):
クライアント フルノード
│ │
│── getOwnedObjects(cursor: null) ──────────►│ (ページ 1:limit 50)
│◄── { data: [50 items], nextCursor } ───────│
│ │
│── getOwnedObjects(cursor: nextCursor) ────►│ (ページ 2:limit 50)
│◄── { data: [12 items], hasNextPage: false }
シグネチャ
シグネチャ
client.getOwnedObjects(input: GetOwnedObjectsParams): Promise<PaginatedObjectsResponse>
パラメータ
このメソッドは、以下のプロパティを持つ設定オブジェクトを受け付けます:
| パラメータ | タイプ | 必須 | 説明 |
|---|---|---|---|
owner | string | はい | ターゲットウォレットの 32 バイトの 16 進数アドレス。 |
filter | SuiObjectDataFilter | いいえ | タイプ、パッケージ、またはモジュールによる結果のフィルタリング条件。 |
options | SuiObjectDataOptions | いいえ | 追加の詳細情報を含めるためのフラグ(例:showType, showContent, showDisplay)。 |
cursor | string | null | いいえ | 次のページを取得するための、前回のレスポンスから得られた nextCursor トークン。 |
limit | number | いいえ | 1ページあたりに返す最大アイテム数(パブリックRPCノードでは、デフォルトおよび最大値は通常50です)。 |
SuiObjectDataFilter
filter パラメータはフルノードでのクエリを絞り込み、帯域幅とクライアント側の処理負荷を節約します:
| フィルタキー | 値のタイプ | 説明 |
|---|---|---|
MatchAll | SuiObjectDataFilter[] | 論理 AND。オブジェクトは、指定されたすべてのフィルタ条件を満たす必要があります。 |
MatchAny | SuiObjectDataFilter[] | 論理 OR。オブジェクトは、指定されたフィルタ条件のいずれかを満たしていればよい。 |
StructType | string | 完全修飾された Move Struct 型との完全一致(例:0x2::coin::Coin<0x2::sui::SUI>)。 |
Package | string | 指定されたパッケージID内のモジュールからインスタンス化された任意のオブジェクトに一致します。 |
MoveModule | { package: string, module: string } | パッケージ内の特定のモジュールで定義された任意のオブジェクトに一致します。 |
戻り値
PaginatedObjectsResponse オブジェクトに解決される Promise を返します:
レスポンス
{
"data": [
{ "data": { "objectId": "0xA...", "version": "1", "type": "0x2::coin::Coin<0x2::sui::SUI>" } },
{ "data": { "objectId": "0xB...", "version": "4", "type": "0x2::coin::Coin<0x2::sui::SUI>" } }
],
"hasNextPage": true,
"nextCursor": "0x12345...ResultCursor"
}
レスポンスエンベロープには、以下のフィールドが含まれます:
| フィールド | タイプ | 説明 |
|---|---|---|
data | SuiObjectResponse[] | 現在のページに対するオブジェクトレスポンスエンベロープの配列。 |
hasNextPage | boolean | オブジェクトの追加ページが存在するかどうかを示します。 |
nextCursor | string | null | 次の呼び出しで cursor として渡す不透明なページネーショントークン。hasNextPage が false の場合、この値は null になります。 |
使用例
インベントリの最初のページを取得する
アドレスが所有する最初の5つのオブジェクトを取得します:
basicInventory.js
const response = await client.getOwnedObjects({
owner: '0x0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef',
limit: 5,
options: { showType: true }
});
response.data.forEach((item) => {
if (item.data) {
console.log(`ID: ${item.data.objectId}, Type: ${item.data.type}`);
}
});
Move構造体のタイプでアセットをフィルタリングする
他のトークンやNFTを除き、ユーザーが所有するSUIコインオブジェクトのみをクエリします:
filterCoins.js
const response = await client.getOwnedObjects({
owner: '0x0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef',
filter: {
StructType: '0x2::coin::Coin<0x2::sui::SUI>'
},
options: { showContent: true }
});
console.log(`取得された SUI コインオブジェクト数: ${response.data.length}`);
所有するすべてのオブジェクトをページネーションで取得する
while ループを使用して、アドレスが所有するすべてのオブジェクトを順に処理します:
pagination.js
let hasNextPage = true;
let nextCursor = null;
const allObjects = [];
while (hasNextPage) {
const response = await client.getOwnedObjects({
owner: '0x0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef',
cursor: nextCursor,
limit: 50
});
allObjects.push(...response.data);
hasNextPage = response.hasNextPage;
nextCursor = response.nextCursor;
}
console.log(`取得されたオブジェクトの総数: ${allObjects.length}`);
一般的なエラー
| エラーコード | 原因 | 解決方法 |
|---|---|---|
cursor_invalid | cursor に渡された文字列は、有効期限が切れているか、形式が不正であるか、または別のクエリに由来するものです。 | 前のクエリで nextCursor から返された文字列をそのまま渡してください。 |
limit_exceeded | 要求された limit がフルノードで許可されている最大ページサイズ(通常は 50)を超えています。 | limit パラメータを50件以下に減らしてください。 |
関連項目
getObjectは個々のオンチェーンオブジェクトの詳細を取得します。multiGetObjectsは単一のバッチリクエストで、複数の特定のオブジェクトの詳細を取得します。- オブジェクトデータの取得方法 は Node.js で読み取り操作を実装するためのステップバイステップのチュートリアルを提供します。
- SuiClientのアーキテクチャ は
SuiClientおよび読み取り操作の概念的な設計について説明します。