Referencia de la API: getOwnedObjects
Recupera una lista paginada de objetos en cadena que pertenecen a una dirección de monedero Sui específica de 32 bytes.
Utiliza este método para rellenar paneles de control de monederos, pantallas de inventario de usuarios y listas de saldos de tokens. Dado que una sola cuenta puede contener miles de objetos, la API JSON-RPC de Sui devuelve los objetos en propiedad en páginas separadas mediante paginación basada en cursor. Como getOwnedObjects es una operación de lectura que se realiza directamente desde el estado local del nodo completo, se ejecuta de forma inmediata sin enviar una transacción ni consumir gas.
- Clase:
SuiClient - Paquete:
@mysten/sui/client - Tipo de operación: operación de lectura (sin gas, sin firma de monedero)
Resumen
Al llamar a getOwnedObjects se consulta el índice del nodo completo en busca de objetos cuya propiedad esté asignada a la dirección de destino (AddressOwner). Para evitar una alta latencia y tiempos de espera de red, los nodos completos paginan los resultados en lugar de devolver todo el inventario en una única respuesta.
Visualización del bucle de paginación
- Mermaid (imagen)
- Mermaid (código)
- ASCII
flowchart TD
Start([Iniciar paginación]) --> Init["Inicializar cursor = null<br/>allObjects = []"]
Init --> Query["Llamar a getOwnedObjects<br/>(cursor, limit: 50)"]
Query --> Resp["Recibir respuesta:<br/>data[], hasNextPage, nextCursor"]
Resp --> Append["Añadir elementos al<br/>array allObjects"]
Append --> Check{"¿hasNextPage == true?"}
Check -->|Sí| Update["Actualizar cursor = nextCursor"]
Check -->|No| Done([Devolver todos los objetos acumulados])
Update -.->|Página siguiente| Query
Flujo de paginación (bucle de cursor):
Cliente Nodo completo
│ │
│── getOwnedObjects(cursor: null) ──────────►│ (Página 1: límite 50)
│◄── { data: [50 items], nextCursor } ───────│
│ │
│── getOwnedObjects(cursor: nextCursor) ────►│ (Página 2: límite 50)
│◄── { data: [12 items], hasNextPage: false }
Firma
client.getOwnedObjects(input: GetOwnedObjectsParams): Promise<PaginatedObjectsResponse>
Parámetros
El método acepta un objeto de configuración con las siguientes propiedades:
| Parámetro | Tipo | Requerido | Descripción |
|---|---|---|---|
owner | string | Sí | La dirección hexadecimal de 32 bytes de la cartera de destino. |
filter | SuiObjectDataFilter | No | Criterios para filtrar los resultados por tipo, paquete o módulo. |
options | SuiObjectDataOptions | No | Indicadores para incluir detalles adicionales (por ejemplo, showType, showContent, showDisplay). |
cursor | string | null | No | El token nextCursor de una respuesta anterior para recuperar la página siguiente. |
limit | number | No | Número máximo de elementos que se pueden devolver por página (el valor por defecto y el máximo suele ser 50 en los nodos RPC públicos). |
SuiObjectDataFilter
El parámetro filter restringe las consultas en el nodo completo, lo que ahorra ancho de banda y procesamiento del lado del cliente:
| Clave de filtro | Tipo de valor | Descripción |
|---|---|---|
MatchAll | SuiObjectDataFilter[] | Y lógico. Un objeto debe cumplir todos los criterios de filtro proporcionados. |
MatchAny | SuiObjectDataFilter[] | O lógico. Un objeto puede cumplir cualquiera de los criterios de filtro proporcionados. |
StructType | string | Coincidencia exacta con un tipo Move Struct completamente calificado (por ejemplo, 0x2::coin::Coin<0x2::sui::SUI>). |
Package | string | Coincide con cualquier objeto instanciado a partir de módulos dentro del ID de paquete especificado. |
MoveModule | { package: string, module: string } | Coincide con cualquier objeto definido dentro de un módulo específico de un paquete. |
Valor de retorno
Devuelve una Promise que se resuelve en un objeto PaginatedObjectsResponse:
{
"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"
}
La envoltura de respuesta contiene los siguientes campos:
| Campo | Tipo | Descripción |
|---|---|---|
data | SuiObjectResponse[] | Matriz de envolturas de respuesta de objetos para la página actual. |
hasNextPage | boolean | Indica si existen páginas adicionales de objetos. |
nextCursor | string | null | Token de paginación opaco para pasar como cursor en la siguiente llamada. Cuando hasNextPage es false, este valor es null. |
Ejemplos de uso
Recuperar la primera página de un inventario
Recupera los primeros 5 objetos que posee una dirección:
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}`);
}
});
Filtrar activos por tipo de estructura Move
Consulta únicamente los objetos de monedas SUI que posee un usuario, excluyendo otros tokens y NFT:
const response = await client.getOwnedObjects({
owner: '0x0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef',
filter: {
StructType: '0x2::coin::Coin<0x2::sui::SUI>'
},
options: { showContent: true }
});
console.log(`Objetos de monedas SUI encontrados: ${response.data.length}`);
Paginación de todos los objetos que se poseen
Utiliza un bucle while para recorrer todos los objetos que posee una dirección:
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(`Total de objetos obtenidos: ${allObjects.length}`);
Errores comunes
| Código de error | Causa | Resolución |
|---|---|---|
cursor_invalid | La cadena pasada a cursor ha caducado, tiene un formato incorrecto o procede de una consulta diferente. | Pasa la cadena exacta devuelta en nextCursor de la consulta anterior. |
limit_exceeded | El límite solicitado supera el tamaño máximo de página permitido por el nodo completo (normalmente 50). | Reduce el parámetro de limit a 50 elementos o menos. |
Véase también
getObjectrecupera detalles de un objeto individual en la cadena.multiGetObjectsrecupera detalles de varios objetos específicos en una única solicitud por lotes.- Cómo obtener datos de objetos ofrece un tutorial paso a paso para implementar operaciones de lectura en Node.js.
- La arquitectura de SuiClient explica el diseño conceptual de
SuiClienty las operaciones de lectura.