UNPKG

@layerzerolabs/lz-sui-sdk-v2

Version:

111 lines (99 loc) 4.07 kB
import { SuiClient } from '@mysten/sui/client' import { Transaction, TransactionArgument, TransactionResult } from '@mysten/sui/transactions' import { ModuleManager } from '../../module-manager' import { ObjectOptions } from '../../types' import { asAddress, executeSimulate } from '../../utils' const MODULE_NAME = 'worker_registry' export const WorkerRegistryErrorCode = { // WorkerRegistry related errors (matching worker_registry.move) EWorkerInfoInvalid: 1, EWorkerInfoNotFound: 2, } as const /** * WorkerRegistry provides access to the worker registry contract functionality * This module maintains mappings between worker addresses and their associated information. */ export class WorkerRegistry { public packageId: string public readonly client: SuiClient private readonly objects: ObjectOptions /** * Create a new WorkerRegistry instance * @param packageId - The package ID of the worker registry contract * @param client - The Sui client instance * @param objects - Object options containing contract object IDs * @param moduleManager - Module manager for handling dependencies */ constructor( packageId: string, client: SuiClient, objects: ObjectOptions, private readonly moduleManager: ModuleManager ) { this.packageId = packageId this.client = client this.objects = objects } // === View Functions === /** * Get worker info for a specific worker address (as a move call) * This creates a move call that can be used in a PTB (Programmable Transaction Block) * @param tx - The transaction to add the move call to * @param worker - The worker address or transaction argument * @returns TransactionResult - The move call result containing worker info bytes * @throws Will throw an error if worker info is not found (EWorkerInfoNotFound) */ getWorkerInfoMoveCall(tx: Transaction, worker: string | TransactionArgument): TransactionResult { return tx.moveCall({ target: this.#target('get_worker_info'), arguments: [tx.object(this.objects.workerRegistry), asAddress(tx, worker)], }) } /** * Get worker info for a specific worker address * Executes the get_worker_info function and returns the worker information bytes * @param worker - The worker address to get info for * @returns Promise<Uint8Array> - The worker information bytes containing encoded worker data * @throws Will throw an error if worker info is not found (EWorkerInfoNotFound) */ async getWorkerInfo(worker: string): Promise<Uint8Array> { return executeSimulate( this.client, (tx) => { this.getWorkerInfoMoveCall(tx, worker) }, (result) => { return result[0].value } ) } /** * Check if worker info exists for a specific worker address * This is a convenience method that catches EWorkerInfoNotFound errors * @param worker - The worker address to check * @returns Promise<boolean> - True if worker info exists, false if not found * @throws Will re-throw any errors other than EWorkerInfoNotFound */ async hasWorkerInfo(worker: string): Promise<boolean> { try { await this.getWorkerInfo(worker) return true } catch (error) { // If the error is EWorkerInfoNotFound, return false if (error instanceof Error && error.message.includes('EWorkerInfoNotFound')) { return false } // Re-throw other errors throw error } } // === Private Functions === /** * Generate the target string for move calls * @param functionName - The function name to call * @returns The fully qualified target string for the move call */ #target(functionName: string): string { return `${this.packageId}::${MODULE_NAME}::${functionName}` } }