diff --git a/packages/devtools-aptos/package.json b/packages/devtools-aptos/package.json new file mode 100644 index 000000000..d0a3af775 --- /dev/null +++ b/packages/devtools-aptos/package.json @@ -0,0 +1,65 @@ +{ + "name": "@layerzerolabs/devtools-aptos", + "version": "0.1.0", + "description": "Developer utilities for working with LayerZero Aptos contracts", + "repository": { + "type": "git", + "url": "git+https://github.com/LayerZero-Labs/devtools.git", + "directory": "packages/devtools-aptos" + }, + "license": "MIT", + "exports": { + ".": { + "types": "./dist/index.d.ts", + "require": "./dist/index.js", + "import": "./dist/index.mjs" + }, + "./*": { + "types": "./dist/*.d.ts", + "require": "./dist/*.js", + "import": "./dist/*.mjs" + } + }, + "main": "./dist/index.js", + "module": "./dist/index.mjs", + "types": "./dist/index.d.ts", + "files": [ + "./dist/index.*" + ], + "scripts": { + "prebuild": "tsc -noEmit", + "build": "$npm_execpath tsup --clean", + "clean": "rm -rf dist", + "dev": "$npm_execpath tsup --watch", + "lint": "$npm_execpath eslint '**/*.{js,ts,json}'", + "lint:fix": "eslint --fix '**/*.{js,ts,json}'", + "test": "jest --ci --passWithNoTests" + }, + "dependencies": { + "p-memoize": "~4.0.4" + }, + "devDependencies": { + "@aptos-labs/ts-sdk": "^1.33.1", + "@layerzerolabs/devtools": "~2.0.4", + "@layerzerolabs/io-devtools": "~0.3.2", + "@layerzerolabs/lz-aptos-sdk-v2": "^3.0.156", + "@layerzerolabs/lz-definitions": "^3.0.148", + "@swc/core": "^1.4.0", + "@swc/jest": "^0.2.36", + "@types/jest": "^29.5.12", + "jest": "^29.7.0", + "ts-node": "^10.9.2", + "tslib": "~2.6.2", + "tsup": "~8.0.1", + "typescript": "^5.4.4" + }, + "peerDependencies": { + "@aptos-labs/ts-sdk": "^1.33.1", + "@layerzerolabs/devtools": "~2.0.4", + "@layerzerolabs/io-devtools": "~0.3.2", + "@layerzerolabs/lz-definitions": "^3.0.148" + }, + "publishConfig": { + "access": "public" + } +} diff --git a/packages/devtools-aptos/src/common/addresses.ts b/packages/devtools-aptos/src/common/addresses.ts new file mode 100644 index 000000000..280a5f786 --- /dev/null +++ b/packages/devtools-aptos/src/common/addresses.ts @@ -0,0 +1,79 @@ +import type { OmniAddress, Bytes32 } from '@layerzerolabs/devtools' + +/** + * Converts a hexadecimal address string to a 32-byte Uint8Array format used by Aptos + * + * @param address - The hex address string to convert, optionally starting with '0x'. Can be null/undefined. + * @returns A 32-byte Uint8Array with the address right-aligned (padded with zeros on the left) + * + * If the input is null/undefined, returns an empty 32-byte array. + * Otherwise, removes '0x' prefix if present, converts hex string to bytes, + * and right-aligns the result in a 32-byte array. + */ +export function hexAddrToAptosBytesAddr(address: string | null | undefined): Uint8Array { + const bytes = address ? Buffer.from(address.replace('0x', ''), 'hex') : new Uint8Array(0) + const bytes32 = new Uint8Array(32) + bytes32.set(bytes, 32 - bytes.length) + return bytes32 +} + +/** + * Converts a Uint8Array to a hex string with 0x prefix + * + * @param bytes - The bytes to convert + * @returns Hex string with 0x prefix + */ +export function bytesToHex(bytes: Uint8Array): string { + return '0x' + Buffer.from(bytes).toString('hex') +} + +/** + * Normalizes an address to bytes32 format (64 hex characters with 0x prefix) + * + * Aptos uses 32-byte addresses. This function ensures addresses from + * other chains (like EVM with 20 bytes) are properly padded to 32 bytes. + * + * @param address - The address to normalize + * @returns Normalized bytes32 address + */ +export function normalizeAddressToBytes32(address: OmniAddress | null | undefined): Bytes32 { + if (!address) { + return '0x' + '0'.repeat(64) + } + + // Remove 0x prefix if present + const hex = address.replace('0x', '') + + // Pad to 64 characters (32 bytes) + const padded = hex.padStart(64, '0') + + return `0x${padded}` +} + +/** + * Checks if an address is an empty/zero address + * + * @param address - The address to check + * @returns true if the address is null, undefined, or all zeros + */ +export function isEmptyAddress(address: OmniAddress | null | undefined): boolean { + if (!address) { + return true + } + + const normalized = normalizeAddressToBytes32(address) + return normalized === '0x' + '0'.repeat(64) +} + +/** + * Compares two addresses for equality, handling different lengths + * + * Both addresses are normalized to bytes32 before comparison. + * + * @param a - First address + * @param b - Second address + * @returns true if addresses are equal + */ +export function areAddressesEqual(a: OmniAddress | null | undefined, b: OmniAddress | null | undefined): boolean { + return normalizeAddressToBytes32(a) === normalizeAddressToBytes32(b) +} diff --git a/packages/devtools-aptos/src/connection/factory.ts b/packages/devtools-aptos/src/connection/factory.ts new file mode 100644 index 000000000..5701b8d53 --- /dev/null +++ b/packages/devtools-aptos/src/connection/factory.ts @@ -0,0 +1,80 @@ +import { Aptos, AptosConfig, Network } from '@aptos-labs/ts-sdk' +import { EndpointId, getNetworkForChainId, Stage } from '@layerzerolabs/lz-definitions' + +import type { ConnectionFactory, RpcUrlFactory } from './types' + +/** + * Default RPC URLs for Aptos networks + */ +const DEFAULT_RPC_URLS: Partial> = { + [EndpointId.APTOS_V2_MAINNET]: 'https://fullnode.mainnet.aptoslabs.com/v1', + [EndpointId.APTOS_V2_TESTNET]: 'https://fullnode.testnet.aptoslabs.com/v1', +} + +/** + * Creates a factory that returns RPC URLs based on endpoint ID + * + * The factory will first check for environment variables in the format: + * - RPC_URL_APTOS (for mainnet) + * - RPC_URL_APTOS_TESTNET (for testnet) + * + * If no environment variable is set, it falls back to the default public RPC URLs + */ +export const createRpcUrlFactory = (): RpcUrlFactory => { + return async (eid: EndpointId): Promise => { + const network = getNetworkForChainId(eid) + + // Check for environment variable + const envVarSuffix = network.env === Stage.MAINNET ? '' : `_${network.env.toUpperCase()}` + const envVar = `RPC_URL_APTOS${envVarSuffix}` + const envUrl = process.env[envVar] + + if (envUrl) { + return envUrl + } + + // Fall back to default + const defaultUrl = DEFAULT_RPC_URLS[eid] + if (defaultUrl) { + return defaultUrl + } + + throw new Error(`No RPC URL configured for Aptos endpoint ${eid}. Set ${envVar} environment variable.`) + } +} + +/** + * Creates a factory that returns Aptos client connections based on endpoint ID + * + * @param urlFactory - Optional factory for RPC URLs. Defaults to createRpcUrlFactory() + * @returns ConnectionFactory for Aptos clients + */ +export const createConnectionFactory = (urlFactory: RpcUrlFactory = createRpcUrlFactory()): ConnectionFactory => { + // Cache connections by endpoint ID to avoid creating multiple clients + const connections = new Map() + + return async (eid: EndpointId): Promise => { + // Return cached connection if available + const cached = connections.get(eid) + if (cached) { + return cached + } + + // Get the RPC URL + const url = await urlFactory(eid) + + // Create the Aptos config and client + const config = new AptosConfig({ + fullnode: url, + // Use custom network since we're providing a custom URL + network: Network.CUSTOM, + }) + + const aptos = new Aptos(config) + + // Cache the connection + connections.set(eid, aptos) + + return aptos + } +} diff --git a/packages/devtools-aptos/src/connection/types.ts b/packages/devtools-aptos/src/connection/types.ts new file mode 100644 index 000000000..34a2e0921 --- /dev/null +++ b/packages/devtools-aptos/src/connection/types.ts @@ -0,0 +1,12 @@ +import type { Aptos } from '@aptos-labs/ts-sdk' +import type { EndpointId } from '@layerzerolabs/lz-definitions' + +/** + * Factory function that creates Aptos client connections based on endpoint ID + */ +export type ConnectionFactory = (eid: EndpointId) => Promise + +/** + * Factory function that returns RPC URLs based on endpoint ID + */ +export type RpcUrlFactory = (eid: EndpointId) => Promise diff --git a/packages/devtools-aptos/src/index.ts b/packages/devtools-aptos/src/index.ts new file mode 100644 index 000000000..d15b154c9 --- /dev/null +++ b/packages/devtools-aptos/src/index.ts @@ -0,0 +1,13 @@ +// Connection +export * from './connection/factory' +export * from './connection/types' + +// Transactions +export * from './transactions/signer' +export * from './transactions/types' + +// OmniSDK +export * from './omnigraph/sdk' + +// Common utilities +export * from './common/addresses' diff --git a/packages/devtools-aptos/src/omnigraph/sdk.ts b/packages/devtools-aptos/src/omnigraph/sdk.ts new file mode 100644 index 000000000..77914608d --- /dev/null +++ b/packages/devtools-aptos/src/omnigraph/sdk.ts @@ -0,0 +1,39 @@ +import type { Aptos } from '@aptos-labs/ts-sdk' +import type { OmniPoint, IOmniSDK } from '@layerzerolabs/devtools' + +import type { ConnectionFactory } from '../connection/types' + +/** + * Base OmniSDK implementation for Aptos + * + * This provides the foundation for building Aptos-specific SDKs + * that integrate with the OmniGraph framework. + */ +export abstract class OmniSDK implements IOmniSDK { + public readonly point: OmniPoint + + protected aptos?: Aptos + + constructor( + point: OmniPoint, + protected readonly connectionFactory?: ConnectionFactory + ) { + this.point = point + } + + /** + * Get or create the Aptos client connection + */ + protected async getAptos(): Promise { + if (this.aptos) { + return this.aptos + } + + if (!this.connectionFactory) { + throw new Error('ConnectionFactory is required to create Aptos client') + } + + this.aptos = await this.connectionFactory(this.point.eid) + return this.aptos + } +} diff --git a/packages/devtools-aptos/src/transactions/signer.ts b/packages/devtools-aptos/src/transactions/signer.ts new file mode 100644 index 000000000..2c00e54f8 --- /dev/null +++ b/packages/devtools-aptos/src/transactions/signer.ts @@ -0,0 +1,229 @@ +import { + Account, + Aptos, + Ed25519PrivateKey, + PrivateKey, + PrivateKeyVariants, + RawTransaction, + SimpleTransaction, +} from '@aptos-labs/ts-sdk' +import type { + OmniSignerFactory, + OmniTransaction, + OmniTransactionResponse, + OmniTransactionReceipt, +} from '@layerzerolabs/devtools' +import { OmniSignerBase, formatEid } from '@layerzerolabs/devtools' +import type { EndpointId } from '@layerzerolabs/lz-definitions' +import { ChainType, endpointIdToChainType } from '@layerzerolabs/lz-definitions' +import { createModuleLogger } from '@layerzerolabs/io-devtools' + +import type { ConnectionFactory } from '../connection/types' +import type { SerializedAptosTransaction } from './types' + +const logger = createModuleLogger('aptos-signer') + +/** + * Aptos implementation of OmniSigner + * + * This signer handles Aptos transaction signing and submission using the @aptos-labs/ts-sdk + */ +export class AptosSigner extends OmniSignerBase { + private sequenceNumber: number = 0 + private sequenceNumberSynced: boolean = false + + constructor( + eid: EndpointId, + private readonly aptos: Aptos, + private readonly account: Account + ) { + // Cast to any to handle potential lz-definitions version mismatches between packages + // eslint-disable-next-line @typescript-eslint/no-explicit-any + super(eid as any) + } + + getPoint() { + return { + eid: this.eid, + address: this.account.accountAddress.toString(), + } + } + + /** + * Sync the sequence number from the chain + */ + private async syncSequenceNumber(): Promise { + const accountData = await this.aptos.getAccountInfo({ + accountAddress: this.account.accountAddress, + }) + this.sequenceNumber = parseInt(accountData.sequence_number) + this.sequenceNumberSynced = true + } + + /** + * Build and sign an Aptos transaction (returns BCS hex string) + */ + async sign(transaction: OmniTransaction): Promise { + this.assertTransaction(transaction) + + // Ensure we have the current sequence number + if (!this.sequenceNumberSynced) { + await this.syncSequenceNumber() + } + + // Parse the transaction data + const payload: SerializedAptosTransaction = JSON.parse(transaction.data) + + // Build the transaction + // eslint-disable-next-line @typescript-eslint/no-explicit-any + const simpleTx = await this.aptos.transaction.build.simple({ + sender: this.account.accountAddress, + data: { + function: payload.function as `${string}::${string}::${string}`, + typeArguments: payload.typeArguments, + functionArguments: payload.functionArguments as any[], + }, + }) + + // Sign the transaction + const signedTx = this.aptos.transaction.sign({ + signer: this.account, + transaction: simpleTx, + }) + + // Return the signature as hex + return signedTx.bcsToHex().toString() + } + + /** + * Sign and submit a transaction + */ + async signAndSend(transaction: OmniTransaction): Promise> { + this.assertTransaction(transaction) + + const maxRetries = 3 + let retryCount = 0 + + while (retryCount < maxRetries) { + try { + // Ensure we have the current sequence number + if (!this.sequenceNumberSynced) { + await this.syncSequenceNumber() + } + + // Parse the transaction data + const payload: SerializedAptosTransaction = JSON.parse(transaction.data) + + logger.debug( + `Submitting Aptos transaction: ${payload.function} with sequence number ${this.sequenceNumber}` + ) + + // Build the transaction + // eslint-disable-next-line @typescript-eslint/no-explicit-any + const simpleTx = await this.aptos.transaction.build.simple({ + sender: this.account.accountAddress, + data: { + function: payload.function as `${string}::${string}::${string}`, + typeArguments: payload.typeArguments, + functionArguments: payload.functionArguments as any[], + }, + }) + + // Create a new raw transaction with our tracked sequence number + const newRawTransaction = new RawTransaction( + simpleTx.rawTransaction.sender, + BigInt(this.sequenceNumber), + simpleTx.rawTransaction.payload, + simpleTx.rawTransaction.max_gas_amount, + simpleTx.rawTransaction.gas_unit_price, + simpleTx.rawTransaction.expiration_timestamp_secs, + simpleTx.rawTransaction.chain_id + ) + const transactionWithSequence = new SimpleTransaction(newRawTransaction) + + // Sign and submit + const response = await this.aptos.signAndSubmitTransaction({ + signer: this.account, + transaction: transactionWithSequence, + }) + + // Increment our tracked sequence number + this.sequenceNumber++ + + const transactionHash = response.hash + + return { + transactionHash, + wait: async (_confirmations?: number): Promise => { + // Wait a bit for propagation + await new Promise((resolve) => setTimeout(resolve, 2000)) + + // Wait for the transaction to be executed + await this.aptos.waitForTransaction({ + transactionHash, + }) + + return { transactionHash } + }, + } + } catch (error: unknown) { + retryCount++ + if (retryCount === maxRetries) { + logger.error(`Failed to submit Aptos transaction after ${maxRetries} attempts`) + throw error + } + + logger.warn( + `Aptos transaction failed (attempt ${retryCount}/${maxRetries}), retrying: ${error instanceof Error ? error.message : String(error)}` + ) + + // Re-sync sequence number and retry + await this.syncSequenceNumber() + await new Promise((resolve) => setTimeout(resolve, 1000)) + } + } + + // This should never be reached due to the throw in the loop + throw new Error('Unexpected error in signAndSend') + } +} + +/** + * Creates a signer factory for Aptos networks + * + * @param connectionFactory - Factory for creating Aptos client connections + * @param privateKey - Optional private key. If not provided, reads from APTOS_PRIVATE_KEY env var + * @returns OmniSignerFactory that creates AptosSigner instances + */ +export const createSignerFactory = ( + connectionFactory: ConnectionFactory, + privateKey?: string +): OmniSignerFactory => { + return async (eid: EndpointId): Promise => { + // Validate chain type + if (endpointIdToChainType(eid) !== ChainType.APTOS) { + // Cast to any to handle potential lz-definitions version mismatches between packages + // eslint-disable-next-line @typescript-eslint/no-explicit-any + throw new Error(`createAptosSignerFactory() called with non-Aptos EID: ${formatEid(eid as any)}`) + } + + // Get the private key + const pk = privateKey ?? process.env.APTOS_PRIVATE_KEY + if (!pk) { + throw new Error('APTOS_PRIVATE_KEY environment variable is required') + } + + // Format the private key + const formattedKey = PrivateKey.formatPrivateKey(pk, PrivateKeyVariants.Ed25519) + + // Create the account + const account = Account.fromPrivateKey({ + privateKey: new Ed25519PrivateKey(formattedKey), + }) + + // Get the Aptos client + const aptos = await connectionFactory(eid) + + return new AptosSigner(eid, aptos, account) + } +} diff --git a/packages/devtools-aptos/src/transactions/types.ts b/packages/devtools-aptos/src/transactions/types.ts new file mode 100644 index 000000000..b0e613096 --- /dev/null +++ b/packages/devtools-aptos/src/transactions/types.ts @@ -0,0 +1,38 @@ +import type { InputEntryFunctionData } from '@aptos-labs/ts-sdk' + +/** + * Extended Aptos transaction payload with type information + */ +export interface AptosTransactionPayload extends InputEntryFunctionData { + /** + * Type hints for the function arguments + * Used for encoding/decoding arguments + */ + types?: string[] +} + +/** + * Serialized Aptos transaction data + * This is stored in OmniTransaction.data + */ +export interface SerializedAptosTransaction { + /** + * The entry function to call (format: "module_address::module_name::function_name") + */ + function: string + + /** + * Type arguments for the function (generics) + */ + typeArguments?: string[] + + /** + * Function arguments + */ + functionArguments: unknown[] + + /** + * Type hints for function arguments (for encoding) + */ + types?: string[] +} diff --git a/packages/devtools-aptos/tsconfig.json b/packages/devtools-aptos/tsconfig.json new file mode 100644 index 000000000..44c83ff07 --- /dev/null +++ b/packages/devtools-aptos/tsconfig.json @@ -0,0 +1,13 @@ +{ + "extends": "../../tsconfig.json", + "exclude": ["dist", "node_modules"], + "include": ["src", "test", "*.config.ts"], + "compilerOptions": { + "types": ["node", "jest"], + "target": "es2020", + "experimentalDecorators": true, + "paths": { + "@/*": ["./src/*"] + } + } +} diff --git a/packages/devtools-aptos/tsup.config.ts b/packages/devtools-aptos/tsup.config.ts new file mode 100644 index 000000000..7ef46a5ad --- /dev/null +++ b/packages/devtools-aptos/tsup.config.ts @@ -0,0 +1,14 @@ +import { defineConfig } from 'tsup' + +export default defineConfig([ + { + entry: ['src/index.ts'], + outDir: './dist', + clean: true, + dts: true, + sourcemap: true, + splitting: false, + treeshake: true, + format: ['esm', 'cjs'], + }, +]) diff --git a/packages/protocol-devtools-aptos/package.json b/packages/protocol-devtools-aptos/package.json new file mode 100644 index 000000000..0bae6948a --- /dev/null +++ b/packages/protocol-devtools-aptos/package.json @@ -0,0 +1,67 @@ +{ + "name": "@layerzerolabs/protocol-devtools-aptos", + "version": "0.1.0", + "description": "LayerZero protocol SDK for Aptos EndpointV2 and ULN302", + "repository": { + "type": "git", + "url": "git+https://github.com/LayerZero-Labs/devtools.git", + "directory": "packages/protocol-devtools-aptos" + }, + "license": "MIT", + "exports": { + ".": { + "types": "./dist/index.d.ts", + "require": "./dist/index.js", + "import": "./dist/index.mjs" + }, + "./*": { + "types": "./dist/*.d.ts", + "require": "./dist/*.js", + "import": "./dist/*.mjs" + } + }, + "main": "./dist/index.js", + "module": "./dist/index.mjs", + "types": "./dist/index.d.ts", + "files": [ + "./dist/index.*" + ], + "scripts": { + "prebuild": "tsc -noEmit", + "build": "$npm_execpath tsup --clean", + "clean": "rm -rf dist", + "dev": "$npm_execpath tsup --watch", + "lint": "$npm_execpath eslint '**/*.{js,ts,json}'", + "lint:fix": "eslint --fix '**/*.{js,ts,json}'", + "test": "jest --ci --passWithNoTests" + }, + "dependencies": { + "@layerzerolabs/devtools-aptos": "workspace:^" + }, + "devDependencies": { + "@aptos-labs/ts-sdk": "^1.33.1", + "@layerzerolabs/devtools": "~2.0.4", + "@layerzerolabs/io-devtools": "~0.3.2", + "@layerzerolabs/lz-aptos-sdk-v2": "^3.0.156", + "@layerzerolabs/lz-definitions": "^3.0.148", + "@layerzerolabs/protocol-devtools": "^3.0.0", + "@swc/core": "^1.4.0", + "@swc/jest": "^0.2.36", + "@types/jest": "^29.5.12", + "jest": "^29.7.0", + "ts-node": "^10.9.2", + "tslib": "~2.6.2", + "tsup": "~8.0.1", + "typescript": "^5.4.4" + }, + "peerDependencies": { + "@aptos-labs/ts-sdk": "^1.33.1", + "@layerzerolabs/devtools": "~2.0.4", + "@layerzerolabs/io-devtools": "~0.3.2", + "@layerzerolabs/lz-definitions": "^3.0.148", + "@layerzerolabs/protocol-devtools": "^3.0.0" + }, + "publishConfig": { + "access": "public" + } +} diff --git a/packages/protocol-devtools-aptos/src/endpointv2/factory.ts b/packages/protocol-devtools-aptos/src/endpointv2/factory.ts new file mode 100644 index 000000000..cfe522566 --- /dev/null +++ b/packages/protocol-devtools-aptos/src/endpointv2/factory.ts @@ -0,0 +1,16 @@ +import type { OmniPoint, OmniSDKFactory } from '@layerzerolabs/devtools' +import type { ConnectionFactory } from '@layerzerolabs/devtools-aptos' + +import { EndpointV2 } from './sdk' + +/** + * Factory for creating EndpointV2 SDK instances + * + * @param connectionFactory - Factory for creating Aptos client connections + * @returns Factory function that creates EndpointV2 SDK instances for given OmniPoints + */ +export const createEndpointV2Factory = (connectionFactory?: ConnectionFactory): OmniSDKFactory => { + return async (point: OmniPoint): Promise => { + return new EndpointV2(point, connectionFactory) + } +} diff --git a/packages/protocol-devtools-aptos/src/endpointv2/sdk.ts b/packages/protocol-devtools-aptos/src/endpointv2/sdk.ts new file mode 100644 index 000000000..285743855 --- /dev/null +++ b/packages/protocol-devtools-aptos/src/endpointv2/sdk.ts @@ -0,0 +1,461 @@ +import type { OmniAddress, OmniTransaction, Bytes32, PossiblyBytes } from '@layerzerolabs/devtools' +import type { + IEndpointV2, + IUln302, + IUlnRead, + MessageParams, + MessagingFee, + SetConfigParam, + Timeout, + Uln302ExecutorConfig, + Uln302SetExecutorConfig, + Uln302SetUlnConfig, + Uln302UlnConfig, + Uln302UlnUserConfig, + UlnReadSetUlnConfig, + UlnReadUlnConfig, + UlnReadUlnUserConfig, +} from '@layerzerolabs/protocol-devtools' +import { Uln302ConfigType } from '@layerzerolabs/protocol-devtools' +import type { EndpointId } from '@layerzerolabs/lz-definitions' +import { OmniSDK, type ConnectionFactory } from '@layerzerolabs/devtools-aptos' + +import { Uln302 } from '../uln302/sdk' + +/** + * Aptos implementation of IEndpointV2 + * + * This SDK provides methods to interact with the LayerZero EndpointV2 contract on Aptos. + */ +export class EndpointV2 extends OmniSDK implements IEndpointV2 { + private endpointAddress: string + + constructor( + point: { eid: EndpointId; address: OmniAddress }, + connectionFactory?: ConnectionFactory, + endpointAddress?: string + ) { + // Cast to any to handle potential lz-definitions version mismatches between packages + // eslint-disable-next-line @typescript-eslint/no-explicit-any + super(point as any, connectionFactory) + // The endpoint address can be provided separately or defaults to the point address + this.endpointAddress = endpointAddress ?? point.address + } + + async getUln302SDK(address: OmniAddress): Promise { + return new Uln302({ eid: this.point.eid, address }, this.connectionFactory) + } + + async getUlnReadSDK(_address: OmniAddress): Promise { + // UlnRead is not implemented for Aptos yet + throw new Error('UlnRead is not supported on Aptos') + } + + async getDelegate(oapp: OmniAddress): Promise { + try { + const aptos = await this.getAptos() + const result = await aptos.view({ + payload: { + function: `${oapp}::oapp_core::get_delegate`, + functionArguments: [], + }, + }) + return result[0] as string | undefined + } catch { + return undefined + } + } + + async isDelegate(oapp: OmniAddress, delegate: OmniAddress): Promise { + const currentDelegate = await this.getDelegate(oapp) + return currentDelegate?.toLowerCase() === delegate.toLowerCase() + } + + async getDefaultReceiveLibrary(eid: EndpointId): Promise { + try { + const aptos = await this.getAptos() + const result = await aptos.view({ + payload: { + function: `${this.endpointAddress}::endpoint::get_default_receive_library`, + functionArguments: [eid], + }, + }) + return result[0] as string | undefined + } catch { + return undefined + } + } + + async setDefaultReceiveLibrary( + eid: EndpointId, + uln: OmniAddress | null | undefined, + gracePeriod?: bigint + ): Promise { + return { + point: this.point, + data: JSON.stringify({ + function: `${this.endpointAddress}::endpoint::set_default_receive_library`, + functionArguments: [eid, uln, gracePeriod ?? 0], + }), + description: `Setting default receive library for eid ${eid} to ${uln}`, + } + } + + async getDefaultSendLibrary(eid: EndpointId): Promise { + try { + const aptos = await this.getAptos() + const result = await aptos.view({ + payload: { + function: `${this.endpointAddress}::endpoint::get_default_send_library`, + functionArguments: [eid], + }, + }) + return result[0] as string | undefined + } catch { + return undefined + } + } + + async setDefaultSendLibrary(eid: EndpointId, uln: OmniAddress | null | undefined): Promise { + return { + point: this.point, + data: JSON.stringify({ + function: `${this.endpointAddress}::endpoint::set_default_send_library`, + functionArguments: [eid, uln], + }), + description: `Setting default send library for eid ${eid} to ${uln}`, + } + } + + async isRegisteredLibrary(_uln: OmniAddress): Promise { + // Aptos doesn't have a registry check - libraries are registered by default if they exist + return true + } + + async registerLibrary(_uln: OmniAddress): Promise { + // Aptos doesn't require explicit library registration + return { + point: this.point, + data: '0x', + description: 'Library registration not required on Aptos', + } + } + + async isBlockedLibrary(_uln: OmniAddress): Promise { + return false + } + + async getSendLibrary(sender: OmniAddress, dstEid: EndpointId): Promise { + try { + const aptos = await this.getAptos() + const result = await aptos.view({ + payload: { + function: `${this.endpointAddress}::endpoint::get_effective_send_library`, + functionArguments: [sender, dstEid], + }, + }) + return result[0] as string | undefined + } catch { + return undefined + } + } + + async getReceiveLibrary( + receiver: OmniAddress, + srcEid: EndpointId + ): Promise<[address: Bytes32 | undefined, isDefault: boolean]> { + try { + const aptos = await this.getAptos() + const result = await aptos.view({ + payload: { + function: `${this.endpointAddress}::endpoint::get_effective_receive_library`, + functionArguments: [receiver, srcEid], + }, + }) + return [result[0] as string | undefined, result[1] as boolean] + } catch { + return [undefined, true] + } + } + + async getDefaultReceiveLibraryTimeout(eid: EndpointId): Promise { + try { + const aptos = await this.getAptos() + const result = await aptos.view({ + payload: { + function: `${this.endpointAddress}::endpoint::get_default_receive_library_timeout`, + functionArguments: [eid], + }, + }) + return { + expiry: BigInt(result[0]?.toString() ?? '0'), + lib: result[1] as string, + } + } catch { + return { expiry: BigInt(0), lib: '' } + } + } + + async getReceiveLibraryTimeout(receiver: OmniAddress, srcEid: EndpointId): Promise { + try { + const aptos = await this.getAptos() + const result = await aptos.view({ + payload: { + function: `${this.endpointAddress}::endpoint::get_receive_library_timeout`, + functionArguments: [receiver, srcEid], + }, + }) + return { + expiry: BigInt(result[0]?.toString() ?? '0'), + lib: result[1] as string, + } + } catch { + // Return a value that will always produce a diff if timeout is not set + return { expiry: BigInt(-1), lib: '' } + } + } + + async setSendLibrary(oapp: OmniAddress, eid: EndpointId, uln: OmniAddress): Promise { + return { + point: this.point, + data: JSON.stringify({ + function: `${oapp}::oapp_core::set_send_library`, + functionArguments: [eid, uln], + types: ['u32', 'address'], + }), + description: `Setting send library for eid ${eid} to ${uln}`, + } + } + + async isDefaultSendLibrary(sender: PossiblyBytes, dstEid: EndpointId): Promise { + const sendLibrary = await this.getSendLibrary(sender as OmniAddress, dstEid) + const defaultLibrary = await this.getDefaultSendLibrary(dstEid) + return sendLibrary === defaultLibrary + } + + async setReceiveLibrary( + oapp: OmniAddress, + eid: EndpointId, + uln: OmniAddress, + gracePeriod: bigint + ): Promise { + return { + point: this.point, + data: JSON.stringify({ + function: `${oapp}::oapp_core::set_receive_library`, + functionArguments: [eid, uln, gracePeriod], + types: ['u32', 'address', 'u64'], + }), + description: `Setting receive library for eid ${eid} to ${uln} with grace period ${gracePeriod}`, + } + } + + async setReceiveLibraryTimeout( + oapp: OmniAddress, + eid: EndpointId, + uln: OmniAddress, + expiry: bigint + ): Promise { + return { + point: this.point, + data: JSON.stringify({ + function: `${oapp}::oapp_core::set_receive_library_timeout`, + functionArguments: [eid, uln, expiry], + types: ['u32', 'address', 'u64'], + }), + description: `Setting receive library timeout for eid ${eid} to ${uln} with expiry ${expiry}`, + } + } + + async getExecutorConfig(oapp: PossiblyBytes, uln: OmniAddress, eid: EndpointId): Promise { + const ulnSdk = await this.getUln302SDK(uln) + // eslint-disable-next-line @typescript-eslint/no-explicit-any + return ulnSdk.getExecutorConfig(eid as any, oapp as OmniAddress) + } + + async getAppExecutorConfig(oapp: PossiblyBytes, uln: OmniAddress, eid: EndpointId): Promise { + const ulnSdk = await this.getUln302SDK(uln) + // eslint-disable-next-line @typescript-eslint/no-explicit-any + return ulnSdk.getAppExecutorConfig(eid as any, oapp as OmniAddress) + } + + async hasAppExecutorConfig( + oapp: OmniAddress, + uln: OmniAddress, + eid: EndpointId, + config: Uln302ExecutorConfig + ): Promise { + const ulnSdk = await this.getUln302SDK(uln) + // eslint-disable-next-line @typescript-eslint/no-explicit-any + return ulnSdk.hasAppExecutorConfig(eid as any, oapp, config) + } + + async setExecutorConfig( + oapp: PossiblyBytes, + uln: PossiblyBytes, + setExecutorConfig: Uln302SetExecutorConfig[] + ): Promise { + const transactions: OmniTransaction[] = [] + + for (const config of setExecutorConfig) { + // For Aptos, we set config through the OApp + transactions.push({ + point: this.point, + data: JSON.stringify({ + function: `${oapp}::oapp_core::set_config`, + functionArguments: [ + uln, + config.eid, + 1, // EXECUTOR config type + this.encodeExecutorConfig(config.executorConfig), + ], + types: ['address', 'u32', 'u32', 'u8'], + }), + description: `Setting executor config for eid ${config.eid}`, + }) + } + + return transactions + } + + async getUlnConfig( + oapp: OmniAddress, + uln: OmniAddress, + eid: EndpointId, + type: Uln302ConfigType + ): Promise { + const ulnSdk = await this.getUln302SDK(uln) + // eslint-disable-next-line @typescript-eslint/no-explicit-any + return ulnSdk.getUlnConfig(eid as any, oapp, type) + } + + async getAppUlnConfig( + oapp: OmniAddress, + uln: OmniAddress, + eid: EndpointId, + type: Uln302ConfigType + ): Promise { + const ulnSdk = await this.getUln302SDK(uln) + // eslint-disable-next-line @typescript-eslint/no-explicit-any + return ulnSdk.getAppUlnConfig(eid as any, oapp, type) + } + + async getAppUlnReadConfig(_oapp: OmniAddress, _uln: OmniAddress, _channelId: number): Promise { + throw new Error('UlnRead is not supported on Aptos') + } + + async hasAppUlnConfig( + oapp: OmniAddress, + uln: OmniAddress, + eid: EndpointId, + config: Uln302UlnUserConfig, + type: Uln302ConfigType + ): Promise { + const ulnSdk = await this.getUln302SDK(uln) + // eslint-disable-next-line @typescript-eslint/no-explicit-any + return ulnSdk.hasAppUlnConfig(eid as any, oapp, config, type) + } + + async hasAppUlnReadConfig( + _oapp: OmniAddress, + _uln: OmniAddress, + _channelId: number, + _config: UlnReadUlnUserConfig + ): Promise { + throw new Error('UlnRead is not supported on Aptos') + } + + async setUlnConfig( + oapp: OmniAddress, + uln: OmniAddress, + setUlnConfig: Uln302SetUlnConfig[] + ): Promise { + const transactions: OmniTransaction[] = [] + + for (const config of setUlnConfig) { + const configType = config.type === Uln302ConfigType.Send ? 2 : 3 // Send = 2, Receive = 3 + + transactions.push({ + point: this.point, + data: JSON.stringify({ + function: `${oapp}::oapp_core::set_config`, + functionArguments: [uln, config.eid, configType, this.encodeUlnConfig(config.ulnConfig)], + types: ['address', 'u32', 'u32', 'u8'], + }), + description: `Setting ULN ${config.type} config for eid ${config.eid}`, + }) + } + + return transactions + } + + async setUlnReadConfig( + _oapp: OmniAddress, + _uln: OmniAddress, + _setUlnConfig: UlnReadSetUlnConfig[] + ): Promise { + throw new Error('UlnRead is not supported on Aptos') + } + + async getUlnConfigParams(_uln: OmniAddress, setUlnConfig: Uln302SetUlnConfig[]): Promise { + return setUlnConfig.map((config) => ({ + eid: config.eid, + configType: config.type === Uln302ConfigType.Send ? 2 : 3, + config: this.encodeUlnConfig(config.ulnConfig), + })) + } + + async getUlnReadConfigParams(_uln: OmniAddress, _setUlnConfig: UlnReadSetUlnConfig[]): Promise { + throw new Error('UlnRead is not supported on Aptos') + } + + async getExecutorConfigParams( + _uln: OmniAddress, + setExecutorConfig: Uln302SetExecutorConfig[] + ): Promise { + return setExecutorConfig.map((config) => ({ + eid: config.eid, + configType: 1, // EXECUTOR config type + config: this.encodeExecutorConfig(config.executorConfig), + })) + } + + async setConfig(oapp: OmniAddress, uln: OmniAddress, setConfigParam: SetConfigParam[]): Promise { + return setConfigParam.map((param) => ({ + point: this.point, + data: JSON.stringify({ + function: `${oapp}::oapp_core::set_config`, + functionArguments: [uln, param.eid, param.configType, param.config], + types: ['address', 'u32', 'u32', 'u8'], + }), + description: `Setting config type ${param.configType} for eid ${param.eid}`, + })) + } + + async quote(_params: MessageParams, _sender: OmniAddress): Promise { + // Quote implementation would need to call the endpoint contract + // For now, return a placeholder + return { + nativeFee: BigInt(0), + lzTokenFee: BigInt(0), + } + } + + /** + * Encode executor config to bytes + */ + private encodeExecutorConfig(config: Uln302ExecutorConfig): Uint8Array { + // Simple encoding - in practice this would use proper BCS encoding + const encoder = new TextEncoder() + return encoder.encode(JSON.stringify(config)) + } + + /** + * Encode ULN config to bytes + */ + private encodeUlnConfig(config: Uln302UlnUserConfig): Uint8Array { + // Simple encoding - in practice this would use proper BCS encoding + const encoder = new TextEncoder() + return encoder.encode(JSON.stringify(config)) + } +} diff --git a/packages/protocol-devtools-aptos/src/index.ts b/packages/protocol-devtools-aptos/src/index.ts new file mode 100644 index 000000000..b251600a4 --- /dev/null +++ b/packages/protocol-devtools-aptos/src/index.ts @@ -0,0 +1,6 @@ +// EndpointV2 SDK +export * from './endpointv2/sdk' +export * from './endpointv2/factory' + +// ULN302 SDK +export * from './uln302/sdk' diff --git a/packages/protocol-devtools-aptos/src/uln302/sdk.ts b/packages/protocol-devtools-aptos/src/uln302/sdk.ts new file mode 100644 index 000000000..e6683b9a4 --- /dev/null +++ b/packages/protocol-devtools-aptos/src/uln302/sdk.ts @@ -0,0 +1,180 @@ +import type { OmniAddress, OmniTransaction } from '@layerzerolabs/devtools' +import type { + IUln302, + Uln302ExecutorConfig, + Uln302UlnConfig, + Uln302UlnUserConfig, +} from '@layerzerolabs/protocol-devtools' +import { Uln302ConfigType } from '@layerzerolabs/protocol-devtools' +import type { EndpointId } from '@layerzerolabs/lz-definitions' +import { OmniSDK, type ConnectionFactory } from '@layerzerolabs/devtools-aptos' + +/** + * Aptos implementation of IUln302 + * + * This SDK provides methods to interact with the ULN302 (Ultra Light Node) contract on Aptos. + */ +export class Uln302 extends OmniSDK implements IUln302 { + constructor(point: { eid: EndpointId; address: OmniAddress }, connectionFactory?: ConnectionFactory) { + // Cast to any to handle potential lz-definitions version mismatches between packages + // eslint-disable-next-line @typescript-eslint/no-explicit-any + super(point as any, connectionFactory) + } + + async getUlnConfig( + eid: EndpointId, + oapp: OmniAddress | null | undefined, + type: Uln302ConfigType + ): Promise { + try { + const aptos = await this.getAptos() + const configTypeNum = type === Uln302ConfigType.Send ? 2 : 3 + + const result = await aptos.view({ + payload: { + function: `${this.point.address}::uln::get_config`, + functionArguments: [oapp, eid, configTypeNum], + }, + }) + + // Parse the result into Uln302UlnConfig + return this.parseUlnConfig(result) + } catch { + // Return default config if not set + return { + confirmations: BigInt(0), + requiredDVNs: [], + requiredDVNCount: 0, + optionalDVNs: [], + optionalDVNThreshold: 0, + } + } + } + + async getAppUlnConfig(eid: EndpointId, oapp: OmniAddress, type: Uln302ConfigType): Promise { + // For Aptos, getAppUlnConfig is the same as getUlnConfig + // The default config fallback is handled elsewhere + return this.getUlnConfig(eid, oapp, type) + } + + async hasAppUlnConfig( + eid: EndpointId, + oapp: OmniAddress, + config: Uln302UlnUserConfig, + type: Uln302ConfigType + ): Promise { + const currentConfig = await this.getAppUlnConfig(eid, oapp, type) + + // Check if confirmations match (if specified) + if (config.confirmations !== undefined && currentConfig.confirmations !== config.confirmations) { + return false + } + + // Check if required DVNs match + if (config.requiredDVNs) { + const currentDVNs = new Set(currentConfig.requiredDVNs.map((d) => d.toLowerCase())) + const configDVNs = config.requiredDVNs.map((d) => d.toLowerCase()) + if (configDVNs.some((d) => !currentDVNs.has(d))) { + return false + } + } + + // Check if optional DVNs match + if (config.optionalDVNs) { + const currentDVNs = new Set(currentConfig.optionalDVNs.map((d) => d.toLowerCase())) + const configDVNs = config.optionalDVNs.map((d) => d.toLowerCase()) + if (configDVNs.some((d) => !currentDVNs.has(d))) { + return false + } + } + + // Check if optional DVN threshold matches (if specified) + if ( + config.optionalDVNThreshold !== undefined && + currentConfig.optionalDVNThreshold !== config.optionalDVNThreshold + ) { + return false + } + + return true + } + + async setDefaultUlnConfig(_eid: EndpointId, _config: Uln302UlnUserConfig): Promise { + // This is typically an admin function + return { + point: this.point, + data: '0x', + description: 'Set default ULN config (admin only)', + } + } + + async getExecutorConfig(eid: EndpointId, oapp?: OmniAddress | null | undefined): Promise { + try { + const aptos = await this.getAptos() + + const result = await aptos.view({ + payload: { + function: `${this.point.address}::uln::get_executor_config`, + functionArguments: [oapp, eid], + }, + }) + + return { + maxMessageSize: Number(result[0] ?? 10000), + executor: (result[1] as string) ?? '0x0', + } + } catch { + // Return default config + return { + maxMessageSize: 10000, + executor: '0x0', + } + } + } + + async getAppExecutorConfig(eid: EndpointId, oapp: OmniAddress): Promise { + // For Aptos, getAppExecutorConfig is the same as getExecutorConfig + return this.getExecutorConfig(eid, oapp) + } + + async hasAppExecutorConfig(eid: EndpointId, oapp: OmniAddress, config: Uln302ExecutorConfig): Promise { + const currentConfig = await this.getAppExecutorConfig(eid, oapp) + + // Check if executor matches + if (currentConfig.executor.toLowerCase() !== config.executor.toLowerCase()) { + return false + } + + // Check if max message size matches + if (currentConfig.maxMessageSize !== config.maxMessageSize) { + return false + } + + return true + } + + async setDefaultExecutorConfig(_eid: EndpointId, _config: Uln302ExecutorConfig): Promise { + // This is typically an admin function + return { + point: this.point, + data: '0x', + description: 'Set default executor config (admin only)', + } + } + + /** + * Parse ULN config from view function result + */ + private parseUlnConfig(result: unknown[]): Uln302UlnConfig { + // Result structure depends on the Move contract + // This is a simplified parser + const requiredDVNs = (result[1] as string[]) ?? [] + return { + confirmations: BigInt(result[0]?.toString() ?? '0'), + requiredDVNs, + requiredDVNCount: requiredDVNs.length, + optionalDVNs: (result[2] as string[]) ?? [], + optionalDVNThreshold: Number(result[3] ?? 0), + } + } +} diff --git a/packages/protocol-devtools-aptos/tsconfig.json b/packages/protocol-devtools-aptos/tsconfig.json new file mode 100644 index 000000000..44c83ff07 --- /dev/null +++ b/packages/protocol-devtools-aptos/tsconfig.json @@ -0,0 +1,13 @@ +{ + "extends": "../../tsconfig.json", + "exclude": ["dist", "node_modules"], + "include": ["src", "test", "*.config.ts"], + "compilerOptions": { + "types": ["node", "jest"], + "target": "es2020", + "experimentalDecorators": true, + "paths": { + "@/*": ["./src/*"] + } + } +} diff --git a/packages/protocol-devtools-aptos/tsup.config.ts b/packages/protocol-devtools-aptos/tsup.config.ts new file mode 100644 index 000000000..7ef46a5ad --- /dev/null +++ b/packages/protocol-devtools-aptos/tsup.config.ts @@ -0,0 +1,14 @@ +import { defineConfig } from 'tsup' + +export default defineConfig([ + { + entry: ['src/index.ts'], + outDir: './dist', + clean: true, + dts: true, + sourcemap: true, + splitting: false, + treeshake: true, + format: ['esm', 'cjs'], + }, +]) diff --git a/packages/ua-devtools-aptos/package.json b/packages/ua-devtools-aptos/package.json new file mode 100644 index 000000000..ddd40c307 --- /dev/null +++ b/packages/ua-devtools-aptos/package.json @@ -0,0 +1,70 @@ +{ + "name": "@layerzerolabs/ua-devtools-aptos", + "version": "0.1.0", + "description": "LayerZero OFT/OApp SDK for Aptos", + "repository": { + "type": "git", + "url": "git+https://github.com/LayerZero-Labs/devtools.git", + "directory": "packages/ua-devtools-aptos" + }, + "license": "MIT", + "exports": { + ".": { + "types": "./dist/index.d.ts", + "require": "./dist/index.js", + "import": "./dist/index.mjs" + }, + "./*": { + "types": "./dist/*.d.ts", + "require": "./dist/*.js", + "import": "./dist/*.mjs" + } + }, + "main": "./dist/index.js", + "module": "./dist/index.mjs", + "types": "./dist/index.d.ts", + "files": [ + "./dist/index.*" + ], + "scripts": { + "prebuild": "tsc -noEmit", + "build": "$npm_execpath tsup --clean", + "clean": "rm -rf dist", + "dev": "$npm_execpath tsup --watch", + "lint": "$npm_execpath eslint '**/*.{js,ts,json}'", + "lint:fix": "eslint --fix '**/*.{js,ts,json}'", + "test": "jest --ci --passWithNoTests" + }, + "dependencies": { + "@layerzerolabs/devtools-aptos": "workspace:^", + "@layerzerolabs/protocol-devtools-aptos": "workspace:^" + }, + "devDependencies": { + "@aptos-labs/ts-sdk": "^1.33.1", + "@layerzerolabs/devtools": "~2.0.4", + "@layerzerolabs/io-devtools": "~0.3.2", + "@layerzerolabs/lz-aptos-sdk-v2": "^3.0.156", + "@layerzerolabs/lz-definitions": "^3.0.148", + "@layerzerolabs/protocol-devtools": "^3.0.0", + "@layerzerolabs/ua-devtools": "~5.0.0", + "@swc/core": "^1.4.0", + "@swc/jest": "^0.2.36", + "@types/jest": "^29.5.12", + "jest": "^29.7.0", + "ts-node": "^10.9.2", + "tslib": "~2.6.2", + "tsup": "~8.0.1", + "typescript": "^5.4.4" + }, + "peerDependencies": { + "@aptos-labs/ts-sdk": "^1.33.1", + "@layerzerolabs/devtools": "~2.0.4", + "@layerzerolabs/io-devtools": "~0.3.2", + "@layerzerolabs/lz-definitions": "^3.0.148", + "@layerzerolabs/protocol-devtools": "^3.0.0", + "@layerzerolabs/ua-devtools": "~5.0.0" + }, + "publishConfig": { + "access": "public" + } +} diff --git a/packages/ua-devtools-aptos/src/index.ts b/packages/ua-devtools-aptos/src/index.ts new file mode 100644 index 000000000..c6cd5d6ba --- /dev/null +++ b/packages/ua-devtools-aptos/src/index.ts @@ -0,0 +1,3 @@ +// OFT SDK +export * from './oft/sdk' +export * from './oft/factory' diff --git a/packages/ua-devtools-aptos/src/oft/factory.ts b/packages/ua-devtools-aptos/src/oft/factory.ts new file mode 100644 index 000000000..602b2cc6b --- /dev/null +++ b/packages/ua-devtools-aptos/src/oft/factory.ts @@ -0,0 +1,20 @@ +import type { OmniPoint } from '@layerzerolabs/devtools' +import type { OAppFactory } from '@layerzerolabs/ua-devtools' +import { createConnectionFactory, type ConnectionFactory } from '@layerzerolabs/devtools-aptos' + +import { OFT } from './sdk' + +/** + * Syntactic sugar that creates an instance of Aptos `OFT` SDK + * based on an `OmniPoint` with help of a `ConnectionFactory`. + * + * @param {ConnectionFactory} connectionFactory A function that returns an `Aptos` client based on an `EndpointId` + * @returns {OAppFactory} + */ +export const createOFTFactory = ( + connectionFactory: ConnectionFactory = createConnectionFactory() +): OAppFactory => { + return async (point: OmniPoint): Promise => { + return new OFT(point, connectionFactory) + } +} diff --git a/packages/ua-devtools-aptos/src/oft/sdk.ts b/packages/ua-devtools-aptos/src/oft/sdk.ts new file mode 100644 index 000000000..d0429eeb8 --- /dev/null +++ b/packages/ua-devtools-aptos/src/oft/sdk.ts @@ -0,0 +1,299 @@ +import type { OmniAddress, OmniTransaction, Bytes } from '@layerzerolabs/devtools' +import { areBytes32Equal } from '@layerzerolabs/devtools' +import type { IOApp, OAppEnforcedOptionParam } from '@layerzerolabs/ua-devtools' +import type { IEndpointV2 } from '@layerzerolabs/protocol-devtools' +import type { EndpointId } from '@layerzerolabs/lz-definitions' +import { + OmniSDK, + type ConnectionFactory, + hexAddrToAptosBytesAddr, + normalizeAddressToBytes32, +} from '@layerzerolabs/devtools-aptos' +import { EndpointV2 } from '@layerzerolabs/protocol-devtools-aptos' + +/** + * Aptos OFT SDK implementing the IOApp interface + * + * This SDK provides methods to interact with LayerZero OFT contracts on Aptos. + */ +export class OFT extends OmniSDK implements IOApp { + private endpoint?: EndpointV2 + + constructor( + point: { eid: EndpointId; address: OmniAddress }, + connectionFactory?: ConnectionFactory, + private readonly endpointAddress?: string + ) { + // Cast to any to handle potential lz-definitions version mismatches between packages + // eslint-disable-next-line @typescript-eslint/no-explicit-any + super(point as any, connectionFactory) + } + + /** + * Get the EndpointV2 SDK for this OFT + */ + async getEndpointSDK(): Promise { + if (this.endpoint) { + return this.endpoint + } + + // Create endpoint SDK - the endpoint address may come from config or use a default + this.endpoint = new EndpointV2( + { + eid: this.point.eid, + address: this.endpointAddress ?? this.point.address, + }, + this.connectionFactory + ) + + return this.endpoint + } + + /** + * Get the owner/admin of this OFT + */ + async getOwner(): Promise { + try { + const aptos = await this.getAptos() + const result = await aptos.view({ + payload: { + function: `${this.point.address}::oapp_core::get_admin`, + functionArguments: [], + }, + }) + return result[0] as string | undefined + } catch { + return undefined + } + } + + /** + * Check if address is the owner + */ + async hasOwner(address: OmniAddress): Promise { + const owner = await this.getOwner() + return owner?.toLowerCase() === address.toLowerCase() + } + + /** + * Set the owner/admin (transfer admin) + */ + async setOwner(address: OmniAddress): Promise { + return { + point: this.point, + data: JSON.stringify({ + function: `${this.point.address}::oapp_core::transfer_admin`, + functionArguments: [address], + types: ['address'], + }), + description: `Transferring admin to ${address}`, + } + } + + /** + * Get the peer address for a given endpoint ID + */ + async getPeer(eid: EndpointId): Promise { + try { + const aptos = await this.getAptos() + const result = await aptos.view({ + payload: { + function: `${this.point.address}::oapp_core::get_peer`, + functionArguments: [eid], + }, + }) + + const peer = result[0] as string | undefined + if (!peer || peer === '0x' + '0'.repeat(64)) { + return undefined + } + + return peer + } catch { + return undefined + } + } + + /** + * Check if a peer is set for a given endpoint ID + * + * Uses areBytes32Equal for proper comparison across different address formats + */ + async hasPeer(eid: EndpointId, address: OmniAddress | null | undefined): Promise { + const currentPeer = await this.getPeer(eid) + + // If no peer is expected and no peer is set, return true + if (!address && !currentPeer) { + return true + } + + // If one is set and the other isn't, return false + if (!address || !currentPeer) { + return false + } + + // Use bytes32 comparison for cross-chain address equality + return areBytes32Equal(normalizeAddressToBytes32(currentPeer), normalizeAddressToBytes32(address)) + } + + /** + * Set the peer address for a given endpoint ID + */ + async setPeer(eid: EndpointId, peer: OmniAddress | null | undefined): Promise { + const peerBytes = hexAddrToAptosBytesAddr(peer) + + return { + point: this.point, + data: JSON.stringify({ + function: `${this.point.address}::oapp_core::set_peer`, + functionArguments: [eid, Array.from(peerBytes)], + types: ['u32', 'u8'], + }), + description: `Setting peer for eid ${eid} to ${peer}`, + } + } + + /** + * Get the delegate address + */ + async getDelegate(): Promise { + try { + const aptos = await this.getAptos() + const result = await aptos.view({ + payload: { + function: `${this.point.address}::oapp_core::get_delegate`, + functionArguments: [], + }, + }) + return result[0] as string | undefined + } catch { + return undefined + } + } + + /** + * Check if address is the delegate + */ + async isDelegate(address: OmniAddress): Promise { + const delegate = await this.getDelegate() + return delegate?.toLowerCase() === address.toLowerCase() + } + + /** + * Set the delegate address + */ + async setDelegate(address: OmniAddress): Promise { + return { + point: this.point, + data: JSON.stringify({ + function: `${this.point.address}::oapp_core::set_delegate`, + functionArguments: [address], + types: ['address'], + }), + description: `Setting delegate to ${address}`, + } + } + + /** + * Get enforced options for a given endpoint ID and message type + */ + async getEnforcedOptions(eid: EndpointId, msgType: number): Promise { + try { + const aptos = await this.getAptos() + const result = await aptos.view({ + payload: { + function: `${this.point.address}::oapp_core::get_enforced_options`, + functionArguments: [eid, msgType], + }, + }) + + const options = result[0] + if (!options) { + return '0x' + } + + // Convert array of numbers to hex string if needed + if (Array.isArray(options)) { + return '0x' + Buffer.from(options as number[]).toString('hex') + } + + return options as string + } catch { + return '0x' + } + } + + /** + * Set enforced options + */ + async setEnforcedOptions(enforcedOptions: OAppEnforcedOptionParam[]): Promise { + // Aptos requires setting options one at a time per eid/msgType combination + // If there are multiple options, we need to batch them + if (enforcedOptions.length === 0) { + return { + point: this.point, + data: '0x', + description: 'No enforced options to set', + } + } + + // For single option + if (enforcedOptions.length === 1) { + const opt = enforcedOptions[0]! + const optionsBytes = this.hexToBytes(opt.option.options) + + return { + point: this.point, + data: JSON.stringify({ + function: `${this.point.address}::oapp_core::set_enforced_options`, + functionArguments: [opt.eid, opt.option.msgType, Array.from(optionsBytes)], + types: ['u32', 'u16', 'u8'], + }), + description: `Setting enforced options for eid ${opt.eid}, msgType ${opt.option.msgType}`, + } + } + + // For multiple options, return the first one (caller should handle batching) + const opt = enforcedOptions[0]! + const optionsBytes = this.hexToBytes(opt.option.options) + + return { + point: this.point, + data: JSON.stringify({ + function: `${this.point.address}::oapp_core::set_enforced_options`, + functionArguments: [opt.eid, opt.option.msgType, Array.from(optionsBytes)], + types: ['u32', 'u16', 'u8'], + }), + description: `Setting enforced options for eid ${opt.eid}, msgType ${opt.option.msgType} (1 of ${enforcedOptions.length})`, + } + } + + /** + * Get caller BPS cap + */ + async getCallerBpsCap(): Promise { + // Aptos OFT may not have caller BPS cap + // Return undefined to indicate not applicable + return undefined + } + + /** + * Set caller BPS cap + */ + async setCallerBpsCap(_callerBpsCap: bigint): Promise { + // Aptos OFT may not have caller BPS cap + return undefined + } + + /** + * Convert hex string to Uint8Array + */ + private hexToBytes(hex: string): Uint8Array { + const cleanHex = hex.replace('0x', '') + const bytes = new Uint8Array(cleanHex.length / 2) + for (let i = 0; i < cleanHex.length; i += 2) { + bytes[i / 2] = parseInt(cleanHex.slice(i, i + 2), 16) + } + return bytes + } +} diff --git a/packages/ua-devtools-aptos/tsconfig.json b/packages/ua-devtools-aptos/tsconfig.json new file mode 100644 index 000000000..44c83ff07 --- /dev/null +++ b/packages/ua-devtools-aptos/tsconfig.json @@ -0,0 +1,13 @@ +{ + "extends": "../../tsconfig.json", + "exclude": ["dist", "node_modules"], + "include": ["src", "test", "*.config.ts"], + "compilerOptions": { + "types": ["node", "jest"], + "target": "es2020", + "experimentalDecorators": true, + "paths": { + "@/*": ["./src/*"] + } + } +} diff --git a/packages/ua-devtools-aptos/tsup.config.ts b/packages/ua-devtools-aptos/tsup.config.ts new file mode 100644 index 000000000..7ef46a5ad --- /dev/null +++ b/packages/ua-devtools-aptos/tsup.config.ts @@ -0,0 +1,14 @@ +import { defineConfig } from 'tsup' + +export default defineConfig([ + { + entry: ['src/index.ts'], + outDir: './dist', + clean: true, + dts: true, + sourcemap: true, + splitting: false, + treeshake: true, + format: ['esm', 'cjs'], + }, +]) diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 45d4571e2..190d2b39c 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -3758,6 +3758,52 @@ importers: specifier: ^3.22.4 version: 3.22.4 + packages/devtools-aptos: + dependencies: + p-memoize: + specifier: ~4.0.4 + version: 4.0.4 + devDependencies: + '@aptos-labs/ts-sdk': + specifier: ^1.33.1 + version: 1.33.2 + '@layerzerolabs/devtools': + specifier: ~2.0.4 + version: link:../devtools + '@layerzerolabs/io-devtools': + specifier: ~0.3.2 + version: link:../io-devtools + '@layerzerolabs/lz-aptos-sdk-v2': + specifier: ^3.0.156 + version: 3.0.156(@swc/core@1.4.0)(@types/node@18.18.14)(typescript@5.5.3) + '@layerzerolabs/lz-definitions': + specifier: ^3.0.148 + version: 3.0.156 + '@swc/core': + specifier: ^1.4.0 + version: 1.4.0 + '@swc/jest': + specifier: ^0.2.36 + version: 0.2.36(@swc/core@1.4.0) + '@types/jest': + specifier: ^29.5.12 + version: 29.5.12 + jest: + specifier: ^29.7.0 + version: 29.7.0(@types/node@18.18.14)(ts-node@10.9.2) + ts-node: + specifier: ^10.9.2 + version: 10.9.2(@swc/core@1.4.0)(@types/node@18.18.14)(typescript@5.5.3) + tslib: + specifier: ~2.6.2 + version: 2.6.3 + tsup: + specifier: ~8.0.1 + version: 8.0.1(@swc/core@1.4.0)(ts-node@10.9.2)(typescript@5.5.3) + typescript: + specifier: ^5.4.4 + version: 5.5.3 + packages/devtools-cli: dependencies: yoga-layout-prebuilt: @@ -4374,7 +4420,7 @@ importers: version: 2.16.2 jest: specifier: ^29.6.2 - version: 29.7.0(@types/node@18.18.14) + version: 29.7.0(@types/node@18.18.14)(ts-node@10.9.2) tsup: specifier: ~8.0.1 version: 8.0.1(@swc/core@1.4.0)(typescript@5.5.3) @@ -4571,7 +4617,7 @@ importers: version: 29.5.12 jest: specifier: ^29.7.0 - version: 29.7.0(@types/node@18.18.14) + version: 29.7.0(@types/node@18.18.14)(ts-node@10.9.2) tslib: specifier: ~2.6.2 version: 2.6.3 @@ -5073,6 +5119,55 @@ importers: specifier: ^3.22.4 version: 3.22.4 + packages/protocol-devtools-aptos: + dependencies: + '@layerzerolabs/devtools-aptos': + specifier: workspace:^ + version: link:../devtools-aptos + devDependencies: + '@aptos-labs/ts-sdk': + specifier: ^1.33.1 + version: 1.33.2 + '@layerzerolabs/devtools': + specifier: ~2.0.4 + version: link:../devtools + '@layerzerolabs/io-devtools': + specifier: ~0.3.2 + version: link:../io-devtools + '@layerzerolabs/lz-aptos-sdk-v2': + specifier: ^3.0.156 + version: 3.0.156(@swc/core@1.4.0)(@types/node@18.18.14)(typescript@5.5.3) + '@layerzerolabs/lz-definitions': + specifier: ^3.0.148 + version: 3.0.156 + '@layerzerolabs/protocol-devtools': + specifier: ^3.0.0 + version: link:../protocol-devtools + '@swc/core': + specifier: ^1.4.0 + version: 1.4.0 + '@swc/jest': + specifier: ^0.2.36 + version: 0.2.36(@swc/core@1.4.0) + '@types/jest': + specifier: ^29.5.12 + version: 29.5.12 + jest: + specifier: ^29.7.0 + version: 29.7.0(@types/node@18.18.14)(ts-node@10.9.2) + ts-node: + specifier: ^10.9.2 + version: 10.9.2(@swc/core@1.4.0)(@types/node@18.18.14)(typescript@5.5.3) + tslib: + specifier: ~2.6.2 + version: 2.6.3 + tsup: + specifier: ~8.0.1 + version: 8.0.1(@swc/core@1.4.0)(ts-node@10.9.2)(typescript@5.5.3) + typescript: + specifier: ^5.4.4 + version: 5.5.3 + packages/protocol-devtools-evm: dependencies: p-memoize: @@ -5165,13 +5260,13 @@ importers: version: 3.0.148 '@layerzerolabs/lz-solana-sdk-v2': specifier: ^3.0.118 - version: 3.0.120(@swc/core@1.4.0)(@types/node@18.18.14)(typescript@5.5.3) + version: 3.0.120(@swc/core@1.4.0)(@types/node@18.18.14)(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.5.3) '@layerzerolabs/lz-v2-utilities': specifier: ^3.0.148 version: 3.0.148 '@layerzerolabs/oft-v2-solana-sdk': specifier: ^3.0.38 - version: 3.0.38(@swc/core@1.4.0)(@types/node@18.18.14)(typescript@5.5.3) + version: 3.0.38(@swc/core@1.4.0)(@types/node@18.18.14)(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.5.3) '@layerzerolabs/protocol-devtools': specifier: ~3.0.2 version: link:../protocol-devtools @@ -5803,6 +5898,61 @@ importers: specifier: ^3.22.4 version: 3.22.4 + packages/ua-devtools-aptos: + dependencies: + '@layerzerolabs/devtools-aptos': + specifier: workspace:^ + version: link:../devtools-aptos + '@layerzerolabs/protocol-devtools-aptos': + specifier: workspace:^ + version: link:../protocol-devtools-aptos + devDependencies: + '@aptos-labs/ts-sdk': + specifier: ^1.33.1 + version: 1.33.2 + '@layerzerolabs/devtools': + specifier: ~2.0.4 + version: link:../devtools + '@layerzerolabs/io-devtools': + specifier: ~0.3.2 + version: link:../io-devtools + '@layerzerolabs/lz-aptos-sdk-v2': + specifier: ^3.0.156 + version: 3.0.156(@swc/core@1.4.0)(@types/node@18.18.14)(typescript@5.5.3) + '@layerzerolabs/lz-definitions': + specifier: ^3.0.148 + version: 3.0.156 + '@layerzerolabs/protocol-devtools': + specifier: ^3.0.0 + version: link:../protocol-devtools + '@layerzerolabs/ua-devtools': + specifier: ~5.0.0 + version: link:../ua-devtools + '@swc/core': + specifier: ^1.4.0 + version: 1.4.0 + '@swc/jest': + specifier: ^0.2.36 + version: 0.2.36(@swc/core@1.4.0) + '@types/jest': + specifier: ^29.5.12 + version: 29.5.12 + jest: + specifier: ^29.7.0 + version: 29.7.0(@types/node@18.18.14)(ts-node@10.9.2) + ts-node: + specifier: ^10.9.2 + version: 10.9.2(@swc/core@1.4.0)(@types/node@18.18.14)(typescript@5.5.3) + tslib: + specifier: ~2.6.2 + version: 2.6.3 + tsup: + specifier: ~8.0.1 + version: 8.0.1(@swc/core@1.4.0)(ts-node@10.9.2)(typescript@5.5.3) + typescript: + specifier: ^5.4.4 + version: 5.5.3 + packages/ua-devtools-evm: dependencies: p-memoize: @@ -5999,13 +6149,13 @@ importers: version: 3.0.148 '@layerzerolabs/lz-solana-sdk-v2': specifier: ^3.0.118 - version: 3.0.120(@swc/core@1.4.0)(@types/node@18.18.14)(typescript@5.5.3) + version: 3.0.120(@swc/core@1.4.0)(@types/node@18.18.14)(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.5.3) '@layerzerolabs/lz-v2-utilities': specifier: ^3.0.148 version: 3.0.148 '@layerzerolabs/oft-v2-solana-sdk': specifier: ^3.0.59 - version: 3.0.66(@swc/core@1.4.0)(@types/node@18.18.14)(typescript@5.5.3) + version: 3.0.66(@swc/core@1.4.0)(@types/node@18.18.14)(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.5.3) '@layerzerolabs/protocol-devtools': specifier: ~3.0.2 version: link:../protocol-devtools @@ -6262,7 +6412,7 @@ importers: version: 12.6.1 jest: specifier: ^29.7.0 - version: 29.7.0(@types/node@18.18.14) + version: 29.7.0(@types/node@18.18.14)(ts-node@10.9.2) tsup: specifier: ^8.0.1 version: 8.0.1(@swc/core@1.4.0)(typescript@5.5.3) @@ -7073,6 +7223,7 @@ packages: /@aptos-labs/aptos-client@0.1.1: resolution: {integrity: sha512-kJsoy4fAPTOhzVr7Vwq8s/AUg6BQiJDa7WOqRzev4zsuIS3+JCuIZ6vUd7UBsjnxtmguJJulMRs9qWCzVBt2XA==} engines: {node: '>=15.10.0'} + deprecated: <1.0.0 is no longer supported please upgrade to the latest version dependencies: axios: 1.7.4(debug@4.3.7) got: 11.8.6 @@ -7085,10 +7236,10 @@ packages: dependencies: '@aptos-labs/aptos-cli': 1.0.2 '@aptos-labs/aptos-client': 0.1.1 - '@noble/curves': 1.8.1 - '@noble/hashes': 1.7.1 - '@scure/bip32': 1.6.2 - '@scure/bip39': 1.5.4 + '@noble/curves': 1.9.6 + '@noble/hashes': 1.8.0 + '@scure/bip32': 1.7.0 + '@scure/bip39': 1.6.0 eventemitter3: 5.0.1 form-data: 4.0.1 js-base64: 3.7.7 @@ -7145,7 +7296,6 @@ packages: '@babel/helper-validator-identifier': 7.28.5 js-tokens: 4.0.0 picocolors: 1.1.1 - dev: true /@babel/compat-data@7.23.5: resolution: {integrity: sha512-uU27kfDRlhfKl+w1U6vp16IuvSLtjAxdArVXPa9BvLkrr7CYIsxH5adpHObeAGY/41+syctUWOZ140a2Rvkgjw==} @@ -7154,7 +7304,6 @@ packages: /@babel/compat-data@7.28.5: resolution: {integrity: sha512-6uFXyCayocRbqhZOB+6XcuZbkMNimwfVGFji8CTZnCzOHVGvDqzvitu1re2AU5LROliz7eQPhB8CpAMvnx9EjA==} engines: {node: '>=6.9.0'} - dev: true /@babel/core@7.23.9: resolution: {integrity: sha512-5q0175NOjddqpvvzU+kDiSOAk4PfdO6FvwCWoQ6RO7rTzEe8vlo+4HVfcnAREhD4npMs0e9uZypjTwzZPCf/cw==} @@ -7199,7 +7348,6 @@ packages: semver: 6.3.1 transitivePeerDependencies: - supports-color - dev: true /@babel/generator@7.23.6: resolution: {integrity: sha512-qrSfCYxYQB5owCmGLbl8XRpX1ytXlpueOb0N0UmQwA073KZxejgQTzAmJezxvpwQD9uGtK2shHdi55QT+MbjIw==} @@ -7219,7 +7367,6 @@ packages: '@jridgewell/gen-mapping': 0.3.13 '@jridgewell/trace-mapping': 0.3.31 jsesc: 3.1.0 - dev: true /@babel/helper-compilation-targets@7.23.6: resolution: {integrity: sha512-9JB548GZoQVmzrFgp8o7KxdgkTGm6xs9DW0o/Pim72UDjzr5ObUQ6ZzYPqA+g9OTS2bBQoctLJrky0RDCAWRgQ==} @@ -7240,7 +7387,6 @@ packages: browserslist: 4.28.0 lru-cache: 5.1.1 semver: 6.3.1 - dev: true /@babel/helper-environment-visitor@7.22.20: resolution: {integrity: sha512-zfedSIzFhat/gFhWfHtgWvlec0nqB9YEIVrpuwjruLlXfUSnA8cJB0miHKwqDnQ7d32aKo2xt88/xZptwxbfhA==} @@ -7256,7 +7402,6 @@ packages: /@babel/helper-globals@7.28.0: resolution: {integrity: sha512-+W6cISkXFa1jXsDEdYA8HeevQT/FULhxzR99pxphltZcVaugps53THCeiWA8SguxxpSp3gKPiuYfSWopkLQ4hw==} engines: {node: '>=6.9.0'} - dev: true /@babel/helper-hoist-variables@7.22.5: resolution: {integrity: sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw==} @@ -7278,7 +7423,6 @@ packages: '@babel/types': 7.28.5 transitivePeerDependencies: - supports-color - dev: true /@babel/helper-module-transforms@7.23.3(@babel/core@7.23.9): resolution: {integrity: sha512-7bBs4ED9OmswdfDzpz4MpWgSrV7FXlc3zIagvLFjS5H+Mk7Snr21vQ6QwrsoCGMfNC4e4LQPdoULEt4ykz0SRQ==} @@ -7305,7 +7449,6 @@ packages: '@babel/traverse': 7.28.5 transitivePeerDependencies: - supports-color - dev: true /@babel/helper-plugin-utils@7.22.5: resolution: {integrity: sha512-uLls06UVKgFG9QD4OeFYLEGteMIAa5kpTPcFL28yuCIIzsf6ZyKZMllKVOCZFhiZ5ptnwX4mtKdWCBE/uT4amg==} @@ -7339,7 +7482,6 @@ packages: /@babel/helper-string-parser@7.27.1: resolution: {integrity: sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==} engines: {node: '>=6.9.0'} - dev: true /@babel/helper-validator-identifier@7.22.20: resolution: {integrity: sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==} @@ -7352,7 +7494,6 @@ packages: /@babel/helper-validator-identifier@7.28.5: resolution: {integrity: sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q==} engines: {node: '>=6.9.0'} - dev: true /@babel/helper-validator-option@7.23.5: resolution: {integrity: sha512-85ttAOMLsr53VgXkTbkx8oA6YTfT4q7/HzXSLEYmjcSTJPMPQtvq1BD79Byep5xMUYbGRzEpDsjUf3dyp54IKw==} @@ -7361,7 +7502,6 @@ packages: /@babel/helper-validator-option@7.27.1: resolution: {integrity: sha512-YvjJow9FxbhFFKDSuFnVCe2WxXk1zWc22fFePVNEaWJEu8IrZVlda6N0uHwzZrUM1il7NC9Mlp4MaJYbYd9JSg==} engines: {node: '>=6.9.0'} - dev: true /@babel/helpers@7.23.9: resolution: {integrity: sha512-87ICKgU5t5SzOT7sBMfCOZQ2rHjRU+Pcb9BoILMYz600W6DkVRLFBPwQ18gwUVvggqXivaUakpnxWQGbpywbBQ==} @@ -7379,7 +7519,6 @@ packages: dependencies: '@babel/template': 7.27.2 '@babel/types': 7.28.5 - dev: true /@babel/highlight@7.23.4: resolution: {integrity: sha512-acGdbYSfp2WheJoJm/EBBBLh/ID8KDc64ISZ9DYtBmC8/Q204PZJLHyzeB5qMzJ5trcOkybd78M4x2KWsUq++A==} @@ -7409,7 +7548,6 @@ packages: hasBin: true dependencies: '@babel/types': 7.28.5 - dev: true /@babel/plugin-syntax-async-generators@7.8.4(@babel/core@7.23.9): resolution: {integrity: sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==} @@ -7426,7 +7564,6 @@ packages: dependencies: '@babel/core': 7.28.5 '@babel/helper-plugin-utils': 7.22.5 - dev: true /@babel/plugin-syntax-bigint@7.8.3(@babel/core@7.23.9): resolution: {integrity: sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg==} @@ -7443,7 +7580,6 @@ packages: dependencies: '@babel/core': 7.28.5 '@babel/helper-plugin-utils': 7.22.5 - dev: true /@babel/plugin-syntax-class-properties@7.12.13(@babel/core@7.23.9): resolution: {integrity: sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==} @@ -7460,7 +7596,6 @@ packages: dependencies: '@babel/core': 7.28.5 '@babel/helper-plugin-utils': 7.22.5 - dev: true /@babel/plugin-syntax-class-static-block@7.14.5(@babel/core@7.28.5): resolution: {integrity: sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw==} @@ -7497,7 +7632,6 @@ packages: dependencies: '@babel/core': 7.28.5 '@babel/helper-plugin-utils': 7.22.5 - dev: true /@babel/plugin-syntax-json-strings@7.8.3(@babel/core@7.23.9): resolution: {integrity: sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==} @@ -7514,7 +7648,6 @@ packages: dependencies: '@babel/core': 7.28.5 '@babel/helper-plugin-utils': 7.22.5 - dev: true /@babel/plugin-syntax-jsx@7.23.3(@babel/core@7.23.9): resolution: {integrity: sha512-EB2MELswq55OHUoRZLGg/zC7QWUKfNLpE57m/S2yr1uEneIgsTgrSzXP3NXEsMkVn76OlaVVnzN+ugObuYGwhg==} @@ -7550,7 +7683,6 @@ packages: dependencies: '@babel/core': 7.28.5 '@babel/helper-plugin-utils': 7.22.5 - dev: true /@babel/plugin-syntax-nullish-coalescing-operator@7.8.3(@babel/core@7.23.9): resolution: {integrity: sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==} @@ -7567,7 +7699,6 @@ packages: dependencies: '@babel/core': 7.28.5 '@babel/helper-plugin-utils': 7.22.5 - dev: true /@babel/plugin-syntax-numeric-separator@7.10.4(@babel/core@7.23.9): resolution: {integrity: sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==} @@ -7584,7 +7715,6 @@ packages: dependencies: '@babel/core': 7.28.5 '@babel/helper-plugin-utils': 7.22.5 - dev: true /@babel/plugin-syntax-object-rest-spread@7.8.3(@babel/core@7.23.9): resolution: {integrity: sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==} @@ -7601,7 +7731,6 @@ packages: dependencies: '@babel/core': 7.28.5 '@babel/helper-plugin-utils': 7.22.5 - dev: true /@babel/plugin-syntax-optional-catch-binding@7.8.3(@babel/core@7.23.9): resolution: {integrity: sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==} @@ -7618,7 +7747,6 @@ packages: dependencies: '@babel/core': 7.28.5 '@babel/helper-plugin-utils': 7.22.5 - dev: true /@babel/plugin-syntax-optional-chaining@7.8.3(@babel/core@7.23.9): resolution: {integrity: sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==} @@ -7635,7 +7763,6 @@ packages: dependencies: '@babel/core': 7.28.5 '@babel/helper-plugin-utils': 7.22.5 - dev: true /@babel/plugin-syntax-private-property-in-object@7.14.5(@babel/core@7.28.5): resolution: {integrity: sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg==} @@ -7664,7 +7791,6 @@ packages: dependencies: '@babel/core': 7.28.5 '@babel/helper-plugin-utils': 7.22.5 - dev: true /@babel/plugin-syntax-typescript@7.23.3(@babel/core@7.23.9): resolution: {integrity: sha512-9EiNjVJOMwCO+43TqoTrgQ8jMwcAd0sWyXi9RPfIsLTj4R2MADDDQXELhffaUx/uJv2AYcxBgPwH6j4TIA4ytQ==} @@ -7706,7 +7832,6 @@ packages: '@babel/code-frame': 7.27.1 '@babel/parser': 7.28.5 '@babel/types': 7.28.5 - dev: true /@babel/traverse@7.23.9: resolution: {integrity: sha512-I/4UJ9vs90OkBtY6iiiTORVMyIhJ4kAVmsKo9KFc8UOxMeUfi2hvtIBsET5u9GizXE6/GFSuKCTNfgCswuEjRg==} @@ -7738,7 +7863,6 @@ packages: debug: 4.4.0(supports-color@8.1.1) transitivePeerDependencies: - supports-color - dev: true /@babel/types@7.23.9: resolution: {integrity: sha512-dQjSq/7HaSjRM43FFGnv5keM2HsxpmyV1PfaSVm0nzzjwwTmjOe6J4bC8e3+pTEIgHaHj+1ZlLThRJ2auc/w1Q==} @@ -7761,7 +7885,6 @@ packages: dependencies: '@babel/helper-string-parser': 7.27.1 '@babel/helper-validator-identifier': 7.28.5 - dev: true /@balena/dockerignore@1.0.2: resolution: {integrity: sha512-wMue2Sy4GAVTk6Ic4tJVcnfdau+gx2EnG7S+uAEe+TWJFqE4YoWN4/H8MSLj4eYJKxGg26lZwboEniNiNwZQ6Q==} @@ -7773,7 +7896,7 @@ packages: /@bitcoinerlab/secp256k1@1.2.0: resolution: {integrity: sha512-jeujZSzb3JOZfmJYI0ph1PVpCRV5oaexCgy+RvCXV8XlY+XFB/2n3WOcvBsKLsOw78KYgnQrQWb2HrKE4be88Q==} dependencies: - '@noble/curves': 1.8.1 + '@noble/curves': 1.9.6 /@chainlink/contracts-ccip@0.7.6(ethers@5.7.2): resolution: {integrity: sha512-yNbCBFpLs3R+ALymto9dQYKz3vatnjqYGu1pnMD0i2fHEMthiXe0+otaNCGNht6n8k7ruNaA0DNpz3F+2jHQXw==} @@ -10044,6 +10167,35 @@ packages: '@types/node': 22.15.3 dev: true + /@iota/bcs@1.4.0: + resolution: {integrity: sha512-Bpg8uPB3UTweJyFS3G+aycGcTCxaJQi2a9bEy2QXWMBM8a/tLN1KCg4IzKWkAJ4FyMNrZZrdXiBqAzmNK6xdVQ==} + dependencies: + bs58: 6.0.0 + dev: true + + /@iota/iota-sdk@1.10.1(typescript@5.5.3): + resolution: {integrity: sha512-q0GxOCFzPqIcaw1lFuFljmMDj1ajIK6UZFzOYnnPqfs/nufOZrJQ9Bg/hLj23xbMno/tdND+aIjDWY6GG8MAXw==} + engines: {node: '>=20'} + dependencies: + '@graphql-typed-document-node/core': 3.2.0(graphql@16.11.0) + '@iota/bcs': 1.4.0 + '@noble/curves': 1.9.6 + '@noble/hashes': 1.8.0 + '@scure/bip32': 1.7.0 + '@scure/bip39': 1.6.0 + '@suchipi/femver': 1.0.0 + bech32: 2.0.0 + bignumber.js: 9.1.2 + gql.tada: 1.8.13(graphql@16.11.0)(typescript@5.5.3) + graphql: 16.11.0 + tweetnacl: 1.0.3 + valibot: 1.2.0(typescript@5.5.3) + transitivePeerDependencies: + - '@gql.tada/svelte-support' + - '@gql.tada/vue-support' + - typescript + dev: true + /@ipld/dag-pb@2.1.18: resolution: {integrity: sha512-ZBnf2fuX9y3KccADURG5vb9FaOeMjFkCrNysB0PtftME/4iCTjxfaLoNq/IAh5fTqUOMXvryN6Jyka4ZGuMLIg==} dependencies: @@ -10508,7 +10660,7 @@ packages: '@types/istanbul-lib-coverage': 2.0.6 '@types/istanbul-reports': 3.0.4 '@types/node': 18.18.14 - '@types/yargs': 17.0.32 + '@types/yargs': 17.0.35 chalk: 4.1.2 /@jest/types@30.2.0: @@ -10529,7 +10681,6 @@ packages: dependencies: '@jridgewell/sourcemap-codec': 1.5.0 '@jridgewell/trace-mapping': 0.3.31 - dev: true /@jridgewell/gen-mapping@0.3.3: resolution: {integrity: sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==} @@ -10544,7 +10695,6 @@ packages: dependencies: '@jridgewell/gen-mapping': 0.3.13 '@jridgewell/trace-mapping': 0.3.31 - dev: true /@jridgewell/resolve-uri@3.1.1: resolution: {integrity: sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA==} @@ -10559,7 +10709,6 @@ packages: /@jridgewell/sourcemap-codec@1.5.0: resolution: {integrity: sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==} - dev: true /@jridgewell/trace-mapping@0.3.22: resolution: {integrity: sha512-Wf963MzWtA2sjrNt+g18IAln9lKnlRp+K2eH4jjIoF1wYeq3aMREpG09xhlhdzS0EjwU7qmUJYangWa+151vZw==} @@ -10572,7 +10721,6 @@ packages: dependencies: '@jridgewell/resolve-uri': 3.1.1 '@jridgewell/sourcemap-codec': 1.5.0 - dev: true /@jridgewell/trace-mapping@0.3.9: resolution: {integrity: sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==} @@ -10885,11 +11033,38 @@ packages: zod: 3.22.4 dev: true + /@layerzerolabs/lz-aptos-sdk-v2@3.0.156(@swc/core@1.4.0)(@types/node@18.18.14)(typescript@5.5.3): + resolution: {integrity: sha512-gGedl17wP0ayePIeKo//MkXBaSrc+v5WsWcdZSJkR9xWkc4Jp+nvjZZzLuNWPdMX4N+kiBZRzg27W4ff9Ln7Bg==} + dependencies: + '@aptos-labs/ts-sdk': 1.33.2 + '@layerzerolabs/lz-core': 3.0.156 + '@layerzerolabs/lz-corekit-aptos': 3.0.156(@swc/core@1.4.0)(@types/node@18.18.14)(typescript@5.5.3) + '@layerzerolabs/lz-definitions': 3.0.156 + '@layerzerolabs/lz-movevm-sdk-v2': 3.0.156(@swc/core@1.4.0)(@types/node@18.18.14)(typescript@5.5.3) + '@layerzerolabs/move-definitions': 3.0.156 + aptos: 1.21.0 + tiny-invariant: 1.3.3 + transitivePeerDependencies: + - '@gql.tada/svelte-support' + - '@gql.tada/vue-support' + - '@jest/globals' + - '@swc/core' + - '@swc/wasm' + - '@types/node' + - bufferutil + - chai + - debug + - encoding + - supports-color + - typescript + - utf-8-validate + dev: true + /@layerzerolabs/lz-config-types@3.0.59(ethers@5.7.2): resolution: {integrity: sha512-V8hcvabSMG/fCA1pt+mkumVwcT1/uWeH4jFqIcC+Elisw4e6C+ALsWBWKRkiOVzi8yFkKaddE9fPrI3iK46vsQ==} dependencies: '@layerzerolabs/lz-core': 3.0.66 - '@layerzerolabs/lz-definitions': 3.0.148 + '@layerzerolabs/lz-definitions': 3.0.156 '@safe-global/protocol-kit': 1.3.0(ethers@5.7.2) transitivePeerDependencies: - bufferutil @@ -10899,21 +11074,44 @@ packages: - utf-8-validate dev: true - /@layerzerolabs/lz-core@3.0.120: - resolution: {integrity: sha512-zuFYq5XupwSGHzJQwYHYeKak2aJ/DUa1R47P41L7VU/My0eeIp8QLcwcTCGGjj2o0AKmzblzE9UX7YEHzAQsGQ==} - dev: true - /@layerzerolabs/lz-core@3.0.138: resolution: {integrity: sha512-xnFdoiwS+P3aguwncedNp3e1/BvotV99hVos02OpYwScdaD7L4wD80pcYezYV9vg6g7IguTzQLj7yDGvJYpSow==} + /@layerzerolabs/lz-core@3.0.156: + resolution: {integrity: sha512-zGGJXQlJvjLw9hKPmFgUKYQv35Td+X/EHZHti3LXmFk52/3J6huWhlxmEhbTaa2bIISQfkGJJdn2eWsW5iYb9A==} + dev: true + /@layerzerolabs/lz-core@3.0.66: resolution: {integrity: sha512-emp2bo09+cQ8ivLjNSG6vRbV9N8H88yeLRTiR1YcZ1UjLFaElm+8TcqpaHmKhKqGYQCUaz9IfVv7I6VE1pD3Tw==} dev: true + /@layerzerolabs/lz-corekit-aptos@3.0.156(@swc/core@1.4.0)(@types/node@18.18.14)(typescript@5.5.3): + resolution: {integrity: sha512-c7M5K1DWSnndVLN3tTj1B/uNjAV+1Qfz3IyRdFFT8naUOAHX3BdQL85pqRbeULW21PN5x3S0OicAJwWnK4Cb7Q==} + dependencies: + '@layerzerolabs/lz-core': 3.0.156 + '@layerzerolabs/lz-utilities': 3.0.156(@swc/core@1.4.0)(@types/node@18.18.14)(typescript@5.5.3) + aptos: 1.21.0 + memoizee: 0.4.17 + transitivePeerDependencies: + - '@gql.tada/svelte-support' + - '@gql.tada/vue-support' + - '@jest/globals' + - '@swc/core' + - '@swc/wasm' + - '@types/node' + - bufferutil + - chai + - debug + - encoding + - supports-color + - typescript + - utf-8-validate + dev: true + /@layerzerolabs/lz-corekit-solana@3.0.120(@swc/core@1.4.0)(@types/node@18.18.14)(typescript@5.5.3): resolution: {integrity: sha512-xnUHJq2Z6rUw8iz+896nOOv5nQsrrDFyN7zJYBVdE5OyAEdUXh6nhwoc/K7BK4MECZYCmP+HLyYKM1H87nTTQg==} dependencies: - '@layerzerolabs/lz-core': 3.0.120 + '@layerzerolabs/lz-core': 3.0.138 '@layerzerolabs/lz-utilities': 3.0.120(@swc/core@1.4.0)(@types/node@18.18.14)(typescript@5.5.3) '@metaplex-foundation/umi': 0.9.2 '@metaplex-foundation/umi-eddsa-web3js': 0.9.2(@metaplex-foundation/umi@0.9.2)(@solana/web3.js@1.98.0) @@ -10943,14 +11141,14 @@ packages: /@layerzerolabs/lz-corekit-solana@3.0.120(@types/node@18.18.14)(chai@4.5.0)(typescript@5.5.3): resolution: {integrity: sha512-xnUHJq2Z6rUw8iz+896nOOv5nQsrrDFyN7zJYBVdE5OyAEdUXh6nhwoc/K7BK4MECZYCmP+HLyYKM1H87nTTQg==} dependencies: - '@layerzerolabs/lz-core': 3.0.120 + '@layerzerolabs/lz-core': 3.0.138 '@layerzerolabs/lz-utilities': 3.0.120(@types/node@18.18.14)(chai@4.5.0)(typescript@5.5.3) '@metaplex-foundation/umi': 0.9.2 '@metaplex-foundation/umi-eddsa-web3js': 0.9.2(@metaplex-foundation/umi@0.9.2)(@solana/web3.js@1.98.0) '@metaplex-foundation/umi-program-repository': 0.9.2(@metaplex-foundation/umi@0.9.2) '@metaplex-foundation/umi-rpc-web3js': 0.9.2(@metaplex-foundation/umi@0.9.2)(@solana/web3.js@1.98.0) '@metaplex-foundation/umi-transaction-factory-web3js': 0.9.2(@metaplex-foundation/umi@0.9.2)(@solana/web3.js@1.98.0) - '@noble/hashes': 1.7.1 + '@noble/hashes': 1.8.0 '@noble/secp256k1': 1.7.1 '@solana/web3.js': 1.98.0 bip39: 3.1.0 @@ -11081,7 +11279,6 @@ packages: resolution: {integrity: sha512-9gXF+C3LJ3mwrrkVBvVwXaeRnZNFNFeEuA0ykp881IRMFmmcVKLYOkidFgmaItm70MishMrrt4Lo+wWuzkqqUg==} dependencies: tiny-invariant: 1.3.3 - dev: true /@layerzerolabs/lz-definitions@3.0.75: resolution: {integrity: sha512-TIbFBCfuElg6WcND4HNUROTSAayBETDC0YrISVadByo3iM2baAi+rpGC1kdrOxOTRlSBetd2khTOUCd7/sZdOQ==} @@ -11705,12 +11902,12 @@ packages: /@layerzerolabs/lz-foundation@3.0.120(@swc/core@1.4.0)(@types/node@18.18.14)(typescript@5.5.3): resolution: {integrity: sha512-3gHF042QffR7Vn3hj9jzQ4Y50iCQNnFPzMlrQYtsafYw/A30IjvxX0rhid2eVP9jC9Ib/nUDeakvx4joSe0KoQ==} dependencies: - '@layerzerolabs/lz-definitions': 3.0.148 + '@layerzerolabs/lz-definitions': 3.0.156 '@layerzerolabs/lz-utilities': 3.0.120(@swc/core@1.4.0)(@types/node@18.18.14)(typescript@5.5.3) '@noble/ed25519': 1.7.3 '@noble/hashes': 1.8.0 '@noble/secp256k1': 1.7.1 - '@scure/base': 1.2.6 + '@scure/base': 1.2.4 bech32: 2.0.0 memoizee: 0.4.17 transitivePeerDependencies: @@ -11730,10 +11927,10 @@ packages: /@layerzerolabs/lz-foundation@3.0.120(@types/node@18.18.14)(chai@4.5.0)(typescript@5.5.3): resolution: {integrity: sha512-3gHF042QffR7Vn3hj9jzQ4Y50iCQNnFPzMlrQYtsafYw/A30IjvxX0rhid2eVP9jC9Ib/nUDeakvx4joSe0KoQ==} dependencies: - '@layerzerolabs/lz-definitions': 3.0.148 + '@layerzerolabs/lz-definitions': 3.0.156 '@layerzerolabs/lz-utilities': 3.0.120(@types/node@18.18.14)(chai@4.5.0)(typescript@5.5.3) '@noble/ed25519': 1.7.3 - '@noble/hashes': 1.7.1 + '@noble/hashes': 1.8.0 '@noble/secp256k1': 1.7.1 '@scure/base': 1.2.4 bech32: 2.0.0 @@ -11755,7 +11952,7 @@ packages: /@layerzerolabs/lz-foundation@3.0.138(@swc/core@1.4.0)(@types/node@18.18.14)(chai@4.4.1)(typescript@5.5.3): resolution: {integrity: sha512-NOv6yiNnIaNBfzGnGlNyJ4ZtIAdze8wVVdPEzL8JkiWvICS6DB56OzNTNx8c9lD1m5I6+Y4oEuIm1ttarNhqWQ==} dependencies: - '@layerzerolabs/lz-definitions': 3.0.148 + '@layerzerolabs/lz-definitions': 3.0.156 '@layerzerolabs/lz-utilities': 3.0.138(@swc/core@1.4.0)(@types/node@18.18.14)(chai@4.4.1)(typescript@5.5.3) '@noble/ed25519': 1.7.3 '@noble/hashes': 1.8.0 @@ -11782,7 +11979,7 @@ packages: /@layerzerolabs/lz-foundation@3.0.138(@swc/core@1.4.0)(@types/node@18.18.14)(typescript@5.5.3): resolution: {integrity: sha512-NOv6yiNnIaNBfzGnGlNyJ4ZtIAdze8wVVdPEzL8JkiWvICS6DB56OzNTNx8c9lD1m5I6+Y4oEuIm1ttarNhqWQ==} dependencies: - '@layerzerolabs/lz-definitions': 3.0.148 + '@layerzerolabs/lz-definitions': 3.0.156 '@layerzerolabs/lz-utilities': 3.0.138(@swc/core@1.4.0)(@types/node@18.18.14)(typescript@5.5.3) '@noble/ed25519': 1.7.3 '@noble/hashes': 1.8.0 @@ -11809,7 +12006,7 @@ packages: /@layerzerolabs/lz-foundation@3.0.138(@types/node@18.18.14)(chai@4.5.0)(typescript@5.5.3): resolution: {integrity: sha512-NOv6yiNnIaNBfzGnGlNyJ4ZtIAdze8wVVdPEzL8JkiWvICS6DB56OzNTNx8c9lD1m5I6+Y4oEuIm1ttarNhqWQ==} dependencies: - '@layerzerolabs/lz-definitions': 3.0.148 + '@layerzerolabs/lz-definitions': 3.0.156 '@layerzerolabs/lz-utilities': 3.0.138(@types/node@18.18.14)(chai@4.5.0)(typescript@5.5.3) '@noble/ed25519': 1.7.3 '@noble/hashes': 1.8.0 @@ -11836,7 +12033,7 @@ packages: /@layerzerolabs/lz-foundation@3.0.38(@swc/core@1.4.0)(@types/node@18.18.14)(typescript@5.5.3): resolution: {integrity: sha512-0WDrlJ+DZ3GGxKPgcConoxQdTB7icpoOYjeTcwmBtJcUnXIE7G3vxzKUAKsUccGegFdgHMEj1K4D+3NPZbNQ2A==} dependencies: - '@layerzerolabs/lz-definitions': 3.0.148 + '@layerzerolabs/lz-definitions': 3.0.156 '@layerzerolabs/lz-utilities': 3.0.120(@swc/core@1.4.0)(@types/node@18.18.14)(typescript@5.5.3) '@noble/ed25519': 1.7.3 '@noble/hashes': 1.8.0 @@ -11859,7 +12056,7 @@ packages: /@layerzerolabs/lz-foundation@3.0.66(@swc/core@1.4.0)(@types/node@18.18.14)(typescript@5.5.3): resolution: {integrity: sha512-ZJC/PRPhF5LHt32dGIj3HGNAD+ReGNYsdLzfR2P8JMuAph1T0W3FsniVjjDMEVxyKOrXVHOt0GFg9o56lYCcEw==} dependencies: - '@layerzerolabs/lz-definitions': 3.0.148 + '@layerzerolabs/lz-definitions': 3.0.156 '@layerzerolabs/lz-utilities': 3.0.120(@swc/core@1.4.0)(@types/node@18.18.14)(typescript@5.5.3) '@noble/ed25519': 1.7.3 '@noble/hashes': 1.8.0 @@ -11879,10 +12076,34 @@ packages: - utf-8-validate dev: true + /@layerzerolabs/lz-movevm-sdk-v2@3.0.156(@swc/core@1.4.0)(@types/node@18.18.14)(typescript@5.5.3): + resolution: {integrity: sha512-bEPApJ2Dl6uwtECNt/ajubLewBkiLmLZPWe1I7YusXnAogAg61yf5/imToB3Nvt/+328bapar2snS1dRS2M19A==} + dependencies: + '@layerzerolabs/lz-definitions': 3.0.156 + '@layerzerolabs/lz-serdes': 3.0.156(@swc/core@1.4.0)(@types/node@18.18.14)(typescript@5.5.3) + '@layerzerolabs/lz-utilities': 3.0.156(@swc/core@1.4.0)(@types/node@18.18.14)(typescript@5.5.3) + '@layerzerolabs/lz-v2-utilities': 3.0.156 + '@layerzerolabs/move-definitions': 3.0.156 + transitivePeerDependencies: + - '@gql.tada/svelte-support' + - '@gql.tada/vue-support' + - '@jest/globals' + - '@swc/core' + - '@swc/wasm' + - '@types/node' + - bufferutil + - chai + - debug + - encoding + - supports-color + - typescript + - utf-8-validate + dev: true + /@layerzerolabs/lz-movevm-sdk-v2@3.0.59(@jest/globals@29.7.0)(@types/node@18.18.14)(chai@4.5.0)(typescript@5.5.3): resolution: {integrity: sha512-qYP5R5nlmO/siy3q68MH3nDnvb0ORzae3KSo2BD3cctNLiEpCjBei+8OcWMo9qZpJDMovNlqtTEaHt1CJmKxBQ==} dependencies: - '@layerzerolabs/lz-definitions': 3.0.148 + '@layerzerolabs/lz-definitions': 3.0.156 '@layerzerolabs/lz-serdes': 3.0.66 '@layerzerolabs/lz-utilities': 3.0.66(@jest/globals@29.7.0)(@types/node@18.18.14)(chai@4.5.0)(typescript@5.5.3) '@layerzerolabs/lz-v2-utilities': 3.0.148 @@ -11905,7 +12126,7 @@ packages: resolution: {integrity: sha512-HX4Pl2Fid9OWBJgGKoKXUG8aZyFYhzOc1xCXXrPOcA61bVAygMDI9jedhBShSvFwFPLY6xhSaItDW7vP6b9szg==} dependencies: '@coral-xyz/anchor': 0.29.0 - '@layerzerolabs/lz-core': 3.0.120 + '@layerzerolabs/lz-core': 3.0.138 '@layerzerolabs/lz-utilities': 3.0.120(@swc/core@1.4.0)(@types/node@18.18.14)(typescript@5.5.3) '@layerzerolabs/tron-utilities': 3.0.120(@swc/core@1.4.0)(@types/node@18.18.14)(typescript@5.5.3) aptos: 1.21.0 @@ -11915,6 +12136,8 @@ packages: memoizee: 0.4.17 tronweb: 5.3.3 transitivePeerDependencies: + - '@gql.tada/svelte-support' + - '@gql.tada/vue-support' - '@jest/globals' - '@swc/core' - '@swc/wasm' @@ -11932,7 +12155,7 @@ packages: resolution: {integrity: sha512-HX4Pl2Fid9OWBJgGKoKXUG8aZyFYhzOc1xCXXrPOcA61bVAygMDI9jedhBShSvFwFPLY6xhSaItDW7vP6b9szg==} dependencies: '@coral-xyz/anchor': 0.29.0 - '@layerzerolabs/lz-core': 3.0.120 + '@layerzerolabs/lz-core': 3.0.138 '@layerzerolabs/lz-utilities': 3.0.120(@types/node@18.18.14)(chai@4.5.0)(typescript@5.5.3) '@layerzerolabs/tron-utilities': 3.0.120(@types/node@18.18.14)(chai@4.5.0)(typescript@5.5.3) aptos: 1.21.0 @@ -11942,6 +12165,8 @@ packages: memoizee: 0.4.17 tronweb: 5.3.3 transitivePeerDependencies: + - '@gql.tada/svelte-support' + - '@gql.tada/vue-support' - '@jest/globals' - '@swc/core' - '@swc/wasm' @@ -12042,15 +12267,44 @@ packages: - utf-8-validate dev: false + /@layerzerolabs/lz-serdes@3.0.156(@swc/core@1.4.0)(@types/node@18.18.14)(typescript@5.5.3): + resolution: {integrity: sha512-9QCw5a8kAgDfhm5lZOHtkiWGYeheUIw98fZf0n/HKrCI5vOL8LVH5u4ks2OTD5sFVt/qkfiMcntqCV3SRMw9gQ==} + dependencies: + '@coral-xyz/anchor': 0.29.0 + '@layerzerolabs/lz-core': 3.0.156 + '@layerzerolabs/lz-utilities': 3.0.156(@swc/core@1.4.0)(@types/node@18.18.14)(typescript@5.5.3) + '@layerzerolabs/tron-utilities': 3.0.156(@swc/core@1.4.0)(@types/node@18.18.14)(typescript@5.5.3) + aptos: 1.21.0 + bip39: 3.1.0 + ed25519-hd-key: 1.3.0 + ethers: 5.7.2 + memoizee: 0.4.17 + tronweb: 5.3.3 + transitivePeerDependencies: + - '@gql.tada/svelte-support' + - '@gql.tada/vue-support' + - '@jest/globals' + - '@swc/core' + - '@swc/wasm' + - '@types/node' + - bufferutil + - chai + - debug + - encoding + - supports-color + - typescript + - utf-8-validate + dev: true + /@layerzerolabs/lz-serdes@3.0.66: resolution: {integrity: sha512-kk/0pPKuNzIXL1Fh8caH3daYA/Lv2OIPeD7z/VIBANdyCBiYgncF6QK8muoFJ1iIvoQSnpAmgwgww1DlnYa2NA==} dev: true - /@layerzerolabs/lz-solana-sdk-v2@3.0.120(@swc/core@1.4.0)(@types/node@18.18.14)(typescript@5.5.3): + /@layerzerolabs/lz-solana-sdk-v2@3.0.120(@swc/core@1.4.0)(@types/node@18.18.14)(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.5.3): resolution: {integrity: sha512-D09DF3kXtwBGwyI8WcLv8AWfUHrCTJwXoMe7U+EuXH+TOsOmwVhLAk8fulRjR9fHnvQvGEyl1blHUebtY2nt3A==} dependencies: '@layerzerolabs/lz-corekit-solana': 3.0.120(@swc/core@1.4.0)(@types/node@18.18.14)(typescript@5.5.3) - '@layerzerolabs/lz-definitions': 3.0.148 + '@layerzerolabs/lz-definitions': 3.0.156 '@layerzerolabs/lz-foundation': 3.0.120(@swc/core@1.4.0)(@types/node@18.18.14)(typescript@5.5.3) '@layerzerolabs/lz-serdes': 3.0.120(@swc/core@1.4.0)(@types/node@18.18.14)(typescript@5.5.3) '@layerzerolabs/lz-utilities': 3.0.120(@swc/core@1.4.0)(@types/node@18.18.14)(typescript@5.5.3) @@ -12069,6 +12323,8 @@ packages: bs58: 5.0.0 tiny-invariant: 1.3.3 transitivePeerDependencies: + - '@gql.tada/svelte-support' + - '@gql.tada/vue-support' - '@jest/globals' - '@swc/core' - '@swc/wasm' @@ -12087,7 +12343,7 @@ packages: resolution: {integrity: sha512-D09DF3kXtwBGwyI8WcLv8AWfUHrCTJwXoMe7U+EuXH+TOsOmwVhLAk8fulRjR9fHnvQvGEyl1blHUebtY2nt3A==} dependencies: '@layerzerolabs/lz-corekit-solana': 3.0.120(@types/node@18.18.14)(chai@4.5.0)(typescript@5.5.3) - '@layerzerolabs/lz-definitions': 3.0.148 + '@layerzerolabs/lz-definitions': 3.0.156 '@layerzerolabs/lz-foundation': 3.0.120(@types/node@18.18.14)(chai@4.5.0)(typescript@5.5.3) '@layerzerolabs/lz-serdes': 3.0.120(@types/node@18.18.14)(chai@4.5.0)(typescript@5.5.3) '@layerzerolabs/lz-utilities': 3.0.120(@types/node@18.18.14)(chai@4.5.0)(typescript@5.5.3) @@ -12106,6 +12362,8 @@ packages: bs58: 5.0.0 tiny-invariant: 1.3.3 transitivePeerDependencies: + - '@gql.tada/svelte-support' + - '@gql.tada/vue-support' - '@jest/globals' - '@swc/core' - '@swc/wasm' @@ -12124,7 +12382,7 @@ packages: resolution: {integrity: sha512-e1PbfEQ/QJnHwL+wYxy/EjPsluf3y1NSZKenbwHNjF/I3BEjLRuLbE7V6rLO0HIG6rZMQXEkT/keo1+MTwd/gQ==} dependencies: '@layerzerolabs/lz-corekit-solana': 3.0.138(@swc/core@1.4.0)(@types/node@18.18.14)(chai@4.4.1)(typescript@5.5.3) - '@layerzerolabs/lz-definitions': 3.0.148 + '@layerzerolabs/lz-definitions': 3.0.156 '@layerzerolabs/lz-foundation': 3.0.138(@swc/core@1.4.0)(@types/node@18.18.14)(chai@4.4.1)(typescript@5.5.3) '@layerzerolabs/lz-serdes': 3.0.138(@swc/core@1.4.0)(@types/node@18.18.14)(chai@4.4.1)(typescript@5.5.3) '@layerzerolabs/lz-utilities': 3.0.138(@swc/core@1.4.0)(@types/node@18.18.14)(chai@4.4.1)(typescript@5.5.3) @@ -12159,11 +12417,11 @@ packages: - utf-8-validate dev: true - /@layerzerolabs/lz-solana-sdk-v2@3.0.138(@swc/core@1.4.0)(@types/node@18.18.14)(typescript@5.5.3): + /@layerzerolabs/lz-solana-sdk-v2@3.0.138(@swc/core@1.4.0)(@types/node@18.18.14)(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.5.3): resolution: {integrity: sha512-e1PbfEQ/QJnHwL+wYxy/EjPsluf3y1NSZKenbwHNjF/I3BEjLRuLbE7V6rLO0HIG6rZMQXEkT/keo1+MTwd/gQ==} dependencies: '@layerzerolabs/lz-corekit-solana': 3.0.138(@swc/core@1.4.0)(@types/node@18.18.14)(typescript@5.5.3) - '@layerzerolabs/lz-definitions': 3.0.148 + '@layerzerolabs/lz-definitions': 3.0.156 '@layerzerolabs/lz-foundation': 3.0.138(@swc/core@1.4.0)(@types/node@18.18.14)(typescript@5.5.3) '@layerzerolabs/lz-serdes': 3.0.138(@swc/core@1.4.0)(@types/node@18.18.14)(typescript@5.5.3) '@layerzerolabs/lz-utilities': 3.0.138(@swc/core@1.4.0)(@types/node@18.18.14)(typescript@5.5.3) @@ -12202,7 +12460,7 @@ packages: resolution: {integrity: sha512-e1PbfEQ/QJnHwL+wYxy/EjPsluf3y1NSZKenbwHNjF/I3BEjLRuLbE7V6rLO0HIG6rZMQXEkT/keo1+MTwd/gQ==} dependencies: '@layerzerolabs/lz-corekit-solana': 3.0.138(@types/node@18.18.14)(chai@4.5.0)(typescript@5.5.3) - '@layerzerolabs/lz-definitions': 3.0.148 + '@layerzerolabs/lz-definitions': 3.0.156 '@layerzerolabs/lz-foundation': 3.0.138(@types/node@18.18.14)(chai@4.5.0)(typescript@5.5.3) '@layerzerolabs/lz-serdes': 3.0.138(@types/node@18.18.14)(chai@4.5.0)(typescript@5.5.3) '@layerzerolabs/lz-utilities': 3.0.138(@types/node@18.18.14)(chai@4.5.0)(typescript@5.5.3) @@ -12280,7 +12538,7 @@ packages: dependencies: '@ethersproject/bytes': 5.8.0 '@initia/initia.js': 1.0.4(typescript@5.5.3) - '@layerzerolabs/lz-definitions': 3.0.148 + '@layerzerolabs/lz-definitions': 3.0.156 '@solana/web3.js': 1.98.0 '@ton/core': 0.59.0(@ton/crypto@3.3.0) '@ton/crypto': 3.3.0 @@ -12312,7 +12570,7 @@ packages: dependencies: '@ethersproject/bytes': 5.8.0 '@initia/initia.js': 1.0.4(typescript@5.5.3) - '@layerzerolabs/lz-definitions': 3.0.148 + '@layerzerolabs/lz-definitions': 3.0.156 '@solana/web3.js': 1.98.0 '@ton/core': 0.59.0(@ton/crypto@3.3.0) '@ton/crypto': 3.3.0 @@ -12344,7 +12602,7 @@ packages: dependencies: '@ethersproject/bytes': 5.8.0 '@initia/initia.js': 1.0.4(typescript@5.5.3) - '@layerzerolabs/lz-definitions': 3.0.148 + '@layerzerolabs/lz-definitions': 3.0.156 '@mysten/sui': 1.45.2(typescript@5.5.3) '@solana/web3.js': 1.98.0 '@ton/core': 0.59.0(@ton/crypto@3.3.0) @@ -12379,7 +12637,7 @@ packages: dependencies: '@ethersproject/bytes': 5.8.0 '@initia/initia.js': 1.0.4(typescript@5.5.3) - '@layerzerolabs/lz-definitions': 3.0.148 + '@layerzerolabs/lz-definitions': 3.0.156 '@mysten/sui': 1.45.2(typescript@5.5.3) '@solana/web3.js': 1.98.0 '@ton/core': 0.59.0(@ton/crypto@3.3.0) @@ -12414,7 +12672,7 @@ packages: dependencies: '@ethersproject/bytes': 5.8.0 '@initia/initia.js': 1.0.4(typescript@5.5.3) - '@layerzerolabs/lz-definitions': 3.0.148 + '@layerzerolabs/lz-definitions': 3.0.156 '@mysten/sui': 1.45.2(typescript@5.5.3) '@solana/web3.js': 1.98.0 '@ton/core': 0.59.0(@ton/crypto@3.3.0) @@ -12442,14 +12700,49 @@ packages: - supports-color - typescript - utf-8-validate - dev: false + + /@layerzerolabs/lz-utilities@3.0.156(@swc/core@1.4.0)(@types/node@18.18.14)(typescript@5.5.3): + resolution: {integrity: sha512-2JmUO/Sm0M9x6SjMYRlWiy0i2L+IgEq0nYLyBipXngPozNqvJS1izhhIZf6jIkIYQJdF8QeWMZ42Rxqc5wNmyg==} + dependencies: + '@ethersproject/bytes': 5.8.0 + '@initia/initia.js': 1.0.4(typescript@5.5.3) + '@iota/iota-sdk': 1.10.1(typescript@5.5.3) + '@layerzerolabs/lz-definitions': 3.0.156 + '@mysten/sui': 1.45.2(typescript@5.5.3) + '@solana/web3.js': 1.98.0 + '@ton/core': 0.59.0(@ton/crypto@3.3.0) + '@ton/crypto': 3.3.0 + '@ton/ton': /@layerzerolabs/ton@15.2.0-rc.3(@layerzerolabs/ton@15.2.0-rc.3)(@swc/core@1.4.0)(@ton/core@0.59.0)(@ton/crypto@3.3.0)(@types/node@18.18.14)(typescript@5.5.3) + aptos: 1.21.0 + bip39: 3.1.0 + dayjs: 1.11.13 + ed25519-hd-key: 1.3.0 + ethers: 5.7.2 + memoizee: 0.4.17 + picocolors: 1.0.0 + pino: 8.21.0 + transitivePeerDependencies: + - '@gql.tada/svelte-support' + - '@gql.tada/vue-support' + - '@jest/globals' + - '@swc/core' + - '@swc/wasm' + - '@types/node' + - bufferutil + - chai + - debug + - encoding + - supports-color + - typescript + - utf-8-validate + dev: true /@layerzerolabs/lz-utilities@3.0.66(@jest/globals@29.7.0)(@types/node@18.18.14)(chai@4.5.0)(typescript@5.5.3): resolution: {integrity: sha512-PDc3YAdUcNCnFGbQ7oDg1Pja/wt0O+FyRbhwoyTBQdqjNT/hG35KI7sz1yZgAQG0IItzgqKGI/5n4LKMvjZH/Q==} dependencies: '@ethersproject/bytes': 5.7.0 '@initia/initia.js': 0.2.32(typescript@5.5.3) - '@layerzerolabs/lz-definitions': 3.0.148 + '@layerzerolabs/lz-definitions': 3.0.156 '@solana/web3.js': 1.98.0 '@ton/core': 0.59.0(@ton/crypto@3.3.0) '@ton/crypto': 3.3.0 @@ -12479,7 +12772,7 @@ packages: dependencies: '@ethersproject/bytes': 5.7.0 '@initia/initia.js': 1.0.5(typescript@5.5.3) - '@layerzerolabs/lz-definitions': 3.0.148 + '@layerzerolabs/lz-definitions': 3.0.156 '@solana/web3.js': 1.98.0 '@ton/core': 0.59.0(@ton/crypto@3.3.0) '@ton/crypto': 3.3.0 @@ -12531,6 +12824,19 @@ packages: bs58: 5.0.0 tiny-invariant: 1.3.3 + /@layerzerolabs/lz-v2-utilities@3.0.156: + resolution: {integrity: sha512-AV8TPMN2bqJ6fNoY5adX+GxYD3/RhoF9EjY1F1onUfuojcqRJ7O4PgbK5k+B9XzTN3HHA6HNZo4vHCrY26kKwA==} + dependencies: + '@ethersproject/abi': 5.8.0 + '@ethersproject/address': 5.8.0 + '@ethersproject/bignumber': 5.8.0 + '@ethersproject/bytes': 5.8.0 + '@ethersproject/keccak256': 5.8.0 + '@ethersproject/solidity': 5.8.0 + bs58: 5.0.0 + tiny-invariant: 1.3.3 + dev: true + /@layerzerolabs/lz-v2-utilities@3.0.75: resolution: {integrity: sha512-6172reYvXMjBnpQZYlAz+wkxjBJzpBfL5IzAkB0Swc9t27L/ZqDS9e4HLG+lIXqcVaC7jc5cprUw0exbk1002A==} dependencies: @@ -12567,10 +12873,16 @@ packages: '@layerzerolabs/ua-devtools': 3.0.6(@layerzerolabs/devtools@0.4.10)(@layerzerolabs/io-devtools@0.1.17)(@layerzerolabs/lz-definitions@3.0.86)(@layerzerolabs/lz-v2-utilities@3.0.86)(@layerzerolabs/protocol-devtools@1.1.7)(zod@3.22.4) dev: true + /@layerzerolabs/move-definitions@3.0.156: + resolution: {integrity: sha512-COLaYiTlrr9raSgA4s7lgjDcHBYRsB4IbMlz4BBFSwf5lkJhUt63PKdTypb6q+MD4q/LlPp9W1CZUUMhQevIjw==} + dependencies: + '@layerzerolabs/lz-definitions': 3.0.156 + dev: true + /@layerzerolabs/move-definitions@3.0.59: resolution: {integrity: sha512-6cuvePiKpZ7OOgZEbX7keE0bQM3+HGzr7suqfb1LSYwfpcZKYICnB5fnbwXyC1Wa3qUx+/9ZlnhckKvUoUiwAA==} dependencies: - '@layerzerolabs/lz-definitions': 3.0.148 + '@layerzerolabs/lz-definitions': 3.0.156 dev: true /@layerzerolabs/oft-mint-burn-starknet@0.2.20(@layerzerolabs/protocol-starknet-v2@0.2.20): @@ -12647,12 +12959,12 @@ packages: - utf-8-validate dev: false - /@layerzerolabs/oft-v2-solana-sdk@3.0.38(@swc/core@1.4.0)(@types/node@18.18.14)(typescript@5.5.3): + /@layerzerolabs/oft-v2-solana-sdk@3.0.38(@swc/core@1.4.0)(@types/node@18.18.14)(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.5.3): resolution: {integrity: sha512-P06/a5+ixph0u1AQkDZ0P0oFaIAdfGPl/UezMfWXUpiWLth428RT0rrMR6qI7z6X1uxqlUFNIotz2ET1fyFcpQ==} dependencies: '@ethersproject/bytes': 5.7.0 '@layerzerolabs/lz-foundation': 3.0.38(@swc/core@1.4.0)(@types/node@18.18.14)(typescript@5.5.3) - '@layerzerolabs/lz-solana-sdk-v2': 3.0.138(@swc/core@1.4.0)(@types/node@18.18.14)(typescript@5.5.3) + '@layerzerolabs/lz-solana-sdk-v2': 3.0.138(@swc/core@1.4.0)(@types/node@18.18.14)(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.5.3) '@layerzerolabs/lz-v2-utilities': 3.0.148 '@metaplex-foundation/beet': 0.7.2 '@metaplex-foundation/beet-solana': 0.4.1 @@ -12680,12 +12992,12 @@ packages: - utf-8-validate dev: true - /@layerzerolabs/oft-v2-solana-sdk@3.0.66(@swc/core@1.4.0)(@types/node@18.18.14)(typescript@5.5.3): + /@layerzerolabs/oft-v2-solana-sdk@3.0.66(@swc/core@1.4.0)(@types/node@18.18.14)(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.5.3): resolution: {integrity: sha512-ijbvj6/Gc4O4WLHfqnrBuKUtIhpaYws/ORj2apZFT1RKSgAX8CCJ9aZmn0ClamEG98i+PpXoroPPU46LMOMZyA==} dependencies: '@ethersproject/bytes': 5.7.0 '@layerzerolabs/lz-foundation': 3.0.66(@swc/core@1.4.0)(@types/node@18.18.14)(typescript@5.5.3) - '@layerzerolabs/lz-solana-sdk-v2': 3.0.138(@swc/core@1.4.0)(@types/node@18.18.14)(typescript@5.5.3) + '@layerzerolabs/lz-solana-sdk-v2': 3.0.138(@swc/core@1.4.0)(@types/node@18.18.14)(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.5.3) '@layerzerolabs/lz-v2-utilities': 3.0.148 '@metaplex-foundation/beet': 0.7.2 '@metaplex-foundation/beet-solana': 0.4.1 @@ -12797,7 +13109,7 @@ packages: '@ton/crypto': 3.3.0 '@ton/sandbox': 0.22.0(@ton/core@0.59.0)(@ton/crypto@3.3.0) '@ton/test-utils': 0.4.2(@jest/globals@29.7.0)(@ton/core@0.59.0)(chai@4.5.0) - axios: 1.7.9 + axios: 1.8.4 dataloader: 2.2.2 symbol.inspect: 1.0.1 teslabot: 1.5.0 @@ -12825,7 +13137,7 @@ packages: '@ton/crypto': 3.3.0 '@ton/sandbox': 0.22.0(@ton/core@0.59.0)(@ton/crypto@3.3.0) '@ton/test-utils': 0.4.2(@ton/core@0.59.0)(chai@4.4.1) - axios: 1.7.9 + axios: 1.8.4 dataloader: 2.2.2 symbol.inspect: 1.0.1 teslabot: 1.5.0 @@ -12882,7 +13194,7 @@ packages: '@ton/crypto': 3.3.0 '@ton/sandbox': 0.22.0(@ton/core@0.59.0)(@ton/crypto@3.3.0) '@ton/test-utils': 0.4.2(@jest/globals@29.7.0)(@ton/core@0.59.0)(chai@4.5.0) - axios: 1.7.9 + axios: 1.8.4 dataloader: 2.2.2 symbol.inspect: 1.0.1 teslabot: 1.5.0 @@ -12903,10 +13215,12 @@ packages: /@layerzerolabs/tron-utilities@3.0.120(@swc/core@1.4.0)(@types/node@18.18.14)(typescript@5.5.3): resolution: {integrity: sha512-HjqvDhLQtYc4fA0Wll7p+WNDtzG5oDkJn0QQaEQzByUkrO3482+eU3BJlNzfEUg80SHLR0Ni8DLsp6LklNpZiw==} dependencies: - '@layerzerolabs/lz-utilities': 3.0.120(@swc/core@1.4.0)(@types/node@18.18.14)(typescript@5.5.3) + '@layerzerolabs/lz-utilities': 3.0.138(@swc/core@1.4.0)(@types/node@18.18.14)(typescript@5.5.3) ethers: 5.7.2 tronweb: 5.3.3 transitivePeerDependencies: + - '@gql.tada/svelte-support' + - '@gql.tada/vue-support' - '@jest/globals' - '@swc/core' - '@swc/wasm' @@ -12923,10 +13237,12 @@ packages: /@layerzerolabs/tron-utilities@3.0.120(@types/node@18.18.14)(chai@4.5.0)(typescript@5.5.3): resolution: {integrity: sha512-HjqvDhLQtYc4fA0Wll7p+WNDtzG5oDkJn0QQaEQzByUkrO3482+eU3BJlNzfEUg80SHLR0Ni8DLsp6LklNpZiw==} dependencies: - '@layerzerolabs/lz-utilities': 3.0.120(@types/node@18.18.14)(chai@4.5.0)(typescript@5.5.3) + '@layerzerolabs/lz-utilities': 3.0.138(@types/node@18.18.14)(chai@4.5.0)(typescript@5.5.3) ethers: 5.7.2 tronweb: 5.3.3 transitivePeerDependencies: + - '@gql.tada/svelte-support' + - '@gql.tada/vue-support' - '@jest/globals' - '@swc/core' - '@swc/wasm' @@ -13006,6 +13322,28 @@ packages: - utf-8-validate dev: false + /@layerzerolabs/tron-utilities@3.0.156(@swc/core@1.4.0)(@types/node@18.18.14)(typescript@5.5.3): + resolution: {integrity: sha512-WbmldyR4ruo1zpmpJzJC7uVu6IuF3oqU/hhJo9yC+AYYzHf2SlAHsSIL/h+EeOLiCyIc+ZSX9/0I6d2Jq+e4Cw==} + dependencies: + '@layerzerolabs/lz-utilities': 3.0.156(@swc/core@1.4.0)(@types/node@18.18.14)(typescript@5.5.3) + ethers: 5.7.2 + tronweb: 5.3.3 + transitivePeerDependencies: + - '@gql.tada/svelte-support' + - '@gql.tada/vue-support' + - '@jest/globals' + - '@swc/core' + - '@swc/wasm' + - '@types/node' + - bufferutil + - chai + - debug + - encoding + - supports-color + - typescript + - utf-8-validate + dev: true + /@layerzerolabs/ua-devtools@3.0.6(@layerzerolabs/devtools@0.4.10)(@layerzerolabs/io-devtools@0.1.17)(@layerzerolabs/lz-definitions@3.0.86)(@layerzerolabs/lz-v2-utilities@3.0.86)(@layerzerolabs/protocol-devtools@1.1.7)(zod@3.22.4): resolution: {integrity: sha512-hZbhNB7iIrKrrkOvDMF74niBCBj5icHmmlYbCSV3S6BKeLuKnX5i6zvlMTq/v5kgU0CZ0kNS37PFHfhSkW+oMw==} peerDependencies: @@ -13208,7 +13546,7 @@ packages: '@metaplex-foundation/beet': 0.7.2 '@solana/web3.js': 1.98.0 bs58: 5.0.0 - debug: 4.3.7 + debug: 4.4.0(supports-color@8.1.1) transitivePeerDependencies: - bufferutil - encoding @@ -13231,7 +13569,7 @@ packages: ansicolors: 0.3.2 assert: 2.1.0 bn.js: 5.2.1 - debug: 4.3.7 + debug: 4.4.0(supports-color@8.1.1) transitivePeerDependencies: - supports-color @@ -13468,12 +13806,6 @@ packages: '@noble/hashes': 1.6.0 dev: true - /@noble/curves@1.8.1: - resolution: {integrity: sha512-warwspo+UYUPep0Q+vtdVB4Ugn8GGQj8iyB3gnRWsztmUHTI3S1nhdiWNsPUGL0vud7JlRRk1XEu7Lq1KGTnMQ==} - engines: {node: ^14.21.3 || >=16} - dependencies: - '@noble/hashes': 1.7.1 - /@noble/curves@1.9.4: resolution: {integrity: sha512-2bKONnuM53lINoDrSmK8qP8W271ms7pygDhZt4SiLOoLwBtoHqeCFi6RG42V8zd3mLHuJFhU/Bmaqo4nX0/kBw==} engines: {node: ^14.21.3 || >=16} @@ -13514,6 +13846,7 @@ packages: /@noble/hashes@1.7.1: resolution: {integrity: sha512-B8XBPsn4vT/KJAGqDzbwztd+6Yte3P4V7iafm24bxgDe/mlRuK6xmWPuCNrKt2vDafZ8MfJLlchDG/vYafQEjQ==} engines: {node: ^14.21.3 || >=16} + dev: false /@noble/hashes@1.8.0: resolution: {integrity: sha512-jCs9ldd7NwzpgXDIf6P3+NrHh9/sD6CQdxHyjQI+h/6rDNo88ypBxxz45UDuZHz9r3tNz7N/VInSVoVdtXEI4A==} @@ -14495,14 +14828,6 @@ packages: '@noble/hashes': 1.3.3 '@scure/base': 1.1.5 - /@scure/bip32@1.6.2: - resolution: {integrity: sha512-t96EPDMbtGgtb7onKKqxRLfE5g05k7uHnHRM2xdE6BP/ZmxaLtPek4J4KfVn/90IQNrU1IOAqMgiDtUdtbe3nw==} - dependencies: - '@noble/curves': 1.8.1 - '@noble/hashes': 1.7.1 - '@scure/base': 1.2.4 - dev: true - /@scure/bip32@1.7.0: resolution: {integrity: sha512-E4FFX/N3f4B80AKWp5dP6ow+flD1LQZo/w8UnLGYZO674jS6YnYeepycOOksv+vLPSpgN35wgKgy+ybfTb2SMw==} dependencies: @@ -14528,13 +14853,6 @@ packages: '@noble/hashes': 1.3.3 '@scure/base': 1.1.5 - /@scure/bip39@1.5.4: - resolution: {integrity: sha512-TFM4ni0vKvCfBpohoh+/lY05i9gRbSwXWngAsF4CABQxoaOHijxuaZ2R6cStDQ5CHtHO9aGJTr4ksVJASRRyMA==} - dependencies: - '@noble/hashes': 1.7.1 - '@scure/base': 1.2.4 - dev: true - /@scure/bip39@1.6.0: resolution: {integrity: sha512-+lF0BbLiJNwVlev4eKelw1WWLaiKXw7sSl8T6FvBlWkdX+94aGJ4o8XjUdlyhTCjd8c+B3KT3JfS8P0bLRNU6A==} dependencies: @@ -15204,6 +15522,10 @@ packages: resolution: {integrity: sha512-vWOc0FVSn+RmabozIEWcEny1I73nDGTvOrLYJsR1x7LGA3AZmqt4i/aW69o/3i2NN5CVP8Ok6G1ayRQJKye3Wg==} dev: true + /@suchipi/femver@1.0.0: + resolution: {integrity: sha512-bprE8+K5V+DPX7q2e2K57ImqNBdfGHDIWaGI5xHxZoxbKOuQZn4wzPiUxOAHnsUr3w3xHrWXwN7gnG/iIuEMIg==} + dev: true + /@swc/core-darwin-arm64@1.4.0: resolution: {integrity: sha512-UTJ/Vz+s7Pagef6HmufWt6Rs0aUu+EJF4Pzuwvr7JQQ5b1DZeAAUeUtkUTFx/PvCbM8Xfw4XdKBUZfrIKCfW8A==} engines: {node: '>=10'} @@ -15985,16 +16307,10 @@ packages: /@types/yargs-parser@21.0.3: resolution: {integrity: sha512-I4q9QU9MQv4oEOz4tAHJtNz1cwuLxn2F3xcc2iV5WdqLPpUnj30aUuxt1mAxYTG+oe8CZMV/+6rU4S4gRDzqtQ==} - /@types/yargs@17.0.32: - resolution: {integrity: sha512-xQ67Yc/laOG5uMfX/093MRlGGCIBzZMarVa+gfNKJxWAIgykYpVGkBdbqEzGDDfCrVUj6Hiff4mTZ5BA6TmAog==} - dependencies: - '@types/yargs-parser': 21.0.3 - /@types/yargs@17.0.35: resolution: {integrity: sha512-qUHkeCyQFxMXg79wQfTtfndEC+N9ZZg76HJftDJp+qH2tV7Gj4OJi7l+PiWwJ+pWtW8GwSmqsDj/oymhrTWXjg==} dependencies: '@types/yargs-parser': 21.0.3 - dev: true /@types/yoga-layout@1.9.2: resolution: {integrity: sha512-S9q47ByT2pPvD65IvrWp7qppVMpk9WGMbVq9wbWZOHg6tnXSD4vyhao6nOSBwwfDdV2p3Kx9evA9vI+XWTfDvw==} @@ -16993,17 +17309,17 @@ packages: transitivePeerDependencies: - debug - /babel-jest@29.7.0(@babel/core@7.23.9): + /babel-jest@29.7.0(@babel/core@7.28.5): resolution: {integrity: sha512-BrvGY3xZSwEcCzKvKsCi2GgHqDqsYkOP4/by5xCgIwGXQxIEh+8ew3gmrE1y7XRR6LHZIj6yLYnUi/mm2KXKBg==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} peerDependencies: '@babel/core': ^7.8.0 dependencies: - '@babel/core': 7.23.9 + '@babel/core': 7.28.5 '@jest/transform': 29.7.0 '@types/babel__core': 7.20.5 babel-plugin-istanbul: 6.1.1 - babel-preset-jest: 29.6.3(@babel/core@7.23.9) + babel-preset-jest: 29.6.3(@babel/core@7.28.5) chalk: 4.1.2 graceful-fs: 4.2.11 slash: 3.0.0 @@ -17088,6 +17404,25 @@ packages: '@babel/plugin-syntax-optional-chaining': 7.8.3(@babel/core@7.23.9) '@babel/plugin-syntax-top-level-await': 7.14.5(@babel/core@7.23.9) + /babel-preset-current-node-syntax@1.0.1(@babel/core@7.28.5): + resolution: {integrity: sha512-M7LQ0bxarkxQoN+vz5aJPsLBn77n8QgTFmo8WK0/44auK2xlCXrYcUxHFxgU7qW5Yzw/CjmLRK2uJzaCd7LvqQ==} + peerDependencies: + '@babel/core': ^7.0.0 + dependencies: + '@babel/core': 7.28.5 + '@babel/plugin-syntax-async-generators': 7.8.4(@babel/core@7.28.5) + '@babel/plugin-syntax-bigint': 7.8.3(@babel/core@7.28.5) + '@babel/plugin-syntax-class-properties': 7.12.13(@babel/core@7.28.5) + '@babel/plugin-syntax-import-meta': 7.10.4(@babel/core@7.28.5) + '@babel/plugin-syntax-json-strings': 7.8.3(@babel/core@7.28.5) + '@babel/plugin-syntax-logical-assignment-operators': 7.10.4(@babel/core@7.28.5) + '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3(@babel/core@7.28.5) + '@babel/plugin-syntax-numeric-separator': 7.10.4(@babel/core@7.28.5) + '@babel/plugin-syntax-object-rest-spread': 7.8.3(@babel/core@7.28.5) + '@babel/plugin-syntax-optional-catch-binding': 7.8.3(@babel/core@7.28.5) + '@babel/plugin-syntax-optional-chaining': 7.8.3(@babel/core@7.28.5) + '@babel/plugin-syntax-top-level-await': 7.14.5(@babel/core@7.28.5) + /babel-preset-current-node-syntax@1.2.0(@babel/core@7.28.5): resolution: {integrity: sha512-E/VlAEzRrsLEb2+dv8yp3bo4scof3l9nR4lrld+Iy5NyVqgVYUJnDAmunkhPMisRI32Qc4iRiz425d8vM++2fg==} peerDependencies: @@ -17111,15 +17446,15 @@ packages: '@babel/plugin-syntax-top-level-await': 7.14.5(@babel/core@7.28.5) dev: true - /babel-preset-jest@29.6.3(@babel/core@7.23.9): + /babel-preset-jest@29.6.3(@babel/core@7.28.5): resolution: {integrity: sha512-0B3bhxR6snWXJZtR/RliHTDPRgn1sNHOR0yVtq/IiQFyuOVjFS+wuio/R4gSNkyYmKmJB4wGZv2NZanmKmTnNA==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} peerDependencies: '@babel/core': ^7.0.0 dependencies: - '@babel/core': 7.23.9 + '@babel/core': 7.28.5 babel-plugin-jest-hoist: 29.6.3 - babel-preset-current-node-syntax: 1.0.1(@babel/core@7.23.9) + babel-preset-current-node-syntax: 1.0.1(@babel/core@7.28.5) /babel-preset-jest@30.2.0(@babel/core@7.28.5): resolution: {integrity: sha512-US4Z3NOieAQumwFnYdUWKvUKh8+YSnS/gB3t6YBiz0bskpu7Pine8pPCheNxlPEW4wnUkma2a94YuW2q3guvCQ==} @@ -17156,7 +17491,6 @@ packages: /baseline-browser-mapping@2.8.30: resolution: {integrity: sha512-aTUKW4ptQhS64+v2d6IkPzymEzzhw+G0bA1g3uBRV3+ntkH+svttKseW5IOR4Ed6NUVKqnY7qT3dKvzQ7io4AA==} hasBin: true - dev: true /bcrypt-pbkdf@1.0.2: resolution: {integrity: sha512-qeFIXtP4MSoi6NLqO12WfqARWWuCKi2Rn/9hJLEmtB5yTNr9DqFWkJRCf2qShWzPeAMRnOgCrq0sg/KLv5ES9w==} @@ -17199,7 +17533,7 @@ packages: resolution: {integrity: sha512-5hVFGrdCnF8GB1Lj2eEo4PRE7+jp+3xBLnfNjydivOkMvKmUKeJ9GG8uOy8prmWl3Oh154uzgfudR1FRkNBudA==} engines: {node: '>=18.0.0'} dependencies: - '@noble/hashes': 1.7.1 + '@noble/hashes': 1.8.0 '@scure/base': 1.2.4 uint8array-tools: 0.0.8 valibot: 0.37.0(typescript@5.5.3) @@ -17389,7 +17723,6 @@ packages: electron-to-chromium: 1.5.259 node-releases: 2.0.27 update-browserslist-db: 1.1.4(browserslist@4.28.0) - dev: true /bs-logger@0.2.6: resolution: {integrity: sha512-pd8DCoxmbgc7hyPKOvxtqNcjYoOsABPQdcCUjGp3d42VR2CX1ORhk2A87oqqu5R1kk+76nsxZupkmyd+MVtCog==} @@ -17423,7 +17756,7 @@ packages: /bs58check@4.0.0: resolution: {integrity: sha512-FsGDOnFg9aVI9erdriULkd/JjEWONV/lQE5aYziB5PoBsXRind56lh8doIZIc9X4HoxT5x4bLjMWN1/NB8Zp5g==} dependencies: - '@noble/hashes': 1.7.1 + '@noble/hashes': 1.8.0 bs58: 6.0.0 /bser@2.1.1: @@ -17664,7 +17997,6 @@ packages: /caniuse-lite@1.0.30001756: resolution: {integrity: sha512-4HnCNKbMLkLdhJz3TToeVWHSnfJvPaq6vu/eRP0Ahub/07n484XHhBF5AJoSGHdVrS8tKFauUQz8Bp9P7LVx7A==} - dev: true /capital-case@1.0.4: resolution: {integrity: sha512-ds37W8CytHgwnhGGTi88pcPyR15qoNkOpYwmMMfnWqqWgESapLqvDx6huFjQ5vqWSn2Z06173XNA7LtMOeUh1A==} @@ -17791,7 +18123,7 @@ packages: engines: {node: '>= 8.10.0'} dependencies: anymatch: 3.1.3 - braces: 3.0.2 + braces: 3.0.3 glob-parent: 5.1.2 is-binary-path: 2.1.0 is-glob: 4.0.3 @@ -18774,7 +19106,6 @@ packages: /electron-to-chromium@1.5.259: resolution: {integrity: sha512-I+oLXgpEJzD6Cwuwt1gYjxsDmu/S/Kd41mmLA3O+/uH2pFRO/DvOjUyGozL8j3KeLV6WyZ7ssPwELMsXCcsJAQ==} - dev: true /elliptic@6.5.4: resolution: {integrity: sha512-iLhC6ULemrljPZb+QutR5TQGB+pdW6KGD5RSegS+8sorOZT+rdQFbsQFJgvN3eRqNALqJer4oQ16YvJHlU8hzQ==} @@ -19116,7 +19447,6 @@ packages: /escalade@3.2.0: resolution: {integrity: sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==} engines: {node: '>=6'} - dev: true /escape-html@1.0.3: resolution: {integrity: sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==} @@ -21439,7 +21769,6 @@ packages: dependencies: pkg-dir: 4.2.0 resolve-cwd: 3.0.0 - dev: true /imul@1.0.1: resolution: {integrity: sha512-WFAgfwPLAjU66EKt6vRdTlKj4nAgIDQzh29JonLa4Bqtl6D8JrIMvWjCnx7xEjVNmP3U0fM5o8ZObk7d0f62bA==} @@ -22357,11 +22686,11 @@ packages: ts-node: optional: true dependencies: - '@babel/core': 7.23.9 + '@babel/core': 7.28.5 '@jest/test-sequencer': 29.7.0 '@jest/types': 29.6.3 '@types/node': 18.18.14 - babel-jest: 29.7.0(@babel/core@7.23.9) + babel-jest: 29.7.0(@babel/core@7.28.5) chalk: 4.1.2 ci-info: 3.9.0 deepmerge: 4.3.1 @@ -22397,11 +22726,11 @@ packages: ts-node: optional: true dependencies: - '@babel/core': 7.23.9 + '@babel/core': 7.28.5 '@jest/test-sequencer': 29.7.0 '@jest/types': 29.6.3 '@types/node': 22.15.3 - babel-jest: 29.7.0(@babel/core@7.23.9) + babel-jest: 29.7.0(@babel/core@7.28.5) chalk: 4.1.2 ci-info: 3.9.0 deepmerge: 4.3.1 @@ -23028,27 +23357,6 @@ packages: supports-color: 8.1.1 dev: true - /jest@29.7.0(@types/node@18.18.14): - resolution: {integrity: sha512-NIy3oAFp9shda19hy4HK0HRTWKtPJmGdnvywu01nOqNC2vZg+Z+fvJDxpMQA88eb2I9EcafcdjYgsDthnYTvGw==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - hasBin: true - peerDependencies: - node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 - peerDependenciesMeta: - node-notifier: - optional: true - dependencies: - '@jest/core': 29.7.0(ts-node@10.9.2) - '@jest/types': 29.6.3 - import-local: 3.2.0 - jest-cli: 29.7.0(@types/node@18.18.14)(ts-node@10.9.2) - transitivePeerDependencies: - - '@types/node' - - babel-plugin-macros - - supports-color - - ts-node - dev: true - /jest@29.7.0(@types/node@18.18.14)(ts-node@10.9.2): resolution: {integrity: sha512-NIy3oAFp9shda19hy4HK0HRTWKtPJmGdnvywu01nOqNC2vZg+Z+fvJDxpMQA88eb2I9EcafcdjYgsDthnYTvGw==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} @@ -23061,7 +23369,7 @@ packages: dependencies: '@jest/core': 29.7.0(ts-node@10.9.2) '@jest/types': 29.6.3 - import-local: 3.1.0 + import-local: 3.2.0 jest-cli: 29.7.0(@types/node@18.18.14)(ts-node@10.9.2) transitivePeerDependencies: - '@types/node' @@ -23166,7 +23474,6 @@ packages: resolution: {integrity: sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==} engines: {node: '>=6'} hasBin: true - dev: true /json-bigint@1.0.0: resolution: {integrity: sha512-SiPv/8VpZuWbvLSMtTDU8hEfrZWg/mH/nV/b4o0CYbSxu1UIQPLdwKOCIyLQX+VIPO5vrLX3i8qtqFyhdPSUSQ==} @@ -24230,7 +24537,6 @@ packages: /node-releases@2.0.27: resolution: {integrity: sha512-nmh3lCkYZ3grZvqcCH+fjmQ7X+H0OeZgP40OierEaAptX4XofMh5kwNbWh7lBduUzCcV/8kZ+NDLCwm2iorIlA==} - dev: true /nofilter@3.1.0: resolution: {integrity: sha512-l2NNj07e9afPnhAhvgVrCD/oy2Ai1yfLpuo3EpiO1jFTsB4sFz6oIfAfSZyQzVpkZQ9xS8ZS5g1jCBgq4Hwo0g==} @@ -24765,7 +25071,6 @@ packages: /picocolors@1.1.1: resolution: {integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==} - dev: true /picomatch@2.3.1: resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} @@ -27714,7 +28019,6 @@ packages: browserslist: 4.28.0 escalade: 3.2.0 picocolors: 1.1.1 - dev: true /upper-case-first@2.0.2: resolution: {integrity: sha512-514ppYHBaKwfJRK/pNC6c/OxfGa0obSnAl106u97Ed0I625Nin96KAjttZF6ZL3e1XLtphxnqrOi9iWgm+u+bg==}