From abb0c6d05f420d7f217b5ec6bf94bdd3a34b95e5 Mon Sep 17 00:00:00 2001
From: Krak
Date: Mon, 26 Jan 2026 09:37:41 -0800
Subject: [PATCH 01/10] feat(devtools-sui): add Sui signer and connection
factory
- Add SuiSigner for transaction signing with sender context
- Add createConnectionFactory and createRpcUrlFactory for RPC connections
- Add OmniSDK base class with transaction serialization
- Add Sui chain type to normalizePeer/denormalizePeer in devtools
Key design decisions:
- Transaction.serialize() used instead of build() to defer sender context
- Signer reconstructs transaction and sets sender during signing
- Connection factory reads from RPC_URL_SUI environment variable
---
packages/devtools-sui/.eslintignore | 2 +
packages/devtools-sui/.eslintrc.json | 3 +
packages/devtools-sui/.prettierignore | 2 +
packages/devtools-sui/CHANGELOG.md | 5 ++
packages/devtools-sui/README.md | 9 +++
packages/devtools-sui/package.json | 68 ++++++++++++++++++
packages/devtools-sui/src/common/addresses.ts | 9 +++
packages/devtools-sui/src/common/index.ts | 1 +
.../devtools-sui/src/connection/factory.ts | 17 +++++
packages/devtools-sui/src/connection/index.ts | 2 +
packages/devtools-sui/src/connection/types.ts | 4 ++
packages/devtools-sui/src/index.ts | 4 ++
.../devtools-sui/src/omnigraph/coordinates.ts | 10 +++
packages/devtools-sui/src/omnigraph/index.ts | 3 +
packages/devtools-sui/src/omnigraph/sdk.ts | 29 ++++++++
packages/devtools-sui/src/omnigraph/types.ts | 3 +
.../devtools-sui/src/transactions/index.ts | 2 +
.../devtools-sui/src/transactions/serde.ts | 5 ++
.../devtools-sui/src/transactions/signer.ts | 70 +++++++++++++++++++
packages/devtools-sui/tsconfig.json | 8 +++
packages/devtools-sui/tsup.config.ts | 9 +++
packages/devtools/src/common/bytes.ts | 2 +
22 files changed, 267 insertions(+)
create mode 100644 packages/devtools-sui/.eslintignore
create mode 100644 packages/devtools-sui/.eslintrc.json
create mode 100644 packages/devtools-sui/.prettierignore
create mode 100644 packages/devtools-sui/CHANGELOG.md
create mode 100644 packages/devtools-sui/README.md
create mode 100644 packages/devtools-sui/package.json
create mode 100644 packages/devtools-sui/src/common/addresses.ts
create mode 100644 packages/devtools-sui/src/common/index.ts
create mode 100644 packages/devtools-sui/src/connection/factory.ts
create mode 100644 packages/devtools-sui/src/connection/index.ts
create mode 100644 packages/devtools-sui/src/connection/types.ts
create mode 100644 packages/devtools-sui/src/index.ts
create mode 100644 packages/devtools-sui/src/omnigraph/coordinates.ts
create mode 100644 packages/devtools-sui/src/omnigraph/index.ts
create mode 100644 packages/devtools-sui/src/omnigraph/sdk.ts
create mode 100644 packages/devtools-sui/src/omnigraph/types.ts
create mode 100644 packages/devtools-sui/src/transactions/index.ts
create mode 100644 packages/devtools-sui/src/transactions/serde.ts
create mode 100644 packages/devtools-sui/src/transactions/signer.ts
create mode 100644 packages/devtools-sui/tsconfig.json
create mode 100644 packages/devtools-sui/tsup.config.ts
diff --git a/packages/devtools-sui/.eslintignore b/packages/devtools-sui/.eslintignore
new file mode 100644
index 0000000000..de4d1f007d
--- /dev/null
+++ b/packages/devtools-sui/.eslintignore
@@ -0,0 +1,2 @@
+dist
+node_modules
diff --git a/packages/devtools-sui/.eslintrc.json b/packages/devtools-sui/.eslintrc.json
new file mode 100644
index 0000000000..be97c53fbb
--- /dev/null
+++ b/packages/devtools-sui/.eslintrc.json
@@ -0,0 +1,3 @@
+{
+ "extends": "../../.eslintrc.json"
+}
diff --git a/packages/devtools-sui/.prettierignore b/packages/devtools-sui/.prettierignore
new file mode 100644
index 0000000000..1eae0cf670
--- /dev/null
+++ b/packages/devtools-sui/.prettierignore
@@ -0,0 +1,2 @@
+dist/
+node_modules/
diff --git a/packages/devtools-sui/CHANGELOG.md b/packages/devtools-sui/CHANGELOG.md
new file mode 100644
index 0000000000..ac0798a1f1
--- /dev/null
+++ b/packages/devtools-sui/CHANGELOG.md
@@ -0,0 +1,5 @@
+# @layerzerolabs/devtools-sui
+
+## 0.1.0
+
+- Initial release.
diff --git a/packages/devtools-sui/README.md b/packages/devtools-sui/README.md
new file mode 100644
index 0000000000..ee7f79e6ed
--- /dev/null
+++ b/packages/devtools-sui/README.md
@@ -0,0 +1,9 @@
+
+
+
+
+
+
+@layerzerolabs/devtools-sui
+
+Utilities for working with LayerZero Sui contracts.
diff --git a/packages/devtools-sui/package.json b/packages/devtools-sui/package.json
new file mode 100644
index 0000000000..b71a9b4e49
--- /dev/null
+++ b/packages/devtools-sui/package.json
@@ -0,0 +1,68 @@
+{
+ "name": "@layerzerolabs/devtools-sui",
+ "version": "0.1.0",
+ "description": "Developer utilities for working with LayerZero Sui contracts",
+ "repository": {
+ "type": "git",
+ "url": "git+https://github.com/LayerZero-Labs/devtools.git",
+ "directory": "packages/devtools-sui"
+ },
+ "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": {
+ "@layerzerolabs/devtools": "~2.0.4",
+ "@layerzerolabs/io-devtools": "~0.3.2",
+ "@layerzerolabs/lz-definitions": "^3.0.148",
+ "@layerzerolabs/lz-sui-oft-sdk-v2": "^3.0.156",
+ "@layerzerolabs/lz-sui-sdk-v2": "^3.0.156",
+ "@mysten/bcs": "^1.9.2",
+ "@mysten/sui": "^1.45.2",
+ "@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": {
+ "@layerzerolabs/devtools": "~2.0.4",
+ "@layerzerolabs/io-devtools": "~0.3.2",
+ "@layerzerolabs/lz-definitions": "^3.0.148",
+ "@mysten/bcs": "^1.9.2",
+ "@mysten/sui": "^1.45.2"
+ },
+ "publishConfig": {
+ "access": "public"
+ }
+}
diff --git a/packages/devtools-sui/src/common/addresses.ts b/packages/devtools-sui/src/common/addresses.ts
new file mode 100644
index 0000000000..32a5bf72b4
--- /dev/null
+++ b/packages/devtools-sui/src/common/addresses.ts
@@ -0,0 +1,9 @@
+const SUI_HEX_REGEX = /^0x[0-9a-fA-F]{1,64}$/
+
+export const isSuiAddress = (value: string): boolean => SUI_HEX_REGEX.test(value)
+
+export const assertSuiAddress = (value: string, label = 'address'): void => {
+ if (!isSuiAddress(value)) {
+ throw new Error(`Invalid Sui ${label}: ${value}`)
+ }
+}
diff --git a/packages/devtools-sui/src/common/index.ts b/packages/devtools-sui/src/common/index.ts
new file mode 100644
index 0000000000..897b610db2
--- /dev/null
+++ b/packages/devtools-sui/src/common/index.ts
@@ -0,0 +1 @@
+export * from './addresses'
diff --git a/packages/devtools-sui/src/connection/factory.ts b/packages/devtools-sui/src/connection/factory.ts
new file mode 100644
index 0000000000..070aaa0bea
--- /dev/null
+++ b/packages/devtools-sui/src/connection/factory.ts
@@ -0,0 +1,17 @@
+import pMemoize from 'p-memoize'
+import { type RpcUrlFactory } from '@layerzerolabs/devtools'
+import type { EndpointId } from '@layerzerolabs/lz-definitions'
+import { SuiClient } from '@mysten/sui/client'
+import type { ConnectionFactory } from './types'
+
+export const defaultRpcUrlFactory: RpcUrlFactory = (eid) => {
+ throw new Error(`No default Sui RPC URL configured for eid ${eid}. Provide an override via createRpcUrlFactory().`)
+}
+
+export const createRpcUrlFactory =
+ (overrides: Partial> = {}): RpcUrlFactory =>
+ (eid) =>
+ overrides[eid] ?? process.env.RPC_URL_SUI ?? process.env.RPC_URL_SUI_TESTNET ?? defaultRpcUrlFactory(eid)
+
+export const createConnectionFactory = (urlFactory: RpcUrlFactory = defaultRpcUrlFactory): ConnectionFactory =>
+ pMemoize(async (eid) => new SuiClient({ url: await urlFactory(eid) }))
diff --git a/packages/devtools-sui/src/connection/index.ts b/packages/devtools-sui/src/connection/index.ts
new file mode 100644
index 0000000000..97a7b59914
--- /dev/null
+++ b/packages/devtools-sui/src/connection/index.ts
@@ -0,0 +1,2 @@
+export * from './factory'
+export * from './types'
diff --git a/packages/devtools-sui/src/connection/types.ts b/packages/devtools-sui/src/connection/types.ts
new file mode 100644
index 0000000000..fabebbfe3b
--- /dev/null
+++ b/packages/devtools-sui/src/connection/types.ts
@@ -0,0 +1,4 @@
+import type { SuiClient } from '@mysten/sui/client'
+import type { EndpointId } from '@layerzerolabs/lz-definitions'
+
+export type ConnectionFactory = (eid: EndpointId) => Promise
diff --git a/packages/devtools-sui/src/index.ts b/packages/devtools-sui/src/index.ts
new file mode 100644
index 0000000000..ded5780815
--- /dev/null
+++ b/packages/devtools-sui/src/index.ts
@@ -0,0 +1,4 @@
+export * from './common'
+export * from './connection'
+export * from './omnigraph'
+export * from './transactions'
diff --git a/packages/devtools-sui/src/omnigraph/coordinates.ts b/packages/devtools-sui/src/omnigraph/coordinates.ts
new file mode 100644
index 0000000000..cb72ea241c
--- /dev/null
+++ b/packages/devtools-sui/src/omnigraph/coordinates.ts
@@ -0,0 +1,10 @@
+import type { OmniPoint } from '@layerzerolabs/devtools'
+import { ChainType, endpointIdToChainType, type EndpointId } from '@layerzerolabs/lz-definitions'
+import { assertSuiAddress } from '../common'
+
+export const createSuiPoint = (eid: EndpointId, address: string): OmniPoint => {
+ assertSuiAddress(address)
+ return { eid, address }
+}
+
+export const isOmniPointOnSui = ({ eid }: OmniPoint): boolean => endpointIdToChainType(eid) === ChainType.SUI
diff --git a/packages/devtools-sui/src/omnigraph/index.ts b/packages/devtools-sui/src/omnigraph/index.ts
new file mode 100644
index 0000000000..02b48ea20f
--- /dev/null
+++ b/packages/devtools-sui/src/omnigraph/index.ts
@@ -0,0 +1,3 @@
+export * from './coordinates'
+export * from './sdk'
+export * from './types'
diff --git a/packages/devtools-sui/src/omnigraph/sdk.ts b/packages/devtools-sui/src/omnigraph/sdk.ts
new file mode 100644
index 0000000000..0ef6e9b82f
--- /dev/null
+++ b/packages/devtools-sui/src/omnigraph/sdk.ts
@@ -0,0 +1,29 @@
+import { SuiClient } from '@mysten/sui/client'
+import { Transaction } from '@mysten/sui/transactions'
+import { formatOmniPoint, OmniPoint, OmniTransaction } from '@layerzerolabs/devtools'
+import { createModuleLogger, type Logger } from '@layerzerolabs/io-devtools'
+import type { IOmniSDK } from './types'
+
+export class OmniSDK implements IOmniSDK {
+ constructor(
+ public readonly client: SuiClient,
+ public readonly point: OmniPoint,
+ protected readonly logger: Logger = createModuleLogger(`Sui SDK @ ${formatOmniPoint(point)}`)
+ ) {}
+
+ get label(): string {
+ return `Sui package @ ${formatOmniPoint(this.point)}`
+ }
+
+ protected async createTransaction(transaction: Transaction): Promise {
+ // Serialize the transaction using its JSON representation
+ // This preserves all transaction data without requiring a sender at build time
+ // The sender will be set during signing
+ const serialized = transaction.serialize()
+
+ return {
+ point: this.point,
+ data: serialized,
+ }
+ }
+}
diff --git a/packages/devtools-sui/src/omnigraph/types.ts b/packages/devtools-sui/src/omnigraph/types.ts
new file mode 100644
index 0000000000..4f75ffaa06
--- /dev/null
+++ b/packages/devtools-sui/src/omnigraph/types.ts
@@ -0,0 +1,3 @@
+import type { IOmniSDK as IOmniSDKAbstract } from '@layerzerolabs/devtools'
+
+export interface IOmniSDK extends IOmniSDKAbstract {}
diff --git a/packages/devtools-sui/src/transactions/index.ts b/packages/devtools-sui/src/transactions/index.ts
new file mode 100644
index 0000000000..18aee9d5ff
--- /dev/null
+++ b/packages/devtools-sui/src/transactions/index.ts
@@ -0,0 +1,2 @@
+export * from './serde'
+export * from './signer'
diff --git a/packages/devtools-sui/src/transactions/serde.ts b/packages/devtools-sui/src/transactions/serde.ts
new file mode 100644
index 0000000000..d42b0f6658
--- /dev/null
+++ b/packages/devtools-sui/src/transactions/serde.ts
@@ -0,0 +1,5 @@
+import { fromBase64, toBase64 } from '@mysten/bcs'
+
+export const serializeTransactionBytes = (bytes: Uint8Array): string => toBase64(bytes)
+
+export const deserializeTransactionBytes = (data: string): Uint8Array => fromBase64(data)
diff --git a/packages/devtools-sui/src/transactions/signer.ts b/packages/devtools-sui/src/transactions/signer.ts
new file mode 100644
index 0000000000..ec084360ad
--- /dev/null
+++ b/packages/devtools-sui/src/transactions/signer.ts
@@ -0,0 +1,70 @@
+import { Transaction } from '@mysten/sui/transactions'
+import { type Signer } from '@mysten/sui/cryptography'
+import type { SuiClient } from '@mysten/sui/client'
+import {
+ OmniSigner,
+ OmniSignerBase,
+ type OmniSignerFactory,
+ type OmniTransaction,
+ type OmniTransactionReceipt,
+ type OmniTransactionResponse,
+ OmniPoint,
+} from '@layerzerolabs/devtools'
+import type { EndpointId } from '@layerzerolabs/lz-definitions'
+import type { ConnectionFactory } from '../connection'
+import { createModuleLogger, type Logger } from '@layerzerolabs/io-devtools'
+
+export class OmniSignerSui extends OmniSignerBase implements OmniSigner {
+ constructor(
+ eid: EndpointId,
+ public readonly client: SuiClient,
+ public readonly signer: Signer,
+ protected readonly logger: Logger = createModuleLogger('OmniSignerSui')
+ ) {
+ super(eid)
+ }
+
+ getPoint(): OmniPoint {
+ return { eid: this.eid, address: this.signer.toSuiAddress() }
+ }
+
+ async sign(transaction: OmniTransaction): Promise {
+ this.assertTransaction(transaction)
+
+ const suiTransaction = Transaction.from(transaction.data)
+ suiTransaction.setSender(this.signer.toSuiAddress())
+ const bytes = await suiTransaction.build({ client: this.client })
+ const signature = await this.signer.signTransaction(bytes)
+
+ return signature.signature
+ }
+
+ async signAndSend(transaction: OmniTransaction): Promise> {
+ this.assertTransaction(transaction)
+
+ const suiTransaction = Transaction.from(transaction.data)
+ suiTransaction.setSender(this.signer.toSuiAddress())
+ const response = await this.signer.signAndExecuteTransaction({
+ transaction: suiTransaction,
+ client: this.client,
+ })
+
+ const digest = response.digest
+
+ return {
+ transactionHash: digest,
+ wait: async () => {
+ await this.client.waitForTransaction({ digest })
+ return { transactionHash: digest }
+ },
+ }
+ }
+}
+
+export const createSuiSignerFactory =
+ (
+ signer: Signer,
+ connectionFactory: ConnectionFactory
+ ): OmniSignerFactory>> =>
+ async (eid: EndpointId) =>
+ new OmniSignerSui(eid, await connectionFactory(eid), signer)
diff --git a/packages/devtools-sui/tsconfig.json b/packages/devtools-sui/tsconfig.json
new file mode 100644
index 0000000000..75eba9f992
--- /dev/null
+++ b/packages/devtools-sui/tsconfig.json
@@ -0,0 +1,8 @@
+{
+ "extends": "../../tsconfig.json",
+ "compilerOptions": {
+ "rootDir": "src",
+ "outDir": "dist"
+ },
+ "include": ["src"]
+}
diff --git a/packages/devtools-sui/tsup.config.ts b/packages/devtools-sui/tsup.config.ts
new file mode 100644
index 0000000000..cbe50c7c92
--- /dev/null
+++ b/packages/devtools-sui/tsup.config.ts
@@ -0,0 +1,9 @@
+import { defineConfig } from 'tsup'
+
+export default defineConfig({
+ entry: ['src/index.ts'],
+ format: ['cjs', 'esm'],
+ dts: true,
+ sourcemap: true,
+ clean: true,
+})
diff --git a/packages/devtools/src/common/bytes.ts b/packages/devtools/src/common/bytes.ts
index 97f80d742f..7711849ed5 100644
--- a/packages/devtools/src/common/bytes.ts
+++ b/packages/devtools/src/common/bytes.ts
@@ -100,6 +100,7 @@ export const normalizePeer = (address: OmniAddress | null | undefined, eid: Endp
return bs58.decode(address)
case ChainType.APTOS:
+ case ChainType.SUI:
case ChainType.EVM:
return toBytes32(fromHex(address))
@@ -130,6 +131,7 @@ export const denormalizePeer = (bytes: Uint8Array | null | undefined, eid: Endpo
return bs58.encode(toBytes32(bytes))
case ChainType.APTOS:
+ case ChainType.SUI:
return toHex(toBytes32(bytes))
case ChainType.EVM:
From fc1868f6045354b08ed690fb386534769a7072b8 Mon Sep 17 00:00:00 2001
From: Krak
Date: Mon, 26 Jan 2026 09:37:52 -0800
Subject: [PATCH 02/10] feat(protocol-devtools-sui): add EndpointV2 SDK for Sui
- Add EndpointV2 SDK implementing IEndpointV2 interface
- Add Uln302 SDK for ULN configuration management
- Fix setConfig to call populateSetConfigTransaction (Move result consumption)
- Add graceful handling of missing configurations
Key fixes for lz:oapp:wire:
- setConfigMoveCall returns Call that must be consumed
- populateSetConfigTransaction() adds necessary follow-up move call
- Missing config queries return defaults instead of throwing
---
packages/protocol-devtools-sui/.eslintignore | 2 +
packages/protocol-devtools-sui/.eslintrc.json | 3 +
.../protocol-devtools-sui/.prettierignore | 2 +
packages/protocol-devtools-sui/CHANGELOG.md | 5 +
packages/protocol-devtools-sui/README.md | 19 +
packages/protocol-devtools-sui/bin/test | 7 +
packages/protocol-devtools-sui/jest.config.js | 14 +
packages/protocol-devtools-sui/jest.setup.js | 4 +
packages/protocol-devtools-sui/package.json | 79 ++++
.../protocol-devtools-sui/src/addresses.ts | 16 +
.../src/endpointv2/index.ts | 1 +
.../src/endpointv2/sdk.ts | 383 ++++++++++++++++++
packages/protocol-devtools-sui/src/index.ts | 3 +
.../protocol-devtools-sui/src/uln302/index.ts | 1 +
.../protocol-devtools-sui/src/uln302/sdk.ts | 193 +++++++++
packages/protocol-devtools-sui/tsconfig.json | 13 +
packages/protocol-devtools-sui/tsup.config.ts | 14 +
17 files changed, 759 insertions(+)
create mode 100644 packages/protocol-devtools-sui/.eslintignore
create mode 100644 packages/protocol-devtools-sui/.eslintrc.json
create mode 100644 packages/protocol-devtools-sui/.prettierignore
create mode 100644 packages/protocol-devtools-sui/CHANGELOG.md
create mode 100644 packages/protocol-devtools-sui/README.md
create mode 100755 packages/protocol-devtools-sui/bin/test
create mode 100644 packages/protocol-devtools-sui/jest.config.js
create mode 100644 packages/protocol-devtools-sui/jest.setup.js
create mode 100644 packages/protocol-devtools-sui/package.json
create mode 100644 packages/protocol-devtools-sui/src/addresses.ts
create mode 100644 packages/protocol-devtools-sui/src/endpointv2/index.ts
create mode 100644 packages/protocol-devtools-sui/src/endpointv2/sdk.ts
create mode 100644 packages/protocol-devtools-sui/src/index.ts
create mode 100644 packages/protocol-devtools-sui/src/uln302/index.ts
create mode 100644 packages/protocol-devtools-sui/src/uln302/sdk.ts
create mode 100644 packages/protocol-devtools-sui/tsconfig.json
create mode 100644 packages/protocol-devtools-sui/tsup.config.ts
diff --git a/packages/protocol-devtools-sui/.eslintignore b/packages/protocol-devtools-sui/.eslintignore
new file mode 100644
index 0000000000..de4d1f007d
--- /dev/null
+++ b/packages/protocol-devtools-sui/.eslintignore
@@ -0,0 +1,2 @@
+dist
+node_modules
diff --git a/packages/protocol-devtools-sui/.eslintrc.json b/packages/protocol-devtools-sui/.eslintrc.json
new file mode 100644
index 0000000000..be97c53fbb
--- /dev/null
+++ b/packages/protocol-devtools-sui/.eslintrc.json
@@ -0,0 +1,3 @@
+{
+ "extends": "../../.eslintrc.json"
+}
diff --git a/packages/protocol-devtools-sui/.prettierignore b/packages/protocol-devtools-sui/.prettierignore
new file mode 100644
index 0000000000..1eae0cf670
--- /dev/null
+++ b/packages/protocol-devtools-sui/.prettierignore
@@ -0,0 +1,2 @@
+dist/
+node_modules/
diff --git a/packages/protocol-devtools-sui/CHANGELOG.md b/packages/protocol-devtools-sui/CHANGELOG.md
new file mode 100644
index 0000000000..dbbf0d5cfa
--- /dev/null
+++ b/packages/protocol-devtools-sui/CHANGELOG.md
@@ -0,0 +1,5 @@
+# @layerzerolabs/protocol-devtools-sui
+
+## 0.1.0
+
+- Initial release.
diff --git a/packages/protocol-devtools-sui/README.md b/packages/protocol-devtools-sui/README.md
new file mode 100644
index 0000000000..f533d06957
--- /dev/null
+++ b/packages/protocol-devtools-sui/README.md
@@ -0,0 +1,19 @@
+
+
+
+
+
+
+@layerzerolabs/protocol-devtools-sui
+
+
+
+
+
+
+
+
+
+
+
+Utilities for working with LayerZero Sui protocol packages.
diff --git a/packages/protocol-devtools-sui/bin/test b/packages/protocol-devtools-sui/bin/test
new file mode 100755
index 0000000000..2f9caec4e7
--- /dev/null
+++ b/packages/protocol-devtools-sui/bin/test
@@ -0,0 +1,7 @@
+#!/usr/bin/env bash
+
+if [ -z "${LZ_DEVTOOLS_ENABLE_SUI_TESTS}" ]; then
+ echo 'Sui tests can be enabled by setting LZ_DEVTOOLS_ENABLE_SUI_TESTS environment variable to a non-empty value'
+else
+ jest --ci "$@"
+fi
diff --git a/packages/protocol-devtools-sui/jest.config.js b/packages/protocol-devtools-sui/jest.config.js
new file mode 100644
index 0000000000..04c8477342
--- /dev/null
+++ b/packages/protocol-devtools-sui/jest.config.js
@@ -0,0 +1,14 @@
+/** @type {import('ts-jest').JestConfigWithTsJest} */
+module.exports = {
+ cache: false,
+ reporters: [['github-actions', { silent: false }], 'default'],
+ testEnvironment: 'node',
+ testTimeout: 60_000,
+ setupFilesAfterEnv: ['/jest.setup.js'],
+ moduleNameMapper: {
+ '^@/(.*)$': '/src/$1',
+ },
+ transform: {
+ '^.+\\.(t|j)sx?$': '@swc/jest',
+ },
+};
diff --git a/packages/protocol-devtools-sui/jest.setup.js b/packages/protocol-devtools-sui/jest.setup.js
new file mode 100644
index 0000000000..956faa4d5c
--- /dev/null
+++ b/packages/protocol-devtools-sui/jest.setup.js
@@ -0,0 +1,4 @@
+import * as jestExtended from 'jest-extended';
+
+// add all jest-extended matchers
+expect.extend(jestExtended);
diff --git a/packages/protocol-devtools-sui/package.json b/packages/protocol-devtools-sui/package.json
new file mode 100644
index 0000000000..abc9f28fc3
--- /dev/null
+++ b/packages/protocol-devtools-sui/package.json
@@ -0,0 +1,79 @@
+{
+ "name": "@layerzerolabs/protocol-devtools-sui",
+ "version": "0.1.0",
+ "description": "Utilities for LayerZero Sui protocol packages",
+ "repository": {
+ "type": "git",
+ "url": "git+https://github.com/LayerZero-Labs/devtools.git",
+ "directory": "packages/protocol-devtools-sui"
+ },
+ "license": "MIT",
+ "sideEffects": false,
+ "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": "$npm_execpath tsc --noEmit",
+ "build": "$npm_execpath tsup",
+ "clean": "rm -rf dist",
+ "dev": "$npm_execpath tsup --watch",
+ "lint": "$npm_execpath eslint '**/*.{js,ts,json}'",
+ "lint:fix": "eslint --fix '**/*.{js,ts,json}'",
+ "test": "./bin/test"
+ },
+ "dependencies": {
+ "p-memoize": "~4.0.4"
+ },
+ "devDependencies": {
+ "@layerzerolabs/devtools": "~2.0.4",
+ "@layerzerolabs/devtools-sui": "~0.1.0",
+ "@layerzerolabs/io-devtools": "~0.3.2",
+ "@layerzerolabs/lz-definitions": "^3.0.148",
+ "@layerzerolabs/lz-sui-sdk-v2": "^3.0.156",
+ "@layerzerolabs/lz-v2-utilities": "^3.0.148",
+ "@layerzerolabs/protocol-devtools": "~3.0.2",
+ "@layerzerolabs/test-devtools": "~0.4.7",
+ "@layerzerolabs/test-devtools-sui": "~0.0.1",
+ "@mysten/sui": "^1.45.2",
+ "@swc/core": "^1.4.0",
+ "@swc/jest": "^0.2.36",
+ "@types/jest": "^29.5.12",
+ "fast-check": "^3.15.1",
+ "jest": "^29.7.0",
+ "jest-extended": "^4.0.2",
+ "ts-node": "^10.9.2",
+ "tslib": "~2.6.2",
+ "tsup": "~8.0.1",
+ "typescript": "^5.4.4",
+ "zod": "^3.22.4"
+ },
+ "peerDependencies": {
+ "@layerzerolabs/devtools": "~2.0.4",
+ "@layerzerolabs/devtools-sui": "~0.1.0",
+ "@layerzerolabs/io-devtools": "~0.3.2",
+ "@layerzerolabs/lz-definitions": "^3.0.148",
+ "@layerzerolabs/lz-sui-sdk-v2": "^3.0.156",
+ "@layerzerolabs/lz-v2-utilities": "^3.0.148",
+ "@layerzerolabs/protocol-devtools": "~3.0.2",
+ "@mysten/sui": "^1.45.2",
+ "zod": "^3.22.4"
+ },
+ "publishConfig": {
+ "access": "public"
+ }
+}
diff --git a/packages/protocol-devtools-sui/src/addresses.ts b/packages/protocol-devtools-sui/src/addresses.ts
new file mode 100644
index 0000000000..0b4322ebf0
--- /dev/null
+++ b/packages/protocol-devtools-sui/src/addresses.ts
@@ -0,0 +1,16 @@
+import { EndpointId } from '@layerzerolabs/lz-definitions'
+
+export const SUI_ENDPOINT_V2_ADDRESSES: Partial> = {
+ [EndpointId.SUI_V2_MAINNET]: '0x31beaef889b08b9c3b37d19280fc1f8b75bae5b2de2410fc3120f403e9a36dac',
+ [EndpointId.SUI_V2_TESTNET]: '0xabf9629418d997fcc742a5ca22820241b72fb53691f010bc964eb49b4bd2263a',
+}
+
+export const SUI_ULN_302_ADDRESSES: Partial> = {
+ [EndpointId.SUI_V2_MAINNET]: '0x3ce7457bed48ad23ee5d611dd3172ae4fbd0a22ea0e846782a7af224d905dbb0',
+ [EndpointId.SUI_V2_TESTNET]: '0xf5d69c7b0922ce0ab4540525fbc66ca25ce9f092c64b032b91e4c5625ea0fb24',
+}
+
+export const SUI_EXECUTOR_ADDRESSES: Partial> = {
+ [EndpointId.SUI_V2_MAINNET]: '0xde7fe1a6648d587fcc991f124f3aa5b6389340610804108094d5c5fbf61d1989',
+ [EndpointId.SUI_V2_TESTNET]: '0xb9fdc6748fb939095e249b22717d564edf890681e387131d6c525d867d30f834',
+}
diff --git a/packages/protocol-devtools-sui/src/endpointv2/index.ts b/packages/protocol-devtools-sui/src/endpointv2/index.ts
new file mode 100644
index 0000000000..7db67b18a1
--- /dev/null
+++ b/packages/protocol-devtools-sui/src/endpointv2/index.ts
@@ -0,0 +1 @@
+export * from './sdk'
diff --git a/packages/protocol-devtools-sui/src/endpointv2/sdk.ts b/packages/protocol-devtools-sui/src/endpointv2/sdk.ts
new file mode 100644
index 0000000000..7212abbdb3
--- /dev/null
+++ b/packages/protocol-devtools-sui/src/endpointv2/sdk.ts
@@ -0,0 +1,383 @@
+import { Transaction } from '@mysten/sui/transactions'
+import type {
+ IEndpointV2,
+ IUlnRead,
+ MessageParams,
+ MessagingFee,
+ SetConfigParam,
+ Timeout,
+ Uln302ConfigType,
+ Uln302ExecutorConfig,
+ Uln302SetExecutorConfig,
+ Uln302SetUlnConfig,
+ Uln302UlnConfig,
+ Uln302UlnUserConfig,
+ UlnReadSetUlnConfig,
+ UlnReadUlnConfig,
+ UlnReadUlnUserConfig,
+} from '@layerzerolabs/protocol-devtools'
+import { endpointIdToStage, Stage, type EndpointId } from '@layerzerolabs/lz-definitions'
+import { type Bytes32, type OmniAddress, type OmniTransaction, type PossiblyBytes } from '@layerzerolabs/devtools'
+import { OmniSDK } from '@layerzerolabs/devtools-sui'
+import { CONFIG_TYPE, ExecutorConfigBcs, OAppUlnConfigBcs, SDK } from '@layerzerolabs/lz-sui-sdk-v2'
+import type { Endpoint, OApp, ExecutorConfig, OAppUlnConfig } from '@layerzerolabs/lz-sui-sdk-v2'
+import type { Uln302 } from '../uln302'
+
+export class EndpointV2 extends OmniSDK implements IEndpointV2 {
+ private sdk?: SDK
+ private oapp?: OApp
+ private endpoint?: Endpoint
+
+ async getUln302SDK(address: OmniAddress): Promise {
+ this.logger.debug(`Getting Uln302 SDK for address ${address}`)
+ const { Uln302 } = await import('../uln302')
+ return new Uln302(this.client, { eid: this.point.eid, address })
+ }
+
+ async getUlnReadSDK(_address: OmniAddress): Promise {
+ throw new Error('ULN Read functionality is not supported for Sui.')
+ }
+
+ async getDelegate(_oapp: OmniAddress): Promise {
+ return this.getEndpoint().getDelegate(_oapp)
+ }
+
+ async isDelegate(_oapp: OmniAddress, _delegate: OmniAddress): Promise {
+ const delegate = await this.getDelegate(_oapp)
+ return delegate === _delegate
+ }
+
+ async getDefaultReceiveLibrary(_eid: EndpointId): Promise {
+ return this.getEndpoint().getDefaultReceiveLibrary(_eid)
+ }
+
+ async setDefaultReceiveLibrary(
+ _eid: EndpointId,
+ _uln: OmniAddress | null | undefined,
+ _gracePeriod: bigint = 0n
+ ): Promise {
+ const tx = new Transaction()
+ this.getEndpoint().setDefaultReceiveLibraryMoveCall(tx, _eid, _uln ?? '0x0', _gracePeriod)
+ return this.createTransaction(tx)
+ }
+
+ async getDefaultSendLibrary(_eid: EndpointId): Promise {
+ return this.getEndpoint().getDefaultSendLibrary(_eid)
+ }
+
+ async setDefaultSendLibrary(_eid: EndpointId, _uln: OmniAddress | null | undefined): Promise {
+ const tx = new Transaction()
+ this.getEndpoint().setDefaultSendLibraryMoveCall(tx, _eid, _uln ?? '0x0')
+ return this.createTransaction(tx)
+ }
+
+ async isRegisteredLibrary(_uln: OmniAddress): Promise {
+ return this.notImplemented('isRegisteredLibrary')
+ }
+
+ async registerLibrary(_uln: OmniAddress): Promise {
+ return this.notImplemented('registerLibrary')
+ }
+
+ async isBlockedLibrary(_uln: OmniAddress): Promise {
+ return this.notImplemented('isBlockedLibrary')
+ }
+
+ async getSendLibrary(_sender: OmniAddress, _dstEid: EndpointId): Promise {
+ const [library] = await this.getEndpoint().getSendLibrary(_sender, _dstEid)
+ return library
+ }
+
+ async getReceiveLibrary(
+ _receiver: OmniAddress,
+ _srcEid: EndpointId
+ ): Promise<[address: Bytes32 | undefined, isDefault: boolean]> {
+ const [library, isDefault] = await this.getEndpoint().getReceiveLibrary(_receiver, _srcEid)
+ return [library, isDefault]
+ }
+
+ async getDefaultReceiveLibraryTimeout(_eid: EndpointId): Promise {
+ const timeout = await this.getEndpoint().getDefaultReceiveLibraryTimeout(_eid)
+ if (!timeout) {
+ return { lib: '0x0', expiry: 0n }
+ }
+ return { lib: timeout.fallbackLib, expiry: timeout.expiry }
+ }
+
+ async getReceiveLibraryTimeout(_receiver: OmniAddress, _srcEid: EndpointId): Promise {
+ const timeout = await this.getEndpoint().getReceiveLibraryTimeout(_receiver, _srcEid)
+ if (!timeout) {
+ return { lib: '0x0', expiry: 0n }
+ }
+ return { lib: timeout.fallbackLib, expiry: timeout.expiry }
+ }
+
+ async setSendLibrary(_oapp: OmniAddress, _eid: EndpointId, _uln: OmniAddress): Promise {
+ const tx = new Transaction()
+ await this.getOApp(_oapp).setSendLibraryMoveCall(tx, _eid, _uln)
+ return this.createTransaction(tx)
+ }
+
+ async isDefaultSendLibrary(_sender: PossiblyBytes, _dstEid: EndpointId): Promise {
+ const [_, isDefault] = await this.getEndpoint().getSendLibrary(String(_sender), _dstEid)
+ return isDefault
+ }
+
+ async setReceiveLibrary(
+ _oapp: OmniAddress,
+ _eid: EndpointId,
+ _uln: OmniAddress,
+ _gracePeriod: bigint
+ ): Promise {
+ const tx = new Transaction()
+ await this.getOApp(_oapp).setReceiveLibraryMoveCall(tx, _eid, _uln, _gracePeriod)
+ return this.createTransaction(tx)
+ }
+
+ async setReceiveLibraryTimeout(
+ _oapp: OmniAddress,
+ _eid: EndpointId,
+ _uln: OmniAddress,
+ _expiry: bigint
+ ): Promise {
+ const tx = new Transaction()
+ await this.getOApp(_oapp).setReceiveLibraryTimeoutMoveCall(tx, _eid, _uln, _expiry)
+ return this.createTransaction(tx)
+ }
+
+ async getExecutorConfig(_oapp: PossiblyBytes, _uln: OmniAddress, _eid: EndpointId): Promise {
+ const ulnSdk = await this.getUln302SDK(_uln)
+ return ulnSdk.getExecutorConfig(_eid, String(_oapp))
+ }
+
+ async getAppExecutorConfig(
+ _oapp: PossiblyBytes,
+ _uln: OmniAddress,
+ _eid: EndpointId
+ ): Promise {
+ const ulnSdk = await this.getUln302SDK(_uln)
+ return ulnSdk.getAppExecutorConfig(_eid, String(_oapp))
+ }
+
+ async hasAppExecutorConfig(
+ _oapp: OmniAddress,
+ _uln: OmniAddress,
+ _eid: EndpointId,
+ _config: Uln302ExecutorConfig
+ ): Promise {
+ const ulnSdk = await this.getUln302SDK(_uln)
+ return ulnSdk.hasAppExecutorConfig(_eid, _oapp, _config)
+ }
+
+ async setExecutorConfig(
+ _oapp: PossiblyBytes,
+ _uln: PossiblyBytes,
+ _setExecutorConfig: Uln302SetExecutorConfig[]
+ ): Promise {
+ return this.createConfigTransactions(String(_oapp), String(_uln), _setExecutorConfig, CONFIG_TYPE.EXECUTOR)
+ }
+
+ async getUlnConfig(
+ _oapp: OmniAddress,
+ _uln: OmniAddress,
+ _eid: EndpointId,
+ _type: Uln302ConfigType
+ ): Promise {
+ const ulnSdk = await this.getUln302SDK(_uln)
+ return ulnSdk.getUlnConfig(_eid, _oapp, _type)
+ }
+
+ async getAppUlnConfig(
+ _oapp: OmniAddress,
+ _uln: OmniAddress,
+ _eid: EndpointId,
+ _type: Uln302ConfigType
+ ): Promise {
+ const ulnSdk = await this.getUln302SDK(_uln)
+ return ulnSdk.getAppUlnConfig(_eid, _oapp, _type)
+ }
+
+ async getAppUlnReadConfig(_oapp: OmniAddress, _uln: OmniAddress, _channelId: number): Promise {
+ throw new Error('ULN Read functionality is not supported for Sui.')
+ }
+
+ async hasAppUlnConfig(
+ _oapp: OmniAddress,
+ _uln: OmniAddress,
+ _eid: EndpointId,
+ _config: Uln302UlnUserConfig,
+ _type: Uln302ConfigType
+ ): Promise {
+ const ulnSdk = await this.getUln302SDK(_uln)
+ return ulnSdk.hasAppUlnConfig(_eid, _oapp, _config, _type)
+ }
+
+ async hasAppUlnReadConfig(
+ _oapp: OmniAddress,
+ _uln: OmniAddress,
+ _channelId: number,
+ _config: UlnReadUlnUserConfig
+ ): Promise {
+ throw new Error('ULN Read functionality is not supported for Sui.')
+ }
+
+ async setUlnConfig(
+ _oapp: OmniAddress,
+ _uln: OmniAddress,
+ _setUlnConfig: Uln302SetUlnConfig[]
+ ): Promise {
+ return this.createConfigTransactions(_oapp, _uln, _setUlnConfig, CONFIG_TYPE.SEND_ULN)
+ }
+
+ async setUlnReadConfig(
+ _oapp: OmniAddress,
+ _uln: OmniAddress,
+ _setUlnConfig: UlnReadSetUlnConfig[]
+ ): Promise {
+ throw new Error('ULN Read functionality is not supported for Sui.')
+ }
+
+ async getUlnConfigParams(_uln: OmniAddress, _setUlnConfig: Uln302SetUlnConfig[]): Promise {
+ return _setUlnConfig.map(({ eid, ulnConfig, type }) => ({
+ eid,
+ configType: type === 'send' ? CONFIG_TYPE.SEND_ULN : CONFIG_TYPE.RECEIVE_ULN,
+ config: this.serializeUlnConfig(ulnConfig),
+ }))
+ }
+
+ async getUlnReadConfigParams(_uln: OmniAddress, _setUlnConfig: UlnReadSetUlnConfig[]): Promise {
+ throw new Error('ULN Read functionality is not supported for Sui.')
+ }
+
+ async getExecutorConfigParams(
+ _uln: OmniAddress,
+ _setExecutorConfig: Uln302SetExecutorConfig[]
+ ): Promise {
+ return _setExecutorConfig.map(({ eid, executorConfig }) => ({
+ eid,
+ configType: CONFIG_TYPE.EXECUTOR,
+ config: this.serializeExecutorConfig(executorConfig),
+ }))
+ }
+
+ async setConfig(
+ _oapp: OmniAddress,
+ _uln: OmniAddress,
+ _setConfigParam: SetConfigParam[]
+ ): Promise {
+ const txs: OmniTransaction[] = []
+ for (const param of _setConfigParam) {
+ const tx = new Transaction()
+ const setConfigCall = await this.getOApp(_oapp).setConfigMoveCall(
+ tx,
+ _uln,
+ param.eid,
+ param.configType,
+ param.config as Uint8Array
+ )
+ // The setConfigMoveCall returns a Call that must be
+ // populated using the endpoint's populateSetConfigTransaction to build the complete transaction
+ await this.getEndpoint().populateSetConfigTransaction(tx, setConfigCall)
+ txs.push(await this.createTransaction(tx))
+ }
+ return txs
+ }
+
+ async quote(_params: MessageParams, _sender: OmniAddress): Promise {
+ return this.notImplemented('quote')
+ }
+
+ private notImplemented(method: string): never {
+ throw new TypeError(`${method}() not implemented on Sui Endpoint SDK`)
+ }
+
+ private getSdk(): SDK {
+ if (!this.sdk) {
+ const stage = endpointIdToStage(this.point.eid) as Stage
+ this.sdk = new SDK({ client: this.client, stage })
+ }
+ return this.sdk
+ }
+
+ private getOApp(callCapId: OmniAddress = this.point.address): OApp {
+ if (callCapId === this.point.address) {
+ if (!this.oapp) {
+ this.oapp = this.getSdk().getOApp(callCapId)
+ }
+ return this.oapp
+ }
+ return this.getSdk().getOApp(callCapId)
+ }
+
+ private getEndpoint(): Endpoint {
+ if (!this.endpoint) {
+ this.endpoint = this.getSdk().getEndpoint()
+ }
+ return this.endpoint
+ }
+
+ private serializeExecutorConfig(config: Uln302ExecutorConfig): Uint8Array {
+ const executorConfig: ExecutorConfig = {
+ maxMessageSize: config.maxMessageSize,
+ executor: config.executor,
+ }
+ return ExecutorConfigBcs.serialize({
+ max_message_size: executorConfig.maxMessageSize,
+ executor: executorConfig.executor,
+ }).toBytes()
+ }
+
+ private serializeUlnConfig(config: Uln302UlnUserConfig): Uint8Array {
+ const useDefaultConfirmations = config.confirmations == null
+ const useDefaultRequiredDvns = config.requiredDVNs.length === 0
+ const useDefaultOptionalDvns = config.optionalDVNs == null
+ const ulnConfig: OAppUlnConfig = {
+ useDefaultConfirmations,
+ useDefaultRequiredDvns,
+ useDefaultOptionalDvns,
+ ulnConfig: {
+ confirmations: config.confirmations ?? 0n,
+ requiredDvns: config.requiredDVNs,
+ optionalDvns: config.optionalDVNs ?? [],
+ optionalDvnThreshold: config.optionalDVNThreshold ?? 0,
+ },
+ }
+ return OAppUlnConfigBcs.serialize({
+ use_default_confirmations: ulnConfig.useDefaultConfirmations,
+ use_default_required_dvns: ulnConfig.useDefaultRequiredDvns,
+ use_default_optional_dvns: ulnConfig.useDefaultOptionalDvns,
+ uln_config: {
+ confirmations: ulnConfig.ulnConfig.confirmations,
+ required_dvns: ulnConfig.ulnConfig.requiredDvns,
+ optional_dvns: ulnConfig.ulnConfig.optionalDvns,
+ optional_dvn_threshold: ulnConfig.ulnConfig.optionalDvnThreshold,
+ },
+ }).toBytes()
+ }
+
+ private async createConfigTransactions(
+ oapp: OmniAddress,
+ uln: OmniAddress,
+ configs: Uln302SetExecutorConfig[] | Uln302SetUlnConfig[],
+ configType: number
+ ): Promise {
+ const txs: OmniTransaction[] = []
+ for (const config of configs) {
+ const tx = new Transaction()
+ let setConfigCall
+ if ('executorConfig' in config) {
+ const bytes = this.serializeExecutorConfig(config.executorConfig)
+ setConfigCall = await this.getOApp(oapp).setConfigMoveCall(tx, uln, config.eid, configType, bytes)
+ } else {
+ const bytes = this.serializeUlnConfig(config.ulnConfig)
+ const type = config.type === 'send' ? CONFIG_TYPE.SEND_ULN : CONFIG_TYPE.RECEIVE_ULN
+ setConfigCall = await this.getOApp(oapp).setConfigMoveCall(tx, uln, config.eid, type, bytes)
+ }
+ // The setConfigMoveCall returns a Call that must be
+ // populated using the endpoint's populateSetConfigTransaction to build the complete transaction
+ await this.getEndpoint().populateSetConfigTransaction(tx, setConfigCall)
+ txs.push(await this.createTransaction(tx))
+ }
+ return txs
+ }
+}
diff --git a/packages/protocol-devtools-sui/src/index.ts b/packages/protocol-devtools-sui/src/index.ts
new file mode 100644
index 0000000000..5b9e0f3793
--- /dev/null
+++ b/packages/protocol-devtools-sui/src/index.ts
@@ -0,0 +1,3 @@
+export * from './addresses'
+export * from './endpointv2'
+export * from './uln302'
diff --git a/packages/protocol-devtools-sui/src/uln302/index.ts b/packages/protocol-devtools-sui/src/uln302/index.ts
new file mode 100644
index 0000000000..7db67b18a1
--- /dev/null
+++ b/packages/protocol-devtools-sui/src/uln302/index.ts
@@ -0,0 +1 @@
+export * from './sdk'
diff --git a/packages/protocol-devtools-sui/src/uln302/sdk.ts b/packages/protocol-devtools-sui/src/uln302/sdk.ts
new file mode 100644
index 0000000000..9c99836fa4
--- /dev/null
+++ b/packages/protocol-devtools-sui/src/uln302/sdk.ts
@@ -0,0 +1,193 @@
+import { Transaction } from '@mysten/sui/transactions'
+import type {
+ IUln302,
+ Uln302ConfigType,
+ Uln302ExecutorConfig,
+ Uln302UlnConfig,
+ Uln302UlnUserConfig,
+} from '@layerzerolabs/protocol-devtools'
+import { endpointIdToStage, Stage, type EndpointId } from '@layerzerolabs/lz-definitions'
+import type { OmniAddress, OmniTransaction } from '@layerzerolabs/devtools'
+import { OmniSDK } from '@layerzerolabs/devtools-sui'
+import { SDK } from '@layerzerolabs/lz-sui-sdk-v2'
+import type { ExecutorConfig, OAppUlnConfig, UlnConfig, Uln302 as SuiUln302 } from '@layerzerolabs/lz-sui-sdk-v2'
+
+export class Uln302 extends OmniSDK implements IUln302 {
+ private sdk?: SDK
+ private uln?: SuiUln302
+
+ async getUlnConfig(
+ _eid: EndpointId,
+ _address: OmniAddress | null | undefined,
+ _type: Uln302ConfigType
+ ): Promise {
+ if (_type === 'send') {
+ const config = _address
+ ? await this.getUln().getEffectiveSendUlnConfig(_address, _eid)
+ : await this.getUln().getDefaultSendUlnConfig(_eid)
+ return this.toUlnConfig(config)
+ }
+
+ const config = _address
+ ? await this.getUln().getEffectiveReceiveUlnConfig(_address, _eid)
+ : await this.getUln().getDefaultReceiveUlnConfig(_eid)
+ return this.toUlnConfig(config)
+ }
+
+ async getAppUlnConfig(_eid: EndpointId, _address: OmniAddress, _type: Uln302ConfigType): Promise {
+ try {
+ const config: OAppUlnConfig =
+ _type === 'send'
+ ? await this.getUln().getOAppSendUlnConfig(_address, _eid)
+ : await this.getUln().getOAppReceiveUlnConfig(_address, _eid)
+ return this.toUlnConfig(config.ulnConfig)
+ } catch (error) {
+ // If the config doesn't exist, return empty config
+ if (this.isMissingSuiConfig(error)) {
+ return this.toUlnConfig({
+ confirmations: 0n,
+ requiredDvns: [],
+ optionalDvns: [],
+ optionalDvnThreshold: 0,
+ })
+ }
+ throw error
+ }
+ }
+
+ async hasAppUlnConfig(
+ _eid: EndpointId,
+ _oapp: OmniAddress,
+ _config: Uln302UlnUserConfig,
+ _type: Uln302ConfigType
+ ): Promise {
+ const current = await this.getAppUlnConfig(_eid, _oapp, _type)
+ const required = {
+ confirmations: _config.confirmations ?? current.confirmations,
+ requiredDVNs: _config.requiredDVNs,
+ optionalDVNs: _config.optionalDVNs ?? [],
+ optionalDVNThreshold: _config.optionalDVNThreshold ?? 0,
+ }
+ return (
+ current.confirmations === required.confirmations &&
+ this.equalStringArrays(current.requiredDVNs, required.requiredDVNs) &&
+ this.equalStringArrays(current.optionalDVNs, required.optionalDVNs) &&
+ current.optionalDVNThreshold === required.optionalDVNThreshold
+ )
+ }
+
+ async setDefaultUlnConfig(_eid: EndpointId, _config: Uln302UlnUserConfig): Promise {
+ const tx = new Transaction()
+ const ulnConfig: UlnConfig = {
+ confirmations: _config.confirmations ?? 0n,
+ requiredDvns: _config.requiredDVNs,
+ optionalDvns: _config.optionalDVNs ?? [],
+ optionalDvnThreshold: _config.optionalDVNThreshold ?? 0,
+ }
+ this.getUln().setDefaultSendUlnConfigMoveCall(tx, _eid, ulnConfig)
+ this.getUln().setDefaultReceiveUlnConfigMoveCall(tx, _eid, ulnConfig)
+ return this.createTransaction(tx)
+ }
+
+ async getExecutorConfig(
+ _eid: EndpointId,
+ _address?: OmniAddress | null | undefined
+ ): Promise {
+ const config = _address
+ ? await this.getUln().getEffectiveExecutorConfig(_address, _eid)
+ : await this.getUln().getDefaultExecutorConfig(_eid)
+ return {
+ maxMessageSize: Number(config.maxMessageSize),
+ executor: config.executor,
+ }
+ }
+
+ async getAppExecutorConfig(_eid: EndpointId, _address: OmniAddress): Promise {
+ try {
+ const config = await this.getUln().getOAppExecutorConfig(_address, _eid)
+ return {
+ maxMessageSize: Number(config.maxMessageSize),
+ executor: config.executor,
+ }
+ } catch (error) {
+ // If the config doesn't exist, return empty config
+ if (this.isMissingSuiConfig(error)) {
+ return {
+ maxMessageSize: 0,
+ executor: '',
+ }
+ }
+ throw error
+ }
+ }
+
+ async hasAppExecutorConfig(_eid: EndpointId, _oapp: OmniAddress, _config: Uln302ExecutorConfig): Promise {
+ const current = await this.getAppExecutorConfig(_eid, _oapp)
+ return current.maxMessageSize === _config.maxMessageSize && current.executor === _config.executor
+ }
+
+ async setDefaultExecutorConfig(_eid: EndpointId, _config: Uln302ExecutorConfig): Promise {
+ const tx = new Transaction()
+ const executorConfig: ExecutorConfig = {
+ maxMessageSize: _config.maxMessageSize,
+ executor: _config.executor,
+ }
+ this.getUln().setDefaultExecutorConfigMoveCall(tx, _eid, executorConfig)
+ return this.createTransaction(tx)
+ }
+
+ private notImplemented(method: string): never {
+ throw new TypeError(`${method}() not implemented on Sui ULN302 SDK`)
+ }
+
+ private getSdk(): SDK {
+ if (!this.sdk) {
+ const stage = endpointIdToStage(this.point.eid) as Stage
+ this.sdk = new SDK({ client: this.client, stage })
+ }
+ return this.sdk
+ }
+
+ private getUln(): SuiUln302 {
+ if (!this.uln) {
+ this.uln = this.getSdk().getUln302()
+ }
+ return this.uln
+ }
+
+ private toUlnConfig(config: UlnConfig): Uln302UlnConfig {
+ return {
+ confirmations: BigInt(config.confirmations),
+ requiredDVNs: config.requiredDvns,
+ requiredDVNCount: config.requiredDvns.length,
+ optionalDVNs: config.optionalDvns,
+ optionalDVNThreshold: config.optionalDvnThreshold,
+ }
+ }
+
+ private equalStringArrays(left: string[], right: string[]): boolean {
+ if (left.length !== right.length) {
+ return false
+ }
+ const sortedLeft = [...left].sort()
+ const sortedRight = [...right].sort()
+ return sortedLeft.every((value, index) => value === sortedRight[index])
+ }
+
+ private isMissingSuiConfig(error: unknown): boolean {
+ const message =
+ typeof error === 'string'
+ ? error.toLowerCase()
+ : error && typeof error === 'object' && 'message' in error
+ ? String((error as { message?: unknown }).message).toLowerCase()
+ : ''
+ if (!message) {
+ return false
+ }
+ // Move abort errors indicate config doesn't exist
+ return (
+ message.includes('move abort') &&
+ (message.includes('send_uln') || message.includes('receive_uln') || message.includes('executor'))
+ )
+ }
+}
diff --git a/packages/protocol-devtools-sui/tsconfig.json b/packages/protocol-devtools-sui/tsconfig.json
new file mode 100644
index 0000000000..12774c873d
--- /dev/null
+++ b/packages/protocol-devtools-sui/tsconfig.json
@@ -0,0 +1,13 @@
+{
+ "extends": "../../tsconfig.json",
+ "exclude": ["dist", "node_modules"],
+ "include": ["src", "test", "*.config.ts"],
+ "compilerOptions": {
+ "target": "es2020",
+ "experimentalDecorators": true,
+ "types": ["node", "jest"],
+ "paths": {
+ "@/*": ["./src/*"]
+ }
+ }
+}
diff --git a/packages/protocol-devtools-sui/tsup.config.ts b/packages/protocol-devtools-sui/tsup.config.ts
new file mode 100644
index 0000000000..7ef46a5ad1
--- /dev/null
+++ b/packages/protocol-devtools-sui/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'],
+ },
+])
From f334fe4ce73621beec471b9ff5aa6f747aef5337 Mon Sep 17 00:00:00 2001
From: Krak
Date: Mon, 26 Jan 2026 09:38:02 -0800
Subject: [PATCH 03/10] feat(ua-devtools-sui): add OFT SDK for Sui
- Add OFT SDK implementing IOApp interface
- Fix setPeer to pad EVM addresses (20 bytes) to 32 bytes
- Fix hasPeer to use areBytes32Equal for normalized comparison
- Add isMissingSuiPeer helper for graceful error handling
Key fixes for lz:oapp:wire:
- EVM addresses must be right-padded with zeros to 32 bytes for Sui
- Address comparison must normalize both addresses before comparing
- Missing peer/enforced_options errors return defaults instead of throwing
---
packages/ua-devtools-sui/.eslintignore | 2 +
packages/ua-devtools-sui/.eslintrc.json | 3 +
packages/ua-devtools-sui/.prettierignore | 2 +
packages/ua-devtools-sui/CHANGELOG.md | 5 +
packages/ua-devtools-sui/README.md | 19 ++
packages/ua-devtools-sui/bin/test | 7 +
packages/ua-devtools-sui/jest.config.js | 14 ++
packages/ua-devtools-sui/jest.setup.js | 4 +
packages/ua-devtools-sui/package.json | 83 +++++++++
packages/ua-devtools-sui/src/index.ts | 1 +
packages/ua-devtools-sui/src/oft/config.ts | 44 +++++
packages/ua-devtools-sui/src/oft/factory.ts | 15 ++
packages/ua-devtools-sui/src/oft/index.ts | 3 +
packages/ua-devtools-sui/src/oft/sdk.ts | 182 ++++++++++++++++++++
packages/ua-devtools-sui/tsconfig.json | 13 ++
packages/ua-devtools-sui/tsup.config.ts | 14 ++
16 files changed, 411 insertions(+)
create mode 100644 packages/ua-devtools-sui/.eslintignore
create mode 100644 packages/ua-devtools-sui/.eslintrc.json
create mode 100644 packages/ua-devtools-sui/.prettierignore
create mode 100644 packages/ua-devtools-sui/CHANGELOG.md
create mode 100644 packages/ua-devtools-sui/README.md
create mode 100755 packages/ua-devtools-sui/bin/test
create mode 100644 packages/ua-devtools-sui/jest.config.js
create mode 100644 packages/ua-devtools-sui/jest.setup.js
create mode 100644 packages/ua-devtools-sui/package.json
create mode 100644 packages/ua-devtools-sui/src/index.ts
create mode 100644 packages/ua-devtools-sui/src/oft/config.ts
create mode 100644 packages/ua-devtools-sui/src/oft/factory.ts
create mode 100644 packages/ua-devtools-sui/src/oft/index.ts
create mode 100644 packages/ua-devtools-sui/src/oft/sdk.ts
create mode 100644 packages/ua-devtools-sui/tsconfig.json
create mode 100644 packages/ua-devtools-sui/tsup.config.ts
diff --git a/packages/ua-devtools-sui/.eslintignore b/packages/ua-devtools-sui/.eslintignore
new file mode 100644
index 0000000000..de4d1f007d
--- /dev/null
+++ b/packages/ua-devtools-sui/.eslintignore
@@ -0,0 +1,2 @@
+dist
+node_modules
diff --git a/packages/ua-devtools-sui/.eslintrc.json b/packages/ua-devtools-sui/.eslintrc.json
new file mode 100644
index 0000000000..be97c53fbb
--- /dev/null
+++ b/packages/ua-devtools-sui/.eslintrc.json
@@ -0,0 +1,3 @@
+{
+ "extends": "../../.eslintrc.json"
+}
diff --git a/packages/ua-devtools-sui/.prettierignore b/packages/ua-devtools-sui/.prettierignore
new file mode 100644
index 0000000000..1eae0cf670
--- /dev/null
+++ b/packages/ua-devtools-sui/.prettierignore
@@ -0,0 +1,2 @@
+dist/
+node_modules/
diff --git a/packages/ua-devtools-sui/CHANGELOG.md b/packages/ua-devtools-sui/CHANGELOG.md
new file mode 100644
index 0000000000..905faf0cc2
--- /dev/null
+++ b/packages/ua-devtools-sui/CHANGELOG.md
@@ -0,0 +1,5 @@
+# @layerzerolabs/ua-devtools-sui
+
+## 0.1.0
+
+- Initial release.
diff --git a/packages/ua-devtools-sui/README.md b/packages/ua-devtools-sui/README.md
new file mode 100644
index 0000000000..43cf28ef41
--- /dev/null
+++ b/packages/ua-devtools-sui/README.md
@@ -0,0 +1,19 @@
+
+
+
+
+
+
+@layerzerolabs/ua-devtools-sui
+
+
+
+
+
+
+
+
+
+
+
+Utilities for working with LayerZero Sui contracts.
diff --git a/packages/ua-devtools-sui/bin/test b/packages/ua-devtools-sui/bin/test
new file mode 100755
index 0000000000..2f9caec4e7
--- /dev/null
+++ b/packages/ua-devtools-sui/bin/test
@@ -0,0 +1,7 @@
+#!/usr/bin/env bash
+
+if [ -z "${LZ_DEVTOOLS_ENABLE_SUI_TESTS}" ]; then
+ echo 'Sui tests can be enabled by setting LZ_DEVTOOLS_ENABLE_SUI_TESTS environment variable to a non-empty value'
+else
+ jest --ci "$@"
+fi
diff --git a/packages/ua-devtools-sui/jest.config.js b/packages/ua-devtools-sui/jest.config.js
new file mode 100644
index 0000000000..04c8477342
--- /dev/null
+++ b/packages/ua-devtools-sui/jest.config.js
@@ -0,0 +1,14 @@
+/** @type {import('ts-jest').JestConfigWithTsJest} */
+module.exports = {
+ cache: false,
+ reporters: [['github-actions', { silent: false }], 'default'],
+ testEnvironment: 'node',
+ testTimeout: 60_000,
+ setupFilesAfterEnv: ['/jest.setup.js'],
+ moduleNameMapper: {
+ '^@/(.*)$': '/src/$1',
+ },
+ transform: {
+ '^.+\\.(t|j)sx?$': '@swc/jest',
+ },
+};
diff --git a/packages/ua-devtools-sui/jest.setup.js b/packages/ua-devtools-sui/jest.setup.js
new file mode 100644
index 0000000000..956faa4d5c
--- /dev/null
+++ b/packages/ua-devtools-sui/jest.setup.js
@@ -0,0 +1,4 @@
+import * as jestExtended from 'jest-extended';
+
+// add all jest-extended matchers
+expect.extend(jestExtended);
diff --git a/packages/ua-devtools-sui/package.json b/packages/ua-devtools-sui/package.json
new file mode 100644
index 0000000000..cdad9397d7
--- /dev/null
+++ b/packages/ua-devtools-sui/package.json
@@ -0,0 +1,83 @@
+{
+ "name": "@layerzerolabs/ua-devtools-sui",
+ "version": "0.1.0",
+ "description": "Utilities for LayerZero Sui projects",
+ "repository": {
+ "type": "git",
+ "url": "git+https://github.com/LayerZero-Labs/devtools.git",
+ "directory": "packages/ua-devtools-sui"
+ },
+ "license": "MIT",
+ "sideEffects": false,
+ "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": "$npm_execpath tsc --noEmit",
+ "build": "$npm_execpath tsup",
+ "clean": "rm -rf dist",
+ "dev": "$npm_execpath tsup --watch",
+ "lint": "$npm_execpath eslint '**/*.{js,ts,json}'",
+ "lint:fix": "eslint --fix '**/*.{js,ts,json}'",
+ "test": "./bin/test"
+ },
+ "dependencies": {
+ "p-memoize": "~4.0.4"
+ },
+ "devDependencies": {
+ "@layerzerolabs/devtools": "~2.0.4",
+ "@layerzerolabs/devtools-sui": "~0.1.0",
+ "@layerzerolabs/io-devtools": "~0.3.2",
+ "@layerzerolabs/lz-definitions": "^3.0.148",
+ "@layerzerolabs/lz-sui-oft-sdk-v2": "^3.0.156",
+ "@layerzerolabs/lz-sui-sdk-v2": "^3.0.156",
+ "@layerzerolabs/lz-v2-utilities": "^3.0.148",
+ "@layerzerolabs/protocol-devtools": "~3.0.2",
+ "@layerzerolabs/protocol-devtools-sui": "~0.1.0",
+ "@layerzerolabs/test-devtools": "~0.4.7",
+ "@layerzerolabs/test-devtools-sui": "~0.0.1",
+ "@layerzerolabs/ua-devtools": "~5.0.2",
+ "@mysten/sui": "^1.45.2",
+ "@swc/core": "^1.4.0",
+ "@swc/jest": "^0.2.36",
+ "@types/jest": "^29.5.12",
+ "fast-check": "^3.15.1",
+ "jest": "^29.7.0",
+ "jest-extended": "^4.0.2",
+ "ts-node": "^10.9.2",
+ "tslib": "~2.6.2",
+ "tsup": "~8.0.1",
+ "typescript": "^5.4.4"
+ },
+ "peerDependencies": {
+ "@layerzerolabs/devtools": "~2.0.4",
+ "@layerzerolabs/devtools-sui": "~0.1.0",
+ "@layerzerolabs/io-devtools": "~0.3.2",
+ "@layerzerolabs/lz-definitions": "^3.0.148",
+ "@layerzerolabs/lz-sui-oft-sdk-v2": "^3.0.156",
+ "@layerzerolabs/lz-sui-sdk-v2": "^3.0.156",
+ "@layerzerolabs/lz-v2-utilities": "^3.0.148",
+ "@layerzerolabs/protocol-devtools": "~3.0.2",
+ "@layerzerolabs/protocol-devtools-sui": "~0.1.0",
+ "@layerzerolabs/ua-devtools": "~5.0.2",
+ "@mysten/sui": "^1.45.2"
+ },
+ "publishConfig": {
+ "access": "public"
+ }
+}
diff --git a/packages/ua-devtools-sui/src/index.ts b/packages/ua-devtools-sui/src/index.ts
new file mode 100644
index 0000000000..ab18876664
--- /dev/null
+++ b/packages/ua-devtools-sui/src/index.ts
@@ -0,0 +1 @@
+export * from './oft'
diff --git a/packages/ua-devtools-sui/src/oft/config.ts b/packages/ua-devtools-sui/src/oft/config.ts
new file mode 100644
index 0000000000..f05c46a4b8
--- /dev/null
+++ b/packages/ua-devtools-sui/src/oft/config.ts
@@ -0,0 +1,44 @@
+import {
+ type OmniVector,
+ type CreateTransactionsFromOmniEdges,
+ formatOmniVector,
+ createConfigureEdges,
+ createConfigureMultiple,
+ OmniSDKFactory,
+ OmniPoint,
+} from '@layerzerolabs/devtools'
+import { createModuleLogger, createWithAsyncLogger } from '@layerzerolabs/io-devtools'
+import { isOmniPointOnSui } from '@layerzerolabs/devtools-sui'
+import type { IOApp, OAppConfigurator, OAppOmniGraph } from '@layerzerolabs/ua-devtools'
+import { OFT } from './sdk'
+
+const createOFTLogger = () => createModuleLogger('OFT')
+const withOFTLogger = createWithAsyncLogger(createOFTLogger)
+
+const isVectorFromSui = (vector: OmniVector): boolean => isOmniPointOnSui(vector.from)
+
+const onlyEdgesFromSui = (
+ createTransactions: CreateTransactionsFromOmniEdges
+): CreateTransactionsFromOmniEdges => {
+ const logger = createOFTLogger()
+
+ return (edge, sdk, graph, createSdk) => {
+ if (!isVectorFromSui(edge.vector)) {
+ return logger.verbose(`Ignoring connection ${formatOmniVector(edge.vector)}`), undefined
+ }
+
+ return createTransactions(edge, sdk as OFT, graph, createSdk as OmniSDKFactory)
+ }
+}
+
+export const initConfig: OAppConfigurator = createConfigureEdges(
+ onlyEdgesFromSui(
+ withOFTLogger(async () => {
+ const logger = createOFTLogger()
+ logger.warn('Sui OFT initConfig is not implemented yet')
+ return undefined
+ })
+ )
+)
+
+export const initOFTAccounts = createConfigureMultiple(initConfig)
diff --git a/packages/ua-devtools-sui/src/oft/factory.ts b/packages/ua-devtools-sui/src/oft/factory.ts
new file mode 100644
index 0000000000..74cef1ed9c
--- /dev/null
+++ b/packages/ua-devtools-sui/src/oft/factory.ts
@@ -0,0 +1,15 @@
+import pMemoize from 'p-memoize'
+import type { OAppFactory } from '@layerzerolabs/ua-devtools'
+import { OFT } from './sdk'
+import { type ConnectionFactory, createConnectionFactory, defaultRpcUrlFactory } from '@layerzerolabs/devtools-sui'
+
+/**
+ * Syntactic sugar that creates an instance of Sui `OFT` SDK
+ * based on an `OmniPoint` with help of an `ConnectionFactory`.
+ *
+ * @param {ConnectionFactory} connectionFactory A function that returns a `SuiClient` based on an `EndpointId`
+ * @returns {OAppFactory}
+ */
+export const createOFTFactory = (
+ connectionFactory: ConnectionFactory = createConnectionFactory(defaultRpcUrlFactory)
+): OAppFactory => pMemoize(async (point) => new OFT(await connectionFactory(point.eid), point))
diff --git a/packages/ua-devtools-sui/src/oft/index.ts b/packages/ua-devtools-sui/src/oft/index.ts
new file mode 100644
index 0000000000..444d96c1a3
--- /dev/null
+++ b/packages/ua-devtools-sui/src/oft/index.ts
@@ -0,0 +1,3 @@
+export * from './config'
+export * from './factory'
+export * from './sdk'
diff --git a/packages/ua-devtools-sui/src/oft/sdk.ts b/packages/ua-devtools-sui/src/oft/sdk.ts
new file mode 100644
index 0000000000..93261caec1
--- /dev/null
+++ b/packages/ua-devtools-sui/src/oft/sdk.ts
@@ -0,0 +1,182 @@
+import { Transaction } from '@mysten/sui/transactions'
+import type { IOApp, OAppEnforcedOptionParam } from '@layerzerolabs/ua-devtools'
+import { endpointIdToStage, Stage, type EndpointId } from '@layerzerolabs/lz-definitions'
+import {
+ areBytes32Equal,
+ formatEid,
+ fromHex,
+ isZero,
+ toHex,
+ type Bytes,
+ type OmniAddress,
+ type OmniTransaction,
+} from '@layerzerolabs/devtools'
+import { OmniSDK } from '@layerzerolabs/devtools-sui'
+import { EndpointV2, SUI_ENDPOINT_V2_ADDRESSES } from '@layerzerolabs/protocol-devtools-sui'
+import { SDK } from '@layerzerolabs/lz-sui-sdk-v2'
+import type { OApp, Endpoint } from '@layerzerolabs/lz-sui-sdk-v2'
+
+export class OFT extends OmniSDK implements IOApp {
+ private sdk?: SDK
+ private oapp?: OApp
+ private endpoint?: Endpoint
+
+ async getEndpointSDK(): Promise {
+ const endpoint = SUI_ENDPOINT_V2_ADDRESSES[this.point.eid]
+ if (!endpoint) {
+ throw new Error(
+ `No Sui EndpointV2 address configured for eid ${this.point.eid} (${formatEid(this.point.eid)})`
+ )
+ }
+ return new EndpointV2(this.client, { eid: this.point.eid, address: endpoint })
+ }
+
+ async getOwner(): Promise {
+ return this.getDelegate()
+ }
+
+ async hasOwner(_address: OmniAddress): Promise {
+ const owner = await this.getOwner()
+ return owner === _address
+ }
+
+ async setOwner(_address: OmniAddress): Promise {
+ return this.setDelegate(_address)
+ }
+
+ async getPeer(_eid: EndpointId): Promise {
+ try {
+ const peer = await this.getOApp().getPeer(_eid)
+ return isZero(peer) ? undefined : toHex(peer)
+ } catch (error) {
+ if (isMissingSuiPeer(error)) {
+ return undefined
+ }
+ throw error
+ }
+ }
+
+ async hasPeer(_eid: EndpointId, _address: OmniAddress | null | undefined): Promise {
+ const peer = await this.getPeer(_eid)
+ // Use areBytes32Equal for comparison since getPeer returns 32-byte padded addresses
+ // while _address may be a 20-byte EVM address
+ return areBytes32Equal(peer, _address)
+ }
+
+ async setPeer(_eid: EndpointId, _peer: OmniAddress | null | undefined): Promise {
+ const tx = new Transaction()
+ // Peer addresses must be 32 bytes (bytes32), so we need to pad EVM addresses (20 bytes) to 32 bytes
+ let peerBytes: Uint8Array
+ if (_peer) {
+ const rawBytes = fromHex(_peer)
+ if (rawBytes.length === 32) {
+ peerBytes = rawBytes
+ } else if (rawBytes.length === 20) {
+ // Pad EVM address (20 bytes) to 32 bytes with leading zeros
+ peerBytes = new Uint8Array(32)
+ peerBytes.set(rawBytes, 32 - rawBytes.length)
+ } else {
+ throw new Error(`Invalid peer address length: ${rawBytes.length}. Expected 20 or 32 bytes.`)
+ }
+ } else {
+ peerBytes = new Uint8Array(32)
+ }
+ await this.getOApp().setPeerMoveCall(tx, _eid, peerBytes)
+ return this.createTransaction(tx)
+ }
+
+ async getDelegate(): Promise {
+ try {
+ return this.getEndpoint().getDelegate(this.point.address)
+ } catch (error) {
+ if (isMissingSuiPeer(error)) {
+ return undefined
+ }
+ throw error
+ }
+ }
+
+ async isDelegate(_address: OmniAddress): Promise {
+ const delegate = await this.getDelegate()
+ return delegate === _address
+ }
+
+ async setDelegate(_address: OmniAddress): Promise {
+ const tx = new Transaction()
+ await this.getOApp().setDelegateMoveCall(tx, _address)
+ return this.createTransaction(tx)
+ }
+
+ async getEnforcedOptions(_eid: EndpointId, _msgType: number): Promise {
+ try {
+ const options = await this.getOApp().getEnforcedOptions(_eid, _msgType)
+ return toHex(options)
+ } catch (error) {
+ if (isMissingSuiPeer(error)) {
+ return '0x'
+ }
+ throw error
+ }
+ }
+
+ async setEnforcedOptions(_enforcedOptions: OAppEnforcedOptionParam[]): Promise {
+ const tx = new Transaction()
+ for (const { eid, option } of _enforcedOptions) {
+ await this.getOApp().setEnforcedOptionsMoveCall(tx, eid, option.msgType, fromHex(option.options))
+ }
+ return this.createTransaction(tx)
+ }
+
+ async getCallerBpsCap(): Promise {
+ return this.notImplemented('getCallerBpsCap')
+ }
+
+ async setCallerBpsCap(_callerBpsCap: bigint): Promise {
+ return this.notImplemented('setCallerBpsCap')
+ }
+
+ private notImplemented(method: string): never {
+ throw new TypeError(`${method}() not implemented on Sui OFT SDK`)
+ }
+
+ private getSdk(): SDK {
+ if (!this.sdk) {
+ const stage = endpointIdToStage(this.point.eid) as Stage
+ this.sdk = new SDK({ client: this.client, stage })
+ }
+ return this.sdk
+ }
+
+ private getOApp(): OApp {
+ if (!this.oapp) {
+ this.oapp = this.getSdk().getOApp(this.point.address)
+ }
+ return this.oapp
+ }
+
+ private getEndpoint(): Endpoint {
+ if (!this.endpoint) {
+ this.endpoint = this.getSdk().getEndpoint()
+ }
+ return this.endpoint
+ }
+}
+
+const isMissingSuiPeer = (error: unknown): boolean => {
+ const message =
+ typeof error === 'string'
+ ? error.toLowerCase()
+ : error && typeof error === 'object' && 'message' in error
+ ? String((error as { message?: unknown }).message).toLowerCase()
+ : ''
+ if (!message) {
+ return false
+ }
+ return (
+ message.includes('missing transaction sender') ||
+ (message.includes('move abort') &&
+ // Check for peer/enforced_options patterns in the error message
+ // The error format is: oapp_peer") ... function_name: Some("get_peer")
+ (message.includes('oapp_peer') || message.includes('enforced_options')))
+ )
+}
diff --git a/packages/ua-devtools-sui/tsconfig.json b/packages/ua-devtools-sui/tsconfig.json
new file mode 100644
index 0000000000..12774c873d
--- /dev/null
+++ b/packages/ua-devtools-sui/tsconfig.json
@@ -0,0 +1,13 @@
+{
+ "extends": "../../tsconfig.json",
+ "exclude": ["dist", "node_modules"],
+ "include": ["src", "test", "*.config.ts"],
+ "compilerOptions": {
+ "target": "es2020",
+ "experimentalDecorators": true,
+ "types": ["node", "jest"],
+ "paths": {
+ "@/*": ["./src/*"]
+ }
+ }
+}
diff --git a/packages/ua-devtools-sui/tsup.config.ts b/packages/ua-devtools-sui/tsup.config.ts
new file mode 100644
index 0000000000..7ef46a5ad1
--- /dev/null
+++ b/packages/ua-devtools-sui/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'],
+ },
+])
From c046ce50268fb04ab3cda1e2876c2096924947a6 Mon Sep 17 00:00:00 2001
From: Krak
Date: Mon, 26 Jan 2026 09:38:46 -0800
Subject: [PATCH 04/10] feat(examples): add Sui support to oft-main
- Add Sui Move contracts for OFT token and OFT implementation
- Add Sui send task with proper RPC connection factory usage
- Update layerzero.config.ts with Sui pathway configuration
- Add deploy.json.example showing expected deployment format
- Update .gitignore to exclude deployment artifacts
Configuration notes:
- Enforced options order: [TO_SUI_OPTIONS, TO_EVM_OPTIONS]
- SUI_ENFORCED_OPTIONS uses 5000 gas (sufficient for Sui)
- EVM_ENFORCED_OPTIONS uses 80000 gas (sufficient for EVM)
---
examples/oft-main/.env.example | 35 +
examples/oft-main/.eslintignore | 13 +
examples/oft-main/.eslintrc.js | 12 +
examples/oft-main/.gitignore | 42 +
examples/oft-main/.nvmrc | 1 +
examples/oft-main/.prettierignore | 14 +
examples/oft-main/.prettierrc.js | 3 +
examples/oft-main/.solhintrc.js | 3 +
examples/oft-main/Anchor.toml | 20 +
examples/oft-main/CHANGELOG.md | 352 +
examples/oft-main/Cargo.lock | 2989 ++++
examples/oft-main/Cargo.toml | 16 +
examples/oft-main/README.md | 746 +
examples/oft-main/contracts/MyOFT.sol | 16 +
.../oft-main/contracts/mocks/MyOFTMock.sol | 18 +
examples/oft-main/deploy/MyOFT.ts | 53 +
.../oft-main/docs/move.layerzero.config.ts | 121 +
examples/oft-main/docs/wiring-to-aptos.md | 63 +
examples/oft-main/foundry.toml | 30 +
examples/oft-main/hardhat.config.ts | 91 +
examples/oft-main/jest.config.ts | 12 +
examples/oft-main/junk-id.json | 6 +
examples/oft-main/layerzero.config.ts | 99 +
examples/oft-main/package.json | 136 +
examples/oft-main/pnpm-lock.yaml | 13283 ++++++++++++++++
.../programs/endpoint-mock/Cargo.toml | 21 +
.../programs/endpoint-mock/Xargo.toml | 2 +
.../endpoint-mock/src/instructions/mod.rs | 3 +
.../src/instructions/oapp/mod.rs | 3 +
.../src/instructions/oapp/register_oapp.rs | 35 +
.../programs/endpoint-mock/src/lib.rs | 19 +
.../endpoint-mock/src/state/endpoint.rs | 8 +
.../programs/endpoint-mock/src/state/mod.rs | 3 +
examples/oft-main/programs/oft/Cargo.toml | 24 +
examples/oft-main/programs/oft/Xargo.toml | 2 +
examples/oft-main/programs/oft/build.rs | 3 +
.../programs/oft/src/compose_msg_codec.rs | 51 +
examples/oft-main/programs/oft/src/errors.rs | 14 +
examples/oft-main/programs/oft/src/events.rs | 18 +
.../programs/oft/src/instructions/init_oft.rs | 86 +
.../oft/src/instructions/lz_receive.rs | 183 +
.../oft/src/instructions/lz_receive_types.rs | 139 +
.../programs/oft/src/instructions/mod.rs | 21 +
.../oft/src/instructions/quote_oft.rs | 92 +
.../oft/src/instructions/quote_send.rs | 193 +
.../programs/oft/src/instructions/send.rs | 175 +
.../oft/src/instructions/set_oft_config.rs | 60 +
.../oft/src/instructions/set_pause.rs | 35 +
.../oft/src/instructions/set_peer_config.rs | 99 +
.../oft/src/instructions/withdraw_fee.rs | 67 +
examples/oft-main/programs/oft/src/lib.rs | 101 +
.../oft-main/programs/oft/src/msg_codec.rs | 46 +
.../oft-main/programs/oft/src/state/mod.rs | 5 +
.../oft-main/programs/oft/src/state/oft.rs | 50 +
.../programs/oft/src/state/peer_config.rs | 92 +
.../oft-main/programs/oft/tests/msg_codec.rs | 55 +
examples/oft-main/rust-toolchain.toml | 3 +
examples/oft-main/solhint.config.js | 1 +
.../starknet/deploy-starknet-mainnet.js | 160 +
examples/oft-main/starknet/deploy.json.bak | 6 +
.../starknet/deploy.json.bak.1769208885 | 8 +
.../starknet/deploy.json.bak.1769209481 | 8 +
.../starknet/deploy.json.bak.1769209606 | 8 +
examples/oft-main/sui/deploy.json.example | 8 +
examples/oft-main/sui/init-and-register.js | 115 +
examples/oft-main/sui/oft/Move.lock | 169 +
examples/oft-main/sui/oft/Move.toml | 16 +
examples/oft-main/sui/oft/README.md | 15 +
.../sui/oft/sources/codec/oft_msg_codec.move | 84 +
.../sui/oft/sources/internal/oft_fee.move | 166 +
.../sui/oft/sources/internal/pausable.move | 59 +
.../oft/sources/internal/rate_limiter.move | 226 +
.../oft/sources/oft-infos/oft_info_v1.move | 81 +
examples/oft-main/sui/oft/sources/oft.move | 1062 ++
.../oft-main/sui/oft/sources/oft_impl.move | 104 +
.../sui/oft/sources/oft_ptb_builder.move | 169 +
.../sui/oft/sources/types/oft_fee_detail.move | 34 +
.../sui/oft/sources/types/oft_limit.move | 37 +
.../sui/oft/sources/types/oft_receipt.move | 30 +
.../oft/sources/types/oft_send_context.move | 53 +
.../sui/oft/sources/types/oft_sender.move | 48 +
.../sui/oft/sources/types/send_param.move | 75 +
examples/oft-main/sui/token/Move.lock | 56 +
examples/oft-main/sui/token/Move.toml | 8 +
.../oft-main/sui/token/sources/myoft.move | 25 +
.../oft-main/tasks/aptos/aptosEndpointV2.ts | 325 +
.../oft-main/tasks/aptos/aptosSdkFactory.ts | 66 +
.../tasks/aptos/aptosSignerFactory.ts | 54 +
examples/oft-main/tasks/aptos/index.ts | 3 +
examples/oft-main/tasks/common/config.get.ts | 306 +
examples/oft-main/tasks/common/sendOFT.ts | 147 +
examples/oft-main/tasks/common/taskHelper.ts | 115 +
examples/oft-main/tasks/common/types.ts | 24 +
examples/oft-main/tasks/common/utils.ts | 224 +
examples/oft-main/tasks/common/wire.ts | 261 +
examples/oft-main/tasks/evm/sendEvm.ts | 138 +
examples/oft-main/tasks/index.ts | 20 +
examples/oft-main/tasks/solana/base58.ts | 36 +
examples/oft-main/tasks/solana/createOFT.ts | 400 +
.../oft-main/tasks/solana/createOFTAdapter.ts | 118 +
examples/oft-main/tasks/solana/debug.ts | 483 +
.../oft-main/tasks/solana/endpoint/burn.ts | 74 +
.../oft-main/tasks/solana/endpoint/clear.ts | 124 +
.../tasks/solana/endpoint/endpointUtils.ts | 71 +
.../oft-main/tasks/solana/endpoint/nilify.ts | 75 +
.../oft-main/tasks/solana/endpoint/skip.ts | 82 +
examples/oft-main/tasks/solana/getPrioFees.ts | 32 +
.../oft-main/tasks/solana/getRateLimits.ts | 35 +
examples/oft-main/tasks/solana/index.ts | 340 +
examples/oft-main/tasks/solana/initConfig.ts | 31 +
examples/oft-main/tasks/solana/multisig.ts | 161 +
.../oft-main/tasks/solana/retryMessage.ts | 92 +
examples/oft-main/tasks/solana/sendSolana.ts | 196 +
.../oft-main/tasks/solana/setAuthority.ts | 206 +
.../tasks/solana/setInboundRateLimit.ts | 80 +
.../tasks/solana/setOutboundRateLimit.ts | 81 +
.../tasks/solana/setUpdateAuthority.ts | 103 +
.../oft-main/tasks/solana/updateMetadata.ts | 92 +
examples/oft-main/tasks/solana/utils.ts | 85 +
.../oft-main/tasks/starknet/sendStarknet.ts | 137 +
examples/oft-main/tasks/starknet/utils.ts | 28 +
examples/oft-main/tasks/sui/sendSui.ts | 102 +
examples/oft-main/tasks/sui/utils.ts | 26 +
examples/oft-main/test/foundry/MyOFT.t.sol | 160 +
examples/oft-main/test/hardhat/MyOFT.test.ts | 101 +
examples/oft-main/test/mocks/ERC20Mock.sol | 12 +
.../oft-main/test/mocks/OFTComposerMock.sol | 27 +
examples/oft-main/test/mocks/OFTMock.sol | 59 +
examples/oft-main/tsconfig.json | 13 +
examples/oft-main/turbo.json | 8 +
130 files changed, 28066 insertions(+)
create mode 100644 examples/oft-main/.env.example
create mode 100644 examples/oft-main/.eslintignore
create mode 100644 examples/oft-main/.eslintrc.js
create mode 100644 examples/oft-main/.gitignore
create mode 100644 examples/oft-main/.nvmrc
create mode 100644 examples/oft-main/.prettierignore
create mode 100644 examples/oft-main/.prettierrc.js
create mode 100644 examples/oft-main/.solhintrc.js
create mode 100644 examples/oft-main/Anchor.toml
create mode 100644 examples/oft-main/CHANGELOG.md
create mode 100644 examples/oft-main/Cargo.lock
create mode 100644 examples/oft-main/Cargo.toml
create mode 100644 examples/oft-main/README.md
create mode 100644 examples/oft-main/contracts/MyOFT.sol
create mode 100644 examples/oft-main/contracts/mocks/MyOFTMock.sol
create mode 100644 examples/oft-main/deploy/MyOFT.ts
create mode 100644 examples/oft-main/docs/move.layerzero.config.ts
create mode 100644 examples/oft-main/docs/wiring-to-aptos.md
create mode 100644 examples/oft-main/foundry.toml
create mode 100644 examples/oft-main/hardhat.config.ts
create mode 100644 examples/oft-main/jest.config.ts
create mode 100644 examples/oft-main/junk-id.json
create mode 100644 examples/oft-main/layerzero.config.ts
create mode 100644 examples/oft-main/package.json
create mode 100644 examples/oft-main/pnpm-lock.yaml
create mode 100644 examples/oft-main/programs/endpoint-mock/Cargo.toml
create mode 100644 examples/oft-main/programs/endpoint-mock/Xargo.toml
create mode 100644 examples/oft-main/programs/endpoint-mock/src/instructions/mod.rs
create mode 100644 examples/oft-main/programs/endpoint-mock/src/instructions/oapp/mod.rs
create mode 100644 examples/oft-main/programs/endpoint-mock/src/instructions/oapp/register_oapp.rs
create mode 100644 examples/oft-main/programs/endpoint-mock/src/lib.rs
create mode 100644 examples/oft-main/programs/endpoint-mock/src/state/endpoint.rs
create mode 100644 examples/oft-main/programs/endpoint-mock/src/state/mod.rs
create mode 100644 examples/oft-main/programs/oft/Cargo.toml
create mode 100644 examples/oft-main/programs/oft/Xargo.toml
create mode 100644 examples/oft-main/programs/oft/build.rs
create mode 100644 examples/oft-main/programs/oft/src/compose_msg_codec.rs
create mode 100644 examples/oft-main/programs/oft/src/errors.rs
create mode 100644 examples/oft-main/programs/oft/src/events.rs
create mode 100644 examples/oft-main/programs/oft/src/instructions/init_oft.rs
create mode 100644 examples/oft-main/programs/oft/src/instructions/lz_receive.rs
create mode 100644 examples/oft-main/programs/oft/src/instructions/lz_receive_types.rs
create mode 100644 examples/oft-main/programs/oft/src/instructions/mod.rs
create mode 100644 examples/oft-main/programs/oft/src/instructions/quote_oft.rs
create mode 100644 examples/oft-main/programs/oft/src/instructions/quote_send.rs
create mode 100644 examples/oft-main/programs/oft/src/instructions/send.rs
create mode 100644 examples/oft-main/programs/oft/src/instructions/set_oft_config.rs
create mode 100644 examples/oft-main/programs/oft/src/instructions/set_pause.rs
create mode 100644 examples/oft-main/programs/oft/src/instructions/set_peer_config.rs
create mode 100644 examples/oft-main/programs/oft/src/instructions/withdraw_fee.rs
create mode 100644 examples/oft-main/programs/oft/src/lib.rs
create mode 100644 examples/oft-main/programs/oft/src/msg_codec.rs
create mode 100644 examples/oft-main/programs/oft/src/state/mod.rs
create mode 100644 examples/oft-main/programs/oft/src/state/oft.rs
create mode 100644 examples/oft-main/programs/oft/src/state/peer_config.rs
create mode 100644 examples/oft-main/programs/oft/tests/msg_codec.rs
create mode 100644 examples/oft-main/rust-toolchain.toml
create mode 100644 examples/oft-main/solhint.config.js
create mode 100644 examples/oft-main/starknet/deploy-starknet-mainnet.js
create mode 100644 examples/oft-main/starknet/deploy.json.bak
create mode 100644 examples/oft-main/starknet/deploy.json.bak.1769208885
create mode 100644 examples/oft-main/starknet/deploy.json.bak.1769209481
create mode 100644 examples/oft-main/starknet/deploy.json.bak.1769209606
create mode 100644 examples/oft-main/sui/deploy.json.example
create mode 100644 examples/oft-main/sui/init-and-register.js
create mode 100644 examples/oft-main/sui/oft/Move.lock
create mode 100644 examples/oft-main/sui/oft/Move.toml
create mode 100644 examples/oft-main/sui/oft/README.md
create mode 100644 examples/oft-main/sui/oft/sources/codec/oft_msg_codec.move
create mode 100644 examples/oft-main/sui/oft/sources/internal/oft_fee.move
create mode 100644 examples/oft-main/sui/oft/sources/internal/pausable.move
create mode 100644 examples/oft-main/sui/oft/sources/internal/rate_limiter.move
create mode 100644 examples/oft-main/sui/oft/sources/oft-infos/oft_info_v1.move
create mode 100644 examples/oft-main/sui/oft/sources/oft.move
create mode 100644 examples/oft-main/sui/oft/sources/oft_impl.move
create mode 100644 examples/oft-main/sui/oft/sources/oft_ptb_builder.move
create mode 100644 examples/oft-main/sui/oft/sources/types/oft_fee_detail.move
create mode 100644 examples/oft-main/sui/oft/sources/types/oft_limit.move
create mode 100644 examples/oft-main/sui/oft/sources/types/oft_receipt.move
create mode 100644 examples/oft-main/sui/oft/sources/types/oft_send_context.move
create mode 100644 examples/oft-main/sui/oft/sources/types/oft_sender.move
create mode 100644 examples/oft-main/sui/oft/sources/types/send_param.move
create mode 100644 examples/oft-main/sui/token/Move.lock
create mode 100644 examples/oft-main/sui/token/Move.toml
create mode 100644 examples/oft-main/sui/token/sources/myoft.move
create mode 100644 examples/oft-main/tasks/aptos/aptosEndpointV2.ts
create mode 100644 examples/oft-main/tasks/aptos/aptosSdkFactory.ts
create mode 100644 examples/oft-main/tasks/aptos/aptosSignerFactory.ts
create mode 100644 examples/oft-main/tasks/aptos/index.ts
create mode 100644 examples/oft-main/tasks/common/config.get.ts
create mode 100644 examples/oft-main/tasks/common/sendOFT.ts
create mode 100644 examples/oft-main/tasks/common/taskHelper.ts
create mode 100644 examples/oft-main/tasks/common/types.ts
create mode 100644 examples/oft-main/tasks/common/utils.ts
create mode 100644 examples/oft-main/tasks/common/wire.ts
create mode 100644 examples/oft-main/tasks/evm/sendEvm.ts
create mode 100644 examples/oft-main/tasks/index.ts
create mode 100644 examples/oft-main/tasks/solana/base58.ts
create mode 100644 examples/oft-main/tasks/solana/createOFT.ts
create mode 100644 examples/oft-main/tasks/solana/createOFTAdapter.ts
create mode 100644 examples/oft-main/tasks/solana/debug.ts
create mode 100644 examples/oft-main/tasks/solana/endpoint/burn.ts
create mode 100644 examples/oft-main/tasks/solana/endpoint/clear.ts
create mode 100644 examples/oft-main/tasks/solana/endpoint/endpointUtils.ts
create mode 100644 examples/oft-main/tasks/solana/endpoint/nilify.ts
create mode 100644 examples/oft-main/tasks/solana/endpoint/skip.ts
create mode 100644 examples/oft-main/tasks/solana/getPrioFees.ts
create mode 100644 examples/oft-main/tasks/solana/getRateLimits.ts
create mode 100644 examples/oft-main/tasks/solana/index.ts
create mode 100644 examples/oft-main/tasks/solana/initConfig.ts
create mode 100644 examples/oft-main/tasks/solana/multisig.ts
create mode 100644 examples/oft-main/tasks/solana/retryMessage.ts
create mode 100644 examples/oft-main/tasks/solana/sendSolana.ts
create mode 100644 examples/oft-main/tasks/solana/setAuthority.ts
create mode 100644 examples/oft-main/tasks/solana/setInboundRateLimit.ts
create mode 100644 examples/oft-main/tasks/solana/setOutboundRateLimit.ts
create mode 100644 examples/oft-main/tasks/solana/setUpdateAuthority.ts
create mode 100644 examples/oft-main/tasks/solana/updateMetadata.ts
create mode 100644 examples/oft-main/tasks/solana/utils.ts
create mode 100644 examples/oft-main/tasks/starknet/sendStarknet.ts
create mode 100644 examples/oft-main/tasks/starknet/utils.ts
create mode 100644 examples/oft-main/tasks/sui/sendSui.ts
create mode 100644 examples/oft-main/tasks/sui/utils.ts
create mode 100644 examples/oft-main/test/foundry/MyOFT.t.sol
create mode 100644 examples/oft-main/test/hardhat/MyOFT.test.ts
create mode 100644 examples/oft-main/test/mocks/ERC20Mock.sol
create mode 100644 examples/oft-main/test/mocks/OFTComposerMock.sol
create mode 100644 examples/oft-main/test/mocks/OFTMock.sol
create mode 100644 examples/oft-main/tsconfig.json
create mode 100644 examples/oft-main/turbo.json
diff --git a/examples/oft-main/.env.example b/examples/oft-main/.env.example
new file mode 100644
index 0000000000..2ad484e3e4
--- /dev/null
+++ b/examples/oft-main/.env.example
@@ -0,0 +1,35 @@
+# .-.-. .-.-. .-.-. .-.-. .-.-. .-.-. .-.-. .-.-
+# / / \ \ / / \ \ / / \ \ / / \ \ / / \ \ / / \ \ / / \ \ / / \
+# `-' `-`-' `-`-' `-`-' `-`-' `-`-' `-`-' `-`-'
+#
+# Example environment configuration
+#
+# .-.-. .-.-. .-.-. .-.-. .-.-. .-.-. .-.-. .-.-
+# / / \ \ / / \ \ / / \ \ / / \ \ / / \ \ / / \ \ / / \ \ / / \
+# `-' `-`-' `-`-' `-`-' `-`-' `-`-' `-`-' `-`-'
+
+# EVM Variables
+# By default, the examples support both mnemonic-based and private key-based authentication
+# You don't need to set both of these values, just pick the one that you prefer and set that one
+MNEMONIC=
+ # Private key for EVM contract owner/delegate
+PRIVATE_KEY=
+
+# Solana Variables
+SOLANA_PRIVATE_KEY=
+SOLANA_KEYPAIR_PATH=
+# By default, the Solana example will use the default cluster RPC URL if no other value is provided
+RPC_URL_SOLANA=
+RPC_URL_SOLANA_TESTNET=
+
+# Sui Variables
+SUI_PRIVATE_KEY=
+RPC_URL_SUI=
+RPC_URL_SUI_TESTNET=
+
+# Starknet Variables
+# NOTE: Starknet needs the account contract address (not the public key) + private key.
+STARKNET_ACCOUNT_ADDRESS=
+STARKNET_PRIVATE_KEY=
+RPC_URL_STARKNET=
+RPC_URL_STARKNET_TESTNET=
diff --git a/examples/oft-main/.eslintignore b/examples/oft-main/.eslintignore
new file mode 100644
index 0000000000..50166580ac
--- /dev/null
+++ b/examples/oft-main/.eslintignore
@@ -0,0 +1,13 @@
+.anchor
+.turbo
+node_modules
+target
+artifacts
+cache
+dist
+out
+*.log
+*.sol
+*.yaml
+*.lock
+package-lock.json
\ No newline at end of file
diff --git a/examples/oft-main/.eslintrc.js b/examples/oft-main/.eslintrc.js
new file mode 100644
index 0000000000..bd7363593f
--- /dev/null
+++ b/examples/oft-main/.eslintrc.js
@@ -0,0 +1,12 @@
+require('@rushstack/eslint-patch/modern-module-resolution');
+
+module.exports = {
+ root: true,
+ extends: ['@layerzerolabs/eslint-config-next/recommended'],
+ rules: {
+ // @layerzerolabs/eslint-config-next defines rules for turborepo-based projects
+ // that are not relevant for this particular project
+ 'turbo/no-undeclared-env-vars': 'off',
+ 'import/no-unresolved': 'warn',
+ },
+};
diff --git a/examples/oft-main/.gitignore b/examples/oft-main/.gitignore
new file mode 100644
index 0000000000..16ccc37857
--- /dev/null
+++ b/examples/oft-main/.gitignore
@@ -0,0 +1,42 @@
+.anchor
+node_modules
+.env
+coverage
+coverage.json
+target
+typechain
+typechain-types
+
+# Hardhat files
+cache
+artifacts
+
+# LayerZero specific files
+.layerzero
+
+# foundry test compilation files
+out
+
+# pnpm
+pnpm-error.log
+
+# Editor and OS files
+.DS_Store
+.idea
+
+# Deployment artifacts (user-specific, created during deploy)
+deployments/
+
+# Sui build artifacts and deployment info
+sui/*/build/
+sui/deploy.json
+
+# Starknet deployment info
+starknet/deploy.json
+
+# Aptos deployment info
+aptos/deploy.json
+
+# Move build artifacts
+build/
+.aptos/
diff --git a/examples/oft-main/.nvmrc b/examples/oft-main/.nvmrc
new file mode 100644
index 0000000000..549a5d7006
--- /dev/null
+++ b/examples/oft-main/.nvmrc
@@ -0,0 +1 @@
+v20.19.5
\ No newline at end of file
diff --git a/examples/oft-main/.prettierignore b/examples/oft-main/.prettierignore
new file mode 100644
index 0000000000..638b9f31f7
--- /dev/null
+++ b/examples/oft-main/.prettierignore
@@ -0,0 +1,14 @@
+.anchor
+.turbo
+node_modules/
+target
+artifacts/
+cache/
+dist/
+out/
+*.log
+*ignore
+*.yaml
+*.lock
+package-lock.json
+package.json
\ No newline at end of file
diff --git a/examples/oft-main/.prettierrc.js b/examples/oft-main/.prettierrc.js
new file mode 100644
index 0000000000..6f55b4019a
--- /dev/null
+++ b/examples/oft-main/.prettierrc.js
@@ -0,0 +1,3 @@
+module.exports = {
+ ...require('@layerzerolabs/prettier-config-next'),
+};
diff --git a/examples/oft-main/.solhintrc.js b/examples/oft-main/.solhintrc.js
new file mode 100644
index 0000000000..102eae347a
--- /dev/null
+++ b/examples/oft-main/.solhintrc.js
@@ -0,0 +1,3 @@
+module.exports = {
+ extends: ['solhint:recommended', require.resolve('@layerzerolabs/solhint-config')],
+};
diff --git a/examples/oft-main/Anchor.toml b/examples/oft-main/Anchor.toml
new file mode 100644
index 0000000000..dfd19e5a98
--- /dev/null
+++ b/examples/oft-main/Anchor.toml
@@ -0,0 +1,20 @@
+[toolchain]
+anchor_version = "0.31.1"
+
+[features]
+seeds = false
+resolution = false
+skip-lint = false
+
+[programs.localnet]
+oft = "G2BYTnfGCMQAErMZkTBCFSapKevzf6QCjizjXi8hFEtJ"
+
+[registry]
+url = "https://api.apr.dev"
+
+[provider]
+cluster = "Localnet"
+wallet = "./junk-id.json"
+
+[scripts]
+test = "npx jest test/anchor"
diff --git a/examples/oft-main/CHANGELOG.md b/examples/oft-main/CHANGELOG.md
new file mode 100644
index 0000000000..8ba26f063d
--- /dev/null
+++ b/examples/oft-main/CHANGELOG.md
@@ -0,0 +1,352 @@
+# @layerzerolabs/oft-main-example
+
+## 0.12.11
+
+### Patch Changes
+
+- ba9762f: update debug script
+
+## 0.12.10
+
+### Patch Changes
+
+- 7dbac78: update nodejs version
+
+## 0.12.9
+
+### Patch Changes
+
+- 9ec1a69: oft-solana example: add rate limit print and add support for token2022 metadata
+- d720011: oft-solana: require user to confirm max total token supply given a local decimals value
+- d720011: print max supply given solana local decimals
+
+## 0.12.8
+
+### Patch Changes
+
+- ccc14e0: fix default ALTs not used
+
+## 0.12.7
+
+### Patch Changes
+
+- 7ef51d7: bump up versions for anchor, solana, rust
+
+## 0.12.6
+
+### Patch Changes
+
+- 39ddee8: remove usage of MyOFTMock
+
+## 0.12.5
+
+### Patch Changes
+
+- 77ba155: update links
+- 87dd61e: updateMetadata supports when Update Authority is a Multisig
+
+## 0.12.4
+
+### Patch Changes
+
+- 002caa2: Add support for multiple ALTs when sending OFTs from Solana, fix extra options and compose message parsing bugs
+
+## 0.12.3
+
+### Patch Changes
+
+- d34cbbd: add nonce account check to debug script
+- d34cbbd: debug script displays dvn name
+
+## 0.12.2
+
+### Patch Changes
+
+- e415855: rename retryPayload to retryMessage
+- d48633e: fix oft-solana's debug script when peers are checked
+- c44e657: update evm network used
+
+## 0.12.1
+
+### Patch Changes
+
+- 5e15a8d: Add lockfiles to example packages
+
+## 0.12.0
+
+### Minor Changes
+
+- 5c0a0a1: created tasks for endpoint methods
+
+## 0.11.4
+
+### Patch Changes
+
+- 2358dd5: Add prompt when sending tokens without extra options and no enforced options.
+
+## 0.11.3
+
+### Patch Changes
+
+- 49f5dcd: Fix the handling of initSendLibrary and initReceiveLibrary to properly initialize in the init step rather than during setPeer
+
+## 0.11.2
+
+### Patch Changes
+
+- 368b4b4: oft-solana: introduce named variables and use exact value for sending to Solana
+
+## 0.11.1
+
+### Patch Changes
+
+- 5542063: Adding ability to wire Solana to Aptos
+
+## 0.11.0
+
+### Minor Changes
+
+- f228dfe: refactor(solana): internalize account checker and priority fee getter
+
+## 0.10.0
+
+### Minor Changes
+
+- bb62f09: Moved logging info to io-devtools package
+
+## 0.9.0
+
+### Minor Changes
+
+- 1596719: fix(solana examples): fix bug where evm contract object is treated as solana
+- 27cdcb4: feat(solana examples): support freeze authority param for createOFT script
+
+### Patch Changes
+
+- eb6d163: refactor logger helpers; export `DebugLogger` from `io-devtools`; update example imports
+
+## 0.8.0
+
+### Minor Changes
+
+- f5980f4: Normalized the send task so that EVM and Solana share identical send logic, along with logging
+
+## 0.7.15
+
+### Patch Changes
+
+- 74ac06c: Adds a lookup table address to the quote instruction in sendOFT. While not breaking, errors can be thrown due to tx size if the OFT uses more than the standard 2 DVNs.
+
+## 0.7.14
+
+### Patch Changes
+
+- eba3669: Rename clear script to retry-payload
+
+## 0.7.13
+
+### Patch Changes
+
+- 4ff1db8: feat(oft-solana): remove need for manual solana endpoint ID input
+- 28eb8be: feat(oft-solana): support loading keypair via path
+- 0385135: fix import in setInboundRateLimit
+
+## 0.7.12
+
+### Patch Changes
+
+- 292803d: introduce fix suggestions, starting with when Solana init-config is skipped
+
+## 0.7.11
+
+### Patch Changes
+
+- 8817095: Add the ability to filter out connections from specified EndpointIds
+
+## 0.7.10
+
+### Patch Changes
+
+- 8b6c422: Bump monorepo dependencies to latest patch version
+
+## 0.7.9
+
+### Patch Changes
+
+- a843edf: Debugging Hardhat tasks
+
+## 0.7.8
+
+### Patch Changes
+
+- ce3a36b: introduce getSolanaDeploymentFunction and simplify solana task params
+
+## 0.7.7
+
+### Patch Changes
+
+- e4f8538: feat(oft-solana): remove need to pass in solana secret key flag
+
+## 0.7.6
+
+### Patch Changes
+
+- e256387: Updating packages
+
+## 0.7.5
+
+### Patch Changes
+
+- fe71c0e: fix typo and mention how to transfer ownership
+
+## 0.7.4
+
+### Patch Changes
+
+- 6bbe466: move solana init to own script and update task name
+
+## 0.7.3
+
+### Patch Changes
+
+- e5fffc3: fix import in createOFT.ts
+- fcf924d: docs: default to using solana 1.18
+
+## 0.7.2
+
+### Patch Changes
+
+- 274b8aa: Add task to get Solana rate limits
+
+## 0.7.1
+
+### Patch Changes
+
+- 213a76b: Enable optimizer explicitly
+
+## 0.7.0
+
+### Minor Changes
+
+- 57a80a8: added script to update metaplex metadata
+
+## 0.6.0
+
+### Minor Changes
+
+- 1ce802a: oft-solana - throw if trying to send more than owned
+
+## 0.5.1
+
+### Patch Changes
+
+- 12eaa61: oft-solana(getSimulationComputeUnits): increase backoff max delay from 3s to 10s
+
+## 0.5.0
+
+### Minor Changes
+
+- 4af9800: fallback for getSimulationComputeUnits
+
+## 0.4.9
+
+### Patch Changes
+
+- a2ecefd: fix missing return statement when user chooses no to 'continue with onlyOftStore'
+
+## 0.4.8
+
+### Patch Changes
+
+- af91805: Bump to lz-definitions 3.0.59+
+
+## 0.4.7
+
+### Patch Changes
+
+- ce03876: Get latest EndpointIds by bumping lz-definitions
+
+## 0.4.6
+
+### Patch Changes
+
+- d1d51ef: Bump ua-devtools-evm-hardhat dependency to 6.0.6+
+
+## 0.4.5
+
+### Patch Changes
+
+- 1d2abff: new SDK methods, tests in devtools-ton, upgraded lz-definitions
+
+## 0.4.4
+
+### Patch Changes
+
+- 1bb0524: Upgraded dependency (@layerzerolabs/lz-definitions 3.0.12->3.0.21)
+
+## 0.4.3
+
+### Patch Changes
+
+- 447af65: Use concurrently for parallel compilation task
+
+## 0.4.2
+
+### Patch Changes
+
+- 59cd485: Fix add additional minters to createOFT
+
+## 0.4.1
+
+### Patch Changes
+
+- 63238e9: Add ability to swap out the mint authority with a new SPL multisig
+
+## 0.4.0
+
+### Minor Changes
+
+- e2395b5: Add OApp Read Example
+
+## 0.3.1
+
+### Patch Changes
+
+- 2540bb1: solana support for lz:oapp:config:get
+
+## 0.3.0
+
+### Minor Changes
+
+- aa37daf: Update layerzerolabs packages to 3.0.12
+
+## 0.2.1
+
+### Patch Changes
+
+- ff5972b: Fix createOFT should allow 0 amount
+
+## 0.2.0
+
+### Minor Changes
+
+- ccba37b: Bump for solana oftv2
+
+### Patch Changes
+
+- 019cd52: Bump for new Solana Implementation Version
+- 4ca5233: Enable squadsv4 CLI support
+
+## 0.1.5
+
+### Patch Changes
+
+- f34f4fe: Add support for Token2022 and housecleaning
+- 33ff07d: Fix refund address for EVM send script
+- e59f693: Resolves Issue 926, allowing createOFT to have amount=0
+
+## 0.1.4
+
+### Patch Changes
+
+- 6a07bb7: New solana OFT reference
diff --git a/examples/oft-main/Cargo.lock b/examples/oft-main/Cargo.lock
new file mode 100644
index 0000000000..84f26dc083
--- /dev/null
+++ b/examples/oft-main/Cargo.lock
@@ -0,0 +1,2989 @@
+# This file is automatically @generated by Cargo.
+# It is not intended for manual editing.
+version = 4
+
+[[package]]
+name = "aead"
+version = "0.5.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "d122413f284cf2d62fb1b7db97e02edb8cda96d769b16e443a4f6195e35662b0"
+dependencies = [
+ "crypto-common",
+ "generic-array",
+]
+
+[[package]]
+name = "aes"
+version = "0.8.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "b169f7a6d4742236a0a00c541b845991d0ac43e546831af1249753ab4c3aa3a0"
+dependencies = [
+ "cfg-if",
+ "cipher",
+ "cpufeatures",
+]
+
+[[package]]
+name = "aes-gcm-siv"
+version = "0.11.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "ae0784134ba9375416d469ec31e7c5f9fa94405049cf08c5ce5b4698be673e0d"
+dependencies = [
+ "aead",
+ "aes",
+ "cipher",
+ "ctr",
+ "polyval",
+ "subtle",
+ "zeroize",
+]
+
+[[package]]
+name = "ahash"
+version = "0.8.12"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "5a15f179cd60c4584b8a8c596927aadc462e27f2ca70c04e0071964a73ba7a75"
+dependencies = [
+ "cfg-if",
+ "once_cell",
+ "version_check",
+ "zerocopy",
+]
+
+[[package]]
+name = "aho-corasick"
+version = "1.1.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "8e60d3430d3a69478ad0993f19238d2df97c507009a52b3c10addcd7f6bcb916"
+dependencies = [
+ "memchr",
+]
+
+[[package]]
+name = "anchor-attribute-access-control"
+version = "0.31.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "3f70fd141a4d18adf11253026b32504f885447048c7494faf5fa83b01af9c0cf"
+dependencies = [
+ "anchor-syn",
+ "proc-macro2",
+ "quote",
+ "syn 1.0.109",
+]
+
+[[package]]
+name = "anchor-attribute-account"
+version = "0.31.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "715a261c57c7679581e06f07a74fa2af874ac30f86bd8ea07cca4a7e5388a064"
+dependencies = [
+ "anchor-syn",
+ "bs58",
+ "proc-macro2",
+ "quote",
+ "syn 1.0.109",
+]
+
+[[package]]
+name = "anchor-attribute-constant"
+version = "0.31.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "730d6df8ae120321c5c25e0779e61789e4b70dc8297102248902022f286102e4"
+dependencies = [
+ "anchor-syn",
+ "quote",
+ "syn 1.0.109",
+]
+
+[[package]]
+name = "anchor-attribute-error"
+version = "0.31.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "27e6e449cc3a37b2880b74dcafb8e5a17b954c0e58e376432d7adc646fb333ef"
+dependencies = [
+ "anchor-syn",
+ "quote",
+ "syn 1.0.109",
+]
+
+[[package]]
+name = "anchor-attribute-event"
+version = "0.31.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "d7710e4c54adf485affcd9be9adec5ef8846d9c71d7f31e16ba86ff9fc1dd49f"
+dependencies = [
+ "anchor-syn",
+ "proc-macro2",
+ "quote",
+ "syn 1.0.109",
+]
+
+[[package]]
+name = "anchor-attribute-program"
+version = "0.31.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "05ecfd49b2aeadeb32f35262230db402abed76ce87e27562b34f61318b2ec83c"
+dependencies = [
+ "anchor-lang-idl",
+ "anchor-syn",
+ "anyhow",
+ "bs58",
+ "heck",
+ "proc-macro2",
+ "quote",
+ "serde_json",
+ "syn 1.0.109",
+]
+
+[[package]]
+name = "anchor-derive-accounts"
+version = "0.31.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "be89d160793a88495af462a7010b3978e48e30a630c91de47ce2c1d3cb7a6149"
+dependencies = [
+ "anchor-syn",
+ "quote",
+ "syn 1.0.109",
+]
+
+[[package]]
+name = "anchor-derive-serde"
+version = "0.31.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "abc6ee78acb7bfe0c2dd2abc677aaa4789c0281a0c0ef01dbf6fe85e0fd9e6e4"
+dependencies = [
+ "anchor-syn",
+ "borsh-derive-internal",
+ "proc-macro2",
+ "quote",
+ "syn 1.0.109",
+]
+
+[[package]]
+name = "anchor-derive-space"
+version = "0.31.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "134a01c0703f6fd355a0e472c033f6f3e41fac1ef6e370b20c50f4c8d022cea7"
+dependencies = [
+ "proc-macro2",
+ "quote",
+ "syn 1.0.109",
+]
+
+[[package]]
+name = "anchor-lang"
+version = "0.31.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "e6bab117055905e930f762c196e08f861f8dfe7241b92cee46677a3b15561a0a"
+dependencies = [
+ "anchor-attribute-access-control",
+ "anchor-attribute-account",
+ "anchor-attribute-constant",
+ "anchor-attribute-error",
+ "anchor-attribute-event",
+ "anchor-attribute-program",
+ "anchor-derive-accounts",
+ "anchor-derive-serde",
+ "anchor-derive-space",
+ "anchor-lang-idl",
+ "base64 0.21.7",
+ "bincode",
+ "borsh 0.10.4",
+ "bytemuck",
+ "solana-program",
+ "thiserror 1.0.69",
+]
+
+[[package]]
+name = "anchor-lang-idl"
+version = "0.1.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "32e8599d21995f68e296265aa5ab0c3cef582fd58afec014d01bd0bce18a4418"
+dependencies = [
+ "anchor-lang-idl-spec",
+ "anyhow",
+ "heck",
+ "regex",
+ "serde",
+ "serde_json",
+ "sha2 0.10.9",
+]
+
+[[package]]
+name = "anchor-lang-idl-spec"
+version = "0.1.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "2bdf143115440fe621bdac3a29a1f7472e09f6cd82b2aa569429a0c13f103838"
+dependencies = [
+ "anyhow",
+ "serde",
+]
+
+[[package]]
+name = "anchor-spl"
+version = "0.31.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "3c08cb5d762c0694f74bd02c9a5b04ea53cefc496e2c27b3234acffca5cd076b"
+dependencies = [
+ "anchor-lang",
+ "spl-associated-token-account",
+ "spl-pod",
+ "spl-token",
+ "spl-token-2022",
+ "spl-token-group-interface",
+ "spl-token-metadata-interface",
+]
+
+[[package]]
+name = "anchor-syn"
+version = "0.31.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "5dc7a6d90cc643df0ed2744862cdf180587d1e5d28936538c18fc8908489ed67"
+dependencies = [
+ "anyhow",
+ "bs58",
+ "cargo_toml",
+ "heck",
+ "proc-macro2",
+ "quote",
+ "serde",
+ "serde_json",
+ "sha2 0.10.9",
+ "syn 1.0.109",
+ "thiserror 1.0.69",
+]
+
+[[package]]
+name = "anyhow"
+version = "1.0.99"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "b0674a1ddeecb70197781e945de4b3b8ffb61fa939a5597bcf48503737663100"
+
+[[package]]
+name = "arrayref"
+version = "0.3.9"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "76a2e8124351fda1ef8aaaa3bbd7ebbcb486bbcd4225aca0aa0d84bb2db8fecb"
+
+[[package]]
+name = "arrayvec"
+version = "0.7.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "7c02d123df017efcdfbd739ef81735b36c5ba83ec3c59c80a9d7ecc718f92e50"
+
+[[package]]
+name = "autocfg"
+version = "1.5.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "c08606f8c3cbf4ce6ec8e28fb0014a2c086708fe954eaa885384a6165172e7e8"
+
+[[package]]
+name = "base64"
+version = "0.12.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "3441f0f7b02788e948e47f457ca01f1d7e6d92c693bc132c22b087d3141c03ff"
+
+[[package]]
+name = "base64"
+version = "0.21.7"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "9d297deb1925b89f2ccc13d7635fa0714f12c87adce1c75356b39ca9b7178567"
+
+[[package]]
+name = "base64"
+version = "0.22.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "72b3254f16251a8381aa12e40e3c4d2f0199f8c6508fbecb9d91f575e0fbb8c6"
+
+[[package]]
+name = "bincode"
+version = "1.3.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "b1f45e9417d87227c7a56d22e471c6206462cba514c7590c09aff4cf6d1ddcad"
+dependencies = [
+ "serde",
+]
+
+[[package]]
+name = "bitflags"
+version = "2.9.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "34efbcccd345379ca2868b2b2c9d3782e9cc58ba87bc7d79d5b53d9c9ae6f25d"
+
+[[package]]
+name = "blake3"
+version = "1.8.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "3888aaa89e4b2a40fca9848e400f6a658a5a3978de7be858e209cafa8be9a4a0"
+dependencies = [
+ "arrayref",
+ "arrayvec",
+ "cc",
+ "cfg-if",
+ "constant_time_eq",
+ "digest 0.10.7",
+]
+
+[[package]]
+name = "block-buffer"
+version = "0.9.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "4152116fd6e9dadb291ae18fc1ec3575ed6d84c29642d97890f4b4a3417297e4"
+dependencies = [
+ "generic-array",
+]
+
+[[package]]
+name = "block-buffer"
+version = "0.10.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "3078c7629b62d3f0439517fa394996acacc5cbc91c5a20d8c658e77abd503a71"
+dependencies = [
+ "generic-array",
+]
+
+[[package]]
+name = "borsh"
+version = "0.10.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "115e54d64eb62cdebad391c19efc9dce4981c690c85a33a12199d99bb9546fee"
+dependencies = [
+ "borsh-derive 0.10.4",
+ "hashbrown 0.13.2",
+]
+
+[[package]]
+name = "borsh"
+version = "1.5.7"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "ad8646f98db542e39fc66e68a20b2144f6a732636df7c2354e74645faaa433ce"
+dependencies = [
+ "borsh-derive 1.5.7",
+ "cfg_aliases",
+]
+
+[[package]]
+name = "borsh-derive"
+version = "0.10.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "831213f80d9423998dd696e2c5345aba6be7a0bd8cd19e31c5243e13df1cef89"
+dependencies = [
+ "borsh-derive-internal",
+ "borsh-schema-derive-internal",
+ "proc-macro-crate 0.1.5",
+ "proc-macro2",
+ "syn 1.0.109",
+]
+
+[[package]]
+name = "borsh-derive"
+version = "1.5.7"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "fdd1d3c0c2f5833f22386f252fe8ed005c7f59fdcddeef025c01b4c3b9fd9ac3"
+dependencies = [
+ "once_cell",
+ "proc-macro-crate 3.3.0",
+ "proc-macro2",
+ "quote",
+ "syn 2.0.106",
+]
+
+[[package]]
+name = "borsh-derive-internal"
+version = "0.10.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "65d6ba50644c98714aa2a70d13d7df3cd75cd2b523a2b452bf010443800976b3"
+dependencies = [
+ "proc-macro2",
+ "quote",
+ "syn 1.0.109",
+]
+
+[[package]]
+name = "borsh-schema-derive-internal"
+version = "0.10.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "276691d96f063427be83e6692b86148e488ebba9f48f77788724ca027ba3b6d4"
+dependencies = [
+ "proc-macro2",
+ "quote",
+ "syn 1.0.109",
+]
+
+[[package]]
+name = "bs58"
+version = "0.5.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "bf88ba1141d185c399bee5288d850d63b8369520c1eafc32a0430b5b6c287bf4"
+dependencies = [
+ "tinyvec",
+]
+
+[[package]]
+name = "bumpalo"
+version = "3.19.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "46c5e41b57b8bba42a04676d81cb89e9ee8e859a1a66f80a5a72e1cb76b34d43"
+
+[[package]]
+name = "bv"
+version = "0.11.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "8834bb1d8ee5dc048ee3124f2c7c1afcc6bc9aed03f11e9dfd8c69470a5db340"
+dependencies = [
+ "feature-probe",
+ "serde",
+]
+
+[[package]]
+name = "bytemuck"
+version = "1.23.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "3995eaeebcdf32f91f980d360f78732ddc061097ab4e39991ae7a6ace9194677"
+dependencies = [
+ "bytemuck_derive",
+]
+
+[[package]]
+name = "bytemuck_derive"
+version = "1.10.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "4f154e572231cb6ba2bd1176980827e3d5dc04cc183a75dea38109fbdd672d29"
+dependencies = [
+ "proc-macro2",
+ "quote",
+ "syn 2.0.106",
+]
+
+[[package]]
+name = "byteorder"
+version = "1.5.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b"
+
+[[package]]
+name = "cargo_toml"
+version = "0.19.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "a98356df42a2eb1bd8f1793ae4ee4de48e384dd974ce5eac8eee802edb7492be"
+dependencies = [
+ "serde",
+ "toml 0.8.23",
+]
+
+[[package]]
+name = "cc"
+version = "1.2.34"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "42bc4aea80032b7bf409b0bc7ccad88853858911b7713a8062fdc0623867bedc"
+dependencies = [
+ "shlex",
+]
+
+[[package]]
+name = "cfg-if"
+version = "1.0.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "2fd1289c04a9ea8cb22300a459a72a385d7c73d3259e2ed7dcb2af674838cfa9"
+
+[[package]]
+name = "cfg_aliases"
+version = "0.2.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "613afe47fcd5fac7ccf1db93babcb082c5994d996f20b8b159f2ad1658eb5724"
+
+[[package]]
+name = "cipher"
+version = "0.4.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "773f3b9af64447d2ce9850330c473515014aa235e6a783b02db81ff39e4a3dad"
+dependencies = [
+ "crypto-common",
+ "inout",
+]
+
+[[package]]
+name = "console_error_panic_hook"
+version = "0.1.7"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "a06aeb73f470f66dcdbf7223caeebb85984942f22f1adb2a088cf9668146bbbc"
+dependencies = [
+ "cfg-if",
+ "wasm-bindgen",
+]
+
+[[package]]
+name = "console_log"
+version = "0.2.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "e89f72f65e8501878b8a004d5a1afb780987e2ce2b4532c562e367a72c57499f"
+dependencies = [
+ "log",
+ "web-sys",
+]
+
+[[package]]
+name = "constant_time_eq"
+version = "0.3.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "7c74b8349d32d297c9134b8c88677813a227df8f779daa29bfc29c183fe3dca6"
+
+[[package]]
+name = "cpi-helper"
+version = "0.1.0"
+source = "git+https://github.com/LayerZero-Labs/LayerZero-v2.git?rev=34321ac15e47e0dafd25d66659e2f3d1b9b6db8f#34321ac15e47e0dafd25d66659e2f3d1b9b6db8f"
+dependencies = [
+ "bs58",
+ "proc-macro2",
+ "quote",
+ "syn 1.0.109",
+]
+
+[[package]]
+name = "cpi-helper"
+version = "0.1.0"
+source = "git+https://github.com/LayerZero-Labs/LayerZero-v2.git?rev=c09287a#c09287a8b1f236fcc057f474d8a773a0fb7758df"
+dependencies = [
+ "bs58",
+ "proc-macro2",
+ "quote",
+ "syn 1.0.109",
+]
+
+[[package]]
+name = "cpufeatures"
+version = "0.2.17"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "59ed5838eebb26a2bb2e58f6d5b5316989ae9d08bab10e0e6d103e656d1b0280"
+dependencies = [
+ "libc",
+]
+
+[[package]]
+name = "crunchy"
+version = "0.2.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "460fbee9c2c2f33933d720630a6a0bac33ba7053db5344fac858d4b8952d77d5"
+
+[[package]]
+name = "crypto-common"
+version = "0.1.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "1bfb12502f3fc46cca1bb51ac28df9d618d813cdc3d2f25b9fe775a34af26bb3"
+dependencies = [
+ "generic-array",
+ "rand_core 0.6.4",
+ "typenum",
+]
+
+[[package]]
+name = "ctr"
+version = "0.9.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "0369ee1ad671834580515889b80f2ea915f23b8be8d0daa4bbaf2ac5c7590835"
+dependencies = [
+ "cipher",
+]
+
+[[package]]
+name = "curve25519-dalek"
+version = "4.1.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "97fb8b7c4503de7d6ae7b42ab72a5a59857b4c937ec27a3d4539dba95b5ab2be"
+dependencies = [
+ "cfg-if",
+ "cpufeatures",
+ "curve25519-dalek-derive",
+ "digest 0.10.7",
+ "fiat-crypto",
+ "rand_core 0.6.4",
+ "rustc_version",
+ "serde",
+ "subtle",
+ "zeroize",
+]
+
+[[package]]
+name = "curve25519-dalek-derive"
+version = "0.1.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "f46882e17999c6cc590af592290432be3bce0428cb0d5f8b6715e4dc7b383eb3"
+dependencies = [
+ "proc-macro2",
+ "quote",
+ "syn 2.0.106",
+]
+
+[[package]]
+name = "derivation-path"
+version = "0.2.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "6e5c37193a1db1d8ed868c03ec7b152175f26160a5b740e5e484143877e0adf0"
+
+[[package]]
+name = "digest"
+version = "0.9.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "d3dd60d1080a57a05ab032377049e0591415d2b31afd7028356dbf3cc6dcb066"
+dependencies = [
+ "generic-array",
+]
+
+[[package]]
+name = "digest"
+version = "0.10.7"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "9ed9a281f7bc9b7576e61468ba615a66a5c8cfdff42420a70aa82701a3b1e292"
+dependencies = [
+ "block-buffer 0.10.4",
+ "crypto-common",
+ "subtle",
+]
+
+[[package]]
+name = "either"
+version = "1.15.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "48c757948c5ede0e46177b7add2e67155f70e33c07fea8284df6576da70b3719"
+
+[[package]]
+name = "endpoint-interface"
+version = "0.1.0"
+source = "git+https://github.com/LayerZero-Labs/LayerZero-v2.git?rev=c09287a#c09287a8b1f236fcc057f474d8a773a0fb7758df"
+dependencies = [
+ "anchor-lang",
+ "cpi-helper 0.1.0 (git+https://github.com/LayerZero-Labs/LayerZero-v2.git?rev=c09287a)",
+ "messagelib-interface-latest",
+ "solana-helper",
+ "utils-latest",
+]
+
+[[package]]
+name = "endpoint-mock"
+version = "0.1.0"
+dependencies = [
+ "anchor-lang",
+ "cpi-helper 0.1.0 (git+https://github.com/LayerZero-Labs/LayerZero-v2.git?rev=34321ac15e47e0dafd25d66659e2f3d1b9b6db8f)",
+]
+
+[[package]]
+name = "equivalent"
+version = "1.0.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "877a4ace8713b0bcf2a4e7eec82529c029f1d0619886d18145fea96c3ffe5c0f"
+
+[[package]]
+name = "feature-probe"
+version = "0.1.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "835a3dc7d1ec9e75e2b5fb4ba75396837112d2060b03f7d43bc1897c7f7211da"
+
+[[package]]
+name = "fiat-crypto"
+version = "0.2.9"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "28dea519a9695b9977216879a3ebfddf92f1c08c05d984f8996aecd6ecdc811d"
+
+[[package]]
+name = "five8"
+version = "0.2.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "a75b8549488b4715defcb0d8a8a1c1c76a80661b5fa106b4ca0e7fce59d7d875"
+dependencies = [
+ "five8_core",
+]
+
+[[package]]
+name = "five8_const"
+version = "0.1.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "26dec3da8bc3ef08f2c04f61eab298c3ab334523e55f076354d6d6f613799a7b"
+dependencies = [
+ "five8_core",
+]
+
+[[package]]
+name = "five8_core"
+version = "0.1.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "2551bf44bc5f776c15044b9b94153a00198be06743e262afaaa61f11ac7523a5"
+
+[[package]]
+name = "fnv"
+version = "1.0.7"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1"
+
+[[package]]
+name = "generic-array"
+version = "0.14.7"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "85649ca51fd72272d7821adaf274ad91c288277713d9c18820d8499a7ff69e9a"
+dependencies = [
+ "typenum",
+ "version_check",
+]
+
+[[package]]
+name = "getrandom"
+version = "0.1.16"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "8fc3cb4d91f53b50155bdcfd23f6a4c39ae1969c2ae85982b135750cccaf5fce"
+dependencies = [
+ "cfg-if",
+ "libc",
+ "wasi 0.9.0+wasi-snapshot-preview1",
+]
+
+[[package]]
+name = "getrandom"
+version = "0.2.16"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "335ff9f135e4384c8150d6f27c6daed433577f86b4750418338c01a1a2528592"
+dependencies = [
+ "cfg-if",
+ "js-sys",
+ "libc",
+ "wasi 0.11.1+wasi-snapshot-preview1",
+ "wasm-bindgen",
+]
+
+[[package]]
+name = "hashbrown"
+version = "0.13.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "43a3c133739dddd0d2990f9a4bdf8eb4b21ef50e4851ca85ab661199821d510e"
+dependencies = [
+ "ahash",
+]
+
+[[package]]
+name = "hashbrown"
+version = "0.15.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "9229cfe53dfd69f0609a49f65461bd93001ea1ef889cd5529dd176593f5338a1"
+
+[[package]]
+name = "heck"
+version = "0.3.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "6d621efb26863f0e9924c6ac577e8275e5e6b77455db64ffa6c65c904e9e132c"
+dependencies = [
+ "unicode-segmentation",
+]
+
+[[package]]
+name = "hmac"
+version = "0.12.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "6c49c37c09c17a53d937dfbb742eb3a961d65a994e6bcdcf37e7399d0cc8ab5e"
+dependencies = [
+ "digest 0.10.7",
+]
+
+[[package]]
+name = "indexmap"
+version = "2.11.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "f2481980430f9f78649238835720ddccc57e52df14ffce1c6f37391d61b563e9"
+dependencies = [
+ "equivalent",
+ "hashbrown 0.15.5",
+]
+
+[[package]]
+name = "inout"
+version = "0.1.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "879f10e63c20629ecabbb64a8010319738c66a5cd0c29b02d63d272b03751d01"
+dependencies = [
+ "generic-array",
+]
+
+[[package]]
+name = "itertools"
+version = "0.12.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "ba291022dbbd398a455acf126c1e341954079855bc60dfdda641363bd6922569"
+dependencies = [
+ "either",
+]
+
+[[package]]
+name = "itoa"
+version = "1.0.15"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "4a5f13b858c8d314ee3e8f639011f7ccefe71f97f96e50151fb991f267928e2c"
+
+[[package]]
+name = "js-sys"
+version = "0.3.77"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "1cfaf33c695fc6e08064efbc1f72ec937429614f25eef83af942d0e227c3a28f"
+dependencies = [
+ "once_cell",
+ "wasm-bindgen",
+]
+
+[[package]]
+name = "keccak"
+version = "0.1.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "ecc2af9a1119c51f12a14607e783cb977bde58bc069ff0c3da1095e635d70654"
+dependencies = [
+ "cpufeatures",
+]
+
+[[package]]
+name = "lazy_static"
+version = "1.5.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "bbd2bcb4c963f2ddae06a2efc7e9f3591312473c50c6685e1f298068316e66fe"
+
+[[package]]
+name = "libc"
+version = "0.2.175"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "6a82ae493e598baaea5209805c49bbf2ea7de956d50d7da0da1164f9c6d28543"
+
+[[package]]
+name = "libsecp256k1"
+version = "0.6.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "c9d220bc1feda2ac231cb78c3d26f27676b8cf82c96971f7aeef3d0cf2797c73"
+dependencies = [
+ "arrayref",
+ "base64 0.12.3",
+ "digest 0.9.0",
+ "libsecp256k1-core",
+ "libsecp256k1-gen-ecmult",
+ "libsecp256k1-gen-genmult",
+ "rand 0.7.3",
+ "serde",
+ "sha2 0.9.9",
+]
+
+[[package]]
+name = "libsecp256k1-core"
+version = "0.2.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "d0f6ab710cec28cef759c5f18671a27dae2a5f952cdaaee1d8e2908cb2478a80"
+dependencies = [
+ "crunchy",
+ "digest 0.9.0",
+ "subtle",
+]
+
+[[package]]
+name = "libsecp256k1-gen-ecmult"
+version = "0.2.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "ccab96b584d38fac86a83f07e659f0deafd0253dc096dab5a36d53efe653c5c3"
+dependencies = [
+ "libsecp256k1-core",
+]
+
+[[package]]
+name = "libsecp256k1-gen-genmult"
+version = "0.2.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "67abfe149395e3aa1c48a2beb32b068e2334402df8181f818d3aee2b304c4f5d"
+dependencies = [
+ "libsecp256k1-core",
+]
+
+[[package]]
+name = "lock_api"
+version = "0.4.13"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "96936507f153605bddfcda068dd804796c84324ed2510809e5b2a624c81da765"
+dependencies = [
+ "autocfg",
+ "scopeguard",
+]
+
+[[package]]
+name = "log"
+version = "0.4.27"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "13dc2df351e3202783a1fe0d44375f7295ffb4049267b0f3018346dc122a1d94"
+
+[[package]]
+name = "memchr"
+version = "2.7.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "32a282da65faaf38286cf3be983213fcf1d2e2a58700e808f83f4ea9a4804bc0"
+
+[[package]]
+name = "memoffset"
+version = "0.9.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "488016bfae457b036d996092f6cb448677611ce4449e970ceaf42695203f218a"
+dependencies = [
+ "autocfg",
+]
+
+[[package]]
+name = "merlin"
+version = "3.0.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "58c38e2799fc0978b65dfff8023ec7843e2330bb462f19198840b34b6582397d"
+dependencies = [
+ "byteorder",
+ "keccak",
+ "rand_core 0.6.4",
+ "zeroize",
+]
+
+[[package]]
+name = "messagelib-interface-latest"
+version = "0.1.0"
+source = "git+https://github.com/LayerZero-Labs/LayerZero-v2.git?rev=c09287a#c09287a8b1f236fcc057f474d8a773a0fb7758df"
+dependencies = [
+ "anchor-lang",
+]
+
+[[package]]
+name = "num-bigint"
+version = "0.4.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "a5e44f723f1133c9deac646763579fdb3ac745e418f2a7af9cd0c431da1f20b9"
+dependencies = [
+ "num-integer",
+ "num-traits",
+]
+
+[[package]]
+name = "num-derive"
+version = "0.4.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "ed3955f1a9c7c0c15e092f9c887db08b1fc683305fdf6eb6684f22555355e202"
+dependencies = [
+ "proc-macro2",
+ "quote",
+ "syn 2.0.106",
+]
+
+[[package]]
+name = "num-integer"
+version = "0.1.46"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "7969661fd2958a5cb096e56c8e1ad0444ac2bbcd0061bd28660485a44879858f"
+dependencies = [
+ "num-traits",
+]
+
+[[package]]
+name = "num-traits"
+version = "0.2.19"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "071dfc062690e90b734c0b2273ce72ad0ffa95f0c74596bc250dcfd960262841"
+dependencies = [
+ "autocfg",
+]
+
+[[package]]
+name = "num_enum"
+version = "0.7.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "a973b4e44ce6cad84ce69d797acf9a044532e4184c4f267913d1b546a0727b7a"
+dependencies = [
+ "num_enum_derive",
+ "rustversion",
+]
+
+[[package]]
+name = "num_enum_derive"
+version = "0.7.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "77e878c846a8abae00dd069496dbe8751b16ac1c3d6bd2a7283a938e8228f90d"
+dependencies = [
+ "proc-macro-crate 3.3.0",
+ "proc-macro2",
+ "quote",
+ "syn 2.0.106",
+]
+
+[[package]]
+name = "oapp-latest"
+version = "0.2.0"
+source = "git+https://github.com/LayerZero-Labs/LayerZero-v2.git?rev=c09287a#c09287a8b1f236fcc057f474d8a773a0fb7758df"
+dependencies = [
+ "anchor-lang",
+ "endpoint-interface",
+]
+
+[[package]]
+name = "oft"
+version = "0.1.0"
+dependencies = [
+ "anchor-lang",
+ "anchor-spl",
+ "oapp-latest",
+ "solana-helper",
+ "utils-latest",
+]
+
+[[package]]
+name = "once_cell"
+version = "1.21.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "42f5e15c9953c5e4ccceeb2e7382a716482c34515315f7b03532b8b4e8393d2d"
+
+[[package]]
+name = "opaque-debug"
+version = "0.3.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "c08d65885ee38876c4f86fa503fb49d7b507c2b62552df7c70b2fce627e06381"
+
+[[package]]
+name = "parking_lot"
+version = "0.12.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "70d58bf43669b5795d1576d0641cfb6fbb2057bf629506267a92807158584a13"
+dependencies = [
+ "lock_api",
+ "parking_lot_core",
+]
+
+[[package]]
+name = "parking_lot_core"
+version = "0.9.11"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "bc838d2a56b5b1a6c25f55575dfc605fabb63bb2365f6c2353ef9159aa69e4a5"
+dependencies = [
+ "cfg-if",
+ "libc",
+ "redox_syscall",
+ "smallvec",
+ "windows-targets",
+]
+
+[[package]]
+name = "pbkdf2"
+version = "0.11.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "83a0692ec44e4cf1ef28ca317f14f8f07da2d95ec3fa01f86e4467b725e60917"
+dependencies = [
+ "digest 0.10.7",
+]
+
+[[package]]
+name = "percent-encoding"
+version = "2.3.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "9b4f627cb1b25917193a259e49bdad08f671f8d9708acfd5fe0a8c1455d87220"
+
+[[package]]
+name = "polyval"
+version = "0.6.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "9d1fe60d06143b2430aa532c94cfe9e29783047f06c0d7fd359a9a51b729fa25"
+dependencies = [
+ "cfg-if",
+ "cpufeatures",
+ "opaque-debug",
+ "universal-hash",
+]
+
+[[package]]
+name = "ppv-lite86"
+version = "0.2.21"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "85eae3c4ed2f50dcfe72643da4befc30deadb458a9b590d720cde2f2b1e97da9"
+dependencies = [
+ "zerocopy",
+]
+
+[[package]]
+name = "proc-macro-crate"
+version = "0.1.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "1d6ea3c4595b96363c13943497db34af4460fb474a95c43f4446ad341b8c9785"
+dependencies = [
+ "toml 0.5.11",
+]
+
+[[package]]
+name = "proc-macro-crate"
+version = "3.3.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "edce586971a4dfaa28950c6f18ed55e0406c1ab88bbce2c6f6293a7aaba73d35"
+dependencies = [
+ "toml_edit",
+]
+
+[[package]]
+name = "proc-macro2"
+version = "1.0.101"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "89ae43fd86e4158d6db51ad8e2b80f313af9cc74f5c0e03ccb87de09998732de"
+dependencies = [
+ "unicode-ident",
+]
+
+[[package]]
+name = "qstring"
+version = "0.7.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "d464fae65fff2680baf48019211ce37aaec0c78e9264c84a3e484717f965104e"
+dependencies = [
+ "percent-encoding",
+]
+
+[[package]]
+name = "quote"
+version = "1.0.40"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "1885c039570dc00dcb4ff087a89e185fd56bae234ddc7f056a945bf36467248d"
+dependencies = [
+ "proc-macro2",
+]
+
+[[package]]
+name = "rand"
+version = "0.7.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "6a6b1679d49b24bbfe0c803429aa1874472f50d9b363131f0e89fc356b544d03"
+dependencies = [
+ "getrandom 0.1.16",
+ "libc",
+ "rand_chacha 0.2.2",
+ "rand_core 0.5.1",
+ "rand_hc",
+]
+
+[[package]]
+name = "rand"
+version = "0.8.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "34af8d1a0e25924bc5b7c43c079c942339d8f0a8b57c39049bef581b46327404"
+dependencies = [
+ "libc",
+ "rand_chacha 0.3.1",
+ "rand_core 0.6.4",
+]
+
+[[package]]
+name = "rand_chacha"
+version = "0.2.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "f4c8ed856279c9737206bf725bf36935d8666ead7aa69b52be55af369d193402"
+dependencies = [
+ "ppv-lite86",
+ "rand_core 0.5.1",
+]
+
+[[package]]
+name = "rand_chacha"
+version = "0.3.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "e6c10a63a0fa32252be49d21e7709d4d4baf8d231c2dbce1eaa8141b9b127d88"
+dependencies = [
+ "ppv-lite86",
+ "rand_core 0.6.4",
+]
+
+[[package]]
+name = "rand_core"
+version = "0.5.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "90bde5296fc891b0cef12a6d03ddccc162ce7b2aff54160af9338f8d40df6d19"
+dependencies = [
+ "getrandom 0.1.16",
+]
+
+[[package]]
+name = "rand_core"
+version = "0.6.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c"
+dependencies = [
+ "getrandom 0.2.16",
+]
+
+[[package]]
+name = "rand_hc"
+version = "0.2.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "ca3129af7b92a17112d59ad498c6f81eaf463253766b90396d39ea7a39d6613c"
+dependencies = [
+ "rand_core 0.5.1",
+]
+
+[[package]]
+name = "redox_syscall"
+version = "0.5.17"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "5407465600fb0548f1442edf71dd20683c6ed326200ace4b1ef0763521bb3b77"
+dependencies = [
+ "bitflags",
+]
+
+[[package]]
+name = "regex"
+version = "1.11.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "23d7fd106d8c02486a8d64e778353d1cffe08ce79ac2e82f540c86d0facf6912"
+dependencies = [
+ "aho-corasick",
+ "memchr",
+ "regex-automata",
+ "regex-syntax",
+]
+
+[[package]]
+name = "regex-automata"
+version = "0.4.10"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "6b9458fa0bfeeac22b5ca447c63aaf45f28439a709ccd244698632f9aa6394d6"
+dependencies = [
+ "aho-corasick",
+ "memchr",
+ "regex-syntax",
+]
+
+[[package]]
+name = "regex-syntax"
+version = "0.8.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "caf4aa5b0f434c91fe5c7f1ecb6a5ece2130b02ad2a590589dda5146df959001"
+
+[[package]]
+name = "rustc_version"
+version = "0.4.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "cfcb3a22ef46e85b45de6ee7e79d063319ebb6594faafcf1c225ea92ab6e9b92"
+dependencies = [
+ "semver",
+]
+
+[[package]]
+name = "rustversion"
+version = "1.0.22"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "b39cdef0fa800fc44525c84ccb54a029961a8215f9619753635a9c0d2538d46d"
+
+[[package]]
+name = "ryu"
+version = "1.0.20"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "28d3b2b1366ec20994f1fd18c3c594f05c5dd4bc44d8bb0c1c632c8d6829481f"
+
+[[package]]
+name = "scopeguard"
+version = "1.2.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49"
+
+[[package]]
+name = "semver"
+version = "1.0.26"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "56e6fa9c48d24d85fb3de5ad847117517440f6beceb7798af16b4a87d616b8d0"
+
+[[package]]
+name = "serde"
+version = "1.0.219"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "5f0e2c6ed6606019b4e29e69dbaba95b11854410e5347d525002456dbbb786b6"
+dependencies = [
+ "serde_derive",
+]
+
+[[package]]
+name = "serde_bytes"
+version = "0.11.17"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "8437fd221bde2d4ca316d61b90e337e9e702b3820b87d63caa9ba6c02bd06d96"
+dependencies = [
+ "serde",
+]
+
+[[package]]
+name = "serde_derive"
+version = "1.0.219"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "5b0276cf7f2c73365f7157c8123c21cd9a50fbbd844757af28ca1f5925fc2a00"
+dependencies = [
+ "proc-macro2",
+ "quote",
+ "syn 2.0.106",
+]
+
+[[package]]
+name = "serde_json"
+version = "1.0.143"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "d401abef1d108fbd9cbaebc3e46611f4b1021f714a0597a71f41ee463f5f4a5a"
+dependencies = [
+ "itoa",
+ "memchr",
+ "ryu",
+ "serde",
+]
+
+[[package]]
+name = "serde_spanned"
+version = "0.6.9"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "bf41e0cfaf7226dca15e8197172c295a782857fcb97fad1808a166870dee75a3"
+dependencies = [
+ "serde",
+]
+
+[[package]]
+name = "sha2"
+version = "0.9.9"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "4d58a1e1bf39749807d89cf2d98ac2dfa0ff1cb3faa38fbb64dd88ac8013d800"
+dependencies = [
+ "block-buffer 0.9.0",
+ "cfg-if",
+ "cpufeatures",
+ "digest 0.9.0",
+ "opaque-debug",
+]
+
+[[package]]
+name = "sha2"
+version = "0.10.9"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "a7507d819769d01a365ab707794a4084392c824f54a7a6a7862f8c3d0892b283"
+dependencies = [
+ "cfg-if",
+ "cpufeatures",
+ "digest 0.10.7",
+]
+
+[[package]]
+name = "sha3"
+version = "0.10.8"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "75872d278a8f37ef87fa0ddbda7802605cb18344497949862c0d4dcb291eba60"
+dependencies = [
+ "digest 0.10.7",
+ "keccak",
+]
+
+[[package]]
+name = "shlex"
+version = "1.3.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "0fda2ff0d084019ba4d7c6f371c95d8fd75ce3524c3cb8fb653a3023f6323e64"
+
+[[package]]
+name = "smallvec"
+version = "1.15.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "67b1b7a3b5fe4f1376887184045fcf45c69e92af734b7aaddc05fb777b6fbd03"
+
+[[package]]
+name = "solana-account"
+version = "2.2.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "0f949fe4edaeaea78c844023bfc1c898e0b1f5a100f8a8d2d0f85d0a7b090258"
+dependencies = [
+ "solana-account-info",
+ "solana-clock",
+ "solana-instruction",
+ "solana-pubkey",
+ "solana-sdk-ids",
+]
+
+[[package]]
+name = "solana-account-info"
+version = "2.3.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "c8f5152a288ef1912300fc6efa6c2d1f9bb55d9398eb6c72326360b8063987da"
+dependencies = [
+ "bincode",
+ "serde",
+ "solana-program-error",
+ "solana-program-memory",
+ "solana-pubkey",
+]
+
+[[package]]
+name = "solana-address-lookup-table-interface"
+version = "2.2.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "d1673f67efe870b64a65cb39e6194be5b26527691ce5922909939961a6e6b395"
+dependencies = [
+ "bincode",
+ "bytemuck",
+ "serde",
+ "serde_derive",
+ "solana-clock",
+ "solana-instruction",
+ "solana-pubkey",
+ "solana-sdk-ids",
+ "solana-slot-hashes",
+]
+
+[[package]]
+name = "solana-atomic-u64"
+version = "2.2.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "d52e52720efe60465b052b9e7445a01c17550666beec855cce66f44766697bc2"
+dependencies = [
+ "parking_lot",
+]
+
+[[package]]
+name = "solana-big-mod-exp"
+version = "2.2.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "75db7f2bbac3e62cfd139065d15bcda9e2428883ba61fc8d27ccb251081e7567"
+dependencies = [
+ "num-bigint",
+ "num-traits",
+ "solana-define-syscall",
+]
+
+[[package]]
+name = "solana-bincode"
+version = "2.2.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "19a3787b8cf9c9fe3dd360800e8b70982b9e5a8af9e11c354b6665dd4a003adc"
+dependencies = [
+ "bincode",
+ "serde",
+ "solana-instruction",
+]
+
+[[package]]
+name = "solana-blake3-hasher"
+version = "2.2.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "a1a0801e25a1b31a14494fc80882a036be0ffd290efc4c2d640bfcca120a4672"
+dependencies = [
+ "blake3",
+ "solana-define-syscall",
+ "solana-hash",
+ "solana-sanitize",
+]
+
+[[package]]
+name = "solana-borsh"
+version = "2.2.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "718333bcd0a1a7aed6655aa66bef8d7fb047944922b2d3a18f49cbc13e73d004"
+dependencies = [
+ "borsh 0.10.4",
+ "borsh 1.5.7",
+]
+
+[[package]]
+name = "solana-clock"
+version = "2.2.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "1bb482ab70fced82ad3d7d3d87be33d466a3498eb8aa856434ff3c0dfc2e2e31"
+dependencies = [
+ "serde",
+ "serde_derive",
+ "solana-sdk-ids",
+ "solana-sdk-macro",
+ "solana-sysvar-id",
+]
+
+[[package]]
+name = "solana-cpi"
+version = "2.2.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "8dc71126edddc2ba014622fc32d0f5e2e78ec6c5a1e0eb511b85618c09e9ea11"
+dependencies = [
+ "solana-account-info",
+ "solana-define-syscall",
+ "solana-instruction",
+ "solana-program-error",
+ "solana-pubkey",
+ "solana-stable-layout",
+]
+
+[[package]]
+name = "solana-curve25519"
+version = "2.3.7"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "b162f50499b391b785d57b2f2c73e3b9754d88fd4894bef444960b00bda8dcca"
+dependencies = [
+ "bytemuck",
+ "bytemuck_derive",
+ "curve25519-dalek",
+ "solana-define-syscall",
+ "subtle",
+ "thiserror 2.0.16",
+]
+
+[[package]]
+name = "solana-decode-error"
+version = "2.3.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "8c781686a18db2f942e70913f7ca15dc120ec38dcab42ff7557db2c70c625a35"
+dependencies = [
+ "num-traits",
+]
+
+[[package]]
+name = "solana-define-syscall"
+version = "2.3.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "2ae3e2abcf541c8122eafe9a625d4d194b4023c20adde1e251f94e056bb1aee2"
+
+[[package]]
+name = "solana-derivation-path"
+version = "2.2.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "939756d798b25c5ec3cca10e06212bdca3b1443cb9bb740a38124f58b258737b"
+dependencies = [
+ "derivation-path",
+ "qstring",
+ "uriparse",
+]
+
+[[package]]
+name = "solana-epoch-rewards"
+version = "2.2.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "86b575d3dd323b9ea10bb6fe89bf6bf93e249b215ba8ed7f68f1a3633f384db7"
+dependencies = [
+ "serde",
+ "serde_derive",
+ "solana-hash",
+ "solana-sdk-ids",
+ "solana-sdk-macro",
+ "solana-sysvar-id",
+]
+
+[[package]]
+name = "solana-epoch-schedule"
+version = "2.2.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "3fce071fbddecc55d727b1d7ed16a629afe4f6e4c217bc8d00af3b785f6f67ed"
+dependencies = [
+ "serde",
+ "serde_derive",
+ "solana-sdk-ids",
+ "solana-sdk-macro",
+ "solana-sysvar-id",
+]
+
+[[package]]
+name = "solana-example-mocks"
+version = "2.2.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "84461d56cbb8bb8d539347151e0525b53910102e4bced875d49d5139708e39d3"
+dependencies = [
+ "serde",
+ "serde_derive",
+ "solana-address-lookup-table-interface",
+ "solana-clock",
+ "solana-hash",
+ "solana-instruction",
+ "solana-keccak-hasher",
+ "solana-message",
+ "solana-nonce",
+ "solana-pubkey",
+ "solana-sdk-ids",
+ "solana-system-interface",
+ "thiserror 2.0.16",
+]
+
+[[package]]
+name = "solana-feature-gate-interface"
+version = "2.2.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "43f5c5382b449e8e4e3016fb05e418c53d57782d8b5c30aa372fc265654b956d"
+dependencies = [
+ "bincode",
+ "serde",
+ "serde_derive",
+ "solana-account",
+ "solana-account-info",
+ "solana-instruction",
+ "solana-program-error",
+ "solana-pubkey",
+ "solana-rent",
+ "solana-sdk-ids",
+ "solana-system-interface",
+]
+
+[[package]]
+name = "solana-fee-calculator"
+version = "2.2.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "d89bc408da0fb3812bc3008189d148b4d3e08252c79ad810b245482a3f70cd8d"
+dependencies = [
+ "log",
+ "serde",
+ "serde_derive",
+]
+
+[[package]]
+name = "solana-hash"
+version = "2.3.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "b5b96e9f0300fa287b545613f007dfe20043d7812bee255f418c1eb649c93b63"
+dependencies = [
+ "borsh 1.5.7",
+ "bytemuck",
+ "bytemuck_derive",
+ "five8",
+ "js-sys",
+ "serde",
+ "serde_derive",
+ "solana-atomic-u64",
+ "solana-sanitize",
+ "wasm-bindgen",
+]
+
+[[package]]
+name = "solana-helper"
+version = "0.1.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "09c6deff8c48efb84b5828db064ad9873ef3445f129f888b4b6a664bd5220e35"
+dependencies = [
+ "bs58",
+ "proc-macro2",
+ "quote",
+ "syn 1.0.109",
+]
+
+[[package]]
+name = "solana-instruction"
+version = "2.3.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "47298e2ce82876b64f71e9d13a46bc4b9056194e7f9937ad3084385befa50885"
+dependencies = [
+ "bincode",
+ "borsh 1.5.7",
+ "getrandom 0.2.16",
+ "js-sys",
+ "num-traits",
+ "serde",
+ "serde_derive",
+ "solana-define-syscall",
+ "solana-pubkey",
+ "wasm-bindgen",
+]
+
+[[package]]
+name = "solana-instructions-sysvar"
+version = "2.2.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "e0e85a6fad5c2d0c4f5b91d34b8ca47118fc593af706e523cdbedf846a954f57"
+dependencies = [
+ "bitflags",
+ "solana-account-info",
+ "solana-instruction",
+ "solana-program-error",
+ "solana-pubkey",
+ "solana-sanitize",
+ "solana-sdk-ids",
+ "solana-serialize-utils",
+ "solana-sysvar-id",
+]
+
+[[package]]
+name = "solana-keccak-hasher"
+version = "2.2.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "c7aeb957fbd42a451b99235df4942d96db7ef678e8d5061ef34c9b34cae12f79"
+dependencies = [
+ "sha3",
+ "solana-define-syscall",
+ "solana-hash",
+ "solana-sanitize",
+]
+
+[[package]]
+name = "solana-last-restart-slot"
+version = "2.2.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "4a6360ac2fdc72e7463565cd256eedcf10d7ef0c28a1249d261ec168c1b55cdd"
+dependencies = [
+ "serde",
+ "serde_derive",
+ "solana-sdk-ids",
+ "solana-sdk-macro",
+ "solana-sysvar-id",
+]
+
+[[package]]
+name = "solana-loader-v2-interface"
+version = "2.2.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "d8ab08006dad78ae7cd30df8eea0539e207d08d91eaefb3e1d49a446e1c49654"
+dependencies = [
+ "serde",
+ "serde_bytes",
+ "serde_derive",
+ "solana-instruction",
+ "solana-pubkey",
+ "solana-sdk-ids",
+]
+
+[[package]]
+name = "solana-loader-v3-interface"
+version = "3.0.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "fa4be76cfa9afd84ca2f35ebc09f0da0f0092935ccdac0595d98447f259538c2"
+dependencies = [
+ "serde",
+ "serde_bytes",
+ "serde_derive",
+ "solana-instruction",
+ "solana-pubkey",
+ "solana-sdk-ids",
+ "solana-system-interface",
+]
+
+[[package]]
+name = "solana-loader-v4-interface"
+version = "2.2.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "706a777242f1f39a83e2a96a2a6cb034cb41169c6ecbee2cf09cb873d9659e7e"
+dependencies = [
+ "serde",
+ "serde_bytes",
+ "serde_derive",
+ "solana-instruction",
+ "solana-pubkey",
+ "solana-sdk-ids",
+ "solana-system-interface",
+]
+
+[[package]]
+name = "solana-message"
+version = "2.4.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "1796aabce376ff74bf89b78d268fa5e683d7d7a96a0a4e4813ec34de49d5314b"
+dependencies = [
+ "bincode",
+ "blake3",
+ "lazy_static",
+ "serde",
+ "serde_derive",
+ "solana-bincode",
+ "solana-hash",
+ "solana-instruction",
+ "solana-pubkey",
+ "solana-sanitize",
+ "solana-sdk-ids",
+ "solana-short-vec",
+ "solana-system-interface",
+ "solana-transaction-error",
+ "wasm-bindgen",
+]
+
+[[package]]
+name = "solana-msg"
+version = "2.2.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "f36a1a14399afaabc2781a1db09cb14ee4cc4ee5c7a5a3cfcc601811379a8092"
+dependencies = [
+ "solana-define-syscall",
+]
+
+[[package]]
+name = "solana-native-token"
+version = "2.3.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "61515b880c36974053dd499c0510066783f0cc6ac17def0c7ef2a244874cf4a9"
+
+[[package]]
+name = "solana-nonce"
+version = "2.2.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "703e22eb185537e06204a5bd9d509b948f0066f2d1d814a6f475dafb3ddf1325"
+dependencies = [
+ "serde",
+ "serde_derive",
+ "solana-fee-calculator",
+ "solana-hash",
+ "solana-pubkey",
+ "solana-sha256-hasher",
+]
+
+[[package]]
+name = "solana-program"
+version = "2.2.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "586469467e93ceb79048f8d8e3a619bf61d05396ee7de95cb40280301a589d05"
+dependencies = [
+ "bincode",
+ "blake3",
+ "borsh 0.10.4",
+ "borsh 1.5.7",
+ "bs58",
+ "bytemuck",
+ "console_error_panic_hook",
+ "console_log",
+ "getrandom 0.2.16",
+ "lazy_static",
+ "log",
+ "memoffset",
+ "num-bigint",
+ "num-derive",
+ "num-traits",
+ "rand 0.8.5",
+ "serde",
+ "serde_bytes",
+ "serde_derive",
+ "solana-account-info",
+ "solana-address-lookup-table-interface",
+ "solana-atomic-u64",
+ "solana-big-mod-exp",
+ "solana-bincode",
+ "solana-blake3-hasher",
+ "solana-borsh",
+ "solana-clock",
+ "solana-cpi",
+ "solana-decode-error",
+ "solana-define-syscall",
+ "solana-epoch-rewards",
+ "solana-epoch-schedule",
+ "solana-example-mocks",
+ "solana-feature-gate-interface",
+ "solana-fee-calculator",
+ "solana-hash",
+ "solana-instruction",
+ "solana-instructions-sysvar",
+ "solana-keccak-hasher",
+ "solana-last-restart-slot",
+ "solana-loader-v2-interface",
+ "solana-loader-v3-interface",
+ "solana-loader-v4-interface",
+ "solana-message",
+ "solana-msg",
+ "solana-native-token",
+ "solana-nonce",
+ "solana-program-entrypoint",
+ "solana-program-error",
+ "solana-program-memory",
+ "solana-program-option",
+ "solana-program-pack",
+ "solana-pubkey",
+ "solana-rent",
+ "solana-sanitize",
+ "solana-sdk-ids",
+ "solana-sdk-macro",
+ "solana-secp256k1-recover",
+ "solana-serde-varint",
+ "solana-serialize-utils",
+ "solana-sha256-hasher",
+ "solana-short-vec",
+ "solana-slot-hashes",
+ "solana-slot-history",
+ "solana-stable-layout",
+ "solana-stake-interface",
+ "solana-system-interface",
+ "solana-sysvar",
+ "solana-sysvar-id",
+ "solana-vote-interface",
+ "thiserror 2.0.16",
+ "wasm-bindgen",
+]
+
+[[package]]
+name = "solana-program-entrypoint"
+version = "2.3.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "32ce041b1a0ed275290a5008ee1a4a6c48f5054c8a3d78d313c08958a06aedbd"
+dependencies = [
+ "solana-account-info",
+ "solana-msg",
+ "solana-program-error",
+ "solana-pubkey",
+]
+
+[[package]]
+name = "solana-program-error"
+version = "2.2.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "9ee2e0217d642e2ea4bee237f37bd61bb02aec60da3647c48ff88f6556ade775"
+dependencies = [
+ "borsh 1.5.7",
+ "num-traits",
+ "serde",
+ "serde_derive",
+ "solana-decode-error",
+ "solana-instruction",
+ "solana-msg",
+ "solana-pubkey",
+]
+
+[[package]]
+name = "solana-program-memory"
+version = "2.3.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "3a5426090c6f3fd6cfdc10685322fede9ca8e5af43cd6a59e98bfe4e91671712"
+dependencies = [
+ "solana-define-syscall",
+]
+
+[[package]]
+name = "solana-program-option"
+version = "2.2.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "dc677a2e9bc616eda6dbdab834d463372b92848b2bfe4a1ed4e4b4adba3397d0"
+
+[[package]]
+name = "solana-program-pack"
+version = "2.2.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "319f0ef15e6e12dc37c597faccb7d62525a509fec5f6975ecb9419efddeb277b"
+dependencies = [
+ "solana-program-error",
+]
+
+[[package]]
+name = "solana-pubkey"
+version = "2.4.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "9b62adb9c3261a052ca1f999398c388f1daf558a1b492f60a6d9e64857db4ff1"
+dependencies = [
+ "borsh 0.10.4",
+ "borsh 1.5.7",
+ "bytemuck",
+ "bytemuck_derive",
+ "curve25519-dalek",
+ "five8",
+ "five8_const",
+ "getrandom 0.2.16",
+ "js-sys",
+ "num-traits",
+ "serde",
+ "serde_derive",
+ "solana-atomic-u64",
+ "solana-decode-error",
+ "solana-define-syscall",
+ "solana-sanitize",
+ "solana-sha256-hasher",
+ "wasm-bindgen",
+]
+
+[[package]]
+name = "solana-rent"
+version = "2.2.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "d1aea8fdea9de98ca6e8c2da5827707fb3842833521b528a713810ca685d2480"
+dependencies = [
+ "serde",
+ "serde_derive",
+ "solana-sdk-ids",
+ "solana-sdk-macro",
+ "solana-sysvar-id",
+]
+
+[[package]]
+name = "solana-sanitize"
+version = "2.2.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "61f1bc1357b8188d9c4a3af3fc55276e56987265eb7ad073ae6f8180ee54cecf"
+
+[[package]]
+name = "solana-sdk-ids"
+version = "2.2.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "5c5d8b9cc68d5c88b062a33e23a6466722467dde0035152d8fb1afbcdf350a5f"
+dependencies = [
+ "solana-pubkey",
+]
+
+[[package]]
+name = "solana-sdk-macro"
+version = "2.2.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "86280da8b99d03560f6ab5aca9de2e38805681df34e0bb8f238e69b29433b9df"
+dependencies = [
+ "bs58",
+ "proc-macro2",
+ "quote",
+ "syn 2.0.106",
+]
+
+[[package]]
+name = "solana-secp256k1-recover"
+version = "2.2.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "baa3120b6cdaa270f39444f5093a90a7b03d296d362878f7a6991d6de3bbe496"
+dependencies = [
+ "libsecp256k1",
+ "solana-define-syscall",
+ "thiserror 2.0.16",
+]
+
+[[package]]
+name = "solana-security-txt"
+version = "1.1.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "468aa43b7edb1f9b7b7b686d5c3aeb6630dc1708e86e31343499dd5c4d775183"
+
+[[package]]
+name = "solana-seed-derivable"
+version = "2.2.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "3beb82b5adb266c6ea90e5cf3967235644848eac476c5a1f2f9283a143b7c97f"
+dependencies = [
+ "solana-derivation-path",
+]
+
+[[package]]
+name = "solana-seed-phrase"
+version = "2.2.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "36187af2324f079f65a675ec22b31c24919cb4ac22c79472e85d819db9bbbc15"
+dependencies = [
+ "hmac",
+ "pbkdf2",
+ "sha2 0.10.9",
+]
+
+[[package]]
+name = "solana-serde-varint"
+version = "2.2.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "2a7e155eba458ecfb0107b98236088c3764a09ddf0201ec29e52a0be40857113"
+dependencies = [
+ "serde",
+]
+
+[[package]]
+name = "solana-serialize-utils"
+version = "2.2.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "817a284b63197d2b27afdba829c5ab34231da4a9b4e763466a003c40ca4f535e"
+dependencies = [
+ "solana-instruction",
+ "solana-pubkey",
+ "solana-sanitize",
+]
+
+[[package]]
+name = "solana-sha256-hasher"
+version = "2.3.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "5aa3feb32c28765f6aa1ce8f3feac30936f16c5c3f7eb73d63a5b8f6f8ecdc44"
+dependencies = [
+ "sha2 0.10.9",
+ "solana-define-syscall",
+ "solana-hash",
+]
+
+[[package]]
+name = "solana-short-vec"
+version = "2.2.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "5c54c66f19b9766a56fa0057d060de8378676cb64987533fa088861858fc5a69"
+dependencies = [
+ "serde",
+]
+
+[[package]]
+name = "solana-signature"
+version = "2.3.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "64c8ec8e657aecfc187522fc67495142c12f35e55ddeca8698edbb738b8dbd8c"
+dependencies = [
+ "five8",
+ "solana-sanitize",
+]
+
+[[package]]
+name = "solana-signer"
+version = "2.2.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "7c41991508a4b02f021c1342ba00bcfa098630b213726ceadc7cb032e051975b"
+dependencies = [
+ "solana-pubkey",
+ "solana-signature",
+ "solana-transaction-error",
+]
+
+[[package]]
+name = "solana-slot-hashes"
+version = "2.2.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "0c8691982114513763e88d04094c9caa0376b867a29577939011331134c301ce"
+dependencies = [
+ "serde",
+ "serde_derive",
+ "solana-hash",
+ "solana-sdk-ids",
+ "solana-sysvar-id",
+]
+
+[[package]]
+name = "solana-slot-history"
+version = "2.2.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "97ccc1b2067ca22754d5283afb2b0126d61eae734fc616d23871b0943b0d935e"
+dependencies = [
+ "bv",
+ "serde",
+ "serde_derive",
+ "solana-sdk-ids",
+ "solana-sysvar-id",
+]
+
+[[package]]
+name = "solana-stable-layout"
+version = "2.2.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "9f14f7d02af8f2bc1b5efeeae71bc1c2b7f0f65cd75bcc7d8180f2c762a57f54"
+dependencies = [
+ "solana-instruction",
+ "solana-pubkey",
+]
+
+[[package]]
+name = "solana-stake-interface"
+version = "1.2.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "5269e89fde216b4d7e1d1739cf5303f8398a1ff372a81232abbee80e554a838c"
+dependencies = [
+ "borsh 0.10.4",
+ "borsh 1.5.7",
+ "num-traits",
+ "serde",
+ "serde_derive",
+ "solana-clock",
+ "solana-cpi",
+ "solana-decode-error",
+ "solana-instruction",
+ "solana-program-error",
+ "solana-pubkey",
+ "solana-system-interface",
+ "solana-sysvar-id",
+]
+
+[[package]]
+name = "solana-system-interface"
+version = "1.0.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "94d7c18cb1a91c6be5f5a8ac9276a1d7c737e39a21beba9ea710ab4b9c63bc90"
+dependencies = [
+ "js-sys",
+ "num-traits",
+ "serde",
+ "serde_derive",
+ "solana-decode-error",
+ "solana-instruction",
+ "solana-pubkey",
+ "wasm-bindgen",
+]
+
+[[package]]
+name = "solana-sysvar"
+version = "2.3.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "b8c3595f95069f3d90f275bb9bd235a1973c4d059028b0a7f81baca2703815db"
+dependencies = [
+ "base64 0.22.1",
+ "bincode",
+ "bytemuck",
+ "bytemuck_derive",
+ "lazy_static",
+ "serde",
+ "serde_derive",
+ "solana-account-info",
+ "solana-clock",
+ "solana-define-syscall",
+ "solana-epoch-rewards",
+ "solana-epoch-schedule",
+ "solana-fee-calculator",
+ "solana-hash",
+ "solana-instruction",
+ "solana-instructions-sysvar",
+ "solana-last-restart-slot",
+ "solana-program-entrypoint",
+ "solana-program-error",
+ "solana-program-memory",
+ "solana-pubkey",
+ "solana-rent",
+ "solana-sanitize",
+ "solana-sdk-ids",
+ "solana-sdk-macro",
+ "solana-slot-hashes",
+ "solana-slot-history",
+ "solana-stake-interface",
+ "solana-sysvar-id",
+]
+
+[[package]]
+name = "solana-sysvar-id"
+version = "2.2.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "5762b273d3325b047cfda250787f8d796d781746860d5d0a746ee29f3e8812c1"
+dependencies = [
+ "solana-pubkey",
+ "solana-sdk-ids",
+]
+
+[[package]]
+name = "solana-transaction-error"
+version = "2.2.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "222a9dc8fdb61c6088baab34fc3a8b8473a03a7a5fd404ed8dd502fa79b67cb1"
+dependencies = [
+ "solana-instruction",
+ "solana-sanitize",
+]
+
+[[package]]
+name = "solana-vote-interface"
+version = "2.2.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "b80d57478d6599d30acc31cc5ae7f93ec2361a06aefe8ea79bc81739a08af4c3"
+dependencies = [
+ "bincode",
+ "num-derive",
+ "num-traits",
+ "serde",
+ "serde_derive",
+ "solana-clock",
+ "solana-decode-error",
+ "solana-hash",
+ "solana-instruction",
+ "solana-pubkey",
+ "solana-rent",
+ "solana-sdk-ids",
+ "solana-serde-varint",
+ "solana-serialize-utils",
+ "solana-short-vec",
+ "solana-system-interface",
+]
+
+[[package]]
+name = "solana-zk-sdk"
+version = "2.3.7"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "3bb171c0f76c420a7cb6aabbe5fa85a1a009d5bb4009189c43e1a03aff9446d7"
+dependencies = [
+ "aes-gcm-siv",
+ "base64 0.22.1",
+ "bincode",
+ "bytemuck",
+ "bytemuck_derive",
+ "curve25519-dalek",
+ "itertools",
+ "js-sys",
+ "merlin",
+ "num-derive",
+ "num-traits",
+ "rand 0.8.5",
+ "serde",
+ "serde_derive",
+ "serde_json",
+ "sha3",
+ "solana-derivation-path",
+ "solana-instruction",
+ "solana-pubkey",
+ "solana-sdk-ids",
+ "solana-seed-derivable",
+ "solana-seed-phrase",
+ "solana-signature",
+ "solana-signer",
+ "subtle",
+ "thiserror 2.0.16",
+ "wasm-bindgen",
+ "zeroize",
+]
+
+[[package]]
+name = "spl-associated-token-account"
+version = "6.0.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "76fee7d65013667032d499adc3c895e286197a35a0d3a4643c80e7fd3e9969e3"
+dependencies = [
+ "borsh 1.5.7",
+ "num-derive",
+ "num-traits",
+ "solana-program",
+ "spl-associated-token-account-client",
+ "spl-token",
+ "spl-token-2022",
+ "thiserror 1.0.69",
+]
+
+[[package]]
+name = "spl-associated-token-account-client"
+version = "2.0.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "d6f8349dbcbe575f354f9a533a21f272f3eb3808a49e2fdc1c34393b88ba76cb"
+dependencies = [
+ "solana-instruction",
+ "solana-pubkey",
+]
+
+[[package]]
+name = "spl-discriminator"
+version = "0.4.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "a7398da23554a31660f17718164e31d31900956054f54f52d5ec1be51cb4f4b3"
+dependencies = [
+ "bytemuck",
+ "solana-program-error",
+ "solana-sha256-hasher",
+ "spl-discriminator-derive",
+]
+
+[[package]]
+name = "spl-discriminator-derive"
+version = "0.2.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "d9e8418ea6269dcfb01c712f0444d2c75542c04448b480e87de59d2865edc750"
+dependencies = [
+ "quote",
+ "spl-discriminator-syn",
+ "syn 2.0.106",
+]
+
+[[package]]
+name = "spl-discriminator-syn"
+version = "0.2.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "5d1dbc82ab91422345b6df40a79e2b78c7bce1ebb366da323572dd60b7076b67"
+dependencies = [
+ "proc-macro2",
+ "quote",
+ "sha2 0.10.9",
+ "syn 2.0.106",
+ "thiserror 1.0.69",
+]
+
+[[package]]
+name = "spl-elgamal-registry"
+version = "0.1.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "ce0f668975d2b0536e8a8fd60e56a05c467f06021dae037f1d0cfed0de2e231d"
+dependencies = [
+ "bytemuck",
+ "solana-program",
+ "solana-zk-sdk",
+ "spl-pod",
+ "spl-token-confidential-transfer-proof-extraction",
+]
+
+[[package]]
+name = "spl-memo"
+version = "6.0.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "9f09647c0974e33366efeb83b8e2daebb329f0420149e74d3a4bd2c08cf9f7cb"
+dependencies = [
+ "solana-account-info",
+ "solana-instruction",
+ "solana-msg",
+ "solana-program-entrypoint",
+ "solana-program-error",
+ "solana-pubkey",
+]
+
+[[package]]
+name = "spl-pod"
+version = "0.5.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "d994afaf86b779104b4a95ba9ca75b8ced3fdb17ee934e38cb69e72afbe17799"
+dependencies = [
+ "borsh 1.5.7",
+ "bytemuck",
+ "bytemuck_derive",
+ "num-derive",
+ "num-traits",
+ "solana-decode-error",
+ "solana-msg",
+ "solana-program-error",
+ "solana-program-option",
+ "solana-pubkey",
+ "solana-zk-sdk",
+ "thiserror 2.0.16",
+]
+
+[[package]]
+name = "spl-program-error"
+version = "0.6.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "9d39b5186f42b2b50168029d81e58e800b690877ef0b30580d107659250da1d1"
+dependencies = [
+ "num-derive",
+ "num-traits",
+ "solana-program",
+ "spl-program-error-derive",
+ "thiserror 1.0.69",
+]
+
+[[package]]
+name = "spl-program-error-derive"
+version = "0.4.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "e6d375dd76c517836353e093c2dbb490938ff72821ab568b545fd30ab3256b3e"
+dependencies = [
+ "proc-macro2",
+ "quote",
+ "sha2 0.10.9",
+ "syn 2.0.106",
+]
+
+[[package]]
+name = "spl-tlv-account-resolution"
+version = "0.9.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "cd99ff1e9ed2ab86e3fd582850d47a739fec1be9f4661cba1782d3a0f26805f3"
+dependencies = [
+ "bytemuck",
+ "num-derive",
+ "num-traits",
+ "solana-account-info",
+ "solana-decode-error",
+ "solana-instruction",
+ "solana-msg",
+ "solana-program-error",
+ "solana-pubkey",
+ "spl-discriminator",
+ "spl-pod",
+ "spl-program-error",
+ "spl-type-length-value",
+ "thiserror 1.0.69",
+]
+
+[[package]]
+name = "spl-token"
+version = "7.0.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "ed320a6c934128d4f7e54fe00e16b8aeaecf215799d060ae14f93378da6dc834"
+dependencies = [
+ "arrayref",
+ "bytemuck",
+ "num-derive",
+ "num-traits",
+ "num_enum",
+ "solana-program",
+ "thiserror 1.0.69",
+]
+
+[[package]]
+name = "spl-token-2022"
+version = "6.0.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "5b27f7405010ef816587c944536b0eafbcc35206ab6ba0f2ca79f1d28e488f4f"
+dependencies = [
+ "arrayref",
+ "bytemuck",
+ "num-derive",
+ "num-traits",
+ "num_enum",
+ "solana-program",
+ "solana-security-txt",
+ "solana-zk-sdk",
+ "spl-elgamal-registry",
+ "spl-memo",
+ "spl-pod",
+ "spl-token",
+ "spl-token-confidential-transfer-ciphertext-arithmetic",
+ "spl-token-confidential-transfer-proof-extraction",
+ "spl-token-confidential-transfer-proof-generation",
+ "spl-token-group-interface",
+ "spl-token-metadata-interface",
+ "spl-transfer-hook-interface",
+ "spl-type-length-value",
+ "thiserror 1.0.69",
+]
+
+[[package]]
+name = "spl-token-confidential-transfer-ciphertext-arithmetic"
+version = "0.2.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "170378693c5516090f6d37ae9bad2b9b6125069be68d9acd4865bbe9fc8499fd"
+dependencies = [
+ "base64 0.22.1",
+ "bytemuck",
+ "solana-curve25519",
+ "solana-zk-sdk",
+]
+
+[[package]]
+name = "spl-token-confidential-transfer-proof-extraction"
+version = "0.2.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "eff2d6a445a147c9d6dd77b8301b1e116c8299601794b558eafa409b342faf96"
+dependencies = [
+ "bytemuck",
+ "solana-curve25519",
+ "solana-program",
+ "solana-zk-sdk",
+ "spl-pod",
+ "thiserror 2.0.16",
+]
+
+[[package]]
+name = "spl-token-confidential-transfer-proof-generation"
+version = "0.2.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "8627184782eec1894de8ea26129c61303f1f0adeed65c20e0b10bc584f09356d"
+dependencies = [
+ "curve25519-dalek",
+ "solana-zk-sdk",
+ "thiserror 1.0.69",
+]
+
+[[package]]
+name = "spl-token-group-interface"
+version = "0.5.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "d595667ed72dbfed8c251708f406d7c2814a3fa6879893b323d56a10bedfc799"
+dependencies = [
+ "bytemuck",
+ "num-derive",
+ "num-traits",
+ "solana-decode-error",
+ "solana-instruction",
+ "solana-msg",
+ "solana-program-error",
+ "solana-pubkey",
+ "spl-discriminator",
+ "spl-pod",
+ "thiserror 1.0.69",
+]
+
+[[package]]
+name = "spl-token-metadata-interface"
+version = "0.6.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "dfb9c89dbc877abd735f05547dcf9e6e12c00c11d6d74d8817506cab4c99fdbb"
+dependencies = [
+ "borsh 1.5.7",
+ "num-derive",
+ "num-traits",
+ "solana-borsh",
+ "solana-decode-error",
+ "solana-instruction",
+ "solana-msg",
+ "solana-program-error",
+ "solana-pubkey",
+ "spl-discriminator",
+ "spl-pod",
+ "spl-type-length-value",
+ "thiserror 1.0.69",
+]
+
+[[package]]
+name = "spl-transfer-hook-interface"
+version = "0.9.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "4aa7503d52107c33c88e845e1351565050362c2314036ddf19a36cd25137c043"
+dependencies = [
+ "arrayref",
+ "bytemuck",
+ "num-derive",
+ "num-traits",
+ "solana-account-info",
+ "solana-cpi",
+ "solana-decode-error",
+ "solana-instruction",
+ "solana-msg",
+ "solana-program-error",
+ "solana-pubkey",
+ "spl-discriminator",
+ "spl-pod",
+ "spl-program-error",
+ "spl-tlv-account-resolution",
+ "spl-type-length-value",
+ "thiserror 1.0.69",
+]
+
+[[package]]
+name = "spl-type-length-value"
+version = "0.7.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "ba70ef09b13af616a4c987797870122863cba03acc4284f226a4473b043923f9"
+dependencies = [
+ "bytemuck",
+ "num-derive",
+ "num-traits",
+ "solana-account-info",
+ "solana-decode-error",
+ "solana-msg",
+ "solana-program-error",
+ "spl-discriminator",
+ "spl-pod",
+ "thiserror 1.0.69",
+]
+
+[[package]]
+name = "subtle"
+version = "2.6.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "13c2bddecc57b384dee18652358fb23172facb8a2c51ccc10d74c157bdea3292"
+
+[[package]]
+name = "syn"
+version = "1.0.109"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "72b64191b275b66ffe2469e8af2c1cfe3bafa67b529ead792a6d0160888b4237"
+dependencies = [
+ "proc-macro2",
+ "quote",
+ "unicode-ident",
+]
+
+[[package]]
+name = "syn"
+version = "2.0.106"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "ede7c438028d4436d71104916910f5bb611972c5cfd7f89b8300a8186e6fada6"
+dependencies = [
+ "proc-macro2",
+ "quote",
+ "unicode-ident",
+]
+
+[[package]]
+name = "thiserror"
+version = "1.0.69"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "b6aaf5339b578ea85b50e080feb250a3e8ae8cfcdff9a461c9ec2904bc923f52"
+dependencies = [
+ "thiserror-impl 1.0.69",
+]
+
+[[package]]
+name = "thiserror"
+version = "2.0.16"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "3467d614147380f2e4e374161426ff399c91084acd2363eaf549172b3d5e60c0"
+dependencies = [
+ "thiserror-impl 2.0.16",
+]
+
+[[package]]
+name = "thiserror-impl"
+version = "1.0.69"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "4fee6c4efc90059e10f81e6d42c60a18f76588c3d74cb83a0b242a2b6c7504c1"
+dependencies = [
+ "proc-macro2",
+ "quote",
+ "syn 2.0.106",
+]
+
+[[package]]
+name = "thiserror-impl"
+version = "2.0.16"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "6c5e1be1c48b9172ee610da68fd9cd2770e7a4056cb3fc98710ee6906f0c7960"
+dependencies = [
+ "proc-macro2",
+ "quote",
+ "syn 2.0.106",
+]
+
+[[package]]
+name = "tinyvec"
+version = "1.10.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "bfa5fdc3bce6191a1dbc8c02d5c8bffcf557bafa17c124c5264a458f1b0613fa"
+dependencies = [
+ "tinyvec_macros",
+]
+
+[[package]]
+name = "tinyvec_macros"
+version = "0.1.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20"
+
+[[package]]
+name = "toml"
+version = "0.5.11"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "f4f7f0dd8d50a853a531c426359045b1998f04219d88799810762cd4ad314234"
+dependencies = [
+ "serde",
+]
+
+[[package]]
+name = "toml"
+version = "0.8.23"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "dc1beb996b9d83529a9e75c17a1686767d148d70663143c7854d8b4a09ced362"
+dependencies = [
+ "serde",
+ "serde_spanned",
+ "toml_datetime",
+ "toml_edit",
+]
+
+[[package]]
+name = "toml_datetime"
+version = "0.6.11"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "22cddaf88f4fbc13c51aebbf5f8eceb5c7c5a9da2ac40a13519eb5b0a0e8f11c"
+dependencies = [
+ "serde",
+]
+
+[[package]]
+name = "toml_edit"
+version = "0.22.27"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "41fe8c660ae4257887cf66394862d21dbca4a6ddd26f04a3560410406a2f819a"
+dependencies = [
+ "indexmap",
+ "serde",
+ "serde_spanned",
+ "toml_datetime",
+ "toml_write",
+ "winnow",
+]
+
+[[package]]
+name = "toml_write"
+version = "0.1.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "5d99f8c9a7727884afe522e9bd5edbfc91a3312b36a77b5fb8926e4c31a41801"
+
+[[package]]
+name = "typenum"
+version = "1.18.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "1dccffe3ce07af9386bfd29e80c0ab1a8205a2fc34e4bcd40364df902cfa8f3f"
+
+[[package]]
+name = "unicode-ident"
+version = "1.0.18"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "5a5f39404a5da50712a4c1eecf25e90dd62b613502b7e925fd4e4d19b5c96512"
+
+[[package]]
+name = "unicode-segmentation"
+version = "1.12.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "f6ccf251212114b54433ec949fd6a7841275f9ada20dddd2f29e9ceea4501493"
+
+[[package]]
+name = "universal-hash"
+version = "0.5.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "fc1de2c688dc15305988b563c3854064043356019f97a4b46276fe734c4f07ea"
+dependencies = [
+ "crypto-common",
+ "subtle",
+]
+
+[[package]]
+name = "uriparse"
+version = "0.6.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "0200d0fc04d809396c2ad43f3c95da3582a2556eba8d453c1087f4120ee352ff"
+dependencies = [
+ "fnv",
+ "lazy_static",
+]
+
+[[package]]
+name = "utils-latest"
+version = "0.1.0"
+source = "git+https://github.com/LayerZero-Labs/LayerZero-v2.git?rev=c09287a#c09287a8b1f236fcc057f474d8a773a0fb7758df"
+dependencies = [
+ "anchor-lang",
+]
+
+[[package]]
+name = "version_check"
+version = "0.9.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "0b928f33d975fc6ad9f86c8f283853ad26bdd5b10b7f1542aa2fa15e2289105a"
+
+[[package]]
+name = "wasi"
+version = "0.9.0+wasi-snapshot-preview1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "cccddf32554fecc6acb585f82a32a72e28b48f8c4c1883ddfeeeaa96f7d8e519"
+
+[[package]]
+name = "wasi"
+version = "0.11.1+wasi-snapshot-preview1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "ccf3ec651a847eb01de73ccad15eb7d99f80485de043efb2f370cd654f4ea44b"
+
+[[package]]
+name = "wasm-bindgen"
+version = "0.2.100"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "1edc8929d7499fc4e8f0be2262a241556cfc54a0bea223790e71446f2aab1ef5"
+dependencies = [
+ "cfg-if",
+ "once_cell",
+ "rustversion",
+ "wasm-bindgen-macro",
+]
+
+[[package]]
+name = "wasm-bindgen-backend"
+version = "0.2.100"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "2f0a0651a5c2bc21487bde11ee802ccaf4c51935d0d3d42a6101f98161700bc6"
+dependencies = [
+ "bumpalo",
+ "log",
+ "proc-macro2",
+ "quote",
+ "syn 2.0.106",
+ "wasm-bindgen-shared",
+]
+
+[[package]]
+name = "wasm-bindgen-macro"
+version = "0.2.100"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "7fe63fc6d09ed3792bd0897b314f53de8e16568c2b3f7982f468c0bf9bd0b407"
+dependencies = [
+ "quote",
+ "wasm-bindgen-macro-support",
+]
+
+[[package]]
+name = "wasm-bindgen-macro-support"
+version = "0.2.100"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "8ae87ea40c9f689fc23f209965b6fb8a99ad69aeeb0231408be24920604395de"
+dependencies = [
+ "proc-macro2",
+ "quote",
+ "syn 2.0.106",
+ "wasm-bindgen-backend",
+ "wasm-bindgen-shared",
+]
+
+[[package]]
+name = "wasm-bindgen-shared"
+version = "0.2.100"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "1a05d73b933a847d6cccdda8f838a22ff101ad9bf93e33684f39c1f5f0eece3d"
+dependencies = [
+ "unicode-ident",
+]
+
+[[package]]
+name = "web-sys"
+version = "0.3.77"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "33b6dd2ef9186f1f2072e409e99cd22a975331a6b3591b12c764e0e55c60d5d2"
+dependencies = [
+ "js-sys",
+ "wasm-bindgen",
+]
+
+[[package]]
+name = "windows-targets"
+version = "0.52.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "9b724f72796e036ab90c1021d4780d4d3d648aca59e491e6b98e725b84e99973"
+dependencies = [
+ "windows_aarch64_gnullvm",
+ "windows_aarch64_msvc",
+ "windows_i686_gnu",
+ "windows_i686_gnullvm",
+ "windows_i686_msvc",
+ "windows_x86_64_gnu",
+ "windows_x86_64_gnullvm",
+ "windows_x86_64_msvc",
+]
+
+[[package]]
+name = "windows_aarch64_gnullvm"
+version = "0.52.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "32a4622180e7a0ec044bb555404c800bc9fd9ec262ec147edd5989ccd0c02cd3"
+
+[[package]]
+name = "windows_aarch64_msvc"
+version = "0.52.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "09ec2a7bb152e2252b53fa7803150007879548bc709c039df7627cabbd05d469"
+
+[[package]]
+name = "windows_i686_gnu"
+version = "0.52.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "8e9b5ad5ab802e97eb8e295ac6720e509ee4c243f69d781394014ebfe8bbfa0b"
+
+[[package]]
+name = "windows_i686_gnullvm"
+version = "0.52.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "0eee52d38c090b3caa76c563b86c3a4bd71ef1a819287c19d586d7334ae8ed66"
+
+[[package]]
+name = "windows_i686_msvc"
+version = "0.52.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "240948bc05c5e7c6dabba28bf89d89ffce3e303022809e73deaefe4f6ec56c66"
+
+[[package]]
+name = "windows_x86_64_gnu"
+version = "0.52.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "147a5c80aabfbf0c7d901cb5895d1de30ef2907eb21fbbab29ca94c5b08b1a78"
+
+[[package]]
+name = "windows_x86_64_gnullvm"
+version = "0.52.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "24d5b23dc417412679681396f2b49f3de8c1473deb516bd34410872eff51ed0d"
+
+[[package]]
+name = "windows_x86_64_msvc"
+version = "0.52.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec"
+
+[[package]]
+name = "winnow"
+version = "0.7.13"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "21a0236b59786fed61e2a80582dd500fe61f18b5dca67a4a067d0bc9039339cf"
+dependencies = [
+ "memchr",
+]
+
+[[package]]
+name = "zerocopy"
+version = "0.8.26"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "1039dd0d3c310cf05de012d8a39ff557cb0d23087fd44cad61df08fc31907a2f"
+dependencies = [
+ "zerocopy-derive",
+]
+
+[[package]]
+name = "zerocopy-derive"
+version = "0.8.26"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "9ecf5b4cc5364572d7f4c329661bcc82724222973f2cab6f050a4e5c22f75181"
+dependencies = [
+ "proc-macro2",
+ "quote",
+ "syn 2.0.106",
+]
+
+[[package]]
+name = "zeroize"
+version = "1.8.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "ced3678a2879b30306d323f4542626697a464a97c0a07c9aebf7ebca65cd4dde"
+dependencies = [
+ "zeroize_derive",
+]
+
+[[package]]
+name = "zeroize_derive"
+version = "1.4.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "ce36e65b0d2999d2aafac989fb249189a141aee1f53c612c1f37d72631959f69"
+dependencies = [
+ "proc-macro2",
+ "quote",
+ "syn 2.0.106",
+]
diff --git a/examples/oft-main/Cargo.toml b/examples/oft-main/Cargo.toml
new file mode 100644
index 0000000000..ae8c8729ca
--- /dev/null
+++ b/examples/oft-main/Cargo.toml
@@ -0,0 +1,16 @@
+[workspace]
+members = ["programs/*"]
+resolver = "2"
+
+# [features]
+# idl-build = ["anchor-lang/idl-build"]
+
+[profile.release]
+overflow-checks = true
+lto = "fat"
+codegen-units = 1
+
+[profile.release.build-override]
+opt-level = 3
+incremental = false
+codegen-units = 1
diff --git a/examples/oft-main/README.md b/examples/oft-main/README.md
new file mode 100644
index 0000000000..37cef36874
--- /dev/null
+++ b/examples/oft-main/README.md
@@ -0,0 +1,746 @@
+
+
+
+
+
+
+
+
+
+
+
+ LayerZero Docs
+
+
+Omnichain Fungible Token (OFT) Master Example
+
+Template project for a cross-chain token (OFT ) powered by the LayerZero protocol. This master example supports EVM, Solana, Sui, and Starknet (with Aptos wiring notes where relevant).
+
+## Table of Contents
+
+- [Prerequisite Knowledge](#prerequisite-knowledge)
+- [Requirements](#requirements)
+- [Scaffold this example](#scaffold-this-example)
+- [Helper Tasks](#helper-tasks)
+- [Setup](#setup)
+- [Build](#build)
+- [Deploy](#deploy)
+- [Enable Messaging](#enable-messaging)
+- [Sending OFT](#sending-oft)
+- [Next Steps](#next-steps)
+- [Production Deployment Checklist](#production-deployment-checklist)
+- [Appendix](#appendix)
+ - [Running tests](#running-tests)
+ - [Adding other chains](#adding-other-chains)
+ - [Using Multisigs](#using-multisigs)
+ - [LayerZero Hardhat Helper Tasks](#layerzero-hardhat-helper-tasks)
+ - [Solana Program Verification](#solana-program-verification)
+ - [Troubleshooting](#troubleshooting)
+
+## Prerequisite Knowledge
+
+- [What is an OFT (Omnichain Fungible Token) ?](https://docs.layerzero.network/v2/concepts/applications/oft-standard)
+- [What is an OApp (Omnichain Application) ?](https://docs.layerzero.network/v2/concepts/applications/oapp-standard)
+
+## Requirements
+
+- Rust `1.84.1`
+- Anchor `0.31.1`
+- Solana CLI `2.2.20`
+- Docker `28.3.0`
+- Node.js `>=20.19.5`
+- `pnpm` (recommended) - or another package manager of your choice (npm, yarn)
+- `forge` (optional) - `>=0.2.0` for testing, and if not using Hardhat for compilation
+- Sui CLI (optional, for deploying Sui Move packages)
+- Scarb + Starknet Foundry (optional, for Starknet deployment)
+
+## Scaffold this example
+
+Create your local copy of this example:
+
+```bash
+pnpm dlx create-lz-oapp@latest
+```
+
+Specify the directory, select `OFT (Solana)` and proceed with the installation.
+
+Note that `create-lz-oapp` will also automatically run the dependencies install step for you.
+
+## Helper Tasks
+
+Throughout this walkthrough, helper tasks will be used. For the full list of available helper tasks, refer to the [LayerZero Hardhat Helper Tasks section](#layerzero-hardhat-helper-tasks). All commands can be run at the project root.
+
+## Setup
+
+
+ Docker
+
+
+[Docker](https://docs.docker.com/get-started/get-docker/) is required to build using anchor. We highly recommend that you use the most up-to-date Docker version to avoid any issues with anchor
+builds.
+
+
+
+
+Install Rust
+
+
+```bash
+curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh -s -- -y
+```
+
+
+
+
+Install Solana 2.2.20
+
+
+```bash
+sh -c "$(curl -sSfL https://release.anza.xyz/v2.2.20/install)"
+```
+
+
+
+
+Install Anchor 0.31.1
+
+
+```bash
+cargo install --git https://github.com/solana-foundation/anchor --tag v0.31.1 anchor-cli --locked
+```
+
+
+
+
+
+- Copy `.env.example` into a new `.env`
+- Solana Deployer:
+ - To set up your Solana deployer, you have 3 options:
+ - Use the keypair at the default path of `~/.config/solana/id.json`. For this, no action is needed.
+ - In the `.env`, set `SOLANA_PRIVATE_KEY` - this can be either in base58 string format (i.e. when imported from a wallet) or the Uint8 Array in string format (all in one line, e.g. `[1,1,...1]`).
+ - In the `.env`, set `SOLANA_KEYPAIR_PATH` - the location to the keypair file that you want to use.
+ - Fund your Solana deployer address
+ - Run: `solana airdrop 5 -u devnet`
+ - We recommend that you request 5 devnet SOL, which should be sufficient for this walkthrough. For the example here, we will deploy to **Solana Devnet**.
+ - If you hit rate limits with the above `airdrop` command, you can also use the [official Solana faucet](https://faucet.solana.com/).
+- Solana RPC
+
+ - Also set the `RPC_URL_SOLANA_TESTNET` value. Note that while the naming used here is `TESTNET`, it refers to the [Solana Devnet](https://docs.layerzero.network/v2/developers/evm/technical-reference/deployed-contracts#solana-testnet). We use `TESTNET` to keep it consistent with the existing EVM testnets.
+
+- EVM Deployer:
+
+ - Set up your EVM deployer address/account via the `.env`
+ - You can specify either `MNEMONIC` or `PRIVATE_KEY`:
+
+ ```
+ MNEMONIC="test test test test test test test test test test test junk"
+ or...
+ PRIVATE_KEY="0xabc...def"
+ ```
+
+ - Fund your EVM deployer address with the native tokens of the chains you want to deploy to. This example by default will deploy to the following EVM testnet: **Arbitrum Sepolia**.
+
+- Sui Deployer:
+ - Set `SUI_PRIVATE_KEY` in `.env` (base64 or hex string) and `RPC_URL_SUI` (or `RPC_URL_SUI_TESTNET` for testnet).
+ - Fund the Sui address with enough SUI for gas.
+
+- Starknet Deployer:
+ - Set `STARKNET_ACCOUNT_ADDRESS` and `STARKNET_PRIVATE_KEY` in `.env`.
+ - Set `RPC_URL_STARKNET` (or `RPC_URL_STARKNET_TESTNET` for testnet).
+
+## Build
+
+### Prepare the Solana OFT Program keypair
+
+Create the OFT `programId` keypair by running:
+
+```bash
+anchor keys sync -p oft
+```
+
+
+The above command will generate a keypair for the OFT program in your workspace if it doesn't yet exist, and also automatically update `Anchor.toml` to use the generated keypair's public key. The default path for the program's keypair will be `target/deploy/oft-keypair.json`. The program keypair is only used for initial deployment of the program.
+
+
+View the program ID's based on the generated keypairs:
+
+```
+anchor keys list
+```
+
+You will see an output such as:
+
+```bash
+endpoint: H3SKp4cL5rpzJDntDa2umKE9AHkGiyss1W8BNDndhHWp
+oft: DLZdefiak8Ur82eWp3Fii59RiCRZn3SjNCmweCdhf1DD
+```
+
+Copy the `oft` program ID value for use in the build step later.
+
+### Building the Solana OFT Program
+
+Ensure you have Docker running before running the build command.
+
+#### Build the Solana OFT program
+
+```bash
+anchor build -v -e OFT_ID=
+```
+
+Where `` is replaced with your OFT Program ID copied from the previous step.
+
+> :information_source: For a breakdown of expected rent-exempt costs before deployment, see https://docs.layerzero.network/v2/developers/solana/technical-reference/solana-guidance#previewing-solana-rent-costs.
+
+## Deploy
+
+:information_source: LayerZero's default deployment path for Solana OFTs require you to deploy your own OFT program as this means you own the Upgrade Authority and don't rely on LayerZero to manage that authority for you. Read [this](https://neodyme.io/en/blog/solana_upgrade_authority/) to understand more on why this is important.
+
+To deploy a Solana OFT, you need to both deploy an OFT Program and also create the OFT Store, alongside the other configuration steps that are handled by the provided tasks. To understand the relationship between the OFT Program and the OFT Store, read the section ['The OFT Program'](https://docs.layerzero.network/v2/developers/solana/oft/overview#the-oft-program) on the LayerZero docs.
+
+#### (Recommended) Deploying with a priority fee
+
+The `deploy` command will run with a priority fee. Read the section on ['Deploying Solana programs with a priority fee'](https://docs.layerzero.network/v2/developers/solana/technical-reference/solana-guidance#deploying-solana-programs-with-a-priority-fee) to learn more.
+
+#### Run the deploy command
+
+```bash
+solana program deploy --program-id target/deploy/oft-keypair.json target/verifiable/oft.so -u devnet --with-compute-unit-price
+```
+
+## Deploy (Sui)
+
+Sui OFTs use a two-package pattern: your token package plus the LayerZero OFT package. You will need to capture the
+package/object IDs from the publish/initialization steps for wiring and sending.
+
+0) Ensure `.env` includes Sui keys + RPC
+
+```
+SUI_PRIVATE_KEY=... # base64 or hex
+RPC_URL_SUI=... # mainnet; use RPC_URL_SUI_TESTNET for testnet
+```
+
+1) Create + publish your token package
+
+```bash
+cd examples/oft-main/sui/token
+sui client publish --gas-budget 500000000 --json > token_deploy.json
+TOKEN_PACKAGE=$(jq -r '.objectChanges[] | select(.type=="published") | .packageId' token_deploy.json)
+TREASURY_CAP=$(jq -r '.objectChanges[] | select(.objectType != null and (.objectType | contains("TreasuryCap"))) | .objectId' token_deploy.json)
+COIN_METADATA=$(jq -r '.objectChanges[] | select(.objectType != null and (.objectType | contains("CoinMetadata"))) | .objectId' token_deploy.json)
+echo "TOKEN_PACKAGE=$TOKEN_PACKAGE"
+echo "TREASURY_CAP=$TREASURY_CAP"
+echo "COIN_METADATA=$COIN_METADATA"
+```
+
+Capture:
+- Token package ID
+- TreasuryCap object ID (mint/burn) or escrow balance (adapter)
+- CoinMetadata object ID
+
+2) Publish the LayerZero OFT package
+
+```bash
+cd ../oft
+git clone https://github.com/LayerZero-Labs/LayerZero-v2.git --depth 1
+cp -r LayerZero-v2/packages/layerzero-v2/sui/contracts/oapps/oft/oft/sources ./sources
+rm -rf LayerZero-v2
+
+sui client publish --gas-budget 1000000000 --json > oft_deploy.json
+OFT_PACKAGE=$(jq -r '.objectChanges[] | select(.type=="published") | .packageId' oft_deploy.json)
+OAPP_OBJECT=$(jq -r '.objectChanges[] | select(.objectType != null and (.objectType | contains("::oapp::OApp"))) | select(.owner.Shared) | .objectId' oft_deploy.json)
+INIT_TICKET=$(jq -r '.objectChanges[] | select(.objectType != null and (.objectType | contains("OFTInitTicket"))) | .objectId' oft_deploy.json)
+echo "OFT_PACKAGE=$OFT_PACKAGE"
+echo "OAPP_OBJECT=$OAPP_OBJECT"
+echo "INIT_TICKET=$INIT_TICKET"
+```
+
+Move.toml should reference LayerZero git dependencies:
+- `OApp` (oapp)
+- `OFTCommon` (oft-common)
+- `PtbMoveCall` (ptb-move-call)
+
+The OFT sources should be copied from `LayerZero-v2/packages/layerzero-v2/sui/contracts/oapps/oft/oft/sources`.
+
+Capture:
+- OFT package ID (used as peer on remote chains)
+- OApp object ID
+- OFTInitTicket object ID
+
+3) Initialize the OFT via SDK
+
+Use the OFT SDK to consume the init ticket and create the OFT object. Capture the OFT object ID.
+Use `initOftMoveCall` for mint/burn (TreasuryCap) or `initOftAdapterMoveCall` for lock/unlock.
+
+```bash
+cd ..
+SUI_OFT_PACKAGE_ID=$OFT_PACKAGE \
+SUI_OAPP_OBJECT_ID=$OAPP_OBJECT \
+SUI_OFT_INIT_TICKET=$INIT_TICKET \
+SUI_TREASURY_CAP=$TREASURY_CAP \
+SUI_COIN_METADATA=$COIN_METADATA \
+SUI_TOKEN_TYPE="${TOKEN_PACKAGE}::myoft::MYOFT" \
+node examples/oft-main/sui/init-and-register.js
+```
+
+4) Register OApp + configure
+
+Register the OFT with the Endpoint and set:
+- send/receive libraries
+- DVN/executor configs
+- enforced options
+- peer (last)
+
+Contract info checklist (Sui):
+- OFT package ID (peer on remote chains)
+- OApp object ID
+- OFT object ID
+- OFTInitTicket object ID
+- TreasuryCap object ID (mint/burn) or escrow balance (adapter)
+- CoinMetadata object ID
+- OFTComposerManager address
+ - Mainnet: `0xfbece0b75d097c31b9963402a66e49074b0d3a2a64dd0ed666187ca6911a4d12`
+ - Testnet: `0x90384f5f6034604f76ac99bbdd25bc3c9c646a6e13a27f14b530733a8e98db99`
+
+Required values for oft-main tasks:
+- `suiOftPackageId` (OFT package ID)
+- `suiOftObjectId` (OFT object ID)
+- `suiOappObjectId` (OApp object ID)
+- `suiTokenType` (e.g. `0xTOKEN_PKG::myoft::MYOFT`)
+
+Update `layerzero.config.ts` with a Sui OmniPoint once you have the package ID and object IDs.
+Use the OFT package ID (not object ID) as the peer address on remote chains.
+
+Reference docs:
+https://docs.layerzero.network/v2/developers/sui/oft/overview
+
+## Deploy (Starknet)
+
+Starknet currently supports the OFT Mint/Burn Adapter. You will need the deployed ERC20 token address and the OFT
+adapter address for wiring and sending.
+
+0) Ensure `.env` includes Starknet keys + RPC
+
+```
+STARKNET_ACCOUNT_ADDRESS=0x...
+STARKNET_PRIVATE_KEY=0x...
+RPC_URL_STARKNET=... # mainnet; use RPC_URL_STARKNET_TESTNET for testnet
+```
+
+1) Deploy ERC20MintBurnUpgradeable
+
+```bash
+source ~/.nvm/nvm.sh && nvm use 22
+node examples/oft-main/starknet/deploy-starknet-mainnet.js
+```
+
+This script deploys both the ERC20 and OFT adapter and grants MINTER/BURNER roles. It writes
+`examples/oft-main/starknet/deploy.json` with the deployed addresses.
+
+If you need to deploy manually via Starknet Foundry:
+
+```bash
+# Deploy ERC20MintBurnUpgradeable
+sncast --account deploy \
+ --class-hash 0x01bea3900ebe975f332083d441cac55f807cf5de7b1aa0b7ccbda1de53268500 \
+ --url \
+ --arguments '"MyToken", "MTK", 18, '
+
+# Deploy OFTMintBurnAdapter
+sncast --account deploy \
+ --class-hash 0x07c02E3797d2c7B848FA94820FfB335617820d2c44D82d6B8Cf71c71fbE7dd6E \
+ --url \
+ --arguments ', , 0x524e065abff21d225fb7b28f26ec2f48314ace6094bc085f0a7cf1dc2660f68, , 0x04718f5a0fc34cc1af16a1cdee98ffb20c31f5cd61d6ab07201858f4287c938d, 6'
+```
+
+2) Configure OApp security stack and peers (delegate, libs, DVNs, executor, enforced options, peers last)
+
+Contract info checklist (Starknet):
+- OFTMintBurnAdapter class hash: `0x07c02E3797d2c7B848FA94820FfB335617820d2c44D82d6B8Cf71c71fbE7dd6E`
+- ERC20MintBurnUpgradeable class hash: `0x01bea3900ebe975f332083d441cac55f807cf5de7b1aa0b7ccbda1de53268500`
+- Endpoint address:
+ - Sepolia: `0x0316d70a6e0445a58c486215fac8ead48d3db985acde27efca9130da4c675878`
+ - Mainnet: `0x524e065abff21d225fb7b28f26ec2f48314ace6094bc085f0a7cf1dc2660f68`
+- STRK token address:
+ - `0x04718f5a0fc34cc1af16a1cdee98ffb20c31f5cd61d6ab07201858f4287c938d`
+
+Required values for oft-main tasks:
+- `oftAddress` (OFT Mint/Burn Adapter contract address)
+- `starknetTokenDecimals` (defaults to 18)
+
+Update `layerzero.config.ts` with a Starknet OmniPoint once you have the OFT address.
+Use the OFT adapter contract address (felt252) as the peer address on remote chains.
+
+Reference docs:
+https://docs.layerzero.network/v2/developers/starknet/oft/overview
+
+
+
+:information_source: the `-u` flag specifies the RPC URL that should be used. The options are `mainnet-beta, devnet, testnet, localhost`, which also have their respective shorthands: `-um, -ud, -ut, -ul`
+
+:warning: If the deployment is slow, it could be that the network is congested and you might need to increase the priority fee.
+
+
+
+### Create the Solana OFT
+
+```bash
+pnpm hardhat lz:oft:solana:create --eid 40168 --program-id --only-oft-store true --amount 100000000000
+```
+
+The above command will create a Solana OFT which will have only the OFT Store as the Mint Authority and will also mint 100 OFT (given the default 9 decimals on Solana, this would be `100_000_000_000` in raw amount).
+
+> For an elaboration on the command params for this command to create an Solana OFT, refer to the section [Create Solana OFT](#create-solana-oft)
+
+### Deploy an Arbitrum Sepolia OFT peer
+
+```bash
+pnpm hardhat lz:deploy # follow the prompts
+```
+
+> For EVM OFTs used in this flow, if you need initial tokens on testnet, open the EVM `contracts/MyOFT.sol` and uncomment `_mint(msg.sender, 100000 * (10 ** 18));` in the constructor. Ensure you remove this line for production.
+
+## Enable Messaging
+
+Run the following command to initialize the SendConfig and ReceiveConfig Accounts. This step is unique to pathways that involve Solana.
+
+```bash
+npx hardhat lz:oft:solana:init-config --oapp-config layerzero.config.ts
+```
+
+
+You only need to do this when initializing the OFT pathways the first time. If a new pathway is added later, run this again to initialize the new pathway.
+
+
+
+The OFT standard builds on top of the OApp standard, which enables generic message-passing between chains. After deploying the OFT on the respective chains, you enable messaging by running the [wiring](https://docs.layerzero.network/v2/concepts/glossary#wire--wiring) task.
+
+> :information_source: This example uses the [Simple Config Generator](https://docs.layerzero.network/v2/developers/evm/technical-reference/simple-config), which is recommended over manual configuration.
+
+Run the wiring task:
+
+```bash
+pnpm hardhat lz:oapp:wire --oapp-config layerzero.config.ts
+```
+
+## Sending OFTs
+
+Send From 1 OFT from **Solana Devnet** to **Arbitrum Sepolia**
+
+```bash
+npx hardhat lz:oft:send --src-eid 40168 --dst-eid 40231 --to --amount 1
+```
+
+> :information_source: `40168` and `40231` are the Endpoint IDs of Solana Devnet and Arbitrum Sepolia respectively. View the list of chains and their Endpoint IDs on the [Deployed Endpoints](https://docs.layerzero.network/v2/deployments/deployed-contracts) page.
+
+Send 1 OFT From **Arbitrum Sepolia** to **Solana Devnet**
+
+```bash
+npx hardhat lz:oft:send --src-eid 40231 --dst-eid 40168 --to --amount 1
+```
+
+Send 1 OFT From **Sui Testnet** to **EVM** (requires Sui package/object IDs):
+
+```bash
+npx hardhat lz:oft:send \
+ --src-eid 40245 \
+ --dst-eid 40231 \
+ --to \
+ --amount 1 \
+ --sui-oft-package-id \
+ --sui-oft-object-id \
+ --sui-oapp-object-id \
+ --sui-token-type
+```
+
+Send 1 OFT From **Starknet Testnet** to **EVM**:
+
+```bash
+npx hardhat lz:oft:send \
+ --src-eid 40253 \
+ --dst-eid 40231 \
+ --to \
+ --amount 1 \
+ --oft-address \
+ --starknet-token-decimals 18
+```
+
+Upon a successful send, the script will provide you with the link to the message on LayerZero Scan.
+
+Once the message is delivered, you will be able to click on the destination transaction hash to verify that the OFT was sent.
+
+Congratulations, you have now sent an OFT between Solana and Arbitrum!
+
+> If you run into any issues, refer to [Troubleshooting](#troubleshooting).
+
+## Next Steps
+
+After successfully deploying your OFT, consider the following steps:
+
+- Review the [Choosing between OFT, OFT Adapter and OFT Mint-and-Burn-Adapter](#choosing-between-oft-oft-adapter-and-mint-and-burn-adapter-oft) section
+- Review the [Production Deployment Checklist](#production-deployment-checklist) before going to mainnet
+- Learn about [Security Stack](https://docs.layerzero.network/v2/developers/evm/protocol-gas-settings/security-stack)
+- Understand [Message Execution Options](https://docs.layerzero.network/v2/developers/evm/protocol-gas-settings/options)
+- Wiring **Solana to Aptos** - for Wiring Solana to Aptos please refer to the instructions in [docs/wiring-to-aptos.md](./docs/wiring-to-aptos.md).
+
+## Choosing between OFT, OFT Adapter and Mint and Burn Adapter OFT
+
+This section explains the three different options available for creating OFTs on Solana and when to use each one.
+
+### Decision Tree
+
+
+
+ Do you have an existing Solana token (SPL or Token2022)?
+ │
+ ┌───────────────────────────┴───────────────────────────┐
+ │ │
+ NO YES
+ │ │
+ ✅ Use OFT (Preferred) Can you transfer the
+ • Creates a new token Mint Authority to OFT
+ • Uses burn and mint mechanism Store or new SPL Multisig?
+ │
+ ┌────────────┴────────────┐
+ │ │
+ YES NO/WON'T
+ │ │
+ ✅ Use OFT MABA (Mint-And-Burn Adapter) ⚠️ Use OFT Adapter (Last Resort)
+ • Uses existing token • Uses existing token
+ • Transfers Mint Authority • Keeps existing Mint Authority
+ to OFT Store/Multisig • Uses lock and unlock mechanism
+ • Uses burn and mint mechanism
+
+
+
+### OFT
+
+- **Mechanism**: Burn and mint
+- **Token**: Create new as part of the [create task](#create-solana-oft)
+- **Note**: Preferred option when you don't have an existing token
+
+```bash
+pnpm hardhat lz:oft:solana:create --eid 40168 --program-id --only-oft-store true --amount 100000000000
+```
+
+### OFT Adapter
+
+- **Mechanism**: Lock and unlock
+- **Token**: Use existing
+- **Note**: ⚠️ Last resort option when you can't or won't transfer Mint Authority of existing token
+
+```bash
+pnpm hardhat lz:oft-adapter:solana:create --eid 40168 --program-id --mint --token-program
+```
+
+### OFT Mint-And-Burn Adapter (MABA)
+
+- **Mechanism**: Burn and mint
+- **Token**: Use existing
+- **Note**: ⚠️ Requires transferring Mint Authority to OFT Store or new SPL Multisig. Cannot use if Mint Authority has been renounced.
+
+```bash
+pnpm hardhat lz:oft:solana:create --eid 40168 --program-id --mint --token-program
+```
+
+:warning: **Important for MABA**: Before attempting any cross-chain transfers, you must transfer the Mint Authority for `lz_receive` to work. If you used `--additional-minters`, transfer to the newly created multisig address. Otherwise, set it to the OFT Store address.
+
+## Production Deployment Checklist
+
+
+
+Before deploying, ensure the following:
+
+- (required) for EVM OFTs used in this flow, if you uncommented the testnet mint line in `contracts/MyOFT.sol`, ensure it is commented out for production
+- (recommended) you have profiled the gas usage of `lzReceive` on your destination chains
+
+
+## Appendix
+
+### Running tests
+
+```bash
+pnpm test
+```
+
+### Adding other chains
+
+To add additional chains to your OFT deployment:
+
+1. If EVM, add the new chain configuration to your `hardhat.config.ts`
+2. Deploy the OFT contract on the new chain
+3. Update your `layerzero.config.ts` to include the new chain
+4. Run `init-config` for the new pathway (if it involves Solana)
+5. Run the wiring task
+
+Notes for Sui/Starknet:
+- Use your Sui OFT package ID (not object ID) as the peer address in config.
+- For Starknet, use the OFT contract address (felt252) as the peer address.
+- Ensure `RPC_URL_SUI(_TESTNET)` / `RPC_URL_STARKNET(_TESTNET)` are set before wiring.
+
+### Using Multisigs
+
+For production deployments, consider using multisig wallets:
+
+- Solana: Use [Squads](https://squads.so/) multisig with the `--multisig-key` flag
+- EVM chains: Use Safe or similar multisig solutions
+
+If your Solana OFT's delegate/owner is a Squads multisig, you can simply append the `--multisig-key` flag to the end of tasks such as the `wire` task:
+
+```bash
+pnpm hardhat lz:oapp:wire --oapp-config layerzero.config.ts --multisig-key
+```
+
+### Set a new Mint Authority Multisig
+
+If you are not happy with the deployer being a mint authority, you can create and set a new mint authority by running:
+
+```bash
+pnpm hardhat lz:oft:solana:setauthority --eid --mint --program-id --escrow --additional-minters
+```
+
+The `OFTStore` is automatically added as a mint authority to the newly created mint authority, and does not need to be
+included in the `--additional-minters` list.
+
+### LayerZero Hardhat Helper Tasks
+
+This example includes various helper tasks. For a complete list, run:
+
+```bash
+npx hardhat --help
+```
+
+#### Create Solana OFT
+
+`lz:oft:solana:create`
+
+##### Required Parameters
+
+- **`--eid`** (EndpointId)
+ Solana mainnet (30168) or testnet (40168)
+
+- **`--program-id`** (string)
+ The OFT Program ID
+
+##### Optional Parameters
+
+- **`--amount`** (number)
+ The initial supply to mint on Solana
+ _Default: undefined_
+
+- **`--local-decimals`** (number)
+ Token local decimals
+ _Default: 9_
+
+- **`--shared-decimals`** (number)
+ OFT shared decimals
+ _Default: 6_
+
+- **`--name`** (string)
+ Token Name
+ _Default: "MockOFT"_
+
+- **`--symbol`** (string)
+ Token Symbol
+ _Default: "MOFT"_
+
+- **`--uri`** (string)
+ URI for token metadata
+ _Default: ""_
+
+- **`--seller-fee-basis-points`** (number)
+ Seller fee basis points
+ _Default: 0_
+
+- **`--token-metadata-is-mutable`** (boolean)
+ Whether token metadata is mutable
+ _Default: true_
+
+- **`--additional-minters`** (CSV string)
+ Comma-separated list of additional minters
+ _Default: undefined_
+
+- **`--only-oft-store`** (boolean)
+ If you plan to have only the OFTStore and no additional minters. This is not reversible, and will result in losing the ability to mint new tokens by everything but the OFTStore.
+ _Default: false_
+
+- **`--freeze-authority`** (string)
+ The Freeze Authority address (only supported in onlyOftStore mode)
+ _Default: ""_
+
+##### MABA-Only Parameters
+
+The following parameters are only used for Mint-And-Burn Adapter (MABA) mode:
+
+- **`--mint`** (string)
+ The Token mint public key (used for MABA only)
+ _Default: undefined_
+
+- **`--token-program`** (string)
+ The Token Program public key (used for MABA only)
+ _Default: TOKEN_PROGRAM_ID_
+
+#### Mint Authority Configuration
+
+:information_source: For **OFT**, the SPL token's Mint Authority is set to the **Mint Authority Multisig**, which always has the **OFT Store** as a signer. The multisig is fixed to needing 1 of N signatures.
+
+:information_source: You have the option to specify additional signers through the `--additional-minters` flag. If you choose not to, you must pass in `--only-oft-store true`, which means only the **OFT Store** will be a signer for the **Mint Authority Multisig**.
+
+:warning: If you choose to go with `--only-oft-store`, you will not be able to add in other signers/minters or update the Mint Authority, and the Freeze Authority will be immediately renounced. The token Mint Authority will be fixed Mint Authority Multisig address while the Freeze Authority will be set to None.
+
+##### Important Notes
+
+:warning: Use `--additional-minters` flag to add a CSV of additional minter addresses to the Mint Authority Multisig. If you do not want to, you must specify `--only-oft-store true`.
+
+
+ pnpm hardhat lz:oft:solana:debug --eid
+
+
+
+Fetches and prints info related to the Solana OFT.
+
+
+
+### Note on the LZ Config file
+
+In [layerzero.config.ts](./layerzero.config.ts), the `solanaContract.address` is auto-populated with the `oftStore` address from the deployment file, which has the default path of `deployments/solana-`.
+
+```typescript
+const solanaContract: OmniPointHardhat = {
+ eid: EndpointId.SOLANA_V2_TESTNET,
+ address: getOftStoreAddress(EndpointId.SOLANA_V2_TESTNET),
+};
+```
+
+:warning: Ensure that you `address` is specified only for the solana contract object. Do not specify addresses for the EVM chain contract objects. Under the hood, we use `hardhat-deploy` to retrieve the contract addresses of the deployed EVM chain contracts. You will run into an error if you specify `address` for an EVM chain contract object.
+
+### Mint OFT on Solana
+
+
+
+This is only relevant for **OFT**. If you opted to include the `--amount` flag in the create step, that means you already have minted some Solana OFT and you can skip this section.
+
+:information_source: This is only possible if you specified your deployer address as part of the `--additional-minters` flag when creating the Solana OFT. If you had chosen `--only-oft-store true`, you will not be able to mint your OFT on Solana.
+
+First, you need to create the Associated Token Account for your address.
+
+```bash
+spl-token create-account
+```
+
+Then, you can mint. Note that the `spl-token` CLI expects the human-readable token amount and not the raw integer value for the `` param. This means, to mint 1 OFT, you would specify `1` as the amount. The `spl-token` handles the multiplication by `10^decimals` for you.
+
+```bash
+spl-token mint --multisig-signer ~/.config/solana/id.json --owner
+```
+
+:information_source: `~/.config/solana/id.json` assumes that you will use the keypair in the default location. To verify if this path applies to you, run `solana config get` and not the keypair path value.
+
+:information_source: You can get the `` address from [deployments/solana-testnet/OFT.json](deployments/solana-testnet/OFT.json).
+
+### Solana Program Verification
+
+Refer to [Verify the OFT Program](https://docs.layerzero.network/v2/developers/solana/oft/overview#optional-verify-the-oft-program).
+
+### Troubleshooting
+
+Refer to the [Solana Troubleshooting page on the LayerZero Docs](https://docs.layerzero.network/v2/developers/solana/troubleshooting/common-errors) to see how to solve common error when deploying Solana OFTs.
diff --git a/examples/oft-main/contracts/MyOFT.sol b/examples/oft-main/contracts/MyOFT.sol
new file mode 100644
index 0000000000..b3bce4c9a5
--- /dev/null
+++ b/examples/oft-main/contracts/MyOFT.sol
@@ -0,0 +1,16 @@
+// SPDX-License-Identifier: UNLICENSED
+pragma solidity ^0.8.22;
+
+import { Ownable } from "@openzeppelin/contracts/access/Ownable.sol";
+import { OFT } from "@layerzerolabs/oft-evm/contracts/OFT.sol";
+
+contract MyOFT is OFT {
+ constructor(
+ string memory _name,
+ string memory _symbol,
+ address _lzEndpoint,
+ address _delegate
+ ) OFT(_name, _symbol, _lzEndpoint, _delegate) Ownable(_delegate) {
+ _mint(msg.sender, 100000 * (10 ** 18));
+ }
+}
diff --git a/examples/oft-main/contracts/mocks/MyOFTMock.sol b/examples/oft-main/contracts/mocks/MyOFTMock.sol
new file mode 100644
index 0000000000..3ebb888d4c
--- /dev/null
+++ b/examples/oft-main/contracts/mocks/MyOFTMock.sol
@@ -0,0 +1,18 @@
+// SPDX-License-Identifier: UNLICENSED
+pragma solidity ^0.8.22;
+
+import { MyOFT } from "../MyOFT.sol";
+
+// @dev WARNING: This is for testing purposes only
+contract MyOFTMock is MyOFT {
+ constructor(
+ string memory _name,
+ string memory _symbol,
+ address _lzEndpoint,
+ address _delegate
+ ) MyOFT(_name, _symbol, _lzEndpoint, _delegate) {}
+
+ function mint(address _to, uint256 _amount) public {
+ _mint(_to, _amount);
+ }
+}
diff --git a/examples/oft-main/deploy/MyOFT.ts b/examples/oft-main/deploy/MyOFT.ts
new file mode 100644
index 0000000000..5e1685ae1e
--- /dev/null
+++ b/examples/oft-main/deploy/MyOFT.ts
@@ -0,0 +1,53 @@
+import assert from 'assert'
+
+import { type DeployFunction } from 'hardhat-deploy/types'
+
+const contractName = 'MyOFT'
+
+const deploy: DeployFunction = async (hre) => {
+ const { getNamedAccounts, deployments } = hre
+
+ const { deploy } = deployments
+ const { deployer } = await getNamedAccounts()
+
+ assert(deployer, 'Missing named deployer account')
+
+ console.log(`Network: ${hre.network.name}`)
+ console.log(`Deployer: ${deployer}`)
+
+ // This is an external deployment pulled in from @layerzerolabs/lz-evm-sdk-v2
+ //
+ // @layerzerolabs/toolbox-hardhat takes care of plugging in the external deployments
+ // from @layerzerolabs packages based on the configuration in your hardhat config
+ //
+ // For this to work correctly, your network config must define an eid property
+ // set to `EndpointId` as defined in @layerzerolabs/lz-definitions
+ //
+ // For example:
+ //
+ // networks: {
+ // 'arbitrum-sepolia': {
+ // ...
+ // eid: 40231 // Arbitrum Sepolia
+ // }
+ // }
+ const endpointV2Deployment = await hre.deployments.get('EndpointV2')
+
+ const { address } = await deploy(contractName, {
+ from: deployer,
+ args: [
+ 'MyOFT', // name
+ 'MOFT', // symbol
+ endpointV2Deployment.address, // LayerZero's EndpointV2 address
+ deployer, // owner
+ ],
+ log: true,
+ skipIfAlreadyDeployed: false,
+ })
+
+ console.log(`Deployed contract: ${contractName}, network: ${hre.network.name}, address: ${address}`)
+}
+
+deploy.tags = [contractName]
+
+export default deploy
diff --git a/examples/oft-main/docs/move.layerzero.config.ts b/examples/oft-main/docs/move.layerzero.config.ts
new file mode 100644
index 0000000000..ac5091bb12
--- /dev/null
+++ b/examples/oft-main/docs/move.layerzero.config.ts
@@ -0,0 +1,121 @@
+// NOTE: This config is an example for wiring Solana -> Aptos.
+// See wiring-to-aptos.md for more information.
+import { EndpointId } from '@layerzerolabs/lz-definitions'
+import { ExecutorOptionType } from '@layerzerolabs/lz-v2-utilities'
+import { OAppOmniGraphHardhat, OmniPointHardhat } from '@layerzerolabs/toolbox-hardhat'
+
+enum MsgType {
+ SEND = 1,
+ SEND_AND_CALL = 2,
+}
+const aptosContract: OmniPointHardhat = {
+ eid: EndpointId.APTOS_V2_TESTNET as EndpointId,
+ address: 'YOUR_DEPLOYED_APTOS_OFT_ADDRESS',
+}
+const solanaContract: OmniPointHardhat = {
+ eid: EndpointId.SOLANA_V2_TESTNET as EndpointId,
+ address: 'YOUR_DEPLOYED_SOLANA_OAPP_ADDRESS',
+}
+
+const layerZeroDVNAptosAddress = '0x756f8ab056688d22687740f4a9aeec3b361170b28d08b719e28c4d38eed1043e'
+const layerZeroDVNSolanaAddress = '4VDjp6XQaxoZf5RGwiPU9NR1EXSZn2TP4ATMmiSzLfhb'
+
+const config: OAppOmniGraphHardhat = {
+ contracts: [
+ {
+ contract: solanaContract,
+ config: {
+ owner: 'YOUR_SOLANA_OWNER_ADDRESS',
+ delegate: 'YOUR_SOLANA_OWNER_ADDRESS',
+ },
+ },
+ {
+ contract: aptosContract,
+ config: {
+ owner: 'YOUR_APTOS_ACCOUNT_ADDRESS',
+ delegate: 'YOUR_APTOS_ACCOUNT_ADDRESS',
+ },
+ },
+ ],
+ connections: [
+ {
+ from: aptosContract,
+ to: solanaContract,
+ config: {
+ enforcedOptions: [
+ {
+ msgType: MsgType.SEND_AND_CALL,
+ optionType: ExecutorOptionType.LZ_RECEIVE,
+ gas: 5_000,
+ value: 0,
+ },
+ ],
+ sendLibrary: '0xcc1c03aed42e2841211865758b5efe93c0dde2cb7a2a5dc6cf25a4e33ad23690',
+ receiveLibraryConfig: {
+ receiveLibrary: '0xcc1c03aed42e2841211865758b5efe93c0dde2cb7a2a5dc6cf25a4e33ad23690',
+ gracePeriod: BigInt(0),
+ },
+ sendConfig: {
+ executorConfig: {
+ maxMessageSize: 10_000,
+ executor: '0x93353700091200ef9fdc536ce6a86182cc7e62da25f94356be9421c6310b9585',
+ },
+ ulnConfig: {
+ confirmations: BigInt(10),
+ requiredDVNs: [layerZeroDVNAptosAddress],
+ optionalDVNs: [],
+ optionalDVNThreshold: 0,
+ },
+ },
+ receiveConfig: {
+ ulnConfig: {
+ confirmations: BigInt(15),
+ requiredDVNs: [layerZeroDVNAptosAddress],
+ optionalDVNs: [],
+ optionalDVNThreshold: 0,
+ },
+ },
+ },
+ },
+ {
+ from: solanaContract,
+ to: aptosContract,
+ config: {
+ enforcedOptions: [
+ {
+ msgType: 1,
+ optionType: ExecutorOptionType.LZ_RECEIVE,
+ gas: 200_000,
+ value: 0,
+ },
+ ],
+ sendLibrary: '7a4WjyR8VZ7yZz5XJAKm39BUGn5iT9CKcv2pmG9tdXVH',
+ receiveLibraryConfig: {
+ receiveLibrary: '7a4WjyR8VZ7yZz5XJAKm39BUGn5iT9CKcv2pmG9tdXVH',
+ gracePeriod: BigInt(0),
+ },
+ sendConfig: {
+ executorConfig: {
+ maxMessageSize: 10_000,
+ executor: 'AwrbHeCyniXaQhiJZkLhgWdUCteeWSGaSN1sTfLiY7xK',
+ },
+ ulnConfig: {
+ confirmations: BigInt(15),
+ requiredDVNs: [layerZeroDVNSolanaAddress],
+ optionalDVNs: [],
+ optionalDVNThreshold: 0,
+ },
+ },
+ receiveConfig: {
+ ulnConfig: {
+ confirmations: BigInt(10),
+ requiredDVNs: [layerZeroDVNSolanaAddress],
+ optionalDVNs: [],
+ optionalDVNThreshold: 0,
+ },
+ },
+ },
+ },
+ ],
+}
+export default config
diff --git a/examples/oft-main/docs/wiring-to-aptos.md b/examples/oft-main/docs/wiring-to-aptos.md
new file mode 100644
index 0000000000..79a6ce17b4
--- /dev/null
+++ b/examples/oft-main/docs/wiring-to-aptos.md
@@ -0,0 +1,63 @@
+### Wiring Solana to Move-VM (Aptos, Initia, Movement, etc.)
+
+:warning: **Important Limitations for Solana ↔ Move-VM Pathways**
+
+Currently, you can only perform **one-way wiring from Solana → Move-VM** using this example. For the reverse pathway (Move-VM → Solana), you must use the [OFT Aptos Move example](https://github.com/LayerZero-Labs/devtools/tree/main/examples/oft-aptos-move). Please follow the deployment instructions in the README.md of the `oft-aptos-move` example for deploying to Move-VM and configuring the Move-VM → Solana pathway.
+
+#### Configuration Steps for Solana → Aptos
+
+:information_source: **For bidirectional Solana ↔ Aptos communication, deploy both examples:**
+
+- **Solana → Aptos**: Use this example
+- **Aptos → Solana**: Use the [OFT Aptos Move example](https://github.com/LayerZero-Labs/devtools/tree/main/examples/oft-aptos-move)
+
+#### Deployment Process
+
+1. **Create and Deploy Solana Example**
+
+ - Create the Solana example: `LZ_ENABLE_SOLANA_OAPP_EXAMPLE=1 npx create-lz-oapp@latest`
+ - Deploy to Solana following the deployment instructions in the Solana example README
+
+2. **Create and Deploy Aptos Move Example**
+
+ - Create the Aptos Move example: `LZ_ENABLE_EXPERIMENTAL_MOVE_VM_EXAMPLES=1 npx create-lz-oapp@latest`
+ - Deploy to Aptos following the deployment and initialization instructions in the Aptos example README
+
+ Your directory structure should look like this:
+
+ ```
+ your-folder/
+ ├── your-aptos-example/
+ └── your-solana-example/
+ ```
+
+3. **Configure Solana Example**
+
+ - Navigate to the Solana example directory
+ - Use the example configuration at `./docs/move.layerzero.config.ts`
+ - Fill out the configuration with your desired values
+ - Replace `./layerzero.config.ts` with the completed `move.layerzero.config.ts` file
+
+4. **Wire Solana to Aptos**
+
+ Execute the following commands in the Solana example directory:
+
+ ```bash
+ npx hardhat lz:oapp:solana:init-config --oapp-config move.layerzero.config.ts
+ ```
+
+ ```bash
+ npx hardhat lz:oapp:wire --oapp-config move.layerzero.config.ts
+ ```
+
+ If these commands succeed, you have successfully wired the Solana contract to the Aptos Move contract.
+
+5. **Wire Aptos to Solana**
+
+ - Transfer the `move.layerzero.config.ts` file from the Solana example to the Aptos Move example directory
+ - In the Aptos Move example directory, run:
+ ```bash
+ pnpm run lz:sdk:move:wire --oapp-config move.layerzero.config.ts
+ ```
+
+ If this command succeeds, you are ready to test the bidirectional pathway.
diff --git a/examples/oft-main/foundry.toml b/examples/oft-main/foundry.toml
new file mode 100644
index 0000000000..9819f073e1
--- /dev/null
+++ b/examples/oft-main/foundry.toml
@@ -0,0 +1,30 @@
+[profile.default]
+solc-version = '0.8.22'
+src = 'contracts'
+out = 'out'
+test = 'test/foundry'
+cache_path = 'cache/foundry'
+optimizer = true
+optimizer_runs = 20_000
+
+libs = [
+ # We provide a set of useful contract utilities
+ # in the lib directory of @layerzerolabs/toolbox-foundry:
+ #
+ # - forge-std
+ # - ds-test
+ # - solidity-bytes-utils
+ 'node_modules/@layerzerolabs/toolbox-foundry/lib',
+ 'node_modules',
+]
+
+remappings = [
+ # Due to a misconfiguration of solidity-bytes-utils, an outdated version
+ # of forge-std is being dragged in
+ #
+ # To remedy this, we'll remap the ds-test and forge-std imports to our own versions
+ 'ds-test/=node_modules/@layerzerolabs/toolbox-foundry/lib/ds-test',
+ 'forge-std/=node_modules/@layerzerolabs/toolbox-foundry/lib/forge-std',
+ '@layerzerolabs/=node_modules/@layerzerolabs/',
+ '@openzeppelin/=node_modules/@openzeppelin/',
+]
diff --git a/examples/oft-main/hardhat.config.ts b/examples/oft-main/hardhat.config.ts
new file mode 100644
index 0000000000..e9e2c1d626
--- /dev/null
+++ b/examples/oft-main/hardhat.config.ts
@@ -0,0 +1,91 @@
+// Force ts-node to use CommonJS mode
+// This must be set before any imports
+process.env.TS_NODE_COMPILER_OPTIONS = JSON.stringify({
+ module: 'commonjs',
+ esModuleInterop: true,
+})
+
+// Get the environment configuration from .env file
+//
+// To make use of automatic environment setup:
+// - Duplicate .env.example file and name it .env
+// - Fill in the environment variables
+import 'dotenv/config'
+
+import 'hardhat-deploy'
+import '@nomicfoundation/hardhat-ethers'
+import '@nomiclabs/hardhat-waffle'
+import 'hardhat-deploy-ethers'
+import 'hardhat-contract-sizer'
+import '@nomiclabs/hardhat-ethers'
+import '@layerzerolabs/toolbox-hardhat'
+
+import { HardhatUserConfig, HttpNetworkAccountsUserConfig } from 'hardhat/types'
+
+import { EndpointId } from '@layerzerolabs/lz-definitions'
+
+import './tasks/index'
+
+// Set your preferred authentication method
+//
+// If you prefer using a mnemonic, set a MNEMONIC environment variable
+// to a valid mnemonic
+const MNEMONIC = process.env.MNEMONIC
+
+// If you prefer to be authenticated using a private key, set a PRIVATE_KEY environment variable
+const PRIVATE_KEY = process.env.PRIVATE_KEY
+
+const accounts: HttpNetworkAccountsUserConfig | undefined = MNEMONIC
+ ? { mnemonic: MNEMONIC }
+ : PRIVATE_KEY
+ ? [PRIVATE_KEY]
+ : undefined
+
+if (accounts == null) {
+ console.warn(
+ 'Could not find MNEMONIC or PRIVATE_KEY environment variables. It will not be possible to execute transactions in your example.'
+ )
+}
+
+const config: HardhatUserConfig = {
+ paths: {
+ cache: 'cache/hardhat',
+ tests: 'test/hardhat',
+ },
+ solidity: {
+ compilers: [
+ {
+ version: '0.8.22',
+ settings: {
+ optimizer: {
+ enabled: true,
+ runs: 200,
+ },
+ },
+ },
+ ],
+ },
+ networks: {
+ arbitrum: {
+ eid: EndpointId.ARBITRUM_V2_MAINNET,
+ url: process.env.RPC_URL_ARBITRUM || 'https://arb1.arbitrum.io/rpc',
+ accounts,
+ },
+ 'arbitrum-sepolia': {
+ eid: EndpointId.ARBSEP_V2_TESTNET,
+ url: process.env.RPC_URL_ARB_SEPOLIA || 'https://arbitrum-sepolia.gateway.tenderly.co',
+ accounts,
+ },
+ hardhat: {
+ // Need this for testing because TestHelperOz5.sol is exceeding the compiled contract size limit
+ allowUnlimitedContractSize: true,
+ },
+ },
+ namedAccounts: {
+ deployer: {
+ default: 0, // wallet address of index[0], of the mnemonic in .env
+ },
+ },
+}
+
+export default config
diff --git a/examples/oft-main/jest.config.ts b/examples/oft-main/jest.config.ts
new file mode 100644
index 0000000000..a5634529d9
--- /dev/null
+++ b/examples/oft-main/jest.config.ts
@@ -0,0 +1,12 @@
+/** @type {import('ts-jest').JestConfigWithTsJest} */
+module.exports = {
+ reporters: [['github-actions', { silent: false }], 'default'],
+ testEnvironment: 'node',
+ testTimeout: 15000,
+ moduleNameMapper: {
+ '^@/(.*)$': '/src/$1',
+ },
+ transform: {
+ '^.+\\.(t|j)sx?$': '@swc/jest',
+ },
+}
diff --git a/examples/oft-main/junk-id.json b/examples/oft-main/junk-id.json
new file mode 100644
index 0000000000..8ccf579ceb
--- /dev/null
+++ b/examples/oft-main/junk-id.json
@@ -0,0 +1,6 @@
+[
+ 101, 96, 5, 237, 143, 245, 198, 118, 241, 242, 185, 196, 246, 72, 152, 231,
+ 30, 170, 168, 48, 19, 92, 179, 54, 175, 98, 167, 177, 62, 91, 162, 83, 255,
+ 175, 71, 42, 217, 187, 228, 197, 222, 137, 131, 197, 89, 69, 190, 209, 113,
+ 186, 78, 149, 158, 115, 255, 26, 162, 25, 122, 247, 1, 33, 92, 96
+]
diff --git a/examples/oft-main/layerzero.config.ts b/examples/oft-main/layerzero.config.ts
new file mode 100644
index 0000000000..c17e5ffec9
--- /dev/null
+++ b/examples/oft-main/layerzero.config.ts
@@ -0,0 +1,99 @@
+import fs from 'node:fs'
+import path from 'node:path'
+
+import { EndpointId } from '@layerzerolabs/lz-definitions'
+import { ExecutorOptionType } from '@layerzerolabs/lz-v2-utilities'
+import { generateConnectionsConfig } from '@layerzerolabs/metadata-tools'
+import { OAppEnforcedOption, OmniPointHardhat } from '@layerzerolabs/toolbox-hardhat'
+
+// import { getOftStoreAddress } from './tasks/solana'
+
+// Note: Do not use address for EVM OmniPointHardhat contracts. Contracts are loaded using hardhat-deploy.
+// If you do use an address, ensure artifacts exists.
+const arbitrumContract: OmniPointHardhat = {
+ eid: EndpointId.ARBITRUM_V2_MAINNET,
+ contractName: 'MyOFT', // Note: change this to your production contract name
+}
+//
+// const solanaContract: OmniPointHardhat = {
+// eid: EndpointId.SOLANA_V2_MAINNET,
+// address: getOftStoreAddress(EndpointId.SOLANA_V2_MAINNET),
+// }
+
+const EVM_ENFORCED_OPTIONS: OAppEnforcedOption[] = [
+ {
+ msgType: 1,
+ optionType: ExecutorOptionType.LZ_RECEIVE,
+ gas: 80000,
+ value: 0,
+ },
+]
+
+const CU_LIMIT = 200000 // This represents the CU limit for executing the `lz_receive` function on Solana.
+const SPL_TOKEN_ACCOUNT_RENT_VALUE = 2039280 // This figure represents lamports (https://solana.com/docs/references/terminology#lamport) on Solana. Read below for more details.
+/*
+ * Elaboration on `value` when sending OFTs to Solana:
+ * When sending OFTs to Solana, SOL is needed for rent (https://solana.com/docs/core/accounts#rent) to initialize the recipient's token account.
+ * The `2039280` lamports value is the exact rent value needed for SPL token accounts (0.00203928 SOL).
+ * For Token2022 token accounts, you will need to increase `value` to a higher amount, which depends on the token account size, which in turn depends on the extensions that you enable.
+ */
+
+const SOLANA_ENFORCED_OPTIONS: OAppEnforcedOption[] = [
+ {
+ msgType: 1,
+ optionType: ExecutorOptionType.LZ_RECEIVE,
+ gas: CU_LIMIT,
+ value: SPL_TOKEN_ACCOUNT_RENT_VALUE,
+ },
+]
+
+const SUI_ENFORCED_OPTIONS: OAppEnforcedOption[] = [
+ {
+ msgType: 1,
+ optionType: ExecutorOptionType.LZ_RECEIVE,
+ gas: 5000, // Sufficient for Sui lzReceive execution
+ value: 0,
+ },
+]
+
+type SuiDeployment = {
+ oftPackageId: string
+}
+
+const loadJson = (relativePath: string): T => {
+ const fullPath = path.join(__dirname, relativePath)
+ if (!fs.existsSync(fullPath)) {
+ throw new Error(`Missing required deployment file: ${relativePath}`)
+ }
+ return JSON.parse(fs.readFileSync(fullPath, 'utf8')) as T
+}
+
+const suiDeployment = loadJson('./sui/deploy.json')
+
+const suiContract: OmniPointHardhat = {
+ eid: EndpointId.SUI_V2_MAINNET,
+ address: suiDeployment.oftPackageId,
+}
+
+// Learn about Message Execution Options: https://docs.layerzero.network/v2/developers/solana/oft/overview#message-execution-options
+// Learn more about the Simple Config Generator - https://docs.layerzero.network/v2/developers/evm/technical-reference/simple-config
+export default async function () {
+ // note: pathways declared here are automatically bidirectional
+ // if you declare A,B there's no need to declare B,A
+ const pathways = [
+ [
+ arbitrumContract,
+ suiContract,
+ [['LayerZero Labs'], []],
+ [15, 15],
+ [SUI_ENFORCED_OPTIONS, EVM_ENFORCED_OPTIONS],
+ ],
+ ] as const
+
+ const connections = await generateConnectionsConfig(pathways as any)
+
+ return {
+ contracts: [{ contract: arbitrumContract }, { contract: suiContract }],
+ connections,
+ }
+}
diff --git a/examples/oft-main/package.json b/examples/oft-main/package.json
new file mode 100644
index 0000000000..0f0d36ebfe
--- /dev/null
+++ b/examples/oft-main/package.json
@@ -0,0 +1,136 @@
+{
+ "name": "@layerzerolabs/oft-main-example",
+ "version": "0.12.11",
+ "private": true,
+ "scripts": {
+ "clean": "rm -rf target artifacts cache out .anchor",
+ "compile": "concurrently -c auto --names forge,hardhat,anchor '$npm_execpath run compile:forge' '$npm_execpath run compile:hardhat' '$npm_execpath run compile:anchor'",
+ "compile:anchor": "anchor build",
+ "compile:forge": "forge build",
+ "compile:hardhat": "hardhat compile",
+ "lint": "$npm_execpath run lint:js && $npm_execpath run lint:sol",
+ "lint:fix": "eslint --fix '**/*.{js,ts,json}' && prettier --write . && solhint 'contracts/**/*.sol' --fix --noPrompt",
+ "lint:js": "eslint '**/*.{js,ts,json}' && prettier --check .",
+ "lint:sol": "solhint 'contracts/**/*.sol'",
+ "test": "$npm_execpath run test:forge && $npm_execpath run test:hardhat",
+ "test:anchor": "anchor test",
+ "test:forge": "forge test",
+ "test:hardhat": "hardhat test",
+ "test:scripts": "jest --config jest.config.ts --runInBand --testMatch \"**/*.script.test.ts\""
+ },
+ "resolutions": {
+ "@solana/web3.js": "^1.98.0",
+ "ethers": "^5.7.2",
+ "hardhat-deploy": "^0.12.1"
+ },
+ "devDependencies": {
+ "@coral-xyz/anchor": "^0.31.1",
+ "@ethersproject/abi": "^5.7.0",
+ "@ethersproject/abstract-signer": "^5.7.0",
+ "@ethersproject/bytes": "^5.7.0",
+ "@ethersproject/contracts": "^5.7.0",
+ "@ethersproject/providers": "^5.7.0",
+ "@layerzerolabs/devtools": "workspace:^2.0.5",
+ "@layerzerolabs/devtools-evm": "~3.0.0",
+ "@layerzerolabs/devtools-evm-hardhat": "^4.0.0",
+ "@layerzerolabs/devtools-solana": "~3.0.6",
+ "@layerzerolabs/devtools-starknet": "~0.1.0",
+ "@layerzerolabs/devtools-sui": "workspace:^0.1.0",
+ "@layerzerolabs/eslint-config-next": "~2.3.39",
+ "@layerzerolabs/io-devtools": "~0.3.0",
+ "@layerzerolabs/lz-definitions": "^3.0.86",
+ "@layerzerolabs/lz-evm-messagelib-v2": "^3.0.86",
+ "@layerzerolabs/lz-evm-protocol-v2": "^3.0.86",
+ "@layerzerolabs/lz-evm-v1-0.7": "^3.0.86",
+ "@layerzerolabs/lz-solana-sdk-v2": "^3.0.136",
+ "@layerzerolabs/lz-sui-oft-sdk-v2": "^3.0.156",
+ "@layerzerolabs/lz-sui-sdk-v2": "^3.0.156",
+ "@layerzerolabs/lz-v2-utilities": "^3.0.86",
+ "@layerzerolabs/metadata-tools": "workspace:^3.0.2",
+ "@layerzerolabs/oapp-evm": "^0.4.0",
+ "@layerzerolabs/oft-evm": "^4.0.0",
+ "@layerzerolabs/oft-mint-burn-starknet": "^0.2.19",
+ "@layerzerolabs/oft-v2-solana-sdk": "^3.0.136",
+ "@layerzerolabs/prettier-config-next": "^2.3.39",
+ "@layerzerolabs/protocol-devtools": "^3.0.0",
+ "@layerzerolabs/protocol-devtools-evm": "~5.0.0",
+ "@layerzerolabs/protocol-devtools-solana": "^8.0.3",
+ "@layerzerolabs/protocol-devtools-starknet": "~0.1.0",
+ "@layerzerolabs/protocol-devtools-sui": "workspace:^0.1.0",
+ "@layerzerolabs/protocol-starknet-v2": "^0.2.19",
+ "@layerzerolabs/solhint-config": "^3.0.12",
+ "@layerzerolabs/test-devtools-evm-foundry": "~8.0.0",
+ "@layerzerolabs/test-devtools-evm-hardhat": "~0.5.2",
+ "@layerzerolabs/toolbox-foundry": "~0.1.12",
+ "@layerzerolabs/toolbox-hardhat": "~0.6.12",
+ "@layerzerolabs/ua-devtools": "~5.0.0",
+ "@layerzerolabs/ua-devtools-evm": "~7.0.0",
+ "@layerzerolabs/ua-devtools-evm-hardhat": "~9.0.0",
+ "@layerzerolabs/ua-devtools-solana": "~8.0.2",
+ "@layerzerolabs/ua-devtools-starknet": "~0.1.0",
+ "@layerzerolabs/ua-devtools-sui": "workspace:^0.1.0",
+ "@metaplex-foundation/mpl-token-metadata": "^3.2.1",
+ "@metaplex-foundation/mpl-toolbox": "^0.9.4",
+ "@metaplex-foundation/umi": "^0.9.2",
+ "@metaplex-foundation/umi-bundle-defaults": "^0.9.2",
+ "@metaplex-foundation/umi-eddsa-web3js": "^0.9.2",
+ "@metaplex-foundation/umi-public-keys": "^0.8.9",
+ "@metaplex-foundation/umi-web3js-adapters": "^0.9.2",
+ "@mysten/bcs": "^1.9.2",
+ "@mysten/sui": "^1.45.2",
+ "@nomicfoundation/hardhat-ethers": "^3.0.5",
+ "@nomiclabs/hardhat-ethers": "^2.2.3",
+ "@nomiclabs/hardhat-waffle": "^2.0.6",
+ "@openzeppelin/contracts": "^5.0.2",
+ "@openzeppelin/contracts-upgradeable": "^5.0.2",
+ "@rushstack/eslint-patch": "^1.7.0",
+ "@safe-global/safe-core-sdk-types": "^2.3.0",
+ "@solana-developers/helpers": "~2.8.1",
+ "@solana/spl-token": "^0.4.8",
+ "@solana/web3.js": "~1.95.8",
+ "@sqds/sdk": "^2.0.4",
+ "@swc/core": "^1.4.0",
+ "@swc/jest": "^0.2.36",
+ "@types/chai": "^4.3.11",
+ "@types/jest": "^29.5.12",
+ "@types/mocha": "^10.0.6",
+ "@types/node": "~18.18.14",
+ "bs58": "^6.0.0",
+ "chai": "^4.4.1",
+ "concurrently": "~9.1.0",
+ "dotenv": "^16.4.5",
+ "eslint": "^8.55.0",
+ "eslint-plugin-jest-extended": "~2.0.0",
+ "ethereumjs-util": "^7.1.5",
+ "ethers": "^5.7.2",
+ "exponential-backoff": "~3.1.1",
+ "fp-ts": "^2.16.2",
+ "hardhat": "^2.22.10",
+ "hardhat-contract-sizer": "^2.10.0",
+ "hardhat-deploy": "^0.12.1",
+ "hardhat-deploy-ethers": "^0.4.2",
+ "jest": "^29.7.0",
+ "mocha": "^10.2.0",
+ "prettier": "^3.2.5",
+ "solhint": "^4.1.1",
+ "solidity-bytes-utils": "^0.8.2",
+ "starknet": "^8.9.0",
+ "ts-node": "^10.9.2",
+ "typescript": "^5.4.4"
+ },
+ "engines": {
+ "node": ">=20.19.5"
+ },
+ "pnpm": {
+ "overrides": {
+ "@solana/web3.js": "^1.98.0",
+ "ethers": "^5.7.2",
+ "hardhat-deploy": "^0.12.1"
+ }
+ },
+ "overrides": {
+ "@solana/web3.js": "^1.98.0",
+ "ethers": "^5.7.2",
+ "hardhat-deploy": "^0.12.1"
+ }
+}
diff --git a/examples/oft-main/pnpm-lock.yaml b/examples/oft-main/pnpm-lock.yaml
new file mode 100644
index 0000000000..a6f807a317
--- /dev/null
+++ b/examples/oft-main/pnpm-lock.yaml
@@ -0,0 +1,13283 @@
+lockfileVersion: '6.0'
+
+settings:
+ autoInstallPeers: true
+ excludeLinksFromLockfile: false
+
+overrides:
+ '@solana/web3.js': ^1.98.0
+ ethers: ^5.7.2
+ hardhat-deploy: ^0.12.1
+
+devDependencies:
+ '@coral-xyz/anchor':
+ specifier: ^0.31.1
+ version: 0.31.1(typescript@5.9.3)
+ '@ethersproject/abi':
+ specifier: ^5.7.0
+ version: 5.8.0
+ '@ethersproject/abstract-signer':
+ specifier: ^5.7.0
+ version: 5.8.0
+ '@ethersproject/bytes':
+ specifier: ^5.7.0
+ version: 5.8.0
+ '@ethersproject/contracts':
+ specifier: ^5.7.0
+ version: 5.8.0
+ '@ethersproject/providers':
+ specifier: ^5.7.0
+ version: 5.8.0
+ '@layerzerolabs/devtools':
+ specifier: ~2.0.3
+ version: 2.0.3(@ethersproject/bytes@5.8.0)(@layerzerolabs/io-devtools@0.3.1)(@layerzerolabs/lz-definitions@3.0.142)(zod@3.25.76)
+ '@layerzerolabs/devtools-evm':
+ specifier: ~3.0.0
+ version: 3.0.0(@ethersproject/abi@5.8.0)(@ethersproject/abstract-provider@5.8.0)(@ethersproject/abstract-signer@5.8.0)(@ethersproject/address@5.7.0)(@ethersproject/bignumber@5.8.0)(@ethersproject/constants@5.8.0)(@ethersproject/contracts@5.8.0)(@ethersproject/providers@5.8.0)(@layerzerolabs/devtools@2.0.3)(@layerzerolabs/io-devtools@0.3.1)(@layerzerolabs/lz-definitions@3.0.142)(fp-ts@2.16.11)(zod@3.25.76)
+ '@layerzerolabs/devtools-evm-hardhat':
+ specifier: ^4.0.0
+ version: 4.0.1(@ethersproject/abi@5.8.0)(@ethersproject/abstract-signer@5.8.0)(@ethersproject/contracts@5.8.0)(@ethersproject/providers@5.8.0)(@layerzerolabs/devtools-evm@3.0.0)(@layerzerolabs/devtools@2.0.3)(@layerzerolabs/io-devtools@0.3.1)(@layerzerolabs/lz-definitions@3.0.142)(@nomiclabs/hardhat-ethers@2.2.3)(ethers@5.8.0)(fp-ts@2.16.11)(hardhat-deploy@0.12.4)(hardhat@2.26.4)
+ '@layerzerolabs/devtools-solana':
+ specifier: ~3.0.4
+ version: 3.0.4(@layerzerolabs/devtools@2.0.3)(@layerzerolabs/io-devtools@0.3.1)(@layerzerolabs/lz-definitions@3.0.142)(@solana/web3.js@1.98.4)(bn.js@5.2.2)(fastestsmallesttextencoderdecoder@1.0.22)(fp-ts@2.16.11)(typescript@5.9.3)(zod@3.25.76)
+ '@layerzerolabs/eslint-config-next':
+ specifier: ~2.3.39
+ version: 2.3.44(typescript@5.9.3)
+ '@layerzerolabs/io-devtools':
+ specifier: ~0.3.0
+ version: 0.3.1(ink-gradient@2.0.0)(ink-table@3.1.0)(ink@3.2.0)(react@17.0.2)(yoga-layout-prebuilt@1.10.0)(zod@3.25.76)
+ '@layerzerolabs/lz-definitions':
+ specifier: ^3.0.86
+ version: 3.0.142
+ '@layerzerolabs/lz-evm-messagelib-v2':
+ specifier: ^3.0.86
+ version: 3.0.142(@axelar-network/axelar-gmp-sdk-solidity@5.10.0)(@chainlink/contracts-ccip@0.7.6)(@eth-optimism/contracts@0.6.0)(@layerzerolabs/lz-evm-protocol-v2@3.0.142)(@layerzerolabs/lz-evm-v1-0.7@3.0.142)(@openzeppelin/contracts-upgradeable@5.4.0)(@openzeppelin/contracts@5.4.0)(hardhat-deploy@0.12.4)(solidity-bytes-utils@0.8.4)
+ '@layerzerolabs/lz-evm-protocol-v2':
+ specifier: ^3.0.86
+ version: 3.0.142(@openzeppelin/contracts-upgradeable@5.4.0)(@openzeppelin/contracts@5.4.0)(hardhat-deploy@0.12.4)(solidity-bytes-utils@0.8.4)
+ '@layerzerolabs/lz-evm-v1-0.7':
+ specifier: ^3.0.86
+ version: 3.0.142(@openzeppelin/contracts-upgradeable@5.4.0)(@openzeppelin/contracts@5.4.0)(hardhat-deploy@0.12.4)
+ '@layerzerolabs/lz-solana-sdk-v2':
+ specifier: ^3.0.136
+ version: 3.0.142(fastestsmallesttextencoderdecoder@1.0.22)(got@11.8.6)(typescript@5.9.3)
+ '@layerzerolabs/lz-v2-utilities':
+ specifier: ^3.0.86
+ version: 3.0.142
+ '@layerzerolabs/metadata-tools':
+ specifier: ^3.0.0
+ version: 3.0.2(@layerzerolabs/devtools-evm-hardhat@4.0.1)(@layerzerolabs/ua-devtools@5.0.1)
+ '@layerzerolabs/oapp-evm':
+ specifier: ^0.4.0
+ version: 0.4.0(@layerzerolabs/lz-evm-messagelib-v2@3.0.142)(@layerzerolabs/lz-evm-protocol-v2@3.0.142)(@layerzerolabs/lz-evm-v1-0.7@3.0.142)(@openzeppelin/contracts-upgradeable@5.4.0)(@openzeppelin/contracts@5.4.0)
+ '@layerzerolabs/oft-evm':
+ specifier: ^4.0.0
+ version: 4.0.0(@layerzerolabs/lz-evm-messagelib-v2@3.0.142)(@layerzerolabs/lz-evm-protocol-v2@3.0.142)(@layerzerolabs/lz-evm-v1-0.7@3.0.142)(@layerzerolabs/oapp-evm@0.4.0)(@openzeppelin/contracts-upgradeable@5.4.0)(@openzeppelin/contracts@5.4.0)
+ '@layerzerolabs/oft-v2-solana-sdk':
+ specifier: ^3.0.136
+ version: 3.0.142(fastestsmallesttextencoderdecoder@1.0.22)(got@11.8.6)(typescript@5.9.3)
+ '@layerzerolabs/prettier-config-next':
+ specifier: ^2.3.39
+ version: 2.3.44
+ '@layerzerolabs/protocol-devtools':
+ specifier: ^3.0.0
+ version: 3.0.1(@layerzerolabs/devtools@2.0.3)(@layerzerolabs/io-devtools@0.3.1)(@layerzerolabs/lz-definitions@3.0.142)(zod@3.25.76)
+ '@layerzerolabs/protocol-devtools-evm':
+ specifier: ~5.0.0
+ version: 5.0.1(@ethersproject/abstract-provider@5.8.0)(@ethersproject/abstract-signer@5.8.0)(@ethersproject/bignumber@5.8.0)(@ethersproject/constants@5.8.0)(@ethersproject/contracts@5.8.0)(@ethersproject/providers@5.8.0)(@layerzerolabs/devtools-evm@3.0.0)(@layerzerolabs/devtools@2.0.3)(@layerzerolabs/io-devtools@0.3.1)(@layerzerolabs/lz-definitions@3.0.142)(@layerzerolabs/protocol-devtools@3.0.1)(zod@3.25.76)
+ '@layerzerolabs/protocol-devtools-solana':
+ specifier: ^8.0.3
+ version: 8.0.3(@layerzerolabs/devtools-solana@3.0.4)(@layerzerolabs/devtools@2.0.3)(@layerzerolabs/io-devtools@0.3.1)(@layerzerolabs/lz-definitions@3.0.142)(@layerzerolabs/lz-solana-sdk-v2@3.0.142)(@layerzerolabs/lz-v2-utilities@3.0.142)(@layerzerolabs/protocol-devtools@3.0.1)(@layerzerolabs/ua-devtools@5.0.1)(@solana/web3.js@1.98.4)(fp-ts@2.16.11)(zod@3.25.76)
+ '@layerzerolabs/solhint-config':
+ specifier: ^3.0.12
+ version: 3.0.142(typescript@5.9.3)
+ '@layerzerolabs/test-devtools-evm-foundry':
+ specifier: ~8.0.0
+ version: 8.0.0(@layerzerolabs/lz-evm-messagelib-v2@3.0.142)(@layerzerolabs/lz-evm-protocol-v2@3.0.142)(@layerzerolabs/lz-evm-v1-0.7@3.0.142)(@layerzerolabs/oapp-evm@0.4.0)(@layerzerolabs/oft-evm@4.0.0)(@openzeppelin/contracts-upgradeable@5.4.0)(@openzeppelin/contracts@5.4.0)
+ '@layerzerolabs/test-devtools-evm-hardhat':
+ specifier: ~0.5.2
+ version: 0.5.2(hardhat@2.26.4)(solidity-bytes-utils@0.8.4)
+ '@layerzerolabs/toolbox-foundry':
+ specifier: ~0.1.12
+ version: 0.1.13
+ '@layerzerolabs/toolbox-hardhat':
+ specifier: ~0.6.12
+ version: 0.6.12(@ethersproject/abstract-provider@5.8.0)(@ethersproject/abstract-signer@5.8.0)(@ethersproject/bignumber@5.8.0)(@ethersproject/constants@5.8.0)(@ethersproject/providers@5.8.0)(@nomicfoundation/hardhat-ethers@3.1.1)(@nomiclabs/hardhat-ethers@2.2.3)(ethers@5.8.0)(hardhat-deploy@0.12.4)(hardhat@2.26.4)(solidity-bytes-utils@0.8.4)
+ '@layerzerolabs/ua-devtools':
+ specifier: ~5.0.0
+ version: 5.0.1(@layerzerolabs/devtools@2.0.3)(@layerzerolabs/io-devtools@0.3.1)(@layerzerolabs/lz-definitions@3.0.142)(@layerzerolabs/lz-v2-utilities@3.0.142)(@layerzerolabs/protocol-devtools@3.0.1)(zod@3.25.76)
+ '@layerzerolabs/ua-devtools-evm':
+ specifier: ~7.0.0
+ version: 7.0.0(@ethersproject/constants@5.8.0)(@ethersproject/contracts@5.8.0)(@layerzerolabs/devtools-evm@3.0.0)(@layerzerolabs/devtools@2.0.3)(@layerzerolabs/io-devtools@0.3.1)(@layerzerolabs/lz-definitions@3.0.142)(@layerzerolabs/lz-v2-utilities@3.0.142)(@layerzerolabs/protocol-devtools-evm@5.0.1)(@layerzerolabs/protocol-devtools@3.0.1)(@layerzerolabs/ua-devtools@5.0.1)(zod@3.25.76)
+ '@layerzerolabs/ua-devtools-evm-hardhat':
+ specifier: ~9.0.0
+ version: 9.0.0(@ethersproject/abi@5.8.0)(@ethersproject/bytes@5.8.0)(@ethersproject/contracts@5.8.0)(@ethersproject/hash@5.8.0)(@layerzerolabs/devtools-evm-hardhat@4.0.1)(@layerzerolabs/devtools-evm@3.0.0)(@layerzerolabs/devtools@2.0.3)(@layerzerolabs/io-devtools@0.3.1)(@layerzerolabs/lz-definitions@3.0.142)(@layerzerolabs/protocol-devtools-evm@5.0.1)(@layerzerolabs/protocol-devtools@3.0.1)(@layerzerolabs/ua-devtools-evm@7.0.0)(@layerzerolabs/ua-devtools@5.0.1)(ethers@5.8.0)(hardhat-deploy@0.12.4)(hardhat@2.26.4)
+ '@layerzerolabs/ua-devtools-solana':
+ specifier: ~8.0.2
+ version: 8.0.2(@layerzerolabs/devtools-solana@3.0.4)(@layerzerolabs/devtools@2.0.3)(@layerzerolabs/io-devtools@0.3.1)(@layerzerolabs/lz-definitions@3.0.142)(@layerzerolabs/lz-solana-sdk-v2@3.0.142)(@layerzerolabs/lz-v2-utilities@3.0.142)(@layerzerolabs/oft-v2-solana-sdk@3.0.142)(@layerzerolabs/protocol-devtools-solana@8.0.3)(@layerzerolabs/protocol-devtools@3.0.1)(@layerzerolabs/ua-devtools@5.0.1)(@solana/web3.js@1.98.4)(fp-ts@2.16.11)(zod@3.25.76)
+ '@metaplex-foundation/mpl-token-metadata':
+ specifier: ^3.2.1
+ version: 3.4.0(@metaplex-foundation/umi@0.9.2)
+ '@metaplex-foundation/mpl-toolbox':
+ specifier: ^0.9.4
+ version: 0.9.4(@metaplex-foundation/umi@0.9.2)
+ '@metaplex-foundation/umi':
+ specifier: ^0.9.2
+ version: 0.9.2
+ '@metaplex-foundation/umi-bundle-defaults':
+ specifier: ^0.9.2
+ version: 0.9.2(@metaplex-foundation/umi@0.9.2)(@solana/web3.js@1.98.4)
+ '@metaplex-foundation/umi-eddsa-web3js':
+ specifier: ^0.9.2
+ version: 0.9.2(@metaplex-foundation/umi@0.9.2)(@solana/web3.js@1.98.4)
+ '@metaplex-foundation/umi-public-keys':
+ specifier: ^0.8.9
+ version: 0.8.9
+ '@metaplex-foundation/umi-web3js-adapters':
+ specifier: ^0.9.2
+ version: 0.9.2(@metaplex-foundation/umi@0.9.2)(@solana/web3.js@1.98.4)
+ '@nomicfoundation/hardhat-ethers':
+ specifier: ^3.0.5
+ version: 3.1.1(ethers@5.8.0)(hardhat@2.26.4)
+ '@nomiclabs/hardhat-ethers':
+ specifier: ^2.2.3
+ version: 2.2.3(ethers@5.8.0)(hardhat@2.26.4)
+ '@nomiclabs/hardhat-waffle':
+ specifier: ^2.0.6
+ version: 2.0.6(@nomiclabs/hardhat-ethers@2.2.3)(@types/sinon-chai@3.2.12)(ethereum-waffle@4.0.10)(ethers@5.8.0)(hardhat@2.26.4)
+ '@openzeppelin/contracts':
+ specifier: ^5.0.2
+ version: 5.4.0
+ '@openzeppelin/contracts-upgradeable':
+ specifier: ^5.0.2
+ version: 5.4.0(@openzeppelin/contracts@5.4.0)
+ '@rushstack/eslint-patch':
+ specifier: ^1.7.0
+ version: 1.14.1
+ '@safe-global/safe-core-sdk-types':
+ specifier: ^2.3.0
+ version: 2.3.0
+ '@solana-developers/helpers':
+ specifier: ~2.8.1
+ version: 2.8.1(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3)
+ '@solana/spl-token':
+ specifier: ^0.4.8
+ version: 0.4.14(@solana/web3.js@1.98.4)(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3)
+ '@solana/web3.js':
+ specifier: ^1.98.0
+ version: 1.98.4(typescript@5.9.3)
+ '@sqds/sdk':
+ specifier: ^2.0.4
+ version: 2.0.4(typescript@5.9.3)
+ '@swc/core':
+ specifier: ^1.4.0
+ version: 1.14.0
+ '@swc/jest':
+ specifier: ^0.2.36
+ version: 0.2.39(@swc/core@1.14.0)
+ '@types/chai':
+ specifier: ^4.3.11
+ version: 4.3.20
+ '@types/jest':
+ specifier: ^29.5.12
+ version: 29.5.14
+ '@types/mocha':
+ specifier: ^10.0.6
+ version: 10.0.10
+ '@types/node':
+ specifier: ~18.18.14
+ version: 18.18.14
+ bs58:
+ specifier: ^6.0.0
+ version: 6.0.0
+ chai:
+ specifier: ^4.4.1
+ version: 4.5.0
+ concurrently:
+ specifier: ~9.1.0
+ version: 9.1.2
+ dotenv:
+ specifier: ^16.4.5
+ version: 16.6.1
+ eslint:
+ specifier: ^8.55.0
+ version: 8.57.1
+ eslint-plugin-jest-extended:
+ specifier: ~2.0.0
+ version: 2.0.3(eslint@8.57.1)(typescript@5.9.3)
+ ethereumjs-util:
+ specifier: ^7.1.5
+ version: 7.1.5
+ ethers:
+ specifier: ^5.7.2
+ version: 5.8.0
+ exponential-backoff:
+ specifier: ~3.1.1
+ version: 3.1.3
+ fp-ts:
+ specifier: ^2.16.2
+ version: 2.16.11
+ hardhat:
+ specifier: ^2.22.10
+ version: 2.26.4(ts-node@10.9.2)(typescript@5.9.3)
+ hardhat-contract-sizer:
+ specifier: ^2.10.0
+ version: 2.10.1(hardhat@2.26.4)
+ hardhat-deploy:
+ specifier: ^0.12.1
+ version: 0.12.4
+ hardhat-deploy-ethers:
+ specifier: ^0.4.2
+ version: 0.4.2(@nomicfoundation/hardhat-ethers@3.1.1)(hardhat-deploy@0.12.4)(hardhat@2.26.4)
+ jest:
+ specifier: ^29.7.0
+ version: 29.7.0(@types/node@18.18.14)(ts-node@10.9.2)
+ mocha:
+ specifier: ^10.2.0
+ version: 10.8.2
+ prettier:
+ specifier: ^3.2.5
+ version: 3.6.2
+ solhint:
+ specifier: ^4.1.1
+ version: 4.5.4(typescript@5.9.3)
+ solidity-bytes-utils:
+ specifier: ^0.8.2
+ version: 0.8.4
+ ts-node:
+ specifier: ^10.9.2
+ version: 10.9.2(@swc/core@1.14.0)(@types/node@18.18.14)(typescript@5.9.3)
+ typescript:
+ specifier: ^5.4.4
+ version: 5.9.3
+
+packages:
+
+ /@0no-co/graphql.web@1.2.0(graphql@16.11.0):
+ resolution: {integrity: sha512-/1iHy9TTr63gE1YcR5idjx8UREz1s0kFhydf3bBLCXyqjhkIc6igAzTOx3zPifCwFR87tsh/4Pa9cNts6d2otw==}
+ peerDependencies:
+ graphql: ^14.0.0 || ^15.0.0 || ^16.0.0
+ peerDependenciesMeta:
+ graphql:
+ optional: true
+ dependencies:
+ graphql: 16.11.0
+ dev: true
+
+ /@0no-co/graphqlsp@1.15.0(graphql@16.11.0)(typescript@5.9.3):
+ resolution: {integrity: sha512-SReJAGmOeXrHGod+9Odqrz4s43liK0b2DFUetb/jmYvxFpWmeNfFYo0seCh0jz8vG3p1pnYMav0+Tm7XwWtOJw==}
+ peerDependencies:
+ graphql: ^15.5.0 || ^16.0.0 || ^17.0.0
+ typescript: ^5.0.0
+ dependencies:
+ '@gql.tada/internal': 1.0.8(graphql@16.11.0)(typescript@5.9.3)
+ graphql: 16.11.0
+ typescript: 5.9.3
+ dev: true
+
+ /@aptos-labs/aptos-client@2.0.0(got@11.8.6):
+ resolution: {integrity: sha512-A23T3zTCRXEKURodp00dkadVtIrhWjC9uo08dRDBkh69OhCnBAxkENmUy/rcBarfLoFr60nRWt7cBkc8wxr1mg==}
+ engines: {node: '>=20.0.0'}
+ peerDependencies:
+ got: ^11.8.6
+ dependencies:
+ got: 11.8.6
+ dev: true
+
+ /@axelar-network/axelar-gmp-sdk-solidity@5.10.0:
+ resolution: {integrity: sha512-s8SImALvYB+5AeiT3tbfWNBI2Mhqw1x91i/zM3DNpVUCnAR2HKtsB9T84KnUn/OJjOVgb4h0lv7q9smeYniRPw==}
+ engines: {node: '>=18'}
+ dev: true
+
+ /@babel/code-frame@7.27.1:
+ resolution: {integrity: sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg==}
+ engines: {node: '>=6.9.0'}
+ dependencies:
+ '@babel/helper-validator-identifier': 7.28.5
+ js-tokens: 4.0.0
+ picocolors: 1.1.1
+ dev: true
+
+ /@babel/compat-data@7.28.5:
+ resolution: {integrity: sha512-6uFXyCayocRbqhZOB+6XcuZbkMNimwfVGFji8CTZnCzOHVGvDqzvitu1re2AU5LROliz7eQPhB8CpAMvnx9EjA==}
+ engines: {node: '>=6.9.0'}
+ dev: true
+
+ /@babel/core@7.28.5:
+ resolution: {integrity: sha512-e7jT4DxYvIDLk1ZHmU/m/mB19rex9sv0c2ftBtjSBv+kVM/902eh0fINUzD7UwLLNR+jU585GxUJ8/EBfAM5fw==}
+ engines: {node: '>=6.9.0'}
+ dependencies:
+ '@babel/code-frame': 7.27.1
+ '@babel/generator': 7.28.5
+ '@babel/helper-compilation-targets': 7.27.2
+ '@babel/helper-module-transforms': 7.28.3(@babel/core@7.28.5)
+ '@babel/helpers': 7.28.4
+ '@babel/parser': 7.28.5
+ '@babel/template': 7.27.2
+ '@babel/traverse': 7.28.5
+ '@babel/types': 7.28.5
+ '@jridgewell/remapping': 2.3.5
+ convert-source-map: 2.0.0
+ debug: 4.4.3(supports-color@8.1.1)
+ gensync: 1.0.0-beta.2
+ json5: 2.2.3
+ semver: 6.3.1
+ transitivePeerDependencies:
+ - supports-color
+ dev: true
+
+ /@babel/generator@7.28.5:
+ resolution: {integrity: sha512-3EwLFhZ38J4VyIP6WNtt2kUdW9dokXA9Cr4IVIFHuCpZ3H8/YFOl5JjZHisrn1fATPBmKKqXzDFvh9fUwHz6CQ==}
+ engines: {node: '>=6.9.0'}
+ dependencies:
+ '@babel/parser': 7.28.5
+ '@babel/types': 7.28.5
+ '@jridgewell/gen-mapping': 0.3.13
+ '@jridgewell/trace-mapping': 0.3.31
+ jsesc: 3.1.0
+ dev: true
+
+ /@babel/helper-compilation-targets@7.27.2:
+ resolution: {integrity: sha512-2+1thGUUWWjLTYTHZWK1n8Yga0ijBz1XAhUXcKy81rd5g6yh7hGqMp45v7cadSbEHc9G3OTv45SyneRN3ps4DQ==}
+ engines: {node: '>=6.9.0'}
+ dependencies:
+ '@babel/compat-data': 7.28.5
+ '@babel/helper-validator-option': 7.27.1
+ browserslist: 4.27.0
+ lru-cache: 5.1.1
+ semver: 6.3.1
+ dev: true
+
+ /@babel/helper-globals@7.28.0:
+ resolution: {integrity: sha512-+W6cISkXFa1jXsDEdYA8HeevQT/FULhxzR99pxphltZcVaugps53THCeiWA8SguxxpSp3gKPiuYfSWopkLQ4hw==}
+ engines: {node: '>=6.9.0'}
+ dev: true
+
+ /@babel/helper-module-imports@7.27.1:
+ resolution: {integrity: sha512-0gSFWUPNXNopqtIPQvlD5WgXYI5GY2kP2cCvoT8kczjbfcfuIljTbcWrulD1CIPIX2gt1wghbDy08yE1p+/r3w==}
+ engines: {node: '>=6.9.0'}
+ dependencies:
+ '@babel/traverse': 7.28.5
+ '@babel/types': 7.28.5
+ transitivePeerDependencies:
+ - supports-color
+ dev: true
+
+ /@babel/helper-module-transforms@7.28.3(@babel/core@7.28.5):
+ resolution: {integrity: sha512-gytXUbs8k2sXS9PnQptz5o0QnpLL51SwASIORY6XaBKF88nsOT0Zw9szLqlSGQDP/4TljBAD5y98p2U1fqkdsw==}
+ engines: {node: '>=6.9.0'}
+ peerDependencies:
+ '@babel/core': ^7.0.0
+ dependencies:
+ '@babel/core': 7.28.5
+ '@babel/helper-module-imports': 7.27.1
+ '@babel/helper-validator-identifier': 7.28.5
+ '@babel/traverse': 7.28.5
+ transitivePeerDependencies:
+ - supports-color
+ dev: true
+
+ /@babel/helper-plugin-utils@7.27.1:
+ resolution: {integrity: sha512-1gn1Up5YXka3YYAHGKpbideQ5Yjf1tDa9qYcgysz+cNCXukyLl6DjPXhD3VRwSb8c0J9tA4b2+rHEZtc6R0tlw==}
+ engines: {node: '>=6.9.0'}
+ dev: true
+
+ /@babel/helper-string-parser@7.27.1:
+ resolution: {integrity: sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==}
+ engines: {node: '>=6.9.0'}
+ dev: true
+
+ /@babel/helper-validator-identifier@7.28.5:
+ resolution: {integrity: sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q==}
+ engines: {node: '>=6.9.0'}
+ dev: true
+
+ /@babel/helper-validator-option@7.27.1:
+ resolution: {integrity: sha512-YvjJow9FxbhFFKDSuFnVCe2WxXk1zWc22fFePVNEaWJEu8IrZVlda6N0uHwzZrUM1il7NC9Mlp4MaJYbYd9JSg==}
+ engines: {node: '>=6.9.0'}
+ dev: true
+
+ /@babel/helpers@7.28.4:
+ resolution: {integrity: sha512-HFN59MmQXGHVyYadKLVumYsA9dBFun/ldYxipEjzA4196jpLZd8UjEEBLkbEkvfYreDqJhZxYAWFPtrfhNpj4w==}
+ engines: {node: '>=6.9.0'}
+ dependencies:
+ '@babel/template': 7.27.2
+ '@babel/types': 7.28.5
+ dev: true
+
+ /@babel/parser@7.28.5:
+ resolution: {integrity: sha512-KKBU1VGYR7ORr3At5HAtUQ+TV3SzRCXmA/8OdDZiLDBIZxVyzXuztPjfLd3BV1PRAQGCMWWSHYhL0F8d5uHBDQ==}
+ engines: {node: '>=6.0.0'}
+ hasBin: true
+ dependencies:
+ '@babel/types': 7.28.5
+ dev: true
+
+ /@babel/plugin-syntax-async-generators@7.8.4(@babel/core@7.28.5):
+ resolution: {integrity: sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+ dependencies:
+ '@babel/core': 7.28.5
+ '@babel/helper-plugin-utils': 7.27.1
+ dev: true
+
+ /@babel/plugin-syntax-bigint@7.8.3(@babel/core@7.28.5):
+ resolution: {integrity: sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg==}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+ dependencies:
+ '@babel/core': 7.28.5
+ '@babel/helper-plugin-utils': 7.27.1
+ dev: true
+
+ /@babel/plugin-syntax-class-properties@7.12.13(@babel/core@7.28.5):
+ resolution: {integrity: sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+ dependencies:
+ '@babel/core': 7.28.5
+ '@babel/helper-plugin-utils': 7.27.1
+ dev: true
+
+ /@babel/plugin-syntax-class-static-block@7.14.5(@babel/core@7.28.5):
+ resolution: {integrity: sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw==}
+ engines: {node: '>=6.9.0'}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+ dependencies:
+ '@babel/core': 7.28.5
+ '@babel/helper-plugin-utils': 7.27.1
+ dev: true
+
+ /@babel/plugin-syntax-import-attributes@7.27.1(@babel/core@7.28.5):
+ resolution: {integrity: sha512-oFT0FrKHgF53f4vOsZGi2Hh3I35PfSmVs4IBFLFj4dnafP+hIWDLg3VyKmUHfLoLHlyxY4C7DGtmHuJgn+IGww==}
+ engines: {node: '>=6.9.0'}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+ dependencies:
+ '@babel/core': 7.28.5
+ '@babel/helper-plugin-utils': 7.27.1
+ dev: true
+
+ /@babel/plugin-syntax-import-meta@7.10.4(@babel/core@7.28.5):
+ resolution: {integrity: sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+ dependencies:
+ '@babel/core': 7.28.5
+ '@babel/helper-plugin-utils': 7.27.1
+ dev: true
+
+ /@babel/plugin-syntax-json-strings@7.8.3(@babel/core@7.28.5):
+ resolution: {integrity: sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+ dependencies:
+ '@babel/core': 7.28.5
+ '@babel/helper-plugin-utils': 7.27.1
+ dev: true
+
+ /@babel/plugin-syntax-jsx@7.27.1(@babel/core@7.28.5):
+ resolution: {integrity: sha512-y8YTNIeKoyhGd9O0Jiyzyyqk8gdjnumGTQPsz0xOZOQ2RmkVJeZ1vmmfIvFEKqucBG6axJGBZDE/7iI5suUI/w==}
+ engines: {node: '>=6.9.0'}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+ dependencies:
+ '@babel/core': 7.28.5
+ '@babel/helper-plugin-utils': 7.27.1
+ dev: true
+
+ /@babel/plugin-syntax-logical-assignment-operators@7.10.4(@babel/core@7.28.5):
+ resolution: {integrity: sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+ dependencies:
+ '@babel/core': 7.28.5
+ '@babel/helper-plugin-utils': 7.27.1
+ dev: true
+
+ /@babel/plugin-syntax-nullish-coalescing-operator@7.8.3(@babel/core@7.28.5):
+ resolution: {integrity: sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+ dependencies:
+ '@babel/core': 7.28.5
+ '@babel/helper-plugin-utils': 7.27.1
+ dev: true
+
+ /@babel/plugin-syntax-numeric-separator@7.10.4(@babel/core@7.28.5):
+ resolution: {integrity: sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+ dependencies:
+ '@babel/core': 7.28.5
+ '@babel/helper-plugin-utils': 7.27.1
+ dev: true
+
+ /@babel/plugin-syntax-object-rest-spread@7.8.3(@babel/core@7.28.5):
+ resolution: {integrity: sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+ dependencies:
+ '@babel/core': 7.28.5
+ '@babel/helper-plugin-utils': 7.27.1
+ dev: true
+
+ /@babel/plugin-syntax-optional-catch-binding@7.8.3(@babel/core@7.28.5):
+ resolution: {integrity: sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+ dependencies:
+ '@babel/core': 7.28.5
+ '@babel/helper-plugin-utils': 7.27.1
+ dev: true
+
+ /@babel/plugin-syntax-optional-chaining@7.8.3(@babel/core@7.28.5):
+ resolution: {integrity: sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+ dependencies:
+ '@babel/core': 7.28.5
+ '@babel/helper-plugin-utils': 7.27.1
+ dev: true
+
+ /@babel/plugin-syntax-private-property-in-object@7.14.5(@babel/core@7.28.5):
+ resolution: {integrity: sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg==}
+ engines: {node: '>=6.9.0'}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+ dependencies:
+ '@babel/core': 7.28.5
+ '@babel/helper-plugin-utils': 7.27.1
+ dev: true
+
+ /@babel/plugin-syntax-top-level-await@7.14.5(@babel/core@7.28.5):
+ resolution: {integrity: sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==}
+ engines: {node: '>=6.9.0'}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+ dependencies:
+ '@babel/core': 7.28.5
+ '@babel/helper-plugin-utils': 7.27.1
+ dev: true
+
+ /@babel/plugin-syntax-typescript@7.27.1(@babel/core@7.28.5):
+ resolution: {integrity: sha512-xfYCBMxveHrRMnAWl1ZlPXOZjzkN82THFvLhQhFXFt81Z5HnN+EtUkZhv/zcKpmT3fzmWZB0ywiBrbC3vogbwQ==}
+ engines: {node: '>=6.9.0'}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+ dependencies:
+ '@babel/core': 7.28.5
+ '@babel/helper-plugin-utils': 7.27.1
+ dev: true
+
+ /@babel/runtime@7.28.4:
+ resolution: {integrity: sha512-Q/N6JNWvIvPnLDvjlE1OUBLPQHH6l3CltCEsHIujp45zQUSSh8K+gHnaEX45yAT1nyngnINhvWtzN+Nb9D8RAQ==}
+ engines: {node: '>=6.9.0'}
+ dev: true
+
+ /@babel/template@7.27.2:
+ resolution: {integrity: sha512-LPDZ85aEJyYSd18/DkjNh4/y1ntkE5KwUHWTiqgRxruuZL2F1yuHligVHLvcHY2vMHXttKFpJn6LwfI7cw7ODw==}
+ engines: {node: '>=6.9.0'}
+ dependencies:
+ '@babel/code-frame': 7.27.1
+ '@babel/parser': 7.28.5
+ '@babel/types': 7.28.5
+ dev: true
+
+ /@babel/traverse@7.28.5:
+ resolution: {integrity: sha512-TCCj4t55U90khlYkVV/0TfkJkAkUg3jZFA3Neb7unZT8CPok7iiRfaX0F+WnqWqt7OxhOn0uBKXCw4lbL8W0aQ==}
+ engines: {node: '>=6.9.0'}
+ dependencies:
+ '@babel/code-frame': 7.27.1
+ '@babel/generator': 7.28.5
+ '@babel/helper-globals': 7.28.0
+ '@babel/parser': 7.28.5
+ '@babel/template': 7.27.2
+ '@babel/types': 7.28.5
+ debug: 4.4.3(supports-color@8.1.1)
+ transitivePeerDependencies:
+ - supports-color
+ dev: true
+
+ /@babel/types@7.28.5:
+ resolution: {integrity: sha512-qQ5m48eI/MFLQ5PxQj4PFaprjyCTLI37ElWMmNs0K8Lk3dVeOdNpB3ks8jc7yM5CDmVC73eMVk/trk3fgmrUpA==}
+ engines: {node: '>=6.9.0'}
+ dependencies:
+ '@babel/helper-string-parser': 7.27.1
+ '@babel/helper-validator-identifier': 7.28.5
+ dev: true
+
+ /@bcoe/v8-coverage@0.2.3:
+ resolution: {integrity: sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==}
+ dev: true
+
+ /@bitcoinerlab/secp256k1@1.2.0:
+ resolution: {integrity: sha512-jeujZSzb3JOZfmJYI0ph1PVpCRV5oaexCgy+RvCXV8XlY+XFB/2n3WOcvBsKLsOw78KYgnQrQWb2HrKE4be88Q==}
+ dependencies:
+ '@noble/curves': 1.9.7
+ dev: true
+
+ /@chainlink/contracts-ccip@0.7.6(ethers@5.8.0):
+ resolution: {integrity: sha512-yNbCBFpLs3R+ALymto9dQYKz3vatnjqYGu1pnMD0i2fHEMthiXe0+otaNCGNht6n8k7ruNaA0DNpz3F+2jHQXw==}
+ dependencies:
+ '@eth-optimism/contracts': 0.5.40(ethers@5.8.0)
+ '@openzeppelin/contracts': 4.3.3
+ '@openzeppelin/contracts-upgradeable-4.7.3': /@openzeppelin/contracts-upgradeable@4.7.3
+ '@openzeppelin/contracts-v0.7': /@openzeppelin/contracts@3.4.2
+ transitivePeerDependencies:
+ - bufferutil
+ - ethers
+ - utf-8-validate
+ dev: true
+
+ /@colors/colors@1.5.0:
+ resolution: {integrity: sha512-ooWCrlZP11i8GImSjTHYHLkvFDP48nS4+204nGb1RiX/WXYHmJA2III9/e2DWVabCESdW7hBAEzHRqUn9OUVvQ==}
+ engines: {node: '>=0.1.90'}
+ requiresBuild: true
+ dev: true
+ optional: true
+
+ /@colors/colors@1.6.0:
+ resolution: {integrity: sha512-Ir+AOibqzrIsL6ajt3Rz3LskB7OiMVHqltZmspbW/TJuTVuyOMirVqAkjfY6JISiLHgyNqicAC8AyHHGzNd/dA==}
+ engines: {node: '>=0.1.90'}
+ dev: true
+
+ /@coral-xyz/anchor-errors@0.30.1:
+ resolution: {integrity: sha512-9Mkradf5yS5xiLWrl9WrpjqOrAV+/W2RQHDlbnAZBivoGpOs1ECjoDCkVk4aRG8ZdiFiB8zQEVlxf+8fKkmSfQ==}
+ engines: {node: '>=10'}
+ dev: true
+
+ /@coral-xyz/anchor-errors@0.31.1:
+ resolution: {integrity: sha512-NhNEku4F3zzUSBtrYz84FzYWm48+9OvmT1Hhnwr6GnPQry2dsEqH/ti/7ASjjpoFTWRnPXrjAIT1qM6Isop+LQ==}
+ engines: {node: '>=10'}
+ dev: true
+
+ /@coral-xyz/anchor@0.26.0(typescript@5.9.3):
+ resolution: {integrity: sha512-PxRl+wu5YyptWiR9F2MBHOLLibm87Z4IMUBPreX+DYBtPM+xggvcPi0KAN7+kIL4IrIhXI8ma5V0MCXxSN1pHg==}
+ engines: {node: '>=11'}
+ dependencies:
+ '@coral-xyz/borsh': 0.26.0(@solana/web3.js@1.98.4)
+ '@solana/web3.js': 1.98.4(typescript@5.9.3)
+ base64-js: 1.5.1
+ bn.js: 5.2.2
+ bs58: 4.0.1
+ buffer-layout: 1.2.2
+ camelcase: 6.3.0
+ cross-fetch: 3.2.0
+ crypto-hash: 1.3.0
+ eventemitter3: 4.0.7
+ js-sha256: 0.9.0
+ pako: 2.1.0
+ snake-case: 3.0.4
+ superstruct: 0.15.5
+ toml: 3.0.0
+ transitivePeerDependencies:
+ - bufferutil
+ - encoding
+ - typescript
+ - utf-8-validate
+ dev: true
+
+ /@coral-xyz/anchor@0.29.0(typescript@5.9.3):
+ resolution: {integrity: sha512-eny6QNG0WOwqV0zQ7cs/b1tIuzZGmP7U7EcH+ogt4Gdbl8HDmIYVMh/9aTmYZPaFWjtUaI8qSn73uYEXWfATdA==}
+ engines: {node: '>=11'}
+ dependencies:
+ '@coral-xyz/borsh': 0.29.0(@solana/web3.js@1.98.4)
+ '@noble/hashes': 1.8.0
+ '@solana/web3.js': 1.98.4(typescript@5.9.3)
+ bn.js: 5.2.2
+ bs58: 4.0.1
+ buffer-layout: 1.2.2
+ camelcase: 6.3.0
+ cross-fetch: 3.2.0
+ crypto-hash: 1.3.0
+ eventemitter3: 4.0.7
+ pako: 2.1.0
+ snake-case: 3.0.4
+ superstruct: 0.15.5
+ toml: 3.0.0
+ transitivePeerDependencies:
+ - bufferutil
+ - encoding
+ - typescript
+ - utf-8-validate
+ dev: true
+
+ /@coral-xyz/anchor@0.30.1(typescript@5.9.3):
+ resolution: {integrity: sha512-gDXFoF5oHgpriXAaLpxyWBHdCs8Awgf/gLHIo6crv7Aqm937CNdY+x+6hoj7QR5vaJV7MxWSQ0NGFzL3kPbWEQ==}
+ engines: {node: '>=11'}
+ dependencies:
+ '@coral-xyz/anchor-errors': 0.30.1
+ '@coral-xyz/borsh': 0.30.1(@solana/web3.js@1.98.4)
+ '@noble/hashes': 1.8.0
+ '@solana/web3.js': 1.98.4(typescript@5.9.3)
+ bn.js: 5.2.2
+ bs58: 4.0.1
+ buffer-layout: 1.2.2
+ camelcase: 6.3.0
+ cross-fetch: 3.2.0
+ crypto-hash: 1.3.0
+ eventemitter3: 4.0.7
+ pako: 2.1.0
+ snake-case: 3.0.4
+ superstruct: 0.15.5
+ toml: 3.0.0
+ transitivePeerDependencies:
+ - bufferutil
+ - encoding
+ - typescript
+ - utf-8-validate
+ dev: true
+
+ /@coral-xyz/anchor@0.31.1(typescript@5.9.3):
+ resolution: {integrity: sha512-QUqpoEK+gi2S6nlYc2atgT2r41TT3caWr/cPUEL8n8Md9437trZ68STknq897b82p5mW0XrTBNOzRbmIRJtfsA==}
+ engines: {node: '>=17'}
+ dependencies:
+ '@coral-xyz/anchor-errors': 0.31.1
+ '@coral-xyz/borsh': 0.31.1(@solana/web3.js@1.98.4)
+ '@noble/hashes': 1.8.0
+ '@solana/web3.js': 1.98.4(typescript@5.9.3)
+ bn.js: 5.2.2
+ bs58: 4.0.1
+ buffer-layout: 1.2.2
+ camelcase: 6.3.0
+ cross-fetch: 3.2.0
+ eventemitter3: 4.0.7
+ pako: 2.1.0
+ superstruct: 0.15.5
+ toml: 3.0.0
+ transitivePeerDependencies:
+ - bufferutil
+ - encoding
+ - typescript
+ - utf-8-validate
+ dev: true
+
+ /@coral-xyz/borsh@0.26.0(@solana/web3.js@1.98.4):
+ resolution: {integrity: sha512-uCZ0xus0CszQPHYfWAqKS5swS1UxvePu83oOF+TWpUkedsNlg6p2p4azxZNSSqwXb9uXMFgxhuMBX9r3Xoi0vQ==}
+ engines: {node: '>=10'}
+ peerDependencies:
+ '@solana/web3.js': ^1.98.0
+ dependencies:
+ '@solana/web3.js': 1.98.4(typescript@5.9.3)
+ bn.js: 5.2.2
+ buffer-layout: 1.2.2
+ dev: true
+
+ /@coral-xyz/borsh@0.29.0(@solana/web3.js@1.98.4):
+ resolution: {integrity: sha512-s7VFVa3a0oqpkuRloWVPdCK7hMbAMY270geZOGfCnaqexrP5dTIpbEHL33req6IYPPJ0hYa71cdvJ1h6V55/oQ==}
+ engines: {node: '>=10'}
+ peerDependencies:
+ '@solana/web3.js': ^1.98.0
+ dependencies:
+ '@solana/web3.js': 1.98.4(typescript@5.9.3)
+ bn.js: 5.2.2
+ buffer-layout: 1.2.2
+ dev: true
+
+ /@coral-xyz/borsh@0.30.1(@solana/web3.js@1.98.4):
+ resolution: {integrity: sha512-aaxswpPrCFKl8vZTbxLssA2RvwX2zmKLlRCIktJOwW+VpVwYtXRtlWiIP+c2pPRKneiTiWCN2GEMSH9j1zTlWQ==}
+ engines: {node: '>=10'}
+ peerDependencies:
+ '@solana/web3.js': ^1.98.0
+ dependencies:
+ '@solana/web3.js': 1.98.4(typescript@5.9.3)
+ bn.js: 5.2.2
+ buffer-layout: 1.2.2
+ dev: true
+
+ /@coral-xyz/borsh@0.31.1(@solana/web3.js@1.98.4):
+ resolution: {integrity: sha512-9N8AU9F0ubriKfNE3g1WF0/4dtlGXoBN/hd1PvbNBamBNwRgHxH4P+o3Zt7rSEloW1HUs6LfZEchlx9fW7POYw==}
+ engines: {node: '>=10'}
+ peerDependencies:
+ '@solana/web3.js': ^1.98.0
+ dependencies:
+ '@solana/web3.js': 1.98.4(typescript@5.9.3)
+ bn.js: 5.2.2
+ buffer-layout: 1.2.2
+ dev: true
+
+ /@cspotcode/source-map-support@0.8.1:
+ resolution: {integrity: sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==}
+ engines: {node: '>=12'}
+ dependencies:
+ '@jridgewell/trace-mapping': 0.3.9
+ dev: true
+
+ /@dabh/diagnostics@2.0.8:
+ resolution: {integrity: sha512-R4MSXTVnuMzGD7bzHdW2ZhhdPC/igELENcq5IjEverBvq5hn1SXCWcsi6eSsdWP0/Ur+SItRRjAktmdoX/8R/Q==}
+ dependencies:
+ '@so-ric/colorspace': 1.1.6
+ enabled: 2.0.0
+ kuler: 2.0.0
+ dev: true
+
+ /@emnapi/core@1.6.0:
+ resolution: {integrity: sha512-zq/ay+9fNIJJtJiZxdTnXS20PllcYMX3OE23ESc4HK/bdYu3cOWYVhsOhVnXALfU/uqJIxn5NBPd9z4v+SfoSg==}
+ requiresBuild: true
+ dependencies:
+ '@emnapi/wasi-threads': 1.1.0
+ tslib: 2.8.1
+ dev: true
+ optional: true
+
+ /@emnapi/runtime@1.6.0:
+ resolution: {integrity: sha512-obtUmAHTMjll499P+D9A3axeJFlhdjOWdKUNs/U6QIGT7V5RjcUW1xToAzjvmgTSQhDbYn/NwfTRoJcQ2rNBxA==}
+ requiresBuild: true
+ dependencies:
+ tslib: 2.8.1
+ dev: true
+ optional: true
+
+ /@emnapi/wasi-threads@1.1.0:
+ resolution: {integrity: sha512-WI0DdZ8xFSbgMjR1sFsKABJ/C5OnRrjT06JXbZKexJGrDuPTzZdDYfFlsgcCXCyf+suG5QU2e/y1Wo2V/OapLQ==}
+ requiresBuild: true
+ dependencies:
+ tslib: 2.8.1
+ dev: true
+ optional: true
+
+ /@ensdomains/ens@0.4.5:
+ resolution: {integrity: sha512-JSvpj1iNMFjK6K+uVl4unqMoa9rf5jopb8cya5UGBWz23Nw8hSNT7efgUx4BTlAPAgpNlEioUfeTyQ6J9ZvTVw==}
+ deprecated: Please use @ensdomains/ens-contracts
+ dependencies:
+ bluebird: 3.7.2
+ eth-ens-namehash: 2.0.8
+ solc: 0.4.26
+ testrpc: 0.0.1
+ web3-utils: 1.10.4
+ dev: true
+
+ /@ensdomains/resolver@0.2.4:
+ resolution: {integrity: sha512-bvaTH34PMCbv6anRa9I/0zjLJgY4EuznbEMgbV77JBCQ9KNC46rzi0avuxpOfu+xDjPEtSFGqVEOr5GlUSGudA==}
+ deprecated: Please use @ensdomains/ens-contracts
+ dev: true
+
+ /@eslint-community/eslint-utils@4.9.0(eslint@8.57.1):
+ resolution: {integrity: sha512-ayVFHdtZ+hsq1t2Dy24wCmGXGe4q9Gu3smhLYALJrr473ZH27MsnSL+LKUlimp4BWJqMDMLmPpx/Q9R3OAlL4g==}
+ engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
+ peerDependencies:
+ eslint: ^6.0.0 || ^7.0.0 || >=8.0.0
+ dependencies:
+ eslint: 8.57.1
+ eslint-visitor-keys: 3.4.3
+ dev: true
+
+ /@eslint-community/regexpp@4.12.2:
+ resolution: {integrity: sha512-EriSTlt5OC9/7SXkRSCAhfSxxoSUgBm33OH+IkwbdpgoqsSsUg7y3uh+IICI/Qg4BBWr3U2i39RpmycbxMq4ew==}
+ engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0}
+ dev: true
+
+ /@eslint/eslintrc@2.1.4:
+ resolution: {integrity: sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==}
+ engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
+ dependencies:
+ ajv: 6.12.6
+ debug: 4.4.3(supports-color@8.1.1)
+ espree: 9.6.1
+ globals: 13.24.0
+ ignore: 5.3.2
+ import-fresh: 3.3.1
+ js-yaml: 4.1.0
+ minimatch: 3.1.2
+ strip-json-comments: 3.1.1
+ transitivePeerDependencies:
+ - supports-color
+ dev: true
+
+ /@eslint/js@8.57.1:
+ resolution: {integrity: sha512-d9zaMRSTIKDLhctzH12MtXvJKSSUhaHcjV+2Z+GK+EEY7XKpP5yR4x+N3TAcHTcu963nIr+TMcCb4DBCYX1z6Q==}
+ engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
+ dev: true
+
+ /@eth-optimism/contracts@0.5.40(ethers@5.8.0):
+ resolution: {integrity: sha512-MrzV0nvsymfO/fursTB7m/KunkPsCndltVgfdHaT1Aj5Vi6R/doKIGGkOofHX+8B6VMZpuZosKCMQ5lQuqjt8w==}
+ peerDependencies:
+ ethers: ^5.7.2
+ dependencies:
+ '@eth-optimism/core-utils': 0.12.0
+ '@ethersproject/abstract-provider': 5.8.0
+ '@ethersproject/abstract-signer': 5.8.0
+ ethers: 5.8.0
+ transitivePeerDependencies:
+ - bufferutil
+ - utf-8-validate
+ dev: true
+
+ /@eth-optimism/contracts@0.6.0(ethers@5.8.0):
+ resolution: {integrity: sha512-vQ04wfG9kMf1Fwy3FEMqH2QZbgS0gldKhcBeBUPfO8zu68L61VI97UDXmsMQXzTsEAxK8HnokW3/gosl4/NW3w==}
+ peerDependencies:
+ ethers: ^5.7.2
+ dependencies:
+ '@eth-optimism/core-utils': 0.12.0
+ '@ethersproject/abstract-provider': 5.8.0
+ '@ethersproject/abstract-signer': 5.8.0
+ ethers: 5.8.0
+ transitivePeerDependencies:
+ - bufferutil
+ - utf-8-validate
+ dev: true
+
+ /@eth-optimism/core-utils@0.12.0:
+ resolution: {integrity: sha512-qW+7LZYCz7i8dRa7SRlUKIo1VBU8lvN0HeXCxJR+z+xtMzMQpPds20XJNCMclszxYQHkXY00fOT6GvFw9ZL6nw==}
+ dependencies:
+ '@ethersproject/abi': 5.8.0
+ '@ethersproject/abstract-provider': 5.8.0
+ '@ethersproject/address': 5.8.0
+ '@ethersproject/bignumber': 5.8.0
+ '@ethersproject/bytes': 5.8.0
+ '@ethersproject/constants': 5.8.0
+ '@ethersproject/contracts': 5.8.0
+ '@ethersproject/hash': 5.8.0
+ '@ethersproject/keccak256': 5.8.0
+ '@ethersproject/properties': 5.8.0
+ '@ethersproject/providers': 5.8.0
+ '@ethersproject/rlp': 5.8.0
+ '@ethersproject/transactions': 5.8.0
+ '@ethersproject/web': 5.8.0
+ bufio: 1.2.3
+ chai: 4.5.0
+ transitivePeerDependencies:
+ - bufferutil
+ - utf-8-validate
+ dev: true
+
+ /@ethereum-waffle/chai@4.0.10(@ensdomains/ens@0.4.5)(@ensdomains/resolver@0.2.4)(ethers@5.8.0):
+ resolution: {integrity: sha512-X5RepE7Dn8KQLFO7HHAAe+KeGaX/by14hn90wePGBhzL54tq4Y8JscZFu+/LCwCl6TnkAAy5ebiMoqJ37sFtWw==}
+ engines: {node: '>=10.0'}
+ peerDependencies:
+ ethers: ^5.7.2
+ dependencies:
+ '@ethereum-waffle/provider': 4.0.5(@ensdomains/ens@0.4.5)(@ensdomains/resolver@0.2.4)(ethers@5.8.0)
+ debug: 4.4.3(supports-color@8.1.1)
+ ethers: 5.8.0
+ json-bigint: 1.0.0
+ transitivePeerDependencies:
+ - '@ensdomains/ens'
+ - '@ensdomains/resolver'
+ - supports-color
+ dev: true
+
+ /@ethereum-waffle/compiler@4.0.3(@ethersproject/abi@5.8.0)(@ethersproject/providers@5.8.0)(ethers@5.8.0)(solc@0.8.15)(typechain@8.3.2)(typescript@5.9.3):
+ resolution: {integrity: sha512-5x5U52tSvEVJS6dpCeXXKvRKyf8GICDwiTwUvGD3/WD+DpvgvaoHOL82XqpTSUHgV3bBq6ma5/8gKUJUIAnJCw==}
+ engines: {node: '>=10.0'}
+ peerDependencies:
+ ethers: ^5.7.2
+ solc: '*'
+ typechain: ^8.0.0
+ dependencies:
+ '@resolver-engine/imports': 0.3.3
+ '@resolver-engine/imports-fs': 0.3.3
+ '@typechain/ethers-v5': 10.2.1(@ethersproject/abi@5.8.0)(@ethersproject/providers@5.8.0)(ethers@5.8.0)(typechain@8.3.2)(typescript@5.9.3)
+ '@types/mkdirp': 0.5.2
+ '@types/node-fetch': 2.6.13
+ ethers: 5.8.0
+ mkdirp: 0.5.6
+ node-fetch: 2.7.0
+ solc: 0.8.15
+ typechain: 8.3.2(typescript@5.9.3)
+ transitivePeerDependencies:
+ - '@ethersproject/abi'
+ - '@ethersproject/providers'
+ - encoding
+ - supports-color
+ - typescript
+ dev: true
+
+ /@ethereum-waffle/ens@4.0.3(@ensdomains/ens@0.4.5)(@ensdomains/resolver@0.2.4)(ethers@5.8.0):
+ resolution: {integrity: sha512-PVLcdnTbaTfCrfSOrvtlA9Fih73EeDvFS28JQnT5M5P4JMplqmchhcZB1yg/fCtx4cvgHlZXa0+rOCAk2Jk0Jw==}
+ engines: {node: '>=10.0'}
+ peerDependencies:
+ '@ensdomains/ens': ^0.4.4
+ '@ensdomains/resolver': ^0.2.4
+ ethers: ^5.7.2
+ dependencies:
+ '@ensdomains/ens': 0.4.5
+ '@ensdomains/resolver': 0.2.4
+ ethers: 5.8.0
+ dev: true
+
+ /@ethereum-waffle/mock-contract@4.0.4(ethers@5.8.0):
+ resolution: {integrity: sha512-LwEj5SIuEe9/gnrXgtqIkWbk2g15imM/qcJcxpLyAkOj981tQxXmtV4XmQMZsdedEsZ/D/rbUAOtZbgwqgUwQA==}
+ engines: {node: '>=10.0'}
+ peerDependencies:
+ ethers: ^5.7.2
+ dependencies:
+ ethers: 5.8.0
+ dev: true
+
+ /@ethereum-waffle/provider@4.0.5(@ensdomains/ens@0.4.5)(@ensdomains/resolver@0.2.4)(ethers@5.8.0):
+ resolution: {integrity: sha512-40uzfyzcrPh+Gbdzv89JJTMBlZwzya1YLDyim8mVbEqYLP5VRYWoGp0JMyaizgV3hMoUFRqJKVmIUw4v7r3hYw==}
+ engines: {node: '>=10.0'}
+ peerDependencies:
+ ethers: ^5.7.2
+ dependencies:
+ '@ethereum-waffle/ens': 4.0.3(@ensdomains/ens@0.4.5)(@ensdomains/resolver@0.2.4)(ethers@5.8.0)
+ '@ganache/ethereum-options': 0.1.4
+ debug: 4.4.3(supports-color@8.1.1)
+ ethers: 5.8.0
+ ganache: 7.4.3
+ transitivePeerDependencies:
+ - '@ensdomains/ens'
+ - '@ensdomains/resolver'
+ - supports-color
+ dev: true
+
+ /@ethereumjs/block@3.6.3:
+ resolution: {integrity: sha512-CegDeryc2DVKnDkg5COQrE0bJfw/p0v3GBk2W5/Dj5dOVfEmb50Ux0GLnSPypooLnfqjwFaorGuT9FokWB3GRg==}
+ dependencies:
+ '@ethereumjs/common': 2.6.5
+ '@ethereumjs/tx': 3.5.2
+ ethereumjs-util: 7.1.5
+ merkle-patricia-tree: 4.2.4
+ dev: true
+
+ /@ethereumjs/blockchain@5.5.3:
+ resolution: {integrity: sha512-bi0wuNJ1gw4ByNCV56H0Z4Q7D+SxUbwyG12Wxzbvqc89PXLRNR20LBcSUZRKpN0+YCPo6m0XZL/JLio3B52LTw==}
+ dependencies:
+ '@ethereumjs/block': 3.6.3
+ '@ethereumjs/common': 2.6.5
+ '@ethereumjs/ethash': 1.1.0
+ debug: 4.4.3(supports-color@8.1.1)
+ ethereumjs-util: 7.1.5
+ level-mem: 5.0.1
+ lru-cache: 5.1.1
+ semaphore-async-await: 1.5.1
+ transitivePeerDependencies:
+ - supports-color
+ dev: true
+
+ /@ethereumjs/common@2.6.0:
+ resolution: {integrity: sha512-Cq2qS0FTu6O2VU1sgg+WyU9Ps0M6j/BEMHN+hRaECXCV/r0aI78u4N6p52QW/BDVhwWZpCdrvG8X7NJdzlpNUA==}
+ dependencies:
+ crc-32: 1.2.2
+ ethereumjs-util: 7.1.5
+ dev: true
+
+ /@ethereumjs/common@2.6.5:
+ resolution: {integrity: sha512-lRyVQOeCDaIVtgfbowla32pzeDv2Obr8oR8Put5RdUBNRGr1VGPGQNGP6elWIpgK3YdpzqTOh4GyUGOureVeeA==}
+ dependencies:
+ crc-32: 1.2.2
+ ethereumjs-util: 7.1.5
+ dev: true
+
+ /@ethereumjs/ethash@1.1.0:
+ resolution: {integrity: sha512-/U7UOKW6BzpA+Vt+kISAoeDie1vAvY4Zy2KF5JJb+So7+1yKmJeJEHOGSnQIj330e9Zyl3L5Nae6VZyh2TJnAA==}
+ dependencies:
+ '@ethereumjs/block': 3.6.3
+ '@types/levelup': 4.3.3
+ buffer-xor: 2.0.2
+ ethereumjs-util: 7.1.5
+ miller-rabin: 4.0.1
+ dev: true
+
+ /@ethereumjs/rlp@4.0.1:
+ resolution: {integrity: sha512-tqsQiBQDQdmPWE1xkkBq4rlSW5QZpLOUJ5RJh2/9fug+q9tnUhuZoVLk7s0scUIKTOzEtR72DFBXI4WiZcMpvw==}
+ engines: {node: '>=14'}
+ hasBin: true
+ dev: true
+
+ /@ethereumjs/rlp@5.0.2:
+ resolution: {integrity: sha512-DziebCdg4JpGlEqEdGgXmjqcFoJi+JGulUXwEjsZGAscAQ7MyD/7LE/GVCP29vEQxKc7AAwjT3A2ywHp2xfoCA==}
+ engines: {node: '>=18'}
+ hasBin: true
+ dev: true
+
+ /@ethereumjs/tx@3.4.0:
+ resolution: {integrity: sha512-WWUwg1PdjHKZZxPPo274ZuPsJCWV3SqATrEKQP1n2DrVYVP1aZIYpo/mFaA0BDoE0tIQmBeimRCEA0Lgil+yYw==}
+ dependencies:
+ '@ethereumjs/common': 2.6.5
+ ethereumjs-util: 7.1.5
+ dev: true
+
+ /@ethereumjs/tx@3.5.2:
+ resolution: {integrity: sha512-gQDNJWKrSDGu2w7w0PzVXVBNMzb7wwdDOmOqczmhNjqFxFuIbhVJDwiGEnxFNC2/b8ifcZzY7MLcluizohRzNw==}
+ dependencies:
+ '@ethereumjs/common': 2.6.5
+ ethereumjs-util: 7.1.5
+ dev: true
+
+ /@ethereumjs/util@8.1.0:
+ resolution: {integrity: sha512-zQ0IqbdX8FZ9aw11vP+dZkKDkS+kgIvQPHnSAXzP9pLu+Rfu3D3XEeLbicvoXJTYnhZiPmsZUxgdzXwNKxRPbA==}
+ engines: {node: '>=14'}
+ dependencies:
+ '@ethereumjs/rlp': 4.0.1
+ ethereum-cryptography: 2.2.1
+ micro-ftch: 0.3.1
+ dev: true
+
+ /@ethereumjs/util@9.1.0:
+ resolution: {integrity: sha512-XBEKsYqLGXLah9PNJbgdkigthkG7TAGvlD/sH12beMXEyHDyigfcbdvHhmLyDWgDyOJn4QwiQUaF7yeuhnjdog==}
+ engines: {node: '>=18'}
+ dependencies:
+ '@ethereumjs/rlp': 5.0.2
+ ethereum-cryptography: 2.2.1
+ dev: true
+
+ /@ethereumjs/vm@5.6.0:
+ resolution: {integrity: sha512-J2m/OgjjiGdWF2P9bj/4LnZQ1zRoZhY8mRNVw/N3tXliGI8ai1sI1mlDPkLpeUUM4vq54gH6n0ZlSpz8U/qlYQ==}
+ dependencies:
+ '@ethereumjs/block': 3.6.3
+ '@ethereumjs/blockchain': 5.5.3
+ '@ethereumjs/common': 2.6.5
+ '@ethereumjs/tx': 3.5.2
+ async-eventemitter: 0.2.4
+ core-js-pure: 3.46.0
+ debug: 2.6.9
+ ethereumjs-util: 7.1.5
+ functional-red-black-tree: 1.0.1
+ mcl-wasm: 0.7.9
+ merkle-patricia-tree: 4.2.4
+ rustbn.js: 0.2.0
+ transitivePeerDependencies:
+ - supports-color
+ dev: true
+
+ /@ethersproject/abi@5.8.0:
+ resolution: {integrity: sha512-b9YS/43ObplgyV6SlyQsG53/vkSal0MNA1fskSC4mbnCMi8R+NkcH8K9FPYNESf6jUefBUniE4SOKms0E/KK1Q==}
+ dependencies:
+ '@ethersproject/address': 5.8.0
+ '@ethersproject/bignumber': 5.8.0
+ '@ethersproject/bytes': 5.8.0
+ '@ethersproject/constants': 5.8.0
+ '@ethersproject/hash': 5.8.0
+ '@ethersproject/keccak256': 5.8.0
+ '@ethersproject/logger': 5.8.0
+ '@ethersproject/properties': 5.8.0
+ '@ethersproject/strings': 5.8.0
+ dev: true
+
+ /@ethersproject/abstract-provider@5.8.0:
+ resolution: {integrity: sha512-wC9SFcmh4UK0oKuLJQItoQdzS/qZ51EJegK6EmAWlh+OptpQ/npECOR3QqECd8iGHC0RJb4WKbVdSfif4ammrg==}
+ dependencies:
+ '@ethersproject/bignumber': 5.8.0
+ '@ethersproject/bytes': 5.8.0
+ '@ethersproject/logger': 5.8.0
+ '@ethersproject/networks': 5.8.0
+ '@ethersproject/properties': 5.8.0
+ '@ethersproject/transactions': 5.8.0
+ '@ethersproject/web': 5.8.0
+ dev: true
+
+ /@ethersproject/abstract-signer@5.8.0:
+ resolution: {integrity: sha512-N0XhZTswXcmIZQdYtUnd79VJzvEwXQw6PK0dTl9VoYrEBxxCPXqS0Eod7q5TNKRxe1/5WUMuR0u0nqTF/avdCA==}
+ dependencies:
+ '@ethersproject/abstract-provider': 5.8.0
+ '@ethersproject/bignumber': 5.8.0
+ '@ethersproject/bytes': 5.8.0
+ '@ethersproject/logger': 5.8.0
+ '@ethersproject/properties': 5.8.0
+ dev: true
+
+ /@ethersproject/address@5.7.0:
+ resolution: {integrity: sha512-9wYhYt7aghVGo758POM5nqcOMaE168Q6aRLJZwUmiqSrAungkG74gSSeKEIR7ukixesdRZGPgVqme6vmxs1fkA==}
+ dependencies:
+ '@ethersproject/bignumber': 5.8.0
+ '@ethersproject/bytes': 5.8.0
+ '@ethersproject/keccak256': 5.8.0
+ '@ethersproject/logger': 5.8.0
+ '@ethersproject/rlp': 5.8.0
+ dev: true
+
+ /@ethersproject/address@5.8.0:
+ resolution: {integrity: sha512-GhH/abcC46LJwshoN+uBNoKVFPxUuZm6dA257z0vZkKmU1+t8xTn8oK7B9qrj8W2rFRMch4gbJl6PmVxjxBEBA==}
+ dependencies:
+ '@ethersproject/bignumber': 5.8.0
+ '@ethersproject/bytes': 5.8.0
+ '@ethersproject/keccak256': 5.8.0
+ '@ethersproject/logger': 5.8.0
+ '@ethersproject/rlp': 5.8.0
+ dev: true
+
+ /@ethersproject/base64@5.8.0:
+ resolution: {integrity: sha512-lN0oIwfkYj9LbPx4xEkie6rAMJtySbpOAFXSDVQaBnAzYfB4X2Qr+FXJGxMoc3Bxp2Sm8OwvzMrywxyw0gLjIQ==}
+ dependencies:
+ '@ethersproject/bytes': 5.8.0
+ dev: true
+
+ /@ethersproject/basex@5.8.0:
+ resolution: {integrity: sha512-PIgTszMlDRmNwW9nhS6iqtVfdTAKosA7llYXNmGPw4YAI1PUyMv28988wAb41/gHF/WqGdoLv0erHaRcHRKW2Q==}
+ dependencies:
+ '@ethersproject/bytes': 5.8.0
+ '@ethersproject/properties': 5.8.0
+ dev: true
+
+ /@ethersproject/bignumber@5.8.0:
+ resolution: {integrity: sha512-ZyaT24bHaSeJon2tGPKIiHszWjD/54Sz8t57Toch475lCLljC6MgPmxk7Gtzz+ddNN5LuHea9qhAe0x3D+uYPA==}
+ dependencies:
+ '@ethersproject/bytes': 5.8.0
+ '@ethersproject/logger': 5.8.0
+ bn.js: 5.2.2
+ dev: true
+
+ /@ethersproject/bytes@5.8.0:
+ resolution: {integrity: sha512-vTkeohgJVCPVHu5c25XWaWQOZ4v+DkGoC42/TS2ond+PARCxTJvgTFUNDZovyQ/uAQ4EcpqqowKydcdmRKjg7A==}
+ dependencies:
+ '@ethersproject/logger': 5.8.0
+ dev: true
+
+ /@ethersproject/constants@5.8.0:
+ resolution: {integrity: sha512-wigX4lrf5Vu+axVTIvNsuL6YrV4O5AXl5ubcURKMEME5TnWBouUh0CDTWxZ2GpnRn1kcCgE7l8O5+VbV9QTTcg==}
+ dependencies:
+ '@ethersproject/bignumber': 5.8.0
+ dev: true
+
+ /@ethersproject/contracts@5.8.0:
+ resolution: {integrity: sha512-0eFjGz9GtuAi6MZwhb4uvUM216F38xiuR0yYCjKJpNfSEy4HUM8hvqqBj9Jmm0IUz8l0xKEhWwLIhPgxNY0yvQ==}
+ dependencies:
+ '@ethersproject/abi': 5.8.0
+ '@ethersproject/abstract-provider': 5.8.0
+ '@ethersproject/abstract-signer': 5.8.0
+ '@ethersproject/address': 5.8.0
+ '@ethersproject/bignumber': 5.8.0
+ '@ethersproject/bytes': 5.8.0
+ '@ethersproject/constants': 5.8.0
+ '@ethersproject/logger': 5.8.0
+ '@ethersproject/properties': 5.8.0
+ '@ethersproject/transactions': 5.8.0
+ dev: true
+
+ /@ethersproject/hash@5.8.0:
+ resolution: {integrity: sha512-ac/lBcTbEWW/VGJij0CNSw/wPcw9bSRgCB0AIBz8CvED/jfvDoV9hsIIiWfvWmFEi8RcXtlNwp2jv6ozWOsooA==}
+ dependencies:
+ '@ethersproject/abstract-signer': 5.8.0
+ '@ethersproject/address': 5.8.0
+ '@ethersproject/base64': 5.8.0
+ '@ethersproject/bignumber': 5.8.0
+ '@ethersproject/bytes': 5.8.0
+ '@ethersproject/keccak256': 5.8.0
+ '@ethersproject/logger': 5.8.0
+ '@ethersproject/properties': 5.8.0
+ '@ethersproject/strings': 5.8.0
+ dev: true
+
+ /@ethersproject/hdnode@5.8.0:
+ resolution: {integrity: sha512-4bK1VF6E83/3/Im0ERnnUeWOY3P1BZml4ZD3wcH8Ys0/d1h1xaFt6Zc+Dh9zXf9TapGro0T4wvO71UTCp3/uoA==}
+ dependencies:
+ '@ethersproject/abstract-signer': 5.8.0
+ '@ethersproject/basex': 5.8.0
+ '@ethersproject/bignumber': 5.8.0
+ '@ethersproject/bytes': 5.8.0
+ '@ethersproject/logger': 5.8.0
+ '@ethersproject/pbkdf2': 5.8.0
+ '@ethersproject/properties': 5.8.0
+ '@ethersproject/sha2': 5.8.0
+ '@ethersproject/signing-key': 5.8.0
+ '@ethersproject/strings': 5.8.0
+ '@ethersproject/transactions': 5.8.0
+ '@ethersproject/wordlists': 5.8.0
+ dev: true
+
+ /@ethersproject/json-wallets@5.8.0:
+ resolution: {integrity: sha512-HxblNck8FVUtNxS3VTEYJAcwiKYsBIF77W15HufqlBF9gGfhmYOJtYZp8fSDZtn9y5EaXTE87zDwzxRoTFk11w==}
+ dependencies:
+ '@ethersproject/abstract-signer': 5.8.0
+ '@ethersproject/address': 5.8.0
+ '@ethersproject/bytes': 5.8.0
+ '@ethersproject/hdnode': 5.8.0
+ '@ethersproject/keccak256': 5.8.0
+ '@ethersproject/logger': 5.8.0
+ '@ethersproject/pbkdf2': 5.8.0
+ '@ethersproject/properties': 5.8.0
+ '@ethersproject/random': 5.8.0
+ '@ethersproject/strings': 5.8.0
+ '@ethersproject/transactions': 5.8.0
+ aes-js: 3.0.0
+ scrypt-js: 3.0.1
+ dev: true
+
+ /@ethersproject/keccak256@5.8.0:
+ resolution: {integrity: sha512-A1pkKLZSz8pDaQ1ftutZoaN46I6+jvuqugx5KYNeQOPqq+JZ0Txm7dlWesCHB5cndJSu5vP2VKptKf7cksERng==}
+ dependencies:
+ '@ethersproject/bytes': 5.8.0
+ js-sha3: 0.8.0
+ dev: true
+
+ /@ethersproject/logger@5.8.0:
+ resolution: {integrity: sha512-Qe6knGmY+zPPWTC+wQrpitodgBfH7XoceCGL5bJVejmH+yCS3R8jJm8iiWuvWbG76RUmyEG53oqv6GMVWqunjA==}
+ dev: true
+
+ /@ethersproject/networks@5.8.0:
+ resolution: {integrity: sha512-egPJh3aPVAzbHwq8DD7Po53J4OUSsA1MjQp8Vf/OZPav5rlmWUaFLiq8cvQiGK0Z5K6LYzm29+VA/p4RL1FzNg==}
+ dependencies:
+ '@ethersproject/logger': 5.8.0
+ dev: true
+
+ /@ethersproject/pbkdf2@5.8.0:
+ resolution: {integrity: sha512-wuHiv97BrzCmfEaPbUFpMjlVg/IDkZThp9Ri88BpjRleg4iePJaj2SW8AIyE8cXn5V1tuAaMj6lzvsGJkGWskg==}
+ dependencies:
+ '@ethersproject/bytes': 5.8.0
+ '@ethersproject/sha2': 5.8.0
+ dev: true
+
+ /@ethersproject/properties@5.8.0:
+ resolution: {integrity: sha512-PYuiEoQ+FMaZZNGrStmN7+lWjlsoufGIHdww7454FIaGdbe/p5rnaCXTr5MtBYl3NkeoVhHZuyzChPeGeKIpQw==}
+ dependencies:
+ '@ethersproject/logger': 5.8.0
+ dev: true
+
+ /@ethersproject/providers@5.8.0:
+ resolution: {integrity: sha512-3Il3oTzEx3o6kzcg9ZzbE+oCZYyY+3Zh83sKkn4s1DZfTUjIegHnN2Cm0kbn9YFy45FDVcuCLLONhU7ny0SsCw==}
+ dependencies:
+ '@ethersproject/abstract-provider': 5.8.0
+ '@ethersproject/abstract-signer': 5.8.0
+ '@ethersproject/address': 5.8.0
+ '@ethersproject/base64': 5.8.0
+ '@ethersproject/basex': 5.8.0
+ '@ethersproject/bignumber': 5.8.0
+ '@ethersproject/bytes': 5.8.0
+ '@ethersproject/constants': 5.8.0
+ '@ethersproject/hash': 5.8.0
+ '@ethersproject/logger': 5.8.0
+ '@ethersproject/networks': 5.8.0
+ '@ethersproject/properties': 5.8.0
+ '@ethersproject/random': 5.8.0
+ '@ethersproject/rlp': 5.8.0
+ '@ethersproject/sha2': 5.8.0
+ '@ethersproject/strings': 5.8.0
+ '@ethersproject/transactions': 5.8.0
+ '@ethersproject/web': 5.8.0
+ bech32: 1.1.4
+ ws: 8.18.0
+ transitivePeerDependencies:
+ - bufferutil
+ - utf-8-validate
+ dev: true
+
+ /@ethersproject/random@5.8.0:
+ resolution: {integrity: sha512-E4I5TDl7SVqyg4/kkA/qTfuLWAQGXmSOgYyO01So8hLfwgKvYK5snIlzxJMk72IFdG/7oh8yuSqY2KX7MMwg+A==}
+ dependencies:
+ '@ethersproject/bytes': 5.8.0
+ '@ethersproject/logger': 5.8.0
+ dev: true
+
+ /@ethersproject/rlp@5.8.0:
+ resolution: {integrity: sha512-LqZgAznqDbiEunaUvykH2JAoXTT9NV0Atqk8rQN9nx9SEgThA/WMx5DnW8a9FOufo//6FZOCHZ+XiClzgbqV9Q==}
+ dependencies:
+ '@ethersproject/bytes': 5.8.0
+ '@ethersproject/logger': 5.8.0
+ dev: true
+
+ /@ethersproject/sha2@5.8.0:
+ resolution: {integrity: sha512-dDOUrXr9wF/YFltgTBYS0tKslPEKr6AekjqDW2dbn1L1xmjGR+9GiKu4ajxovnrDbwxAKdHjW8jNcwfz8PAz4A==}
+ dependencies:
+ '@ethersproject/bytes': 5.8.0
+ '@ethersproject/logger': 5.8.0
+ hash.js: 1.1.7
+ dev: true
+
+ /@ethersproject/signing-key@5.8.0:
+ resolution: {integrity: sha512-LrPW2ZxoigFi6U6aVkFN/fa9Yx/+4AtIUe4/HACTvKJdhm0eeb107EVCIQcrLZkxaSIgc/eCrX8Q1GtbH+9n3w==}
+ dependencies:
+ '@ethersproject/bytes': 5.8.0
+ '@ethersproject/logger': 5.8.0
+ '@ethersproject/properties': 5.8.0
+ bn.js: 5.2.2
+ elliptic: 6.6.1
+ hash.js: 1.1.7
+ dev: true
+
+ /@ethersproject/solidity@5.8.0:
+ resolution: {integrity: sha512-4CxFeCgmIWamOHwYN9d+QWGxye9qQLilpgTU0XhYs1OahkclF+ewO+3V1U0mvpiuQxm5EHHmv8f7ClVII8EHsA==}
+ dependencies:
+ '@ethersproject/bignumber': 5.8.0
+ '@ethersproject/bytes': 5.8.0
+ '@ethersproject/keccak256': 5.8.0
+ '@ethersproject/logger': 5.8.0
+ '@ethersproject/sha2': 5.8.0
+ '@ethersproject/strings': 5.8.0
+ dev: true
+
+ /@ethersproject/strings@5.8.0:
+ resolution: {integrity: sha512-qWEAk0MAvl0LszjdfnZ2uC8xbR2wdv4cDabyHiBh3Cldq/T8dPH3V4BbBsAYJUeonwD+8afVXld274Ls+Y1xXg==}
+ dependencies:
+ '@ethersproject/bytes': 5.8.0
+ '@ethersproject/constants': 5.8.0
+ '@ethersproject/logger': 5.8.0
+ dev: true
+
+ /@ethersproject/transactions@5.8.0:
+ resolution: {integrity: sha512-UglxSDjByHG0TuU17bDfCemZ3AnKO2vYrL5/2n2oXvKzvb7Cz+W9gOWXKARjp2URVwcWlQlPOEQyAviKwT4AHg==}
+ dependencies:
+ '@ethersproject/address': 5.8.0
+ '@ethersproject/bignumber': 5.8.0
+ '@ethersproject/bytes': 5.8.0
+ '@ethersproject/constants': 5.8.0
+ '@ethersproject/keccak256': 5.8.0
+ '@ethersproject/logger': 5.8.0
+ '@ethersproject/properties': 5.8.0
+ '@ethersproject/rlp': 5.8.0
+ '@ethersproject/signing-key': 5.8.0
+ dev: true
+
+ /@ethersproject/units@5.8.0:
+ resolution: {integrity: sha512-lxq0CAnc5kMGIiWW4Mr041VT8IhNM+Pn5T3haO74XZWFulk7wH1Gv64HqE96hT4a7iiNMdOCFEBgaxWuk8ETKQ==}
+ dependencies:
+ '@ethersproject/bignumber': 5.8.0
+ '@ethersproject/constants': 5.8.0
+ '@ethersproject/logger': 5.8.0
+ dev: true
+
+ /@ethersproject/wallet@5.8.0:
+ resolution: {integrity: sha512-G+jnzmgg6UxurVKRKvw27h0kvG75YKXZKdlLYmAHeF32TGUzHkOFd7Zn6QHOTYRFWnfjtSSFjBowKo7vfrXzPA==}
+ dependencies:
+ '@ethersproject/abstract-provider': 5.8.0
+ '@ethersproject/abstract-signer': 5.8.0
+ '@ethersproject/address': 5.8.0
+ '@ethersproject/bignumber': 5.8.0
+ '@ethersproject/bytes': 5.8.0
+ '@ethersproject/hash': 5.8.0
+ '@ethersproject/hdnode': 5.8.0
+ '@ethersproject/json-wallets': 5.8.0
+ '@ethersproject/keccak256': 5.8.0
+ '@ethersproject/logger': 5.8.0
+ '@ethersproject/properties': 5.8.0
+ '@ethersproject/random': 5.8.0
+ '@ethersproject/signing-key': 5.8.0
+ '@ethersproject/transactions': 5.8.0
+ '@ethersproject/wordlists': 5.8.0
+ dev: true
+
+ /@ethersproject/web@5.8.0:
+ resolution: {integrity: sha512-j7+Ksi/9KfGviws6Qtf9Q7KCqRhpwrYKQPs+JBA/rKVFF/yaWLHJEH3zfVP2plVu+eys0d2DlFmhoQJayFewcw==}
+ dependencies:
+ '@ethersproject/base64': 5.8.0
+ '@ethersproject/bytes': 5.8.0
+ '@ethersproject/logger': 5.8.0
+ '@ethersproject/properties': 5.8.0
+ '@ethersproject/strings': 5.8.0
+ dev: true
+
+ /@ethersproject/wordlists@5.8.0:
+ resolution: {integrity: sha512-2df9bbXicZws2Sb5S6ET493uJ0Z84Fjr3pC4tu/qlnZERibZCeUVuqdtt+7Tv9xxhUxHoIekIA7avrKUWHrezg==}
+ dependencies:
+ '@ethersproject/bytes': 5.8.0
+ '@ethersproject/hash': 5.8.0
+ '@ethersproject/logger': 5.8.0
+ '@ethersproject/properties': 5.8.0
+ '@ethersproject/strings': 5.8.0
+ dev: true
+
+ /@fastify/busboy@2.1.1:
+ resolution: {integrity: sha512-vBZP4NlzfOlerQTnba4aqZoMhE/a9HY7HRqoOPaETQcSQuWEIyZMHGfVu6w9wGtGK5fED5qRs2DteVCjOH60sA==}
+ engines: {node: '>=14'}
+ dev: true
+
+ /@ganache/ethereum-address@0.1.4:
+ resolution: {integrity: sha512-sTkU0M9z2nZUzDeHRzzGlW724xhMLXo2LeX1hixbnjHWY1Zg1hkqORywVfl+g5uOO8ht8T0v+34IxNxAhmWlbw==}
+ dependencies:
+ '@ganache/utils': 0.1.4
+ dev: true
+
+ /@ganache/ethereum-options@0.1.4:
+ resolution: {integrity: sha512-i4l46taoK2yC41FPkcoDlEVoqHS52wcbHPqJtYETRWqpOaoj9hAg/EJIHLb1t6Nhva2CdTO84bG+qlzlTxjAHw==}
+ dependencies:
+ '@ganache/ethereum-address': 0.1.4
+ '@ganache/ethereum-utils': 0.1.4
+ '@ganache/options': 0.1.4
+ '@ganache/utils': 0.1.4
+ bip39: 3.0.4
+ seedrandom: 3.0.5
+ transitivePeerDependencies:
+ - supports-color
+ dev: true
+
+ /@ganache/ethereum-utils@0.1.4:
+ resolution: {integrity: sha512-FKXF3zcdDrIoCqovJmHLKZLrJ43234Em2sde/3urUT/10gSgnwlpFmrv2LUMAmSbX3lgZhW/aSs8krGhDevDAg==}
+ dependencies:
+ '@ethereumjs/common': 2.6.0
+ '@ethereumjs/tx': 3.4.0
+ '@ethereumjs/vm': 5.6.0
+ '@ganache/ethereum-address': 0.1.4
+ '@ganache/rlp': 0.1.4
+ '@ganache/utils': 0.1.4
+ emittery: 0.10.0
+ ethereumjs-abi: 0.6.8
+ ethereumjs-util: 7.1.3
+ transitivePeerDependencies:
+ - supports-color
+ dev: true
+
+ /@ganache/options@0.1.4:
+ resolution: {integrity: sha512-zAe/craqNuPz512XQY33MOAG6Si1Xp0hCvfzkBfj2qkuPcbJCq6W/eQ5MB6SbXHrICsHrZOaelyqjuhSEmjXRw==}
+ dependencies:
+ '@ganache/utils': 0.1.4
+ bip39: 3.0.4
+ seedrandom: 3.0.5
+ dev: true
+
+ /@ganache/rlp@0.1.4:
+ resolution: {integrity: sha512-Do3D1H6JmhikB+6rHviGqkrNywou/liVeFiKIpOBLynIpvZhRCgn3SEDxyy/JovcaozTo/BynHumfs5R085MFQ==}
+ dependencies:
+ '@ganache/utils': 0.1.4
+ rlp: 2.2.6
+ dev: true
+
+ /@ganache/utils@0.1.4:
+ resolution: {integrity: sha512-oatUueU3XuXbUbUlkyxeLLH3LzFZ4y5aSkNbx6tjSIhVTPeh+AuBKYt4eQ73FFcTB3nj/gZoslgAh5CN7O369w==}
+ dependencies:
+ emittery: 0.10.0
+ keccak: 3.0.1
+ seedrandom: 3.0.5
+ optionalDependencies:
+ '@trufflesuite/bigint-buffer': 1.1.9
+ dev: true
+
+ /@gql.tada/cli-utils@1.7.1(@0no-co/graphqlsp@1.15.0)(graphql@16.11.0)(typescript@5.9.3):
+ resolution: {integrity: sha512-wg5ysZNQxtNQm67T3laVWmZzLpGb7QfyYWZdaUD2r1OjDj5Bgftq7eQlplmH+hsdffjuUyhJw/b5XAjeE2mJtg==}
+ peerDependencies:
+ '@0no-co/graphqlsp': ^1.12.13
+ '@gql.tada/svelte-support': 1.0.1
+ '@gql.tada/vue-support': 1.0.1
+ graphql: ^15.5.0 || ^16.0.0 || ^17.0.0
+ typescript: ^5.0.0
+ peerDependenciesMeta:
+ '@gql.tada/svelte-support':
+ optional: true
+ '@gql.tada/vue-support':
+ optional: true
+ dependencies:
+ '@0no-co/graphqlsp': 1.15.0(graphql@16.11.0)(typescript@5.9.3)
+ '@gql.tada/internal': 1.0.8(graphql@16.11.0)(typescript@5.9.3)
+ graphql: 16.11.0
+ typescript: 5.9.3
+ dev: true
+
+ /@gql.tada/internal@1.0.8(graphql@16.11.0)(typescript@5.9.3):
+ resolution: {integrity: sha512-XYdxJhtHC5WtZfdDqtKjcQ4d7R1s0d1rnlSs3OcBEUbYiPoJJfZU7tWsVXuv047Z6msvmr4ompJ7eLSK5Km57g==}
+ peerDependencies:
+ graphql: ^15.5.0 || ^16.0.0 || ^17.0.0
+ typescript: ^5.0.0
+ dependencies:
+ '@0no-co/graphql.web': 1.2.0(graphql@16.11.0)
+ graphql: 16.11.0
+ typescript: 5.9.3
+ dev: true
+
+ /@graphql-typed-document-node/core@3.2.0(graphql@16.11.0):
+ resolution: {integrity: sha512-mB9oAsNCm9aM3/SOv4YtBMqZbYj10R7dkq8byBqxGY/ncFwhf2oQzMV+LCRlWoDSEBJ3COiR1yeDvMtsoOsuFQ==}
+ peerDependencies:
+ graphql: ^0.8.0 || ^0.9.0 || ^0.10.0 || ^0.11.0 || ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0
+ dependencies:
+ graphql: 16.11.0
+ dev: true
+
+ /@humanwhocodes/config-array@0.13.0:
+ resolution: {integrity: sha512-DZLEEqFWQFiyK6h5YIeynKx7JlvCYWL0cImfSRXZ9l4Sg2efkFGTuFf6vzXjK1cq6IYkU+Eg/JizXw+TD2vRNw==}
+ engines: {node: '>=10.10.0'}
+ deprecated: Use @eslint/config-array instead
+ dependencies:
+ '@humanwhocodes/object-schema': 2.0.3
+ debug: 4.4.3(supports-color@8.1.1)
+ minimatch: 3.1.2
+ transitivePeerDependencies:
+ - supports-color
+ dev: true
+
+ /@humanwhocodes/module-importer@1.0.1:
+ resolution: {integrity: sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==}
+ engines: {node: '>=12.22'}
+ dev: true
+
+ /@humanwhocodes/object-schema@2.0.3:
+ resolution: {integrity: sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA==}
+ deprecated: Use @eslint/object-schema instead
+ dev: true
+
+ /@improbable-eng/grpc-web@0.15.0(google-protobuf@3.21.4):
+ resolution: {integrity: sha512-ERft9/0/8CmYalqOVnJnpdDry28q+j+nAlFFARdjyxXDJ+Mhgv9+F600QC8BR9ygOfrXRlAk6CvST2j+JCpQPg==}
+ peerDependencies:
+ google-protobuf: ^3.14.0
+ dependencies:
+ browser-headers: 0.4.1
+ google-protobuf: 3.21.4
+ dev: true
+
+ /@initia/initia.js@1.0.4(typescript@5.9.3):
+ resolution: {integrity: sha512-oFfj8heWUFxK/OFAAa8A9NzcBB3M7r6hG1lMLHwGbMLPRbhK4iVY/V1FxcBjspKAuLNsdsb/k+Oc/JUl0iyixQ==}
+ engines: {node: '>=20'}
+ dependencies:
+ '@bitcoinerlab/secp256k1': 1.2.0
+ '@initia/initia.proto': 0.2.6
+ '@initia/opinit.proto': 0.0.11
+ '@ledgerhq/hw-transport': 6.31.12
+ '@ledgerhq/hw-transport-webhid': 6.30.8
+ '@ledgerhq/hw-transport-webusb': 6.29.12
+ '@mysten/bcs': 1.9.2
+ axios: 1.13.1
+ bech32: 2.0.0
+ bignumber.js: 9.3.1
+ bip32: 5.0.0(typescript@5.9.3)
+ bip39: 3.1.0
+ jscrypto: 1.0.3
+ keccak256: 1.0.6
+ ripemd160: 2.0.3
+ secp256k1: 5.0.1
+ semver: 7.7.3
+ ws: 8.18.3(bufferutil@4.0.9)(utf-8-validate@5.0.10)
+ transitivePeerDependencies:
+ - bufferutil
+ - debug
+ - typescript
+ - utf-8-validate
+ dev: true
+
+ /@initia/initia.proto@0.2.6:
+ resolution: {integrity: sha512-khiCPUxZTkyAl+SQbQCOlcJId/a0ToUhG+ChrVXN9a+1ypPz5355j2UP2IvnUf+lAix/+zzdekcqO/Lig7htAQ==}
+ dependencies:
+ '@improbable-eng/grpc-web': 0.15.0(google-protobuf@3.21.4)
+ google-protobuf: 3.21.4
+ long: 5.3.2
+ protobufjs: 7.5.4
+ dev: true
+
+ /@initia/opinit.proto@0.0.11:
+ resolution: {integrity: sha512-Op9GIlXiV1xhUIjVQ2TFE9a3X8iyFVNtJNHCM34gwLQHJktDNm2KCoW4eHh6pkn4//ECRVH7zuKgV8TdZWogCw==}
+ dependencies:
+ '@improbable-eng/grpc-web': 0.15.0(google-protobuf@3.21.4)
+ google-protobuf: 3.21.4
+ long: 5.3.2
+ protobufjs: 7.5.4
+ dev: true
+
+ /@iota/bcs@1.2.0:
+ resolution: {integrity: sha512-QdRSR0KpJ87tdjVNmM/j0+0DvE0aTxHIa02337iluaOsMqtJ8OdgUCfSyLduC/3qS+8tJE+UB1KOw55tF+sN2w==}
+ dependencies:
+ bs58: 6.0.0
+ dev: true
+
+ /@iota/iota-sdk@1.6.1(typescript@5.9.3):
+ resolution: {integrity: sha512-V7rx7m9erCn9lr4hNZVMtwmka2NsoTZ9EFSE4ZqEDO44cWdheM61+i/y5HJhvvmYAb/kkDfSmfdmzLaGTbVVYg==}
+ engines: {node: '>=20'}
+ dependencies:
+ '@graphql-typed-document-node/core': 3.2.0(graphql@16.11.0)
+ '@iota/bcs': 1.2.0
+ '@noble/curves': 1.9.7
+ '@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.3.1
+ gql.tada: 1.8.13(graphql@16.11.0)(typescript@5.9.3)
+ graphql: 16.11.0
+ tweetnacl: 1.0.3
+ valibot: 0.36.0
+ transitivePeerDependencies:
+ - '@gql.tada/svelte-support'
+ - '@gql.tada/vue-support'
+ - typescript
+ dev: true
+
+ /@istanbuljs/load-nyc-config@1.1.0:
+ resolution: {integrity: sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==}
+ engines: {node: '>=8'}
+ dependencies:
+ camelcase: 5.3.1
+ find-up: 4.1.0
+ get-package-type: 0.1.0
+ js-yaml: 3.14.1
+ resolve-from: 5.0.0
+ dev: true
+
+ /@istanbuljs/schema@0.1.3:
+ resolution: {integrity: sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==}
+ engines: {node: '>=8'}
+ dev: true
+
+ /@jest/console@29.7.0:
+ resolution: {integrity: sha512-5Ni4CU7XHQi32IJ398EEP4RrB8eV09sXP2ROqD4bksHrnTree52PsxvX8tpL8LvTZ3pFzXyPbNQReSN41CAhOg==}
+ engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
+ dependencies:
+ '@jest/types': 29.6.3
+ '@types/node': 18.18.14
+ chalk: 4.1.2
+ jest-message-util: 29.7.0
+ jest-util: 29.7.0
+ slash: 3.0.0
+ dev: true
+
+ /@jest/core@29.7.0(ts-node@10.9.2):
+ resolution: {integrity: sha512-n7aeXWKMnGtDA48y8TLWJPJmLmmZ642Ceo78cYWEpiD7FzDgmNDV/GCVRorPABdXLJZ/9wzzgZAlHjXjxDHGsg==}
+ engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
+ peerDependencies:
+ node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0
+ peerDependenciesMeta:
+ node-notifier:
+ optional: true
+ dependencies:
+ '@jest/console': 29.7.0
+ '@jest/reporters': 29.7.0
+ '@jest/test-result': 29.7.0
+ '@jest/transform': 29.7.0
+ '@jest/types': 29.6.3
+ '@types/node': 18.18.14
+ ansi-escapes: 4.3.2
+ chalk: 4.1.2
+ ci-info: 3.9.0
+ exit: 0.1.2
+ graceful-fs: 4.2.11
+ jest-changed-files: 29.7.0
+ jest-config: 29.7.0(@types/node@18.18.14)(ts-node@10.9.2)
+ jest-haste-map: 29.7.0
+ jest-message-util: 29.7.0
+ jest-regex-util: 29.6.3
+ jest-resolve: 29.7.0
+ jest-resolve-dependencies: 29.7.0
+ jest-runner: 29.7.0
+ jest-runtime: 29.7.0
+ jest-snapshot: 29.7.0
+ jest-util: 29.7.0
+ jest-validate: 29.7.0
+ jest-watcher: 29.7.0
+ micromatch: 4.0.8
+ pretty-format: 29.7.0
+ slash: 3.0.0
+ strip-ansi: 6.0.1
+ transitivePeerDependencies:
+ - babel-plugin-macros
+ - supports-color
+ - ts-node
+ dev: true
+
+ /@jest/create-cache-key-function@30.2.0:
+ resolution: {integrity: sha512-44F4l4Enf+MirJN8X/NhdGkl71k5rBYiwdVlo4HxOwbu0sHV8QKrGEedb1VUU4K3W7fBKE0HGfbn7eZm0Ti3zg==}
+ engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0}
+ dependencies:
+ '@jest/types': 30.2.0
+ dev: true
+
+ /@jest/environment@29.7.0:
+ resolution: {integrity: sha512-aQIfHDq33ExsN4jP1NWGXhxgQ/wixs60gDiKO+XVMd8Mn0NWPWgc34ZQDTb2jKaUWQ7MuwoitXAsN2XVXNMpAw==}
+ engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
+ dependencies:
+ '@jest/fake-timers': 29.7.0
+ '@jest/types': 29.6.3
+ '@types/node': 18.18.14
+ jest-mock: 29.7.0
+ dev: true
+
+ /@jest/expect-utils@29.7.0:
+ resolution: {integrity: sha512-GlsNBWiFQFCVi9QVSx7f5AgMeLxe9YCCs5PuP2O2LdjDAA8Jh9eX7lA1Jq/xdXw3Wb3hyvlFNfZIfcRetSzYcA==}
+ engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
+ dependencies:
+ jest-get-type: 29.6.3
+ dev: true
+
+ /@jest/expect@29.7.0:
+ resolution: {integrity: sha512-8uMeAMycttpva3P1lBHB8VciS9V0XAr3GymPpipdyQXbBcuhkLQOSe8E/p92RyAdToS6ZD1tFkX+CkhoECE0dQ==}
+ engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
+ dependencies:
+ expect: 29.7.0
+ jest-snapshot: 29.7.0
+ transitivePeerDependencies:
+ - supports-color
+ dev: true
+
+ /@jest/fake-timers@29.7.0:
+ resolution: {integrity: sha512-q4DH1Ha4TTFPdxLsqDXK1d3+ioSL7yL5oCMJZgDYm6i+6CygW5E5xVr/D1HdsGxjt1ZWSfUAs9OxSB/BNelWrQ==}
+ engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
+ dependencies:
+ '@jest/types': 29.6.3
+ '@sinonjs/fake-timers': 10.3.0
+ '@types/node': 18.18.14
+ jest-message-util: 29.7.0
+ jest-mock: 29.7.0
+ jest-util: 29.7.0
+ dev: true
+
+ /@jest/globals@29.7.0:
+ resolution: {integrity: sha512-mpiz3dutLbkW2MNFubUGUEVLkTGiqW6yLVTA+JbP6fI6J5iL9Y0Nlg8k95pcF8ctKwCS7WVxteBs29hhfAotzQ==}
+ engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
+ dependencies:
+ '@jest/environment': 29.7.0
+ '@jest/expect': 29.7.0
+ '@jest/types': 29.6.3
+ jest-mock: 29.7.0
+ transitivePeerDependencies:
+ - supports-color
+ dev: true
+
+ /@jest/pattern@30.0.1:
+ resolution: {integrity: sha512-gWp7NfQW27LaBQz3TITS8L7ZCQ0TLvtmI//4OwlQRx4rnWxcPNIYjxZpDcN4+UlGxgm3jS5QPz8IPTCkb59wZA==}
+ engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0}
+ dependencies:
+ '@types/node': 18.18.14
+ jest-regex-util: 30.0.1
+ dev: true
+
+ /@jest/reporters@29.7.0:
+ resolution: {integrity: sha512-DApq0KJbJOEzAFYjHADNNxAE3KbhxQB1y5Kplb5Waqw6zVbuWatSnMjE5gs8FUgEPmNsnZA3NCWl9NG0ia04Pg==}
+ engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
+ peerDependencies:
+ node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0
+ peerDependenciesMeta:
+ node-notifier:
+ optional: true
+ dependencies:
+ '@bcoe/v8-coverage': 0.2.3
+ '@jest/console': 29.7.0
+ '@jest/test-result': 29.7.0
+ '@jest/transform': 29.7.0
+ '@jest/types': 29.6.3
+ '@jridgewell/trace-mapping': 0.3.31
+ '@types/node': 18.18.14
+ chalk: 4.1.2
+ collect-v8-coverage: 1.0.3
+ exit: 0.1.2
+ glob: 7.2.3
+ graceful-fs: 4.2.11
+ istanbul-lib-coverage: 3.2.2
+ istanbul-lib-instrument: 6.0.3
+ istanbul-lib-report: 3.0.1
+ istanbul-lib-source-maps: 4.0.1
+ istanbul-reports: 3.2.0
+ jest-message-util: 29.7.0
+ jest-util: 29.7.0
+ jest-worker: 29.7.0
+ slash: 3.0.0
+ string-length: 4.0.2
+ strip-ansi: 6.0.1
+ v8-to-istanbul: 9.3.0
+ transitivePeerDependencies:
+ - supports-color
+ dev: true
+
+ /@jest/schemas@29.6.3:
+ resolution: {integrity: sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA==}
+ engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
+ dependencies:
+ '@sinclair/typebox': 0.27.8
+ dev: true
+
+ /@jest/schemas@30.0.5:
+ resolution: {integrity: sha512-DmdYgtezMkh3cpU8/1uyXakv3tJRcmcXxBOcO0tbaozPwpmh4YMsnWrQm9ZmZMfa5ocbxzbFk6O4bDPEc/iAnA==}
+ engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0}
+ dependencies:
+ '@sinclair/typebox': 0.34.41
+ dev: true
+
+ /@jest/source-map@29.6.3:
+ resolution: {integrity: sha512-MHjT95QuipcPrpLM+8JMSzFx6eHp5Bm+4XeFDJlwsvVBjmKNiIAvasGK2fxz2WbGRlnvqehFbh07MMa7n3YJnw==}
+ engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
+ dependencies:
+ '@jridgewell/trace-mapping': 0.3.31
+ callsites: 3.1.0
+ graceful-fs: 4.2.11
+ dev: true
+
+ /@jest/test-result@29.7.0:
+ resolution: {integrity: sha512-Fdx+tv6x1zlkJPcWXmMDAG2HBnaR9XPSd5aDWQVsfrZmLVT3lU1cwyxLgRmXR9yrq4NBoEm9BMsfgFzTQAbJYA==}
+ engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
+ dependencies:
+ '@jest/console': 29.7.0
+ '@jest/types': 29.6.3
+ '@types/istanbul-lib-coverage': 2.0.6
+ collect-v8-coverage: 1.0.3
+ dev: true
+
+ /@jest/test-sequencer@29.7.0:
+ resolution: {integrity: sha512-GQwJ5WZVrKnOJuiYiAF52UNUJXgTZx1NHjFSEB0qEMmSZKAkdMoIzw/Cj6x6NF4AvV23AUqDpFzQkN/eYCYTxw==}
+ engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
+ dependencies:
+ '@jest/test-result': 29.7.0
+ graceful-fs: 4.2.11
+ jest-haste-map: 29.7.0
+ slash: 3.0.0
+ dev: true
+
+ /@jest/transform@29.7.0:
+ resolution: {integrity: sha512-ok/BTPFzFKVMwO5eOHRrvnBVHdRy9IrsrW1GpMaQ9MCnilNLXQKmAX8s1YXDFaai9xJpac2ySzV0YeRRECr2Vw==}
+ engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
+ dependencies:
+ '@babel/core': 7.28.5
+ '@jest/types': 29.6.3
+ '@jridgewell/trace-mapping': 0.3.31
+ babel-plugin-istanbul: 6.1.1
+ chalk: 4.1.2
+ convert-source-map: 2.0.0
+ fast-json-stable-stringify: 2.1.0
+ graceful-fs: 4.2.11
+ jest-haste-map: 29.7.0
+ jest-regex-util: 29.6.3
+ jest-util: 29.7.0
+ micromatch: 4.0.8
+ pirates: 4.0.7
+ slash: 3.0.0
+ write-file-atomic: 4.0.2
+ transitivePeerDependencies:
+ - supports-color
+ dev: true
+
+ /@jest/types@29.6.3:
+ resolution: {integrity: sha512-u3UPsIilWKOM3F9CXtrG8LEJmNxwoCQC/XVj4IKYXvvpx7QIi/Kg1LI5uDmDpKlac62NUtX7eLjRh+jVZcLOzw==}
+ engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
+ dependencies:
+ '@jest/schemas': 29.6.3
+ '@types/istanbul-lib-coverage': 2.0.6
+ '@types/istanbul-reports': 3.0.4
+ '@types/node': 18.18.14
+ '@types/yargs': 17.0.34
+ chalk: 4.1.2
+ dev: true
+
+ /@jest/types@30.2.0:
+ resolution: {integrity: sha512-H9xg1/sfVvyfU7o3zMfBEjQ1gcsdeTMgqHoYdN79tuLqfTtuu7WckRA1R5whDwOzxaZAeMKTYWqP+WCAi0CHsg==}
+ engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0}
+ dependencies:
+ '@jest/pattern': 30.0.1
+ '@jest/schemas': 30.0.5
+ '@types/istanbul-lib-coverage': 2.0.6
+ '@types/istanbul-reports': 3.0.4
+ '@types/node': 18.18.14
+ '@types/yargs': 17.0.34
+ chalk: 4.1.2
+ dev: true
+
+ /@jridgewell/gen-mapping@0.3.13:
+ resolution: {integrity: sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==}
+ dependencies:
+ '@jridgewell/sourcemap-codec': 1.5.5
+ '@jridgewell/trace-mapping': 0.3.31
+ dev: true
+
+ /@jridgewell/remapping@2.3.5:
+ resolution: {integrity: sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==}
+ dependencies:
+ '@jridgewell/gen-mapping': 0.3.13
+ '@jridgewell/trace-mapping': 0.3.31
+ dev: true
+
+ /@jridgewell/resolve-uri@3.1.2:
+ resolution: {integrity: sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==}
+ engines: {node: '>=6.0.0'}
+ dev: true
+
+ /@jridgewell/sourcemap-codec@1.5.5:
+ resolution: {integrity: sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==}
+ dev: true
+
+ /@jridgewell/trace-mapping@0.3.31:
+ resolution: {integrity: sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==}
+ dependencies:
+ '@jridgewell/resolve-uri': 3.1.2
+ '@jridgewell/sourcemap-codec': 1.5.5
+ dev: true
+
+ /@jridgewell/trace-mapping@0.3.9:
+ resolution: {integrity: sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==}
+ dependencies:
+ '@jridgewell/resolve-uri': 3.1.2
+ '@jridgewell/sourcemap-codec': 1.5.5
+ dev: true
+
+ /@layerzerolabs/devtools-evm-hardhat@4.0.1(@ethersproject/abi@5.8.0)(@ethersproject/abstract-signer@5.8.0)(@ethersproject/contracts@5.8.0)(@ethersproject/providers@5.8.0)(@layerzerolabs/devtools-evm@3.0.0)(@layerzerolabs/devtools@2.0.3)(@layerzerolabs/io-devtools@0.3.1)(@layerzerolabs/lz-definitions@3.0.142)(@nomiclabs/hardhat-ethers@2.2.3)(ethers@5.8.0)(fp-ts@2.16.11)(hardhat-deploy@0.12.4)(hardhat@2.26.4):
+ resolution: {integrity: sha512-RqF6hrVhkJ/O83cYXi744TPOaqBzi4W4+daVHpZsp1W32hDbojYNcXwHi7jldt7BOL0KT/t4A5lBVIcGzCh0YQ==}
+ peerDependencies:
+ '@ethersproject/abi': ^5.7.0
+ '@ethersproject/abstract-signer': ^5.7.0
+ '@ethersproject/contracts': ^5.7.0
+ '@ethersproject/providers': ^5.7.0
+ '@layerzerolabs/devtools': ~2.0.0
+ '@layerzerolabs/devtools-evm': ~3.0.0
+ '@layerzerolabs/io-devtools': ~0.3.0
+ '@layerzerolabs/lz-definitions': ^3.0.75
+ '@nomiclabs/hardhat-ethers': ^2.2.3
+ fp-ts: ^2.16.2
+ hardhat: ^2.22.10
+ hardhat-deploy: ^0.12.1
+ dependencies:
+ '@ethersproject/abi': 5.8.0
+ '@ethersproject/abstract-signer': 5.8.0
+ '@ethersproject/contracts': 5.8.0
+ '@ethersproject/providers': 5.8.0
+ '@layerzerolabs/devtools': 2.0.3(@ethersproject/bytes@5.8.0)(@layerzerolabs/io-devtools@0.3.1)(@layerzerolabs/lz-definitions@3.0.142)(zod@3.25.76)
+ '@layerzerolabs/devtools-evm': 3.0.0(@ethersproject/abi@5.8.0)(@ethersproject/abstract-provider@5.8.0)(@ethersproject/abstract-signer@5.8.0)(@ethersproject/address@5.7.0)(@ethersproject/bignumber@5.8.0)(@ethersproject/constants@5.8.0)(@ethersproject/contracts@5.8.0)(@ethersproject/providers@5.8.0)(@layerzerolabs/devtools@2.0.3)(@layerzerolabs/io-devtools@0.3.1)(@layerzerolabs/lz-definitions@3.0.142)(fp-ts@2.16.11)(zod@3.25.76)
+ '@layerzerolabs/export-deployments': 0.0.16
+ '@layerzerolabs/io-devtools': 0.3.1(ink-gradient@2.0.0)(ink-table@3.1.0)(ink@3.2.0)(react@17.0.2)(yoga-layout-prebuilt@1.10.0)(zod@3.25.76)
+ '@layerzerolabs/lz-definitions': 3.0.142
+ '@nomiclabs/hardhat-ethers': 2.2.3(ethers@5.8.0)(hardhat@2.26.4)
+ '@safe-global/protocol-kit': 1.3.0(ethers@5.8.0)
+ fp-ts: 2.16.11
+ hardhat: 2.26.4(ts-node@10.9.2)(typescript@5.9.3)
+ hardhat-deploy: 0.12.4
+ micro-memoize: 4.1.3
+ p-memoize: 4.0.4
+ zod: 3.25.76
+ transitivePeerDependencies:
+ - bufferutil
+ - encoding
+ - ethers
+ - supports-color
+ - utf-8-validate
+ dev: true
+
+ /@layerzerolabs/devtools-evm@3.0.0(@ethersproject/abi@5.8.0)(@ethersproject/abstract-provider@5.8.0)(@ethersproject/abstract-signer@5.8.0)(@ethersproject/address@5.7.0)(@ethersproject/bignumber@5.8.0)(@ethersproject/constants@5.8.0)(@ethersproject/contracts@5.8.0)(@ethersproject/providers@5.8.0)(@layerzerolabs/devtools@2.0.3)(@layerzerolabs/io-devtools@0.3.1)(@layerzerolabs/lz-definitions@3.0.142)(fp-ts@2.16.11)(zod@3.25.76):
+ resolution: {integrity: sha512-k3oqoB8f4eQf111WtrFQOhzLaxsjEZn/N3o7Bbyn8HlNPPWCyockAfXZfTiJ5p5YXRBDJVO2RkwxsqE00wHnOw==}
+ peerDependencies:
+ '@ethersproject/abi': ^5.7.0
+ '@ethersproject/abstract-provider': ^5.7.0
+ '@ethersproject/abstract-signer': ^5.7.0
+ '@ethersproject/address': ~5.7.0
+ '@ethersproject/bignumber': ^5.7.0
+ '@ethersproject/constants': ^5.7.0
+ '@ethersproject/contracts': ^5.7.0
+ '@ethersproject/providers': ^5.7.0
+ '@layerzerolabs/devtools': ~2.0.0
+ '@layerzerolabs/io-devtools': ~0.3.0
+ '@layerzerolabs/lz-definitions': ^3.0.75
+ fp-ts: ^2.16.2
+ zod: ^3.22.4
+ dependencies:
+ '@ethersproject/abi': 5.8.0
+ '@ethersproject/abstract-provider': 5.8.0
+ '@ethersproject/abstract-signer': 5.8.0
+ '@ethersproject/address': 5.7.0
+ '@ethersproject/bignumber': 5.8.0
+ '@ethersproject/constants': 5.8.0
+ '@ethersproject/contracts': 5.8.0
+ '@ethersproject/providers': 5.8.0
+ '@layerzerolabs/devtools': 2.0.3(@ethersproject/bytes@5.8.0)(@layerzerolabs/io-devtools@0.3.1)(@layerzerolabs/lz-definitions@3.0.142)(zod@3.25.76)
+ '@layerzerolabs/io-devtools': 0.3.1(ink-gradient@2.0.0)(ink-table@3.1.0)(ink@3.2.0)(react@17.0.2)(yoga-layout-prebuilt@1.10.0)(zod@3.25.76)
+ '@layerzerolabs/lz-definitions': 3.0.142
+ '@safe-global/api-kit': 1.3.1
+ '@safe-global/protocol-kit': 1.3.0(ethers@5.8.0)
+ ethers: 5.8.0
+ fp-ts: 2.16.11
+ p-memoize: 4.0.4
+ zod: 3.25.76
+ transitivePeerDependencies:
+ - bufferutil
+ - encoding
+ - supports-color
+ - utf-8-validate
+ dev: true
+
+ /@layerzerolabs/devtools-solana@3.0.4(@layerzerolabs/devtools@2.0.3)(@layerzerolabs/io-devtools@0.3.1)(@layerzerolabs/lz-definitions@3.0.142)(@solana/web3.js@1.98.4)(bn.js@5.2.2)(fastestsmallesttextencoderdecoder@1.0.22)(fp-ts@2.16.11)(typescript@5.9.3)(zod@3.25.76):
+ resolution: {integrity: sha512-RWZsWgG8u0gf6zon/rm5BE2WreSpHL/Li9EkJpxPIrgEs3bDQXB088NTMUBvhlmWGs4M1gCMiA49tUD2tR9V8Q==}
+ peerDependencies:
+ '@layerzerolabs/devtools': ~2.0.3
+ '@layerzerolabs/io-devtools': ~0.3.0
+ '@layerzerolabs/lz-definitions': ^3.0.75
+ '@solana/web3.js': ^1.98.0
+ bn.js: ^5.2.0
+ fp-ts: ^2.16.2
+ zod: ^3.22.4
+ dependencies:
+ '@layerzerolabs/devtools': 2.0.3(@ethersproject/bytes@5.8.0)(@layerzerolabs/io-devtools@0.3.1)(@layerzerolabs/lz-definitions@3.0.142)(zod@3.25.76)
+ '@layerzerolabs/io-devtools': 0.3.1(ink-gradient@2.0.0)(ink-table@3.1.0)(ink@3.2.0)(react@17.0.2)(yoga-layout-prebuilt@1.10.0)(zod@3.25.76)
+ '@layerzerolabs/lz-definitions': 3.0.142
+ '@solana-developers/helpers': 2.8.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3)
+ '@solana/web3.js': 1.98.4(typescript@5.9.3)
+ bn.js: 5.2.2
+ fp-ts: 2.16.11
+ p-memoize: 4.0.4
+ zod: 3.25.76
+ transitivePeerDependencies:
+ - bufferutil
+ - encoding
+ - fastestsmallesttextencoderdecoder
+ - typescript
+ - utf-8-validate
+ dev: true
+
+ /@layerzerolabs/devtools@2.0.3(@ethersproject/bytes@5.8.0)(@layerzerolabs/io-devtools@0.3.1)(@layerzerolabs/lz-definitions@3.0.142)(zod@3.25.76):
+ resolution: {integrity: sha512-kpMQerGyDDQw9B9HdN/yqToZR1oDtFNHmfDQu069hiz8699cu/hUqevHmDPOdEKX+3HsRY3Gn/BZ5JW8WQbFmA==}
+ peerDependencies:
+ '@ethersproject/bytes': ~5.7.0
+ '@layerzerolabs/io-devtools': ~0.3.1
+ '@layerzerolabs/lz-definitions': ^3.0.75
+ zod: ^3.22.4
+ dependencies:
+ '@ethersproject/bytes': 5.8.0
+ '@layerzerolabs/io-devtools': 0.3.1(ink-gradient@2.0.0)(ink-table@3.1.0)(ink@3.2.0)(react@17.0.2)(yoga-layout-prebuilt@1.10.0)(zod@3.25.76)
+ '@layerzerolabs/lz-definitions': 3.0.142
+ bs58: 6.0.0
+ exponential-backoff: 3.1.3
+ js-yaml: 4.1.0
+ zod: 3.25.76
+ dev: true
+
+ /@layerzerolabs/eslint-config-next@2.3.44(typescript@5.9.3):
+ resolution: {integrity: sha512-WlBSy47LGPILdrNgzPiRtQf/hAY62IN37ncUsQwcr8T7cyX1HZREx2qljuXpvduLDAKn5otsm0XIqHuCRUHEFg==}
+ dependencies:
+ '@typescript-eslint/eslint-plugin': 7.18.0(@typescript-eslint/parser@7.18.0)(eslint@8.57.1)(typescript@5.9.3)
+ '@typescript-eslint/parser': 7.18.0(eslint@8.57.1)(typescript@5.9.3)
+ eslint: 8.57.1
+ eslint-config-prettier: 9.1.2(eslint@8.57.1)
+ eslint-import-resolver-typescript: 3.10.1(eslint-plugin-import@2.32.0)(eslint@8.57.1)
+ eslint-plugin-autofix: 2.2.0(eslint@8.57.1)
+ eslint-plugin-compat: 4.2.0(eslint@8.57.1)
+ eslint-plugin-import: 2.32.0(@typescript-eslint/parser@7.18.0)(eslint-import-resolver-typescript@3.10.1)(eslint@8.57.1)
+ eslint-plugin-prettier: 5.5.4(eslint-config-prettier@9.1.2)(eslint@8.57.1)(prettier@3.6.2)
+ eslint-plugin-unused-imports: 3.2.0(@typescript-eslint/eslint-plugin@7.18.0)(eslint@8.57.1)
+ prettier: 3.6.2
+ transitivePeerDependencies:
+ - '@types/eslint'
+ - eslint-import-resolver-webpack
+ - eslint-plugin-import-x
+ - supports-color
+ - typescript
+ dev: true
+
+ /@layerzerolabs/evm-sdks-core@3.0.142:
+ resolution: {integrity: sha512-F+02Gytj4pzrw/JcyZN9btBUkT4rtXy5QTCv6YRB8Hb7zD1XfUHGG3QkwR00BqDe35nc7lg0ppGclpRdI7PMGg==}
+ dependencies:
+ ethers: 5.8.0
+ transitivePeerDependencies:
+ - bufferutil
+ - utf-8-validate
+ dev: true
+
+ /@layerzerolabs/export-deployments@0.0.16:
+ resolution: {integrity: sha512-tI+mKMx51qCrj+G42mrVR+5jAiRaiLCpnXiogjW7E3krbNbJenI1eYYX7U62ssXWXwTZfYSJ1Bw/zLAbs59sqw==}
+ hasBin: true
+ dependencies:
+ typescript: 5.9.3
+ dev: true
+
+ /@layerzerolabs/io-devtools@0.3.1(ink-gradient@2.0.0)(ink-table@3.1.0)(ink@3.2.0)(react@17.0.2)(yoga-layout-prebuilt@1.10.0)(zod@3.25.76):
+ resolution: {integrity: sha512-sP65pO9Op7vLJV2nd5us3ip30S+ylOvT1JiISZineP6Bj1PaPWlXRmjbbznue1VYnF629l+VJ1nYN7a3f1UOTQ==}
+ peerDependencies:
+ ink: ^3.2.0
+ ink-gradient: ^2.0.0
+ ink-table: ^3.1.0
+ react: ^17.0.2
+ yoga-layout-prebuilt: ^1.9.6
+ zod: ^3.22.4
+ peerDependenciesMeta:
+ ink:
+ optional: true
+ ink-gradient:
+ optional: true
+ ink-table:
+ optional: true
+ react:
+ optional: true
+ yoga-layout-prebuilt:
+ optional: true
+ dependencies:
+ chalk: 4.1.2
+ ink: 3.2.0(react@17.0.2)
+ ink-gradient: 2.0.0(ink@3.2.0)(react@17.0.2)
+ ink-table: 3.1.0(ink@3.2.0)(react@17.0.2)
+ logform: 2.7.0
+ prompts: 2.4.2
+ react: 17.0.2
+ table: 6.8.2
+ winston: 3.18.3
+ yoga-layout-prebuilt: 1.10.0
+ zod: 3.25.76
+ dev: true
+
+ /@layerzerolabs/lz-core@3.0.142:
+ resolution: {integrity: sha512-ufIjJD2E0p4FLtNXHqxQ2wuK+CHvDfl4TUp5DgJdw6rFzRroLmX3YF9NdhPKbDUyCIcaGzWekJhc7miWftOF1Q==}
+ dev: true
+
+ /@layerzerolabs/lz-corekit-solana@3.0.142(got@11.8.6)(typescript@5.9.3):
+ resolution: {integrity: sha512-0U5j572qAN8Q5fzZI0hzRytSYBnHcB5roKXJrczrgBt9zq7n59GMsEE9fDCQ8SDazqyn6pXeeVYJOk1Q6zSBTw==}
+ dependencies:
+ '@layerzerolabs/lz-core': 3.0.142
+ '@layerzerolabs/lz-utilities': 3.0.142(got@11.8.6)(typescript@5.9.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.4)
+ '@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.4)
+ '@metaplex-foundation/umi-transaction-factory-web3js': 0.9.2(@metaplex-foundation/umi@0.9.2)(@solana/web3.js@1.98.4)
+ '@noble/hashes': 1.8.0
+ '@noble/secp256k1': 1.7.2
+ '@solana/web3.js': 1.98.4(typescript@5.9.3)
+ bip39: 3.1.0
+ ed25519-hd-key: 1.3.0
+ memoizee: 0.4.17
+ transitivePeerDependencies:
+ - '@gql.tada/svelte-support'
+ - '@gql.tada/vue-support'
+ - bufferutil
+ - debug
+ - encoding
+ - got
+ - typescript
+ - utf-8-validate
+ dev: true
+
+ /@layerzerolabs/lz-definitions@3.0.142:
+ resolution: {integrity: sha512-Sxr/Kyg6wGCzrH9zPuPQAAMnc6e/iRC4pXvdTRYaN6OtUZGAJ/mO9s7+NpSJ05unqS8wn+dabahLl5ogt1rYqg==}
+ dependencies:
+ tiny-invariant: 1.3.3
+ dev: true
+
+ /@layerzerolabs/lz-evm-messagelib-v2@3.0.142(@axelar-network/axelar-gmp-sdk-solidity@5.10.0)(@chainlink/contracts-ccip@0.7.6)(@eth-optimism/contracts@0.6.0)(@layerzerolabs/lz-evm-protocol-v2@3.0.142)(@layerzerolabs/lz-evm-v1-0.7@3.0.142)(@openzeppelin/contracts-upgradeable@5.4.0)(@openzeppelin/contracts@5.4.0)(hardhat-deploy@0.12.4)(solidity-bytes-utils@0.8.4):
+ resolution: {integrity: sha512-yjR2DVRQD3eD4kEMvBpIfHSSgKGn6SNVTpRBfQNoRe5qs/pmc2M6+pneAb+W7lKCHXEwqQOFnuXRyvmNbSoufA==}
+ peerDependencies:
+ '@arbitrum/nitro-contracts': ^1.1.0
+ '@axelar-network/axelar-gmp-sdk-solidity': ^5.6.4
+ '@chainlink/contracts-ccip': ^0.7.6
+ '@eth-optimism/contracts': ^0.6.0
+ '@layerzerolabs/lz-evm-protocol-v2': ^3.0.142
+ '@layerzerolabs/lz-evm-v1-0.7': ^3.0.142
+ '@openzeppelin/contracts': ^4.8.1 || ^5.0.0
+ '@openzeppelin/contracts-upgradeable': ^4.8.1 || ^5.0.0
+ hardhat-deploy: ^0.12.1
+ solidity-bytes-utils: ^0.8.0
+ peerDependenciesMeta:
+ '@arbitrum/nitro-contracts':
+ optional: true
+ dependencies:
+ '@axelar-network/axelar-gmp-sdk-solidity': 5.10.0
+ '@chainlink/contracts-ccip': 0.7.6(ethers@5.8.0)
+ '@eth-optimism/contracts': 0.6.0(ethers@5.8.0)
+ '@layerzerolabs/lz-evm-protocol-v2': 3.0.142(@openzeppelin/contracts-upgradeable@5.4.0)(@openzeppelin/contracts@5.4.0)(hardhat-deploy@0.12.4)(solidity-bytes-utils@0.8.4)
+ '@layerzerolabs/lz-evm-v1-0.7': 3.0.142(@openzeppelin/contracts-upgradeable@5.4.0)(@openzeppelin/contracts@5.4.0)(hardhat-deploy@0.12.4)
+ '@openzeppelin/contracts': 5.4.0
+ '@openzeppelin/contracts-upgradeable': 5.4.0(@openzeppelin/contracts@5.4.0)
+ hardhat-deploy: 0.12.4
+ solidity-bytes-utils: 0.8.4
+ dev: true
+
+ /@layerzerolabs/lz-evm-protocol-v2@3.0.142(@openzeppelin/contracts-upgradeable@5.4.0)(@openzeppelin/contracts@5.4.0)(hardhat-deploy@0.12.4)(solidity-bytes-utils@0.8.4):
+ resolution: {integrity: sha512-pbNX6/+ssLpwfWrdDCrROnp5LJ5Gc16iKAMKAg7CQwX7P6iMMHeXmshaItFqp0La69njiXBP4pTpS3gqNHaj4Q==}
+ peerDependencies:
+ '@openzeppelin/contracts': ^4.8.1 || ^5.0.0
+ '@openzeppelin/contracts-upgradeable': ^4.8.1 || ^5.0.0
+ hardhat-deploy: ^0.12.1
+ solidity-bytes-utils: ^0.8.0
+ dependencies:
+ '@openzeppelin/contracts': 5.4.0
+ '@openzeppelin/contracts-upgradeable': 5.4.0(@openzeppelin/contracts@5.4.0)
+ hardhat-deploy: 0.12.4
+ solidity-bytes-utils: 0.8.4
+ dev: true
+
+ /@layerzerolabs/lz-evm-sdk-v1@3.0.142:
+ resolution: {integrity: sha512-5p5JUMq9amqZxt14hvKTb1hlNe0beX1ISPOroJggtQMcBLfm+yLHSUYMCbxuECKAI7kccqF0ACOZtp8FiBxLOw==}
+ dependencies:
+ '@ethersproject/abi': 5.8.0
+ '@ethersproject/providers': 5.8.0
+ '@layerzerolabs/evm-sdks-core': 3.0.142
+ ethers: 5.8.0
+ transitivePeerDependencies:
+ - bufferutil
+ - utf-8-validate
+ dev: true
+
+ /@layerzerolabs/lz-evm-sdk-v2@3.0.142:
+ resolution: {integrity: sha512-P5Fi2NyYmeKzQFmsDGKziyEcWI9TX/k0LPT5E+zb8zakg2s+pIlp0o68Q+oMdJdgkv5bh2K2hVdoWpuQdTB7wA==}
+ dependencies:
+ '@layerzerolabs/evm-sdks-core': 3.0.142
+ ethers: 5.8.0
+ transitivePeerDependencies:
+ - bufferutil
+ - utf-8-validate
+ dev: true
+
+ /@layerzerolabs/lz-evm-v1-0.7@3.0.142(@openzeppelin/contracts-upgradeable@5.4.0)(@openzeppelin/contracts@5.4.0)(hardhat-deploy@0.12.4):
+ resolution: {integrity: sha512-dTYl7MCjeKNtfzF9zkm/E6zCro3/66k1fzQbgioHNK9gSZhjZfgpuQD10zXAVFjBoDI2LGh/SFlBet5mmSWD7g==}
+ peerDependencies:
+ '@openzeppelin/contracts': 3.4.2-solc-0.7 || ^3.4.2 || ^4.0.0 || ^5.0.0
+ '@openzeppelin/contracts-upgradeable': 3.4.2-solc-0.7 || ^3.4.2 || ^4.0.0 || ^5.0.0
+ hardhat-deploy: ^0.12.1
+ dependencies:
+ '@openzeppelin/contracts': 5.4.0
+ '@openzeppelin/contracts-upgradeable': 5.4.0(@openzeppelin/contracts@5.4.0)
+ hardhat-deploy: 0.12.4
+ dev: true
+
+ /@layerzerolabs/lz-foundation@3.0.142(got@11.8.6)(typescript@5.9.3):
+ resolution: {integrity: sha512-pkxpZ3WnvsSS5thxmXAjJqNBrsxRp2nUfHsfALUzINMu1YYap3VDjxKveYX28ekS4vrwcR400t4MhAgi4RGevA==}
+ dependencies:
+ '@layerzerolabs/lz-definitions': 3.0.142
+ '@layerzerolabs/lz-utilities': 3.0.142(got@11.8.6)(typescript@5.9.3)
+ '@noble/ed25519': 1.7.5
+ '@noble/hashes': 1.8.0
+ '@noble/secp256k1': 1.7.2
+ '@scure/base': 1.2.6
+ bech32: 2.0.0
+ memoizee: 0.4.17
+ transitivePeerDependencies:
+ - '@gql.tada/svelte-support'
+ - '@gql.tada/vue-support'
+ - bufferutil
+ - debug
+ - encoding
+ - got
+ - typescript
+ - utf-8-validate
+ dev: true
+
+ /@layerzerolabs/lz-serdes@3.0.142(got@11.8.6)(typescript@5.9.3):
+ resolution: {integrity: sha512-rWhF+qvvwQjFW3HAzsW+6SaeDaccxWhT/+Y/wA2vti6yyE53Ges2nTfDtDyTwM9AVqXersd1r5tlr+fVk1hP0w==}
+ dependencies:
+ '@coral-xyz/anchor': 0.29.0(typescript@5.9.3)
+ '@layerzerolabs/lz-core': 3.0.142
+ '@layerzerolabs/lz-utilities': 3.0.142(got@11.8.6)(typescript@5.9.3)
+ '@layerzerolabs/tron-utilities': 3.0.142(got@11.8.6)(typescript@5.9.3)
+ aptos: 1.22.1(got@11.8.6)
+ bip39: 3.1.0
+ ed25519-hd-key: 1.3.0
+ ethers: 5.8.0
+ memoizee: 0.4.17
+ tronweb: 5.3.4
+ transitivePeerDependencies:
+ - '@gql.tada/svelte-support'
+ - '@gql.tada/vue-support'
+ - bufferutil
+ - debug
+ - encoding
+ - got
+ - typescript
+ - utf-8-validate
+ dev: true
+
+ /@layerzerolabs/lz-solana-sdk-v2@3.0.142(fastestsmallesttextencoderdecoder@1.0.22)(got@11.8.6)(typescript@5.9.3):
+ resolution: {integrity: sha512-2mew2i37qZ1F27T7JwDCGfUIVrhYyqxD8KhLpxxn3YkekYsBize1LwzW5X+zJB1Ghua5ufdZFb4k6pDVMpFkWA==}
+ dependencies:
+ '@layerzerolabs/lz-corekit-solana': 3.0.142(got@11.8.6)(typescript@5.9.3)
+ '@layerzerolabs/lz-definitions': 3.0.142
+ '@layerzerolabs/lz-foundation': 3.0.142(got@11.8.6)(typescript@5.9.3)
+ '@layerzerolabs/lz-serdes': 3.0.142(got@11.8.6)(typescript@5.9.3)
+ '@layerzerolabs/lz-utilities': 3.0.142(got@11.8.6)(typescript@5.9.3)
+ '@layerzerolabs/lz-v2-utilities': 3.0.142
+ '@metaplex-foundation/beet': 0.7.2
+ '@metaplex-foundation/beet-solana': 0.4.1(typescript@5.9.3)
+ '@metaplex-foundation/mpl-toolbox': 0.9.4(@metaplex-foundation/umi@0.9.2)
+ '@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.4)
+ '@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.4)
+ '@metaplex-foundation/umi-web3js-adapters': 0.9.2(@metaplex-foundation/umi@0.9.2)(@solana/web3.js@1.98.4)
+ '@solana/spl-token': 0.3.11(@solana/web3.js@1.98.4)(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3)
+ '@solana/web3.js': 1.98.4(typescript@5.9.3)
+ bn.js: 5.2.2
+ bs58: 5.0.0
+ tiny-invariant: 1.3.3
+ transitivePeerDependencies:
+ - '@gql.tada/svelte-support'
+ - '@gql.tada/vue-support'
+ - bufferutil
+ - debug
+ - encoding
+ - fastestsmallesttextencoderdecoder
+ - got
+ - supports-color
+ - typescript
+ - utf-8-validate
+ dev: true
+
+ /@layerzerolabs/lz-utilities@3.0.142(got@11.8.6)(typescript@5.9.3):
+ resolution: {integrity: sha512-5hRog7grjnsIg+IuP2vBP1IYrXmF4y1xZKUNZ23vNbS3/di2Jj3Hbh5BU5o0z+hBATkKdM6KVsPGIwWts0h8Yw==}
+ dependencies:
+ '@ethersproject/bytes': 5.8.0
+ '@initia/initia.js': 1.0.4(typescript@5.9.3)
+ '@iota/iota-sdk': 1.6.1(typescript@5.9.3)
+ '@layerzerolabs/lz-definitions': 3.0.142
+ '@mysten/sui': 1.43.2(typescript@5.9.3)
+ '@solana/web3.js': 1.98.4(typescript@5.9.3)
+ '@ton/core': 0.59.1(@ton/crypto@3.3.0)
+ '@ton/crypto': 3.3.0
+ '@ton/ton': 15.1.0(@ton/core@0.59.1)(@ton/crypto@3.3.0)
+ aptos: 1.22.1(got@11.8.6)
+ bip39: 3.1.0
+ dayjs: 1.11.18
+ ed25519-hd-key: 1.3.0
+ ethers: 5.8.0
+ memoizee: 0.4.17
+ picocolors: 1.0.0
+ pino: 8.21.0
+ transitivePeerDependencies:
+ - '@gql.tada/svelte-support'
+ - '@gql.tada/vue-support'
+ - bufferutil
+ - debug
+ - encoding
+ - got
+ - typescript
+ - utf-8-validate
+ dev: true
+
+ /@layerzerolabs/lz-v2-utilities@3.0.142:
+ resolution: {integrity: sha512-VAa03YAm7Hr9a2Kjj/UGJw5m2pkFSjbo3C5Fh3VumXbKM32vOogDdPurcBoWNRUxD08k8NylX2whse1qfDlZ9g==}
+ 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/metadata-tools@3.0.2(@layerzerolabs/devtools-evm-hardhat@4.0.1)(@layerzerolabs/ua-devtools@5.0.1):
+ resolution: {integrity: sha512-C+LcNFMDXcanDlCOaXm7UGeOObN947BbOCP5mfGkdnKGso1I3+Tak/1QpCRMWvcz1zfa4jikF5KQsfY5bJQD4Q==}
+ peerDependencies:
+ '@layerzerolabs/devtools-evm-hardhat': ~4.0.0
+ '@layerzerolabs/ua-devtools': ~5.0.1
+ dependencies:
+ '@layerzerolabs/devtools-evm-hardhat': 4.0.1(@ethersproject/abi@5.8.0)(@ethersproject/abstract-signer@5.8.0)(@ethersproject/contracts@5.8.0)(@ethersproject/providers@5.8.0)(@layerzerolabs/devtools-evm@3.0.0)(@layerzerolabs/devtools@2.0.3)(@layerzerolabs/io-devtools@0.3.1)(@layerzerolabs/lz-definitions@3.0.142)(@nomiclabs/hardhat-ethers@2.2.3)(ethers@5.8.0)(fp-ts@2.16.11)(hardhat-deploy@0.12.4)(hardhat@2.26.4)
+ '@layerzerolabs/ua-devtools': 5.0.1(@layerzerolabs/devtools@2.0.3)(@layerzerolabs/io-devtools@0.3.1)(@layerzerolabs/lz-definitions@3.0.142)(@layerzerolabs/lz-v2-utilities@3.0.142)(@layerzerolabs/protocol-devtools@3.0.1)(zod@3.25.76)
+ dev: true
+
+ /@layerzerolabs/oapp-evm@0.4.0(@layerzerolabs/lz-evm-messagelib-v2@3.0.142)(@layerzerolabs/lz-evm-protocol-v2@3.0.142)(@layerzerolabs/lz-evm-v1-0.7@3.0.142)(@openzeppelin/contracts-upgradeable@5.4.0)(@openzeppelin/contracts@5.4.0):
+ resolution: {integrity: sha512-/AixOWiirp4GH5SGL/LmsMwHKLN8BiOd46u13LSVM0UyLkrwN5ulN6kt76Ed9Z20hafbmq7mt83yZiDxHeG+XA==}
+ peerDependencies:
+ '@layerzerolabs/lz-evm-messagelib-v2': ^3.0.75
+ '@layerzerolabs/lz-evm-protocol-v2': ^3.0.75
+ '@layerzerolabs/lz-evm-v1-0.7': ^3.0.75
+ '@openzeppelin/contracts': ^4.8.1 || ^5.0.0
+ '@openzeppelin/contracts-upgradeable': ^4.8.1 || ^5.0.0
+ dependencies:
+ '@layerzerolabs/lz-evm-messagelib-v2': 3.0.142(@axelar-network/axelar-gmp-sdk-solidity@5.10.0)(@chainlink/contracts-ccip@0.7.6)(@eth-optimism/contracts@0.6.0)(@layerzerolabs/lz-evm-protocol-v2@3.0.142)(@layerzerolabs/lz-evm-v1-0.7@3.0.142)(@openzeppelin/contracts-upgradeable@5.4.0)(@openzeppelin/contracts@5.4.0)(hardhat-deploy@0.12.4)(solidity-bytes-utils@0.8.4)
+ '@layerzerolabs/lz-evm-protocol-v2': 3.0.142(@openzeppelin/contracts-upgradeable@5.4.0)(@openzeppelin/contracts@5.4.0)(hardhat-deploy@0.12.4)(solidity-bytes-utils@0.8.4)
+ '@layerzerolabs/lz-evm-v1-0.7': 3.0.142(@openzeppelin/contracts-upgradeable@5.4.0)(@openzeppelin/contracts@5.4.0)(hardhat-deploy@0.12.4)
+ '@openzeppelin/contracts': 5.4.0
+ '@openzeppelin/contracts-upgradeable': 5.4.0(@openzeppelin/contracts@5.4.0)
+ ethers: 5.8.0
+ transitivePeerDependencies:
+ - bufferutil
+ - utf-8-validate
+ dev: true
+
+ /@layerzerolabs/oft-evm@4.0.0(@layerzerolabs/lz-evm-messagelib-v2@3.0.142)(@layerzerolabs/lz-evm-protocol-v2@3.0.142)(@layerzerolabs/lz-evm-v1-0.7@3.0.142)(@layerzerolabs/oapp-evm@0.4.0)(@openzeppelin/contracts-upgradeable@5.4.0)(@openzeppelin/contracts@5.4.0):
+ resolution: {integrity: sha512-9GTLg/q+XcZHkNOh3gEw60QJWen/TeJOoqHGwEfJfB1csUx+fIPjYmjepwKUbAwU2+tMUQqcfdt7ajhZmbKWdw==}
+ peerDependencies:
+ '@layerzerolabs/lz-evm-messagelib-v2': ^3.0.75
+ '@layerzerolabs/lz-evm-protocol-v2': ^3.0.75
+ '@layerzerolabs/lz-evm-v1-0.7': ^3.0.75
+ '@layerzerolabs/oapp-evm': ^0.4.0
+ '@openzeppelin/contracts': ^4.8.1 || ^5.0.0
+ '@openzeppelin/contracts-upgradeable': ^4.8.1 || ^5.0.0
+ dependencies:
+ '@layerzerolabs/lz-evm-messagelib-v2': 3.0.142(@axelar-network/axelar-gmp-sdk-solidity@5.10.0)(@chainlink/contracts-ccip@0.7.6)(@eth-optimism/contracts@0.6.0)(@layerzerolabs/lz-evm-protocol-v2@3.0.142)(@layerzerolabs/lz-evm-v1-0.7@3.0.142)(@openzeppelin/contracts-upgradeable@5.4.0)(@openzeppelin/contracts@5.4.0)(hardhat-deploy@0.12.4)(solidity-bytes-utils@0.8.4)
+ '@layerzerolabs/lz-evm-protocol-v2': 3.0.142(@openzeppelin/contracts-upgradeable@5.4.0)(@openzeppelin/contracts@5.4.0)(hardhat-deploy@0.12.4)(solidity-bytes-utils@0.8.4)
+ '@layerzerolabs/lz-evm-v1-0.7': 3.0.142(@openzeppelin/contracts-upgradeable@5.4.0)(@openzeppelin/contracts@5.4.0)(hardhat-deploy@0.12.4)
+ '@layerzerolabs/oapp-evm': 0.4.0(@layerzerolabs/lz-evm-messagelib-v2@3.0.142)(@layerzerolabs/lz-evm-protocol-v2@3.0.142)(@layerzerolabs/lz-evm-v1-0.7@3.0.142)(@openzeppelin/contracts-upgradeable@5.4.0)(@openzeppelin/contracts@5.4.0)
+ '@openzeppelin/contracts': 5.4.0
+ '@openzeppelin/contracts-upgradeable': 5.4.0(@openzeppelin/contracts@5.4.0)
+ dev: true
+
+ /@layerzerolabs/oft-v2-solana-sdk@3.0.142(fastestsmallesttextencoderdecoder@1.0.22)(got@11.8.6)(typescript@5.9.3):
+ resolution: {integrity: sha512-5FqrCM/5xto21mg10ZgQT9x3PvvHxPq7xlocI9izl0w6Qc6CQTwAZobiZGDeSFM77MsRruDwzQIal5ZuzPokww==}
+ dependencies:
+ '@ethersproject/bytes': 5.8.0
+ '@layerzerolabs/lz-foundation': 3.0.142(got@11.8.6)(typescript@5.9.3)
+ '@layerzerolabs/lz-solana-sdk-v2': 3.0.142(fastestsmallesttextencoderdecoder@1.0.22)(got@11.8.6)(typescript@5.9.3)
+ '@layerzerolabs/lz-v2-utilities': 3.0.142
+ '@metaplex-foundation/beet': 0.7.2
+ '@metaplex-foundation/beet-solana': 0.4.1(typescript@5.9.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.4)
+ '@metaplex-foundation/umi-program-repository': 0.9.2(@metaplex-foundation/umi@0.9.2)
+ '@metaplex-foundation/umi-web3js-adapters': 0.9.2(@metaplex-foundation/umi@0.9.2)(@solana/web3.js@1.98.4)
+ '@solana/web3.js': 1.98.4(typescript@5.9.3)
+ bn.js: 5.2.2
+ dotenv: 16.6.1
+ transitivePeerDependencies:
+ - '@gql.tada/svelte-support'
+ - '@gql.tada/vue-support'
+ - bufferutil
+ - debug
+ - encoding
+ - fastestsmallesttextencoderdecoder
+ - got
+ - supports-color
+ - typescript
+ - utf-8-validate
+ dev: true
+
+ /@layerzerolabs/prettier-config-next@2.3.44:
+ resolution: {integrity: sha512-mIsxKLaelXHXXXvMEAE6Jc8IVydra0PesHquHYwvxFKwDhMhzfrnoRLLzbgCX/Zi1q0GGET/oMAKJTs6OWFPxQ==}
+ dependencies:
+ prettier: 3.6.2
+ prettier-plugin-packagejson: 2.5.19(prettier@3.6.2)
+ prettier-plugin-solidity: 1.4.3(prettier@3.6.2)
+ dev: true
+
+ /@layerzerolabs/protocol-devtools-evm@5.0.1(@ethersproject/abstract-provider@5.8.0)(@ethersproject/abstract-signer@5.8.0)(@ethersproject/bignumber@5.8.0)(@ethersproject/constants@5.8.0)(@ethersproject/contracts@5.8.0)(@ethersproject/providers@5.8.0)(@layerzerolabs/devtools-evm@3.0.0)(@layerzerolabs/devtools@2.0.3)(@layerzerolabs/io-devtools@0.3.1)(@layerzerolabs/lz-definitions@3.0.142)(@layerzerolabs/protocol-devtools@3.0.1)(zod@3.25.76):
+ resolution: {integrity: sha512-g2RwxOWJITuEKU/j04UscEc57OcU03+vEsS7i3jyz+AKKq2vjXFMf6s9rbeQmu548/8LppnHg/t5QH5R33TPkQ==}
+ peerDependencies:
+ '@ethersproject/abstract-provider': ^5.7.0
+ '@ethersproject/abstract-signer': ^5.7.0
+ '@ethersproject/bignumber': ^5.7.0
+ '@ethersproject/constants': ^5.7.0
+ '@ethersproject/contracts': ^5.7.0
+ '@ethersproject/providers': ^5.7.0
+ '@layerzerolabs/devtools': ~2.0.0
+ '@layerzerolabs/devtools-evm': ~3.0.0
+ '@layerzerolabs/io-devtools': ~0.3.0
+ '@layerzerolabs/lz-definitions': ^3.0.75
+ '@layerzerolabs/protocol-devtools': ~3.0.1
+ zod: ^3.22.4
+ dependencies:
+ '@ethersproject/abstract-provider': 5.8.0
+ '@ethersproject/abstract-signer': 5.8.0
+ '@ethersproject/bignumber': 5.8.0
+ '@ethersproject/constants': 5.8.0
+ '@ethersproject/contracts': 5.8.0
+ '@ethersproject/providers': 5.8.0
+ '@layerzerolabs/devtools': 2.0.3(@ethersproject/bytes@5.8.0)(@layerzerolabs/io-devtools@0.3.1)(@layerzerolabs/lz-definitions@3.0.142)(zod@3.25.76)
+ '@layerzerolabs/devtools-evm': 3.0.0(@ethersproject/abi@5.8.0)(@ethersproject/abstract-provider@5.8.0)(@ethersproject/abstract-signer@5.8.0)(@ethersproject/address@5.7.0)(@ethersproject/bignumber@5.8.0)(@ethersproject/constants@5.8.0)(@ethersproject/contracts@5.8.0)(@ethersproject/providers@5.8.0)(@layerzerolabs/devtools@2.0.3)(@layerzerolabs/io-devtools@0.3.1)(@layerzerolabs/lz-definitions@3.0.142)(fp-ts@2.16.11)(zod@3.25.76)
+ '@layerzerolabs/io-devtools': 0.3.1(ink-gradient@2.0.0)(ink-table@3.1.0)(ink@3.2.0)(react@17.0.2)(yoga-layout-prebuilt@1.10.0)(zod@3.25.76)
+ '@layerzerolabs/lz-definitions': 3.0.142
+ '@layerzerolabs/protocol-devtools': 3.0.1(@layerzerolabs/devtools@2.0.3)(@layerzerolabs/io-devtools@0.3.1)(@layerzerolabs/lz-definitions@3.0.142)(zod@3.25.76)
+ p-memoize: 4.0.4
+ zod: 3.25.76
+ dev: true
+
+ /@layerzerolabs/protocol-devtools-solana@8.0.3(@layerzerolabs/devtools-solana@3.0.4)(@layerzerolabs/devtools@2.0.3)(@layerzerolabs/io-devtools@0.3.1)(@layerzerolabs/lz-definitions@3.0.142)(@layerzerolabs/lz-solana-sdk-v2@3.0.142)(@layerzerolabs/lz-v2-utilities@3.0.142)(@layerzerolabs/protocol-devtools@3.0.1)(@layerzerolabs/ua-devtools@5.0.1)(@solana/web3.js@1.98.4)(fp-ts@2.16.11)(zod@3.25.76):
+ resolution: {integrity: sha512-zeor10qzjlVgmGDmlbb/s2JMo8pPGHmRcsnDgorunGwAop3BfZkSZI8RbpedXSNVPTfDAdC0VXykpHsXHyrCKg==}
+ peerDependencies:
+ '@layerzerolabs/devtools': ~2.0.0
+ '@layerzerolabs/devtools-solana': ~3.0.0
+ '@layerzerolabs/io-devtools': ~0.3.0
+ '@layerzerolabs/lz-definitions': ^3.0.75
+ '@layerzerolabs/lz-solana-sdk-v2': ^3.0.0
+ '@layerzerolabs/lz-v2-utilities': ^3.0.75
+ '@layerzerolabs/protocol-devtools': ^3.0.1
+ '@layerzerolabs/ua-devtools': ^5.0.1
+ '@solana/web3.js': ^1.98.0
+ fp-ts: ^2.16.2
+ zod: ^3.22.4
+ dependencies:
+ '@layerzerolabs/devtools': 2.0.3(@ethersproject/bytes@5.8.0)(@layerzerolabs/io-devtools@0.3.1)(@layerzerolabs/lz-definitions@3.0.142)(zod@3.25.76)
+ '@layerzerolabs/devtools-solana': 3.0.4(@layerzerolabs/devtools@2.0.3)(@layerzerolabs/io-devtools@0.3.1)(@layerzerolabs/lz-definitions@3.0.142)(@solana/web3.js@1.98.4)(bn.js@5.2.2)(fastestsmallesttextencoderdecoder@1.0.22)(fp-ts@2.16.11)(typescript@5.9.3)(zod@3.25.76)
+ '@layerzerolabs/io-devtools': 0.3.1(ink-gradient@2.0.0)(ink-table@3.1.0)(ink@3.2.0)(react@17.0.2)(yoga-layout-prebuilt@1.10.0)(zod@3.25.76)
+ '@layerzerolabs/lz-definitions': 3.0.142
+ '@layerzerolabs/lz-solana-sdk-v2': 3.0.142(fastestsmallesttextencoderdecoder@1.0.22)(got@11.8.6)(typescript@5.9.3)
+ '@layerzerolabs/lz-v2-utilities': 3.0.142
+ '@layerzerolabs/protocol-devtools': 3.0.1(@layerzerolabs/devtools@2.0.3)(@layerzerolabs/io-devtools@0.3.1)(@layerzerolabs/lz-definitions@3.0.142)(zod@3.25.76)
+ '@layerzerolabs/ua-devtools': 5.0.1(@layerzerolabs/devtools@2.0.3)(@layerzerolabs/io-devtools@0.3.1)(@layerzerolabs/lz-definitions@3.0.142)(@layerzerolabs/lz-v2-utilities@3.0.142)(@layerzerolabs/protocol-devtools@3.0.1)(zod@3.25.76)
+ '@safe-global/api-kit': 1.3.1
+ '@safe-global/protocol-kit': 1.3.0(ethers@5.8.0)
+ '@solana/web3.js': 1.98.4(typescript@5.9.3)
+ ethers: 5.8.0
+ fp-ts: 2.16.11
+ p-memoize: 4.0.4
+ zod: 3.25.76
+ transitivePeerDependencies:
+ - bufferutil
+ - encoding
+ - supports-color
+ - utf-8-validate
+ dev: true
+
+ /@layerzerolabs/protocol-devtools@3.0.1(@layerzerolabs/devtools@2.0.3)(@layerzerolabs/io-devtools@0.3.1)(@layerzerolabs/lz-definitions@3.0.142)(zod@3.25.76):
+ resolution: {integrity: sha512-5LndY2OD0PdodEv5IuhSP3RzbThxmE2B8twcrMGuPixrD1PjiIYqLvm2wznUMV/2NLiQrDdY1bOpd+5q9weibw==}
+ peerDependencies:
+ '@layerzerolabs/devtools': ~2.0.0
+ '@layerzerolabs/io-devtools': ~0.3.0
+ '@layerzerolabs/lz-definitions': ^3.0.75
+ zod: ^3.22.4
+ dependencies:
+ '@layerzerolabs/devtools': 2.0.3(@ethersproject/bytes@5.8.0)(@layerzerolabs/io-devtools@0.3.1)(@layerzerolabs/lz-definitions@3.0.142)(zod@3.25.76)
+ '@layerzerolabs/io-devtools': 0.3.1(ink-gradient@2.0.0)(ink-table@3.1.0)(ink@3.2.0)(react@17.0.2)(yoga-layout-prebuilt@1.10.0)(zod@3.25.76)
+ '@layerzerolabs/lz-definitions': 3.0.142
+ zod: 3.25.76
+ dev: true
+
+ /@layerzerolabs/solhint-config@3.0.142(typescript@5.9.3):
+ resolution: {integrity: sha512-+qqhrFhKPr3MzDKX2mlbp+CL4pE5qqKBxed6SLA9Vow2QX7uEOz8DOAOqRomrS5/R3YNimYCn0nxYWjy5bywlQ==}
+ dependencies:
+ solhint: 4.5.4(typescript@5.9.3)
+ transitivePeerDependencies:
+ - typescript
+ dev: true
+
+ /@layerzerolabs/test-devtools-evm-foundry@8.0.0(@layerzerolabs/lz-evm-messagelib-v2@3.0.142)(@layerzerolabs/lz-evm-protocol-v2@3.0.142)(@layerzerolabs/lz-evm-v1-0.7@3.0.142)(@layerzerolabs/oapp-evm@0.4.0)(@layerzerolabs/oft-evm@4.0.0)(@openzeppelin/contracts-upgradeable@5.4.0)(@openzeppelin/contracts@5.4.0):
+ resolution: {integrity: sha512-L32qaCai+mcnz6oSbgkb17kBqvR9HdtvUFIB8dkMnNUTEUfzXC7llqS6cfdtriO9zl7m5JH9q5SQUS1GJ/D4Ig==}
+ peerDependencies:
+ '@layerzerolabs/lz-evm-messagelib-v2': ^3.0.75
+ '@layerzerolabs/lz-evm-protocol-v2': ^3.0.75
+ '@layerzerolabs/lz-evm-v1-0.7': ^3.0.75
+ '@layerzerolabs/oapp-evm': ^0.4.0
+ '@layerzerolabs/oft-evm': ^4.0.0
+ '@openzeppelin/contracts': ^4.9.5 || ^5.0.0
+ '@openzeppelin/contracts-upgradeable': ^4.9.5 || ^5.0.0
+ dependencies:
+ '@layerzerolabs/lz-evm-messagelib-v2': 3.0.142(@axelar-network/axelar-gmp-sdk-solidity@5.10.0)(@chainlink/contracts-ccip@0.7.6)(@eth-optimism/contracts@0.6.0)(@layerzerolabs/lz-evm-protocol-v2@3.0.142)(@layerzerolabs/lz-evm-v1-0.7@3.0.142)(@openzeppelin/contracts-upgradeable@5.4.0)(@openzeppelin/contracts@5.4.0)(hardhat-deploy@0.12.4)(solidity-bytes-utils@0.8.4)
+ '@layerzerolabs/lz-evm-protocol-v2': 3.0.142(@openzeppelin/contracts-upgradeable@5.4.0)(@openzeppelin/contracts@5.4.0)(hardhat-deploy@0.12.4)(solidity-bytes-utils@0.8.4)
+ '@layerzerolabs/lz-evm-v1-0.7': 3.0.142(@openzeppelin/contracts-upgradeable@5.4.0)(@openzeppelin/contracts@5.4.0)(hardhat-deploy@0.12.4)
+ '@layerzerolabs/oapp-evm': 0.4.0(@layerzerolabs/lz-evm-messagelib-v2@3.0.142)(@layerzerolabs/lz-evm-protocol-v2@3.0.142)(@layerzerolabs/lz-evm-v1-0.7@3.0.142)(@openzeppelin/contracts-upgradeable@5.4.0)(@openzeppelin/contracts@5.4.0)
+ '@layerzerolabs/oft-evm': 4.0.0(@layerzerolabs/lz-evm-messagelib-v2@3.0.142)(@layerzerolabs/lz-evm-protocol-v2@3.0.142)(@layerzerolabs/lz-evm-v1-0.7@3.0.142)(@layerzerolabs/oapp-evm@0.4.0)(@openzeppelin/contracts-upgradeable@5.4.0)(@openzeppelin/contracts@5.4.0)
+ '@openzeppelin/contracts': 5.4.0
+ '@openzeppelin/contracts-upgradeable': 5.4.0(@openzeppelin/contracts@5.4.0)
+ dev: true
+
+ /@layerzerolabs/test-devtools-evm-hardhat@0.5.2(hardhat@2.26.4)(solidity-bytes-utils@0.8.4):
+ resolution: {integrity: sha512-mBZRczjNJdMSsHUjl2EQCCXutS4Yo6s6K0Bc32kSl3MNKIHZZMOEf6Hkj1guVSx/m3l3VZBr+3s0xc9FiyoQgQ==}
+ peerDependencies:
+ hardhat: ^2.22.10
+ solidity-bytes-utils: ^0.8.2
+ dependencies:
+ hardhat: 2.26.4(ts-node@10.9.2)(typescript@5.9.3)
+ solidity-bytes-utils: 0.8.4
+ dev: true
+
+ /@layerzerolabs/toolbox-foundry@0.1.13:
+ resolution: {integrity: sha512-3rC+BVEPgcHLHPO4qn3KqYUG1vhDtr1m/gsaI1S635MK+19475U8HYATznAzHKwi09cf9uEv5C7fdtHXgIw8sQ==}
+ dev: true
+
+ /@layerzerolabs/toolbox-hardhat@0.6.12(@ethersproject/abstract-provider@5.8.0)(@ethersproject/abstract-signer@5.8.0)(@ethersproject/bignumber@5.8.0)(@ethersproject/constants@5.8.0)(@ethersproject/providers@5.8.0)(@nomicfoundation/hardhat-ethers@3.1.1)(@nomiclabs/hardhat-ethers@2.2.3)(ethers@5.8.0)(hardhat-deploy@0.12.4)(hardhat@2.26.4)(solidity-bytes-utils@0.8.4):
+ resolution: {integrity: sha512-vw1bfm8q12ZpQ+k0dB58FFWtHuYmPKPxIb9M6nKkLikgpFWeL3/tLg4sXzr/rNTSGrxR7Ut5IY0FTUVx5lI3HQ==}
+ peerDependencies:
+ '@nomicfoundation/hardhat-ethers': ^3.0.2
+ ethers: ^5.7.2
+ hardhat: ^2.22.10
+ hardhat-deploy: ^0.12.1
+ dependencies:
+ '@ethersproject/abi': 5.8.0
+ '@ethersproject/address': 5.7.0
+ '@ethersproject/bytes': 5.8.0
+ '@ethersproject/contracts': 5.8.0
+ '@ethersproject/hash': 5.8.0
+ '@layerzerolabs/devtools': 2.0.3(@ethersproject/bytes@5.8.0)(@layerzerolabs/io-devtools@0.3.1)(@layerzerolabs/lz-definitions@3.0.142)(zod@3.25.76)
+ '@layerzerolabs/devtools-evm': 3.0.0(@ethersproject/abi@5.8.0)(@ethersproject/abstract-provider@5.8.0)(@ethersproject/abstract-signer@5.8.0)(@ethersproject/address@5.7.0)(@ethersproject/bignumber@5.8.0)(@ethersproject/constants@5.8.0)(@ethersproject/contracts@5.8.0)(@ethersproject/providers@5.8.0)(@layerzerolabs/devtools@2.0.3)(@layerzerolabs/io-devtools@0.3.1)(@layerzerolabs/lz-definitions@3.0.142)(fp-ts@2.16.11)(zod@3.25.76)
+ '@layerzerolabs/devtools-evm-hardhat': 4.0.1(@ethersproject/abi@5.8.0)(@ethersproject/abstract-signer@5.8.0)(@ethersproject/contracts@5.8.0)(@ethersproject/providers@5.8.0)(@layerzerolabs/devtools-evm@3.0.0)(@layerzerolabs/devtools@2.0.3)(@layerzerolabs/io-devtools@0.3.1)(@layerzerolabs/lz-definitions@3.0.142)(@nomiclabs/hardhat-ethers@2.2.3)(ethers@5.8.0)(fp-ts@2.16.11)(hardhat-deploy@0.12.4)(hardhat@2.26.4)
+ '@layerzerolabs/io-devtools': 0.3.1(ink-gradient@2.0.0)(ink-table@3.1.0)(ink@3.2.0)(react@17.0.2)(yoga-layout-prebuilt@1.10.0)(zod@3.25.76)
+ '@layerzerolabs/lz-definitions': 3.0.142
+ '@layerzerolabs/lz-evm-sdk-v1': 3.0.142
+ '@layerzerolabs/lz-evm-sdk-v2': 3.0.142
+ '@layerzerolabs/lz-v2-utilities': 3.0.142
+ '@layerzerolabs/protocol-devtools': 3.0.1(@layerzerolabs/devtools@2.0.3)(@layerzerolabs/io-devtools@0.3.1)(@layerzerolabs/lz-definitions@3.0.142)(zod@3.25.76)
+ '@layerzerolabs/protocol-devtools-evm': 5.0.1(@ethersproject/abstract-provider@5.8.0)(@ethersproject/abstract-signer@5.8.0)(@ethersproject/bignumber@5.8.0)(@ethersproject/constants@5.8.0)(@ethersproject/contracts@5.8.0)(@ethersproject/providers@5.8.0)(@layerzerolabs/devtools-evm@3.0.0)(@layerzerolabs/devtools@2.0.3)(@layerzerolabs/io-devtools@0.3.1)(@layerzerolabs/lz-definitions@3.0.142)(@layerzerolabs/protocol-devtools@3.0.1)(zod@3.25.76)
+ '@layerzerolabs/test-devtools-evm-hardhat': 0.5.2(hardhat@2.26.4)(solidity-bytes-utils@0.8.4)
+ '@layerzerolabs/ua-devtools': 5.0.1(@layerzerolabs/devtools@2.0.3)(@layerzerolabs/io-devtools@0.3.1)(@layerzerolabs/lz-definitions@3.0.142)(@layerzerolabs/lz-v2-utilities@3.0.142)(@layerzerolabs/protocol-devtools@3.0.1)(zod@3.25.76)
+ '@layerzerolabs/ua-devtools-evm': 7.0.0(@ethersproject/constants@5.8.0)(@ethersproject/contracts@5.8.0)(@layerzerolabs/devtools-evm@3.0.0)(@layerzerolabs/devtools@2.0.3)(@layerzerolabs/io-devtools@0.3.1)(@layerzerolabs/lz-definitions@3.0.142)(@layerzerolabs/lz-v2-utilities@3.0.142)(@layerzerolabs/protocol-devtools-evm@5.0.1)(@layerzerolabs/protocol-devtools@3.0.1)(@layerzerolabs/ua-devtools@5.0.1)(zod@3.25.76)
+ '@layerzerolabs/ua-devtools-evm-hardhat': 9.0.0(@ethersproject/abi@5.8.0)(@ethersproject/bytes@5.8.0)(@ethersproject/contracts@5.8.0)(@ethersproject/hash@5.8.0)(@layerzerolabs/devtools-evm-hardhat@4.0.1)(@layerzerolabs/devtools-evm@3.0.0)(@layerzerolabs/devtools@2.0.3)(@layerzerolabs/io-devtools@0.3.1)(@layerzerolabs/lz-definitions@3.0.142)(@layerzerolabs/protocol-devtools-evm@5.0.1)(@layerzerolabs/protocol-devtools@3.0.1)(@layerzerolabs/ua-devtools-evm@7.0.0)(@layerzerolabs/ua-devtools@5.0.1)(ethers@5.8.0)(hardhat-deploy@0.12.4)(hardhat@2.26.4)
+ '@nomicfoundation/hardhat-ethers': 3.1.1(ethers@5.8.0)(hardhat@2.26.4)
+ ethers: 5.8.0
+ fp-ts: 2.16.11
+ hardhat: 2.26.4(ts-node@10.9.2)(typescript@5.9.3)
+ hardhat-deploy: 0.12.4
+ ink: 3.2.0(react@17.0.2)
+ ink-gradient: 2.0.0(ink@3.2.0)(react@17.0.2)
+ ink-table: 3.1.0(ink@3.2.0)(react@17.0.2)
+ react: 17.0.2
+ yoga-layout-prebuilt: 1.10.0
+ zod: 3.25.76
+ transitivePeerDependencies:
+ - '@ethersproject/abstract-provider'
+ - '@ethersproject/abstract-signer'
+ - '@ethersproject/bignumber'
+ - '@ethersproject/constants'
+ - '@ethersproject/providers'
+ - '@nomiclabs/hardhat-ethers'
+ - '@types/react'
+ - bufferutil
+ - encoding
+ - solidity-bytes-utils
+ - supports-color
+ - utf-8-validate
+ dev: true
+
+ /@layerzerolabs/tron-utilities@3.0.142(got@11.8.6)(typescript@5.9.3):
+ resolution: {integrity: sha512-Fk/8CKd6GNGS51XEYXmqvsmy3zSM/xyHLJ/MDrKKHj/YA3qEPlQa7fy0SSAEAVm8ukNj/4ITdFLRXPlIyA7idQ==}
+ dependencies:
+ '@layerzerolabs/lz-utilities': 3.0.142(got@11.8.6)(typescript@5.9.3)
+ ethers: 5.8.0
+ tronweb: 5.3.4
+ transitivePeerDependencies:
+ - '@gql.tada/svelte-support'
+ - '@gql.tada/vue-support'
+ - bufferutil
+ - debug
+ - encoding
+ - got
+ - typescript
+ - utf-8-validate
+ dev: true
+
+ /@layerzerolabs/ua-devtools-evm-hardhat@9.0.0(@ethersproject/abi@5.8.0)(@ethersproject/bytes@5.8.0)(@ethersproject/contracts@5.8.0)(@ethersproject/hash@5.8.0)(@layerzerolabs/devtools-evm-hardhat@4.0.1)(@layerzerolabs/devtools-evm@3.0.0)(@layerzerolabs/devtools@2.0.3)(@layerzerolabs/io-devtools@0.3.1)(@layerzerolabs/lz-definitions@3.0.142)(@layerzerolabs/protocol-devtools-evm@5.0.1)(@layerzerolabs/protocol-devtools@3.0.1)(@layerzerolabs/ua-devtools-evm@7.0.0)(@layerzerolabs/ua-devtools@5.0.1)(ethers@5.8.0)(hardhat-deploy@0.12.4)(hardhat@2.26.4):
+ resolution: {integrity: sha512-Wm/88JToOgFAJO0nKnpGMxQDD8mN37VFhz/ejE0DWbXsukp7IdX4ld4gQKM0MU7Yiajardhlvpa3Mwg+xHi8KQ==}
+ peerDependencies:
+ '@ethersproject/abi': ^5.7.0
+ '@ethersproject/bytes': ^5.7.0
+ '@ethersproject/contracts': ^5.7.0
+ '@ethersproject/hash': ^5.7.0
+ '@layerzerolabs/devtools': ~2.0.0
+ '@layerzerolabs/devtools-evm': ~3.0.0
+ '@layerzerolabs/devtools-evm-hardhat': ~4.0.0
+ '@layerzerolabs/io-devtools': ~0.3.0
+ '@layerzerolabs/lz-definitions': ^3.0.75
+ '@layerzerolabs/protocol-devtools': ~3.0.0
+ '@layerzerolabs/protocol-devtools-evm': ~5.0.0
+ '@layerzerolabs/ua-devtools': ~5.0.0
+ '@layerzerolabs/ua-devtools-evm': ~7.0.0
+ ethers: ^5.7.2
+ hardhat: ^2.22.10
+ hardhat-deploy: ^0.12.1
+ dependencies:
+ '@ethersproject/abi': 5.8.0
+ '@ethersproject/bytes': 5.8.0
+ '@ethersproject/contracts': 5.8.0
+ '@ethersproject/hash': 5.8.0
+ '@layerzerolabs/devtools': 2.0.3(@ethersproject/bytes@5.8.0)(@layerzerolabs/io-devtools@0.3.1)(@layerzerolabs/lz-definitions@3.0.142)(zod@3.25.76)
+ '@layerzerolabs/devtools-evm': 3.0.0(@ethersproject/abi@5.8.0)(@ethersproject/abstract-provider@5.8.0)(@ethersproject/abstract-signer@5.8.0)(@ethersproject/address@5.7.0)(@ethersproject/bignumber@5.8.0)(@ethersproject/constants@5.8.0)(@ethersproject/contracts@5.8.0)(@ethersproject/providers@5.8.0)(@layerzerolabs/devtools@2.0.3)(@layerzerolabs/io-devtools@0.3.1)(@layerzerolabs/lz-definitions@3.0.142)(fp-ts@2.16.11)(zod@3.25.76)
+ '@layerzerolabs/devtools-evm-hardhat': 4.0.1(@ethersproject/abi@5.8.0)(@ethersproject/abstract-signer@5.8.0)(@ethersproject/contracts@5.8.0)(@ethersproject/providers@5.8.0)(@layerzerolabs/devtools-evm@3.0.0)(@layerzerolabs/devtools@2.0.3)(@layerzerolabs/io-devtools@0.3.1)(@layerzerolabs/lz-definitions@3.0.142)(@nomiclabs/hardhat-ethers@2.2.3)(ethers@5.8.0)(fp-ts@2.16.11)(hardhat-deploy@0.12.4)(hardhat@2.26.4)
+ '@layerzerolabs/io-devtools': 0.3.1(ink-gradient@2.0.0)(ink-table@3.1.0)(ink@3.2.0)(react@17.0.2)(yoga-layout-prebuilt@1.10.0)(zod@3.25.76)
+ '@layerzerolabs/lz-definitions': 3.0.142
+ '@layerzerolabs/protocol-devtools': 3.0.1(@layerzerolabs/devtools@2.0.3)(@layerzerolabs/io-devtools@0.3.1)(@layerzerolabs/lz-definitions@3.0.142)(zod@3.25.76)
+ '@layerzerolabs/protocol-devtools-evm': 5.0.1(@ethersproject/abstract-provider@5.8.0)(@ethersproject/abstract-signer@5.8.0)(@ethersproject/bignumber@5.8.0)(@ethersproject/constants@5.8.0)(@ethersproject/contracts@5.8.0)(@ethersproject/providers@5.8.0)(@layerzerolabs/devtools-evm@3.0.0)(@layerzerolabs/devtools@2.0.3)(@layerzerolabs/io-devtools@0.3.1)(@layerzerolabs/lz-definitions@3.0.142)(@layerzerolabs/protocol-devtools@3.0.1)(zod@3.25.76)
+ '@layerzerolabs/ua-devtools': 5.0.1(@layerzerolabs/devtools@2.0.3)(@layerzerolabs/io-devtools@0.3.1)(@layerzerolabs/lz-definitions@3.0.142)(@layerzerolabs/lz-v2-utilities@3.0.142)(@layerzerolabs/protocol-devtools@3.0.1)(zod@3.25.76)
+ '@layerzerolabs/ua-devtools-evm': 7.0.0(@ethersproject/constants@5.8.0)(@ethersproject/contracts@5.8.0)(@layerzerolabs/devtools-evm@3.0.0)(@layerzerolabs/devtools@2.0.3)(@layerzerolabs/io-devtools@0.3.1)(@layerzerolabs/lz-definitions@3.0.142)(@layerzerolabs/lz-v2-utilities@3.0.142)(@layerzerolabs/protocol-devtools-evm@5.0.1)(@layerzerolabs/protocol-devtools@3.0.1)(@layerzerolabs/ua-devtools@5.0.1)(zod@3.25.76)
+ ethers: 5.8.0
+ hardhat: 2.26.4(ts-node@10.9.2)(typescript@5.9.3)
+ hardhat-deploy: 0.12.4
+ p-memoize: 4.0.4
+ typescript: 5.9.3
+ dev: true
+
+ /@layerzerolabs/ua-devtools-evm@7.0.0(@ethersproject/constants@5.8.0)(@ethersproject/contracts@5.8.0)(@layerzerolabs/devtools-evm@3.0.0)(@layerzerolabs/devtools@2.0.3)(@layerzerolabs/io-devtools@0.3.1)(@layerzerolabs/lz-definitions@3.0.142)(@layerzerolabs/lz-v2-utilities@3.0.142)(@layerzerolabs/protocol-devtools-evm@5.0.1)(@layerzerolabs/protocol-devtools@3.0.1)(@layerzerolabs/ua-devtools@5.0.1)(zod@3.25.76):
+ resolution: {integrity: sha512-FPm6ESqm2SBOJjCbRnkWCMg6o5zlkoeLUavD8v1hlZeiY4i33wIHccQPtxMz8Yz/ZD8leQ8TiKJJJ9sdVGk7tQ==}
+ peerDependencies:
+ '@ethersproject/constants': ^5.7.0
+ '@ethersproject/contracts': ^5.7.0
+ '@layerzerolabs/devtools': ~2.0.0
+ '@layerzerolabs/devtools-evm': ~3.0.0
+ '@layerzerolabs/io-devtools': ~0.3.0
+ '@layerzerolabs/lz-definitions': ^3.0.75
+ '@layerzerolabs/lz-v2-utilities': ^3.0.75
+ '@layerzerolabs/protocol-devtools': ~3.0.0
+ '@layerzerolabs/protocol-devtools-evm': ~5.0.0
+ '@layerzerolabs/ua-devtools': ~5.0.0
+ zod: ^3.22.4
+ dependencies:
+ '@ethersproject/constants': 5.8.0
+ '@ethersproject/contracts': 5.8.0
+ '@layerzerolabs/devtools': 2.0.3(@ethersproject/bytes@5.8.0)(@layerzerolabs/io-devtools@0.3.1)(@layerzerolabs/lz-definitions@3.0.142)(zod@3.25.76)
+ '@layerzerolabs/devtools-evm': 3.0.0(@ethersproject/abi@5.8.0)(@ethersproject/abstract-provider@5.8.0)(@ethersproject/abstract-signer@5.8.0)(@ethersproject/address@5.7.0)(@ethersproject/bignumber@5.8.0)(@ethersproject/constants@5.8.0)(@ethersproject/contracts@5.8.0)(@ethersproject/providers@5.8.0)(@layerzerolabs/devtools@2.0.3)(@layerzerolabs/io-devtools@0.3.1)(@layerzerolabs/lz-definitions@3.0.142)(fp-ts@2.16.11)(zod@3.25.76)
+ '@layerzerolabs/io-devtools': 0.3.1(ink-gradient@2.0.0)(ink-table@3.1.0)(ink@3.2.0)(react@17.0.2)(yoga-layout-prebuilt@1.10.0)(zod@3.25.76)
+ '@layerzerolabs/lz-definitions': 3.0.142
+ '@layerzerolabs/lz-v2-utilities': 3.0.142
+ '@layerzerolabs/protocol-devtools': 3.0.1(@layerzerolabs/devtools@2.0.3)(@layerzerolabs/io-devtools@0.3.1)(@layerzerolabs/lz-definitions@3.0.142)(zod@3.25.76)
+ '@layerzerolabs/protocol-devtools-evm': 5.0.1(@ethersproject/abstract-provider@5.8.0)(@ethersproject/abstract-signer@5.8.0)(@ethersproject/bignumber@5.8.0)(@ethersproject/constants@5.8.0)(@ethersproject/contracts@5.8.0)(@ethersproject/providers@5.8.0)(@layerzerolabs/devtools-evm@3.0.0)(@layerzerolabs/devtools@2.0.3)(@layerzerolabs/io-devtools@0.3.1)(@layerzerolabs/lz-definitions@3.0.142)(@layerzerolabs/protocol-devtools@3.0.1)(zod@3.25.76)
+ '@layerzerolabs/ua-devtools': 5.0.1(@layerzerolabs/devtools@2.0.3)(@layerzerolabs/io-devtools@0.3.1)(@layerzerolabs/lz-definitions@3.0.142)(@layerzerolabs/lz-v2-utilities@3.0.142)(@layerzerolabs/protocol-devtools@3.0.1)(zod@3.25.76)
+ p-memoize: 4.0.4
+ zod: 3.25.76
+ dev: true
+
+ /@layerzerolabs/ua-devtools-solana@8.0.2(@layerzerolabs/devtools-solana@3.0.4)(@layerzerolabs/devtools@2.0.3)(@layerzerolabs/io-devtools@0.3.1)(@layerzerolabs/lz-definitions@3.0.142)(@layerzerolabs/lz-solana-sdk-v2@3.0.142)(@layerzerolabs/lz-v2-utilities@3.0.142)(@layerzerolabs/oft-v2-solana-sdk@3.0.142)(@layerzerolabs/protocol-devtools-solana@8.0.3)(@layerzerolabs/protocol-devtools@3.0.1)(@layerzerolabs/ua-devtools@5.0.1)(@solana/web3.js@1.98.4)(fp-ts@2.16.11)(zod@3.25.76):
+ resolution: {integrity: sha512-S1uiwLKJZQ87h9V51w1gTDgnMXtq45zHxO5xJ7XUIM7B+NoOX2arZB3cWerwocjAwloKHYBUxmWp8/vhJODkeg==}
+ peerDependencies:
+ '@layerzerolabs/devtools': ~2.0.0
+ '@layerzerolabs/devtools-solana': ~3.0.1
+ '@layerzerolabs/io-devtools': ~0.3.0
+ '@layerzerolabs/lz-definitions': ^3.0.75
+ '@layerzerolabs/lz-solana-sdk-v2': ^3.0.59
+ '@layerzerolabs/lz-v2-utilities': ^3.0.75
+ '@layerzerolabs/oft-v2-solana-sdk': ^3.0.59
+ '@layerzerolabs/protocol-devtools': ^3.0.0
+ '@layerzerolabs/protocol-devtools-solana': ~8.0.1
+ '@layerzerolabs/ua-devtools': ^5.0.0
+ '@solana/web3.js': ^1.98.0
+ fp-ts: ^2.16.2
+ zod: ^3.22.4
+ dependencies:
+ '@layerzerolabs/devtools': 2.0.3(@ethersproject/bytes@5.8.0)(@layerzerolabs/io-devtools@0.3.1)(@layerzerolabs/lz-definitions@3.0.142)(zod@3.25.76)
+ '@layerzerolabs/devtools-solana': 3.0.4(@layerzerolabs/devtools@2.0.3)(@layerzerolabs/io-devtools@0.3.1)(@layerzerolabs/lz-definitions@3.0.142)(@solana/web3.js@1.98.4)(bn.js@5.2.2)(fastestsmallesttextencoderdecoder@1.0.22)(fp-ts@2.16.11)(typescript@5.9.3)(zod@3.25.76)
+ '@layerzerolabs/io-devtools': 0.3.1(ink-gradient@2.0.0)(ink-table@3.1.0)(ink@3.2.0)(react@17.0.2)(yoga-layout-prebuilt@1.10.0)(zod@3.25.76)
+ '@layerzerolabs/lz-definitions': 3.0.142
+ '@layerzerolabs/lz-solana-sdk-v2': 3.0.142(fastestsmallesttextencoderdecoder@1.0.22)(got@11.8.6)(typescript@5.9.3)
+ '@layerzerolabs/lz-v2-utilities': 3.0.142
+ '@layerzerolabs/oft-v2-solana-sdk': 3.0.142(fastestsmallesttextencoderdecoder@1.0.22)(got@11.8.6)(typescript@5.9.3)
+ '@layerzerolabs/protocol-devtools': 3.0.1(@layerzerolabs/devtools@2.0.3)(@layerzerolabs/io-devtools@0.3.1)(@layerzerolabs/lz-definitions@3.0.142)(zod@3.25.76)
+ '@layerzerolabs/protocol-devtools-solana': 8.0.3(@layerzerolabs/devtools-solana@3.0.4)(@layerzerolabs/devtools@2.0.3)(@layerzerolabs/io-devtools@0.3.1)(@layerzerolabs/lz-definitions@3.0.142)(@layerzerolabs/lz-solana-sdk-v2@3.0.142)(@layerzerolabs/lz-v2-utilities@3.0.142)(@layerzerolabs/protocol-devtools@3.0.1)(@layerzerolabs/ua-devtools@5.0.1)(@solana/web3.js@1.98.4)(fp-ts@2.16.11)(zod@3.25.76)
+ '@layerzerolabs/ua-devtools': 5.0.1(@layerzerolabs/devtools@2.0.3)(@layerzerolabs/io-devtools@0.3.1)(@layerzerolabs/lz-definitions@3.0.142)(@layerzerolabs/lz-v2-utilities@3.0.142)(@layerzerolabs/protocol-devtools@3.0.1)(zod@3.25.76)
+ '@safe-global/api-kit': 1.3.1
+ '@safe-global/protocol-kit': 1.3.0(ethers@5.8.0)
+ '@solana/web3.js': 1.98.4(typescript@5.9.3)
+ ethers: 5.8.0
+ fp-ts: 2.16.11
+ p-memoize: 4.0.4
+ zod: 3.25.76
+ transitivePeerDependencies:
+ - bufferutil
+ - encoding
+ - supports-color
+ - utf-8-validate
+ dev: true
+
+ /@layerzerolabs/ua-devtools@5.0.1(@layerzerolabs/devtools@2.0.3)(@layerzerolabs/io-devtools@0.3.1)(@layerzerolabs/lz-definitions@3.0.142)(@layerzerolabs/lz-v2-utilities@3.0.142)(@layerzerolabs/protocol-devtools@3.0.1)(zod@3.25.76):
+ resolution: {integrity: sha512-acoxyJAYqF+di2/akGuWLa5Gdt7Z/8LLZD0LqOui34yjPuHYH88L4xxmKxqrs4Ga/uQnRKcF6Cauy9pjlQCj1A==}
+ peerDependencies:
+ '@layerzerolabs/devtools': ~2.0.0
+ '@layerzerolabs/io-devtools': ~0.3.0
+ '@layerzerolabs/lz-definitions': ^3.0.75
+ '@layerzerolabs/lz-v2-utilities': ^3.0.75
+ '@layerzerolabs/protocol-devtools': ~3.0.1
+ zod: ^3.22.4
+ dependencies:
+ '@layerzerolabs/devtools': 2.0.3(@ethersproject/bytes@5.8.0)(@layerzerolabs/io-devtools@0.3.1)(@layerzerolabs/lz-definitions@3.0.142)(zod@3.25.76)
+ '@layerzerolabs/io-devtools': 0.3.1(ink-gradient@2.0.0)(ink-table@3.1.0)(ink@3.2.0)(react@17.0.2)(yoga-layout-prebuilt@1.10.0)(zod@3.25.76)
+ '@layerzerolabs/lz-definitions': 3.0.142
+ '@layerzerolabs/lz-v2-utilities': 3.0.142
+ '@layerzerolabs/protocol-devtools': 3.0.1(@layerzerolabs/devtools@2.0.3)(@layerzerolabs/io-devtools@0.3.1)(@layerzerolabs/lz-definitions@3.0.142)(zod@3.25.76)
+ zod: 3.25.76
+ dev: true
+
+ /@ledgerhq/devices@8.6.1:
+ resolution: {integrity: sha512-PQR2fyWz7P/wMFHY9ZLz17WgFdxC/Im0RVDcWXpp24+iRQRyxhQeX2iG4mBKUzfaAW6pOIEiWt+vmJh88QP9rQ==}
+ dependencies:
+ '@ledgerhq/errors': 6.26.0
+ '@ledgerhq/logs': 6.13.0
+ rxjs: 7.8.2
+ semver: 7.7.3
+ dev: true
+
+ /@ledgerhq/errors@6.26.0:
+ resolution: {integrity: sha512-4OlisaDBafkn7KN5emue08lCGMVREX6T+nxj47C7W30EBA/leLAEDaVvUw5/gFOWrv8Q2A9Scb8aMM3uokyt0w==}
+ dev: true
+
+ /@ledgerhq/hw-transport-webhid@6.30.8:
+ resolution: {integrity: sha512-2Hc15GjC7BFrpMVJYJ7N2p70A6OzIdcMklwUEYpOcIVYbEWWj84+M5E5pc83ZIBc5j3C8rdtjncPCm2ExGx2LQ==}
+ dependencies:
+ '@ledgerhq/devices': 8.6.1
+ '@ledgerhq/errors': 6.26.0
+ '@ledgerhq/hw-transport': 6.31.12
+ '@ledgerhq/logs': 6.13.0
+ dev: true
+
+ /@ledgerhq/hw-transport-webusb@6.29.12:
+ resolution: {integrity: sha512-mMGKPYAUz9MNcURe+hSTSHwqPwCli6D0lCl15Z4hDOpcqhZ26vwoeWVKeQp53NNCetHOl0lauPkN43Gt9pIggg==}
+ dependencies:
+ '@ledgerhq/devices': 8.6.1
+ '@ledgerhq/errors': 6.26.0
+ '@ledgerhq/hw-transport': 6.31.12
+ '@ledgerhq/logs': 6.13.0
+ dev: true
+
+ /@ledgerhq/hw-transport@6.31.12:
+ resolution: {integrity: sha512-FO5LRIXYC8ELtaohlO8qK0b3TfHUNBZ3+CXKPHiHj2jJwrxPf4s5kcgBYrmzuf1C/1vfrMOjzyty6OgrMIbU6Q==}
+ dependencies:
+ '@ledgerhq/devices': 8.6.1
+ '@ledgerhq/errors': 6.26.0
+ '@ledgerhq/logs': 6.13.0
+ events: 3.3.0
+ dev: true
+
+ /@ledgerhq/logs@6.13.0:
+ resolution: {integrity: sha512-4+qRW2Pc8V+btL0QEmdB2X+uyx0kOWMWE1/LWsq5sZy3Q5tpi4eItJS6mB0XL3wGW59RQ+8bchNQQ1OW/va8Og==}
+ dev: true
+
+ /@mdn/browser-compat-data@5.7.6:
+ resolution: {integrity: sha512-7xdrMX0Wk7grrTZQwAoy1GkvPMFoizStUoL+VmtUkAxegbCCec+3FKwOM6yc/uGU5+BEczQHXAlWiqvM8JeENg==}
+ dev: true
+
+ /@metaplex-foundation/beet-solana@0.4.1(typescript@5.9.3):
+ resolution: {integrity: sha512-/6o32FNUtwK8tjhotrvU/vorP7umBuRFvBZrC6XCk51aKidBHe5LPVPA5AjGPbV3oftMfRuXPNd9yAGeEqeCDQ==}
+ dependencies:
+ '@metaplex-foundation/beet': 0.7.2
+ '@solana/web3.js': 1.98.4(typescript@5.9.3)
+ bs58: 5.0.0
+ debug: 4.4.3(supports-color@8.1.1)
+ transitivePeerDependencies:
+ - bufferutil
+ - encoding
+ - supports-color
+ - typescript
+ - utf-8-validate
+ dev: true
+
+ /@metaplex-foundation/beet@0.7.2:
+ resolution: {integrity: sha512-K+g3WhyFxKPc0xIvcIjNyV1eaTVJTiuaHZpig7Xx0MuYRMoJLLvhLTnUXhFdR5Tu2l2QSyKwfyXDgZlzhULqFg==}
+ dependencies:
+ ansicolors: 0.3.2
+ assert: 2.1.0
+ bn.js: 5.2.2
+ debug: 4.4.3(supports-color@8.1.1)
+ transitivePeerDependencies:
+ - supports-color
+ dev: true
+
+ /@metaplex-foundation/mpl-token-metadata@3.4.0(@metaplex-foundation/umi@0.9.2):
+ resolution: {integrity: sha512-AxBAYCK73JWxY3g9//z/C9krkR0t1orXZDknUPS4+GjwGH2vgPfsk04yfZ31Htka2AdS9YE/3wH7sMUBHKn9Rg==}
+ peerDependencies:
+ '@metaplex-foundation/umi': '>= 0.8.2 <= 1'
+ dependencies:
+ '@metaplex-foundation/mpl-toolbox': 0.10.0(@metaplex-foundation/umi@0.9.2)
+ '@metaplex-foundation/umi': 0.9.2
+ dev: true
+
+ /@metaplex-foundation/mpl-toolbox@0.10.0(@metaplex-foundation/umi@0.9.2):
+ resolution: {integrity: sha512-84KD1L5cFyw5xnntHwL4uPwfcrkKSiwuDeypiVr92qCUFuF3ZENa2zlFVPu+pQcjTlod2LmEX3MhBmNjRMpdKg==}
+ peerDependencies:
+ '@metaplex-foundation/umi': '>= 0.8.2 <= 1'
+ dependencies:
+ '@metaplex-foundation/umi': 0.9.2
+ dev: true
+
+ /@metaplex-foundation/mpl-toolbox@0.9.4(@metaplex-foundation/umi@0.9.2):
+ resolution: {integrity: sha512-fd6JxfoLbj/MM8FG2x91KYVy1U6AjBQw4qjt7+Da3trzQaWnSaYHDcYRG/53xqfvZ9qofY1T2t53GXPlD87lnQ==}
+ peerDependencies:
+ '@metaplex-foundation/umi': '>= 0.8.2 < 1'
+ dependencies:
+ '@metaplex-foundation/umi': 0.9.2
+ dev: true
+
+ /@metaplex-foundation/umi-bundle-defaults@0.9.2(@metaplex-foundation/umi@0.9.2)(@solana/web3.js@1.98.4):
+ resolution: {integrity: sha512-kV3tfvgvRjVP1p9OFOtH+ibOtN9omVJSwKr0We4/9r45e5LTj+32su0V/rixZUkG1EZzzOYBsxhtIE0kIw/Hrw==}
+ peerDependencies:
+ '@metaplex-foundation/umi': ^0.9.2
+ '@solana/web3.js': ^1.98.0
+ dependencies:
+ '@metaplex-foundation/umi': 0.9.2
+ '@metaplex-foundation/umi-downloader-http': 0.9.2(@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.4)
+ '@metaplex-foundation/umi-http-fetch': 0.9.2(@metaplex-foundation/umi@0.9.2)
+ '@metaplex-foundation/umi-program-repository': 0.9.2(@metaplex-foundation/umi@0.9.2)
+ '@metaplex-foundation/umi-rpc-chunk-get-accounts': 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.4)
+ '@metaplex-foundation/umi-serializer-data-view': 0.9.2(@metaplex-foundation/umi@0.9.2)
+ '@metaplex-foundation/umi-transaction-factory-web3js': 0.9.2(@metaplex-foundation/umi@0.9.2)(@solana/web3.js@1.98.4)
+ '@solana/web3.js': 1.98.4(typescript@5.9.3)
+ transitivePeerDependencies:
+ - encoding
+ dev: true
+
+ /@metaplex-foundation/umi-downloader-http@0.9.2(@metaplex-foundation/umi@0.9.2):
+ resolution: {integrity: sha512-tzPT9hBwenzTzAQg07rmsrqZfgguAXELbcJrsYMoASp5VqWFXYIP00g94KET6XLjWUXH4P1J2zoa6hGennPXHA==}
+ peerDependencies:
+ '@metaplex-foundation/umi': ^0.9.2
+ dependencies:
+ '@metaplex-foundation/umi': 0.9.2
+ dev: true
+
+ /@metaplex-foundation/umi-eddsa-web3js@0.9.2(@metaplex-foundation/umi@0.9.2)(@solana/web3.js@1.98.4):
+ resolution: {integrity: sha512-hhPCxXbYIp4BC4z9gK78sXpWLkNSrfv4ndhF5ruAkdIp7GcRVYKj0QnOUO6lGYGiIkNlw20yoTwOe1CT//OfTQ==}
+ peerDependencies:
+ '@metaplex-foundation/umi': ^0.9.2
+ '@solana/web3.js': ^1.98.0
+ dependencies:
+ '@metaplex-foundation/umi': 0.9.2
+ '@metaplex-foundation/umi-web3js-adapters': 0.9.2(@metaplex-foundation/umi@0.9.2)(@solana/web3.js@1.98.4)
+ '@noble/curves': 1.9.7
+ '@solana/web3.js': 1.98.4(typescript@5.9.3)
+ dev: true
+
+ /@metaplex-foundation/umi-http-fetch@0.9.2(@metaplex-foundation/umi@0.9.2):
+ resolution: {integrity: sha512-YCZuBu24T9ZzEDe4+w12LEZm/fO9pkyViZufGgASC5NX93814Lvf6Ssjn/hZzjfA7CvZbvLFbmujc6CV3Q/m9Q==}
+ peerDependencies:
+ '@metaplex-foundation/umi': ^0.9.2
+ dependencies:
+ '@metaplex-foundation/umi': 0.9.2
+ node-fetch: 2.7.0
+ transitivePeerDependencies:
+ - encoding
+ dev: true
+
+ /@metaplex-foundation/umi-options@0.8.9:
+ resolution: {integrity: sha512-jSQ61sZMPSAk/TXn8v8fPqtz3x8d0/blVZXLLbpVbo2/T5XobiI6/MfmlUosAjAUaQl6bHRF8aIIqZEFkJiy4A==}
+ dev: true
+
+ /@metaplex-foundation/umi-program-repository@0.9.2(@metaplex-foundation/umi@0.9.2):
+ resolution: {integrity: sha512-g3+FPqXEmYsBa8eETtUE2gb2Oe3mqac0z3/Ur1TvAg5TtIy3mzRzOy/nza+sgzejnfcxcVg835rmpBaxpBnjDA==}
+ peerDependencies:
+ '@metaplex-foundation/umi': ^0.9.2
+ dependencies:
+ '@metaplex-foundation/umi': 0.9.2
+ dev: true
+
+ /@metaplex-foundation/umi-public-keys@0.8.9:
+ resolution: {integrity: sha512-CxMzN7dgVGOq9OcNCJe2casKUpJ3RmTVoOvDFyeoTQuK+vkZ1YSSahbqC1iGuHEtKTLSjtWjKvUU6O7zWFTw3Q==}
+ dependencies:
+ '@metaplex-foundation/umi-serializers-encodings': 0.8.9
+ dev: true
+
+ /@metaplex-foundation/umi-rpc-chunk-get-accounts@0.9.2(@metaplex-foundation/umi@0.9.2):
+ resolution: {integrity: sha512-YRwVf6xH0jPBAUgMhEPi+UbjioAeqTXmjsN2TnmQCPAmHbrHrMRj0rlWYwFLWAgkmoxazYrXP9lqOFRrfOGAEA==}
+ peerDependencies:
+ '@metaplex-foundation/umi': ^0.9.2
+ dependencies:
+ '@metaplex-foundation/umi': 0.9.2
+ dev: true
+
+ /@metaplex-foundation/umi-rpc-web3js@0.9.2(@metaplex-foundation/umi@0.9.2)(@solana/web3.js@1.98.4):
+ resolution: {integrity: sha512-MqcsBz8B4wGl6jxsf2Jo/rAEpYReU9VCSR15QSjhvADHMmdFxCIZCCAgE+gDE2Vuanfl437VhOcP3g5Uw8C16Q==}
+ peerDependencies:
+ '@metaplex-foundation/umi': ^0.9.2
+ '@solana/web3.js': ^1.98.0
+ dependencies:
+ '@metaplex-foundation/umi': 0.9.2
+ '@metaplex-foundation/umi-web3js-adapters': 0.9.2(@metaplex-foundation/umi@0.9.2)(@solana/web3.js@1.98.4)
+ '@solana/web3.js': 1.98.4(typescript@5.9.3)
+ dev: true
+
+ /@metaplex-foundation/umi-serializer-data-view@0.9.2(@metaplex-foundation/umi@0.9.2):
+ resolution: {integrity: sha512-5vGptadJxUxvUcyrwFZxXlEc6Q7AYySBesizCtrBFUY8w8PnF2vzmS45CP1MLySEATNH6T9mD4Rs0tLb87iQyA==}
+ peerDependencies:
+ '@metaplex-foundation/umi': ^0.9.2
+ dependencies:
+ '@metaplex-foundation/umi': 0.9.2
+ dev: true
+
+ /@metaplex-foundation/umi-serializers-core@0.8.9:
+ resolution: {integrity: sha512-WT82tkiYJ0Qmscp7uTj1Hz6aWQPETwaKLAENAUN5DeWghkuBKtuxyBKVvEOuoXerJSdhiAk0e8DWA4cxcTTQ/w==}
+ dev: true
+
+ /@metaplex-foundation/umi-serializers-encodings@0.8.9:
+ resolution: {integrity: sha512-N3VWLDTJ0bzzMKcJDL08U3FaqRmwlN79FyE4BHj6bbAaJ9LEHjDQ9RJijZyWqTm0jE7I750fU7Ow5EZL38Xi6Q==}
+ dependencies:
+ '@metaplex-foundation/umi-serializers-core': 0.8.9
+ dev: true
+
+ /@metaplex-foundation/umi-serializers-numbers@0.8.9:
+ resolution: {integrity: sha512-NtBf1fnVNQJHFQjLFzRu2i9GGnigb9hOm/Gfrk628d0q0tRJB7BOM3bs5C61VAs7kJs4yd+pDNVAERJkknQ7Lg==}
+ dependencies:
+ '@metaplex-foundation/umi-serializers-core': 0.8.9
+ dev: true
+
+ /@metaplex-foundation/umi-serializers@0.9.0:
+ resolution: {integrity: sha512-hAOW9Djl4w4ioKeR4erDZl5IG4iJdP0xA19ZomdaCbMhYAAmG/FEs5khh0uT2mq53/MnzWcXSUPoO8WBN4Q+Vg==}
+ dependencies:
+ '@metaplex-foundation/umi-options': 0.8.9
+ '@metaplex-foundation/umi-public-keys': 0.8.9
+ '@metaplex-foundation/umi-serializers-core': 0.8.9
+ '@metaplex-foundation/umi-serializers-encodings': 0.8.9
+ '@metaplex-foundation/umi-serializers-numbers': 0.8.9
+ dev: true
+
+ /@metaplex-foundation/umi-transaction-factory-web3js@0.9.2(@metaplex-foundation/umi@0.9.2)(@solana/web3.js@1.98.4):
+ resolution: {integrity: sha512-fR1Kf21uylMFd1Smkltmj4jTNxhqSWf416owsJ+T+cvJi2VCOcOwq/3UFzOrpz78fA0RhsajKYKj0HYsRnQI1g==}
+ peerDependencies:
+ '@metaplex-foundation/umi': ^0.9.2
+ '@solana/web3.js': ^1.98.0
+ dependencies:
+ '@metaplex-foundation/umi': 0.9.2
+ '@metaplex-foundation/umi-web3js-adapters': 0.9.2(@metaplex-foundation/umi@0.9.2)(@solana/web3.js@1.98.4)
+ '@solana/web3.js': 1.98.4(typescript@5.9.3)
+ dev: true
+
+ /@metaplex-foundation/umi-web3js-adapters@0.9.2(@metaplex-foundation/umi@0.9.2)(@solana/web3.js@1.98.4):
+ resolution: {integrity: sha512-RQqUTtHYY9fmEMnq7s3Hiv/81flGaoI0ZVVoafnFVaQLnxU6QBKxtboRZHk43XtD9CiFh5f9izrMJX7iK7KlOA==}
+ peerDependencies:
+ '@metaplex-foundation/umi': ^0.9.2
+ '@solana/web3.js': ^1.98.0
+ dependencies:
+ '@metaplex-foundation/umi': 0.9.2
+ '@solana/web3.js': 1.98.4(typescript@5.9.3)
+ buffer: 6.0.3
+ dev: true
+
+ /@metaplex-foundation/umi@0.9.2:
+ resolution: {integrity: sha512-9i4Acm4pruQfJcpRrc2EauPBwkfDN0I9QTvJyZocIlKgoZwD6A6wH0PViH1AjOVG5CQCd1YI3tJd5XjYE1ElBw==}
+ dependencies:
+ '@metaplex-foundation/umi-options': 0.8.9
+ '@metaplex-foundation/umi-public-keys': 0.8.9
+ '@metaplex-foundation/umi-serializers': 0.9.0
+ dev: true
+
+ /@mysten/bcs@1.9.2:
+ resolution: {integrity: sha512-kBk5xrxV9OWR7i+JhL/plQrgQ2/KJhB2pB5gj+w6GXhbMQwS3DPpOvi/zN0Tj84jwPvHMllpEl0QHj6ywN7/eQ==}
+ dependencies:
+ '@mysten/utils': 0.2.0
+ '@scure/base': 1.2.6
+ dev: true
+
+ /@mysten/sui@1.43.2(typescript@5.9.3):
+ resolution: {integrity: sha512-xURMCHrhdVUXLFIUTUM0oRBpYh4nCcLPpn7hNUrWa/gdnABginmwldJpK0R8UjxLv4lEwcYGHeWs2yBl7tqLXg==}
+ engines: {node: '>=18'}
+ dependencies:
+ '@graphql-typed-document-node/core': 3.2.0(graphql@16.11.0)
+ '@mysten/bcs': 1.9.2
+ '@mysten/utils': 0.2.0
+ '@noble/curves': 1.9.4
+ '@noble/hashes': 1.8.0
+ '@protobuf-ts/grpcweb-transport': 2.11.1
+ '@protobuf-ts/runtime': 2.11.1
+ '@protobuf-ts/runtime-rpc': 2.11.1
+ '@scure/base': 1.2.6
+ '@scure/bip32': 1.7.0
+ '@scure/bip39': 1.6.0
+ gql.tada: 1.8.13(graphql@16.11.0)(typescript@5.9.3)
+ graphql: 16.11.0
+ poseidon-lite: 0.2.1
+ valibot: 0.36.0
+ transitivePeerDependencies:
+ - '@gql.tada/svelte-support'
+ - '@gql.tada/vue-support'
+ - typescript
+ dev: true
+
+ /@mysten/utils@0.2.0:
+ resolution: {integrity: sha512-CM6kJcJHX365cK6aXfFRLBiuyXc5WSBHQ43t94jqlCAIRw8umgNcTb5EnEA9n31wPAQgLDGgbG/rCUISCTJ66w==}
+ dependencies:
+ '@scure/base': 1.2.6
+ dev: true
+
+ /@napi-rs/wasm-runtime@0.2.12:
+ resolution: {integrity: sha512-ZVWUcfwY4E/yPitQJl481FjFo3K22D6qF0DuFH6Y/nbnE11GY5uguDxZMGXPQ8WQ0128MXQD7TnfHyK4oWoIJQ==}
+ requiresBuild: true
+ dependencies:
+ '@emnapi/core': 1.6.0
+ '@emnapi/runtime': 1.6.0
+ '@tybys/wasm-util': 0.10.1
+ dev: true
+ optional: true
+
+ /@noble/curves@1.4.2:
+ resolution: {integrity: sha512-TavHr8qycMChk8UwMld0ZDRvatedkzWfH8IiaeGCfymOP5i0hSCozz9vHOL0nkwk7HRMlFnAiKpS2jrUmSybcw==}
+ dependencies:
+ '@noble/hashes': 1.4.0
+ dev: true
+
+ /@noble/curves@1.8.2:
+ resolution: {integrity: sha512-vnI7V6lFNe0tLAuJMu+2sX+FcL14TaCWy1qiczg1VwRmPrpQCdq5ESXQMqUc2tluRNf6irBXrWbl1mGN8uaU/g==}
+ engines: {node: ^14.21.3 || >=16}
+ dependencies:
+ '@noble/hashes': 1.7.2
+ dev: true
+
+ /@noble/curves@1.9.4:
+ resolution: {integrity: sha512-2bKONnuM53lINoDrSmK8qP8W271ms7pygDhZt4SiLOoLwBtoHqeCFi6RG42V8zd3mLHuJFhU/Bmaqo4nX0/kBw==}
+ engines: {node: ^14.21.3 || >=16}
+ dependencies:
+ '@noble/hashes': 1.8.0
+ dev: true
+
+ /@noble/curves@1.9.7:
+ resolution: {integrity: sha512-gbKGcRUYIjA3/zCCNaWDciTMFI0dCkvou3TL8Zmy5Nc7sJ47a0jtOeZoTaMxkuqRo9cRhjOdZJXegxYE5FN/xw==}
+ engines: {node: ^14.21.3 || >=16}
+ dependencies:
+ '@noble/hashes': 1.8.0
+ dev: true
+
+ /@noble/ed25519@1.7.5:
+ resolution: {integrity: sha512-xuS0nwRMQBvSxDa7UxMb61xTiH3MxTgUfhyPUALVIe0FlOAz4sjELwyDRyUvqeEYfRSG9qNjFIycqLZppg4RSA==}
+ dev: true
+
+ /@noble/hashes@1.2.0:
+ resolution: {integrity: sha512-FZfhjEDbT5GRswV3C6uvLPHMiVD6lQBmpoX5+eSiPaMTXte/IKqI5dykDxzZB/WBeK/CDuQRBWarPdi3FNY2zQ==}
+ dev: true
+
+ /@noble/hashes@1.3.3:
+ resolution: {integrity: sha512-V7/fPHgl+jsVPXqqeOzT8egNj2iBIVt+ECeMMG8TdcnTikP3oaBtUVqpT/gYCR68aEBJSF+XbYUxStjbFMqIIA==}
+ engines: {node: '>= 16'}
+ dev: true
+
+ /@noble/hashes@1.4.0:
+ resolution: {integrity: sha512-V1JJ1WTRUqHHrOSh597hURcMqVKVGL/ea3kv0gSnEdsEZ0/+VyPghM1lMNGc00z7CIQorSvbKpuJkxvuHbvdbg==}
+ engines: {node: '>= 16'}
+ dev: true
+
+ /@noble/hashes@1.7.2:
+ resolution: {integrity: sha512-biZ0NUSxyjLLqo6KxEJ1b+C2NAx0wtDoFvCaXHGgUkeHzf3Xc1xKumFKREuT7f7DARNZ/slvYUwFG6B0f2b6hQ==}
+ engines: {node: ^14.21.3 || >=16}
+ dev: true
+
+ /@noble/hashes@1.8.0:
+ resolution: {integrity: sha512-jCs9ldd7NwzpgXDIf6P3+NrHh9/sD6CQdxHyjQI+h/6rDNo88ypBxxz45UDuZHz9r3tNz7N/VInSVoVdtXEI4A==}
+ engines: {node: ^14.21.3 || >=16}
+ dev: true
+
+ /@noble/secp256k1@1.7.1:
+ resolution: {integrity: sha512-hOUk6AyBFmqVrv7k5WAw/LpszxVbj9gGN4JRkIX52fdFAj1UA61KXmZDvqVEm+pOyec3+fIeZB02LYa/pWOArw==}
+ dev: true
+
+ /@noble/secp256k1@1.7.2:
+ resolution: {integrity: sha512-/qzwYl5eFLH8OWIecQWM31qld2g1NfjgylK+TNhqtaUKP37Nm+Y+z30Fjhw0Ct8p9yCQEm2N3W/AckdIb3SMcQ==}
+ dev: true
+
+ /@nodelib/fs.scandir@2.1.5:
+ resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==}
+ engines: {node: '>= 8'}
+ dependencies:
+ '@nodelib/fs.stat': 2.0.5
+ run-parallel: 1.2.0
+ dev: true
+
+ /@nodelib/fs.stat@2.0.5:
+ resolution: {integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==}
+ engines: {node: '>= 8'}
+ dev: true
+
+ /@nodelib/fs.walk@1.2.8:
+ resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==}
+ engines: {node: '>= 8'}
+ dependencies:
+ '@nodelib/fs.scandir': 2.1.5
+ fastq: 1.19.1
+ dev: true
+
+ /@nolyfill/is-core-module@1.0.39:
+ resolution: {integrity: sha512-nn5ozdjYQpUCZlWGuxcJY/KpxkWQs4DcbMCmKojjyrYDEAGy4Ce19NN4v5MduafTwJlbKc99UA8YhSVqq9yPZA==}
+ engines: {node: '>=12.4.0'}
+ dev: true
+
+ /@nomicfoundation/edr-darwin-arm64@0.11.3:
+ resolution: {integrity: sha512-w0tksbdtSxz9nuzHKsfx4c2mwaD0+l5qKL2R290QdnN9gi9AV62p9DHkOgfBdyg6/a6ZlnQqnISi7C9avk/6VA==}
+ engines: {node: '>= 18'}
+ dev: true
+
+ /@nomicfoundation/edr-darwin-x64@0.11.3:
+ resolution: {integrity: sha512-QR4jAFrPbOcrO7O2z2ESg+eUeIZPe2bPIlQYgiJ04ltbSGW27FblOzdd5+S3RoOD/dsZGKAvvy6dadBEl0NgoA==}
+ engines: {node: '>= 18'}
+ dev: true
+
+ /@nomicfoundation/edr-linux-arm64-gnu@0.11.3:
+ resolution: {integrity: sha512-Ktjv89RZZiUmOFPspuSBVJ61mBZQ2+HuLmV67InNlh9TSUec/iDjGIwAn59dx0bF/LOSrM7qg5od3KKac4LJDQ==}
+ engines: {node: '>= 18'}
+ dev: true
+
+ /@nomicfoundation/edr-linux-arm64-musl@0.11.3:
+ resolution: {integrity: sha512-B3sLJx1rL2E9pfdD4mApiwOZSrX0a/KQSBWdlq1uAhFKqkl00yZaY4LejgZndsJAa4iKGQJlGnw4HCGeVt0+jA==}
+ engines: {node: '>= 18'}
+ dev: true
+
+ /@nomicfoundation/edr-linux-x64-gnu@0.11.3:
+ resolution: {integrity: sha512-D/4cFKDXH6UYyKPu6J3Y8TzW11UzeQI0+wS9QcJzjlrrfKj0ENW7g9VihD1O2FvXkdkTjcCZYb6ai8MMTCsaVw==}
+ engines: {node: '>= 18'}
+ dev: true
+
+ /@nomicfoundation/edr-linux-x64-musl@0.11.3:
+ resolution: {integrity: sha512-ergXuIb4nIvmf+TqyiDX5tsE49311DrBky6+jNLgsGDTBaN1GS3OFwFS8I6Ri/GGn6xOaT8sKu3q7/m+WdlFzg==}
+ engines: {node: '>= 18'}
+ dev: true
+
+ /@nomicfoundation/edr-win32-x64-msvc@0.11.3:
+ resolution: {integrity: sha512-snvEf+WB3OV0wj2A7kQ+ZQqBquMcrozSLXcdnMdEl7Tmn+KDCbmFKBt3Tk0X3qOU4RKQpLPnTxdM07TJNVtung==}
+ engines: {node: '>= 18'}
+ dev: true
+
+ /@nomicfoundation/edr@0.11.3:
+ resolution: {integrity: sha512-kqILRkAd455Sd6v8mfP3C1/0tCOynJWY+Ir+k/9Boocu2kObCrsFgG+ZWB7fSBVdd9cPVSNrnhWS+V+PEo637g==}
+ engines: {node: '>= 18'}
+ dependencies:
+ '@nomicfoundation/edr-darwin-arm64': 0.11.3
+ '@nomicfoundation/edr-darwin-x64': 0.11.3
+ '@nomicfoundation/edr-linux-arm64-gnu': 0.11.3
+ '@nomicfoundation/edr-linux-arm64-musl': 0.11.3
+ '@nomicfoundation/edr-linux-x64-gnu': 0.11.3
+ '@nomicfoundation/edr-linux-x64-musl': 0.11.3
+ '@nomicfoundation/edr-win32-x64-msvc': 0.11.3
+ dev: true
+
+ /@nomicfoundation/hardhat-ethers@3.1.1(ethers@5.8.0)(hardhat@2.26.4):
+ resolution: {integrity: sha512-v/hm2yL7RfTnTShqD0hycgERZSaaj8dtM8pklVFElxwAKUfIpumaXo/lbPqUW5DHgvvG/y440g0g46gWwLlSHQ==}
+ peerDependencies:
+ ethers: ^5.7.2
+ hardhat: ^2.26.0
+ dependencies:
+ debug: 4.4.3(supports-color@8.1.1)
+ ethers: 5.8.0
+ hardhat: 2.26.4(ts-node@10.9.2)(typescript@5.9.3)
+ lodash.isequal: 4.5.0
+ transitivePeerDependencies:
+ - supports-color
+ dev: true
+
+ /@nomicfoundation/solidity-analyzer-darwin-arm64@0.1.2:
+ resolution: {integrity: sha512-JaqcWPDZENCvm++lFFGjrDd8mxtf+CtLd2MiXvMNTBD33dContTZ9TWETwNFwg7JTJT5Q9HEecH7FA+HTSsIUw==}
+ engines: {node: '>= 12'}
+ requiresBuild: true
+ dev: true
+ optional: true
+
+ /@nomicfoundation/solidity-analyzer-darwin-x64@0.1.2:
+ resolution: {integrity: sha512-fZNmVztrSXC03e9RONBT+CiksSeYcxI1wlzqyr0L7hsQlK1fzV+f04g2JtQ1c/Fe74ZwdV6aQBdd6Uwl1052sw==}
+ engines: {node: '>= 12'}
+ requiresBuild: true
+ dev: true
+ optional: true
+
+ /@nomicfoundation/solidity-analyzer-linux-arm64-gnu@0.1.2:
+ resolution: {integrity: sha512-3d54oc+9ZVBuB6nbp8wHylk4xh0N0Gc+bk+/uJae+rUgbOBwQSfuGIbAZt1wBXs5REkSmynEGcqx6DutoK0tPA==}
+ engines: {node: '>= 12'}
+ requiresBuild: true
+ dev: true
+ optional: true
+
+ /@nomicfoundation/solidity-analyzer-linux-arm64-musl@0.1.2:
+ resolution: {integrity: sha512-iDJfR2qf55vgsg7BtJa7iPiFAsYf2d0Tv/0B+vhtnI16+wfQeTbP7teookbGvAo0eJo7aLLm0xfS/GTkvHIucA==}
+ engines: {node: '>= 12'}
+ requiresBuild: true
+ dev: true
+ optional: true
+
+ /@nomicfoundation/solidity-analyzer-linux-x64-gnu@0.1.2:
+ resolution: {integrity: sha512-9dlHMAt5/2cpWyuJ9fQNOUXFB/vgSFORg1jpjX1Mh9hJ/MfZXlDdHQ+DpFCs32Zk5pxRBb07yGvSHk9/fezL+g==}
+ engines: {node: '>= 12'}
+ requiresBuild: true
+ dev: true
+ optional: true
+
+ /@nomicfoundation/solidity-analyzer-linux-x64-musl@0.1.2:
+ resolution: {integrity: sha512-GzzVeeJob3lfrSlDKQw2bRJ8rBf6mEYaWY+gW0JnTDHINA0s2gPR4km5RLIj1xeZZOYz4zRw+AEeYgLRqB2NXg==}
+ engines: {node: '>= 12'}
+ requiresBuild: true
+ dev: true
+ optional: true
+
+ /@nomicfoundation/solidity-analyzer-win32-x64-msvc@0.1.2:
+ resolution: {integrity: sha512-Fdjli4DCcFHb4Zgsz0uEJXZ2K7VEO+w5KVv7HmT7WO10iODdU9csC2az4jrhEsRtiR9Gfd74FlG0NYlw1BMdyA==}
+ engines: {node: '>= 12'}
+ requiresBuild: true
+ dev: true
+ optional: true
+
+ /@nomicfoundation/solidity-analyzer@0.1.2:
+ resolution: {integrity: sha512-q4n32/FNKIhQ3zQGGw5CvPF6GTvDCpYwIf7bEY/dZTZbgfDsHyjJwURxUJf3VQuuJj+fDIFl4+KkBVbw4Ef6jA==}
+ engines: {node: '>= 12'}
+ optionalDependencies:
+ '@nomicfoundation/solidity-analyzer-darwin-arm64': 0.1.2
+ '@nomicfoundation/solidity-analyzer-darwin-x64': 0.1.2
+ '@nomicfoundation/solidity-analyzer-linux-arm64-gnu': 0.1.2
+ '@nomicfoundation/solidity-analyzer-linux-arm64-musl': 0.1.2
+ '@nomicfoundation/solidity-analyzer-linux-x64-gnu': 0.1.2
+ '@nomicfoundation/solidity-analyzer-linux-x64-musl': 0.1.2
+ '@nomicfoundation/solidity-analyzer-win32-x64-msvc': 0.1.2
+ dev: true
+
+ /@nomiclabs/hardhat-ethers@2.2.3(ethers@5.8.0)(hardhat@2.26.4):
+ resolution: {integrity: sha512-YhzPdzb612X591FOe68q+qXVXGG2ANZRvDo0RRUtimev85rCrAlv/TLMEZw5c+kq9AbzocLTVX/h2jVIFPL9Xg==}
+ peerDependencies:
+ ethers: ^5.7.2
+ hardhat: ^2.0.0
+ dependencies:
+ ethers: 5.8.0
+ hardhat: 2.26.4(ts-node@10.9.2)(typescript@5.9.3)
+ dev: true
+
+ /@nomiclabs/hardhat-waffle@2.0.6(@nomiclabs/hardhat-ethers@2.2.3)(@types/sinon-chai@3.2.12)(ethereum-waffle@4.0.10)(ethers@5.8.0)(hardhat@2.26.4):
+ resolution: {integrity: sha512-+Wz0hwmJGSI17B+BhU/qFRZ1l6/xMW82QGXE/Gi+WTmwgJrQefuBs1lIf7hzQ1hLk6hpkvb/zwcNkpVKRYTQYg==}
+ peerDependencies:
+ '@nomiclabs/hardhat-ethers': ^2.0.0
+ '@types/sinon-chai': ^3.2.3
+ ethereum-waffle: '*'
+ ethers: ^5.7.2
+ hardhat: ^2.0.0
+ dependencies:
+ '@nomiclabs/hardhat-ethers': 2.2.3(ethers@5.8.0)(hardhat@2.26.4)
+ '@types/sinon-chai': 3.2.12
+ ethereum-waffle: 4.0.10(@ensdomains/ens@0.4.5)(@ensdomains/resolver@0.2.4)(@ethersproject/abi@5.8.0)(@ethersproject/providers@5.8.0)(ethers@5.8.0)(typescript@5.9.3)
+ ethers: 5.8.0
+ hardhat: 2.26.4(ts-node@10.9.2)(typescript@5.9.3)
+ dev: true
+
+ /@openzeppelin/contracts-upgradeable@4.7.3:
+ resolution: {integrity: sha512-+wuegAMaLcZnLCJIvrVUDzA9z/Wp93f0Dla/4jJvIhijRrPabjQbZe6fWiECLaJyfn5ci9fqf9vTw3xpQOad2A==}
+ dev: true
+
+ /@openzeppelin/contracts-upgradeable@5.4.0(@openzeppelin/contracts@5.4.0):
+ resolution: {integrity: sha512-STJKyDzUcYuB35Zub1JpWW58JxvrFFVgQ+Ykdr8A9PGXgtq/obF5uoh07k2XmFyPxfnZdPdBdhkJ/n2YxJ87HQ==}
+ peerDependencies:
+ '@openzeppelin/contracts': 5.4.0
+ dependencies:
+ '@openzeppelin/contracts': 5.4.0
+ dev: true
+
+ /@openzeppelin/contracts@3.4.2:
+ resolution: {integrity: sha512-z0zMCjyhhp4y7XKAcDAi3Vgms4T2PstwBdahiO0+9NaGICQKjynK3wduSRplTgk4LXmoO1yfDGO5RbjKYxtuxA==}
+ dev: true
+
+ /@openzeppelin/contracts@4.3.3:
+ resolution: {integrity: sha512-tDBopO1c98Yk7Cv/PZlHqrvtVjlgK5R4J6jxLwoO7qxK4xqOiZG+zSkIvGFpPZ0ikc3QOED3plgdqjgNTnBc7g==}
+ dev: true
+
+ /@openzeppelin/contracts@5.4.0:
+ resolution: {integrity: sha512-eCYgWnLg6WO+X52I16TZt8uEjbtdkgLC0SUX/xnAksjjrQI4Xfn4iBRoI5j55dmlOhDv1Y7BoR3cU7e3WWhC6A==}
+ dev: true
+
+ /@pkgr/core@0.2.9:
+ resolution: {integrity: sha512-QNqXyfVS2wm9hweSYD2O7F0G06uurj9kZ96TRQE5Y9hU7+tgdZwIkbAKc5Ocy1HxEY2kuDQa6cQ1WRs/O5LFKA==}
+ engines: {node: ^12.20.0 || ^14.18.0 || >=16.0.0}
+ dev: true
+
+ /@pnpm/config.env-replace@1.1.0:
+ resolution: {integrity: sha512-htyl8TWnKL7K/ESFa1oW2UB5lVDxuF5DpM7tBi6Hu2LNL3mWkIzNLG6N4zoCUP1lCKNxWy/3iu8mS8MvToGd6w==}
+ engines: {node: '>=12.22.0'}
+ dev: true
+
+ /@pnpm/network.ca-file@1.0.2:
+ resolution: {integrity: sha512-YcPQ8a0jwYU9bTdJDpXjMi7Brhkr1mXsXrUJvjqM2mQDgkRiz8jFaQGOdaLxgjtUfQgZhKy/O3cG/YwmgKaxLA==}
+ engines: {node: '>=12.22.0'}
+ dependencies:
+ graceful-fs: 4.2.10
+ dev: true
+
+ /@pnpm/npm-conf@2.3.1:
+ resolution: {integrity: sha512-c83qWb22rNRuB0UaVCI0uRPNRr8Z0FWnEIvT47jiHAmOIUHbBOg5XvV7pM5x+rKn9HRpjxquDbXYSXr3fAKFcw==}
+ engines: {node: '>=12'}
+ dependencies:
+ '@pnpm/config.env-replace': 1.1.0
+ '@pnpm/network.ca-file': 1.0.2
+ config-chain: 1.1.13
+ dev: true
+
+ /@protobuf-ts/grpcweb-transport@2.11.1:
+ resolution: {integrity: sha512-1W4utDdvOB+RHMFQ0soL4JdnxjXV+ddeGIUg08DvZrA8Ms6k5NN6GBFU2oHZdTOcJVpPrDJ02RJlqtaoCMNBtw==}
+ dependencies:
+ '@protobuf-ts/runtime': 2.11.1
+ '@protobuf-ts/runtime-rpc': 2.11.1
+ dev: true
+
+ /@protobuf-ts/runtime-rpc@2.11.1:
+ resolution: {integrity: sha512-4CqqUmNA+/uMz00+d3CYKgElXO9VrEbucjnBFEjqI4GuDrEQ32MaI3q+9qPBvIGOlL4PmHXrzM32vBPWRhQKWQ==}
+ dependencies:
+ '@protobuf-ts/runtime': 2.11.1
+ dev: true
+
+ /@protobuf-ts/runtime@2.11.1:
+ resolution: {integrity: sha512-KuDaT1IfHkugM2pyz+FwiY80ejWrkH1pAtOBOZFuR6SXEFTsnb/jiQWQ1rCIrcKx2BtyxnxW6BWwsVSA/Ie+WQ==}
+ dev: true
+
+ /@protobufjs/aspromise@1.1.2:
+ resolution: {integrity: sha512-j+gKExEuLmKwvz3OgROXtrJ2UG2x8Ch2YZUxahh+s1F2HZ+wAceUNLkvy6zKCPVRkU++ZWQrdxsUeQXmcg4uoQ==}
+ dev: true
+
+ /@protobufjs/base64@1.1.2:
+ resolution: {integrity: sha512-AZkcAA5vnN/v4PDqKyMR5lx7hZttPDgClv83E//FMNhR2TMcLUhfRUBHCmSl0oi9zMgDDqRUJkSxO3wm85+XLg==}
+ dev: true
+
+ /@protobufjs/codegen@2.0.4:
+ resolution: {integrity: sha512-YyFaikqM5sH0ziFZCN3xDC7zeGaB/d0IUb9CATugHWbd1FRFwWwt4ld4OYMPWu5a3Xe01mGAULCdqhMlPl29Jg==}
+ dev: true
+
+ /@protobufjs/eventemitter@1.1.0:
+ resolution: {integrity: sha512-j9ednRT81vYJ9OfVuXG6ERSTdEL1xVsNgqpkxMsbIabzSo3goCjDIveeGv5d03om39ML71RdmrGNjG5SReBP/Q==}
+ dev: true
+
+ /@protobufjs/fetch@1.1.0:
+ resolution: {integrity: sha512-lljVXpqXebpsijW71PZaCYeIcE5on1w5DlQy5WH6GLbFryLUrBD4932W/E2BSpfRJWseIL4v/KPgBFxDOIdKpQ==}
+ dependencies:
+ '@protobufjs/aspromise': 1.1.2
+ '@protobufjs/inquire': 1.1.0
+ dev: true
+
+ /@protobufjs/float@1.0.2:
+ resolution: {integrity: sha512-Ddb+kVXlXst9d+R9PfTIxh1EdNkgoRe5tOX6t01f1lYWOvJnSPDBlG241QLzcyPdoNTsblLUdujGSE4RzrTZGQ==}
+ dev: true
+
+ /@protobufjs/inquire@1.1.0:
+ resolution: {integrity: sha512-kdSefcPdruJiFMVSbn801t4vFK7KB/5gd2fYvrxhuJYg8ILrmn9SKSX2tZdV6V+ksulWqS7aXjBcRXl3wHoD9Q==}
+ dev: true
+
+ /@protobufjs/path@1.1.2:
+ resolution: {integrity: sha512-6JOcJ5Tm08dOHAbdR3GrvP+yUUfkjG5ePsHYczMFLq3ZmMkAD98cDgcT2iA1lJ9NVwFd4tH/iSSoe44YWkltEA==}
+ dev: true
+
+ /@protobufjs/pool@1.1.0:
+ resolution: {integrity: sha512-0kELaGSIDBKvcgS4zkjz1PeddatrjYcmMWOlAuAPwAeccUrPHdUqo/J6LiymHHEiJT5NrF1UVwxY14f+fy4WQw==}
+ dev: true
+
+ /@protobufjs/utf8@1.1.0:
+ resolution: {integrity: sha512-Vvn3zZrhQZkkBE8LSuW3em98c0FwgO4nxzv6OdSxPKJIEKY2bGbHn+mhGIPerzI4twdxaP8/0+06HBpwf345Lw==}
+ dev: true
+
+ /@resolver-engine/core@0.3.3:
+ resolution: {integrity: sha512-eB8nEbKDJJBi5p5SrvrvILn4a0h42bKtbCTri3ZxCGt6UvoQyp7HnGOfki944bUjBSHKK3RvgfViHn+kqdXtnQ==}
+ dependencies:
+ debug: 3.2.7
+ is-url: 1.2.4
+ request: 2.88.2
+ transitivePeerDependencies:
+ - supports-color
+ dev: true
+
+ /@resolver-engine/fs@0.3.3:
+ resolution: {integrity: sha512-wQ9RhPUcny02Wm0IuJwYMyAG8fXVeKdmhm8xizNByD4ryZlx6PP6kRen+t/haF43cMfmaV7T3Cx6ChOdHEhFUQ==}
+ dependencies:
+ '@resolver-engine/core': 0.3.3
+ debug: 3.2.7
+ transitivePeerDependencies:
+ - supports-color
+ dev: true
+
+ /@resolver-engine/imports-fs@0.3.3:
+ resolution: {integrity: sha512-7Pjg/ZAZtxpeyCFlZR5zqYkz+Wdo84ugB5LApwriT8XFeQoLwGUj4tZFFvvCuxaNCcqZzCYbonJgmGObYBzyCA==}
+ dependencies:
+ '@resolver-engine/fs': 0.3.3
+ '@resolver-engine/imports': 0.3.3
+ debug: 3.2.7
+ transitivePeerDependencies:
+ - supports-color
+ dev: true
+
+ /@resolver-engine/imports@0.3.3:
+ resolution: {integrity: sha512-anHpS4wN4sRMwsAbMXhMfOD/y4a4Oo0Cw/5+rue7hSwGWsDOQaAU1ClK1OxjUC35/peazxEl8JaSRRS+Xb8t3Q==}
+ dependencies:
+ '@resolver-engine/core': 0.3.3
+ debug: 3.2.7
+ hosted-git-info: 2.8.9
+ path-browserify: 1.0.1
+ url: 0.11.4
+ transitivePeerDependencies:
+ - supports-color
+ dev: true
+
+ /@rtsao/scc@1.1.0:
+ resolution: {integrity: sha512-zt6OdqaDoOnJ1ZYsCYGt9YmWzDXl4vQdKTyJev62gFhRGKdx7mcT54V9KIjg+d2wi9EXsPvAPKe7i7WjfVWB8g==}
+ dev: true
+
+ /@rushstack/eslint-patch@1.14.1:
+ resolution: {integrity: sha512-jGTk8UD/RdjsNZW8qq10r0RBvxL8OWtoT+kImlzPDFilmozzM+9QmIJsmze9UiSBrFU45ZxhTYBypn9q9z/VfQ==}
+ dev: true
+
+ /@safe-global/api-kit@1.3.1:
+ resolution: {integrity: sha512-JKvCNs8p+42+N8pV2MIqoXlBLckTe5CKboVT7t9mTluuA66i5W8+Kr+B5j9D//EIU5vO7iSOOIYnJuA2ck4XRQ==}
+ dependencies:
+ '@ethersproject/abstract-signer': 5.8.0
+ '@safe-global/safe-core-sdk-types': 2.3.0
+ node-fetch: 2.7.0
+ transitivePeerDependencies:
+ - encoding
+ - supports-color
+ dev: true
+
+ /@safe-global/protocol-kit@1.3.0(ethers@5.8.0):
+ resolution: {integrity: sha512-zBhwHpaUggywmnR1Xm5RV22DpyjmVWYP3pnOl4rcf9LAc1k7IVmw6WIt2YVhHRaWGxVYMd4RitJX8Dx2+8eLZQ==}
+ dependencies:
+ '@ethersproject/address': 5.8.0
+ '@ethersproject/bignumber': 5.8.0
+ '@ethersproject/solidity': 5.8.0
+ '@safe-global/safe-deployments': 1.37.47
+ ethereumjs-util: 7.1.5
+ semver: 7.7.3
+ web3: 1.10.4
+ web3-core: 1.10.4
+ web3-utils: 1.10.4
+ zksync-web3: 0.14.4(ethers@5.8.0)
+ transitivePeerDependencies:
+ - bufferutil
+ - encoding
+ - ethers
+ - supports-color
+ - utf-8-validate
+ dev: true
+
+ /@safe-global/safe-core-sdk-types@2.3.0:
+ resolution: {integrity: sha512-dU0KkDV1KJNf11ajbUjWiSi4ygdyWfhk1M50lTJWUdCn1/2Bsb/hICM8LoEk6DCoFumxaoCet02SmYakXsW2CA==}
+ deprecated: 'WARNING: This project has been renamed to @safe-global/types-kit. Please, migrate from @safe-global/safe-core-sdk-types@5.1.0 to @safe-global/types-kit@1.0.0.'
+ dependencies:
+ '@ethersproject/bignumber': 5.8.0
+ '@ethersproject/contracts': 5.8.0
+ '@safe-global/safe-deployments': 1.37.47
+ web3-core: 1.10.4
+ web3-utils: 1.10.4
+ transitivePeerDependencies:
+ - encoding
+ - supports-color
+ dev: true
+
+ /@safe-global/safe-deployments@1.37.47:
+ resolution: {integrity: sha512-abxu9nmvjfDahCIFdrHw4ENZ1CD60z/bgrv5cV3+sygADU1vuh96jFumebo+6PR/Q5qz5glrQuLwEtZ8K/lvJQ==}
+ dependencies:
+ semver: 7.7.3
+ dev: true
+
+ /@scure/base@1.1.9:
+ resolution: {integrity: sha512-8YKhl8GHiNI/pU2VMaofa2Tor7PJRAjwQLBBuilkJ9L5+13yVbC7JO/wS7piioAvPSwR3JKM1IJ/u4xQzbcXKg==}
+ dev: true
+
+ /@scure/base@1.2.6:
+ resolution: {integrity: sha512-g/nm5FgUa//MCj1gV09zTJTaM6KBAHqLN907YVQqf7zC49+DcO4B1so4ZX07Ef10Twr6nuqYEH9GEggFXA4Fmg==}
+ dev: true
+
+ /@scure/bip32@1.1.5:
+ resolution: {integrity: sha512-XyNh1rB0SkEqd3tXcXMi+Xe1fvg+kUIcoRIEujP1Jgv7DqW2r9lg3Ah0NkFaCs9sTkQAQA8kw7xiRXzENi9Rtw==}
+ dependencies:
+ '@noble/hashes': 1.2.0
+ '@noble/secp256k1': 1.7.1
+ '@scure/base': 1.1.9
+ dev: true
+
+ /@scure/bip32@1.4.0:
+ resolution: {integrity: sha512-sVUpc0Vq3tXCkDGYVWGIZTRfnvu8LoTDaev7vbwh0omSvVORONr960MQWdKqJDCReIEmTj3PAr73O3aoxz7OPg==}
+ dependencies:
+ '@noble/curves': 1.4.2
+ '@noble/hashes': 1.4.0
+ '@scure/base': 1.1.9
+ dev: true
+
+ /@scure/bip32@1.7.0:
+ resolution: {integrity: sha512-E4FFX/N3f4B80AKWp5dP6ow+flD1LQZo/w8UnLGYZO674jS6YnYeepycOOksv+vLPSpgN35wgKgy+ybfTb2SMw==}
+ dependencies:
+ '@noble/curves': 1.9.7
+ '@noble/hashes': 1.8.0
+ '@scure/base': 1.2.6
+ dev: true
+
+ /@scure/bip39@1.1.1:
+ resolution: {integrity: sha512-t+wDck2rVkh65Hmv280fYdVdY25J9YeEUIgn2LG1WM6gxFkGzcksoDiUkWVpVp3Oex9xGC68JU2dSbUfwZ2jPg==}
+ dependencies:
+ '@noble/hashes': 1.2.0
+ '@scure/base': 1.1.9
+ dev: true
+
+ /@scure/bip39@1.2.1:
+ resolution: {integrity: sha512-Z3/Fsz1yr904dduJD0NpiyRHhRYHdcnyh73FZWiV+/qhWi83wNJ3NWolYqCEN+ZWsUz2TWwajJggcRE9r1zUYg==}
+ dependencies:
+ '@noble/hashes': 1.3.3
+ '@scure/base': 1.1.9
+ dev: true
+
+ /@scure/bip39@1.3.0:
+ resolution: {integrity: sha512-disdg7gHuTDZtY+ZdkmLpPCk7fxZSu3gBiEGuoC1XYxv9cGx3Z6cpTggCgW6odSOOIXCiDjuGejW+aJKCY/pIQ==}
+ dependencies:
+ '@noble/hashes': 1.4.0
+ '@scure/base': 1.1.9
+ dev: true
+
+ /@scure/bip39@1.6.0:
+ resolution: {integrity: sha512-+lF0BbLiJNwVlev4eKelw1WWLaiKXw7sSl8T6FvBlWkdX+94aGJ4o8XjUdlyhTCjd8c+B3KT3JfS8P0bLRNU6A==}
+ dependencies:
+ '@noble/hashes': 1.8.0
+ '@scure/base': 1.2.6
+ dev: true
+
+ /@sentry/core@5.30.0:
+ resolution: {integrity: sha512-TmfrII8w1PQZSZgPpUESqjB+jC6MvZJZdLtE/0hZ+SrnKhW3x5WlYLvTXZpcWePYBku7rl2wn1RZu6uT0qCTeg==}
+ engines: {node: '>=6'}
+ dependencies:
+ '@sentry/hub': 5.30.0
+ '@sentry/minimal': 5.30.0
+ '@sentry/types': 5.30.0
+ '@sentry/utils': 5.30.0
+ tslib: 1.14.1
+ dev: true
+
+ /@sentry/hub@5.30.0:
+ resolution: {integrity: sha512-2tYrGnzb1gKz2EkMDQcfLrDTvmGcQPuWxLnJKXJvYTQDGLlEvi2tWz1VIHjunmOvJrB5aIQLhm+dcMRwFZDCqQ==}
+ engines: {node: '>=6'}
+ dependencies:
+ '@sentry/types': 5.30.0
+ '@sentry/utils': 5.30.0
+ tslib: 1.14.1
+ dev: true
+
+ /@sentry/minimal@5.30.0:
+ resolution: {integrity: sha512-BwWb/owZKtkDX+Sc4zCSTNcvZUq7YcH3uAVlmh/gtR9rmUvbzAA3ewLuB3myi4wWRAMEtny6+J/FN/x+2wn9Xw==}
+ engines: {node: '>=6'}
+ dependencies:
+ '@sentry/hub': 5.30.0
+ '@sentry/types': 5.30.0
+ tslib: 1.14.1
+ dev: true
+
+ /@sentry/node@5.30.0:
+ resolution: {integrity: sha512-Br5oyVBF0fZo6ZS9bxbJZG4ApAjRqAnqFFurMVJJdunNb80brh7a5Qva2kjhm+U6r9NJAB5OmDyPkA1Qnt+QVg==}
+ engines: {node: '>=6'}
+ dependencies:
+ '@sentry/core': 5.30.0
+ '@sentry/hub': 5.30.0
+ '@sentry/tracing': 5.30.0
+ '@sentry/types': 5.30.0
+ '@sentry/utils': 5.30.0
+ cookie: 0.4.2
+ https-proxy-agent: 5.0.1
+ lru_map: 0.3.3
+ tslib: 1.14.1
+ transitivePeerDependencies:
+ - supports-color
+ dev: true
+
+ /@sentry/tracing@5.30.0:
+ resolution: {integrity: sha512-dUFowCr0AIMwiLD7Fs314Mdzcug+gBVo/+NCMyDw8tFxJkwWAKl7Qa2OZxLQ0ZHjakcj1hNKfCQJ9rhyfOl4Aw==}
+ engines: {node: '>=6'}
+ dependencies:
+ '@sentry/hub': 5.30.0
+ '@sentry/minimal': 5.30.0
+ '@sentry/types': 5.30.0
+ '@sentry/utils': 5.30.0
+ tslib: 1.14.1
+ dev: true
+
+ /@sentry/types@5.30.0:
+ resolution: {integrity: sha512-R8xOqlSTZ+htqrfteCWU5Nk0CDN5ApUTvrlvBuiH1DyP6czDZ4ktbZB0hAgBlVcK0U+qpD3ag3Tqqpa5Q67rPw==}
+ engines: {node: '>=6'}
+ dev: true
+
+ /@sentry/utils@5.30.0:
+ resolution: {integrity: sha512-zaYmoH0NWWtvnJjC9/CBseXMtKHm/tm40sz3YfJRxeQjyzRqNQPgivpd9R/oDJCYj999mzdW382p/qi2ypjLww==}
+ engines: {node: '>=6'}
+ dependencies:
+ '@sentry/types': 5.30.0
+ tslib: 1.14.1
+ dev: true
+
+ /@sinclair/typebox@0.27.8:
+ resolution: {integrity: sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==}
+ dev: true
+
+ /@sinclair/typebox@0.34.41:
+ resolution: {integrity: sha512-6gS8pZzSXdyRHTIqoqSVknxolr1kzfy4/CeDnrzsVz8TTIWUbOBr6gnzOmTYJ3eXQNh4IYHIGi5aIL7sOZ2G/g==}
+ dev: true
+
+ /@sindresorhus/is@4.6.0:
+ resolution: {integrity: sha512-t09vSN3MdfsyCHoFcTRCH/iUtG7OJ0CsjzB8cjAmKc/va/kIgeDI/TxsigdncE/4be734m0cvIYwNaV4i2XqAw==}
+ engines: {node: '>=10'}
+ dev: true
+
+ /@sindresorhus/is@5.6.0:
+ resolution: {integrity: sha512-TV7t8GKYaJWsn00tFDqBw8+Uqmr8A0fRU1tvTQhyZzGv0sJCGRQL3JGMI3ucuKo3XIZdUP+Lx7/gh2t3lewy7g==}
+ engines: {node: '>=14.16'}
+ dev: true
+
+ /@sinonjs/commons@3.0.1:
+ resolution: {integrity: sha512-K3mCHKQ9sVh8o1C9cxkwxaOmXoAMlDxC1mYyHrjqOWEcBjYr76t96zL2zlj5dUGZ3HSw240X1qgH3Mjf1yJWpQ==}
+ dependencies:
+ type-detect: 4.0.8
+ dev: true
+
+ /@sinonjs/fake-timers@10.3.0:
+ resolution: {integrity: sha512-V4BG07kuYSUkTCSBHG8G8TNhM+F19jXFWnQtzj+we8DrkpSBCee9Z3Ms8yiGer/dlmhe35/Xdgyo3/0rQKg7YA==}
+ dependencies:
+ '@sinonjs/commons': 3.0.1
+ dev: true
+
+ /@so-ric/colorspace@1.1.6:
+ resolution: {integrity: sha512-/KiKkpHNOBgkFJwu9sh48LkHSMYGyuTcSFK/qMBdnOAlrRJzRSXAOFB5qwzaVQuDl8wAvHVMkaASQDReTahxuw==}
+ dependencies:
+ color: 5.0.2
+ text-hex: 1.0.0
+ dev: true
+
+ /@solana-developers/helpers@2.8.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3):
+ resolution: {integrity: sha512-K3SjX3f0NbCGBcbN40vIMfTicYFNj8bkImcF32JxiR1YmsXu2scb3449bG1CRk/5JBSA0pP4p+lhGU1nc2mEVg==}
+ dependencies:
+ '@coral-xyz/anchor': 0.30.1(typescript@5.9.3)
+ '@solana/spl-token': 0.4.14(@solana/web3.js@1.98.4)(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3)
+ '@solana/spl-token-metadata': 0.1.6(@solana/web3.js@1.98.4)(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3)
+ '@solana/web3.js': 1.98.4(typescript@5.9.3)
+ bn.js: 5.2.2
+ bs58: 6.0.0
+ dotenv: 16.6.1
+ transitivePeerDependencies:
+ - bufferutil
+ - encoding
+ - fastestsmallesttextencoderdecoder
+ - typescript
+ - utf-8-validate
+ dev: true
+
+ /@solana-developers/helpers@2.8.1(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3):
+ resolution: {integrity: sha512-xvoOj+ewL18+h6fMrXp1vTss0WBLnhQHnBb6mMPfEQE32w0THlxm8OPXNUY8g4tREX7ugU5cDEP7c2teye1Z7A==}
+ dependencies:
+ '@coral-xyz/anchor': 0.30.1(typescript@5.9.3)
+ '@solana/spl-token': 0.4.14(@solana/web3.js@1.98.4)(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3)
+ '@solana/spl-token-metadata': 0.1.6(@solana/web3.js@1.98.4)(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3)
+ '@solana/web3.js': 1.98.4(typescript@5.9.3)
+ bn.js: 5.2.2
+ bs58: 6.0.0
+ dotenv: 16.6.1
+ transitivePeerDependencies:
+ - bufferutil
+ - encoding
+ - fastestsmallesttextencoderdecoder
+ - typescript
+ - utf-8-validate
+ dev: true
+
+ /@solana/buffer-layout-utils@0.2.0(typescript@5.9.3):
+ resolution: {integrity: sha512-szG4sxgJGktbuZYDg2FfNmkMi0DYQoVjN2h7ta1W1hPrwzarcFLBq9UpX1UjNXsNpT9dn+chgprtWGioUAr4/g==}
+ engines: {node: '>= 10'}
+ dependencies:
+ '@solana/buffer-layout': 4.0.1
+ '@solana/web3.js': 1.98.4(typescript@5.9.3)
+ bigint-buffer: 1.1.5
+ bignumber.js: 9.3.1
+ transitivePeerDependencies:
+ - bufferutil
+ - encoding
+ - typescript
+ - utf-8-validate
+ dev: true
+
+ /@solana/buffer-layout@4.0.1:
+ resolution: {integrity: sha512-E1ImOIAD1tBZFRdjeM4/pzTiTApC0AOBGwyAMS4fwIodCWArzJ3DWdoh8cKxeFM2fElkxBh2Aqts1BPC373rHA==}
+ engines: {node: '>=5.10'}
+ dependencies:
+ buffer: 6.0.3
+ dev: true
+
+ /@solana/codecs-core@2.0.0-rc.1(typescript@5.9.3):
+ resolution: {integrity: sha512-bauxqMfSs8EHD0JKESaNmNuNvkvHSuN3bbWAF5RjOfDu2PugxHrvRebmYauvSumZ3cTfQ4HJJX6PG5rN852qyQ==}
+ peerDependencies:
+ typescript: '>=5'
+ dependencies:
+ '@solana/errors': 2.0.0-rc.1(typescript@5.9.3)
+ typescript: 5.9.3
+ dev: true
+
+ /@solana/codecs-core@2.3.0(typescript@5.9.3):
+ resolution: {integrity: sha512-oG+VZzN6YhBHIoSKgS5ESM9VIGzhWjEHEGNPSibiDTxFhsFWxNaz8LbMDPjBUE69r9wmdGLkrQ+wVPbnJcZPvw==}
+ engines: {node: '>=20.18.0'}
+ peerDependencies:
+ typescript: '>=5.3.3'
+ dependencies:
+ '@solana/errors': 2.3.0(typescript@5.9.3)
+ typescript: 5.9.3
+ dev: true
+
+ /@solana/codecs-data-structures@2.0.0-rc.1(typescript@5.9.3):
+ resolution: {integrity: sha512-rinCv0RrAVJ9rE/rmaibWJQxMwC5lSaORSZuwjopSUE6T0nb/MVg6Z1siNCXhh/HFTOg0l8bNvZHgBcN/yvXog==}
+ peerDependencies:
+ typescript: '>=5'
+ dependencies:
+ '@solana/codecs-core': 2.0.0-rc.1(typescript@5.9.3)
+ '@solana/codecs-numbers': 2.0.0-rc.1(typescript@5.9.3)
+ '@solana/errors': 2.0.0-rc.1(typescript@5.9.3)
+ typescript: 5.9.3
+ dev: true
+
+ /@solana/codecs-numbers@2.0.0-rc.1(typescript@5.9.3):
+ resolution: {integrity: sha512-J5i5mOkvukXn8E3Z7sGIPxsThRCgSdgTWJDQeZvucQ9PT6Y3HiVXJ0pcWiOWAoQ3RX8e/f4I3IC+wE6pZiJzDQ==}
+ peerDependencies:
+ typescript: '>=5'
+ dependencies:
+ '@solana/codecs-core': 2.0.0-rc.1(typescript@5.9.3)
+ '@solana/errors': 2.0.0-rc.1(typescript@5.9.3)
+ typescript: 5.9.3
+ dev: true
+
+ /@solana/codecs-numbers@2.3.0(typescript@5.9.3):
+ resolution: {integrity: sha512-jFvvwKJKffvG7Iz9dmN51OGB7JBcy2CJ6Xf3NqD/VP90xak66m/Lg48T01u5IQ/hc15mChVHiBm+HHuOFDUrQg==}
+ engines: {node: '>=20.18.0'}
+ peerDependencies:
+ typescript: '>=5.3.3'
+ dependencies:
+ '@solana/codecs-core': 2.3.0(typescript@5.9.3)
+ '@solana/errors': 2.3.0(typescript@5.9.3)
+ typescript: 5.9.3
+ dev: true
+
+ /@solana/codecs-strings@2.0.0-rc.1(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3):
+ resolution: {integrity: sha512-9/wPhw8TbGRTt6mHC4Zz1RqOnuPTqq1Nb4EyuvpZ39GW6O2t2Q7Q0XxiB3+BdoEjwA2XgPw6e2iRfvYgqty44g==}
+ peerDependencies:
+ fastestsmallesttextencoderdecoder: ^1.0.22
+ typescript: '>=5'
+ dependencies:
+ '@solana/codecs-core': 2.0.0-rc.1(typescript@5.9.3)
+ '@solana/codecs-numbers': 2.0.0-rc.1(typescript@5.9.3)
+ '@solana/errors': 2.0.0-rc.1(typescript@5.9.3)
+ fastestsmallesttextencoderdecoder: 1.0.22
+ typescript: 5.9.3
+ dev: true
+
+ /@solana/codecs@2.0.0-rc.1(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3):
+ resolution: {integrity: sha512-qxoR7VybNJixV51L0G1RD2boZTcxmwUWnKCaJJExQ5qNKwbpSyDdWfFJfM5JhGyKe9DnPVOZB+JHWXnpbZBqrQ==}
+ peerDependencies:
+ typescript: '>=5'
+ dependencies:
+ '@solana/codecs-core': 2.0.0-rc.1(typescript@5.9.3)
+ '@solana/codecs-data-structures': 2.0.0-rc.1(typescript@5.9.3)
+ '@solana/codecs-numbers': 2.0.0-rc.1(typescript@5.9.3)
+ '@solana/codecs-strings': 2.0.0-rc.1(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3)
+ '@solana/options': 2.0.0-rc.1(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3)
+ typescript: 5.9.3
+ transitivePeerDependencies:
+ - fastestsmallesttextencoderdecoder
+ dev: true
+
+ /@solana/errors@2.0.0-rc.1(typescript@5.9.3):
+ resolution: {integrity: sha512-ejNvQ2oJ7+bcFAYWj225lyRkHnixuAeb7RQCixm+5mH4n1IA4Qya/9Bmfy5RAAHQzxK43clu3kZmL5eF9VGtYQ==}
+ hasBin: true
+ peerDependencies:
+ typescript: '>=5'
+ dependencies:
+ chalk: 5.6.2
+ commander: 12.1.0
+ typescript: 5.9.3
+ dev: true
+
+ /@solana/errors@2.3.0(typescript@5.9.3):
+ resolution: {integrity: sha512-66RI9MAbwYV0UtP7kGcTBVLxJgUxoZGm8Fbc0ah+lGiAw17Gugco6+9GrJCV83VyF2mDWyYnYM9qdI3yjgpnaQ==}
+ engines: {node: '>=20.18.0'}
+ hasBin: true
+ peerDependencies:
+ typescript: '>=5.3.3'
+ dependencies:
+ chalk: 5.6.2
+ commander: 14.0.2
+ typescript: 5.9.3
+ dev: true
+
+ /@solana/options@2.0.0-rc.1(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3):
+ resolution: {integrity: sha512-mLUcR9mZ3qfHlmMnREdIFPf9dpMc/Bl66tLSOOWxw4ml5xMT2ohFn7WGqoKcu/UHkT9CrC6+amEdqCNvUqI7AA==}
+ peerDependencies:
+ typescript: '>=5'
+ dependencies:
+ '@solana/codecs-core': 2.0.0-rc.1(typescript@5.9.3)
+ '@solana/codecs-data-structures': 2.0.0-rc.1(typescript@5.9.3)
+ '@solana/codecs-numbers': 2.0.0-rc.1(typescript@5.9.3)
+ '@solana/codecs-strings': 2.0.0-rc.1(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3)
+ '@solana/errors': 2.0.0-rc.1(typescript@5.9.3)
+ typescript: 5.9.3
+ transitivePeerDependencies:
+ - fastestsmallesttextencoderdecoder
+ dev: true
+
+ /@solana/spl-token-group@0.0.7(@solana/web3.js@1.98.4)(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3):
+ resolution: {integrity: sha512-V1N/iX7Cr7H0uazWUT2uk27TMqlqedpXHRqqAbVO2gvmJyT0E0ummMEAVQeXZ05ZhQ/xF39DLSdBp90XebWEug==}
+ engines: {node: '>=16'}
+ peerDependencies:
+ '@solana/web3.js': ^1.98.0
+ dependencies:
+ '@solana/codecs': 2.0.0-rc.1(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3)
+ '@solana/web3.js': 1.98.4(typescript@5.9.3)
+ transitivePeerDependencies:
+ - fastestsmallesttextencoderdecoder
+ - typescript
+ dev: true
+
+ /@solana/spl-token-metadata@0.1.6(@solana/web3.js@1.98.4)(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3):
+ resolution: {integrity: sha512-7sMt1rsm/zQOQcUWllQX9mD2O6KhSAtY1hFR2hfFwgqfFWzSY9E9GDvFVNYUI1F0iQKcm6HmePU9QbKRXTEBiA==}
+ engines: {node: '>=16'}
+ peerDependencies:
+ '@solana/web3.js': ^1.98.0
+ dependencies:
+ '@solana/codecs': 2.0.0-rc.1(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3)
+ '@solana/web3.js': 1.98.4(typescript@5.9.3)
+ transitivePeerDependencies:
+ - fastestsmallesttextencoderdecoder
+ - typescript
+ dev: true
+
+ /@solana/spl-token@0.3.11(@solana/web3.js@1.98.4)(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3):
+ resolution: {integrity: sha512-bvohO3rIMSVL24Pb+I4EYTJ6cL82eFpInEXD/I8K8upOGjpqHsKUoAempR/RnUlI1qSFNyFlWJfu6MNUgfbCQQ==}
+ engines: {node: '>=16'}
+ peerDependencies:
+ '@solana/web3.js': ^1.98.0
+ dependencies:
+ '@solana/buffer-layout': 4.0.1
+ '@solana/buffer-layout-utils': 0.2.0(typescript@5.9.3)
+ '@solana/spl-token-metadata': 0.1.6(@solana/web3.js@1.98.4)(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3)
+ '@solana/web3.js': 1.98.4(typescript@5.9.3)
+ buffer: 6.0.3
+ transitivePeerDependencies:
+ - bufferutil
+ - encoding
+ - fastestsmallesttextencoderdecoder
+ - typescript
+ - utf-8-validate
+ dev: true
+
+ /@solana/spl-token@0.4.14(@solana/web3.js@1.98.4)(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3):
+ resolution: {integrity: sha512-u09zr96UBpX4U685MnvQsNzlvw9TiY005hk1vJmJr7gMJldoPG1eYU5/wNEyOA5lkMLiR/gOi9SFD4MefOYEsA==}
+ engines: {node: '>=16'}
+ peerDependencies:
+ '@solana/web3.js': ^1.98.0
+ dependencies:
+ '@solana/buffer-layout': 4.0.1
+ '@solana/buffer-layout-utils': 0.2.0(typescript@5.9.3)
+ '@solana/spl-token-group': 0.0.7(@solana/web3.js@1.98.4)(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3)
+ '@solana/spl-token-metadata': 0.1.6(@solana/web3.js@1.98.4)(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3)
+ '@solana/web3.js': 1.98.4(typescript@5.9.3)
+ buffer: 6.0.3
+ transitivePeerDependencies:
+ - bufferutil
+ - encoding
+ - fastestsmallesttextencoderdecoder
+ - typescript
+ - utf-8-validate
+ dev: true
+
+ /@solana/web3.js@1.98.4(typescript@5.9.3):
+ resolution: {integrity: sha512-vv9lfnvjUsRiq//+j5pBdXig0IQdtzA0BRZ3bXEP4KaIyF1CcaydWqgyzQgfZMNIsWNWmG+AUHwPy4AHOD6gpw==}
+ dependencies:
+ '@babel/runtime': 7.28.4
+ '@noble/curves': 1.9.7
+ '@noble/hashes': 1.8.0
+ '@solana/buffer-layout': 4.0.1
+ '@solana/codecs-numbers': 2.3.0(typescript@5.9.3)
+ agentkeepalive: 4.6.0
+ bn.js: 5.2.2
+ borsh: 0.7.0
+ bs58: 4.0.1
+ buffer: 6.0.3
+ fast-stable-stringify: 1.0.0
+ jayson: 4.2.0
+ node-fetch: 2.7.0
+ rpc-websockets: 9.2.0
+ superstruct: 2.0.2
+ transitivePeerDependencies:
+ - bufferutil
+ - encoding
+ - typescript
+ - utf-8-validate
+ dev: true
+
+ /@solidity-parser/parser@0.18.0:
+ resolution: {integrity: sha512-yfORGUIPgLck41qyN7nbwJRAx17/jAIXCTanHOJZhB6PJ1iAk/84b/xlsVKFSyNyLXIj0dhppoE0+CRws7wlzA==}
+ dev: true
+
+ /@solidity-parser/parser@0.20.2:
+ resolution: {integrity: sha512-rbu0bzwNvMcwAjH86hiEAcOeRI2EeK8zCkHDrFykh/Al8mvJeFmjy3UrE7GYQjNwOgbGUUtCn5/k8CB8zIu7QA==}
+ dev: true
+
+ /@sqds/sdk@2.0.4(typescript@5.9.3):
+ resolution: {integrity: sha512-SmwqL55GW9teIPRqYBVUp1tNp3Tfd8olPShas/+5L48XaUHBDEFNuDA9E8KKbIZoB34WSLdgyq0tIJLlhMMHnA==}
+ dependencies:
+ '@coral-xyz/anchor': 0.26.0(typescript@5.9.3)
+ '@solana/web3.js': 1.98.4(typescript@5.9.3)
+ bn.js: 5.2.2
+ transitivePeerDependencies:
+ - bufferutil
+ - encoding
+ - typescript
+ - utf-8-validate
+ dev: true
+
+ /@suchipi/femver@1.0.0:
+ resolution: {integrity: sha512-bprE8+K5V+DPX7q2e2K57ImqNBdfGHDIWaGI5xHxZoxbKOuQZn4wzPiUxOAHnsUr3w3xHrWXwN7gnG/iIuEMIg==}
+ dev: true
+
+ /@swc/core-darwin-arm64@1.14.0:
+ resolution: {integrity: sha512-uHPC8rlCt04nvYNczWzKVdgnRhxCa3ndKTBBbBpResOZsRmiwRAvByIGh599j+Oo6Z5eyTPrgY+XfJzVmXnN7Q==}
+ engines: {node: '>=10'}
+ cpu: [arm64]
+ os: [darwin]
+ requiresBuild: true
+ dev: true
+ optional: true
+
+ /@swc/core-darwin-x64@1.14.0:
+ resolution: {integrity: sha512-2SHrlpl68vtePRknv9shvM9YKKg7B9T13tcTg9aFCwR318QTYo+FzsKGmQSv9ox/Ua0Q2/5y2BNjieffJoo4nA==}
+ engines: {node: '>=10'}
+ cpu: [x64]
+ os: [darwin]
+ requiresBuild: true
+ dev: true
+ optional: true
+
+ /@swc/core-linux-arm-gnueabihf@1.14.0:
+ resolution: {integrity: sha512-SMH8zn01dxt809svetnxpeg/jWdpi6dqHKO3Eb11u4OzU2PK7I5uKS6gf2hx5LlTbcJMFKULZiVwjlQLe8eqtg==}
+ engines: {node: '>=10'}
+ cpu: [arm]
+ os: [linux]
+ requiresBuild: true
+ dev: true
+ optional: true
+
+ /@swc/core-linux-arm64-gnu@1.14.0:
+ resolution: {integrity: sha512-q2JRu2D8LVqGeHkmpVCljVNltG0tB4o4eYg+dElFwCS8l2Mnt9qurMCxIeo9mgoqz0ax+k7jWtIRHktnVCbjvQ==}
+ engines: {node: '>=10'}
+ cpu: [arm64]
+ os: [linux]
+ requiresBuild: true
+ dev: true
+ optional: true
+
+ /@swc/core-linux-arm64-musl@1.14.0:
+ resolution: {integrity: sha512-uofpVoPCEUjYIv454ZEZ3sLgMD17nIwlz2z7bsn7rl301Kt/01umFA7MscUovFfAK2IRGck6XB+uulMu6aFhKQ==}
+ engines: {node: '>=10'}
+ cpu: [arm64]
+ os: [linux]
+ requiresBuild: true
+ dev: true
+ optional: true
+
+ /@swc/core-linux-x64-gnu@1.14.0:
+ resolution: {integrity: sha512-quTTx1Olm05fBfv66DEBuOsOgqdypnZ/1Bh3yGXWY7ANLFeeRpCDZpljD9BSjdsNdPOlwJmEUZXMHtGm3v1TZQ==}
+ engines: {node: '>=10'}
+ cpu: [x64]
+ os: [linux]
+ requiresBuild: true
+ dev: true
+ optional: true
+
+ /@swc/core-linux-x64-musl@1.14.0:
+ resolution: {integrity: sha512-caaNAu+aIqT8seLtCf08i8C3/UC5ttQujUjejhMcuS1/LoCKtNiUs4VekJd2UGt+pyuuSrQ6dKl8CbCfWvWeXw==}
+ engines: {node: '>=10'}
+ cpu: [x64]
+ os: [linux]
+ requiresBuild: true
+ dev: true
+ optional: true
+
+ /@swc/core-win32-arm64-msvc@1.14.0:
+ resolution: {integrity: sha512-EeW3jFlT3YNckJ6V/JnTfGcX7UHGyh6/AiCPopZ1HNaGiXVCKHPpVQZicmtyr/UpqxCXLrTgjHOvyMke7YN26A==}
+ engines: {node: '>=10'}
+ cpu: [arm64]
+ os: [win32]
+ requiresBuild: true
+ dev: true
+ optional: true
+
+ /@swc/core-win32-ia32-msvc@1.14.0:
+ resolution: {integrity: sha512-dPai3KUIcihV5hfoO4QNQF5HAaw8+2bT7dvi8E5zLtecW2SfL3mUZipzampXq5FHll0RSCLzlrXnSx+dBRZIIQ==}
+ engines: {node: '>=10'}
+ cpu: [ia32]
+ os: [win32]
+ requiresBuild: true
+ dev: true
+ optional: true
+
+ /@swc/core-win32-x64-msvc@1.14.0:
+ resolution: {integrity: sha512-nm+JajGrTqUA6sEHdghDlHMNfH1WKSiuvljhdmBACW4ta4LC3gKurX2qZuiBARvPkephW9V/i5S8QPY1PzFEqg==}
+ engines: {node: '>=10'}
+ cpu: [x64]
+ os: [win32]
+ requiresBuild: true
+ dev: true
+ optional: true
+
+ /@swc/core@1.14.0:
+ resolution: {integrity: sha512-oExhY90bes5pDTVrei0xlMVosTxwd/NMafIpqsC4dMbRYZ5KB981l/CX8tMnGsagTplj/RcG9BeRYmV6/J5m3w==}
+ engines: {node: '>=10'}
+ requiresBuild: true
+ peerDependencies:
+ '@swc/helpers': '>=0.5.17'
+ peerDependenciesMeta:
+ '@swc/helpers':
+ optional: true
+ dependencies:
+ '@swc/counter': 0.1.3
+ '@swc/types': 0.1.25
+ optionalDependencies:
+ '@swc/core-darwin-arm64': 1.14.0
+ '@swc/core-darwin-x64': 1.14.0
+ '@swc/core-linux-arm-gnueabihf': 1.14.0
+ '@swc/core-linux-arm64-gnu': 1.14.0
+ '@swc/core-linux-arm64-musl': 1.14.0
+ '@swc/core-linux-x64-gnu': 1.14.0
+ '@swc/core-linux-x64-musl': 1.14.0
+ '@swc/core-win32-arm64-msvc': 1.14.0
+ '@swc/core-win32-ia32-msvc': 1.14.0
+ '@swc/core-win32-x64-msvc': 1.14.0
+ dev: true
+
+ /@swc/counter@0.1.3:
+ resolution: {integrity: sha512-e2BR4lsJkkRlKZ/qCHPw9ZaSxc0MVUd7gtbtaB7aMvHeJVYe8sOB8DBZkP2DtISHGSku9sCK6T6cnY0CtXrOCQ==}
+ dev: true
+
+ /@swc/helpers@0.5.17:
+ resolution: {integrity: sha512-5IKx/Y13RsYd+sauPb2x+U/xZikHjolzfuDgTAl/Tdf3Q8rslRvC19NKDLgAJQ6wsqADk10ntlv08nPFw/gO/A==}
+ dependencies:
+ tslib: 2.8.1
+ dev: true
+
+ /@swc/jest@0.2.39(@swc/core@1.14.0):
+ resolution: {integrity: sha512-eyokjOwYd0Q8RnMHri+8/FS1HIrIUKK/sRrFp8c1dThUOfNeCWbLmBP1P5VsKdvmkd25JaH+OKYwEYiAYg9YAA==}
+ engines: {npm: '>= 7.0.0'}
+ peerDependencies:
+ '@swc/core': '*'
+ dependencies:
+ '@jest/create-cache-key-function': 30.2.0
+ '@swc/core': 1.14.0
+ '@swc/counter': 0.1.3
+ jsonc-parser: 3.3.1
+ dev: true
+
+ /@swc/types@0.1.25:
+ resolution: {integrity: sha512-iAoY/qRhNH8a/hBvm3zKj9qQ4oc2+3w1unPJa2XvTK3XjeLXtzcCingVPw/9e5mn1+0yPqxcBGp9Jf0pkfMb1g==}
+ dependencies:
+ '@swc/counter': 0.1.3
+ dev: true
+
+ /@szmarczak/http-timer@4.0.6:
+ resolution: {integrity: sha512-4BAffykYOgO+5nzBWYwE3W90sBgLJoUPRWWcL8wlyiM8IB8ipJz3UMJ9KXQd1RKQXpKp8Tutn80HZtWsu2u76w==}
+ engines: {node: '>=10'}
+ dependencies:
+ defer-to-connect: 2.0.1
+ dev: true
+
+ /@szmarczak/http-timer@5.0.1:
+ resolution: {integrity: sha512-+PmQX0PiAYPMeVYe237LJAYvOMYW1j2rH5YROyS3b4CTVJum34HfRvKvAzozHAQG0TnHNdUfY9nCeUyRAs//cw==}
+ engines: {node: '>=14.16'}
+ dependencies:
+ defer-to-connect: 2.0.1
+ dev: true
+
+ /@ton/core@0.59.1(@ton/crypto@3.3.0):
+ resolution: {integrity: sha512-SxFBAvutYJaIllTkv82vbHTJhJI6NxzqUhi499CDEjJEZ9i6i9lHJiK2df4dlLAb/4SiWX6+QUzESkK4DEdnCw==}
+ peerDependencies:
+ '@ton/crypto': '>=3.2.0'
+ dependencies:
+ '@ton/crypto': 3.3.0
+ symbol.inspect: 1.0.1
+ dev: true
+
+ /@ton/crypto-primitives@2.1.0:
+ resolution: {integrity: sha512-PQesoyPgqyI6vzYtCXw4/ZzevePc4VGcJtFwf08v10OevVJHVfW238KBdpj1kEDQkxWLeuNHEpTECNFKnP6tow==}
+ dependencies:
+ jssha: 3.2.0
+ dev: true
+
+ /@ton/crypto@3.3.0:
+ resolution: {integrity: sha512-/A6CYGgA/H36OZ9BbTaGerKtzWp50rg67ZCH2oIjV1NcrBaCK9Z343M+CxedvM7Haf3f/Ee9EhxyeTp0GKMUpA==}
+ dependencies:
+ '@ton/crypto-primitives': 2.1.0
+ jssha: 3.2.0
+ tweetnacl: 1.0.3
+ dev: true
+
+ /@ton/ton@15.1.0(@ton/core@0.59.1)(@ton/crypto@3.3.0):
+ resolution: {integrity: sha512-almetcfTu7jLjcNcEEPB7wAc8yl90ES1M//sOr1QE+kv7RbmEvMkaPSc7kFxzs10qrjIPKxlodBJlMSWP5LuVQ==}
+ peerDependencies:
+ '@ton/core': '>=0.59.0'
+ '@ton/crypto': '>=3.2.0'
+ dependencies:
+ '@ton/core': 0.59.1(@ton/crypto@3.3.0)
+ '@ton/crypto': 3.3.0
+ axios: 1.13.1
+ dataloader: 2.2.3
+ symbol.inspect: 1.0.1
+ teslabot: 1.5.0
+ zod: 3.25.76
+ transitivePeerDependencies:
+ - debug
+ dev: true
+
+ /@tronweb3/google-protobuf@3.21.4:
+ resolution: {integrity: sha512-joxgV4esCdyZ921AprMIG1T7HjkypquhbJ5qJti/priCBJhRE1z9GOxIEMvayxSVSRbMGIoJNE0Knrg3vpwM1w==}
+ deprecated: This package is deprecated. Please use the official package google-protobuf instead.
+ dev: true
+
+ /@trufflesuite/bigint-buffer@1.1.9:
+ resolution: {integrity: sha512-bdM5cEGCOhDSwminryHJbRmXc1x7dPKg6Pqns3qyTwFlxsqUgxE29lsERS3PlIW1HTjoIGMUqsk1zQQwST1Yxw==}
+ engines: {node: '>= 10.0.0'}
+ requiresBuild: true
+ dependencies:
+ node-gyp-build: 4.3.0
+ dev: true
+ optional: true
+
+ /@tsconfig/node10@1.0.11:
+ resolution: {integrity: sha512-DcRjDCujK/kCk/cUe8Xz8ZSpm8mS3mNNpta+jGCA6USEDfktlNvm1+IuZ9eTcDbNk41BHwpHHeW+N1lKCz4zOw==}
+ dev: true
+
+ /@tsconfig/node12@1.0.11:
+ resolution: {integrity: sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==}
+ dev: true
+
+ /@tsconfig/node14@1.0.3:
+ resolution: {integrity: sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==}
+ dev: true
+
+ /@tsconfig/node16@1.0.4:
+ resolution: {integrity: sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA==}
+ dev: true
+
+ /@tybys/wasm-util@0.10.1:
+ resolution: {integrity: sha512-9tTaPJLSiejZKx+Bmog4uSubteqTvFrVrURwkmHixBo0G4seD0zUxp98E1DzUBJxLQ3NPwXrGKDiVjwx/DpPsg==}
+ requiresBuild: true
+ dependencies:
+ tslib: 2.8.1
+ dev: true
+ optional: true
+
+ /@typechain/ethers-v5@10.2.1(@ethersproject/abi@5.8.0)(@ethersproject/providers@5.8.0)(ethers@5.8.0)(typechain@8.3.2)(typescript@5.9.3):
+ resolution: {integrity: sha512-n3tQmCZjRE6IU4h6lqUGiQ1j866n5MTCBJreNEHHVWXa2u9GJTaeYyU1/k+1qLutkyw+sS6VAN+AbeiTqsxd/A==}
+ peerDependencies:
+ '@ethersproject/abi': ^5.0.0
+ '@ethersproject/providers': ^5.0.0
+ ethers: ^5.7.2
+ typechain: ^8.1.1
+ typescript: '>=4.3.0'
+ dependencies:
+ '@ethersproject/abi': 5.8.0
+ '@ethersproject/providers': 5.8.0
+ ethers: 5.8.0
+ lodash: 4.17.21
+ ts-essentials: 7.0.3(typescript@5.9.3)
+ typechain: 8.3.2(typescript@5.9.3)
+ typescript: 5.9.3
+ dev: true
+
+ /@types/abstract-leveldown@7.2.5:
+ resolution: {integrity: sha512-/2B0nQF4UdupuxeKTJA2+Rj1D+uDemo6P4kMwKCpbfpnzeVaWSELTsAw4Lxn3VJD6APtRrZOCuYo+4nHUQfTfg==}
+ dev: true
+
+ /@types/babel__core@7.20.5:
+ resolution: {integrity: sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==}
+ dependencies:
+ '@babel/parser': 7.28.5
+ '@babel/types': 7.28.5
+ '@types/babel__generator': 7.27.0
+ '@types/babel__template': 7.4.4
+ '@types/babel__traverse': 7.28.0
+ dev: true
+
+ /@types/babel__generator@7.27.0:
+ resolution: {integrity: sha512-ufFd2Xi92OAVPYsy+P4n7/U7e68fex0+Ee8gSG9KX7eo084CWiQ4sdxktvdl0bOPupXtVJPY19zk6EwWqUQ8lg==}
+ dependencies:
+ '@babel/types': 7.28.5
+ dev: true
+
+ /@types/babel__template@7.4.4:
+ resolution: {integrity: sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==}
+ dependencies:
+ '@babel/parser': 7.28.5
+ '@babel/types': 7.28.5
+ dev: true
+
+ /@types/babel__traverse@7.28.0:
+ resolution: {integrity: sha512-8PvcXf70gTDZBgt9ptxJ8elBeBjcLOAcOtoO/mPJjtji1+CdGbHgm77om1GrsPxsiE+uXIpNSK64UYaIwQXd4Q==}
+ dependencies:
+ '@babel/types': 7.28.5
+ dev: true
+
+ /@types/bn.js@4.11.6:
+ resolution: {integrity: sha512-pqr857jrp2kPuO9uRjZ3PwnJTjoQy+fcdxvBTvHm6dkmEL9q+hDD/2j/0ELOBPtPnS8LjCX0gI9nbl8lVkadpg==}
+ dependencies:
+ '@types/node': 18.18.14
+ dev: true
+
+ /@types/bn.js@5.2.0:
+ resolution: {integrity: sha512-DLbJ1BPqxvQhIGbeu8VbUC1DiAiahHtAYvA0ZEAa4P31F7IaArc8z3C3BRQdWX4mtLQuABG4yzp76ZrS02Ui1Q==}
+ dependencies:
+ '@types/node': 18.18.14
+ dev: true
+
+ /@types/cacheable-request@6.0.3:
+ resolution: {integrity: sha512-IQ3EbTzGxIigb1I3qPZc1rWJnH0BmSKv5QYTalEwweFvyBDLSAe24zP0le/hyi7ecGfZVlIVAg4BZqb8WBwKqw==}
+ dependencies:
+ '@types/http-cache-semantics': 4.0.4
+ '@types/keyv': 3.1.4
+ '@types/node': 18.18.14
+ '@types/responselike': 1.0.3
+ dev: true
+
+ /@types/chai@4.3.20:
+ resolution: {integrity: sha512-/pC9HAB5I/xMlc5FP77qjCnI16ChlJfW0tGa0IUcFn38VJrTV6DeZ60NU5KZBtaOZqjdpwTWohz5HU1RrhiYxQ==}
+ dev: true
+
+ /@types/connect@3.4.38:
+ resolution: {integrity: sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug==}
+ dependencies:
+ '@types/node': 18.18.14
+ dev: true
+
+ /@types/graceful-fs@4.1.9:
+ resolution: {integrity: sha512-olP3sd1qOEe5dXTSaFvQG+02VdRXcdytWLAZsAq1PecU8uqQAhkrnbli7DagjtXKW/Bl7YJbUsa8MPcuc8LHEQ==}
+ dependencies:
+ '@types/node': 18.18.14
+ dev: true
+
+ /@types/http-cache-semantics@4.0.4:
+ resolution: {integrity: sha512-1m0bIFVc7eJWyve9S0RnuRgcQqF/Xd5QsUZAZeQFr1Q3/p9JWoQQEqmVy+DPTNpGXwhgIetAoYF8JSc33q29QA==}
+ dev: true
+
+ /@types/istanbul-lib-coverage@2.0.6:
+ resolution: {integrity: sha512-2QF/t/auWm0lsy8XtKVPG19v3sSOQlJe/YHZgfjb/KBBHOGSV+J2q/S671rcq9uTBrLAXmZpqJiaQbMT+zNU1w==}
+ dev: true
+
+ /@types/istanbul-lib-report@3.0.3:
+ resolution: {integrity: sha512-NQn7AHQnk/RSLOxrBbGyJM/aVQ+pjj5HCgasFxc0K/KhoATfQ/47AyUl15I2yBUpihjmas+a+VJBOqecrFH+uA==}
+ dependencies:
+ '@types/istanbul-lib-coverage': 2.0.6
+ dev: true
+
+ /@types/istanbul-reports@3.0.4:
+ resolution: {integrity: sha512-pk2B1NWalF9toCRu6gjBzR69syFjP4Od8WRAX+0mmf9lAjCRicLOWc+ZrxZHx/0XRjotgkF9t6iaMJ+aXcOdZQ==}
+ dependencies:
+ '@types/istanbul-lib-report': 3.0.3
+ dev: true
+
+ /@types/jest@29.5.14:
+ resolution: {integrity: sha512-ZN+4sdnLUbo8EVvVc2ao0GFW6oVrQRPn4K2lglySj7APvSrgzxHiNNK99us4WDMi57xxA2yggblIAMNhXOotLQ==}
+ dependencies:
+ expect: 29.7.0
+ pretty-format: 29.7.0
+ dev: true
+
+ /@types/json-schema@7.0.15:
+ resolution: {integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==}
+ dev: true
+
+ /@types/json5@0.0.29:
+ resolution: {integrity: sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==}
+ dev: true
+
+ /@types/keyv@3.1.4:
+ resolution: {integrity: sha512-BQ5aZNSCpj7D6K2ksrRCTmKRLEpnPvWDiLPfoGyhZ++8YtiK9d/3DBKPJgry359X/P1PfruyYwvnvwFjuEiEIg==}
+ dependencies:
+ '@types/node': 18.18.14
+ dev: true
+
+ /@types/level-errors@3.0.2:
+ resolution: {integrity: sha512-gyZHbcQ2X5hNXf/9KS2qGEmgDe9EN2WDM3rJ5Ele467C0nA1sLhtmv1bZiPMDYfAYCfPWft0uQIaTvXbASSTRA==}
+ dev: true
+
+ /@types/levelup@4.3.3:
+ resolution: {integrity: sha512-K+OTIjJcZHVlZQN1HmU64VtrC0jC3dXWQozuEIR9zVvltIk90zaGPM2AgT+fIkChpzHhFE3YnvFLCbLtzAmexA==}
+ dependencies:
+ '@types/abstract-leveldown': 7.2.5
+ '@types/level-errors': 3.0.2
+ '@types/node': 18.18.14
+ dev: true
+
+ /@types/mkdirp@0.5.2:
+ resolution: {integrity: sha512-U5icWpv7YnZYGsN4/cmh3WD2onMY0aJIiTE6+51TwJCttdHvtCYmkBNOobHlXwrJRL0nkH9jH4kD+1FAdMN4Tg==}
+ dependencies:
+ '@types/node': 18.18.14
+ dev: true
+
+ /@types/mocha@10.0.10:
+ resolution: {integrity: sha512-xPyYSz1cMPnJQhl0CLMH68j3gprKZaTjG3s5Vi+fDgx+uhG9NOXwbVt52eFS8ECyXhyKcjDLCBEqBExKuiZb7Q==}
+ dev: true
+
+ /@types/node-fetch@2.6.13:
+ resolution: {integrity: sha512-QGpRVpzSaUs30JBSGPjOg4Uveu384erbHBoT1zeONvyCfwQxIkUshLAOqN/k9EjGviPRmWTTe6aH2qySWKTVSw==}
+ dependencies:
+ '@types/node': 18.18.14
+ form-data: 4.0.4
+ dev: true
+
+ /@types/node@11.11.6:
+ resolution: {integrity: sha512-Exw4yUWMBXM3X+8oqzJNRqZSwUAaS4+7NdvHqQuFi/d+synz++xmX3QIf+BFqneW8N31R8Ky+sikfZUXq07ggQ==}
+ dev: true
+
+ /@types/node@12.20.55:
+ resolution: {integrity: sha512-J8xLz7q2OFulZ2cyGTLE1TbbZcjpno7FaN6zdJNrgAdrJ+DZzh/uFR6YrTb4C+nXakvud8Q4+rbhoIWlYQbUFQ==}
+ dev: true
+
+ /@types/node@18.18.14:
+ resolution: {integrity: sha512-iSOeNeXYNYNLLOMDSVPvIFojclvMZ/HDY2dU17kUlcsOsSQETbWIslJbYLZgA+ox8g2XQwSHKTkght1a5X26lQ==}
+ dependencies:
+ undici-types: 5.26.5
+ dev: true
+
+ /@types/pbkdf2@3.1.2:
+ resolution: {integrity: sha512-uRwJqmiXmh9++aSu1VNEn3iIxWOhd8AHXNSdlaLfdAAdSTY9jYVeGWnzejM3dvrkbqE3/hyQkQQ29IFATEGlew==}
+ dependencies:
+ '@types/node': 18.18.14
+ dev: true
+
+ /@types/prettier@2.7.3:
+ resolution: {integrity: sha512-+68kP9yzs4LMp7VNh8gdzMSPZFL44MLGqiHWvttYJe+6qnuVr4Ek9wSBQoveqY/r+LwjCcU29kNVkidwim+kYA==}
+ dev: true
+
+ /@types/qs@6.14.0:
+ resolution: {integrity: sha512-eOunJqu0K1923aExK6y8p6fsihYEn/BYuQ4g0CxAAgFc4b/ZLN4CrsRZ55srTdqoiLzU2B2evC+apEIxprEzkQ==}
+ dev: true
+
+ /@types/responselike@1.0.3:
+ resolution: {integrity: sha512-H/+L+UkTV33uf49PH5pCAUBVPNj2nDBXTN+qS1dOwyyg24l3CcicicCA7ca+HMvJBZcFgl5r8e+RR6elsb4Lyw==}
+ dependencies:
+ '@types/node': 18.18.14
+ dev: true
+
+ /@types/secp256k1@4.0.7:
+ resolution: {integrity: sha512-Rcvjl6vARGAKRO6jHeKMatGrvOMGrR/AR11N1x2LqintPCyDZ7NBhrh238Z2VZc7aM7KIwnFpFQ7fnfK4H/9Qw==}
+ dependencies:
+ '@types/node': 18.18.14
+ dev: true
+
+ /@types/semver@7.7.1:
+ resolution: {integrity: sha512-FmgJfu+MOcQ370SD0ev7EI8TlCAfKYU+B4m5T3yXc1CiRN94g/SZPtsCkk506aUDtlMnFZvasDwHHUcZUEaYuA==}
+ dev: true
+
+ /@types/sinon-chai@3.2.12:
+ resolution: {integrity: sha512-9y0Gflk3b0+NhQZ/oxGtaAJDvRywCa5sIyaVnounqLvmf93yBF4EgIRspePtkMs3Tr844nCclYMlcCNmLCvjuQ==}
+ dependencies:
+ '@types/chai': 4.3.20
+ '@types/sinon': 17.0.4
+ dev: true
+
+ /@types/sinon@17.0.4:
+ resolution: {integrity: sha512-RHnIrhfPO3+tJT0s7cFaXGZvsL4bbR3/k7z3P312qMS4JaS2Tk+KiwiLx1S0rQ56ERj00u1/BtdyVd0FY+Pdew==}
+ dependencies:
+ '@types/sinonjs__fake-timers': 15.0.1
+ dev: true
+
+ /@types/sinonjs__fake-timers@15.0.1:
+ resolution: {integrity: sha512-Ko2tjWJq8oozHzHV+reuvS5KYIRAokHnGbDwGh/J64LntgpbuylF74ipEL24HCyRjf9FOlBiBHWBR1RlVKsI1w==}
+ dev: true
+
+ /@types/stack-utils@2.0.3:
+ resolution: {integrity: sha512-9aEbYZ3TbYMznPdcdr3SmIrLXwC/AKZXQeCf9Pgao5CKb8CyHuEX5jzWPTkvregvhRJHcpRO6BFoGW9ycaOkYw==}
+ dev: true
+
+ /@types/tinycolor2@1.4.6:
+ resolution: {integrity: sha512-iEN8J0BoMnsWBqjVbWH/c0G0Hh7O21lpR2/+PrvAVgWdzL7eexIFm4JN/Wn10PTcmNdtS6U67r499mlWMXOxNw==}
+ dev: true
+
+ /@types/triple-beam@1.3.5:
+ resolution: {integrity: sha512-6WaYesThRMCl19iryMYP7/x2OVgCtbIVflDGFpWnb9irXI3UjYE4AzmYuiUKY1AJstGijoY+MgUszMgRxIYTYw==}
+ dev: true
+
+ /@types/uuid@8.3.4:
+ resolution: {integrity: sha512-c/I8ZRb51j+pYGAu5CrFMRxqZ2ke4y2grEBO5AUjgSkSk+qT2Ea+OdWElz/OiMf5MNpn2b17kuVBwZLQJXzihw==}
+ dev: true
+
+ /@types/ws@7.4.7:
+ resolution: {integrity: sha512-JQbbmxZTZehdc2iszGKs5oC3NFnjeay7mtAWrdt7qNtAVK0g19muApzAy4bm9byz79xa2ZnO/BOBC2R8RC5Lww==}
+ dependencies:
+ '@types/node': 18.18.14
+ dev: true
+
+ /@types/ws@8.18.1:
+ resolution: {integrity: sha512-ThVF6DCVhA8kUGy+aazFQ4kXQ7E1Ty7A3ypFOe0IcJV8O/M511G99AW24irKrW56Wt44yG9+ij8FaqoBGkuBXg==}
+ dependencies:
+ '@types/node': 18.18.14
+ dev: true
+
+ /@types/yargs-parser@21.0.3:
+ resolution: {integrity: sha512-I4q9QU9MQv4oEOz4tAHJtNz1cwuLxn2F3xcc2iV5WdqLPpUnj30aUuxt1mAxYTG+oe8CZMV/+6rU4S4gRDzqtQ==}
+ dev: true
+
+ /@types/yargs@17.0.34:
+ resolution: {integrity: sha512-KExbHVa92aJpw9WDQvzBaGVE2/Pz+pLZQloT2hjL8IqsZnV62rlPOYvNnLmf/L2dyllfVUOVBj64M0z/46eR2A==}
+ dependencies:
+ '@types/yargs-parser': 21.0.3
+ dev: true
+
+ /@types/yoga-layout@1.9.2:
+ resolution: {integrity: sha512-S9q47ByT2pPvD65IvrWp7qppVMpk9WGMbVq9wbWZOHg6tnXSD4vyhao6nOSBwwfDdV2p3Kx9evA9vI+XWTfDvw==}
+ dev: true
+
+ /@typescript-eslint/eslint-plugin@7.18.0(@typescript-eslint/parser@7.18.0)(eslint@8.57.1)(typescript@5.9.3):
+ resolution: {integrity: sha512-94EQTWZ40mzBc42ATNIBimBEDltSJ9RQHCC8vc/PDbxi4k8dVwUAv4o98dk50M1zB+JGFxp43FP7f8+FP8R6Sw==}
+ engines: {node: ^18.18.0 || >=20.0.0}
+ peerDependencies:
+ '@typescript-eslint/parser': ^7.0.0
+ eslint: ^8.56.0
+ typescript: '*'
+ peerDependenciesMeta:
+ typescript:
+ optional: true
+ dependencies:
+ '@eslint-community/regexpp': 4.12.2
+ '@typescript-eslint/parser': 7.18.0(eslint@8.57.1)(typescript@5.9.3)
+ '@typescript-eslint/scope-manager': 7.18.0
+ '@typescript-eslint/type-utils': 7.18.0(eslint@8.57.1)(typescript@5.9.3)
+ '@typescript-eslint/utils': 7.18.0(eslint@8.57.1)(typescript@5.9.3)
+ '@typescript-eslint/visitor-keys': 7.18.0
+ eslint: 8.57.1
+ graphemer: 1.4.0
+ ignore: 5.3.2
+ natural-compare: 1.4.0
+ ts-api-utils: 1.4.3(typescript@5.9.3)
+ typescript: 5.9.3
+ transitivePeerDependencies:
+ - supports-color
+ dev: true
+
+ /@typescript-eslint/parser@7.18.0(eslint@8.57.1)(typescript@5.9.3):
+ resolution: {integrity: sha512-4Z+L8I2OqhZV8qA132M4wNL30ypZGYOQVBfMgxDH/K5UX0PNqTu1c6za9ST5r9+tavvHiTWmBnKzpCJ/GlVFtg==}
+ engines: {node: ^18.18.0 || >=20.0.0}
+ peerDependencies:
+ eslint: ^8.56.0
+ typescript: '*'
+ peerDependenciesMeta:
+ typescript:
+ optional: true
+ dependencies:
+ '@typescript-eslint/scope-manager': 7.18.0
+ '@typescript-eslint/types': 7.18.0
+ '@typescript-eslint/typescript-estree': 7.18.0(typescript@5.9.3)
+ '@typescript-eslint/visitor-keys': 7.18.0
+ debug: 4.4.3(supports-color@8.1.1)
+ eslint: 8.57.1
+ typescript: 5.9.3
+ transitivePeerDependencies:
+ - supports-color
+ dev: true
+
+ /@typescript-eslint/scope-manager@5.62.0:
+ resolution: {integrity: sha512-VXuvVvZeQCQb5Zgf4HAxc04q5j+WrNAtNh9OwCsCgpKqESMTu3tF/jhZ3xG6T4NZwWl65Bg8KuS2uEvhSfLl0w==}
+ engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
+ dependencies:
+ '@typescript-eslint/types': 5.62.0
+ '@typescript-eslint/visitor-keys': 5.62.0
+ dev: true
+
+ /@typescript-eslint/scope-manager@7.18.0:
+ resolution: {integrity: sha512-jjhdIE/FPF2B7Z1uzc6i3oWKbGcHb87Qw7AWj6jmEqNOfDFbJWtjt/XfwCpvNkpGWlcJaog5vTR+VV8+w9JflA==}
+ engines: {node: ^18.18.0 || >=20.0.0}
+ dependencies:
+ '@typescript-eslint/types': 7.18.0
+ '@typescript-eslint/visitor-keys': 7.18.0
+ dev: true
+
+ /@typescript-eslint/type-utils@7.18.0(eslint@8.57.1)(typescript@5.9.3):
+ resolution: {integrity: sha512-XL0FJXuCLaDuX2sYqZUUSOJ2sG5/i1AAze+axqmLnSkNEVMVYLF+cbwlB2w8D1tinFuSikHmFta+P+HOofrLeA==}
+ engines: {node: ^18.18.0 || >=20.0.0}
+ peerDependencies:
+ eslint: ^8.56.0
+ typescript: '*'
+ peerDependenciesMeta:
+ typescript:
+ optional: true
+ dependencies:
+ '@typescript-eslint/typescript-estree': 7.18.0(typescript@5.9.3)
+ '@typescript-eslint/utils': 7.18.0(eslint@8.57.1)(typescript@5.9.3)
+ debug: 4.4.3(supports-color@8.1.1)
+ eslint: 8.57.1
+ ts-api-utils: 1.4.3(typescript@5.9.3)
+ typescript: 5.9.3
+ transitivePeerDependencies:
+ - supports-color
+ dev: true
+
+ /@typescript-eslint/types@5.62.0:
+ resolution: {integrity: sha512-87NVngcbVXUahrRTqIK27gD2t5Cu1yuCXxbLcFtCzZGlfyVWWh8mLHkoxzjsB6DDNnvdL+fW8MiwPEJyGJQDgQ==}
+ engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
+ dev: true
+
+ /@typescript-eslint/types@7.18.0:
+ resolution: {integrity: sha512-iZqi+Ds1y4EDYUtlOOC+aUmxnE9xS/yCigkjA7XpTKV6nCBd3Hp/PRGGmdwnfkV2ThMyYldP1wRpm/id99spTQ==}
+ engines: {node: ^18.18.0 || >=20.0.0}
+ dev: true
+
+ /@typescript-eslint/typescript-estree@5.62.0(typescript@5.9.3):
+ resolution: {integrity: sha512-CmcQ6uY7b9y694lKdRB8FEel7JbU/40iSAPomu++SjLMntB+2Leay2LO6i8VnJk58MtE9/nQSFIH6jpyRWyYzA==}
+ engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
+ peerDependencies:
+ typescript: '*'
+ peerDependenciesMeta:
+ typescript:
+ optional: true
+ dependencies:
+ '@typescript-eslint/types': 5.62.0
+ '@typescript-eslint/visitor-keys': 5.62.0
+ debug: 4.4.3(supports-color@8.1.1)
+ globby: 11.1.0
+ is-glob: 4.0.3
+ semver: 7.7.3
+ tsutils: 3.21.0(typescript@5.9.3)
+ typescript: 5.9.3
+ transitivePeerDependencies:
+ - supports-color
+ dev: true
+
+ /@typescript-eslint/typescript-estree@7.18.0(typescript@5.9.3):
+ resolution: {integrity: sha512-aP1v/BSPnnyhMHts8cf1qQ6Q1IFwwRvAQGRvBFkWlo3/lH29OXA3Pts+c10nxRxIBrDnoMqzhgdwVe5f2D6OzA==}
+ engines: {node: ^18.18.0 || >=20.0.0}
+ peerDependencies:
+ typescript: '*'
+ peerDependenciesMeta:
+ typescript:
+ optional: true
+ dependencies:
+ '@typescript-eslint/types': 7.18.0
+ '@typescript-eslint/visitor-keys': 7.18.0
+ debug: 4.4.3(supports-color@8.1.1)
+ globby: 11.1.0
+ is-glob: 4.0.3
+ minimatch: 9.0.5
+ semver: 7.7.3
+ ts-api-utils: 1.4.3(typescript@5.9.3)
+ typescript: 5.9.3
+ transitivePeerDependencies:
+ - supports-color
+ dev: true
+
+ /@typescript-eslint/utils@5.62.0(eslint@8.57.1)(typescript@5.9.3):
+ resolution: {integrity: sha512-n8oxjeb5aIbPFEtmQxQYOLI0i9n5ySBEY/ZEHHZqKQSFnxio1rv6dthascc9dLuwrL0RC5mPCxB7vnAVGAYWAQ==}
+ engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
+ peerDependencies:
+ eslint: ^6.0.0 || ^7.0.0 || ^8.0.0
+ dependencies:
+ '@eslint-community/eslint-utils': 4.9.0(eslint@8.57.1)
+ '@types/json-schema': 7.0.15
+ '@types/semver': 7.7.1
+ '@typescript-eslint/scope-manager': 5.62.0
+ '@typescript-eslint/types': 5.62.0
+ '@typescript-eslint/typescript-estree': 5.62.0(typescript@5.9.3)
+ eslint: 8.57.1
+ eslint-scope: 5.1.1
+ semver: 7.7.3
+ transitivePeerDependencies:
+ - supports-color
+ - typescript
+ dev: true
+
+ /@typescript-eslint/utils@7.18.0(eslint@8.57.1)(typescript@5.9.3):
+ resolution: {integrity: sha512-kK0/rNa2j74XuHVcoCZxdFBMF+aq/vH83CXAOHieC+2Gis4mF8jJXT5eAfyD3K0sAxtPuwxaIOIOvhwzVDt/kw==}
+ engines: {node: ^18.18.0 || >=20.0.0}
+ peerDependencies:
+ eslint: ^8.56.0
+ dependencies:
+ '@eslint-community/eslint-utils': 4.9.0(eslint@8.57.1)
+ '@typescript-eslint/scope-manager': 7.18.0
+ '@typescript-eslint/types': 7.18.0
+ '@typescript-eslint/typescript-estree': 7.18.0(typescript@5.9.3)
+ eslint: 8.57.1
+ transitivePeerDependencies:
+ - supports-color
+ - typescript
+ dev: true
+
+ /@typescript-eslint/visitor-keys@5.62.0:
+ resolution: {integrity: sha512-07ny+LHRzQXepkGg6w0mFY41fVUNBrL2Roj/++7V1txKugfjm/Ci/qSND03r2RhlJhJYMcTn9AhhSSqQp0Ysyw==}
+ engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
+ dependencies:
+ '@typescript-eslint/types': 5.62.0
+ eslint-visitor-keys: 3.4.3
+ dev: true
+
+ /@typescript-eslint/visitor-keys@7.18.0:
+ resolution: {integrity: sha512-cDF0/Gf81QpY3xYyJKDV14Zwdmid5+uuENhjH2EqFaF0ni+yAyq/LzMaIJdhNJXZI7uLzwIlA+V7oWoyn6Curg==}
+ engines: {node: ^18.18.0 || >=20.0.0}
+ dependencies:
+ '@typescript-eslint/types': 7.18.0
+ eslint-visitor-keys: 3.4.3
+ dev: true
+
+ /@ungap/structured-clone@1.3.0:
+ resolution: {integrity: sha512-WmoN8qaIAo7WTYWbAZuG8PYEhn5fkz7dZrqTBZ7dtt//lL2Gwms1IcnQ5yHqjDfX8Ft5j4YzDM23f87zBfDe9g==}
+ dev: true
+
+ /@unrs/resolver-binding-android-arm-eabi@1.11.1:
+ resolution: {integrity: sha512-ppLRUgHVaGRWUx0R0Ut06Mjo9gBaBkg3v/8AxusGLhsIotbBLuRk51rAzqLC8gq6NyyAojEXglNjzf6R948DNw==}
+ cpu: [arm]
+ os: [android]
+ requiresBuild: true
+ dev: true
+ optional: true
+
+ /@unrs/resolver-binding-android-arm64@1.11.1:
+ resolution: {integrity: sha512-lCxkVtb4wp1v+EoN+HjIG9cIIzPkX5OtM03pQYkG+U5O/wL53LC4QbIeazgiKqluGeVEeBlZahHalCaBvU1a2g==}
+ cpu: [arm64]
+ os: [android]
+ requiresBuild: true
+ dev: true
+ optional: true
+
+ /@unrs/resolver-binding-darwin-arm64@1.11.1:
+ resolution: {integrity: sha512-gPVA1UjRu1Y/IsB/dQEsp2V1pm44Of6+LWvbLc9SDk1c2KhhDRDBUkQCYVWe6f26uJb3fOK8saWMgtX8IrMk3g==}
+ cpu: [arm64]
+ os: [darwin]
+ requiresBuild: true
+ dev: true
+ optional: true
+
+ /@unrs/resolver-binding-darwin-x64@1.11.1:
+ resolution: {integrity: sha512-cFzP7rWKd3lZaCsDze07QX1SC24lO8mPty9vdP+YVa3MGdVgPmFc59317b2ioXtgCMKGiCLxJ4HQs62oz6GfRQ==}
+ cpu: [x64]
+ os: [darwin]
+ requiresBuild: true
+ dev: true
+ optional: true
+
+ /@unrs/resolver-binding-freebsd-x64@1.11.1:
+ resolution: {integrity: sha512-fqtGgak3zX4DCB6PFpsH5+Kmt/8CIi4Bry4rb1ho6Av2QHTREM+47y282Uqiu3ZRF5IQioJQ5qWRV6jduA+iGw==}
+ cpu: [x64]
+ os: [freebsd]
+ requiresBuild: true
+ dev: true
+ optional: true
+
+ /@unrs/resolver-binding-linux-arm-gnueabihf@1.11.1:
+ resolution: {integrity: sha512-u92mvlcYtp9MRKmP+ZvMmtPN34+/3lMHlyMj7wXJDeXxuM0Vgzz0+PPJNsro1m3IZPYChIkn944wW8TYgGKFHw==}
+ cpu: [arm]
+ os: [linux]
+ requiresBuild: true
+ dev: true
+ optional: true
+
+ /@unrs/resolver-binding-linux-arm-musleabihf@1.11.1:
+ resolution: {integrity: sha512-cINaoY2z7LVCrfHkIcmvj7osTOtm6VVT16b5oQdS4beibX2SYBwgYLmqhBjA1t51CarSaBuX5YNsWLjsqfW5Cw==}
+ cpu: [arm]
+ os: [linux]
+ requiresBuild: true
+ dev: true
+ optional: true
+
+ /@unrs/resolver-binding-linux-arm64-gnu@1.11.1:
+ resolution: {integrity: sha512-34gw7PjDGB9JgePJEmhEqBhWvCiiWCuXsL9hYphDF7crW7UgI05gyBAi6MF58uGcMOiOqSJ2ybEeCvHcq0BCmQ==}
+ cpu: [arm64]
+ os: [linux]
+ requiresBuild: true
+ dev: true
+ optional: true
+
+ /@unrs/resolver-binding-linux-arm64-musl@1.11.1:
+ resolution: {integrity: sha512-RyMIx6Uf53hhOtJDIamSbTskA99sPHS96wxVE/bJtePJJtpdKGXO1wY90oRdXuYOGOTuqjT8ACccMc4K6QmT3w==}
+ cpu: [arm64]
+ os: [linux]
+ requiresBuild: true
+ dev: true
+ optional: true
+
+ /@unrs/resolver-binding-linux-ppc64-gnu@1.11.1:
+ resolution: {integrity: sha512-D8Vae74A4/a+mZH0FbOkFJL9DSK2R6TFPC9M+jCWYia/q2einCubX10pecpDiTmkJVUH+y8K3BZClycD8nCShA==}
+ cpu: [ppc64]
+ os: [linux]
+ requiresBuild: true
+ dev: true
+ optional: true
+
+ /@unrs/resolver-binding-linux-riscv64-gnu@1.11.1:
+ resolution: {integrity: sha512-frxL4OrzOWVVsOc96+V3aqTIQl1O2TjgExV4EKgRY09AJ9leZpEg8Ak9phadbuX0BA4k8U5qtvMSQQGGmaJqcQ==}
+ cpu: [riscv64]
+ os: [linux]
+ requiresBuild: true
+ dev: true
+ optional: true
+
+ /@unrs/resolver-binding-linux-riscv64-musl@1.11.1:
+ resolution: {integrity: sha512-mJ5vuDaIZ+l/acv01sHoXfpnyrNKOk/3aDoEdLO/Xtn9HuZlDD6jKxHlkN8ZhWyLJsRBxfv9GYM2utQ1SChKew==}
+ cpu: [riscv64]
+ os: [linux]
+ requiresBuild: true
+ dev: true
+ optional: true
+
+ /@unrs/resolver-binding-linux-s390x-gnu@1.11.1:
+ resolution: {integrity: sha512-kELo8ebBVtb9sA7rMe1Cph4QHreByhaZ2QEADd9NzIQsYNQpt9UkM9iqr2lhGr5afh885d/cB5QeTXSbZHTYPg==}
+ cpu: [s390x]
+ os: [linux]
+ requiresBuild: true
+ dev: true
+ optional: true
+
+ /@unrs/resolver-binding-linux-x64-gnu@1.11.1:
+ resolution: {integrity: sha512-C3ZAHugKgovV5YvAMsxhq0gtXuwESUKc5MhEtjBpLoHPLYM+iuwSj3lflFwK3DPm68660rZ7G8BMcwSro7hD5w==}
+ cpu: [x64]
+ os: [linux]
+ requiresBuild: true
+ dev: true
+ optional: true
+
+ /@unrs/resolver-binding-linux-x64-musl@1.11.1:
+ resolution: {integrity: sha512-rV0YSoyhK2nZ4vEswT/QwqzqQXw5I6CjoaYMOX0TqBlWhojUf8P94mvI7nuJTeaCkkds3QE4+zS8Ko+GdXuZtA==}
+ cpu: [x64]
+ os: [linux]
+ requiresBuild: true
+ dev: true
+ optional: true
+
+ /@unrs/resolver-binding-wasm32-wasi@1.11.1:
+ resolution: {integrity: sha512-5u4RkfxJm+Ng7IWgkzi3qrFOvLvQYnPBmjmZQ8+szTK/b31fQCnleNl1GgEt7nIsZRIf5PLhPwT0WM+q45x/UQ==}
+ engines: {node: '>=14.0.0'}
+ cpu: [wasm32]
+ requiresBuild: true
+ dependencies:
+ '@napi-rs/wasm-runtime': 0.2.12
+ dev: true
+ optional: true
+
+ /@unrs/resolver-binding-win32-arm64-msvc@1.11.1:
+ resolution: {integrity: sha512-nRcz5Il4ln0kMhfL8S3hLkxI85BXs3o8EYoattsJNdsX4YUU89iOkVn7g0VHSRxFuVMdM4Q1jEpIId1Ihim/Uw==}
+ cpu: [arm64]
+ os: [win32]
+ requiresBuild: true
+ dev: true
+ optional: true
+
+ /@unrs/resolver-binding-win32-ia32-msvc@1.11.1:
+ resolution: {integrity: sha512-DCEI6t5i1NmAZp6pFonpD5m7i6aFrpofcp4LA2i8IIq60Jyo28hamKBxNrZcyOwVOZkgsRp9O2sXWBWP8MnvIQ==}
+ cpu: [ia32]
+ os: [win32]
+ requiresBuild: true
+ dev: true
+ optional: true
+
+ /@unrs/resolver-binding-win32-x64-msvc@1.11.1:
+ resolution: {integrity: sha512-lrW200hZdbfRtztbygyaq/6jP6AKE8qQN2KvPcJ+x7wiD038YtnYtZ82IMNJ69GJibV7bwL3y9FgK+5w/pYt6g==}
+ cpu: [x64]
+ os: [win32]
+ requiresBuild: true
+ dev: true
+ optional: true
+
+ /abort-controller@3.0.0:
+ resolution: {integrity: sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==}
+ engines: {node: '>=6.5'}
+ dependencies:
+ event-target-shim: 5.0.1
+ dev: true
+
+ /abortcontroller-polyfill@1.7.8:
+ resolution: {integrity: sha512-9f1iZ2uWh92VcrU9Y8x+LdM4DLj75VE0MJB8zuF1iUnroEptStw+DQ8EQPMUdfe5k+PkB1uUfDQfWbhstH8LrQ==}
+ dev: true
+
+ /abstract-leveldown@6.2.3:
+ resolution: {integrity: sha512-BsLm5vFMRUrrLeCcRc+G0t2qOaTzpoJQLOubq2XM72eNpjF5UdU5o/5NvlNhx95XHcAvcl8OMXr4mlg/fRgUXQ==}
+ engines: {node: '>=6'}
+ deprecated: Superseded by abstract-level (https://github.com/Level/community#faq)
+ dependencies:
+ buffer: 5.7.1
+ immediate: 3.3.0
+ level-concat-iterator: 2.0.1
+ level-supports: 1.0.1
+ xtend: 4.0.2
+ dev: true
+
+ /abstract-leveldown@6.3.0:
+ resolution: {integrity: sha512-TU5nlYgta8YrBMNpc9FwQzRbiXsj49gsALsXadbGHt9CROPzX5fB0rWDR5mtdpOOKa5XqRFpbj1QroPAoPzVjQ==}
+ engines: {node: '>=6'}
+ deprecated: Superseded by abstract-level (https://github.com/Level/community#faq)
+ dependencies:
+ buffer: 5.7.1
+ immediate: 3.3.0
+ level-concat-iterator: 2.0.1
+ level-supports: 1.0.1
+ xtend: 4.0.2
+ dev: true
+
+ /accepts@1.3.8:
+ resolution: {integrity: sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==}
+ engines: {node: '>= 0.6'}
+ dependencies:
+ mime-types: 2.1.35
+ negotiator: 0.6.3
+ dev: true
+
+ /acorn-jsx@5.3.2(acorn@8.15.0):
+ resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==}
+ peerDependencies:
+ acorn: ^6.0.0 || ^7.0.0 || ^8.0.0
+ dependencies:
+ acorn: 8.15.0
+ dev: true
+
+ /acorn-walk@8.3.4:
+ resolution: {integrity: sha512-ueEepnujpqee2o5aIYnvHU6C0A42MNdsIDeqy5BydrkuC5R1ZuUFnm27EeFJGoEHJQgn3uleRvmTXaJgfXbt4g==}
+ engines: {node: '>=0.4.0'}
+ dependencies:
+ acorn: 8.15.0
+ dev: true
+
+ /acorn@8.15.0:
+ resolution: {integrity: sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==}
+ engines: {node: '>=0.4.0'}
+ hasBin: true
+ dev: true
+
+ /adm-zip@0.4.16:
+ resolution: {integrity: sha512-TFi4HBKSGfIKsK5YCkKaaFG2m4PEDyViZmEwof3MTIgzimHLto6muaHVpbrljdIvIrFZzEq/p4nafOeLcYegrg==}
+ engines: {node: '>=0.3.0'}
+ dev: true
+
+ /aes-js@3.0.0:
+ resolution: {integrity: sha512-H7wUZRn8WpTq9jocdxQ2c8x2sKo9ZVmzfRE13GiNJXfp7NcKYEdvl3vspKjXox6RIG2VtaRe4JFvxG4rqp2Zuw==}
+ dev: true
+
+ /agent-base@6.0.2:
+ resolution: {integrity: sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==}
+ engines: {node: '>= 6.0.0'}
+ dependencies:
+ debug: 4.4.3(supports-color@8.1.1)
+ transitivePeerDependencies:
+ - supports-color
+ dev: true
+
+ /agentkeepalive@4.6.0:
+ resolution: {integrity: sha512-kja8j7PjmncONqaTsB8fQ+wE2mSU2DJ9D4XKoJ5PFWIdRMa6SLSN1ff4mOr4jCbfRSsxR4keIiySJU0N9T5hIQ==}
+ engines: {node: '>= 8.0.0'}
+ dependencies:
+ humanize-ms: 1.2.1
+ dev: true
+
+ /aggregate-error@3.1.0:
+ resolution: {integrity: sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==}
+ engines: {node: '>=8'}
+ dependencies:
+ clean-stack: 2.2.0
+ indent-string: 4.0.0
+ dev: true
+
+ /ajv@6.12.6:
+ resolution: {integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==}
+ dependencies:
+ fast-deep-equal: 3.1.3
+ fast-json-stable-stringify: 2.1.0
+ json-schema-traverse: 0.4.1
+ uri-js: 4.4.1
+ dev: true
+
+ /ajv@8.17.1:
+ resolution: {integrity: sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==}
+ dependencies:
+ fast-deep-equal: 3.1.3
+ fast-uri: 3.1.0
+ json-schema-traverse: 1.0.0
+ require-from-string: 2.0.2
+ dev: true
+
+ /ansi-align@3.0.1:
+ resolution: {integrity: sha512-IOfwwBF5iczOjp/WeY4YxyjqAFMQoZufdQWDd19SEExbVLNXqvpzSJ/M7Za4/sCPmQ0+GRquoA7bGcINcxew6w==}
+ dependencies:
+ string-width: 4.2.3
+ dev: true
+
+ /ansi-colors@4.1.3:
+ resolution: {integrity: sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==}
+ engines: {node: '>=6'}
+ dev: true
+
+ /ansi-escapes@4.3.2:
+ resolution: {integrity: sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==}
+ engines: {node: '>=8'}
+ dependencies:
+ type-fest: 0.21.3
+ dev: true
+
+ /ansi-regex@2.1.1:
+ resolution: {integrity: sha512-TIGnTpdo+E3+pCyAluZvtED5p5wCqLdezCyhPZzKPcxvFplEt4i+W7OONCKgeZFT3+y5NZZfOOS/Bdcanm1MYA==}
+ engines: {node: '>=0.10.0'}
+ dev: true
+
+ /ansi-regex@5.0.1:
+ resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==}
+ engines: {node: '>=8'}
+ dev: true
+
+ /ansi-styles@3.2.1:
+ resolution: {integrity: sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==}
+ engines: {node: '>=4'}
+ dependencies:
+ color-convert: 1.9.3
+ dev: true
+
+ /ansi-styles@4.3.0:
+ resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==}
+ engines: {node: '>=8'}
+ dependencies:
+ color-convert: 2.0.1
+ dev: true
+
+ /ansi-styles@5.2.0:
+ resolution: {integrity: sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==}
+ engines: {node: '>=10'}
+ dev: true
+
+ /ansicolors@0.3.2:
+ resolution: {integrity: sha512-QXu7BPrP29VllRxH8GwB7x5iX5qWKAAMLqKQGWTeLWVlNHNOpVMJ91dsxQAIWXpjuW5wqvxu3Jd/nRjrJ+0pqg==}
+ dev: true
+
+ /antlr4@4.13.2:
+ resolution: {integrity: sha512-QiVbZhyy4xAZ17UPEuG3YTOt8ZaoeOR1CvEAqrEsDBsOqINslaB147i9xqljZqoyf5S+EUlGStaj+t22LT9MOg==}
+ engines: {node: '>=16'}
+ dev: true
+
+ /anymatch@3.1.3:
+ resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==}
+ engines: {node: '>= 8'}
+ dependencies:
+ normalize-path: 3.0.0
+ picomatch: 2.3.1
+ dev: true
+
+ /aptos@1.22.1(got@11.8.6):
+ resolution: {integrity: sha512-zw8IbCkMOpXdeAxp106W6CLHR8i88QY+z5u912XIlwZ3AngUVKY55b3rG8KP3uKEeLAIcY9FVWzS5ndzV60grg==}
+ engines: {node: '>=20.0.0'}
+ deprecated: Please update to the newer '@aptos-labs/ts-sdk'. 'aptos' is deprecated
+ dependencies:
+ '@aptos-labs/aptos-client': 2.0.0(got@11.8.6)
+ '@noble/hashes': 1.3.3
+ '@scure/bip39': 1.2.1
+ eventemitter3: 5.0.1
+ tweetnacl: 1.0.3
+ transitivePeerDependencies:
+ - got
+ dev: true
+
+ /arg@4.1.3:
+ resolution: {integrity: sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==}
+ dev: true
+
+ /argparse@1.0.10:
+ resolution: {integrity: sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==}
+ dependencies:
+ sprintf-js: 1.0.3
+ dev: true
+
+ /argparse@2.0.1:
+ resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==}
+ dev: true
+
+ /array-back@3.1.0:
+ resolution: {integrity: sha512-TkuxA4UCOvxuDK6NZYXCalszEzj+TLszyASooky+i742l9TqsOdYCMJJupxRic61hwquNtppB3hgcuq9SVSH1Q==}
+ engines: {node: '>=6'}
+ dev: true
+
+ /array-back@4.0.2:
+ resolution: {integrity: sha512-NbdMezxqf94cnNfWLL7V/im0Ub+Anbb0IoZhvzie8+4HJ4nMQuzHuy49FkGYCJK2yAloZ3meiB6AVMClbrI1vg==}
+ engines: {node: '>=8'}
+ dev: true
+
+ /array-buffer-byte-length@1.0.2:
+ resolution: {integrity: sha512-LHE+8BuR7RYGDKvnrmcuSq3tDcKv9OFEXQt/HpbZhY7V6h0zlUXutnAD82GiFx9rdieCMjkvtcsPqBwgUl1Iiw==}
+ engines: {node: '>= 0.4'}
+ dependencies:
+ call-bound: 1.0.4
+ is-array-buffer: 3.0.5
+ dev: true
+
+ /array-flatten@1.1.1:
+ resolution: {integrity: sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==}
+ dev: true
+
+ /array-includes@3.1.9:
+ resolution: {integrity: sha512-FmeCCAenzH0KH381SPT5FZmiA/TmpndpcaShhfgEN9eCVjnFBqq3l1xrI42y8+PPLI6hypzou4GXw00WHmPBLQ==}
+ engines: {node: '>= 0.4'}
+ dependencies:
+ call-bind: 1.0.8
+ call-bound: 1.0.4
+ define-properties: 1.2.1
+ es-abstract: 1.24.0
+ es-object-atoms: 1.1.1
+ get-intrinsic: 1.3.0
+ is-string: 1.1.1
+ math-intrinsics: 1.1.0
+ dev: true
+
+ /array-union@2.1.0:
+ resolution: {integrity: sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==}
+ engines: {node: '>=8'}
+ dev: true
+
+ /array.prototype.findlastindex@1.2.6:
+ resolution: {integrity: sha512-F/TKATkzseUExPlfvmwQKGITM3DGTK+vkAsCZoDc5daVygbJBnjEUCbgkAvVFsgfXfX4YIqZ/27G3k3tdXrTxQ==}
+ engines: {node: '>= 0.4'}
+ dependencies:
+ call-bind: 1.0.8
+ call-bound: 1.0.4
+ define-properties: 1.2.1
+ es-abstract: 1.24.0
+ es-errors: 1.3.0
+ es-object-atoms: 1.1.1
+ es-shim-unscopables: 1.1.0
+ dev: true
+
+ /array.prototype.flat@1.3.3:
+ resolution: {integrity: sha512-rwG/ja1neyLqCuGZ5YYrznA62D4mZXg0i1cIskIUKSiqF3Cje9/wXAls9B9s1Wa2fomMsIv8czB8jZcPmxCXFg==}
+ engines: {node: '>= 0.4'}
+ dependencies:
+ call-bind: 1.0.8
+ define-properties: 1.2.1
+ es-abstract: 1.24.0
+ es-shim-unscopables: 1.1.0
+ dev: true
+
+ /array.prototype.flatmap@1.3.3:
+ resolution: {integrity: sha512-Y7Wt51eKJSyi80hFrJCePGGNo5ktJCslFuboqJsbf57CCPcm5zztluPlc4/aD8sWsKvlwatezpV4U1efk8kpjg==}
+ engines: {node: '>= 0.4'}
+ dependencies:
+ call-bind: 1.0.8
+ define-properties: 1.2.1
+ es-abstract: 1.24.0
+ es-shim-unscopables: 1.1.0
+ dev: true
+
+ /arraybuffer.prototype.slice@1.0.4:
+ resolution: {integrity: sha512-BNoCY6SXXPQ7gF2opIP4GBE+Xw7U+pHMYKuzjgCN3GwiaIR09UUeKfheyIry77QtrCBlC0KK0q5/TER/tYh3PQ==}
+ engines: {node: '>= 0.4'}
+ dependencies:
+ array-buffer-byte-length: 1.0.2
+ call-bind: 1.0.8
+ define-properties: 1.2.1
+ es-abstract: 1.24.0
+ es-errors: 1.3.0
+ get-intrinsic: 1.3.0
+ is-array-buffer: 3.0.5
+ dev: true
+
+ /asn1@0.2.6:
+ resolution: {integrity: sha512-ix/FxPn0MDjeyJ7i/yoHGFt/EX6LyNbxSEhPPXODPL+KB0VPk86UYfL0lMdy+KCnv+fmvIzySwaK5COwqVbWTQ==}
+ dependencies:
+ safer-buffer: 2.1.2
+ dev: true
+
+ /assert-plus@1.0.0:
+ resolution: {integrity: sha512-NfJ4UzBCcQGLDlQq7nHxH+tv3kyZ0hHQqF5BO6J7tNJeP5do1llPr8dZ8zHonfhAu0PHAdMkSo+8o0wxg9lZWw==}
+ engines: {node: '>=0.8'}
+ dev: true
+
+ /assert@2.1.0:
+ resolution: {integrity: sha512-eLHpSK/Y4nhMJ07gDaAzoX/XAKS8PSaojml3M0DM4JpV1LAi5JOJ/p6H/XWrl8L+DzVEvVCW1z3vWAaB9oTsQw==}
+ dependencies:
+ call-bind: 1.0.8
+ is-nan: 1.3.2
+ object-is: 1.1.6
+ object.assign: 4.1.7
+ util: 0.12.5
+ dev: true
+
+ /assertion-error@1.1.0:
+ resolution: {integrity: sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==}
+ dev: true
+
+ /ast-metadata-inferer@0.8.1:
+ resolution: {integrity: sha512-ht3Dm6Zr7SXv6t1Ra6gFo0+kLDglHGrEbYihTkcycrbHw7WCcuhBzPlJYHEsIpycaUwzsJHje+vUcxXUX4ztTA==}
+ dependencies:
+ '@mdn/browser-compat-data': 5.7.6
+ dev: true
+
+ /ast-parents@0.0.1:
+ resolution: {integrity: sha512-XHusKxKz3zoYk1ic8Un640joHbFMhbqneyoZfoKnEGtf2ey9Uh/IdpcQplODdO/kENaMIWsD0nJm4+wX3UNLHA==}
+ dev: true
+
+ /astral-regex@2.0.0:
+ resolution: {integrity: sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==}
+ engines: {node: '>=8'}
+ dev: true
+
+ /async-eventemitter@0.2.4:
+ resolution: {integrity: sha512-pd20BwL7Yt1zwDFy+8MX8F1+WCT8aQeKj0kQnTrH9WaeRETlRamVhD0JtRPmrV4GfOJ2F9CvdQkZeZhnh2TuHw==}
+ dependencies:
+ async: 2.6.4
+ dev: true
+
+ /async-function@1.0.0:
+ resolution: {integrity: sha512-hsU18Ae8CDTR6Kgu9DYf0EbCr/a5iGL0rytQDobUcdpYOKokk8LEjVphnXkDkgpi0wYVsqrXuP0bZxJaTqdgoA==}
+ engines: {node: '>= 0.4'}
+ dev: true
+
+ /async-limiter@1.0.1:
+ resolution: {integrity: sha512-csOlWGAcRFJaI6m+F2WKdnMKr4HhdhFVBk0H/QbJFMCr+uO2kwohwXQPxw/9OCxp05r5ghVBFSyioixx3gfkNQ==}
+ dev: true
+
+ /async@2.6.4:
+ resolution: {integrity: sha512-mzo5dfJYwAn29PeiJ0zvwTo04zj8HDJj0Mn8TD7sno7q12prdbnasKJHhkm2c1LgrhlJ0teaea8860oxi51mGA==}
+ dependencies:
+ lodash: 4.17.21
+ dev: true
+
+ /async@3.2.6:
+ resolution: {integrity: sha512-htCUDlxyyCLMgaM3xXg0C0LW2xqfuQ6p05pCEIsXuyQ+a1koYKTuBMzRNwmybfLgvJDMd0r1LTn4+E0Ti6C2AA==}
+ dev: true
+
+ /asynckit@0.4.0:
+ resolution: {integrity: sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==}
+ dev: true
+
+ /atomic-sleep@1.0.0:
+ resolution: {integrity: sha512-kNOjDqAh7px0XWNI+4QbzoiR/nTkHAWNud2uvnJquD1/x5a7EQZMJT0AczqK0Qn67oY/TTQ1LbUKajZpp3I9tQ==}
+ engines: {node: '>=8.0.0'}
+ dev: true
+
+ /auto-bind@4.0.0:
+ resolution: {integrity: sha512-Hdw8qdNiqdJ8LqT0iK0sVzkFbzg6fhnQqqfWhBDxcHZvU75+B+ayzTy8x+k5Ix0Y92XOhOUlx74ps+bA6BeYMQ==}
+ engines: {node: '>=8'}
+ dev: true
+
+ /available-typed-arrays@1.0.7:
+ resolution: {integrity: sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==}
+ engines: {node: '>= 0.4'}
+ dependencies:
+ possible-typed-array-names: 1.1.0
+ dev: true
+
+ /aws-sign2@0.7.0:
+ resolution: {integrity: sha512-08kcGqnYf/YmjoRhfxyu+CLxBjUtHLXLXX/vUfx9l2LYzG3c1m61nrpyFUZI6zeS+Li/wWMMidD9KgrqtGq3mA==}
+ dev: true
+
+ /aws4@1.13.2:
+ resolution: {integrity: sha512-lHe62zvbTB5eEABUVi/AwVh0ZKY9rMMDhmm+eeyuuUQbQ3+J+fONVQOZyj+DdrvD4BY33uYniyRJ4UJIaSKAfw==}
+ dev: true
+
+ /axios@0.21.4(debug@4.4.3):
+ resolution: {integrity: sha512-ut5vewkiu8jjGBdqpM44XxjuCjq9LAKeHVmoVfHVzy8eHgxxq8SbAVQNovDA8mVi05kP0Ea/n/UzcSHcTJQfNg==}
+ dependencies:
+ follow-redirects: 1.15.11(debug@4.4.3)
+ transitivePeerDependencies:
+ - debug
+ dev: true
+
+ /axios@1.13.1:
+ resolution: {integrity: sha512-hU4EGxxt+j7TQijx1oYdAjw4xuIp1wRQSsbMFwSthCWeBQur1eF+qJ5iQ5sN3Tw8YRzQNKb8jszgBdMDVqwJcw==}
+ dependencies:
+ follow-redirects: 1.15.11(debug@4.4.3)
+ form-data: 4.0.4
+ proxy-from-env: 1.1.0
+ transitivePeerDependencies:
+ - debug
+ dev: true
+
+ /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.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.28.5)
+ chalk: 4.1.2
+ graceful-fs: 4.2.11
+ slash: 3.0.0
+ transitivePeerDependencies:
+ - supports-color
+ dev: true
+
+ /babel-plugin-istanbul@6.1.1:
+ resolution: {integrity: sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA==}
+ engines: {node: '>=8'}
+ dependencies:
+ '@babel/helper-plugin-utils': 7.27.1
+ '@istanbuljs/load-nyc-config': 1.1.0
+ '@istanbuljs/schema': 0.1.3
+ istanbul-lib-instrument: 5.2.1
+ test-exclude: 6.0.0
+ transitivePeerDependencies:
+ - supports-color
+ dev: true
+
+ /babel-plugin-jest-hoist@29.6.3:
+ resolution: {integrity: sha512-ESAc/RJvGTFEzRwOTT4+lNDk/GNHMkKbNzsvT0qKRfDyyYTskxB5rnU2njIDYVxXCBHHEI1c0YwHob3WaYujOg==}
+ engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
+ dependencies:
+ '@babel/template': 7.27.2
+ '@babel/types': 7.28.5
+ '@types/babel__core': 7.20.5
+ '@types/babel__traverse': 7.28.0
+ dev: true
+
+ /babel-preset-current-node-syntax@1.2.0(@babel/core@7.28.5):
+ resolution: {integrity: sha512-E/VlAEzRrsLEb2+dv8yp3bo4scof3l9nR4lrld+Iy5NyVqgVYUJnDAmunkhPMisRI32Qc4iRiz425d8vM++2fg==}
+ peerDependencies:
+ '@babel/core': ^7.0.0 || ^8.0.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-class-static-block': 7.14.5(@babel/core@7.28.5)
+ '@babel/plugin-syntax-import-attributes': 7.27.1(@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-private-property-in-object': 7.14.5(@babel/core@7.28.5)
+ '@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.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.28.5
+ babel-plugin-jest-hoist: 29.6.3
+ babel-preset-current-node-syntax: 1.2.0(@babel/core@7.28.5)
+ dev: true
+
+ /balanced-match@1.0.2:
+ resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==}
+ dev: true
+
+ /base-x@3.0.11:
+ resolution: {integrity: sha512-xz7wQ8xDhdyP7tQxwdteLYeFfS68tSMNCZ/Y37WJ4bhGfKPpqEIlmIyueQHqOyoPhE6xNUqjzRr8ra0eF9VRvA==}
+ dependencies:
+ safe-buffer: 5.2.1
+ dev: true
+
+ /base-x@4.0.1:
+ resolution: {integrity: sha512-uAZ8x6r6S3aUM9rbHGVOIsR15U/ZSc82b3ymnCPsT45Gk1DDvhDPdIgB5MrhirZWt+5K0EEPQH985kNqZgNPFw==}
+ dev: true
+
+ /base-x@5.0.1:
+ resolution: {integrity: sha512-M7uio8Zt++eg3jPj+rHMfCC+IuygQHHCOU+IYsVtik6FWjuYpVt/+MRKcgsAMHh8mMFAwnB+Bs+mTrFiXjMzKg==}
+ dev: true
+
+ /base64-js@1.5.1:
+ resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==}
+ dev: true
+
+ /baseline-browser-mapping@2.8.21:
+ resolution: {integrity: sha512-JU0h5APyQNsHOlAM7HnQnPToSDQoEBZqzu/YBlqDnEeymPnZDREeXJA3KBMQee+dKteAxZ2AtvQEvVYdZf241Q==}
+ hasBin: true
+ dev: true
+
+ /bcrypt-pbkdf@1.0.2:
+ resolution: {integrity: sha512-qeFIXtP4MSoi6NLqO12WfqARWWuCKi2Rn/9hJLEmtB5yTNr9DqFWkJRCf2qShWzPeAMRnOgCrq0sg/KLv5ES9w==}
+ dependencies:
+ tweetnacl: 0.14.5
+ dev: true
+
+ /bech32@1.1.4:
+ resolution: {integrity: sha512-s0IrSOzLlbvX7yp4WBfPITzpAU8sqQcpsmwXDiKwrG4r491vwCO/XpejasRNl0piBMe/DvP4Tz0mIS/X1DPJBQ==}
+ dev: true
+
+ /bech32@2.0.0:
+ resolution: {integrity: sha512-LcknSilhIGatDAsY1ak2I8VtGaHNhgMSYVxFrGLXv+xLHytaKZKcaUJJUE7qmBr7h33o5YQwP55pMI0xmkpJwg==}
+ dev: true
+
+ /bigint-buffer@1.1.5:
+ resolution: {integrity: sha512-trfYco6AoZ+rKhKnxA0hgX0HAbVP/s808/EuDSe2JDzUnCp/xAsli35Orvk67UrTEcwuxZqYZDmfA2RXJgxVvA==}
+ engines: {node: '>= 10.0.0'}
+ requiresBuild: true
+ dependencies:
+ bindings: 1.5.0
+ dev: true
+
+ /bignumber.js@9.3.1:
+ resolution: {integrity: sha512-Ko0uX15oIUS7wJ3Rb30Fs6SkVbLmPBAKdlm7q9+ak9bbIeFf0MwuBsQV6z7+X768/cHsfg+WlysDWJcmthjsjQ==}
+ dev: true
+
+ /binary-extensions@2.3.0:
+ resolution: {integrity: sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==}
+ engines: {node: '>=8'}
+ dev: true
+
+ /bindings@1.5.0:
+ resolution: {integrity: sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==}
+ dependencies:
+ file-uri-to-path: 1.0.0
+ dev: true
+
+ /bip32@5.0.0(typescript@5.9.3):
+ resolution: {integrity: sha512-h043yQ9n3iU4WZ8KLRpEECMl3j1yx2DQ1kcPlzWg8VZC0PtukbDiyLDKbe6Jm79mL6Tfg+WFuZMYxnzVyr/Hyw==}
+ engines: {node: '>=18.0.0'}
+ dependencies:
+ '@noble/hashes': 1.8.0
+ '@scure/base': 1.2.6
+ uint8array-tools: 0.0.8
+ valibot: 0.37.0(typescript@5.9.3)
+ wif: 5.0.0
+ transitivePeerDependencies:
+ - typescript
+ dev: true
+
+ /bip39@3.0.4:
+ resolution: {integrity: sha512-YZKQlb752TrUWqHWj7XAwCSjYEgGAk+/Aas3V7NyjQeZYsztO8JnQUaCWhcnL4T+jL8nvB8typ2jRPzTlgugNw==}
+ dependencies:
+ '@types/node': 11.11.6
+ create-hash: 1.2.0
+ pbkdf2: 3.1.5
+ randombytes: 2.1.0
+ dev: true
+
+ /bip39@3.1.0:
+ resolution: {integrity: sha512-c9kiwdk45Do5GL0vJMe7tS95VjCii65mYAH7DfWl3uW8AVzXKQVUm64i3hzVybBDMp9r7j9iNxR85+ul8MdN/A==}
+ dependencies:
+ '@noble/hashes': 1.8.0
+ dev: true
+
+ /blakejs@1.2.1:
+ resolution: {integrity: sha512-QXUSXI3QVc/gJME0dBpXrag1kbzOqCjCX8/b54ntNyW6sjtoqxqRk3LTmXzaJoh71zMsDCjM+47jS7XiwN/+fQ==}
+ dev: true
+
+ /bluebird@3.7.2:
+ resolution: {integrity: sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==}
+ dev: true
+
+ /bn.js@4.11.6:
+ resolution: {integrity: sha512-XWwnNNFCuuSQ0m3r3C4LE3EiORltHd9M05pq6FOlVeiophzRbMo50Sbz1ehl8K3Z+jw9+vmgnXefY1hz8X+2wA==}
+ dev: true
+
+ /bn.js@4.12.2:
+ resolution: {integrity: sha512-n4DSx829VRTRByMRGdjQ9iqsN0Bh4OolPsFnaZBLcbi8iXcB+kJ9s7EnRt4wILZNV3kPLHkRVfOc/HvhC3ovDw==}
+ dev: true
+
+ /bn.js@5.2.2:
+ resolution: {integrity: sha512-v2YAxEmKaBLahNwE1mjp4WON6huMNeuDvagFZW+ASCuA/ku0bXR9hSMw0XpiqMoA3+rmnyck/tPRSFQkoC9Cuw==}
+ dev: true
+
+ /body-parser@1.20.3:
+ resolution: {integrity: sha512-7rAxByjUMqQ3/bHJy7D6OGXvx/MMc4IqBn/X0fcM1QUcAItpZrBEYhWGem+tzXH90c+G01ypMcYJBO9Y30203g==}
+ engines: {node: '>= 0.8', npm: 1.2.8000 || >= 1.4.16}
+ dependencies:
+ bytes: 3.1.2
+ content-type: 1.0.5
+ debug: 2.6.9
+ depd: 2.0.0
+ destroy: 1.2.0
+ http-errors: 2.0.0
+ iconv-lite: 0.4.24
+ on-finished: 2.4.1
+ qs: 6.13.0
+ raw-body: 2.5.2
+ type-is: 1.6.18
+ unpipe: 1.0.0
+ transitivePeerDependencies:
+ - supports-color
+ dev: true
+
+ /borsh@0.7.0:
+ resolution: {integrity: sha512-CLCsZGIBCFnPtkNnieW/a8wmreDmfUtjU2m9yHrzPXIlNbqVs0AQrSatSG6vdNYUqdc83tkQi2eHfF98ubzQLA==}
+ dependencies:
+ bn.js: 5.2.2
+ bs58: 4.0.1
+ text-encoding-utf-8: 1.0.2
+ dev: true
+
+ /boxen@5.1.2:
+ resolution: {integrity: sha512-9gYgQKXx+1nP8mP7CzFyaUARhg7D3n1dF/FnErWmu9l6JvGpNUN278h0aSb+QjoiKSWG+iZ3uHrcqk0qrY9RQQ==}
+ engines: {node: '>=10'}
+ dependencies:
+ ansi-align: 3.0.1
+ camelcase: 6.3.0
+ chalk: 4.1.2
+ cli-boxes: 2.2.1
+ string-width: 4.2.3
+ type-fest: 0.20.2
+ widest-line: 3.1.0
+ wrap-ansi: 7.0.0
+ dev: true
+
+ /brace-expansion@1.1.12:
+ resolution: {integrity: sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==}
+ dependencies:
+ balanced-match: 1.0.2
+ concat-map: 0.0.1
+ dev: true
+
+ /brace-expansion@2.0.2:
+ resolution: {integrity: sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==}
+ dependencies:
+ balanced-match: 1.0.2
+ dev: true
+
+ /braces@3.0.3:
+ resolution: {integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==}
+ engines: {node: '>=8'}
+ dependencies:
+ fill-range: 7.1.1
+ dev: true
+
+ /brorand@1.1.0:
+ resolution: {integrity: sha512-cKV8tMCEpQs4hK/ik71d6LrPOnpkpGBR0wzxqr68g2m/LB2GxVYQroAjMJZRVM1Y4BCjCKc3vAamxSzOY2RP+w==}
+ dev: true
+
+ /browser-headers@0.4.1:
+ resolution: {integrity: sha512-CA9hsySZVo9371qEHjHZtYxV2cFtVj5Wj/ZHi8ooEsrtm4vOnl9Y9HmyYWk9q+05d7K3rdoAE0j3MVEFVvtQtg==}
+ dev: true
+
+ /browser-stdout@1.3.1:
+ resolution: {integrity: sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==}
+ dev: true
+
+ /browserify-aes@1.2.0:
+ resolution: {integrity: sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA==}
+ dependencies:
+ buffer-xor: 1.0.3
+ cipher-base: 1.0.7
+ create-hash: 1.2.0
+ evp_bytestokey: 1.0.3
+ inherits: 2.0.4
+ safe-buffer: 5.2.1
+ dev: true
+
+ /browserslist@4.27.0:
+ resolution: {integrity: sha512-AXVQwdhot1eqLihwasPElhX2tAZiBjWdJ9i/Zcj2S6QYIjkx62OKSfnobkriB81C3l4w0rVy3Nt4jaTBltYEpw==}
+ engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7}
+ hasBin: true
+ dependencies:
+ baseline-browser-mapping: 2.8.21
+ caniuse-lite: 1.0.30001751
+ electron-to-chromium: 1.5.243
+ node-releases: 2.0.27
+ update-browserslist-db: 1.1.4(browserslist@4.27.0)
+ dev: true
+
+ /bs58@4.0.1:
+ resolution: {integrity: sha512-Ok3Wdf5vOIlBrgCvTq96gBkJw+JUEzdBgyaza5HLtPm7yTHkjRy8+JzNyHF7BHa0bNWOQIp3m5YF0nnFcOIKLw==}
+ dependencies:
+ base-x: 3.0.11
+ dev: true
+
+ /bs58@5.0.0:
+ resolution: {integrity: sha512-r+ihvQJvahgYT50JD05dyJNKlmmSlMoOGwn1lCcEzanPglg7TxYjioQUYehQ9mAR/+hOSd2jRc/Z2y5UxBymvQ==}
+ dependencies:
+ base-x: 4.0.1
+ dev: true
+
+ /bs58@6.0.0:
+ resolution: {integrity: sha512-PD0wEnEYg6ijszw/u8s+iI3H17cTymlrwkKhDhPZq+Sokl3AU4htyBFTjAeNAlCCmg0f53g6ih3jATyCKftTfw==}
+ dependencies:
+ base-x: 5.0.1
+ dev: true
+
+ /bs58check@2.1.2:
+ resolution: {integrity: sha512-0TS1jicxdU09dwJMNZtVAfzPi6Q6QeN0pM1Fkzrjn+XYHvzMKPU3pHVpva+769iNVSfIYWf7LJ6WR+BuuMf8cA==}
+ dependencies:
+ bs58: 4.0.1
+ create-hash: 1.2.0
+ safe-buffer: 5.2.1
+ dev: true
+
+ /bs58check@4.0.0:
+ resolution: {integrity: sha512-FsGDOnFg9aVI9erdriULkd/JjEWONV/lQE5aYziB5PoBsXRind56lh8doIZIc9X4HoxT5x4bLjMWN1/NB8Zp5g==}
+ dependencies:
+ '@noble/hashes': 1.8.0
+ bs58: 6.0.0
+ dev: true
+
+ /bser@2.1.1:
+ resolution: {integrity: sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==}
+ dependencies:
+ node-int64: 0.4.0
+ dev: true
+
+ /buffer-from@1.1.2:
+ resolution: {integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==}
+ dev: true
+
+ /buffer-layout@1.2.2:
+ resolution: {integrity: sha512-kWSuLN694+KTk8SrYvCqwP2WcgQjoRCiF5b4QDvkkz8EmgD+aWAIceGFKMIAdmF/pH+vpgNV3d3kAKorcdAmWA==}
+ engines: {node: '>=4.5'}
+ dev: true
+
+ /buffer-to-arraybuffer@0.0.5:
+ resolution: {integrity: sha512-3dthu5CYiVB1DEJp61FtApNnNndTckcqe4pFcLdvHtrpG+kcyekCJKg4MRiDcFW7A6AODnXB9U4dwQiCW5kzJQ==}
+ dev: true
+
+ /buffer-xor@1.0.3:
+ resolution: {integrity: sha512-571s0T7nZWK6vB67HI5dyUF7wXiNcfaPPPTl6zYCNApANjIvYJTg7hlud/+cJpdAhS7dVzqMLmfhfHR3rAcOjQ==}
+ dev: true
+
+ /buffer-xor@2.0.2:
+ resolution: {integrity: sha512-eHslX0bin3GB+Lx2p7lEYRShRewuNZL3fUl4qlVJGGiwoPGftmt8JQgk2Y9Ji5/01TnVDo33E5b5O3vUB1HdqQ==}
+ dependencies:
+ safe-buffer: 5.2.1
+ dev: true
+
+ /buffer@5.7.1:
+ resolution: {integrity: sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==}
+ dependencies:
+ base64-js: 1.5.1
+ ieee754: 1.2.1
+ dev: true
+
+ /buffer@6.0.3:
+ resolution: {integrity: sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==}
+ dependencies:
+ base64-js: 1.5.1
+ ieee754: 1.2.1
+ dev: true
+
+ /bufferutil@4.0.5:
+ resolution: {integrity: sha512-HTm14iMQKK2FjFLRTM5lAVcyaUzOnqbPtesFIvREgXpJHdQm8bWS+GkQgIkfaBYRHuCnea7w8UVNfwiAQhlr9A==}
+ engines: {node: '>=6.14.2'}
+ requiresBuild: true
+ dependencies:
+ node-gyp-build: 4.8.4
+ dev: true
+ optional: true
+
+ /bufferutil@4.0.9:
+ resolution: {integrity: sha512-WDtdLmJvAuNNPzByAYpRo2rF1Mmradw6gvWsQKf63476DDXmomT9zUiGypLcG4ibIM67vhAj8jJRdbmEws2Aqw==}
+ engines: {node: '>=6.14.2'}
+ requiresBuild: true
+ dependencies:
+ node-gyp-build: 4.8.4
+ dev: true
+
+ /bufio@1.2.3:
+ resolution: {integrity: sha512-5Tt66bRzYUSlVZatc0E92uDenreJ+DpTBmSAUwL4VSxJn3e6cUyYwx+PoqML0GRZatgA/VX8ybhxItF8InZgqA==}
+ engines: {node: '>=8.0.0'}
+ dev: true
+
+ /bytes@3.1.2:
+ resolution: {integrity: sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==}
+ engines: {node: '>= 0.8'}
+ dev: true
+
+ /cacheable-lookup@5.0.4:
+ resolution: {integrity: sha512-2/kNscPhpcxrOigMZzbiWF7dz8ilhb/nIHU3EyZiXWXpeq/au8qJ8VhdftMkty3n7Gj6HIGalQG8oiBNB3AJgA==}
+ engines: {node: '>=10.6.0'}
+ dev: true
+
+ /cacheable-lookup@6.1.0:
+ resolution: {integrity: sha512-KJ/Dmo1lDDhmW2XDPMo+9oiy/CeqosPguPCrgcVzKyZrL6pM1gU2GmPY/xo6OQPTUaA/c0kwHuywB4E6nmT9ww==}
+ engines: {node: '>=10.6.0'}
+ dev: true
+
+ /cacheable-lookup@7.0.0:
+ resolution: {integrity: sha512-+qJyx4xiKra8mZrcwhjMRMUhD5NR1R8esPkzIYxX96JiecFoxAXFuz/GpR3+ev4PE1WamHip78wV0vcmPQtp8w==}
+ engines: {node: '>=14.16'}
+ dev: true
+
+ /cacheable-request@10.2.14:
+ resolution: {integrity: sha512-zkDT5WAF4hSSoUgyfg5tFIxz8XQK+25W/TLVojJTMKBaxevLBBtLxgqguAuVQB8PVW79FVjHcU+GJ9tVbDZ9mQ==}
+ engines: {node: '>=14.16'}
+ dependencies:
+ '@types/http-cache-semantics': 4.0.4
+ get-stream: 6.0.1
+ http-cache-semantics: 4.2.0
+ keyv: 4.5.4
+ mimic-response: 4.0.0
+ normalize-url: 8.1.0
+ responselike: 3.0.0
+ dev: true
+
+ /cacheable-request@7.0.4:
+ resolution: {integrity: sha512-v+p6ongsrp0yTGbJXjgxPow2+DL93DASP4kXCDKb8/bwRtt9OEF3whggkkDkGNzgcWy2XaF4a8nZglC7uElscg==}
+ engines: {node: '>=8'}
+ dependencies:
+ clone-response: 1.0.3
+ get-stream: 5.2.0
+ http-cache-semantics: 4.2.0
+ keyv: 4.5.4
+ lowercase-keys: 2.0.0
+ normalize-url: 6.1.0
+ responselike: 2.0.1
+ dev: true
+
+ /call-bind-apply-helpers@1.0.2:
+ resolution: {integrity: sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==}
+ engines: {node: '>= 0.4'}
+ dependencies:
+ es-errors: 1.3.0
+ function-bind: 1.1.2
+ dev: true
+
+ /call-bind@1.0.8:
+ resolution: {integrity: sha512-oKlSFMcMwpUg2ednkhQ454wfWiU/ul3CkJe/PEHcTKuiX6RpbehUiFMXu13HalGZxfUwCQzZG747YXBn1im9ww==}
+ engines: {node: '>= 0.4'}
+ dependencies:
+ call-bind-apply-helpers: 1.0.2
+ es-define-property: 1.0.1
+ get-intrinsic: 1.3.0
+ set-function-length: 1.2.2
+ dev: true
+
+ /call-bound@1.0.4:
+ resolution: {integrity: sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==}
+ engines: {node: '>= 0.4'}
+ dependencies:
+ call-bind-apply-helpers: 1.0.2
+ get-intrinsic: 1.3.0
+ dev: true
+
+ /callsites@3.1.0:
+ resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==}
+ engines: {node: '>=6'}
+ dev: true
+
+ /camelcase@3.0.0:
+ resolution: {integrity: sha512-4nhGqUkc4BqbBBB4Q6zLuD7lzzrHYrjKGeYaEji/3tFR5VdJu9v+LilhGIVe8wxEJPPOeWo7eg8dwY13TZ1BNg==}
+ engines: {node: '>=0.10.0'}
+ dev: true
+
+ /camelcase@5.3.1:
+ resolution: {integrity: sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==}
+ engines: {node: '>=6'}
+ dev: true
+
+ /camelcase@6.3.0:
+ resolution: {integrity: sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==}
+ engines: {node: '>=10'}
+ dev: true
+
+ /caniuse-lite@1.0.30001751:
+ resolution: {integrity: sha512-A0QJhug0Ly64Ii3eIqHu5X51ebln3k4yTUkY1j8drqpWHVreg/VLijN48cZ1bYPiqOQuqpkIKnzr/Ul8V+p6Cw==}
+ dev: true
+
+ /caseless@0.12.0:
+ resolution: {integrity: sha512-4tYFyifaFfGacoiObjJegolkwSU4xQNGbVgUiNYVUxbQ2x2lUsFvY4hVgVzGiIe6WLOPqycWXA40l+PWsxthUw==}
+ dev: true
+
+ /chai@4.5.0:
+ resolution: {integrity: sha512-RITGBfijLkBddZvnn8jdqoTypxvqbOLYQkGGxXzeFjVHvudaPw0HNFD9x928/eUwYWd2dPCugVqspGALTZZQKw==}
+ engines: {node: '>=4'}
+ dependencies:
+ assertion-error: 1.1.0
+ check-error: 1.0.3
+ deep-eql: 4.1.4
+ get-func-name: 2.0.2
+ loupe: 2.3.7
+ pathval: 1.1.1
+ type-detect: 4.1.0
+ dev: true
+
+ /chalk@2.4.2:
+ resolution: {integrity: sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==}
+ engines: {node: '>=4'}
+ dependencies:
+ ansi-styles: 3.2.1
+ escape-string-regexp: 1.0.5
+ supports-color: 5.5.0
+ dev: true
+
+ /chalk@4.1.2:
+ resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==}
+ engines: {node: '>=10'}
+ dependencies:
+ ansi-styles: 4.3.0
+ supports-color: 7.2.0
+ dev: true
+
+ /chalk@5.6.2:
+ resolution: {integrity: sha512-7NzBL0rN6fMUW+f7A6Io4h40qQlG+xGmtMxfbnH/K7TAtt8JQWVQK+6g0UXKMeVJoyV5EkkNsErQ8pVD3bLHbA==}
+ engines: {node: ^12.17.0 || ^14.13 || >=16.0.0}
+ dev: true
+
+ /char-regex@1.0.2:
+ resolution: {integrity: sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==}
+ engines: {node: '>=10'}
+ dev: true
+
+ /check-error@1.0.3:
+ resolution: {integrity: sha512-iKEoDYaRmd1mxM90a2OEfWhjsjPpYPuQ+lMYsoxB126+t8fw7ySEO48nmDg5COTjxDI65/Y2OWpeEHk3ZOe8zg==}
+ dependencies:
+ get-func-name: 2.0.2
+ dev: true
+
+ /chokidar@3.6.0:
+ resolution: {integrity: sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==}
+ engines: {node: '>= 8.10.0'}
+ dependencies:
+ anymatch: 3.1.3
+ braces: 3.0.3
+ glob-parent: 5.1.2
+ is-binary-path: 2.1.0
+ is-glob: 4.0.3
+ normalize-path: 3.0.0
+ readdirp: 3.6.0
+ optionalDependencies:
+ fsevents: 2.3.3
+ dev: true
+
+ /chokidar@4.0.3:
+ resolution: {integrity: sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA==}
+ engines: {node: '>= 14.16.0'}
+ dependencies:
+ readdirp: 4.1.2
+ dev: true
+
+ /chownr@1.1.4:
+ resolution: {integrity: sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==}
+ dev: true
+
+ /ci-info@2.0.0:
+ resolution: {integrity: sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==}
+ dev: true
+
+ /ci-info@3.9.0:
+ resolution: {integrity: sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==}
+ engines: {node: '>=8'}
+ dev: true
+
+ /cids@0.7.5:
+ resolution: {integrity: sha512-zT7mPeghoWAu+ppn8+BS1tQ5qGmbMfB4AregnQjA/qHY3GC1m1ptI9GkWNlgeu38r7CuRdXB47uY2XgAYt6QVA==}
+ engines: {node: '>=4.0.0', npm: '>=3.0.0'}
+ deprecated: This module has been superseded by the multiformats module
+ dependencies:
+ buffer: 5.7.1
+ class-is: 1.1.0
+ multibase: 0.6.1
+ multicodec: 1.0.4
+ multihashes: 0.4.21
+ dev: true
+
+ /cipher-base@1.0.7:
+ resolution: {integrity: sha512-Mz9QMT5fJe7bKI7MH31UilT5cEK5EHHRCccw/YRFsRY47AuNgaV6HY3rscp0/I4Q+tTW/5zoqpSeRRI54TkDWA==}
+ engines: {node: '>= 0.10'}
+ dependencies:
+ inherits: 2.0.4
+ safe-buffer: 5.2.1
+ to-buffer: 1.2.2
+ dev: true
+
+ /cjs-module-lexer@1.4.3:
+ resolution: {integrity: sha512-9z8TZaGM1pfswYeXrUpzPrkx8UnWYdhJclsiYMm6x/w5+nN+8Tf/LnAgfLGQCm59qAOxU8WwHEq2vNwF6i4j+Q==}
+ dev: true
+
+ /class-is@1.1.0:
+ resolution: {integrity: sha512-rhjH9AG1fvabIDoGRVH587413LPjTZgmDF9fOFCbFJQV4yuocX1mHxxvXI4g3cGwbVY9wAYIoKlg1N79frJKQw==}
+ dev: true
+
+ /clean-stack@2.2.0:
+ resolution: {integrity: sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==}
+ engines: {node: '>=6'}
+ dev: true
+
+ /cli-boxes@2.2.1:
+ resolution: {integrity: sha512-y4coMcylgSCdVinjiDBuR8PCC2bLjyGTwEmPb9NHR/QaNU6EUOXcTY/s6VjGMD6ENSEaeQYHCY0GNGS5jfMwPw==}
+ engines: {node: '>=6'}
+ dev: true
+
+ /cli-cursor@3.1.0:
+ resolution: {integrity: sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==}
+ engines: {node: '>=8'}
+ dependencies:
+ restore-cursor: 3.1.0
+ dev: true
+
+ /cli-table3@0.6.5:
+ resolution: {integrity: sha512-+W/5efTR7y5HRD7gACw9yQjqMVvEMLBHmboM/kPWam+H+Hmyrgjh6YncVKK122YZkXrLudzTuAukUw9FnMf7IQ==}
+ engines: {node: 10.* || >= 12.*}
+ dependencies:
+ string-width: 4.2.3
+ optionalDependencies:
+ '@colors/colors': 1.5.0
+ dev: true
+
+ /cli-truncate@2.1.0:
+ resolution: {integrity: sha512-n8fOixwDD6b/ObinzTrp1ZKFzbgvKZvuz/TvejnLn1aQfC6r52XEx85FmuC+3HI+JM7coBRXUvNqEU2PHVrHpg==}
+ engines: {node: '>=8'}
+ dependencies:
+ slice-ansi: 3.0.0
+ string-width: 4.2.3
+ dev: true
+
+ /cliui@3.2.0:
+ resolution: {integrity: sha512-0yayqDxWQbqk3ojkYqUKqaAQ6AfNKeKWRNA8kR0WXzAsdHpP4BIaOmMAG87JGuO6qcobyW4GjxHd9PmhEd+T9w==}
+ dependencies:
+ string-width: 1.0.2
+ strip-ansi: 3.0.1
+ wrap-ansi: 2.1.0
+ dev: true
+
+ /cliui@7.0.4:
+ resolution: {integrity: sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==}
+ dependencies:
+ string-width: 4.2.3
+ strip-ansi: 6.0.1
+ wrap-ansi: 7.0.0
+ dev: true
+
+ /cliui@8.0.1:
+ resolution: {integrity: sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==}
+ engines: {node: '>=12'}
+ dependencies:
+ string-width: 4.2.3
+ strip-ansi: 6.0.1
+ wrap-ansi: 7.0.0
+ dev: true
+
+ /clone-response@1.0.3:
+ resolution: {integrity: sha512-ROoL94jJH2dUVML2Y/5PEDNaSHgeOdSDicUyS7izcF63G6sTc/FTjLub4b8Il9S8S0beOfYt0TaA5qvFK+w0wA==}
+ dependencies:
+ mimic-response: 1.0.1
+ dev: true
+
+ /co@4.6.0:
+ resolution: {integrity: sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ==}
+ engines: {iojs: '>= 1.0.0', node: '>= 0.12.0'}
+ dev: true
+
+ /code-excerpt@3.0.0:
+ resolution: {integrity: sha512-VHNTVhd7KsLGOqfX3SyeO8RyYPMp1GJOg194VITk04WMYCv4plV68YWe6TJZxd9MhobjtpMRnVky01gqZsalaw==}
+ engines: {node: '>=10'}
+ dependencies:
+ convert-to-spaces: 1.0.2
+ dev: true
+
+ /code-point-at@1.1.0:
+ resolution: {integrity: sha512-RpAVKQA5T63xEj6/giIbUEtZwJ4UFIc3ZtvEkiaUERylqe8xb5IvqcgOurZLahv93CLKfxcw5YI+DZcUBRyLXA==}
+ engines: {node: '>=0.10.0'}
+ dev: true
+
+ /collect-v8-coverage@1.0.3:
+ resolution: {integrity: sha512-1L5aqIkwPfiodaMgQunkF1zRhNqifHBmtbbbxcr6yVxxBnliw4TDOW6NxpO8DJLgJ16OT+Y4ztZqP6p/FtXnAw==}
+ dev: true
+
+ /color-convert@1.9.3:
+ resolution: {integrity: sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==}
+ dependencies:
+ color-name: 1.1.3
+ dev: true
+
+ /color-convert@2.0.1:
+ resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==}
+ engines: {node: '>=7.0.0'}
+ dependencies:
+ color-name: 1.1.4
+ dev: true
+
+ /color-convert@3.1.2:
+ resolution: {integrity: sha512-UNqkvCDXstVck3kdowtOTWROIJQwafjOfXSmddoDrXo4cewMKmusCeF22Q24zvjR8nwWib/3S/dfyzPItPEiJg==}
+ engines: {node: '>=14.6'}
+ dependencies:
+ color-name: 2.0.2
+ dev: true
+
+ /color-name@1.1.3:
+ resolution: {integrity: sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==}
+ dev: true
+
+ /color-name@1.1.4:
+ resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==}
+ dev: true
+
+ /color-name@2.0.2:
+ resolution: {integrity: sha512-9vEt7gE16EW7Eu7pvZnR0abW9z6ufzhXxGXZEVU9IqPdlsUiMwJeJfRtq0zePUmnbHGT9zajca7mX8zgoayo4A==}
+ engines: {node: '>=12.20'}
+ dev: true
+
+ /color-string@2.1.2:
+ resolution: {integrity: sha512-RxmjYxbWemV9gKu4zPgiZagUxbH3RQpEIO77XoSSX0ivgABDZ+h8Zuash/EMFLTI4N9QgFPOJ6JQpPZKFxa+dA==}
+ engines: {node: '>=18'}
+ dependencies:
+ color-name: 2.0.2
+ dev: true
+
+ /color@5.0.2:
+ resolution: {integrity: sha512-e2hz5BzbUPcYlIRHo8ieAhYgoajrJr+hWoceg6E345TPsATMUKqDgzt8fSXZJJbxfpiPzkWyphz8yn8At7q3fA==}
+ engines: {node: '>=18'}
+ dependencies:
+ color-convert: 3.1.2
+ color-string: 2.1.2
+ dev: true
+
+ /combined-stream@1.0.8:
+ resolution: {integrity: sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==}
+ engines: {node: '>= 0.8'}
+ dependencies:
+ delayed-stream: 1.0.0
+ dev: true
+
+ /command-exists@1.2.9:
+ resolution: {integrity: sha512-LTQ/SGc+s0Xc0Fu5WaKnR0YiygZkm9eKFvyS+fRsU7/ZWFF8ykFM6Pc9aCVf1+xasOOZpO3BAVgVrKvsqKHV7w==}
+ dev: true
+
+ /command-line-args@5.2.1:
+ resolution: {integrity: sha512-H4UfQhZyakIjC74I9d34fGYDwk3XpSr17QhEd0Q3I9Xq1CETHo4Hcuo87WyWHpAF1aSLjLRf5lD9ZGX2qStUvg==}
+ engines: {node: '>=4.0.0'}
+ dependencies:
+ array-back: 3.1.0
+ find-replace: 3.0.0
+ lodash.camelcase: 4.3.0
+ typical: 4.0.0
+ dev: true
+
+ /command-line-usage@6.1.3:
+ resolution: {integrity: sha512-sH5ZSPr+7UStsloltmDh7Ce5fb8XPlHyoPzTpyyMuYCtervL65+ubVZ6Q61cFtFl62UyJlc8/JwERRbAFPUqgw==}
+ engines: {node: '>=8.0.0'}
+ dependencies:
+ array-back: 4.0.2
+ chalk: 2.4.2
+ table-layout: 1.0.2
+ typical: 5.2.0
+ dev: true
+
+ /commander@10.0.1:
+ resolution: {integrity: sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug==}
+ engines: {node: '>=14'}
+ dev: true
+
+ /commander@12.1.0:
+ resolution: {integrity: sha512-Vw8qHK3bZM9y/P10u3Vib8o/DdkvA2OtPtZvD871QKjy74Wj1WSKFILMPRPSdUSx5RFK1arlJzEtA4PkFgnbuA==}
+ engines: {node: '>=18'}
+ dev: true
+
+ /commander@14.0.2:
+ resolution: {integrity: sha512-TywoWNNRbhoD0BXs1P3ZEScW8W5iKrnbithIl0YH+uCmBd0QpPOA8yc82DS3BIE5Ma6FnBVUsJ7wVUDz4dvOWQ==}
+ engines: {node: '>=20'}
+ dev: true
+
+ /commander@2.20.3:
+ resolution: {integrity: sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==}
+ dev: true
+
+ /commander@8.3.0:
+ resolution: {integrity: sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww==}
+ engines: {node: '>= 12'}
+ dev: true
+
+ /concat-map@0.0.1:
+ resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==}
+ dev: true
+
+ /concurrently@9.1.2:
+ resolution: {integrity: sha512-H9MWcoPsYddwbOGM6difjVwVZHl63nwMEwDJG/L7VGtuaJhb12h2caPG2tVPWs7emuYix252iGfqOyrz1GczTQ==}
+ engines: {node: '>=18'}
+ hasBin: true
+ dependencies:
+ chalk: 4.1.2
+ lodash: 4.17.21
+ rxjs: 7.8.2
+ shell-quote: 1.8.3
+ supports-color: 8.1.1
+ tree-kill: 1.2.2
+ yargs: 17.7.2
+ dev: true
+
+ /config-chain@1.1.13:
+ resolution: {integrity: sha512-qj+f8APARXHrM0hraqXYb2/bOVSV4PvJQlNZ/DVj0QrmNM2q2euizkeuVckQ57J+W0mRH6Hvi+k50M4Jul2VRQ==}
+ dependencies:
+ ini: 1.3.8
+ proto-list: 1.2.4
+ dev: true
+
+ /content-disposition@0.5.4:
+ resolution: {integrity: sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==}
+ engines: {node: '>= 0.6'}
+ dependencies:
+ safe-buffer: 5.2.1
+ dev: true
+
+ /content-hash@2.5.2:
+ resolution: {integrity: sha512-FvIQKy0S1JaWV10sMsA7TRx8bpU+pqPkhbsfvOJAdjRXvYxEckAwQWGwtRjiaJfh+E0DvcWUGqcdjwMGFjsSdw==}
+ dependencies:
+ cids: 0.7.5
+ multicodec: 0.5.7
+ multihashes: 0.4.21
+ dev: true
+
+ /content-type@1.0.5:
+ resolution: {integrity: sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==}
+ engines: {node: '>= 0.6'}
+ dev: true
+
+ /convert-source-map@2.0.0:
+ resolution: {integrity: sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==}
+ dev: true
+
+ /convert-to-spaces@1.0.2:
+ resolution: {integrity: sha512-cj09EBuObp9gZNQCzc7hByQyrs6jVGE+o9kSJmeUoj+GiPiJvi5LYqEH/Hmme4+MTLHM+Ejtq+FChpjjEnsPdQ==}
+ engines: {node: '>= 4'}
+ dev: true
+
+ /cookie-signature@1.0.6:
+ resolution: {integrity: sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==}
+ dev: true
+
+ /cookie@0.4.2:
+ resolution: {integrity: sha512-aSWTXFzaKWkvHO1Ny/s+ePFpvKsPnjc551iI41v3ny/ow6tBG5Vd+FuqGNhh1LxOmVzOlGUriIlOaokOvhaStA==}
+ engines: {node: '>= 0.6'}
+ dev: true
+
+ /cookie@0.7.1:
+ resolution: {integrity: sha512-6DnInpx7SJ2AK3+CTUE/ZM0vWTUboZCegxhC2xiIydHR9jNuTAASBrfEpHhiGOZw/nX51bHt6YQl8jsGo4y/0w==}
+ engines: {node: '>= 0.6'}
+ dev: true
+
+ /core-js-pure@3.46.0:
+ resolution: {integrity: sha512-NMCW30bHNofuhwLhYPt66OLOKTMbOhgTTatKVbaQC3KRHpTCiRIBYvtshr+NBYSnBxwAFhjW/RfJ0XbIjS16rw==}
+ requiresBuild: true
+ dev: true
+
+ /core-util-is@1.0.2:
+ resolution: {integrity: sha512-3lqz5YjWTYnW6dlDa5TLaTCcShfar1e40rmcJVwCBJC6mWlFuj0eCHIElmG1g5kyuJ/GD+8Wn4FFCcz4gJPfaQ==}
+ dev: true
+
+ /core-util-is@1.0.3:
+ resolution: {integrity: sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==}
+ dev: true
+
+ /cors@2.8.5:
+ resolution: {integrity: sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==}
+ engines: {node: '>= 0.10'}
+ dependencies:
+ object-assign: 4.1.1
+ vary: 1.1.2
+ dev: true
+
+ /cosmiconfig@8.3.6(typescript@5.9.3):
+ resolution: {integrity: sha512-kcZ6+W5QzcJ3P1Mt+83OUv/oHFqZHIx8DuxG6eZ5RGMERoLqp4BuGjhHLYGK+Kf5XVkQvqBSmAy/nGWN3qDgEA==}
+ engines: {node: '>=14'}
+ peerDependencies:
+ typescript: '>=4.9.5'
+ peerDependenciesMeta:
+ typescript:
+ optional: true
+ dependencies:
+ import-fresh: 3.3.1
+ js-yaml: 4.1.0
+ parse-json: 5.2.0
+ path-type: 4.0.0
+ typescript: 5.9.3
+ dev: true
+
+ /crc-32@1.2.2:
+ resolution: {integrity: sha512-ROmzCKrTnOwybPcJApAA6WBWij23HVfGVNKqqrZpuyZOHqK2CwHSvpGuyt/UNNvaIjEd8X5IFGp4Mh+Ie1IHJQ==}
+ engines: {node: '>=0.8'}
+ hasBin: true
+ dev: true
+
+ /create-hash@1.2.0:
+ resolution: {integrity: sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg==}
+ dependencies:
+ cipher-base: 1.0.7
+ inherits: 2.0.4
+ md5.js: 1.3.5
+ ripemd160: 2.0.3
+ sha.js: 2.4.12
+ dev: true
+
+ /create-hmac@1.1.7:
+ resolution: {integrity: sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg==}
+ dependencies:
+ cipher-base: 1.0.7
+ create-hash: 1.2.0
+ inherits: 2.0.4
+ ripemd160: 2.0.3
+ safe-buffer: 5.2.1
+ sha.js: 2.4.12
+ dev: true
+
+ /create-jest@29.7.0(@types/node@18.18.14)(ts-node@10.9.2):
+ resolution: {integrity: sha512-Adz2bdH0Vq3F53KEMJOoftQFutWCukm6J24wbPWRO4k1kMY7gS7ds/uoJkNuV8wDCtWWnuwGcJwpWcih+zEW1Q==}
+ engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
+ hasBin: true
+ dependencies:
+ '@jest/types': 29.6.3
+ chalk: 4.1.2
+ exit: 0.1.2
+ graceful-fs: 4.2.11
+ jest-config: 29.7.0(@types/node@18.18.14)(ts-node@10.9.2)
+ jest-util: 29.7.0
+ prompts: 2.4.2
+ transitivePeerDependencies:
+ - '@types/node'
+ - babel-plugin-macros
+ - supports-color
+ - ts-node
+ dev: true
+
+ /create-require@1.1.1:
+ resolution: {integrity: sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==}
+ dev: true
+
+ /cross-fetch@3.2.0:
+ resolution: {integrity: sha512-Q+xVJLoGOeIMXZmbUK4HYk+69cQH6LudR0Vu/pRm2YlU/hDV9CiS0gKUMaWY5f2NeUH9C1nV3bsTlCo0FsTV1Q==}
+ dependencies:
+ node-fetch: 2.7.0
+ transitivePeerDependencies:
+ - encoding
+ dev: true
+
+ /cross-fetch@4.1.0:
+ resolution: {integrity: sha512-uKm5PU+MHTootlWEY+mZ4vvXoCn4fLQxT9dSc1sXVMSFkINTJVN8cAQROpwcKm8bJ/c7rgZVIBWzH5T78sNZZw==}
+ dependencies:
+ node-fetch: 2.7.0
+ transitivePeerDependencies:
+ - encoding
+ dev: true
+
+ /cross-spawn@7.0.6:
+ resolution: {integrity: sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==}
+ engines: {node: '>= 8'}
+ dependencies:
+ path-key: 3.1.1
+ shebang-command: 2.0.0
+ which: 2.0.2
+ dev: true
+
+ /crypto-hash@1.3.0:
+ resolution: {integrity: sha512-lyAZ0EMyjDkVvz8WOeVnuCPvKVBXcMv1l5SVqO1yC7PzTwrD/pPje/BIRbWhMoPe436U+Y2nD7f5bFx0kt+Sbg==}
+ engines: {node: '>=8'}
+ dev: true
+
+ /d@1.0.2:
+ resolution: {integrity: sha512-MOqHvMWF9/9MX6nza0KgvFH4HpMU0EF5uUDXqX/BtxtU8NfB0QzRtJ8Oe/6SuS4kbhyzVJwjd97EA4PKrzJ8bw==}
+ engines: {node: '>=0.12'}
+ dependencies:
+ es5-ext: 0.10.64
+ type: 2.7.3
+ dev: true
+
+ /dashdash@1.14.1:
+ resolution: {integrity: sha512-jRFi8UDGo6j+odZiEpjazZaWqEal3w/basFjQHQEwVtZJGDpxbH1MeYluwCS8Xq5wmLJooDlMgvVarmWfGM44g==}
+ engines: {node: '>=0.10'}
+ dependencies:
+ assert-plus: 1.0.0
+ dev: true
+
+ /data-view-buffer@1.0.2:
+ resolution: {integrity: sha512-EmKO5V3OLXh1rtK2wgXRansaK1/mtVdTUEiEI0W8RkvgT05kfxaH29PliLnpLP73yYO6142Q72QNa8Wx/A5CqQ==}
+ engines: {node: '>= 0.4'}
+ dependencies:
+ call-bound: 1.0.4
+ es-errors: 1.3.0
+ is-data-view: 1.0.2
+ dev: true
+
+ /data-view-byte-length@1.0.2:
+ resolution: {integrity: sha512-tuhGbE6CfTM9+5ANGf+oQb72Ky/0+s3xKUpHvShfiz2RxMFgFPjsXuRLBVMtvMs15awe45SRb83D6wH4ew6wlQ==}
+ engines: {node: '>= 0.4'}
+ dependencies:
+ call-bound: 1.0.4
+ es-errors: 1.3.0
+ is-data-view: 1.0.2
+ dev: true
+
+ /data-view-byte-offset@1.0.1:
+ resolution: {integrity: sha512-BS8PfmtDGnrgYdOonGZQdLZslWIeCGFP9tpan0hi1Co2Zr2NKADsvGYA8XxuG/4UWgJ6Cjtv+YJnB6MM69QGlQ==}
+ engines: {node: '>= 0.4'}
+ dependencies:
+ call-bound: 1.0.4
+ es-errors: 1.3.0
+ is-data-view: 1.0.2
+ dev: true
+
+ /dataloader@2.2.3:
+ resolution: {integrity: sha512-y2krtASINtPFS1rSDjacrFgn1dcUuoREVabwlOGOe4SdxenREqwjwjElAdwvbGM7kgZz9a3KVicWR7vcz8rnzA==}
+ dev: true
+
+ /dayjs@1.11.18:
+ resolution: {integrity: sha512-zFBQ7WFRvVRhKcWoUh+ZA1g2HVgUbsZm9sbddh8EC5iv93sui8DVVz1Npvz+r6meo9VKfa8NyLWBsQK1VvIKPA==}
+ dev: true
+
+ /debug@2.6.9:
+ resolution: {integrity: sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==}
+ peerDependencies:
+ supports-color: '*'
+ peerDependenciesMeta:
+ supports-color:
+ optional: true
+ dependencies:
+ ms: 2.0.0
+ dev: true
+
+ /debug@3.2.7:
+ resolution: {integrity: sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==}
+ peerDependencies:
+ supports-color: '*'
+ peerDependenciesMeta:
+ supports-color:
+ optional: true
+ dependencies:
+ ms: 2.1.3
+ dev: true
+
+ /debug@4.4.3(supports-color@8.1.1):
+ resolution: {integrity: sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==}
+ engines: {node: '>=6.0'}
+ peerDependencies:
+ supports-color: '*'
+ peerDependenciesMeta:
+ supports-color:
+ optional: true
+ dependencies:
+ ms: 2.1.3
+ supports-color: 8.1.1
+ dev: true
+
+ /decamelize@1.2.0:
+ resolution: {integrity: sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==}
+ engines: {node: '>=0.10.0'}
+ dev: true
+
+ /decamelize@4.0.0:
+ resolution: {integrity: sha512-9iE1PgSik9HeIIw2JO94IidnE3eBoQrFJ3w7sFuzSX4DpmZ3v5sZpUiV5Swcf6mQEF+Y0ru8Neo+p+nyh2J+hQ==}
+ engines: {node: '>=10'}
+ dev: true
+
+ /decode-uri-component@0.2.2:
+ resolution: {integrity: sha512-FqUYQ+8o158GyGTrMFJms9qh3CqTKvAqgqsTnkLI8sKu0028orqBhxNMFkFen0zGyg6epACD32pjVk58ngIErQ==}
+ engines: {node: '>=0.10'}
+ dev: true
+
+ /decompress-response@3.3.0:
+ resolution: {integrity: sha512-BzRPQuY1ip+qDonAOz42gRm/pg9F768C+npV/4JOsxRC2sq+Rlk+Q4ZCAsOhnIaMrgarILY+RMUIvMmmX1qAEA==}
+ engines: {node: '>=4'}
+ dependencies:
+ mimic-response: 1.0.1
+ dev: true
+
+ /decompress-response@6.0.0:
+ resolution: {integrity: sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==}
+ engines: {node: '>=10'}
+ dependencies:
+ mimic-response: 3.1.0
+ dev: true
+
+ /dedent@1.7.0:
+ resolution: {integrity: sha512-HGFtf8yhuhGhqO07SV79tRp+br4MnbdjeVxotpn1QBl30pcLLCQjX5b2295ll0fv8RKDKsmWYrl05usHM9CewQ==}
+ peerDependencies:
+ babel-plugin-macros: ^3.1.0
+ peerDependenciesMeta:
+ babel-plugin-macros:
+ optional: true
+ dev: true
+
+ /deep-eql@4.1.4:
+ resolution: {integrity: sha512-SUwdGfqdKOwxCPeVYjwSyRpJ7Z+fhpwIAtmCUdZIWZ/YP5R9WAsyuSgpLVDi9bjWoN2LXHNss/dk3urXtdQxGg==}
+ engines: {node: '>=6'}
+ dependencies:
+ type-detect: 4.1.0
+ dev: true
+
+ /deep-extend@0.6.0:
+ resolution: {integrity: sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==}
+ engines: {node: '>=4.0.0'}
+ dev: true
+
+ /deep-is@0.1.4:
+ resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==}
+ dev: true
+
+ /deepmerge@4.3.1:
+ resolution: {integrity: sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==}
+ engines: {node: '>=0.10.0'}
+ dev: true
+
+ /defer-to-connect@2.0.1:
+ resolution: {integrity: sha512-4tvttepXG1VaYGrRibk5EwJd1t4udunSOVMdLSAL6mId1ix438oPwPZMALY41FCijukO1L0twNcGsdzS7dHgDg==}
+ engines: {node: '>=10'}
+ dev: true
+
+ /deferred-leveldown@5.3.0:
+ resolution: {integrity: sha512-a59VOT+oDy7vtAbLRCZwWgxu2BaCfd5Hk7wxJd48ei7I+nsg8Orlb9CLG0PMZienk9BSUKgeAqkO2+Lw+1+Ukw==}
+ engines: {node: '>=6'}
+ deprecated: Superseded by abstract-level (https://github.com/Level/community#faq)
+ dependencies:
+ abstract-leveldown: 6.2.3
+ inherits: 2.0.4
+ dev: true
+
+ /define-data-property@1.1.4:
+ resolution: {integrity: sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==}
+ engines: {node: '>= 0.4'}
+ dependencies:
+ es-define-property: 1.0.1
+ es-errors: 1.3.0
+ gopd: 1.2.0
+ dev: true
+
+ /define-properties@1.2.1:
+ resolution: {integrity: sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==}
+ engines: {node: '>= 0.4'}
+ dependencies:
+ define-data-property: 1.1.4
+ has-property-descriptors: 1.0.2
+ object-keys: 1.1.1
+ dev: true
+
+ /delay@5.0.0:
+ resolution: {integrity: sha512-ReEBKkIfe4ya47wlPYf/gu5ib6yUG0/Aez0JQZQz94kiWtRQvZIQbTiehsnwHvLSWJnQdhVeqYue7Id1dKr0qw==}
+ engines: {node: '>=10'}
+ dev: true
+
+ /delayed-stream@1.0.0:
+ resolution: {integrity: sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==}
+ engines: {node: '>=0.4.0'}
+ dev: true
+
+ /depd@2.0.0:
+ resolution: {integrity: sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==}
+ engines: {node: '>= 0.8'}
+ dev: true
+
+ /destroy@1.2.0:
+ resolution: {integrity: sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==}
+ engines: {node: '>= 0.8', npm: 1.2.8000 || >= 1.4.16}
+ dev: true
+
+ /detect-indent@7.0.2:
+ resolution: {integrity: sha512-y+8xyqdGLL+6sh0tVeHcfP/QDd8gUgbasolJJpY7NgeQGSZ739bDtSiaiDgtoicy+mtYB81dKLxO9xRhCyIB3A==}
+ engines: {node: '>=12.20'}
+ dev: true
+
+ /detect-newline@3.1.0:
+ resolution: {integrity: sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA==}
+ engines: {node: '>=8'}
+ dev: true
+
+ /detect-newline@4.0.1:
+ resolution: {integrity: sha512-qE3Veg1YXzGHQhlA6jzebZN2qVf6NX+A7m7qlhCGG30dJixrAQhYOsJjsnBjJkCSmuOPpCk30145fr8FV0bzog==}
+ engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0}
+ dev: true
+
+ /diff-sequences@29.6.3:
+ resolution: {integrity: sha512-EjePK1srD3P08o2j4f0ExnylqRs5B9tJjcp9t1krH2qRi8CCdsYfwe9JgSLurFBWwq4uOlipzfk5fHNvwFKr8Q==}
+ engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
+ dev: true
+
+ /diff@4.0.2:
+ resolution: {integrity: sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==}
+ engines: {node: '>=0.3.1'}
+ dev: true
+
+ /diff@5.2.0:
+ resolution: {integrity: sha512-uIFDxqpRZGZ6ThOk84hEfqWoHx2devRFvpTZcTHur85vImfaxUbTW9Ryh4CpCuDnToOP1CEtXKIgytHBPVff5A==}
+ engines: {node: '>=0.3.1'}
+ dev: true
+
+ /dir-glob@3.0.1:
+ resolution: {integrity: sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==}
+ engines: {node: '>=8'}
+ dependencies:
+ path-type: 4.0.0
+ dev: true
+
+ /doctrine@2.1.0:
+ resolution: {integrity: sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==}
+ engines: {node: '>=0.10.0'}
+ dependencies:
+ esutils: 2.0.3
+ dev: true
+
+ /doctrine@3.0.0:
+ resolution: {integrity: sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==}
+ engines: {node: '>=6.0.0'}
+ dependencies:
+ esutils: 2.0.3
+ dev: true
+
+ /dom-walk@0.1.2:
+ resolution: {integrity: sha512-6QvTW9mrGeIegrFXdtQi9pk7O/nSK6lSdXW2eqUspN5LWD7UTji2Fqw5V2YLjBpHEoU9Xl/eUWNpDeZvoyOv2w==}
+ dev: true
+
+ /dot-case@3.0.4:
+ resolution: {integrity: sha512-Kv5nKlh6yRrdrGvxeJ2e5y2eRUpkUosIW4A2AS38zwSz27zu7ufDwQPi5Jhs3XAlGNetl3bmnGhQsMtkKJnj3w==}
+ dependencies:
+ no-case: 3.0.4
+ tslib: 2.8.1
+ dev: true
+
+ /dotenv@16.6.1:
+ resolution: {integrity: sha512-uBq4egWHTcTt33a72vpSG0z3HnPuIl6NqYcTrKEg2azoEyl2hpW0zqlxysq2pK9HlDIHyHyakeYaYnSAwd8bow==}
+ engines: {node: '>=12'}
+ dev: true
+
+ /dunder-proto@1.0.1:
+ resolution: {integrity: sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==}
+ engines: {node: '>= 0.4'}
+ dependencies:
+ call-bind-apply-helpers: 1.0.2
+ es-errors: 1.3.0
+ gopd: 1.2.0
+ dev: true
+
+ /ecc-jsbn@0.1.2:
+ resolution: {integrity: sha512-eh9O+hwRHNbG4BLTjEl3nw044CkGm5X6LoaCf7LPp7UU8Qrt47JYNi6nPX8xjW97TKGKm1ouctg0QSpZe9qrnw==}
+ dependencies:
+ jsbn: 0.1.1
+ safer-buffer: 2.1.2
+ dev: true
+
+ /ed25519-hd-key@1.3.0:
+ resolution: {integrity: sha512-IWwAyiiuJQhgu3L8NaHb68eJxTu2pgCwxIBdgpLJdKpYZM46+AXePSVTr7fkNKaUOfOL4IrjEUaQvyVRIDP7fg==}
+ dependencies:
+ create-hmac: 1.1.7
+ tweetnacl: 1.0.3
+ dev: true
+
+ /ee-first@1.1.1:
+ resolution: {integrity: sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==}
+ dev: true
+
+ /electron-to-chromium@1.5.243:
+ resolution: {integrity: sha512-ZCphxFW3Q1TVhcgS9blfut1PX8lusVi2SvXQgmEEnK4TCmE1JhH2JkjJN+DNt0pJJwfBri5AROBnz2b/C+YU9g==}
+ dev: true
+
+ /elliptic@6.6.1:
+ resolution: {integrity: sha512-RaddvvMatK2LJHqFJ+YA4WysVN5Ita9E35botqIYspQ4TkRAlCicdzKOjlyv/1Za5RyTNn7di//eEV0uTAfe3g==}
+ dependencies:
+ bn.js: 4.12.2
+ brorand: 1.1.0
+ hash.js: 1.1.7
+ hmac-drbg: 1.0.1
+ inherits: 2.0.4
+ minimalistic-assert: 1.0.1
+ minimalistic-crypto-utils: 1.0.1
+ dev: true
+
+ /emittery@0.10.0:
+ resolution: {integrity: sha512-AGvFfs+d0JKCJQ4o01ASQLGPmSCxgfU9RFXvzPvZdjKK8oscynksuJhWrSTSw7j7Ep/sZct5b5ZhYCi8S/t0HQ==}
+ engines: {node: '>=12'}
+ dev: true
+
+ /emittery@0.13.1:
+ resolution: {integrity: sha512-DeWwawk6r5yR9jFgnDKYt4sLS0LmHJJi3ZOnb5/JdbYwj3nW+FxQnHIjhBKz8YLC7oRNPVM9NQ47I3CVx34eqQ==}
+ engines: {node: '>=12'}
+ dev: true
+
+ /emoji-regex@8.0.0:
+ resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==}
+ dev: true
+
+ /enabled@2.0.0:
+ resolution: {integrity: sha512-AKrN98kuwOzMIdAizXGI86UFBoo26CL21UM763y1h/GMSJ4/OHU9k2YlsmBpyScFo/wbLzWQJBMCW4+IO3/+OQ==}
+ dev: true
+
+ /encode-utf8@1.0.3:
+ resolution: {integrity: sha512-ucAnuBEhUK4boH2HjVYG5Q2mQyPorvv0u/ocS+zhdw0S8AlHYY+GOFhP1Gio5z4icpP2ivFSvhtFjQi8+T9ppw==}
+ dev: true
+
+ /encodeurl@1.0.2:
+ resolution: {integrity: sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==}
+ engines: {node: '>= 0.8'}
+ dev: true
+
+ /encodeurl@2.0.0:
+ resolution: {integrity: sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==}
+ engines: {node: '>= 0.8'}
+ dev: true
+
+ /encoding-down@6.3.0:
+ resolution: {integrity: sha512-QKrV0iKR6MZVJV08QY0wp1e7vF6QbhnbQhb07bwpEyuz4uZiZgPlEGdkCROuFkUwdxlFaiPIhjyarH1ee/3vhw==}
+ engines: {node: '>=6'}
+ deprecated: Superseded by abstract-level (https://github.com/Level/community#faq)
+ dependencies:
+ abstract-leveldown: 6.3.0
+ inherits: 2.0.4
+ level-codec: 9.0.2
+ level-errors: 2.0.1
+ dev: true
+
+ /end-of-stream@1.4.5:
+ resolution: {integrity: sha512-ooEGc6HP26xXq/N+GCGOT0JKCLDGrq2bQUZrQ7gyrJiZANJ/8YDTxTpQBXGMn+WbIQXNVpyWymm7KYVICQnyOg==}
+ dependencies:
+ once: 1.4.0
+ dev: true
+
+ /enquirer@2.4.1:
+ resolution: {integrity: sha512-rRqJg/6gd538VHvR3PSrdRBb/1Vy2YfzHqzvbhGIQpDRKIa4FgV/54b5Q1xYSxOOwKvjXweS26E0Q+nAMwp2pQ==}
+ engines: {node: '>=8.6'}
+ dependencies:
+ ansi-colors: 4.1.3
+ strip-ansi: 6.0.1
+ dev: true
+
+ /env-paths@2.2.1:
+ resolution: {integrity: sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==}
+ engines: {node: '>=6'}
+ dev: true
+
+ /errno@0.1.8:
+ resolution: {integrity: sha512-dJ6oBr5SQ1VSd9qkk7ByRgb/1SH4JZjCHSW/mr63/QcXO9zLVxvJ6Oy13nio03rxpSnVDDjFor75SjVeZWPW/A==}
+ hasBin: true
+ dependencies:
+ prr: 1.0.1
+ dev: true
+
+ /error-ex@1.3.4:
+ resolution: {integrity: sha512-sqQamAnR14VgCr1A618A3sGrygcpK+HEbenA/HiEAkkUwcZIIB/tgWqHFxWgOyDh4nB4JCRimh79dR5Ywc9MDQ==}
+ dependencies:
+ is-arrayish: 0.2.1
+ dev: true
+
+ /es-abstract@1.24.0:
+ resolution: {integrity: sha512-WSzPgsdLtTcQwm4CROfS5ju2Wa1QQcVeT37jFjYzdFz1r9ahadC8B8/a4qxJxM+09F18iumCdRmlr96ZYkQvEg==}
+ engines: {node: '>= 0.4'}
+ dependencies:
+ array-buffer-byte-length: 1.0.2
+ arraybuffer.prototype.slice: 1.0.4
+ available-typed-arrays: 1.0.7
+ call-bind: 1.0.8
+ call-bound: 1.0.4
+ data-view-buffer: 1.0.2
+ data-view-byte-length: 1.0.2
+ data-view-byte-offset: 1.0.1
+ es-define-property: 1.0.1
+ es-errors: 1.3.0
+ es-object-atoms: 1.1.1
+ es-set-tostringtag: 2.1.0
+ es-to-primitive: 1.3.0
+ function.prototype.name: 1.1.8
+ get-intrinsic: 1.3.0
+ get-proto: 1.0.1
+ get-symbol-description: 1.1.0
+ globalthis: 1.0.4
+ gopd: 1.2.0
+ has-property-descriptors: 1.0.2
+ has-proto: 1.2.0
+ has-symbols: 1.1.0
+ hasown: 2.0.2
+ internal-slot: 1.1.0
+ is-array-buffer: 3.0.5
+ is-callable: 1.2.7
+ is-data-view: 1.0.2
+ is-negative-zero: 2.0.3
+ is-regex: 1.2.1
+ is-set: 2.0.3
+ is-shared-array-buffer: 1.0.4
+ is-string: 1.1.1
+ is-typed-array: 1.1.15
+ is-weakref: 1.1.1
+ math-intrinsics: 1.1.0
+ object-inspect: 1.13.4
+ object-keys: 1.1.1
+ object.assign: 4.1.7
+ own-keys: 1.0.1
+ regexp.prototype.flags: 1.5.4
+ safe-array-concat: 1.1.3
+ safe-push-apply: 1.0.0
+ safe-regex-test: 1.1.0
+ set-proto: 1.0.0
+ stop-iteration-iterator: 1.1.0
+ string.prototype.trim: 1.2.10
+ string.prototype.trimend: 1.0.9
+ string.prototype.trimstart: 1.0.8
+ typed-array-buffer: 1.0.3
+ typed-array-byte-length: 1.0.3
+ typed-array-byte-offset: 1.0.4
+ typed-array-length: 1.0.7
+ unbox-primitive: 1.1.0
+ which-typed-array: 1.1.19
+ dev: true
+
+ /es-define-property@1.0.1:
+ resolution: {integrity: sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==}
+ engines: {node: '>= 0.4'}
+ dev: true
+
+ /es-errors@1.3.0:
+ resolution: {integrity: sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==}
+ engines: {node: '>= 0.4'}
+ dev: true
+
+ /es-object-atoms@1.1.1:
+ resolution: {integrity: sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==}
+ engines: {node: '>= 0.4'}
+ dependencies:
+ es-errors: 1.3.0
+ dev: true
+
+ /es-set-tostringtag@2.1.0:
+ resolution: {integrity: sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==}
+ engines: {node: '>= 0.4'}
+ dependencies:
+ es-errors: 1.3.0
+ get-intrinsic: 1.3.0
+ has-tostringtag: 1.0.2
+ hasown: 2.0.2
+ dev: true
+
+ /es-shim-unscopables@1.1.0:
+ resolution: {integrity: sha512-d9T8ucsEhh8Bi1woXCf+TIKDIROLG5WCkxg8geBCbvk22kzwC5G2OnXVMO6FUsvQlgUUXQ2itephWDLqDzbeCw==}
+ engines: {node: '>= 0.4'}
+ dependencies:
+ hasown: 2.0.2
+ dev: true
+
+ /es-to-primitive@1.3.0:
+ resolution: {integrity: sha512-w+5mJ3GuFL+NjVtJlvydShqE1eN3h3PbI7/5LAsYJP/2qtuMXjfL2LpHSRqo4b4eSF5K/DH1JXKUAHSB2UW50g==}
+ engines: {node: '>= 0.4'}
+ dependencies:
+ is-callable: 1.2.7
+ is-date-object: 1.1.0
+ is-symbol: 1.1.1
+ dev: true
+
+ /es5-ext@0.10.64:
+ resolution: {integrity: sha512-p2snDhiLaXe6dahss1LddxqEm+SkuDvV8dnIQG0MWjyHpcMNfXKPE+/Cc0y+PhxJX3A4xGNeFCj5oc0BUh6deg==}
+ engines: {node: '>=0.10'}
+ requiresBuild: true
+ dependencies:
+ es6-iterator: 2.0.3
+ es6-symbol: 3.1.4
+ esniff: 2.0.1
+ next-tick: 1.1.0
+ dev: true
+
+ /es6-iterator@2.0.3:
+ resolution: {integrity: sha512-zw4SRzoUkd+cl+ZoE15A9o1oQd920Bb0iOJMQkQhl3jNc03YqVjAhG7scf9C5KWRU/R13Orf588uCC6525o02g==}
+ dependencies:
+ d: 1.0.2
+ es5-ext: 0.10.64
+ es6-symbol: 3.1.4
+ dev: true
+
+ /es6-promise@4.2.8:
+ resolution: {integrity: sha512-HJDGx5daxeIvxdBxvG2cb9g4tEvwIk3i8+nhX0yGrYmZUzbkdg8QbDevheDB8gd0//uPj4c1EQua8Q+MViT0/w==}
+ dev: true
+
+ /es6-promisify@5.0.0:
+ resolution: {integrity: sha512-C+d6UdsYDk0lMebHNR4S2NybQMMngAOnOwYBQjTOiv0MkoJMP0Myw2mgpDLBcpfCmRLxyFqYhS/CfOENq4SJhQ==}
+ dependencies:
+ es6-promise: 4.2.8
+ dev: true
+
+ /es6-symbol@3.1.4:
+ resolution: {integrity: sha512-U9bFFjX8tFiATgtkJ1zg25+KviIXpgRvRHS8sau3GfhVzThRQrOeksPeT0BWW2MNZs1OEWJ1DPXOQMn0KKRkvg==}
+ engines: {node: '>=0.12'}
+ dependencies:
+ d: 1.0.2
+ ext: 1.7.0
+ dev: true
+
+ /es6-weak-map@2.0.3:
+ resolution: {integrity: sha512-p5um32HOTO1kP+w7PRnB+5lQ43Z6muuMuIMffvDN8ZB4GcnjLBV6zGStpbASIMk4DCAvEaamhe2zhyCb/QXXsA==}
+ dependencies:
+ d: 1.0.2
+ es5-ext: 0.10.64
+ es6-iterator: 2.0.3
+ es6-symbol: 3.1.4
+ dev: true
+
+ /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==}
+ dev: true
+
+ /escape-string-regexp@1.0.5:
+ resolution: {integrity: sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==}
+ engines: {node: '>=0.8.0'}
+ dev: true
+
+ /escape-string-regexp@2.0.0:
+ resolution: {integrity: sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==}
+ engines: {node: '>=8'}
+ dev: true
+
+ /escape-string-regexp@4.0.0:
+ resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==}
+ engines: {node: '>=10'}
+ dev: true
+
+ /eslint-config-prettier@9.1.2(eslint@8.57.1):
+ resolution: {integrity: sha512-iI1f+D2ViGn+uvv5HuHVUamg8ll4tN+JRHGc6IJi4TP9Kl976C57fzPXgseXNs8v0iA8aSJpHsTWjDb9QJamGQ==}
+ hasBin: true
+ peerDependencies:
+ eslint: '>=7.0.0'
+ dependencies:
+ eslint: 8.57.1
+ dev: true
+
+ /eslint-import-resolver-node@0.3.9:
+ resolution: {integrity: sha512-WFj2isz22JahUv+B788TlO3N6zL3nNJGU8CcZbPZvVEkBPaJdCV4vy5wyghty5ROFbCRnm132v8BScu5/1BQ8g==}
+ dependencies:
+ debug: 3.2.7
+ is-core-module: 2.16.1
+ resolve: 1.22.11
+ transitivePeerDependencies:
+ - supports-color
+ dev: true
+
+ /eslint-import-resolver-typescript@3.10.1(eslint-plugin-import@2.32.0)(eslint@8.57.1):
+ resolution: {integrity: sha512-A1rHYb06zjMGAxdLSkN2fXPBwuSaQ0iO5M/hdyS0Ajj1VBaRp0sPD3dn1FhME3c/JluGFbwSxyCfqdSbtQLAHQ==}
+ engines: {node: ^14.18.0 || >=16.0.0}
+ peerDependencies:
+ eslint: '*'
+ eslint-plugin-import: '*'
+ eslint-plugin-import-x: '*'
+ peerDependenciesMeta:
+ eslint-plugin-import:
+ optional: true
+ eslint-plugin-import-x:
+ optional: true
+ dependencies:
+ '@nolyfill/is-core-module': 1.0.39
+ debug: 4.4.3(supports-color@8.1.1)
+ eslint: 8.57.1
+ eslint-plugin-import: 2.32.0(@typescript-eslint/parser@7.18.0)(eslint-import-resolver-typescript@3.10.1)(eslint@8.57.1)
+ get-tsconfig: 4.13.0
+ is-bun-module: 2.0.0
+ stable-hash: 0.0.5
+ tinyglobby: 0.2.15
+ unrs-resolver: 1.11.1
+ transitivePeerDependencies:
+ - supports-color
+ dev: true
+
+ /eslint-module-utils@2.12.1(@typescript-eslint/parser@7.18.0)(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.10.1)(eslint@8.57.1):
+ resolution: {integrity: sha512-L8jSWTze7K2mTg0vos/RuLRS5soomksDPoJLXIslC7c8Wmut3bx7CPpJijDcBZtxQ5lrbUdM+s0OlNbz0DCDNw==}
+ engines: {node: '>=4'}
+ peerDependencies:
+ '@typescript-eslint/parser': '*'
+ eslint: '*'
+ eslint-import-resolver-node: '*'
+ eslint-import-resolver-typescript: '*'
+ eslint-import-resolver-webpack: '*'
+ peerDependenciesMeta:
+ '@typescript-eslint/parser':
+ optional: true
+ eslint:
+ optional: true
+ eslint-import-resolver-node:
+ optional: true
+ eslint-import-resolver-typescript:
+ optional: true
+ eslint-import-resolver-webpack:
+ optional: true
+ dependencies:
+ '@typescript-eslint/parser': 7.18.0(eslint@8.57.1)(typescript@5.9.3)
+ debug: 3.2.7
+ eslint: 8.57.1
+ eslint-import-resolver-node: 0.3.9
+ eslint-import-resolver-typescript: 3.10.1(eslint-plugin-import@2.32.0)(eslint@8.57.1)
+ transitivePeerDependencies:
+ - supports-color
+ dev: true
+
+ /eslint-plugin-autofix@2.2.0(eslint@8.57.1):
+ resolution: {integrity: sha512-lu8+0r+utyTroROqXIL+a8sUpICi6za22hIzlpb0+x0tQGRnOjhOKU7v8mC/NS/faDoVsw6xW3vUpc+Mcz5NWA==}
+ engines: {node: '>=18'}
+ peerDependencies:
+ eslint: '>=8'
+ dependencies:
+ eslint: 8.57.1
+ eslint-rule-composer: 0.3.0
+ espree: 9.6.1
+ esutils: 2.0.3
+ string-similarity: 4.0.4
+ dev: true
+
+ /eslint-plugin-compat@4.2.0(eslint@8.57.1):
+ resolution: {integrity: sha512-RDKSYD0maWy5r7zb5cWQS+uSPc26mgOzdORJ8hxILmWM7S/Ncwky7BcAtXVY5iRbKjBdHsWU8Yg7hfoZjtkv7w==}
+ engines: {node: '>=14.x'}
+ peerDependencies:
+ eslint: ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0
+ dependencies:
+ '@mdn/browser-compat-data': 5.7.6
+ ast-metadata-inferer: 0.8.1
+ browserslist: 4.27.0
+ caniuse-lite: 1.0.30001751
+ eslint: 8.57.1
+ find-up: 5.0.0
+ lodash.memoize: 4.1.2
+ semver: 7.7.3
+ dev: true
+
+ /eslint-plugin-import@2.32.0(@typescript-eslint/parser@7.18.0)(eslint-import-resolver-typescript@3.10.1)(eslint@8.57.1):
+ resolution: {integrity: sha512-whOE1HFo/qJDyX4SnXzP4N6zOWn79WhnCUY/iDR0mPfQZO8wcYE4JClzI2oZrhBnnMUCBCHZhO6VQyoBU95mZA==}
+ engines: {node: '>=4'}
+ peerDependencies:
+ '@typescript-eslint/parser': '*'
+ eslint: ^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8 || ^9
+ peerDependenciesMeta:
+ '@typescript-eslint/parser':
+ optional: true
+ dependencies:
+ '@rtsao/scc': 1.1.0
+ '@typescript-eslint/parser': 7.18.0(eslint@8.57.1)(typescript@5.9.3)
+ array-includes: 3.1.9
+ array.prototype.findlastindex: 1.2.6
+ array.prototype.flat: 1.3.3
+ array.prototype.flatmap: 1.3.3
+ debug: 3.2.7
+ doctrine: 2.1.0
+ eslint: 8.57.1
+ eslint-import-resolver-node: 0.3.9
+ eslint-module-utils: 2.12.1(@typescript-eslint/parser@7.18.0)(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.10.1)(eslint@8.57.1)
+ hasown: 2.0.2
+ is-core-module: 2.16.1
+ is-glob: 4.0.3
+ minimatch: 3.1.2
+ object.fromentries: 2.0.8
+ object.groupby: 1.0.3
+ object.values: 1.2.1
+ semver: 6.3.1
+ string.prototype.trimend: 1.0.9
+ tsconfig-paths: 3.15.0
+ transitivePeerDependencies:
+ - eslint-import-resolver-typescript
+ - eslint-import-resolver-webpack
+ - supports-color
+ dev: true
+
+ /eslint-plugin-jest-extended@2.0.3(eslint@8.57.1)(typescript@5.9.3):
+ resolution: {integrity: sha512-gPhanMUyClZHj4UqvtavRA2s7FqaMdNZQvKLz12gwkxikIKEwr4FgrnFne7/obd0bEIdpHgc0b2zwLK7BGWurw==}
+ engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
+ peerDependencies:
+ eslint: ^7.0.0 || ^8.0.0
+ dependencies:
+ '@typescript-eslint/utils': 5.62.0(eslint@8.57.1)(typescript@5.9.3)
+ eslint: 8.57.1
+ transitivePeerDependencies:
+ - supports-color
+ - typescript
+ dev: true
+
+ /eslint-plugin-prettier@5.5.4(eslint-config-prettier@9.1.2)(eslint@8.57.1)(prettier@3.6.2):
+ resolution: {integrity: sha512-swNtI95SToIz05YINMA6Ox5R057IMAmWZ26GqPxusAp1TZzj+IdY9tXNWWD3vkF/wEqydCONcwjTFpxybBqZsg==}
+ engines: {node: ^14.18.0 || >=16.0.0}
+ peerDependencies:
+ '@types/eslint': '>=8.0.0'
+ eslint: '>=8.0.0'
+ eslint-config-prettier: '>= 7.0.0 <10.0.0 || >=10.1.0'
+ prettier: '>=3.0.0'
+ peerDependenciesMeta:
+ '@types/eslint':
+ optional: true
+ eslint-config-prettier:
+ optional: true
+ dependencies:
+ eslint: 8.57.1
+ eslint-config-prettier: 9.1.2(eslint@8.57.1)
+ prettier: 3.6.2
+ prettier-linter-helpers: 1.0.0
+ synckit: 0.11.11
+ dev: true
+
+ /eslint-plugin-unused-imports@3.2.0(@typescript-eslint/eslint-plugin@7.18.0)(eslint@8.57.1):
+ resolution: {integrity: sha512-6uXyn6xdINEpxE1MtDjxQsyXB37lfyO2yKGVVgtD7WEWQGORSOZjgrD6hBhvGv4/SO+TOlS+UnC6JppRqbuwGQ==}
+ engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
+ peerDependencies:
+ '@typescript-eslint/eslint-plugin': 6 - 7
+ eslint: '8'
+ peerDependenciesMeta:
+ '@typescript-eslint/eslint-plugin':
+ optional: true
+ dependencies:
+ '@typescript-eslint/eslint-plugin': 7.18.0(@typescript-eslint/parser@7.18.0)(eslint@8.57.1)(typescript@5.9.3)
+ eslint: 8.57.1
+ eslint-rule-composer: 0.3.0
+ dev: true
+
+ /eslint-rule-composer@0.3.0:
+ resolution: {integrity: sha512-bt+Sh8CtDmn2OajxvNO+BX7Wn4CIWMpTRm3MaiKPCQcnnlm0CS2mhui6QaoeQugs+3Kj2ESKEEGJUdVafwhiCg==}
+ engines: {node: '>=4.0.0'}
+ dev: true
+
+ /eslint-scope@5.1.1:
+ resolution: {integrity: sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==}
+ engines: {node: '>=8.0.0'}
+ dependencies:
+ esrecurse: 4.3.0
+ estraverse: 4.3.0
+ dev: true
+
+ /eslint-scope@7.2.2:
+ resolution: {integrity: sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==}
+ engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
+ dependencies:
+ esrecurse: 4.3.0
+ estraverse: 5.3.0
+ dev: true
+
+ /eslint-visitor-keys@3.4.3:
+ resolution: {integrity: sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==}
+ engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
+ dev: true
+
+ /eslint@8.57.1:
+ resolution: {integrity: sha512-ypowyDxpVSYpkXr9WPv2PAZCtNip1Mv5KTW0SCurXv/9iOpcrH9PaqUElksqEB6pChqHGDRCFTyrZlGhnLNGiA==}
+ engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
+ deprecated: This version is no longer supported. Please see https://eslint.org/version-support for other options.
+ hasBin: true
+ dependencies:
+ '@eslint-community/eslint-utils': 4.9.0(eslint@8.57.1)
+ '@eslint-community/regexpp': 4.12.2
+ '@eslint/eslintrc': 2.1.4
+ '@eslint/js': 8.57.1
+ '@humanwhocodes/config-array': 0.13.0
+ '@humanwhocodes/module-importer': 1.0.1
+ '@nodelib/fs.walk': 1.2.8
+ '@ungap/structured-clone': 1.3.0
+ ajv: 6.12.6
+ chalk: 4.1.2
+ cross-spawn: 7.0.6
+ debug: 4.4.3(supports-color@8.1.1)
+ doctrine: 3.0.0
+ escape-string-regexp: 4.0.0
+ eslint-scope: 7.2.2
+ eslint-visitor-keys: 3.4.3
+ espree: 9.6.1
+ esquery: 1.6.0
+ esutils: 2.0.3
+ fast-deep-equal: 3.1.3
+ file-entry-cache: 6.0.1
+ find-up: 5.0.0
+ glob-parent: 6.0.2
+ globals: 13.24.0
+ graphemer: 1.4.0
+ ignore: 5.3.2
+ imurmurhash: 0.1.4
+ is-glob: 4.0.3
+ is-path-inside: 3.0.3
+ js-yaml: 4.1.0
+ json-stable-stringify-without-jsonify: 1.0.1
+ levn: 0.4.1
+ lodash.merge: 4.6.2
+ minimatch: 3.1.2
+ natural-compare: 1.4.0
+ optionator: 0.9.4
+ strip-ansi: 6.0.1
+ text-table: 0.2.0
+ transitivePeerDependencies:
+ - supports-color
+ dev: true
+
+ /esniff@2.0.1:
+ resolution: {integrity: sha512-kTUIGKQ/mDPFoJ0oVfcmyJn4iBDRptjNVIzwIFR7tqWXdVI9xfA2RMwY/gbSpJG3lkdWNEjLap/NqVHZiJsdfg==}
+ engines: {node: '>=0.10'}
+ dependencies:
+ d: 1.0.2
+ es5-ext: 0.10.64
+ event-emitter: 0.3.5
+ type: 2.7.3
+ dev: true
+
+ /espree@9.6.1:
+ resolution: {integrity: sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==}
+ engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
+ dependencies:
+ acorn: 8.15.0
+ acorn-jsx: 5.3.2(acorn@8.15.0)
+ eslint-visitor-keys: 3.4.3
+ dev: true
+
+ /esprima@4.0.1:
+ resolution: {integrity: sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==}
+ engines: {node: '>=4'}
+ hasBin: true
+ dev: true
+
+ /esquery@1.6.0:
+ resolution: {integrity: sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==}
+ engines: {node: '>=0.10'}
+ dependencies:
+ estraverse: 5.3.0
+ dev: true
+
+ /esrecurse@4.3.0:
+ resolution: {integrity: sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==}
+ engines: {node: '>=4.0'}
+ dependencies:
+ estraverse: 5.3.0
+ dev: true
+
+ /estraverse@4.3.0:
+ resolution: {integrity: sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==}
+ engines: {node: '>=4.0'}
+ dev: true
+
+ /estraverse@5.3.0:
+ resolution: {integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==}
+ engines: {node: '>=4.0'}
+ dev: true
+
+ /esutils@2.0.3:
+ resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==}
+ engines: {node: '>=0.10.0'}
+ dev: true
+
+ /etag@1.8.1:
+ resolution: {integrity: sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==}
+ engines: {node: '>= 0.6'}
+ dev: true
+
+ /eth-ens-namehash@2.0.8:
+ resolution: {integrity: sha512-VWEI1+KJfz4Km//dadyvBBoBeSQ0MHTXPvr8UIXiLW6IanxvAV+DmlZAijZwAyggqGUfwQBeHf7tc9wzc1piSw==}
+ dependencies:
+ idna-uts46-hx: 2.3.1
+ js-sha3: 0.5.7
+ dev: true
+
+ /eth-lib@0.1.29:
+ resolution: {integrity: sha512-bfttrr3/7gG4E02HoWTDUcDDslN003OlOoBxk9virpAZQ1ja/jDgwkWB8QfJF7ojuEowrqy+lzp9VcJG7/k5bQ==}
+ dependencies:
+ bn.js: 4.12.2
+ elliptic: 6.6.1
+ nano-json-stream-parser: 0.1.2
+ servify: 0.1.12
+ ws: 3.3.3
+ xhr-request-promise: 0.1.3
+ transitivePeerDependencies:
+ - bufferutil
+ - supports-color
+ - utf-8-validate
+ dev: true
+
+ /eth-lib@0.2.8:
+ resolution: {integrity: sha512-ArJ7x1WcWOlSpzdoTBX8vkwlkSQ85CjjifSZtV4co64vWxSV8geWfPI9x4SVYu3DSxnX4yWFVTtGL+j9DUFLNw==}
+ dependencies:
+ bn.js: 4.12.2
+ elliptic: 6.6.1
+ xhr-request-promise: 0.1.3
+ dev: true
+
+ /ethereum-bloom-filters@1.2.0:
+ resolution: {integrity: sha512-28hyiE7HVsWubqhpVLVmZXFd4ITeHi+BUu05o9isf0GUpMtzBUi+8/gFrGaGYzvGAJQmJ3JKj77Mk9G98T84rA==}
+ dependencies:
+ '@noble/hashes': 1.8.0
+ dev: true
+
+ /ethereum-cryptography@0.1.3:
+ resolution: {integrity: sha512-w8/4x1SGGzc+tO97TASLja6SLd3fRIK2tLVcV2Gx4IB21hE19atll5Cq9o3d0ZmAYC/8aw0ipieTSiekAea4SQ==}
+ dependencies:
+ '@types/pbkdf2': 3.1.2
+ '@types/secp256k1': 4.0.7
+ blakejs: 1.2.1
+ browserify-aes: 1.2.0
+ bs58check: 2.1.2
+ create-hash: 1.2.0
+ create-hmac: 1.1.7
+ hash.js: 1.1.7
+ keccak: 3.0.4
+ pbkdf2: 3.1.5
+ randombytes: 2.1.0
+ safe-buffer: 5.2.1
+ scrypt-js: 3.0.1
+ secp256k1: 4.0.4
+ setimmediate: 1.0.5
+ dev: true
+
+ /ethereum-cryptography@1.2.0:
+ resolution: {integrity: sha512-6yFQC9b5ug6/17CQpCyE3k9eKBMdhyVjzUy1WkiuY/E4vj/SXDBbCw8QEIaXqf0Mf2SnY6RmpDcwlUmBSS0EJw==}
+ dependencies:
+ '@noble/hashes': 1.2.0
+ '@noble/secp256k1': 1.7.1
+ '@scure/bip32': 1.1.5
+ '@scure/bip39': 1.1.1
+ dev: true
+
+ /ethereum-cryptography@2.2.1:
+ resolution: {integrity: sha512-r/W8lkHSiTLxUxW8Rf3u4HGB0xQweG2RyETjywylKZSzLWoWAijRz8WCuOtJ6wah+avllXBqZuk29HCCvhEIRg==}
+ dependencies:
+ '@noble/curves': 1.4.2
+ '@noble/hashes': 1.4.0
+ '@scure/bip32': 1.4.0
+ '@scure/bip39': 1.3.0
+ dev: true
+
+ /ethereum-waffle@4.0.10(@ensdomains/ens@0.4.5)(@ensdomains/resolver@0.2.4)(@ethersproject/abi@5.8.0)(@ethersproject/providers@5.8.0)(ethers@5.8.0)(typescript@5.9.3):
+ resolution: {integrity: sha512-iw9z1otq7qNkGDNcMoeNeLIATF9yKl1M8AIeu42ElfNBplq0e+5PeasQmm8ybY/elkZ1XyRO0JBQxQdVRb8bqQ==}
+ engines: {node: '>=10.0'}
+ hasBin: true
+ peerDependencies:
+ ethers: ^5.7.2
+ dependencies:
+ '@ethereum-waffle/chai': 4.0.10(@ensdomains/ens@0.4.5)(@ensdomains/resolver@0.2.4)(ethers@5.8.0)
+ '@ethereum-waffle/compiler': 4.0.3(@ethersproject/abi@5.8.0)(@ethersproject/providers@5.8.0)(ethers@5.8.0)(solc@0.8.15)(typechain@8.3.2)(typescript@5.9.3)
+ '@ethereum-waffle/mock-contract': 4.0.4(ethers@5.8.0)
+ '@ethereum-waffle/provider': 4.0.5(@ensdomains/ens@0.4.5)(@ensdomains/resolver@0.2.4)(ethers@5.8.0)
+ ethers: 5.8.0
+ solc: 0.8.15
+ typechain: 8.3.2(typescript@5.9.3)
+ transitivePeerDependencies:
+ - '@ensdomains/ens'
+ - '@ensdomains/resolver'
+ - '@ethersproject/abi'
+ - '@ethersproject/providers'
+ - debug
+ - encoding
+ - supports-color
+ - typescript
+ dev: true
+
+ /ethereumjs-abi@0.6.8:
+ resolution: {integrity: sha512-Tx0r/iXI6r+lRsdvkFDlut0N08jWMnKRZ6Gkq+Nmw75lZe4e6o3EkSnkaBP5NF6+m5PTGAr9JP43N3LyeoglsA==}
+ deprecated: This library has been deprecated and usage is discouraged.
+ dependencies:
+ bn.js: 4.12.2
+ ethereumjs-util: 6.2.1
+ dev: true
+
+ /ethereumjs-util@6.2.1:
+ resolution: {integrity: sha512-W2Ktez4L01Vexijrm5EB6w7dg4n/TgpoYU4avuT5T3Vmnw/eCRtiBrJfQYS/DCSvDIOLn2k57GcHdeBcgVxAqw==}
+ dependencies:
+ '@types/bn.js': 4.11.6
+ bn.js: 4.12.2
+ create-hash: 1.2.0
+ elliptic: 6.6.1
+ ethereum-cryptography: 0.1.3
+ ethjs-util: 0.1.6
+ rlp: 2.2.7
+ dev: true
+
+ /ethereumjs-util@7.1.3:
+ resolution: {integrity: sha512-y+82tEbyASO0K0X1/SRhbJJoAlfcvq8JbrG4a5cjrOks7HS/36efU/0j2flxCPOUM++HFahk33kr/ZxyC4vNuw==}
+ engines: {node: '>=10.0.0'}
+ dependencies:
+ '@types/bn.js': 5.2.0
+ bn.js: 5.2.2
+ create-hash: 1.2.0
+ ethereum-cryptography: 0.1.3
+ rlp: 2.2.7
+ dev: true
+
+ /ethereumjs-util@7.1.5:
+ resolution: {integrity: sha512-SDl5kKrQAudFBUe5OJM9Ac6WmMyYmXX/6sTmLZ3ffG2eY6ZIGBes3pEDxNN6V72WyOw4CPD5RomKdsa8DAAwLg==}
+ engines: {node: '>=10.0.0'}
+ dependencies:
+ '@types/bn.js': 5.2.0
+ bn.js: 5.2.2
+ create-hash: 1.2.0
+ ethereum-cryptography: 0.1.3
+ rlp: 2.2.7
+ dev: true
+
+ /ethers@5.8.0:
+ resolution: {integrity: sha512-DUq+7fHrCg1aPDFCHx6UIPb3nmt2XMpM7Y/g2gLhsl3lIBqeAfOJIl1qEvRf2uq3BiKxmh6Fh5pfp2ieyek7Kg==}
+ dependencies:
+ '@ethersproject/abi': 5.8.0
+ '@ethersproject/abstract-provider': 5.8.0
+ '@ethersproject/abstract-signer': 5.8.0
+ '@ethersproject/address': 5.8.0
+ '@ethersproject/base64': 5.8.0
+ '@ethersproject/basex': 5.8.0
+ '@ethersproject/bignumber': 5.8.0
+ '@ethersproject/bytes': 5.8.0
+ '@ethersproject/constants': 5.8.0
+ '@ethersproject/contracts': 5.8.0
+ '@ethersproject/hash': 5.8.0
+ '@ethersproject/hdnode': 5.8.0
+ '@ethersproject/json-wallets': 5.8.0
+ '@ethersproject/keccak256': 5.8.0
+ '@ethersproject/logger': 5.8.0
+ '@ethersproject/networks': 5.8.0
+ '@ethersproject/pbkdf2': 5.8.0
+ '@ethersproject/properties': 5.8.0
+ '@ethersproject/providers': 5.8.0
+ '@ethersproject/random': 5.8.0
+ '@ethersproject/rlp': 5.8.0
+ '@ethersproject/sha2': 5.8.0
+ '@ethersproject/signing-key': 5.8.0
+ '@ethersproject/solidity': 5.8.0
+ '@ethersproject/strings': 5.8.0
+ '@ethersproject/transactions': 5.8.0
+ '@ethersproject/units': 5.8.0
+ '@ethersproject/wallet': 5.8.0
+ '@ethersproject/web': 5.8.0
+ '@ethersproject/wordlists': 5.8.0
+ transitivePeerDependencies:
+ - bufferutil
+ - utf-8-validate
+ dev: true
+
+ /ethjs-unit@0.1.6:
+ resolution: {integrity: sha512-/Sn9Y0oKl0uqQuvgFk/zQgR7aw1g36qX/jzSQ5lSwlO0GigPymk4eGQfeNTD03w1dPOqfz8V77Cy43jH56pagw==}
+ engines: {node: '>=6.5.0', npm: '>=3'}
+ dependencies:
+ bn.js: 4.11.6
+ number-to-bn: 1.7.0
+ dev: true
+
+ /ethjs-util@0.1.6:
+ resolution: {integrity: sha512-CUnVOQq7gSpDHZVVrQW8ExxUETWrnrvXYvYz55wOU8Uj4VCgw56XC2B/fVqQN+f7gmrnRHSLVnFAwsCuNwji8w==}
+ engines: {node: '>=6.5.0', npm: '>=3'}
+ dependencies:
+ is-hex-prefixed: 1.0.0
+ strip-hex-prefix: 1.0.0
+ dev: true
+
+ /event-emitter@0.3.5:
+ resolution: {integrity: sha512-D9rRn9y7kLPnJ+hMq7S/nhvoKwwvVJahBi2BPmx3bvbsEdK3W9ii8cBSGjP+72/LnM4n6fo3+dkCX5FeTQruXA==}
+ dependencies:
+ d: 1.0.2
+ es5-ext: 0.10.64
+ dev: true
+
+ /event-target-shim@5.0.1:
+ resolution: {integrity: sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==}
+ engines: {node: '>=6'}
+ dev: true
+
+ /eventemitter3@3.1.2:
+ resolution: {integrity: sha512-tvtQIeLVHjDkJYnzf2dgVMxfuSGJeM/7UCG17TT4EumTfNtF+0nebF/4zWOIkCreAbtNqhGEboB6BWrwqNaw4Q==}
+ dev: true
+
+ /eventemitter3@4.0.4:
+ resolution: {integrity: sha512-rlaVLnVxtxvoyLsQQFBx53YmXHDxRIzzTLbdfxqi4yocpSjAxXwkU0cScM5JgSKMqEhrZpnvQ2D9gjylR0AimQ==}
+ dev: true
+
+ /eventemitter3@4.0.7:
+ resolution: {integrity: sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==}
+ dev: true
+
+ /eventemitter3@5.0.1:
+ resolution: {integrity: sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA==}
+ dev: true
+
+ /events@3.3.0:
+ resolution: {integrity: sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==}
+ engines: {node: '>=0.8.x'}
+ dev: true
+
+ /evp_bytestokey@1.0.3:
+ resolution: {integrity: sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA==}
+ dependencies:
+ md5.js: 1.3.5
+ safe-buffer: 5.2.1
+ dev: true
+
+ /execa@5.1.1:
+ resolution: {integrity: sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==}
+ engines: {node: '>=10'}
+ dependencies:
+ cross-spawn: 7.0.6
+ get-stream: 6.0.1
+ human-signals: 2.1.0
+ is-stream: 2.0.1
+ merge-stream: 2.0.0
+ npm-run-path: 4.0.1
+ onetime: 5.1.2
+ signal-exit: 3.0.7
+ strip-final-newline: 2.0.0
+ dev: true
+
+ /exit@0.1.2:
+ resolution: {integrity: sha512-Zk/eNKV2zbjpKzrsQ+n1G6poVbErQxJ0LBOJXaKZ1EViLzH+hrLu9cdXI4zw9dBQJslwBEpbQ2P1oS7nDxs6jQ==}
+ engines: {node: '>= 0.8.0'}
+ dev: true
+
+ /expect@29.7.0:
+ resolution: {integrity: sha512-2Zks0hf1VLFYI1kbh0I5jP3KHHyCHpkfyHBzsSXRFgl/Bg9mWYfMW8oD+PdMPlEwy5HNsR9JutYy6pMeOh61nw==}
+ engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
+ dependencies:
+ '@jest/expect-utils': 29.7.0
+ jest-get-type: 29.6.3
+ jest-matcher-utils: 29.7.0
+ jest-message-util: 29.7.0
+ jest-util: 29.7.0
+ dev: true
+
+ /exponential-backoff@3.1.3:
+ resolution: {integrity: sha512-ZgEeZXj30q+I0EN+CbSSpIyPaJ5HVQD18Z1m+u1FXbAeT94mr1zw50q4q6jiiC447Nl/YTcIYSAftiGqetwXCA==}
+ dev: true
+
+ /express@4.21.2:
+ resolution: {integrity: sha512-28HqgMZAmih1Czt9ny7qr6ek2qddF4FclbMzwhCREB6OFfH+rXAnuNCwo1/wFvrtbgsQDb4kSbX9de9lFbrXnA==}
+ engines: {node: '>= 0.10.0'}
+ dependencies:
+ accepts: 1.3.8
+ array-flatten: 1.1.1
+ body-parser: 1.20.3
+ content-disposition: 0.5.4
+ content-type: 1.0.5
+ cookie: 0.7.1
+ cookie-signature: 1.0.6
+ debug: 2.6.9
+ depd: 2.0.0
+ encodeurl: 2.0.0
+ escape-html: 1.0.3
+ etag: 1.8.1
+ finalhandler: 1.3.1
+ fresh: 0.5.2
+ http-errors: 2.0.0
+ merge-descriptors: 1.0.3
+ methods: 1.1.2
+ on-finished: 2.4.1
+ parseurl: 1.3.3
+ path-to-regexp: 0.1.12
+ proxy-addr: 2.0.7
+ qs: 6.13.0
+ range-parser: 1.2.1
+ safe-buffer: 5.2.1
+ send: 0.19.0
+ serve-static: 1.16.2
+ setprototypeof: 1.2.0
+ statuses: 2.0.1
+ type-is: 1.6.18
+ utils-merge: 1.0.1
+ vary: 1.1.2
+ transitivePeerDependencies:
+ - supports-color
+ dev: true
+
+ /ext@1.7.0:
+ resolution: {integrity: sha512-6hxeJYaL110a9b5TEJSj0gojyHQAmA2ch5Os+ySCiA1QGdS697XWY1pzsrSjqA9LDEEgdB/KypIlR59RcLuHYw==}
+ dependencies:
+ type: 2.7.3
+ dev: true
+
+ /extend@3.0.2:
+ resolution: {integrity: sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==}
+ dev: true
+
+ /extsprintf@1.3.0:
+ resolution: {integrity: sha512-11Ndz7Nv+mvAC1j0ktTa7fAb0vLyGGX+rMHNBYQviQDGU0Hw7lhctJANqbPhu9nV9/izT/IntTgZ7Im/9LJs9g==}
+ engines: {'0': node >=0.6.0}
+ dev: true
+
+ /eyes@0.1.8:
+ resolution: {integrity: sha512-GipyPsXO1anza0AOZdy69Im7hGFCNB7Y/NGjDlZGJ3GJJLtwNSb2vrzYrTYJRrRloVx7pl+bhUaTB8yiccPvFQ==}
+ engines: {node: '> 0.1.90'}
+ dev: true
+
+ /fast-deep-equal@3.1.3:
+ resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==}
+ dev: true
+
+ /fast-diff@1.3.0:
+ resolution: {integrity: sha512-VxPP4NqbUjj6MaAOafWeUn2cXWLcCtljklUtZf0Ind4XQ+QPtmA0b18zZy0jIQx+ExRVCR/ZQpBmik5lXshNsw==}
+ dev: true
+
+ /fast-glob@3.3.3:
+ resolution: {integrity: sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==}
+ engines: {node: '>=8.6.0'}
+ dependencies:
+ '@nodelib/fs.stat': 2.0.5
+ '@nodelib/fs.walk': 1.2.8
+ glob-parent: 5.1.2
+ merge2: 1.4.1
+ micromatch: 4.0.8
+ dev: true
+
+ /fast-json-stable-stringify@2.1.0:
+ resolution: {integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==}
+ dev: true
+
+ /fast-levenshtein@2.0.6:
+ resolution: {integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==}
+ dev: true
+
+ /fast-redact@3.5.0:
+ resolution: {integrity: sha512-dwsoQlS7h9hMeYUq1W++23NDcBLV4KqONnITDV9DjfS3q1SgDGVrBdvvTLUotWtPSD7asWDV9/CmsZPy8Hf70A==}
+ engines: {node: '>=6'}
+ dev: true
+
+ /fast-stable-stringify@1.0.0:
+ resolution: {integrity: sha512-wpYMUmFu5f00Sm0cj2pfivpmawLZ0NKdviQ4w9zJeR8JVtOpOxHmLaJuj0vxvGqMJQWyP/COUkF75/57OKyRag==}
+ dev: true
+
+ /fast-uri@3.1.0:
+ resolution: {integrity: sha512-iPeeDKJSWf4IEOasVVrknXpaBV0IApz/gp7S2bb7Z4Lljbl2MGJRqInZiUrQwV16cpzw/D3S5j5Julj/gT52AA==}
+ dev: true
+
+ /fastestsmallesttextencoderdecoder@1.0.22:
+ resolution: {integrity: sha512-Pb8d48e+oIuY4MaM64Cd7OW1gt4nxCHs7/ddPPZ/Ic3sg8yVGM7O9wDvZ7us6ScaUupzM+pfBolwtYhN1IxBIw==}
+ dev: true
+
+ /fastq@1.19.1:
+ resolution: {integrity: sha512-GwLTyxkCXjXbxqIhTsMI2Nui8huMPtnxg7krajPJAjnEG/iiOS7i+zCtWGZR9G0NBKbXKh6X9m9UIsYX/N6vvQ==}
+ dependencies:
+ reusify: 1.1.0
+ dev: true
+
+ /fb-watchman@2.0.2:
+ resolution: {integrity: sha512-p5161BqbuCaSnB8jIbzQHOlpgsPmK5rJVDfDKO91Axs5NC1uu3HRQm6wt9cd9/+GtQQIO53JdGXXoyDpTAsgYA==}
+ dependencies:
+ bser: 2.1.1
+ dev: true
+
+ /fdir@6.5.0(picomatch@4.0.3):
+ resolution: {integrity: sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==}
+ engines: {node: '>=12.0.0'}
+ peerDependencies:
+ picomatch: ^3 || ^4
+ peerDependenciesMeta:
+ picomatch:
+ optional: true
+ dependencies:
+ picomatch: 4.0.3
+ dev: true
+
+ /fecha@4.2.3:
+ resolution: {integrity: sha512-OP2IUU6HeYKJi3i0z4A19kHMQoLVs4Hc+DPqqxI2h/DPZHTm/vjsfC6P0b4jCMy14XizLBqvndQ+UilD7707Jw==}
+ dev: true
+
+ /file-entry-cache@6.0.1:
+ resolution: {integrity: sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==}
+ engines: {node: ^10.12.0 || >=12.0.0}
+ dependencies:
+ flat-cache: 3.2.0
+ dev: true
+
+ /file-uri-to-path@1.0.0:
+ resolution: {integrity: sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==}
+ dev: true
+
+ /fill-range@7.1.1:
+ resolution: {integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==}
+ engines: {node: '>=8'}
+ dependencies:
+ to-regex-range: 5.0.1
+ dev: true
+
+ /finalhandler@1.3.1:
+ resolution: {integrity: sha512-6BN9trH7bp3qvnrRyzsBz+g3lZxTNZTbVO2EV1CS0WIcDbawYVdYvGflME/9QP0h0pYlCDBCTjYa9nZzMDpyxQ==}
+ engines: {node: '>= 0.8'}
+ dependencies:
+ debug: 2.6.9
+ encodeurl: 2.0.0
+ escape-html: 1.0.3
+ on-finished: 2.4.1
+ parseurl: 1.3.3
+ statuses: 2.0.1
+ unpipe: 1.0.0
+ transitivePeerDependencies:
+ - supports-color
+ dev: true
+
+ /find-replace@3.0.0:
+ resolution: {integrity: sha512-6Tb2myMioCAgv5kfvP5/PkZZ/ntTpVK39fHY7WkWBgvbeE+VHd/tZuZ4mrC+bxh4cfOZeYKVPaJIZtZXV7GNCQ==}
+ engines: {node: '>=4.0.0'}
+ dependencies:
+ array-back: 3.1.0
+ dev: true
+
+ /find-up@1.1.2:
+ resolution: {integrity: sha512-jvElSjyuo4EMQGoTwo1uJU5pQMwTW5lS1x05zzfJuTIyLR3zwO27LYrxNg+dlvKpGOuGy/MzBdXh80g0ve5+HA==}
+ engines: {node: '>=0.10.0'}
+ dependencies:
+ path-exists: 2.1.0
+ pinkie-promise: 2.0.1
+ dev: true
+
+ /find-up@4.1.0:
+ resolution: {integrity: sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==}
+ engines: {node: '>=8'}
+ dependencies:
+ locate-path: 5.0.0
+ path-exists: 4.0.0
+ dev: true
+
+ /find-up@5.0.0:
+ resolution: {integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==}
+ engines: {node: '>=10'}
+ dependencies:
+ locate-path: 6.0.0
+ path-exists: 4.0.0
+ dev: true
+
+ /flat-cache@3.2.0:
+ resolution: {integrity: sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==}
+ engines: {node: ^10.12.0 || >=12.0.0}
+ dependencies:
+ flatted: 3.3.3
+ keyv: 4.5.4
+ rimraf: 3.0.2
+ dev: true
+
+ /flat@5.0.2:
+ resolution: {integrity: sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==}
+ hasBin: true
+ dev: true
+
+ /flatted@3.3.3:
+ resolution: {integrity: sha512-GX+ysw4PBCz0PzosHDepZGANEuFCMLrnRTiEy9McGjmkCQYwRq4A/X786G/fjM/+OjsWSU1ZrY5qyARZmO/uwg==}
+ dev: true
+
+ /fmix@0.1.0:
+ resolution: {integrity: sha512-Y6hyofImk9JdzU8k5INtTXX1cu8LDlePWDFU5sftm9H+zKCr5SGrVjdhkvsim646cw5zD0nADj8oHyXMZmCZ9w==}
+ dependencies:
+ imul: 1.0.1
+ dev: true
+
+ /fn.name@1.1.0:
+ resolution: {integrity: sha512-GRnmB5gPyJpAhTQdSZTSp9uaPSvl09KoYcMQtsB9rQoOmzs9dH6ffeccH+Z+cv6P68Hu5bC6JjRh4Ah/mHSNRw==}
+ dev: true
+
+ /follow-redirects@1.15.11(debug@4.4.3):
+ resolution: {integrity: sha512-deG2P0JfjrTxl50XGCDyfI97ZGVCxIpfKYmfyrQ54n5FO/0gfIES8C/Psl6kWVDolizcaaxZJnTS0QSMxvnsBQ==}
+ engines: {node: '>=4.0'}
+ peerDependencies:
+ debug: '*'
+ peerDependenciesMeta:
+ debug:
+ optional: true
+ dependencies:
+ debug: 4.4.3(supports-color@8.1.1)
+ dev: true
+
+ /for-each@0.3.5:
+ resolution: {integrity: sha512-dKx12eRCVIzqCxFGplyFKJMPvLEWgmNtUrpTiJIR5u97zEhRG8ySrtboPHZXx7daLxQVrl643cTzbab2tkQjxg==}
+ engines: {node: '>= 0.4'}
+ dependencies:
+ is-callable: 1.2.7
+ dev: true
+
+ /forever-agent@0.6.1:
+ resolution: {integrity: sha512-j0KLYPhm6zeac4lz3oJ3o65qvgQCcPubiyotZrXqEaG4hNagNYO8qdlUrX5vwqv9ohqeT/Z3j6+yW067yWWdUw==}
+ dev: true
+
+ /form-data-encoder@1.7.1:
+ resolution: {integrity: sha512-EFRDrsMm/kyqbTQocNvRXMLjc7Es2Vk+IQFx/YW7hkUH1eBl4J1fqiP34l74Yt0pFLCNpc06fkbVk00008mzjg==}
+ dev: true
+
+ /form-data-encoder@2.1.4:
+ resolution: {integrity: sha512-yDYSgNMraqvnxiEXO4hi88+YZxaHC6QKzb5N84iRCTDeRO7ZALpir/lVmf/uXUhnwUr2O4HU8s/n6x+yNjQkHw==}
+ engines: {node: '>= 14.17'}
+ dev: true
+
+ /form-data@2.3.3:
+ resolution: {integrity: sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==}
+ engines: {node: '>= 0.12'}
+ dependencies:
+ asynckit: 0.4.0
+ combined-stream: 1.0.8
+ mime-types: 2.1.35
+ dev: true
+
+ /form-data@4.0.4:
+ resolution: {integrity: sha512-KrGhL9Q4zjj0kiUt5OO4Mr/A/jlI2jDYs5eHBpYHPcBEVSiipAvn2Ko2HnPe20rmcuuvMHNdZFp+4IlGTMF0Ow==}
+ engines: {node: '>= 6'}
+ dependencies:
+ asynckit: 0.4.0
+ combined-stream: 1.0.8
+ es-set-tostringtag: 2.1.0
+ hasown: 2.0.2
+ mime-types: 2.1.35
+ dev: true
+
+ /forwarded@0.2.0:
+ resolution: {integrity: sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==}
+ engines: {node: '>= 0.6'}
+ dev: true
+
+ /fp-ts@1.19.3:
+ resolution: {integrity: sha512-H5KQDspykdHuztLTg+ajGN0Z2qUjcEf3Ybxc6hLt0k7/zPkn29XnKnxlBPyW2XIddWrGaJBzBl4VLYOtk39yZg==}
+ dev: true
+
+ /fp-ts@2.16.11:
+ resolution: {integrity: sha512-LaI+KaX2NFkfn1ZGHoKCmcfv7yrZsC3b8NtWsTVQeHkq4F27vI5igUuO53sxqDEa2gNQMHFPmpojDw/1zmUK7w==}
+ dev: true
+
+ /fresh@0.5.2:
+ resolution: {integrity: sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==}
+ engines: {node: '>= 0.6'}
+ dev: true
+
+ /fs-extra@0.30.0:
+ resolution: {integrity: sha512-UvSPKyhMn6LEd/WpUaV9C9t3zATuqoqfWc3QdPhPLb58prN9tqYPlPWi8Krxi44loBoUzlobqZ3+8tGpxxSzwA==}
+ dependencies:
+ graceful-fs: 4.2.11
+ jsonfile: 2.4.0
+ klaw: 1.3.1
+ path-is-absolute: 1.0.1
+ rimraf: 2.7.1
+ dev: true
+
+ /fs-extra@10.1.0:
+ resolution: {integrity: sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==}
+ engines: {node: '>=12'}
+ dependencies:
+ graceful-fs: 4.2.11
+ jsonfile: 6.2.0
+ universalify: 2.0.1
+ dev: true
+
+ /fs-extra@4.0.3:
+ resolution: {integrity: sha512-q6rbdDd1o2mAnQreO7YADIxf/Whx4AHBiRf6d+/cVT8h44ss+lHgxf1FemcqDnQt9X3ct4McHr+JMGlYSsK7Cg==}
+ dependencies:
+ graceful-fs: 4.2.11
+ jsonfile: 4.0.0
+ universalify: 0.1.2
+ dev: true
+
+ /fs-extra@7.0.1:
+ resolution: {integrity: sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw==}
+ engines: {node: '>=6 <7 || >=8'}
+ dependencies:
+ graceful-fs: 4.2.11
+ jsonfile: 4.0.0
+ universalify: 0.1.2
+ dev: true
+
+ /fs-minipass@1.2.7:
+ resolution: {integrity: sha512-GWSSJGFy4e9GUeCcbIkED+bgAoFyj7XF1mV8rma3QW4NIqX9Kyx79N/PF61H5udOV3aY1IaMLs6pGbH71nlCTA==}
+ dependencies:
+ minipass: 2.9.0
+ dev: true
+
+ /fs.realpath@1.0.0:
+ resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==}
+ dev: true
+
+ /fsevents@2.3.3:
+ resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==}
+ engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0}
+ os: [darwin]
+ requiresBuild: true
+ dev: true
+ optional: true
+
+ /function-bind@1.1.2:
+ resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==}
+ dev: true
+
+ /function.prototype.name@1.1.8:
+ resolution: {integrity: sha512-e5iwyodOHhbMr/yNrc7fDYG4qlbIvI5gajyzPnb5TCwyhjApznQh1BMFou9b30SevY43gCJKXycoCBjMbsuW0Q==}
+ engines: {node: '>= 0.4'}
+ dependencies:
+ call-bind: 1.0.8
+ call-bound: 1.0.4
+ define-properties: 1.2.1
+ functions-have-names: 1.2.3
+ hasown: 2.0.2
+ is-callable: 1.2.7
+ dev: true
+
+ /functional-red-black-tree@1.0.1:
+ resolution: {integrity: sha512-dsKNQNdj6xA3T+QlADDA7mOSlX0qiMINjn0cgr+eGHGsbSHzTabcIogz2+p/iqP1Xs6EP/sS2SbqH+brGTbq0g==}
+ dev: true
+
+ /functions-have-names@1.2.3:
+ resolution: {integrity: sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==}
+ dev: true
+
+ /ganache@7.4.3:
+ resolution: {integrity: sha512-RpEDUiCkqbouyE7+NMXG26ynZ+7sGiODU84Kz+FVoXUnQ4qQM4M8wif3Y4qUCt+D/eM1RVeGq0my62FPD6Y1KA==}
+ hasBin: true
+ optionalDependencies:
+ bufferutil: 4.0.5
+ utf-8-validate: 5.0.7
+ dev: true
+ bundledDependencies:
+ - '@trufflesuite/bigint-buffer'
+ - emittery
+ - keccak
+ - leveldown
+ - secp256k1
+ - '@types/bn.js'
+ - '@types/lru-cache'
+ - '@types/seedrandom'
+
+ /generator-function@2.0.1:
+ resolution: {integrity: sha512-SFdFmIJi+ybC0vjlHN0ZGVGHc3lgE0DxPAT0djjVg+kjOnSqclqmj0KQ7ykTOLP6YxoqOvuAODGdcHJn+43q3g==}
+ engines: {node: '>= 0.4'}
+ dev: true
+
+ /gensync@1.0.0-beta.2:
+ resolution: {integrity: sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==}
+ engines: {node: '>=6.9.0'}
+ dev: true
+
+ /get-caller-file@1.0.3:
+ resolution: {integrity: sha512-3t6rVToeoZfYSGd8YoLFR2DJkiQrIiUrGcjvFX2mDw3bn6k2OtwHN0TNCLbBO+w8qTvimhDkv+LSscbJY1vE6w==}
+ dev: true
+
+ /get-caller-file@2.0.5:
+ resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==}
+ engines: {node: 6.* || 8.* || >= 10.*}
+ dev: true
+
+ /get-func-name@2.0.2:
+ resolution: {integrity: sha512-8vXOvuE167CtIc3OyItco7N/dpRtBbYOsPsXCz7X/PMnlGjYjSGuZJgM1Y7mmew7BKf9BqvLX2tnOVy1BBUsxQ==}
+ dev: true
+
+ /get-intrinsic@1.3.0:
+ resolution: {integrity: sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==}
+ engines: {node: '>= 0.4'}
+ dependencies:
+ call-bind-apply-helpers: 1.0.2
+ es-define-property: 1.0.1
+ es-errors: 1.3.0
+ es-object-atoms: 1.1.1
+ function-bind: 1.1.2
+ get-proto: 1.0.1
+ gopd: 1.2.0
+ has-symbols: 1.1.0
+ hasown: 2.0.2
+ math-intrinsics: 1.1.0
+ dev: true
+
+ /get-package-type@0.1.0:
+ resolution: {integrity: sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==}
+ engines: {node: '>=8.0.0'}
+ dev: true
+
+ /get-proto@1.0.1:
+ resolution: {integrity: sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==}
+ engines: {node: '>= 0.4'}
+ dependencies:
+ dunder-proto: 1.0.1
+ es-object-atoms: 1.1.1
+ dev: true
+
+ /get-stream@5.2.0:
+ resolution: {integrity: sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==}
+ engines: {node: '>=8'}
+ dependencies:
+ pump: 3.0.3
+ dev: true
+
+ /get-stream@6.0.1:
+ resolution: {integrity: sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==}
+ engines: {node: '>=10'}
+ dev: true
+
+ /get-symbol-description@1.1.0:
+ resolution: {integrity: sha512-w9UMqWwJxHNOvoNzSJ2oPF5wvYcvP7jUvYzhp67yEhTi17ZDBBC1z9pTdGuzjD+EFIqLSYRweZjqfiPzQ06Ebg==}
+ engines: {node: '>= 0.4'}
+ dependencies:
+ call-bound: 1.0.4
+ es-errors: 1.3.0
+ get-intrinsic: 1.3.0
+ dev: true
+
+ /get-tsconfig@4.13.0:
+ resolution: {integrity: sha512-1VKTZJCwBrvbd+Wn3AOgQP/2Av+TfTCOlE4AcRJE72W1ksZXbAx8PPBR9RzgTeSPzlPMHrbANMH3LbltH73wxQ==}
+ dependencies:
+ resolve-pkg-maps: 1.0.0
+ dev: true
+
+ /getpass@0.1.7:
+ resolution: {integrity: sha512-0fzj9JxOLfJ+XGLhR8ze3unN0KZCgZwiSSDz168VERjK8Wl8kVSdcu2kspd4s4wtAa1y/qrVRiAA0WclVsu0ng==}
+ dependencies:
+ assert-plus: 1.0.0
+ dev: true
+
+ /git-hooks-list@4.1.1:
+ resolution: {integrity: sha512-cmP497iLq54AZnv4YRAEMnEyQ1eIn4tGKbmswqwmFV4GBnAqE8NLtWxxdXa++AalfgL5EBH4IxTPyquEuGY/jA==}
+ dev: true
+
+ /glob-parent@5.1.2:
+ resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==}
+ engines: {node: '>= 6'}
+ dependencies:
+ is-glob: 4.0.3
+ dev: true
+
+ /glob-parent@6.0.2:
+ resolution: {integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==}
+ engines: {node: '>=10.13.0'}
+ dependencies:
+ is-glob: 4.0.3
+ dev: true
+
+ /glob@7.1.7:
+ resolution: {integrity: sha512-OvD9ENzPLbegENnYP5UUfJIirTg4+XwMWGaQfQTY0JenxNvvIKP3U3/tAQSPIu/lHxXYSZmpXlUHeqAIdKzBLQ==}
+ deprecated: Glob versions prior to v9 are no longer supported
+ dependencies:
+ fs.realpath: 1.0.0
+ inflight: 1.0.6
+ inherits: 2.0.4
+ minimatch: 3.1.2
+ once: 1.4.0
+ path-is-absolute: 1.0.1
+ dev: true
+
+ /glob@7.2.3:
+ resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==}
+ deprecated: Glob versions prior to v9 are no longer supported
+ dependencies:
+ fs.realpath: 1.0.0
+ inflight: 1.0.6
+ inherits: 2.0.4
+ minimatch: 3.1.2
+ once: 1.4.0
+ path-is-absolute: 1.0.1
+ dev: true
+
+ /glob@8.1.0:
+ resolution: {integrity: sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ==}
+ engines: {node: '>=12'}
+ deprecated: Glob versions prior to v9 are no longer supported
+ dependencies:
+ fs.realpath: 1.0.0
+ inflight: 1.0.6
+ inherits: 2.0.4
+ minimatch: 5.1.6
+ once: 1.4.0
+ dev: true
+
+ /global@4.4.0:
+ resolution: {integrity: sha512-wv/LAoHdRE3BeTGz53FAamhGlPLhlssK45usmGFThIi4XqnBmjKQ16u+RNbP7WvigRZDxUsM0J3gcQ5yicaL0w==}
+ dependencies:
+ min-document: 2.19.0
+ process: 0.11.10
+ dev: true
+
+ /globals@13.24.0:
+ resolution: {integrity: sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==}
+ engines: {node: '>=8'}
+ dependencies:
+ type-fest: 0.20.2
+ dev: true
+
+ /globalthis@1.0.4:
+ resolution: {integrity: sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ==}
+ engines: {node: '>= 0.4'}
+ dependencies:
+ define-properties: 1.2.1
+ gopd: 1.2.0
+ dev: true
+
+ /globby@11.1.0:
+ resolution: {integrity: sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==}
+ engines: {node: '>=10'}
+ dependencies:
+ array-union: 2.1.0
+ dir-glob: 3.0.1
+ fast-glob: 3.3.3
+ ignore: 5.3.2
+ merge2: 1.4.1
+ slash: 3.0.0
+ dev: true
+
+ /google-protobuf@3.21.4:
+ resolution: {integrity: sha512-MnG7N936zcKTco4Jd2PX2U96Kf9PxygAPKBug+74LHzmHXmceN16MmRcdgZv+DGef/S9YvQAfRsNCn4cjf9yyQ==}
+ dev: true
+
+ /gopd@1.2.0:
+ resolution: {integrity: sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==}
+ engines: {node: '>= 0.4'}
+ dev: true
+
+ /got@11.8.6:
+ resolution: {integrity: sha512-6tfZ91bOr7bOXnK7PRDCGBLa1H4U080YHNaAQ2KsMGlLEzRbk44nsZF2E1IeRc3vtJHPVbKCYgdFbaGO2ljd8g==}
+ engines: {node: '>=10.19.0'}
+ dependencies:
+ '@sindresorhus/is': 4.6.0
+ '@szmarczak/http-timer': 4.0.6
+ '@types/cacheable-request': 6.0.3
+ '@types/responselike': 1.0.3
+ cacheable-lookup: 5.0.4
+ cacheable-request: 7.0.4
+ decompress-response: 6.0.0
+ http2-wrapper: 1.0.3
+ lowercase-keys: 2.0.0
+ p-cancelable: 2.1.1
+ responselike: 2.0.1
+ dev: true
+
+ /got@12.1.0:
+ resolution: {integrity: sha512-hBv2ty9QN2RdbJJMK3hesmSkFTjVIHyIDDbssCKnSmq62edGgImJWD10Eb1k77TiV1bxloxqcFAVK8+9pkhOig==}
+ engines: {node: '>=14.16'}
+ dependencies:
+ '@sindresorhus/is': 4.6.0
+ '@szmarczak/http-timer': 5.0.1
+ '@types/cacheable-request': 6.0.3
+ '@types/responselike': 1.0.3
+ cacheable-lookup: 6.1.0
+ cacheable-request: 7.0.4
+ decompress-response: 6.0.0
+ form-data-encoder: 1.7.1
+ get-stream: 6.0.1
+ http2-wrapper: 2.2.1
+ lowercase-keys: 3.0.0
+ p-cancelable: 3.0.0
+ responselike: 2.0.1
+ dev: true
+
+ /got@12.6.1:
+ resolution: {integrity: sha512-mThBblvlAF1d4O5oqyvN+ZxLAYwIJK7bpMxgYqPD9okW0C3qm5FFn7k811QrcuEBwaogR3ngOFoCfs6mRv7teQ==}
+ engines: {node: '>=14.16'}
+ dependencies:
+ '@sindresorhus/is': 5.6.0
+ '@szmarczak/http-timer': 5.0.1
+ cacheable-lookup: 7.0.0
+ cacheable-request: 10.2.14
+ decompress-response: 6.0.0
+ form-data-encoder: 2.1.4
+ get-stream: 6.0.1
+ http2-wrapper: 2.2.1
+ lowercase-keys: 3.0.0
+ p-cancelable: 3.0.0
+ responselike: 3.0.0
+ dev: true
+
+ /gql.tada@1.8.13(graphql@16.11.0)(typescript@5.9.3):
+ resolution: {integrity: sha512-fYoorairdPgxtE7Sf1X9/6bSN9Kt2+PN8KLg3hcF8972qFnawwUgs1OLVU8efZMHwL7EBHhhKBhrsGPlOs2lZQ==}
+ hasBin: true
+ peerDependencies:
+ typescript: ^5.0.0
+ dependencies:
+ '@0no-co/graphql.web': 1.2.0(graphql@16.11.0)
+ '@0no-co/graphqlsp': 1.15.0(graphql@16.11.0)(typescript@5.9.3)
+ '@gql.tada/cli-utils': 1.7.1(@0no-co/graphqlsp@1.15.0)(graphql@16.11.0)(typescript@5.9.3)
+ '@gql.tada/internal': 1.0.8(graphql@16.11.0)(typescript@5.9.3)
+ typescript: 5.9.3
+ transitivePeerDependencies:
+ - '@gql.tada/svelte-support'
+ - '@gql.tada/vue-support'
+ - graphql
+ dev: true
+
+ /graceful-fs@4.2.10:
+ resolution: {integrity: sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==}
+ dev: true
+
+ /graceful-fs@4.2.11:
+ resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==}
+ dev: true
+
+ /gradient-string@1.2.0:
+ resolution: {integrity: sha512-Lxog7IDMMWNjwo4O0KbdBvSewk4vW6kQe5XaLuuPCyCE65AGQ1P8YqKJa5dq8TYf/Ge31F+KjWzPR5mAJvjlAg==}
+ engines: {node: '>=4'}
+ dependencies:
+ chalk: 2.4.2
+ tinygradient: 0.4.3
+ dev: true
+
+ /graphemer@1.4.0:
+ resolution: {integrity: sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==}
+ dev: true
+
+ /graphql@16.11.0:
+ resolution: {integrity: sha512-mS1lbMsxgQj6hge1XZ6p7GPhbrtFwUFYi3wRzXAC/FmYnyXMTvvI3td3rjmQ2u8ewXueaSvRPWaEcgVVOT9Jnw==}
+ engines: {node: ^12.22.0 || ^14.16.0 || ^16.0.0 || >=17.0.0}
+ dev: true
+
+ /har-schema@2.0.0:
+ resolution: {integrity: sha512-Oqluz6zhGX8cyRaTQlFMPw80bSJVG2x/cFb8ZPhUILGgHka9SsokCCOQgpveePerqidZOrT14ipqfJb7ILcW5Q==}
+ engines: {node: '>=4'}
+ dev: true
+
+ /har-validator@5.1.5:
+ resolution: {integrity: sha512-nmT2T0lljbxdQZfspsno9hgrG3Uir6Ks5afism62poxqBM6sDnMEuPmzTq8XN0OEwqKLLdh1jQI3qyE66Nzb3w==}
+ engines: {node: '>=6'}
+ deprecated: this library is no longer supported
+ dependencies:
+ ajv: 6.12.6
+ har-schema: 2.0.0
+ dev: true
+
+ /hardhat-contract-sizer@2.10.1(hardhat@2.26.4):
+ resolution: {integrity: sha512-/PPQQbUMgW6ERzk8M0/DA8/v2TEM9xRRAnF9qKPNMYF6FX5DFWcnxBsQvtp8uBz+vy7rmLyV9Elti2wmmhgkbg==}
+ peerDependencies:
+ hardhat: ^2.0.0
+ dependencies:
+ chalk: 4.1.2
+ cli-table3: 0.6.5
+ hardhat: 2.26.4(ts-node@10.9.2)(typescript@5.9.3)
+ strip-ansi: 6.0.1
+ dev: true
+
+ /hardhat-deploy-ethers@0.4.2(@nomicfoundation/hardhat-ethers@3.1.1)(hardhat-deploy@0.12.4)(hardhat@2.26.4):
+ resolution: {integrity: sha512-AskNH/XRYYYqPT94MvO5s1yMi+/QvoNjS4oU5VcVqfDU99kgpGETl+uIYHIrSXtH5sy7J6gyVjpRMf4x0tjLSQ==}
+ peerDependencies:
+ '@nomicfoundation/hardhat-ethers': ^3.0.2
+ hardhat: ^2.16.0
+ hardhat-deploy: ^0.12.1
+ dependencies:
+ '@nomicfoundation/hardhat-ethers': 3.1.1(ethers@5.8.0)(hardhat@2.26.4)
+ hardhat: 2.26.4(ts-node@10.9.2)(typescript@5.9.3)
+ hardhat-deploy: 0.12.4
+ dev: true
+
+ /hardhat-deploy@0.12.4:
+ resolution: {integrity: sha512-bYO8DIyeGxZWlhnMoCBon9HNZb6ji0jQn7ngP1t5UmGhC8rQYhji7B73qETMOFhzt5ECZPr+U52duj3nubsqdQ==}
+ dependencies:
+ '@ethersproject/abi': 5.8.0
+ '@ethersproject/abstract-signer': 5.8.0
+ '@ethersproject/address': 5.8.0
+ '@ethersproject/bignumber': 5.8.0
+ '@ethersproject/bytes': 5.8.0
+ '@ethersproject/constants': 5.8.0
+ '@ethersproject/contracts': 5.8.0
+ '@ethersproject/providers': 5.8.0
+ '@ethersproject/solidity': 5.8.0
+ '@ethersproject/transactions': 5.8.0
+ '@ethersproject/wallet': 5.8.0
+ '@types/qs': 6.14.0
+ axios: 0.21.4(debug@4.4.3)
+ chalk: 4.1.2
+ chokidar: 3.6.0
+ debug: 4.4.3(supports-color@8.1.1)
+ enquirer: 2.4.1
+ ethers: 5.8.0
+ form-data: 4.0.4
+ fs-extra: 10.1.0
+ match-all: 1.2.7
+ murmur-128: 0.2.1
+ qs: 6.14.0
+ zksync-ethers: 5.11.0(ethers@5.8.0)
+ transitivePeerDependencies:
+ - bufferutil
+ - supports-color
+ - utf-8-validate
+ dev: true
+
+ /hardhat@2.26.4(ts-node@10.9.2)(typescript@5.9.3):
+ resolution: {integrity: sha512-2FMv6mmgR2ryefD3k23vRBYMqjdmZw0EhyXwu18Sz6BVRUAon9h8CjcEtVH4U3fHWPqZ4Pqr81h7s6p0RYAvLg==}
+ hasBin: true
+ peerDependencies:
+ ts-node: '*'
+ typescript: '*'
+ peerDependenciesMeta:
+ ts-node:
+ optional: true
+ typescript:
+ optional: true
+ dependencies:
+ '@ethereumjs/util': 9.1.0
+ '@ethersproject/abi': 5.8.0
+ '@nomicfoundation/edr': 0.11.3
+ '@nomicfoundation/solidity-analyzer': 0.1.2
+ '@sentry/node': 5.30.0
+ adm-zip: 0.4.16
+ aggregate-error: 3.1.0
+ ansi-escapes: 4.3.2
+ boxen: 5.1.2
+ chokidar: 4.0.3
+ ci-info: 2.0.0
+ debug: 4.4.3(supports-color@8.1.1)
+ enquirer: 2.4.1
+ env-paths: 2.2.1
+ ethereum-cryptography: 1.2.0
+ find-up: 5.0.0
+ fp-ts: 1.19.3
+ fs-extra: 7.0.1
+ immutable: 4.3.7
+ io-ts: 1.10.4
+ json-stream-stringify: 3.1.6
+ keccak: 3.0.4
+ lodash: 4.17.21
+ micro-eth-signer: 0.14.0
+ mnemonist: 0.38.5
+ mocha: 10.8.2
+ p-map: 4.0.0
+ picocolors: 1.1.1
+ raw-body: 2.5.2
+ resolve: 1.17.0
+ semver: 6.3.1
+ solc: 0.8.26(debug@4.4.3)
+ source-map-support: 0.5.21
+ stacktrace-parser: 0.1.11
+ tinyglobby: 0.2.15
+ ts-node: 10.9.2(@swc/core@1.14.0)(@types/node@18.18.14)(typescript@5.9.3)
+ tsort: 0.0.1
+ typescript: 5.9.3
+ undici: 5.29.0
+ uuid: 8.3.2
+ ws: 7.5.10
+ transitivePeerDependencies:
+ - bufferutil
+ - supports-color
+ - utf-8-validate
+ dev: true
+
+ /has-bigints@1.1.0:
+ resolution: {integrity: sha512-R3pbpkcIqv2Pm3dUwgjclDRVmWpTJW2DcMzcIhEXEx1oh/CEMObMm3KLmRJOdvhM7o4uQBnwr8pzRK2sJWIqfg==}
+ engines: {node: '>= 0.4'}
+ dev: true
+
+ /has-flag@3.0.0:
+ resolution: {integrity: sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==}
+ engines: {node: '>=4'}
+ dev: true
+
+ /has-flag@4.0.0:
+ resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==}
+ engines: {node: '>=8'}
+ dev: true
+
+ /has-property-descriptors@1.0.2:
+ resolution: {integrity: sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==}
+ dependencies:
+ es-define-property: 1.0.1
+ dev: true
+
+ /has-proto@1.2.0:
+ resolution: {integrity: sha512-KIL7eQPfHQRC8+XluaIw7BHUwwqL19bQn4hzNgdr+1wXoU0KKj6rufu47lhY7KbJR2C6T6+PfyN0Ea7wkSS+qQ==}
+ engines: {node: '>= 0.4'}
+ dependencies:
+ dunder-proto: 1.0.1
+ dev: true
+
+ /has-symbols@1.1.0:
+ resolution: {integrity: sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==}
+ engines: {node: '>= 0.4'}
+ dev: true
+
+ /has-tostringtag@1.0.2:
+ resolution: {integrity: sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==}
+ engines: {node: '>= 0.4'}
+ dependencies:
+ has-symbols: 1.1.0
+ dev: true
+
+ /hash-base@3.1.2:
+ resolution: {integrity: sha512-Bb33KbowVTIj5s7Ked1OsqHUeCpz//tPwR+E2zJgJKo9Z5XolZ9b6bdUgjmYlwnWhoOQKoTd1TYToZGn5mAYOg==}
+ engines: {node: '>= 0.8'}
+ dependencies:
+ inherits: 2.0.4
+ readable-stream: 2.3.8
+ safe-buffer: 5.2.1
+ to-buffer: 1.2.2
+ dev: true
+
+ /hash.js@1.1.7:
+ resolution: {integrity: sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA==}
+ dependencies:
+ inherits: 2.0.4
+ minimalistic-assert: 1.0.1
+ dev: true
+
+ /hasown@2.0.2:
+ resolution: {integrity: sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==}
+ engines: {node: '>= 0.4'}
+ dependencies:
+ function-bind: 1.1.2
+ dev: true
+
+ /he@1.2.0:
+ resolution: {integrity: sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==}
+ hasBin: true
+ dev: true
+
+ /hmac-drbg@1.0.1:
+ resolution: {integrity: sha512-Tti3gMqLdZfhOQY1Mzf/AanLiqh1WTiJgEj26ZuYQ9fbkLomzGchCws4FyrSd4VkpBfiNhaE1On+lOz894jvXg==}
+ dependencies:
+ hash.js: 1.1.7
+ minimalistic-assert: 1.0.1
+ minimalistic-crypto-utils: 1.0.1
+ dev: true
+
+ /hosted-git-info@2.8.9:
+ resolution: {integrity: sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==}
+ dev: true
+
+ /html-escaper@2.0.2:
+ resolution: {integrity: sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==}
+ dev: true
+
+ /http-cache-semantics@4.2.0:
+ resolution: {integrity: sha512-dTxcvPXqPvXBQpq5dUr6mEMJX4oIEFv6bwom3FDwKRDsuIjjJGANqhBuoAn9c1RQJIdAKav33ED65E2ys+87QQ==}
+ dev: true
+
+ /http-errors@2.0.0:
+ resolution: {integrity: sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==}
+ engines: {node: '>= 0.8'}
+ dependencies:
+ depd: 2.0.0
+ inherits: 2.0.4
+ setprototypeof: 1.2.0
+ statuses: 2.0.1
+ toidentifier: 1.0.1
+ dev: true
+
+ /http-https@1.0.0:
+ resolution: {integrity: sha512-o0PWwVCSp3O0wS6FvNr6xfBCHgt0m1tvPLFOCc2iFDKTRAXhB7m8klDf7ErowFH8POa6dVdGatKU5I1YYwzUyg==}
+ dev: true
+
+ /http-signature@1.2.0:
+ resolution: {integrity: sha512-CAbnr6Rz4CYQkLYUtSNXxQPUH2gK8f3iWexVlsnMeD+GjlsQ0Xsy1cOX+mN3dtxYomRy21CiOzU8Uhw6OwncEQ==}
+ engines: {node: '>=0.8', npm: '>=1.3.7'}
+ dependencies:
+ assert-plus: 1.0.0
+ jsprim: 1.4.2
+ sshpk: 1.18.0
+ dev: true
+
+ /http2-wrapper@1.0.3:
+ resolution: {integrity: sha512-V+23sDMr12Wnz7iTcDeJr3O6AIxlnvT/bmaAAAP/Xda35C90p9599p0F1eHR/N1KILWSoWVAiOMFjBBXaXSMxg==}
+ engines: {node: '>=10.19.0'}
+ dependencies:
+ quick-lru: 5.1.1
+ resolve-alpn: 1.2.1
+ dev: true
+
+ /http2-wrapper@2.2.1:
+ resolution: {integrity: sha512-V5nVw1PAOgfI3Lmeaj2Exmeg7fenjhRUgz1lPSezy1CuhPYbgQtbQj4jZfEAEMlaL+vupsvhjqCyjzob0yxsmQ==}
+ engines: {node: '>=10.19.0'}
+ dependencies:
+ quick-lru: 5.1.1
+ resolve-alpn: 1.2.1
+ dev: true
+
+ /https-proxy-agent@5.0.1:
+ resolution: {integrity: sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==}
+ engines: {node: '>= 6'}
+ dependencies:
+ agent-base: 6.0.2
+ debug: 4.4.3(supports-color@8.1.1)
+ transitivePeerDependencies:
+ - supports-color
+ dev: true
+
+ /human-signals@2.1.0:
+ resolution: {integrity: sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==}
+ engines: {node: '>=10.17.0'}
+ dev: true
+
+ /humanize-ms@1.2.1:
+ resolution: {integrity: sha512-Fl70vYtsAFb/C06PTS9dZBo7ihau+Tu/DNCk/OyHhea07S+aeMWpFFkUaXRa8fI+ScZbEI8dfSxwY7gxZ9SAVQ==}
+ dependencies:
+ ms: 2.1.3
+ dev: true
+
+ /iconv-lite@0.4.24:
+ resolution: {integrity: sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==}
+ engines: {node: '>=0.10.0'}
+ dependencies:
+ safer-buffer: 2.1.2
+ dev: true
+
+ /idna-uts46-hx@2.3.1:
+ resolution: {integrity: sha512-PWoF9Keq6laYdIRwwCdhTPl60xRqAloYNMQLiyUnG42VjT53oW07BXIRM+NK7eQjzXjAk2gUvX9caRxlnF9TAA==}
+ engines: {node: '>=4.0.0'}
+ dependencies:
+ punycode: 2.1.0
+ dev: true
+
+ /ieee754@1.2.1:
+ resolution: {integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==}
+ dev: true
+
+ /ignore@5.3.2:
+ resolution: {integrity: sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==}
+ engines: {node: '>= 4'}
+ dev: true
+
+ /immediate@3.2.3:
+ resolution: {integrity: sha512-RrGCXRm/fRVqMIhqXrGEX9rRADavPiDFSoMb/k64i9XMk8uH4r/Omi5Ctierj6XzNecwDbO4WuFbDD1zmpl3Tg==}
+ dev: true
+
+ /immediate@3.3.0:
+ resolution: {integrity: sha512-HR7EVodfFUdQCTIeySw+WDRFJlPcLOJbXfwwZ7Oom6tjsvZ3bOkCDJHehQC3nxJrv7+f9XecwazynjU8e4Vw3Q==}
+ dev: true
+
+ /immutable@4.3.7:
+ resolution: {integrity: sha512-1hqclzwYwjRDFLjcFxOM5AYkkG0rpFPpr1RLPMEuGczoS7YA8gLhy8SWXYRAA/XwfEHpfo3cw5JGioS32fnMRw==}
+ dev: true
+
+ /import-fresh@3.3.1:
+ resolution: {integrity: sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==}
+ engines: {node: '>=6'}
+ dependencies:
+ parent-module: 1.0.1
+ resolve-from: 4.0.0
+ dev: true
+
+ /import-local@3.2.0:
+ resolution: {integrity: sha512-2SPlun1JUPWoM6t3F0dw0FkCF/jWY8kttcY4f599GLTSjh2OCuuhdTkJQsEcZzBqbXZGKMK2OqW1oZsjtf/gQA==}
+ engines: {node: '>=8'}
+ hasBin: true
+ dependencies:
+ pkg-dir: 4.2.0
+ resolve-cwd: 3.0.0
+ dev: true
+
+ /imul@1.0.1:
+ resolution: {integrity: sha512-WFAgfwPLAjU66EKt6vRdTlKj4nAgIDQzh29JonLa4Bqtl6D8JrIMvWjCnx7xEjVNmP3U0fM5o8ZObk7d0f62bA==}
+ engines: {node: '>=0.10.0'}
+ dev: true
+
+ /imurmurhash@0.1.4:
+ resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==}
+ engines: {node: '>=0.8.19'}
+ dev: true
+
+ /indent-string@4.0.0:
+ resolution: {integrity: sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==}
+ engines: {node: '>=8'}
+ dev: true
+
+ /inflight@1.0.6:
+ resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==}
+ deprecated: This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful.
+ dependencies:
+ once: 1.4.0
+ wrappy: 1.0.2
+ dev: true
+
+ /inherits@2.0.4:
+ resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==}
+ dev: true
+
+ /ini@1.3.8:
+ resolution: {integrity: sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==}
+ dev: true
+
+ /injectpromise@1.0.0:
+ resolution: {integrity: sha512-qNq5wy4qX4uWHcVFOEU+RqZkoVG65FhvGkyDWbuBxILMjK6A1LFf5A1mgXZkD4nRx5FCorD81X/XvPKp/zVfPA==}
+ dev: true
+
+ /ink-gradient@2.0.0(ink@3.2.0)(react@17.0.2):
+ resolution: {integrity: sha512-d2BK/EzzBRoDL54NWkS3JGE4J8xtzwRVWxDAIkQ/eQ60XIzrFMtT5JlUqgV05Qlt32Jvk50qW51YqxGJggTuqA==}
+ engines: {node: '>=10'}
+ peerDependencies:
+ ink: '>=3.0.0'
+ react: '>=16.8.0'
+ dependencies:
+ gradient-string: 1.2.0
+ ink: 3.2.0(react@17.0.2)
+ prop-types: 15.8.1
+ react: 17.0.2
+ strip-ansi: 6.0.1
+ dev: true
+
+ /ink-table@3.1.0(ink@3.2.0)(react@17.0.2):
+ resolution: {integrity: sha512-qxVb4DIaEaJryvF9uZGydnmP9Hkmas3DCKVpEcBYC0E4eJd3qNgNe+PZKuzgCERFe9LfAS1TNWxCr9+AU4v3YA==}
+ peerDependencies:
+ ink: '>=3.0.0'
+ react: '>=16.8.0'
+ dependencies:
+ ink: 3.2.0(react@17.0.2)
+ object-hash: 2.2.0
+ react: 17.0.2
+ dev: true
+
+ /ink@3.2.0(react@17.0.2):
+ resolution: {integrity: sha512-firNp1q3xxTzoItj/eOOSZQnYSlyrWks5llCTVX37nJ59K3eXbQ8PtzCguqo8YI19EELo5QxaKnJd4VxzhU8tg==}
+ engines: {node: '>=10'}
+ peerDependencies:
+ '@types/react': '>=16.8.0'
+ react: '>=16.8.0'
+ peerDependenciesMeta:
+ '@types/react':
+ optional: true
+ dependencies:
+ ansi-escapes: 4.3.2
+ auto-bind: 4.0.0
+ chalk: 4.1.2
+ cli-boxes: 2.2.1
+ cli-cursor: 3.1.0
+ cli-truncate: 2.1.0
+ code-excerpt: 3.0.0
+ indent-string: 4.0.0
+ is-ci: 2.0.0
+ lodash: 4.17.21
+ patch-console: 1.0.0
+ react: 17.0.2
+ react-devtools-core: 4.28.5
+ react-reconciler: 0.26.2(react@17.0.2)
+ scheduler: 0.20.2
+ signal-exit: 3.0.7
+ slice-ansi: 3.0.0
+ stack-utils: 2.0.6
+ string-width: 4.2.3
+ type-fest: 0.12.0
+ widest-line: 3.1.0
+ wrap-ansi: 6.2.0
+ ws: 7.5.10
+ yoga-layout-prebuilt: 1.10.0
+ transitivePeerDependencies:
+ - bufferutil
+ - utf-8-validate
+ dev: true
+
+ /internal-slot@1.1.0:
+ resolution: {integrity: sha512-4gd7VpWNQNB4UKKCFFVcp1AVv+FMOgs9NKzjHKusc8jTMhd5eL1NqQqOpE0KzMds804/yHlglp3uxgluOqAPLw==}
+ engines: {node: '>= 0.4'}
+ dependencies:
+ es-errors: 1.3.0
+ hasown: 2.0.2
+ side-channel: 1.1.0
+ dev: true
+
+ /invert-kv@1.0.0:
+ resolution: {integrity: sha512-xgs2NH9AE66ucSq4cNG1nhSFghr5l6tdL15Pk+jl46bmmBapgoaY/AacXyaDznAqmGL99TiLSQgO/XazFSKYeQ==}
+ engines: {node: '>=0.10.0'}
+ dev: true
+
+ /io-ts@1.10.4:
+ resolution: {integrity: sha512-b23PteSnYXSONJ6JQXRAlvJhuw8KOtkqa87W4wDtvMrud/DTJd5X+NpOOI+O/zZwVq6v0VLAaJ+1EDViKEuN9g==}
+ dependencies:
+ fp-ts: 1.19.3
+ dev: true
+
+ /ipaddr.js@1.9.1:
+ resolution: {integrity: sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==}
+ engines: {node: '>= 0.10'}
+ dev: true
+
+ /is-arguments@1.2.0:
+ resolution: {integrity: sha512-7bVbi0huj/wrIAOzb8U1aszg9kdi3KN/CyU19CTI7tAoZYEZoL9yCDXpbXN+uPsuWnP02cyug1gleqq+TU+YCA==}
+ engines: {node: '>= 0.4'}
+ dependencies:
+ call-bound: 1.0.4
+ has-tostringtag: 1.0.2
+ dev: true
+
+ /is-array-buffer@3.0.5:
+ resolution: {integrity: sha512-DDfANUiiG2wC1qawP66qlTugJeL5HyzMpfr8lLK+jMQirGzNod0B12cFB/9q838Ru27sBwfw78/rdoU7RERz6A==}
+ engines: {node: '>= 0.4'}
+ dependencies:
+ call-bind: 1.0.8
+ call-bound: 1.0.4
+ get-intrinsic: 1.3.0
+ dev: true
+
+ /is-arrayish@0.2.1:
+ resolution: {integrity: sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==}
+ dev: true
+
+ /is-async-function@2.1.1:
+ resolution: {integrity: sha512-9dgM/cZBnNvjzaMYHVoxxfPj2QXt22Ev7SuuPrs+xav0ukGB0S6d4ydZdEiM48kLx5kDV+QBPrpVnFyefL8kkQ==}
+ engines: {node: '>= 0.4'}
+ dependencies:
+ async-function: 1.0.0
+ call-bound: 1.0.4
+ get-proto: 1.0.1
+ has-tostringtag: 1.0.2
+ safe-regex-test: 1.1.0
+ dev: true
+
+ /is-bigint@1.1.0:
+ resolution: {integrity: sha512-n4ZT37wG78iz03xPRKJrHTdZbe3IicyucEtdRsV5yglwc3GyUfbAfpSeD0FJ41NbUNSt5wbhqfp1fS+BgnvDFQ==}
+ engines: {node: '>= 0.4'}
+ dependencies:
+ has-bigints: 1.1.0
+ dev: true
+
+ /is-binary-path@2.1.0:
+ resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==}
+ engines: {node: '>=8'}
+ dependencies:
+ binary-extensions: 2.3.0
+ dev: true
+
+ /is-boolean-object@1.2.2:
+ resolution: {integrity: sha512-wa56o2/ElJMYqjCjGkXri7it5FbebW5usLw/nPmCMs5DeZ7eziSYZhSmPRn0txqeW4LnAmQQU7FgqLpsEFKM4A==}
+ engines: {node: '>= 0.4'}
+ dependencies:
+ call-bound: 1.0.4
+ has-tostringtag: 1.0.2
+ dev: true
+
+ /is-bun-module@2.0.0:
+ resolution: {integrity: sha512-gNCGbnnnnFAUGKeZ9PdbyeGYJqewpmc2aKHUEMO5nQPWU9lOmv7jcmQIv+qHD8fXW6W7qfuCwX4rY9LNRjXrkQ==}
+ dependencies:
+ semver: 7.7.3
+ dev: true
+
+ /is-callable@1.2.7:
+ resolution: {integrity: sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==}
+ engines: {node: '>= 0.4'}
+ dev: true
+
+ /is-ci@2.0.0:
+ resolution: {integrity: sha512-YfJT7rkpQB0updsdHLGWrvhBJfcfzNNawYDNIyQXJz0IViGf75O8EBPKSdvw2rF+LGCsX4FZ8tcr3b19LcZq4w==}
+ hasBin: true
+ dependencies:
+ ci-info: 2.0.0
+ dev: true
+
+ /is-core-module@2.16.1:
+ resolution: {integrity: sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==}
+ engines: {node: '>= 0.4'}
+ dependencies:
+ hasown: 2.0.2
+ dev: true
+
+ /is-data-view@1.0.2:
+ resolution: {integrity: sha512-RKtWF8pGmS87i2D6gqQu/l7EYRlVdfzemCJN/P3UOs//x1QE7mfhvzHIApBTRf7axvT6DMGwSwBXYCT0nfB9xw==}
+ engines: {node: '>= 0.4'}
+ dependencies:
+ call-bound: 1.0.4
+ get-intrinsic: 1.3.0
+ is-typed-array: 1.1.15
+ dev: true
+
+ /is-date-object@1.1.0:
+ resolution: {integrity: sha512-PwwhEakHVKTdRNVOw+/Gyh0+MzlCl4R6qKvkhuvLtPMggI1WAHt9sOwZxQLSGpUaDnrdyDsomoRgNnCfKNSXXg==}
+ engines: {node: '>= 0.4'}
+ dependencies:
+ call-bound: 1.0.4
+ has-tostringtag: 1.0.2
+ dev: true
+
+ /is-extglob@2.1.1:
+ resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==}
+ engines: {node: '>=0.10.0'}
+ dev: true
+
+ /is-finalizationregistry@1.1.1:
+ resolution: {integrity: sha512-1pC6N8qWJbWoPtEjgcL2xyhQOP491EQjeUo3qTKcmV8YSDDJrOepfG8pcC7h/QgnQHYSv0mJ3Z/ZWxmatVrysg==}
+ engines: {node: '>= 0.4'}
+ dependencies:
+ call-bound: 1.0.4
+ dev: true
+
+ /is-fullwidth-code-point@1.0.0:
+ resolution: {integrity: sha512-1pqUqRjkhPJ9miNq9SwMfdvi6lBJcd6eFxvfaivQhaH3SgisfiuudvFntdKOmxuee/77l+FPjKrQjWvmPjWrRw==}
+ engines: {node: '>=0.10.0'}
+ dependencies:
+ number-is-nan: 1.0.1
+ dev: true
+
+ /is-fullwidth-code-point@3.0.0:
+ resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==}
+ engines: {node: '>=8'}
+ dev: true
+
+ /is-function@1.0.2:
+ resolution: {integrity: sha512-lw7DUp0aWXYg+CBCN+JKkcE0Q2RayZnSvnZBlwgxHBQhqt5pZNVy4Ri7H9GmmXkdu7LUthszM+Tor1u/2iBcpQ==}
+ dev: true
+
+ /is-generator-fn@2.1.0:
+ resolution: {integrity: sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ==}
+ engines: {node: '>=6'}
+ dev: true
+
+ /is-generator-function@1.1.2:
+ resolution: {integrity: sha512-upqt1SkGkODW9tsGNG5mtXTXtECizwtS2kA161M+gJPc1xdb/Ax629af6YrTwcOeQHbewrPNlE5Dx7kzvXTizA==}
+ engines: {node: '>= 0.4'}
+ dependencies:
+ call-bound: 1.0.4
+ generator-function: 2.0.1
+ get-proto: 1.0.1
+ has-tostringtag: 1.0.2
+ safe-regex-test: 1.1.0
+ dev: true
+
+ /is-glob@4.0.3:
+ resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==}
+ engines: {node: '>=0.10.0'}
+ dependencies:
+ is-extglob: 2.1.1
+ dev: true
+
+ /is-hex-prefixed@1.0.0:
+ resolution: {integrity: sha512-WvtOiug1VFrE9v1Cydwm+FnXd3+w9GaeVUss5W4v/SLy3UW00vP+6iNF2SdnfiBoLy4bTqVdkftNGTUeOFVsbA==}
+ engines: {node: '>=6.5.0', npm: '>=3'}
+ dev: true
+
+ /is-map@2.0.3:
+ resolution: {integrity: sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw==}
+ engines: {node: '>= 0.4'}
+ dev: true
+
+ /is-nan@1.3.2:
+ resolution: {integrity: sha512-E+zBKpQ2t6MEo1VsonYmluk9NxGrbzpeeLC2xIViuO2EjU2xsXsBPwTr3Ykv9l08UYEVEdWeRZNouaZqF6RN0w==}
+ engines: {node: '>= 0.4'}
+ dependencies:
+ call-bind: 1.0.8
+ define-properties: 1.2.1
+ dev: true
+
+ /is-negative-zero@2.0.3:
+ resolution: {integrity: sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw==}
+ engines: {node: '>= 0.4'}
+ dev: true
+
+ /is-number-object@1.1.1:
+ resolution: {integrity: sha512-lZhclumE1G6VYD8VHe35wFaIif+CTy5SJIi5+3y4psDgWu4wPDoBhF8NxUOinEc7pHgiTsT6MaBb92rKhhD+Xw==}
+ engines: {node: '>= 0.4'}
+ dependencies:
+ call-bound: 1.0.4
+ has-tostringtag: 1.0.2
+ dev: true
+
+ /is-number@7.0.0:
+ resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==}
+ engines: {node: '>=0.12.0'}
+ dev: true
+
+ /is-path-inside@3.0.3:
+ resolution: {integrity: sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==}
+ engines: {node: '>=8'}
+ dev: true
+
+ /is-plain-obj@2.1.0:
+ resolution: {integrity: sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==}
+ engines: {node: '>=8'}
+ dev: true
+
+ /is-plain-obj@4.1.0:
+ resolution: {integrity: sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==}
+ engines: {node: '>=12'}
+ dev: true
+
+ /is-promise@2.2.2:
+ resolution: {integrity: sha512-+lP4/6lKUBfQjZ2pdxThZvLUAafmZb8OAxFb8XXtiQmS35INgr85hdOGoEs124ez1FCnZJt6jau/T+alh58QFQ==}
+ dev: true
+
+ /is-regex@1.2.1:
+ resolution: {integrity: sha512-MjYsKHO5O7mCsmRGxWcLWheFqN9DJ/2TmngvjKXihe6efViPqc274+Fx/4fYj/r03+ESvBdTXK0V6tA3rgez1g==}
+ engines: {node: '>= 0.4'}
+ dependencies:
+ call-bound: 1.0.4
+ gopd: 1.2.0
+ has-tostringtag: 1.0.2
+ hasown: 2.0.2
+ dev: true
+
+ /is-set@2.0.3:
+ resolution: {integrity: sha512-iPAjerrse27/ygGLxw+EBR9agv9Y6uLeYVJMu+QNCoouJ1/1ri0mGrcWpfCqFZuzzx3WjtwxG098X+n4OuRkPg==}
+ engines: {node: '>= 0.4'}
+ dev: true
+
+ /is-shared-array-buffer@1.0.4:
+ resolution: {integrity: sha512-ISWac8drv4ZGfwKl5slpHG9OwPNty4jOWPRIhBpxOoD+hqITiwuipOQ2bNthAzwA3B4fIjO4Nln74N0S9byq8A==}
+ engines: {node: '>= 0.4'}
+ dependencies:
+ call-bound: 1.0.4
+ dev: true
+
+ /is-stream@2.0.1:
+ resolution: {integrity: sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==}
+ engines: {node: '>=8'}
+ dev: true
+
+ /is-string@1.1.1:
+ resolution: {integrity: sha512-BtEeSsoaQjlSPBemMQIrY1MY0uM6vnS1g5fmufYOtnxLGUZM2178PKbhsk7Ffv58IX+ZtcvoGwccYsh0PglkAA==}
+ engines: {node: '>= 0.4'}
+ dependencies:
+ call-bound: 1.0.4
+ has-tostringtag: 1.0.2
+ dev: true
+
+ /is-symbol@1.1.1:
+ resolution: {integrity: sha512-9gGx6GTtCQM73BgmHQXfDmLtfjjTUDSyoxTCbp5WtoixAhfgsDirWIcVQ/IHpvI5Vgd5i/J5F7B9cN/WlVbC/w==}
+ engines: {node: '>= 0.4'}
+ dependencies:
+ call-bound: 1.0.4
+ has-symbols: 1.1.0
+ safe-regex-test: 1.1.0
+ dev: true
+
+ /is-typed-array@1.1.15:
+ resolution: {integrity: sha512-p3EcsicXjit7SaskXHs1hA91QxgTw46Fv6EFKKGS5DRFLD8yKnohjF3hxoju94b/OcMZoQukzpPpBE9uLVKzgQ==}
+ engines: {node: '>= 0.4'}
+ dependencies:
+ which-typed-array: 1.1.19
+ dev: true
+
+ /is-typedarray@1.0.0:
+ resolution: {integrity: sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==}
+ dev: true
+
+ /is-unicode-supported@0.1.0:
+ resolution: {integrity: sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==}
+ engines: {node: '>=10'}
+ dev: true
+
+ /is-url@1.2.4:
+ resolution: {integrity: sha512-ITvGim8FhRiYe4IQ5uHSkj7pVaPDrCTkNd3yq3cV7iZAcJdHTUMPMEHcqSOy9xZ9qFenQCvi+2wjH9a1nXqHww==}
+ dev: true
+
+ /is-utf8@0.2.1:
+ resolution: {integrity: sha512-rMYPYvCzsXywIsldgLaSoPlw5PfoB/ssr7hY4pLfcodrA5M/eArza1a9VmTiNIBNMjOGr1Ow9mTyU2o69U6U9Q==}
+ dev: true
+
+ /is-weakmap@2.0.2:
+ resolution: {integrity: sha512-K5pXYOm9wqY1RgjpL3YTkF39tni1XajUIkawTLUo9EZEVUFga5gSQJF8nNS7ZwJQ02y+1YCNYcMh+HIf1ZqE+w==}
+ engines: {node: '>= 0.4'}
+ dev: true
+
+ /is-weakref@1.1.1:
+ resolution: {integrity: sha512-6i9mGWSlqzNMEqpCp93KwRS1uUOodk2OJ6b+sq7ZPDSy2WuI5NFIxp/254TytR8ftefexkWn5xNiHUNpPOfSew==}
+ engines: {node: '>= 0.4'}
+ dependencies:
+ call-bound: 1.0.4
+ dev: true
+
+ /is-weakset@2.0.4:
+ resolution: {integrity: sha512-mfcwb6IzQyOKTs84CQMrOwW4gQcaTOAWJ0zzJCl2WSPDrWk/OzDaImWFH3djXhb24g4eudZfLRozAvPGw4d9hQ==}
+ engines: {node: '>= 0.4'}
+ dependencies:
+ call-bound: 1.0.4
+ get-intrinsic: 1.3.0
+ dev: true
+
+ /isarray@1.0.0:
+ resolution: {integrity: sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==}
+ dev: true
+
+ /isarray@2.0.5:
+ resolution: {integrity: sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==}
+ dev: true
+
+ /isexe@2.0.0:
+ resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==}
+ dev: true
+
+ /isomorphic-ws@4.0.1(ws@7.5.10):
+ resolution: {integrity: sha512-BhBvN2MBpWTaSHdWRb/bwdZJ1WaehQ2L1KngkCkfLUGF0mAWAT1sQUQacEmQ0jXkFw/czDXPNQSL5u2/Krsz1w==}
+ peerDependencies:
+ ws: '*'
+ dependencies:
+ ws: 7.5.10
+ dev: true
+
+ /isstream@0.1.2:
+ resolution: {integrity: sha512-Yljz7ffyPbrLpLngrMtZ7NduUgVvi6wG9RJ9IUcyCd59YQ911PBJphODUcbOVbqYfxe1wuYf/LJ8PauMRwsM/g==}
+ dev: true
+
+ /istanbul-lib-coverage@3.2.2:
+ resolution: {integrity: sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg==}
+ engines: {node: '>=8'}
+ dev: true
+
+ /istanbul-lib-instrument@5.2.1:
+ resolution: {integrity: sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg==}
+ engines: {node: '>=8'}
+ dependencies:
+ '@babel/core': 7.28.5
+ '@babel/parser': 7.28.5
+ '@istanbuljs/schema': 0.1.3
+ istanbul-lib-coverage: 3.2.2
+ semver: 6.3.1
+ transitivePeerDependencies:
+ - supports-color
+ dev: true
+
+ /istanbul-lib-instrument@6.0.3:
+ resolution: {integrity: sha512-Vtgk7L/R2JHyyGW07spoFlB8/lpjiOLTjMdms6AFMraYt3BaJauod/NGrfnVG/y4Ix1JEuMRPDPEj2ua+zz1/Q==}
+ engines: {node: '>=10'}
+ dependencies:
+ '@babel/core': 7.28.5
+ '@babel/parser': 7.28.5
+ '@istanbuljs/schema': 0.1.3
+ istanbul-lib-coverage: 3.2.2
+ semver: 7.7.3
+ transitivePeerDependencies:
+ - supports-color
+ dev: true
+
+ /istanbul-lib-report@3.0.1:
+ resolution: {integrity: sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw==}
+ engines: {node: '>=10'}
+ dependencies:
+ istanbul-lib-coverage: 3.2.2
+ make-dir: 4.0.0
+ supports-color: 7.2.0
+ dev: true
+
+ /istanbul-lib-source-maps@4.0.1:
+ resolution: {integrity: sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw==}
+ engines: {node: '>=10'}
+ dependencies:
+ debug: 4.4.3(supports-color@8.1.1)
+ istanbul-lib-coverage: 3.2.2
+ source-map: 0.6.1
+ transitivePeerDependencies:
+ - supports-color
+ dev: true
+
+ /istanbul-reports@3.2.0:
+ resolution: {integrity: sha512-HGYWWS/ehqTV3xN10i23tkPkpH46MLCIMFNCaaKNavAXTF1RkqxawEPtnjnGZ6XKSInBKkiOA5BKS+aZiY3AvA==}
+ engines: {node: '>=8'}
+ dependencies:
+ html-escaper: 2.0.2
+ istanbul-lib-report: 3.0.1
+ dev: true
+
+ /jayson@4.2.0:
+ resolution: {integrity: sha512-VfJ9t1YLwacIubLhONk0KFeosUBwstRWQ0IRT1KDjEjnVnSOVHC3uwugyV7L0c7R9lpVyrUGT2XWiBA1UTtpyg==}
+ engines: {node: '>=8'}
+ hasBin: true
+ dependencies:
+ '@types/connect': 3.4.38
+ '@types/node': 12.20.55
+ '@types/ws': 7.4.7
+ commander: 2.20.3
+ delay: 5.0.0
+ es6-promisify: 5.0.0
+ eyes: 0.1.8
+ isomorphic-ws: 4.0.1(ws@7.5.10)
+ json-stringify-safe: 5.0.1
+ stream-json: 1.9.1
+ uuid: 8.3.2
+ ws: 7.5.10
+ transitivePeerDependencies:
+ - bufferutil
+ - utf-8-validate
+ dev: true
+
+ /jest-changed-files@29.7.0:
+ resolution: {integrity: sha512-fEArFiwf1BpQ+4bXSprcDc3/x4HSzL4al2tozwVpDFpsxALjLYdyiIK4e5Vz66GQJIbXJ82+35PtysofptNX2w==}
+ engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
+ dependencies:
+ execa: 5.1.1
+ jest-util: 29.7.0
+ p-limit: 3.1.0
+ dev: true
+
+ /jest-circus@29.7.0:
+ resolution: {integrity: sha512-3E1nCMgipcTkCocFwM90XXQab9bS+GMsjdpmPrlelaxwD93Ad8iVEjX/vvHPdLPnFf+L40u+5+iutRdA1N9myw==}
+ engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
+ dependencies:
+ '@jest/environment': 29.7.0
+ '@jest/expect': 29.7.0
+ '@jest/test-result': 29.7.0
+ '@jest/types': 29.6.3
+ '@types/node': 18.18.14
+ chalk: 4.1.2
+ co: 4.6.0
+ dedent: 1.7.0
+ is-generator-fn: 2.1.0
+ jest-each: 29.7.0
+ jest-matcher-utils: 29.7.0
+ jest-message-util: 29.7.0
+ jest-runtime: 29.7.0
+ jest-snapshot: 29.7.0
+ jest-util: 29.7.0
+ p-limit: 3.1.0
+ pretty-format: 29.7.0
+ pure-rand: 6.1.0
+ slash: 3.0.0
+ stack-utils: 2.0.6
+ transitivePeerDependencies:
+ - babel-plugin-macros
+ - supports-color
+ dev: true
+
+ /jest-cli@29.7.0(@types/node@18.18.14)(ts-node@10.9.2):
+ resolution: {integrity: sha512-OVVobw2IubN/GSYsxETi+gOe7Ka59EFMR/twOU3Jb2GnKKeMGJB5SGUUrEz3SFVmJASUdZUzy83sLNNQ2gZslg==}
+ 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/test-result': 29.7.0
+ '@jest/types': 29.6.3
+ chalk: 4.1.2
+ create-jest: 29.7.0(@types/node@18.18.14)(ts-node@10.9.2)
+ exit: 0.1.2
+ import-local: 3.2.0
+ jest-config: 29.7.0(@types/node@18.18.14)(ts-node@10.9.2)
+ jest-util: 29.7.0
+ jest-validate: 29.7.0
+ yargs: 17.7.2
+ transitivePeerDependencies:
+ - '@types/node'
+ - babel-plugin-macros
+ - supports-color
+ - ts-node
+ dev: true
+
+ /jest-config@29.7.0(@types/node@18.18.14)(ts-node@10.9.2):
+ resolution: {integrity: sha512-uXbpfeQ7R6TZBqI3/TxCU4q4ttk3u0PJeC+E0zbfSoSjq6bJ7buBPxzQPL0ifrkY4DNu4JUdk0ImlBUYi840eQ==}
+ engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
+ peerDependencies:
+ '@types/node': '*'
+ ts-node: '>=9.0.0'
+ peerDependenciesMeta:
+ '@types/node':
+ optional: true
+ ts-node:
+ optional: true
+ dependencies:
+ '@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.28.5)
+ chalk: 4.1.2
+ ci-info: 3.9.0
+ deepmerge: 4.3.1
+ glob: 7.2.3
+ graceful-fs: 4.2.11
+ jest-circus: 29.7.0
+ jest-environment-node: 29.7.0
+ jest-get-type: 29.6.3
+ jest-regex-util: 29.6.3
+ jest-resolve: 29.7.0
+ jest-runner: 29.7.0
+ jest-util: 29.7.0
+ jest-validate: 29.7.0
+ micromatch: 4.0.8
+ parse-json: 5.2.0
+ pretty-format: 29.7.0
+ slash: 3.0.0
+ strip-json-comments: 3.1.1
+ ts-node: 10.9.2(@swc/core@1.14.0)(@types/node@18.18.14)(typescript@5.9.3)
+ transitivePeerDependencies:
+ - babel-plugin-macros
+ - supports-color
+ dev: true
+
+ /jest-diff@29.7.0:
+ resolution: {integrity: sha512-LMIgiIrhigmPrs03JHpxUh2yISK3vLFPkAodPeo0+BuF7wA2FoQbkEg1u8gBYBThncu7e1oEDUfIXVuTqLRUjw==}
+ engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
+ dependencies:
+ chalk: 4.1.2
+ diff-sequences: 29.6.3
+ jest-get-type: 29.6.3
+ pretty-format: 29.7.0
+ dev: true
+
+ /jest-docblock@29.7.0:
+ resolution: {integrity: sha512-q617Auw3A612guyaFgsbFeYpNP5t2aoUNLwBUbc/0kD1R4t9ixDbyFTHd1nok4epoVFpr7PmeWHrhvuV3XaJ4g==}
+ engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
+ dependencies:
+ detect-newline: 3.1.0
+ dev: true
+
+ /jest-each@29.7.0:
+ resolution: {integrity: sha512-gns+Er14+ZrEoC5fhOfYCY1LOHHr0TI+rQUHZS8Ttw2l7gl+80eHc/gFf2Ktkw0+SIACDTeWvpFcv3B04VembQ==}
+ engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
+ dependencies:
+ '@jest/types': 29.6.3
+ chalk: 4.1.2
+ jest-get-type: 29.6.3
+ jest-util: 29.7.0
+ pretty-format: 29.7.0
+ dev: true
+
+ /jest-environment-node@29.7.0:
+ resolution: {integrity: sha512-DOSwCRqXirTOyheM+4d5YZOrWcdu0LNZ87ewUoywbcb2XR4wKgqiG8vNeYwhjFMbEkfju7wx2GYH0P2gevGvFw==}
+ engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
+ dependencies:
+ '@jest/environment': 29.7.0
+ '@jest/fake-timers': 29.7.0
+ '@jest/types': 29.6.3
+ '@types/node': 18.18.14
+ jest-mock: 29.7.0
+ jest-util: 29.7.0
+ dev: true
+
+ /jest-get-type@29.6.3:
+ resolution: {integrity: sha512-zrteXnqYxfQh7l5FHyL38jL39di8H8rHoecLH3JNxH3BwOrBsNeabdap5e0I23lD4HHI8W5VFBZqG4Eaq5LNcw==}
+ engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
+ dev: true
+
+ /jest-haste-map@29.7.0:
+ resolution: {integrity: sha512-fP8u2pyfqx0K1rGn1R9pyE0/KTn+G7PxktWidOBTqFPLYX0b9ksaMFkhK5vrS3DVun09pckLdlx90QthlW7AmA==}
+ engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
+ dependencies:
+ '@jest/types': 29.6.3
+ '@types/graceful-fs': 4.1.9
+ '@types/node': 18.18.14
+ anymatch: 3.1.3
+ fb-watchman: 2.0.2
+ graceful-fs: 4.2.11
+ jest-regex-util: 29.6.3
+ jest-util: 29.7.0
+ jest-worker: 29.7.0
+ micromatch: 4.0.8
+ walker: 1.0.8
+ optionalDependencies:
+ fsevents: 2.3.3
+ dev: true
+
+ /jest-leak-detector@29.7.0:
+ resolution: {integrity: sha512-kYA8IJcSYtST2BY9I+SMC32nDpBT3J2NvWJx8+JCuCdl/CR1I4EKUJROiP8XtCcxqgTTBGJNdbB1A8XRKbTetw==}
+ engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
+ dependencies:
+ jest-get-type: 29.6.3
+ pretty-format: 29.7.0
+ dev: true
+
+ /jest-matcher-utils@29.7.0:
+ resolution: {integrity: sha512-sBkD+Xi9DtcChsI3L3u0+N0opgPYnCRPtGcQYrgXmR+hmt/fYfWAL0xRXYU8eWOdfuLgBe0YCW3AFtnRLagq/g==}
+ engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
+ dependencies:
+ chalk: 4.1.2
+ jest-diff: 29.7.0
+ jest-get-type: 29.6.3
+ pretty-format: 29.7.0
+ dev: true
+
+ /jest-message-util@29.7.0:
+ resolution: {integrity: sha512-GBEV4GRADeP+qtB2+6u61stea8mGcOT4mCtrYISZwfu9/ISHFJ/5zOMXYbpBE9RsS5+Gb63DW4FgmnKJ79Kf6w==}
+ engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
+ dependencies:
+ '@babel/code-frame': 7.27.1
+ '@jest/types': 29.6.3
+ '@types/stack-utils': 2.0.3
+ chalk: 4.1.2
+ graceful-fs: 4.2.11
+ micromatch: 4.0.8
+ pretty-format: 29.7.0
+ slash: 3.0.0
+ stack-utils: 2.0.6
+ dev: true
+
+ /jest-mock@29.7.0:
+ resolution: {integrity: sha512-ITOMZn+UkYS4ZFh83xYAOzWStloNzJFO2s8DWrE4lhtGD+AorgnbkiKERe4wQVBydIGPx059g6riW5Btp6Llnw==}
+ engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
+ dependencies:
+ '@jest/types': 29.6.3
+ '@types/node': 18.18.14
+ jest-util: 29.7.0
+ dev: true
+
+ /jest-pnp-resolver@1.2.3(jest-resolve@29.7.0):
+ resolution: {integrity: sha512-+3NpwQEnRoIBtx4fyhblQDPgJI0H1IEIkX7ShLUjPGA7TtUTvI1oiKi3SR4oBR0hQhQR80l4WAe5RrXBwWMA8w==}
+ engines: {node: '>=6'}
+ peerDependencies:
+ jest-resolve: '*'
+ peerDependenciesMeta:
+ jest-resolve:
+ optional: true
+ dependencies:
+ jest-resolve: 29.7.0
+ dev: true
+
+ /jest-regex-util@29.6.3:
+ resolution: {integrity: sha512-KJJBsRCyyLNWCNBOvZyRDnAIfUiRJ8v+hOBQYGn8gDyF3UegwiP4gwRR3/SDa42g1YbVycTidUF3rKjyLFDWbg==}
+ engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
+ dev: true
+
+ /jest-regex-util@30.0.1:
+ resolution: {integrity: sha512-jHEQgBXAgc+Gh4g0p3bCevgRCVRkB4VB70zhoAE48gxeSr1hfUOsM/C2WoJgVL7Eyg//hudYENbm3Ne+/dRVVA==}
+ engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0}
+ dev: true
+
+ /jest-resolve-dependencies@29.7.0:
+ resolution: {integrity: sha512-un0zD/6qxJ+S0et7WxeI3H5XSe9lTBBR7bOHCHXkKR6luG5mwDDlIzVQ0V5cZCuoTgEdcdwzTghYkTWfubi+nA==}
+ engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
+ dependencies:
+ jest-regex-util: 29.6.3
+ jest-snapshot: 29.7.0
+ transitivePeerDependencies:
+ - supports-color
+ dev: true
+
+ /jest-resolve@29.7.0:
+ resolution: {integrity: sha512-IOVhZSrg+UvVAshDSDtHyFCCBUl/Q3AAJv8iZ6ZjnZ74xzvwuzLXid9IIIPgTnY62SJjfuupMKZsZQRsCvxEgA==}
+ engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
+ dependencies:
+ chalk: 4.1.2
+ graceful-fs: 4.2.11
+ jest-haste-map: 29.7.0
+ jest-pnp-resolver: 1.2.3(jest-resolve@29.7.0)
+ jest-util: 29.7.0
+ jest-validate: 29.7.0
+ resolve: 1.22.11
+ resolve.exports: 2.0.3
+ slash: 3.0.0
+ dev: true
+
+ /jest-runner@29.7.0:
+ resolution: {integrity: sha512-fsc4N6cPCAahybGBfTRcq5wFR6fpLznMg47sY5aDpsoejOcVYFb07AHuSnR0liMcPTgBsA3ZJL6kFOjPdoNipQ==}
+ engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
+ dependencies:
+ '@jest/console': 29.7.0
+ '@jest/environment': 29.7.0
+ '@jest/test-result': 29.7.0
+ '@jest/transform': 29.7.0
+ '@jest/types': 29.6.3
+ '@types/node': 18.18.14
+ chalk: 4.1.2
+ emittery: 0.13.1
+ graceful-fs: 4.2.11
+ jest-docblock: 29.7.0
+ jest-environment-node: 29.7.0
+ jest-haste-map: 29.7.0
+ jest-leak-detector: 29.7.0
+ jest-message-util: 29.7.0
+ jest-resolve: 29.7.0
+ jest-runtime: 29.7.0
+ jest-util: 29.7.0
+ jest-watcher: 29.7.0
+ jest-worker: 29.7.0
+ p-limit: 3.1.0
+ source-map-support: 0.5.13
+ transitivePeerDependencies:
+ - supports-color
+ dev: true
+
+ /jest-runtime@29.7.0:
+ resolution: {integrity: sha512-gUnLjgwdGqW7B4LvOIkbKs9WGbn+QLqRQQ9juC6HndeDiezIwhDP+mhMwHWCEcfQ5RUXa6OPnFF8BJh5xegwwQ==}
+ engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
+ dependencies:
+ '@jest/environment': 29.7.0
+ '@jest/fake-timers': 29.7.0
+ '@jest/globals': 29.7.0
+ '@jest/source-map': 29.6.3
+ '@jest/test-result': 29.7.0
+ '@jest/transform': 29.7.0
+ '@jest/types': 29.6.3
+ '@types/node': 18.18.14
+ chalk: 4.1.2
+ cjs-module-lexer: 1.4.3
+ collect-v8-coverage: 1.0.3
+ glob: 7.2.3
+ graceful-fs: 4.2.11
+ jest-haste-map: 29.7.0
+ jest-message-util: 29.7.0
+ jest-mock: 29.7.0
+ jest-regex-util: 29.6.3
+ jest-resolve: 29.7.0
+ jest-snapshot: 29.7.0
+ jest-util: 29.7.0
+ slash: 3.0.0
+ strip-bom: 4.0.0
+ transitivePeerDependencies:
+ - supports-color
+ dev: true
+
+ /jest-snapshot@29.7.0:
+ resolution: {integrity: sha512-Rm0BMWtxBcioHr1/OX5YCP8Uov4riHvKPknOGs804Zg9JGZgmIBkbtlxJC/7Z4msKYVbIJtfU+tKb8xlYNfdkw==}
+ engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
+ dependencies:
+ '@babel/core': 7.28.5
+ '@babel/generator': 7.28.5
+ '@babel/plugin-syntax-jsx': 7.27.1(@babel/core@7.28.5)
+ '@babel/plugin-syntax-typescript': 7.27.1(@babel/core@7.28.5)
+ '@babel/types': 7.28.5
+ '@jest/expect-utils': 29.7.0
+ '@jest/transform': 29.7.0
+ '@jest/types': 29.6.3
+ babel-preset-current-node-syntax: 1.2.0(@babel/core@7.28.5)
+ chalk: 4.1.2
+ expect: 29.7.0
+ graceful-fs: 4.2.11
+ jest-diff: 29.7.0
+ jest-get-type: 29.6.3
+ jest-matcher-utils: 29.7.0
+ jest-message-util: 29.7.0
+ jest-util: 29.7.0
+ natural-compare: 1.4.0
+ pretty-format: 29.7.0
+ semver: 7.7.3
+ transitivePeerDependencies:
+ - supports-color
+ dev: true
+
+ /jest-util@29.7.0:
+ resolution: {integrity: sha512-z6EbKajIpqGKU56y5KBUgy1dt1ihhQJgWzUlZHArA/+X2ad7Cb5iF+AK1EWVL/Bo7Rz9uurpqw6SiBCefUbCGA==}
+ engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
+ dependencies:
+ '@jest/types': 29.6.3
+ '@types/node': 18.18.14
+ chalk: 4.1.2
+ ci-info: 3.9.0
+ graceful-fs: 4.2.11
+ picomatch: 2.3.1
+ dev: true
+
+ /jest-validate@29.7.0:
+ resolution: {integrity: sha512-ZB7wHqaRGVw/9hST/OuFUReG7M8vKeq0/J2egIGLdvjHCmYqGARhzXmtgi+gVeZ5uXFF219aOc3Ls2yLg27tkw==}
+ engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
+ dependencies:
+ '@jest/types': 29.6.3
+ camelcase: 6.3.0
+ chalk: 4.1.2
+ jest-get-type: 29.6.3
+ leven: 3.1.0
+ pretty-format: 29.7.0
+ dev: true
+
+ /jest-watcher@29.7.0:
+ resolution: {integrity: sha512-49Fg7WXkU3Vl2h6LbLtMQ/HyB6rXSIX7SqvBLQmssRBGN9I0PNvPmAmCWSOY6SOvrjhI/F7/bGAv9RtnsPA03g==}
+ engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
+ dependencies:
+ '@jest/test-result': 29.7.0
+ '@jest/types': 29.6.3
+ '@types/node': 18.18.14
+ ansi-escapes: 4.3.2
+ chalk: 4.1.2
+ emittery: 0.13.1
+ jest-util: 29.7.0
+ string-length: 4.0.2
+ dev: true
+
+ /jest-worker@29.7.0:
+ resolution: {integrity: sha512-eIz2msL/EzL9UFTFFx7jBTkeZfku0yUAyZZZmJ93H2TYEiroIx2PQjEXcwYtYl8zXCxb+PAmA2hLIt/6ZEkPHw==}
+ engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
+ dependencies:
+ '@types/node': 18.18.14
+ jest-util: 29.7.0
+ merge-stream: 2.0.0
+ supports-color: 8.1.1
+ 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}
+ 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
+
+ /js-sha256@0.9.0:
+ resolution: {integrity: sha512-sga3MHh9sgQN2+pJ9VYZ+1LPwXOxuBJBA5nrR5/ofPfuiJBE2hnjsaN8se8JznOmGLN2p49Pe5U/ttafcs/apA==}
+ dev: true
+
+ /js-sha3@0.5.7:
+ resolution: {integrity: sha512-GII20kjaPX0zJ8wzkTbNDYMY7msuZcTWk8S5UOh6806Jq/wz1J8/bnr8uGU0DAUmYDjj2Mr4X1cW8v/GLYnR+g==}
+ dev: true
+
+ /js-sha3@0.8.0:
+ resolution: {integrity: sha512-gF1cRrHhIzNfToc802P800N8PpXS+evLLXfsVpowqmAFR9uwbi89WvXg2QspOmXL8QL86J4T1EpFu+yUkwJY3Q==}
+ dev: true
+
+ /js-tokens@4.0.0:
+ resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==}
+ dev: true
+
+ /js-yaml@3.14.1:
+ resolution: {integrity: sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==}
+ hasBin: true
+ dependencies:
+ argparse: 1.0.10
+ esprima: 4.0.1
+ dev: true
+
+ /js-yaml@4.1.0:
+ resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==}
+ hasBin: true
+ dependencies:
+ argparse: 2.0.1
+ dev: true
+
+ /jsbn@0.1.1:
+ resolution: {integrity: sha512-UVU9dibq2JcFWxQPA6KCqj5O42VOmAY3zQUfEKxU0KpTGXwNoCjkX1e13eHNvw/xPynt6pU0rZ1htjWTNTSXsg==}
+ dev: true
+
+ /jscrypto@1.0.3:
+ resolution: {integrity: sha512-lryZl0flhodv4SZHOqyb1bx5sKcJxj0VBo0Kzb4QMAg3L021IC9uGpl0RCZa+9KJwlRGSK2C80ITcwbe19OKLQ==}
+ hasBin: true
+ dev: true
+
+ /jsesc@3.1.0:
+ 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==}
+ dependencies:
+ bignumber.js: 9.3.1
+ dev: true
+
+ /json-buffer@3.0.1:
+ resolution: {integrity: sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==}
+ dev: true
+
+ /json-parse-even-better-errors@2.3.1:
+ resolution: {integrity: sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==}
+ dev: true
+
+ /json-schema-traverse@0.4.1:
+ resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==}
+ dev: true
+
+ /json-schema-traverse@1.0.0:
+ resolution: {integrity: sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==}
+ dev: true
+
+ /json-schema@0.4.0:
+ resolution: {integrity: sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA==}
+ dev: true
+
+ /json-stable-stringify-without-jsonify@1.0.1:
+ resolution: {integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==}
+ dev: true
+
+ /json-stream-stringify@3.1.6:
+ resolution: {integrity: sha512-x7fpwxOkbhFCaJDJ8vb1fBY3DdSa4AlITaz+HHILQJzdPMnHEFjxPwVUi1ALIbcIxDE0PNe/0i7frnY8QnBQog==}
+ engines: {node: '>=7.10.1'}
+ dev: true
+
+ /json-stringify-safe@5.0.1:
+ resolution: {integrity: sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==}
+ dev: true
+
+ /json5@1.0.2:
+ resolution: {integrity: sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==}
+ hasBin: true
+ dependencies:
+ minimist: 1.2.8
+ dev: true
+
+ /json5@2.2.3:
+ resolution: {integrity: sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==}
+ engines: {node: '>=6'}
+ hasBin: true
+ dev: true
+
+ /jsonc-parser@3.3.1:
+ resolution: {integrity: sha512-HUgH65KyejrUFPvHFPbqOY0rsFip3Bo5wb4ngvdi1EpCYWUQDC5V+Y7mZws+DLkr4M//zQJoanu1SP+87Dv1oQ==}
+ dev: true
+
+ /jsonfile@2.4.0:
+ resolution: {integrity: sha512-PKllAqbgLgxHaj8TElYymKCAgrASebJrWpTnEkOaTowt23VKXXN0sUeriJ+eh7y6ufb/CC5ap11pz71/cM0hUw==}
+ optionalDependencies:
+ graceful-fs: 4.2.11
+ dev: true
+
+ /jsonfile@4.0.0:
+ resolution: {integrity: sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==}
+ optionalDependencies:
+ graceful-fs: 4.2.11
+ dev: true
+
+ /jsonfile@6.2.0:
+ resolution: {integrity: sha512-FGuPw30AdOIUTRMC2OMRtQV+jkVj2cfPqSeWXv1NEAJ1qZ5zb1X6z1mFhbfOB/iy3ssJCD+3KuZ8r8C3uVFlAg==}
+ dependencies:
+ universalify: 2.0.1
+ optionalDependencies:
+ graceful-fs: 4.2.11
+ dev: true
+
+ /jsprim@1.4.2:
+ resolution: {integrity: sha512-P2bSOMAc/ciLz6DzgjVlGJP9+BrJWu5UDGK70C2iweC5QBIeFf0ZXRvGjEj2uYgrY2MkAAhsSWHDWlFtEroZWw==}
+ engines: {node: '>=0.6.0'}
+ dependencies:
+ assert-plus: 1.0.0
+ extsprintf: 1.3.0
+ json-schema: 0.4.0
+ verror: 1.10.0
+ dev: true
+
+ /jssha@3.2.0:
+ resolution: {integrity: sha512-QuruyBENDWdN4tZwJbQq7/eAK85FqrI4oDbXjy5IBhYD+2pTJyBUWZe8ctWaCkrV0gy6AaelgOZZBMeswEa/6Q==}
+ dev: true
+
+ /keccak256@1.0.6:
+ resolution: {integrity: sha512-8GLiM01PkdJVGUhR1e6M/AvWnSqYS0HaERI+K/QtStGDGlSTx2B1zTqZk4Zlqu5TxHJNTxWAdP9Y+WI50OApUw==}
+ dependencies:
+ bn.js: 5.2.2
+ buffer: 6.0.3
+ keccak: 3.0.4
+ dev: true
+
+ /keccak@3.0.1:
+ resolution: {integrity: sha512-epq90L9jlFWCW7+pQa6JOnKn2Xgl2mtI664seYR6MHskvI9agt7AnDqmAlp9TqU4/caMYbA08Hi5DMZAl5zdkA==}
+ engines: {node: '>=10.0.0'}
+ requiresBuild: true
+ dependencies:
+ node-addon-api: 2.0.2
+ node-gyp-build: 4.8.4
+ dev: true
+
+ /keccak@3.0.4:
+ resolution: {integrity: sha512-3vKuW0jV8J3XNTzvfyicFR5qvxrSAGl7KIhvgOu5cmWwM7tZRj3fMbj/pfIf4be7aznbc+prBWGjywox/g2Y6Q==}
+ engines: {node: '>=10.0.0'}
+ requiresBuild: true
+ dependencies:
+ node-addon-api: 2.0.2
+ node-gyp-build: 4.8.4
+ readable-stream: 3.6.2
+ dev: true
+
+ /keyv@4.5.4:
+ resolution: {integrity: sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==}
+ dependencies:
+ json-buffer: 3.0.1
+ dev: true
+
+ /klaw@1.3.1:
+ resolution: {integrity: sha512-TED5xi9gGQjGpNnvRWknrwAB1eL5GciPfVFOt3Vk1OJCVDQbzuSfrF3hkUQKlsgKrG1F+0t5W0m+Fje1jIt8rw==}
+ optionalDependencies:
+ graceful-fs: 4.2.11
+ dev: true
+
+ /kleur@3.0.3:
+ resolution: {integrity: sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==}
+ engines: {node: '>=6'}
+ dev: true
+
+ /kuler@2.0.0:
+ resolution: {integrity: sha512-Xq9nH7KlWZmXAtodXDDRE7vs6DU1gTU8zYDHDiWLSip45Egwq3plLHzPn27NgvzL2r1LMPC1vdqh98sQxtqj4A==}
+ dev: true
+
+ /latest-version@7.0.0:
+ resolution: {integrity: sha512-KvNT4XqAMzdcL6ka6Tl3i2lYeFDgXNCuIX+xNx6ZMVR1dFq+idXd9FLKNMOIx0t9mJ9/HudyX4oZWXZQ0UJHeg==}
+ engines: {node: '>=14.16'}
+ dependencies:
+ package-json: 8.1.1
+ dev: true
+
+ /lcid@1.0.0:
+ resolution: {integrity: sha512-YiGkH6EnGrDGqLMITnGjXtGmNtjoXw9SVUzcaos8RBi7Ps0VBylkq+vOcY9QE5poLasPCR849ucFUkl0UzUyOw==}
+ engines: {node: '>=0.10.0'}
+ dependencies:
+ invert-kv: 1.0.0
+ dev: true
+
+ /level-codec@9.0.2:
+ resolution: {integrity: sha512-UyIwNb1lJBChJnGfjmO0OR+ezh2iVu1Kas3nvBS/BzGnx79dv6g7unpKIDNPMhfdTEGoc7mC8uAu51XEtX+FHQ==}
+ engines: {node: '>=6'}
+ deprecated: Superseded by level-transcoder (https://github.com/Level/community#faq)
+ dependencies:
+ buffer: 5.7.1
+ dev: true
+
+ /level-concat-iterator@2.0.1:
+ resolution: {integrity: sha512-OTKKOqeav2QWcERMJR7IS9CUo1sHnke2C0gkSmcR7QuEtFNLLzHQAvnMw8ykvEcv0Qtkg0p7FOwP1v9e5Smdcw==}
+ engines: {node: '>=6'}
+ deprecated: Superseded by abstract-level (https://github.com/Level/community#faq)
+ dev: true
+
+ /level-errors@2.0.1:
+ resolution: {integrity: sha512-UVprBJXite4gPS+3VznfgDSU8PTRuVX0NXwoWW50KLxd2yw4Y1t2JUR5In1itQnudZqRMT9DlAM3Q//9NCjCFw==}
+ engines: {node: '>=6'}
+ deprecated: Superseded by abstract-level (https://github.com/Level/community#faq)
+ dependencies:
+ errno: 0.1.8
+ dev: true
+
+ /level-iterator-stream@4.0.2:
+ resolution: {integrity: sha512-ZSthfEqzGSOMWoUGhTXdX9jv26d32XJuHz/5YnuHZzH6wldfWMOVwI9TBtKcya4BKTyTt3XVA0A3cF3q5CY30Q==}
+ engines: {node: '>=6'}
+ dependencies:
+ inherits: 2.0.4
+ readable-stream: 3.6.2
+ xtend: 4.0.2
+ dev: true
+
+ /level-mem@5.0.1:
+ resolution: {integrity: sha512-qd+qUJHXsGSFoHTziptAKXoLX87QjR7v2KMbqncDXPxQuCdsQlzmyX+gwrEHhlzn08vkf8TyipYyMmiC6Gobzg==}
+ engines: {node: '>=6'}
+ deprecated: Superseded by memory-level (https://github.com/Level/community#faq)
+ dependencies:
+ level-packager: 5.1.1
+ memdown: 5.1.0
+ dev: true
+
+ /level-packager@5.1.1:
+ resolution: {integrity: sha512-HMwMaQPlTC1IlcwT3+swhqf/NUO+ZhXVz6TY1zZIIZlIR0YSn8GtAAWmIvKjNY16ZkEg/JcpAuQskxsXqC0yOQ==}
+ engines: {node: '>=6'}
+ deprecated: Superseded by abstract-level (https://github.com/Level/community#faq)
+ dependencies:
+ encoding-down: 6.3.0
+ levelup: 4.4.0
+ dev: true
+
+ /level-supports@1.0.1:
+ resolution: {integrity: sha512-rXM7GYnW8gsl1vedTJIbzOrRv85c/2uCMpiiCzO2fndd06U/kUXEEU9evYn4zFggBOg36IsBW8LzqIpETwwQzg==}
+ engines: {node: '>=6'}
+ dependencies:
+ xtend: 4.0.2
+ dev: true
+
+ /level-ws@2.0.0:
+ resolution: {integrity: sha512-1iv7VXx0G9ec1isqQZ7y5LmoZo/ewAsyDHNA8EFDW5hqH2Kqovm33nSFkSdnLLAK+I5FlT+lo5Cw9itGe+CpQA==}
+ engines: {node: '>=6'}
+ dependencies:
+ inherits: 2.0.4
+ readable-stream: 3.6.2
+ xtend: 4.0.2
+ dev: true
+
+ /levelup@4.4.0:
+ resolution: {integrity: sha512-94++VFO3qN95cM/d6eBXvd894oJE0w3cInq9USsyQzzoJxmiYzPAocNcuGCPGGjoXqDVJcr3C1jzt1TSjyaiLQ==}
+ engines: {node: '>=6'}
+ deprecated: Superseded by abstract-level (https://github.com/Level/community#faq)
+ dependencies:
+ deferred-leveldown: 5.3.0
+ level-errors: 2.0.1
+ level-iterator-stream: 4.0.2
+ level-supports: 1.0.1
+ xtend: 4.0.2
+ dev: true
+
+ /leven@3.1.0:
+ resolution: {integrity: sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==}
+ engines: {node: '>=6'}
+ dev: true
+
+ /levn@0.4.1:
+ resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==}
+ engines: {node: '>= 0.8.0'}
+ dependencies:
+ prelude-ls: 1.2.1
+ type-check: 0.4.0
+ dev: true
+
+ /lines-and-columns@1.2.4:
+ resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==}
+ dev: true
+
+ /load-json-file@1.1.0:
+ resolution: {integrity: sha512-cy7ZdNRXdablkXYNI049pthVeXFurRyb9+hA/dZzerZ0pGTx42z+y+ssxBaVV2l70t1muq5IdKhn4UtcoGUY9A==}
+ engines: {node: '>=0.10.0'}
+ dependencies:
+ graceful-fs: 4.2.11
+ parse-json: 2.2.0
+ pify: 2.3.0
+ pinkie-promise: 2.0.1
+ strip-bom: 2.0.0
+ dev: true
+
+ /locate-path@5.0.0:
+ resolution: {integrity: sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==}
+ engines: {node: '>=8'}
+ dependencies:
+ p-locate: 4.1.0
+ dev: true
+
+ /locate-path@6.0.0:
+ resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==}
+ engines: {node: '>=10'}
+ dependencies:
+ p-locate: 5.0.0
+ dev: true
+
+ /lodash.assign@4.2.0:
+ resolution: {integrity: sha512-hFuH8TY+Yji7Eja3mGiuAxBqLagejScbG8GbG0j6o9vzn0YL14My+ktnqtZgFTosKymC9/44wP6s7xyuLfnClw==}
+ dev: true
+
+ /lodash.camelcase@4.3.0:
+ resolution: {integrity: sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA==}
+ dev: true
+
+ /lodash.isequal@4.5.0:
+ resolution: {integrity: sha512-pDo3lu8Jhfjqls6GkMgpahsF9kCyayhgykjyLMNFTKWrpVdAQtYyB4muAMWozBB4ig/dtWAmsMxLEI8wuz+DYQ==}
+ deprecated: This package is deprecated. Use require('node:util').isDeepStrictEqual instead.
+ dev: true
+
+ /lodash.memoize@4.1.2:
+ resolution: {integrity: sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag==}
+ dev: true
+
+ /lodash.merge@4.6.2:
+ resolution: {integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==}
+ dev: true
+
+ /lodash.truncate@4.4.2:
+ resolution: {integrity: sha512-jttmRe7bRse52OsWIMDLaXxWqRAmtIUccAQ3garviCqJjafXOfNMO0yMfNpdD6zbGaTU0P5Nz7e7gAT6cKmJRw==}
+ dev: true
+
+ /lodash@4.17.21:
+ resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==}
+ dev: true
+
+ /log-symbols@4.1.0:
+ resolution: {integrity: sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==}
+ engines: {node: '>=10'}
+ dependencies:
+ chalk: 4.1.2
+ is-unicode-supported: 0.1.0
+ dev: true
+
+ /logform@2.7.0:
+ resolution: {integrity: sha512-TFYA4jnP7PVbmlBIfhlSe+WKxs9dklXMTEGcBCIvLhE/Tn3H6Gk1norupVW7m5Cnd4bLcr08AytbyV/xj7f/kQ==}
+ engines: {node: '>= 12.0.0'}
+ dependencies:
+ '@colors/colors': 1.6.0
+ '@types/triple-beam': 1.3.5
+ fecha: 4.2.3
+ ms: 2.1.3
+ safe-stable-stringify: 2.5.0
+ triple-beam: 1.4.1
+ dev: true
+
+ /long@5.3.2:
+ resolution: {integrity: sha512-mNAgZ1GmyNhD7AuqnTG3/VQ26o760+ZYBPKjPvugO8+nLbYfX6TVpJPseBvopbdY+qpZ/lKUnmEc1LeZYS3QAA==}
+ dev: true
+
+ /loose-envify@1.4.0:
+ resolution: {integrity: sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==}
+ hasBin: true
+ dependencies:
+ js-tokens: 4.0.0
+ dev: true
+
+ /loupe@2.3.7:
+ resolution: {integrity: sha512-zSMINGVYkdpYSOBmLi0D1Uo7JU9nVdQKrHxC8eYlV+9YKK9WePqAlL7lSlorG/U2Fw1w0hTBmaa/jrQ3UbPHtA==}
+ dependencies:
+ get-func-name: 2.0.2
+ dev: true
+
+ /lower-case@2.0.2:
+ resolution: {integrity: sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg==}
+ dependencies:
+ tslib: 2.8.1
+ dev: true
+
+ /lowercase-keys@2.0.0:
+ resolution: {integrity: sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA==}
+ engines: {node: '>=8'}
+ dev: true
+
+ /lowercase-keys@3.0.0:
+ resolution: {integrity: sha512-ozCC6gdQ+glXOQsveKD0YsDy8DSQFjDTz4zyzEHNV5+JP5D62LmfDZ6o1cycFx9ouG940M5dE8C8CTewdj2YWQ==}
+ engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0}
+ dev: true
+
+ /lru-cache@5.1.1:
+ resolution: {integrity: sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==}
+ dependencies:
+ yallist: 3.1.1
+ dev: true
+
+ /lru-queue@0.1.0:
+ resolution: {integrity: sha512-BpdYkt9EvGl8OfWHDQPISVpcl5xZthb+XPsbELj5AQXxIC8IriDZIQYjBJPEm5rS420sjZ0TLEzRcq5KdBhYrQ==}
+ dependencies:
+ es5-ext: 0.10.64
+ dev: true
+
+ /lru_map@0.3.3:
+ resolution: {integrity: sha512-Pn9cox5CsMYngeDbmChANltQl+5pi6XmTrraMSzhPmMBbmgcxmqWry0U3PGapCU1yB4/LqCcom7qhHZiF/jGfQ==}
+ dev: true
+
+ /ltgt@2.2.1:
+ resolution: {integrity: sha512-AI2r85+4MquTw9ZYqabu4nMwy9Oftlfa/e/52t9IjtfG+mGBbTNdAoZ3RQKLHR6r0wQnwZnPIEh/Ya6XTWAKNA==}
+ dev: true
+
+ /make-dir@4.0.0:
+ resolution: {integrity: sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==}
+ engines: {node: '>=10'}
+ dependencies:
+ semver: 7.7.3
+ dev: true
+
+ /make-error@1.3.6:
+ resolution: {integrity: sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==}
+ dev: true
+
+ /makeerror@1.0.12:
+ resolution: {integrity: sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg==}
+ dependencies:
+ tmpl: 1.0.5
+ dev: true
+
+ /map-age-cleaner@0.1.3:
+ resolution: {integrity: sha512-bJzx6nMoP6PDLPBFmg7+xRKeFZvFboMrGlxmNj9ClvX53KrmvM5bXFXEWjbz4cz1AFn+jWJ9z/DJSz7hrs0w3w==}
+ engines: {node: '>=6'}
+ dependencies:
+ p-defer: 1.0.0
+ dev: true
+
+ /match-all@1.2.7:
+ resolution: {integrity: sha512-qSpsBKarh55r9KyXzFC3xBLRf2GlGasba2em9kbpRsSlGvdTAqjx3QD0r3FKSARiW+OE4iMHYsolM3aX9n5djw==}
+ dev: true
+
+ /math-intrinsics@1.1.0:
+ resolution: {integrity: sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==}
+ engines: {node: '>= 0.4'}
+ dev: true
+
+ /mcl-wasm@0.7.9:
+ resolution: {integrity: sha512-iJIUcQWA88IJB/5L15GnJVnSQJmf/YaxxV6zRavv83HILHaJQb6y0iFyDMdDO0gN8X37tdxmAOrH/P8B6RB8sQ==}
+ engines: {node: '>=8.9.0'}
+ dev: true
+
+ /md5.js@1.3.5:
+ resolution: {integrity: sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg==}
+ dependencies:
+ hash-base: 3.1.2
+ inherits: 2.0.4
+ safe-buffer: 5.2.1
+ dev: true
+
+ /media-typer@0.3.0:
+ resolution: {integrity: sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==}
+ engines: {node: '>= 0.6'}
+ dev: true
+
+ /memdown@5.1.0:
+ resolution: {integrity: sha512-B3J+UizMRAlEArDjWHTMmadet+UKwHd3UjMgGBkZcKAxAYVPS9o0Yeiha4qvz7iGiL2Sb3igUft6p7nbFWctpw==}
+ engines: {node: '>=6'}
+ deprecated: Superseded by memory-level (https://github.com/Level/community#faq)
+ dependencies:
+ abstract-leveldown: 6.2.3
+ functional-red-black-tree: 1.0.1
+ immediate: 3.2.3
+ inherits: 2.0.4
+ ltgt: 2.2.1
+ safe-buffer: 5.2.1
+ dev: true
+
+ /memoizee@0.4.17:
+ resolution: {integrity: sha512-DGqD7Hjpi/1or4F/aYAspXKNm5Yili0QDAFAY4QYvpqpgiY6+1jOfqpmByzjxbWd/T9mChbCArXAbDAsTm5oXA==}
+ engines: {node: '>=0.12'}
+ dependencies:
+ d: 1.0.2
+ es5-ext: 0.10.64
+ es6-weak-map: 2.0.3
+ event-emitter: 0.3.5
+ is-promise: 2.2.2
+ lru-queue: 0.1.0
+ next-tick: 1.1.0
+ timers-ext: 0.1.8
+ dev: true
+
+ /memorystream@0.3.1:
+ resolution: {integrity: sha512-S3UwM3yj5mtUSEfP41UZmt/0SCoVYUcU1rkXv+BQ5Ig8ndL4sPoJNBUJERafdPb5jjHJGuMgytgKvKIf58XNBw==}
+ engines: {node: '>= 0.10.0'}
+ dev: true
+
+ /merge-descriptors@1.0.3:
+ resolution: {integrity: sha512-gaNvAS7TZ897/rVaZ0nMtAyxNyi/pdbjbAwUpFQpN70GqnVfOiXpeUUMKRBmzXaSQ8DdTX4/0ms62r2K+hE6mQ==}
+ dev: true
+
+ /merge-stream@2.0.0:
+ resolution: {integrity: sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==}
+ dev: true
+
+ /merge2@1.4.1:
+ resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==}
+ engines: {node: '>= 8'}
+ dev: true
+
+ /merkle-patricia-tree@4.2.4:
+ resolution: {integrity: sha512-eHbf/BG6eGNsqqfbLED9rIqbsF4+sykEaBn6OLNs71tjclbMcMOk1tEPmJKcNcNCLkvbpY/lwyOlizWsqPNo8w==}
+ dependencies:
+ '@types/levelup': 4.3.3
+ ethereumjs-util: 7.1.5
+ level-mem: 5.0.1
+ level-ws: 2.0.0
+ readable-stream: 3.6.2
+ semaphore-async-await: 1.5.1
+ dev: true
+
+ /methods@1.1.2:
+ resolution: {integrity: sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==}
+ engines: {node: '>= 0.6'}
+ dev: true
+
+ /micro-eth-signer@0.14.0:
+ resolution: {integrity: sha512-5PLLzHiVYPWClEvZIXXFu5yutzpadb73rnQCpUqIHu3No3coFuWQNfE5tkBQJ7djuLYl6aRLaS0MgWJYGoqiBw==}
+ dependencies:
+ '@noble/curves': 1.8.2
+ '@noble/hashes': 1.7.2
+ micro-packed: 0.7.3
+ dev: true
+
+ /micro-ftch@0.3.1:
+ resolution: {integrity: sha512-/0LLxhzP0tfiR5hcQebtudP56gUurs2CLkGarnCiB/OqEyUFQ6U3paQi/tgLv0hBJYt2rnr9MNpxz4fiiugstg==}
+ dev: true
+
+ /micro-memoize@4.1.3:
+ resolution: {integrity: sha512-DzRMi8smUZXT7rCGikRwldEh6eO6qzKiPPopcr1+2EY3AYKpy5fu159PKWwIS9A6IWnrvPKDMcuFtyrroZa8Bw==}
+ dev: true
+
+ /micro-packed@0.7.3:
+ resolution: {integrity: sha512-2Milxs+WNC00TRlem41oRswvw31146GiSaoCT7s3Xi2gMUglW5QBeqlQaZeHr5tJx9nm3i57LNXPqxOOaWtTYg==}
+ dependencies:
+ '@scure/base': 1.2.6
+ dev: true
+
+ /micromatch@4.0.8:
+ resolution: {integrity: sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==}
+ engines: {node: '>=8.6'}
+ dependencies:
+ braces: 3.0.3
+ picomatch: 2.3.1
+ dev: true
+
+ /miller-rabin@4.0.1:
+ resolution: {integrity: sha512-115fLhvZVqWwHPbClyntxEVfVDfl9DLLTuJvq3g2O/Oxi8AiNouAHvDSzHS0viUJc+V5vm3eq91Xwqn9dp4jRA==}
+ hasBin: true
+ dependencies:
+ bn.js: 4.12.2
+ brorand: 1.1.0
+ dev: true
+
+ /mime-db@1.52.0:
+ resolution: {integrity: sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==}
+ engines: {node: '>= 0.6'}
+ dev: true
+
+ /mime-types@2.1.35:
+ resolution: {integrity: sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==}
+ engines: {node: '>= 0.6'}
+ dependencies:
+ mime-db: 1.52.0
+ dev: true
+
+ /mime@1.6.0:
+ resolution: {integrity: sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==}
+ engines: {node: '>=4'}
+ hasBin: true
+ dev: true
+
+ /mimic-fn@2.1.0:
+ resolution: {integrity: sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==}
+ engines: {node: '>=6'}
+ dev: true
+
+ /mimic-fn@3.1.0:
+ resolution: {integrity: sha512-Ysbi9uYW9hFyfrThdDEQuykN4Ey6BuwPD2kpI5ES/nFTDn/98yxYNLZJcgUAKPT/mcrLLKaGzJR9YVxJrIdASQ==}
+ engines: {node: '>=8'}
+ dev: true
+
+ /mimic-response@1.0.1:
+ resolution: {integrity: sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ==}
+ engines: {node: '>=4'}
+ dev: true
+
+ /mimic-response@3.1.0:
+ resolution: {integrity: sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==}
+ engines: {node: '>=10'}
+ dev: true
+
+ /mimic-response@4.0.0:
+ resolution: {integrity: sha512-e5ISH9xMYU0DzrT+jl8q2ze9D6eWBto+I8CNpe+VI+K2J/F/k3PdkdTdz4wvGVH4NTpo+NRYTVIuMQEMMcsLqg==}
+ engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0}
+ dev: true
+
+ /min-document@2.19.0:
+ resolution: {integrity: sha512-9Wy1B3m3f66bPPmU5hdA4DR4PB2OfDU/+GS3yAB7IQozE3tqXaVv2zOjgla7MEGSRv95+ILmOuvhLkOK6wJtCQ==}
+ dependencies:
+ dom-walk: 0.1.2
+ dev: true
+
+ /minimalistic-assert@1.0.1:
+ resolution: {integrity: sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==}
+ dev: true
+
+ /minimalistic-crypto-utils@1.0.1:
+ resolution: {integrity: sha512-JIYlbt6g8i5jKfJ3xz7rF0LXmv2TkDxBLUkiBeZ7bAx4GnnNMr8xFpGnOxn6GhTEHx3SjRrZEoU+j04prX1ktg==}
+ dev: true
+
+ /minimatch@3.1.2:
+ resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==}
+ dependencies:
+ brace-expansion: 1.1.12
+ dev: true
+
+ /minimatch@5.1.6:
+ resolution: {integrity: sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==}
+ engines: {node: '>=10'}
+ dependencies:
+ brace-expansion: 2.0.2
+ dev: true
+
+ /minimatch@9.0.5:
+ resolution: {integrity: sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==}
+ engines: {node: '>=16 || 14 >=14.17'}
+ dependencies:
+ brace-expansion: 2.0.2
+ dev: true
+
+ /minimist@1.2.8:
+ resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==}
+ dev: true
+
+ /minipass@2.9.0:
+ resolution: {integrity: sha512-wxfUjg9WebH+CUDX/CdbRlh5SmfZiy/hpkxaRI16Y9W56Pa75sWgd/rvFilSgrauD9NyFymP/+JFV3KwzIsJeg==}
+ dependencies:
+ safe-buffer: 5.2.1
+ yallist: 3.1.1
+ dev: true
+
+ /minizlib@1.3.3:
+ resolution: {integrity: sha512-6ZYMOEnmVsdCeTJVE0W9ZD+pVnE8h9Hma/iOwwRDsdQoePpoX56/8B6z3P9VNwppJuBKNRuFDRNRqRWexT9G9Q==}
+ dependencies:
+ minipass: 2.9.0
+ dev: true
+
+ /mkdirp-promise@5.0.1:
+ resolution: {integrity: sha512-Hepn5kb1lJPtVW84RFT40YG1OddBNTOVUZR2bzQUHc+Z03en8/3uX0+060JDhcEzyO08HmipsN9DcnFMxhIL9w==}
+ engines: {node: '>=4'}
+ deprecated: This package is broken and no longer maintained. 'mkdirp' itself supports promises now, please switch to that.
+ dependencies:
+ mkdirp: 3.0.1
+ dev: true
+
+ /mkdirp@0.5.6:
+ resolution: {integrity: sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==}
+ hasBin: true
+ dependencies:
+ minimist: 1.2.8
+ dev: true
+
+ /mkdirp@1.0.4:
+ resolution: {integrity: sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==}
+ engines: {node: '>=10'}
+ hasBin: true
+ dev: true
+
+ /mkdirp@3.0.1:
+ resolution: {integrity: sha512-+NsyUUAZDmo6YVHzL/stxSu3t9YS1iljliy3BSDrXJ/dkn1KYdmtZODGGjLcc9XLgVVpH4KshHB8XmZgMhaBXg==}
+ engines: {node: '>=10'}
+ hasBin: true
+ dev: true
+
+ /mnemonist@0.38.5:
+ resolution: {integrity: sha512-bZTFT5rrPKtPJxj8KSV0WkPyNxl72vQepqqVUAW2ARUpUSF2qXMB6jZj7hW5/k7C1rtpzqbD/IIbJwLXUjCHeg==}
+ dependencies:
+ obliterator: 2.0.5
+ dev: true
+
+ /mocha@10.8.2:
+ resolution: {integrity: sha512-VZlYo/WE8t1tstuRmqgeyBgCbJc/lEdopaa+axcKzTBJ+UIdlAB9XnmvTCAH4pwR4ElNInaedhEBmZD8iCSVEg==}
+ engines: {node: '>= 14.0.0'}
+ hasBin: true
+ dependencies:
+ ansi-colors: 4.1.3
+ browser-stdout: 1.3.1
+ chokidar: 3.6.0
+ debug: 4.4.3(supports-color@8.1.1)
+ diff: 5.2.0
+ escape-string-regexp: 4.0.0
+ find-up: 5.0.0
+ glob: 8.1.0
+ he: 1.2.0
+ js-yaml: 4.1.0
+ log-symbols: 4.1.0
+ minimatch: 5.1.6
+ ms: 2.1.3
+ serialize-javascript: 6.0.2
+ strip-json-comments: 3.1.1
+ supports-color: 8.1.1
+ workerpool: 6.5.1
+ yargs: 16.2.0
+ yargs-parser: 20.2.9
+ yargs-unparser: 2.0.0
+ dev: true
+
+ /mock-fs@4.14.0:
+ resolution: {integrity: sha512-qYvlv/exQ4+svI3UOvPUpLDF0OMX5euvUH0Ny4N5QyRyhNdgAgUrVH3iUINSzEPLvx0kbo/Bp28GJKIqvE7URw==}
+ dev: true
+
+ /ms@2.0.0:
+ resolution: {integrity: sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==}
+ dev: true
+
+ /ms@2.1.3:
+ resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==}
+ dev: true
+
+ /multibase@0.6.1:
+ resolution: {integrity: sha512-pFfAwyTjbbQgNc3G7D48JkJxWtoJoBMaR4xQUOuB8RnCgRqaYmWNFeJTTvrJ2w51bjLq2zTby6Rqj9TQ9elSUw==}
+ deprecated: This module has been superseded by the multiformats module
+ dependencies:
+ base-x: 3.0.11
+ buffer: 5.7.1
+ dev: true
+
+ /multibase@0.7.0:
+ resolution: {integrity: sha512-TW8q03O0f6PNFTQDvh3xxH03c8CjGaaYrjkl9UQPG6rz53TQzzxJVCIWVjzcbN/Q5Y53Zd0IBQBMVktVgNx4Fg==}
+ deprecated: This module has been superseded by the multiformats module
+ dependencies:
+ base-x: 3.0.11
+ buffer: 5.7.1
+ dev: true
+
+ /multicodec@0.5.7:
+ resolution: {integrity: sha512-PscoRxm3f+88fAtELwUnZxGDkduE2HD9Q6GHUOywQLjOGT/HAdhjLDYNZ1e7VR0s0TP0EwZ16LNUTFpoBGivOA==}
+ deprecated: This module has been superseded by the multiformats module
+ dependencies:
+ varint: 5.0.2
+ dev: true
+
+ /multicodec@1.0.4:
+ resolution: {integrity: sha512-NDd7FeS3QamVtbgfvu5h7fd1IlbaC4EQ0/pgU4zqE2vdHCmBGsUa0TiM8/TdSeG6BMPC92OOCf8F1ocE/Wkrrg==}
+ deprecated: This module has been superseded by the multiformats module
+ dependencies:
+ buffer: 5.7.1
+ varint: 5.0.2
+ dev: true
+
+ /multihashes@0.4.21:
+ resolution: {integrity: sha512-uVSvmeCWf36pU2nB4/1kzYZjsXD9vofZKpgudqkceYY5g2aZZXJ5r9lxuzoRLl1OAp28XljXsEJ/X/85ZsKmKw==}
+ dependencies:
+ buffer: 5.7.1
+ multibase: 0.7.0
+ varint: 5.0.2
+ dev: true
+
+ /murmur-128@0.2.1:
+ resolution: {integrity: sha512-WseEgiRkI6aMFBbj8Cg9yBj/y+OdipwVC7zUo3W2W1JAJITwouUOtpqsmGSg67EQmwwSyod7hsVsWY5LsrfQVg==}
+ dependencies:
+ encode-utf8: 1.0.3
+ fmix: 0.1.0
+ imul: 1.0.1
+ dev: true
+
+ /nano-json-stream-parser@0.1.2:
+ resolution: {integrity: sha512-9MqxMH/BSJC7dnLsEMPyfN5Dvoo49IsPFYMcHw3Bcfc2kN0lpHRBSzlMSVx4HGyJ7s9B31CyBTVehWJoQ8Ctew==}
+ dev: true
+
+ /napi-postinstall@0.3.4:
+ resolution: {integrity: sha512-PHI5f1O0EP5xJ9gQmFGMS6IZcrVvTjpXjz7Na41gTE7eE2hK11lg04CECCYEEjdc17EV4DO+fkGEtt7TpTaTiQ==}
+ engines: {node: ^12.20.0 || ^14.18.0 || >=16.0.0}
+ hasBin: true
+ dev: true
+
+ /natural-compare@1.4.0:
+ resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==}
+ dev: true
+
+ /negotiator@0.6.3:
+ resolution: {integrity: sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==}
+ engines: {node: '>= 0.6'}
+ dev: true
+
+ /next-tick@1.1.0:
+ resolution: {integrity: sha512-CXdUiJembsNjuToQvxayPZF9Vqht7hewsvy2sOWafLvi2awflj9mOC6bHIg50orX8IJvWKY9wYQ/zB2kogPslQ==}
+ dev: true
+
+ /no-case@3.0.4:
+ resolution: {integrity: sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg==}
+ dependencies:
+ lower-case: 2.0.2
+ tslib: 2.8.1
+ dev: true
+
+ /node-addon-api@2.0.2:
+ resolution: {integrity: sha512-Ntyt4AIXyaLIuMHF6IOoTakB3K+RWxwtsHNRxllEoA6vPwP9o4866g6YWDLUdnucilZhmkxiHwHr11gAENw+QA==}
+ dev: true
+
+ /node-addon-api@5.1.0:
+ resolution: {integrity: sha512-eh0GgfEkpnoWDq+VY8OyvYhFEzBk6jIYbRKdIlyTiAXIVJ8PyBaKb0rp7oDtoddbdoHWhq8wwr+XZ81F1rpNdA==}
+ dev: true
+
+ /node-fetch@2.7.0:
+ resolution: {integrity: sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==}
+ engines: {node: 4.x || >=6.0.0}
+ peerDependencies:
+ encoding: ^0.1.0
+ peerDependenciesMeta:
+ encoding:
+ optional: true
+ dependencies:
+ whatwg-url: 5.0.0
+ dev: true
+
+ /node-gyp-build@4.3.0:
+ resolution: {integrity: sha512-iWjXZvmboq0ja1pUGULQBexmxq8CV4xBhX7VDOTbL7ZR4FOowwY/VOtRxBN/yKxmdGoIp4j5ysNT4u3S2pDQ3Q==}
+ hasBin: true
+ requiresBuild: true
+ dev: true
+ optional: true
+
+ /node-gyp-build@4.8.4:
+ resolution: {integrity: sha512-LA4ZjwlnUblHVgq0oBF3Jl/6h/Nvs5fzBLwdEF4nuxnFdsfajde4WfxtJr3CaiH+F6ewcIB/q4jQ4UzPyid+CQ==}
+ hasBin: true
+ dev: true
+
+ /node-int64@0.4.0:
+ resolution: {integrity: sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw==}
+ dev: true
+
+ /node-releases@2.0.27:
+ resolution: {integrity: sha512-nmh3lCkYZ3grZvqcCH+fjmQ7X+H0OeZgP40OierEaAptX4XofMh5kwNbWh7lBduUzCcV/8kZ+NDLCwm2iorIlA==}
+ dev: true
+
+ /normalize-package-data@2.5.0:
+ resolution: {integrity: sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==}
+ dependencies:
+ hosted-git-info: 2.8.9
+ resolve: 1.22.11
+ semver: 5.7.2
+ validate-npm-package-license: 3.0.4
+ dev: true
+
+ /normalize-path@3.0.0:
+ resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==}
+ engines: {node: '>=0.10.0'}
+ dev: true
+
+ /normalize-url@6.1.0:
+ resolution: {integrity: sha512-DlL+XwOy3NxAQ8xuC0okPgK46iuVNAK01YN7RueYBqqFeGsBjV9XmCAzAdgt+667bCl5kPh9EqKKDwnaPG1I7A==}
+ engines: {node: '>=10'}
+ dev: true
+
+ /normalize-url@8.1.0:
+ resolution: {integrity: sha512-X06Mfd/5aKsRHc0O0J5CUedwnPmnDtLF2+nq+KN9KSDlJHkPuh0JUviWjEWMe0SW/9TDdSLVPuk7L5gGTIA1/w==}
+ engines: {node: '>=14.16'}
+ dev: true
+
+ /npm-run-path@4.0.1:
+ resolution: {integrity: sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==}
+ engines: {node: '>=8'}
+ dependencies:
+ path-key: 3.1.1
+ dev: true
+
+ /number-is-nan@1.0.1:
+ resolution: {integrity: sha512-4jbtZXNAsfZbAHiiqjLPBiCl16dES1zI4Hpzzxw61Tk+loF+sBDBKx1ICKKKwIqQ7M0mFn1TmkN7euSncWgHiQ==}
+ engines: {node: '>=0.10.0'}
+ dev: true
+
+ /number-to-bn@1.7.0:
+ resolution: {integrity: sha512-wsJ9gfSz1/s4ZsJN01lyonwuxA1tml6X1yBDnfpMglypcBRFZZkus26EdPSlqS5GJfYddVZa22p3VNb3z5m5Ig==}
+ engines: {node: '>=6.5.0', npm: '>=3'}
+ dependencies:
+ bn.js: 4.11.6
+ strip-hex-prefix: 1.0.0
+ dev: true
+
+ /oauth-sign@0.9.0:
+ resolution: {integrity: sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==}
+ dev: true
+
+ /object-assign@4.1.1:
+ resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==}
+ engines: {node: '>=0.10.0'}
+ dev: true
+
+ /object-hash@2.2.0:
+ resolution: {integrity: sha512-gScRMn0bS5fH+IuwyIFgnh9zBdo4DV+6GhygmWM9HyNJSgS0hScp1f5vjtm7oIIOiT9trXrShAkLFSc2IqKNgw==}
+ engines: {node: '>= 6'}
+ dev: true
+
+ /object-inspect@1.13.4:
+ resolution: {integrity: sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==}
+ engines: {node: '>= 0.4'}
+ dev: true
+
+ /object-is@1.1.6:
+ resolution: {integrity: sha512-F8cZ+KfGlSGi09lJT7/Nd6KJZ9ygtvYC0/UYYLI9nmQKLMnydpB9yvbv9K1uSkEu7FU9vYPmVwLg328tX+ot3Q==}
+ engines: {node: '>= 0.4'}
+ dependencies:
+ call-bind: 1.0.8
+ define-properties: 1.2.1
+ dev: true
+
+ /object-keys@1.1.1:
+ resolution: {integrity: sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==}
+ engines: {node: '>= 0.4'}
+ dev: true
+
+ /object.assign@4.1.7:
+ resolution: {integrity: sha512-nK28WOo+QIjBkDduTINE4JkF/UJJKyf2EJxvJKfblDpyg0Q+pkOHNTL0Qwy6NP6FhE/EnzV73BxxqcJaXY9anw==}
+ engines: {node: '>= 0.4'}
+ dependencies:
+ call-bind: 1.0.8
+ call-bound: 1.0.4
+ define-properties: 1.2.1
+ es-object-atoms: 1.1.1
+ has-symbols: 1.1.0
+ object-keys: 1.1.1
+ dev: true
+
+ /object.fromentries@2.0.8:
+ resolution: {integrity: sha512-k6E21FzySsSK5a21KRADBd/NGneRegFO5pLHfdQLpRDETUNJueLXs3WCzyQ3tFRDYgbq3KHGXfTbi2bs8WQ6rQ==}
+ engines: {node: '>= 0.4'}
+ dependencies:
+ call-bind: 1.0.8
+ define-properties: 1.2.1
+ es-abstract: 1.24.0
+ es-object-atoms: 1.1.1
+ dev: true
+
+ /object.groupby@1.0.3:
+ resolution: {integrity: sha512-+Lhy3TQTuzXI5hevh8sBGqbmurHbbIjAi0Z4S63nthVLmLxfbj4T54a4CfZrXIrt9iP4mVAPYMo/v99taj3wjQ==}
+ engines: {node: '>= 0.4'}
+ dependencies:
+ call-bind: 1.0.8
+ define-properties: 1.2.1
+ es-abstract: 1.24.0
+ dev: true
+
+ /object.values@1.2.1:
+ resolution: {integrity: sha512-gXah6aZrcUxjWg2zR2MwouP2eHlCBzdV4pygudehaKXSGW4v2AsRQUK+lwwXhii6KFZcunEnmSUoYp5CXibxtA==}
+ engines: {node: '>= 0.4'}
+ dependencies:
+ call-bind: 1.0.8
+ call-bound: 1.0.4
+ define-properties: 1.2.1
+ es-object-atoms: 1.1.1
+ dev: true
+
+ /obliterator@2.0.5:
+ resolution: {integrity: sha512-42CPE9AhahZRsMNslczq0ctAEtqk8Eka26QofnqC346BZdHDySk3LWka23LI7ULIw11NmltpiLagIq8gBozxTw==}
+ dev: true
+
+ /oboe@2.1.5:
+ resolution: {integrity: sha512-zRFWiF+FoicxEs3jNI/WYUrVEgA7DeET/InK0XQuudGHRg8iIob3cNPrJTKaz4004uaA9Pbe+Dwa8iluhjLZWA==}
+ dependencies:
+ http-https: 1.0.0
+ dev: true
+
+ /on-exit-leak-free@2.1.2:
+ resolution: {integrity: sha512-0eJJY6hXLGf1udHwfNftBqH+g73EU4B504nZeKpz1sYRKafAghwxEJunB2O7rDZkL4PGfsMVnTXZ2EjibbqcsA==}
+ engines: {node: '>=14.0.0'}
+ dev: true
+
+ /on-finished@2.4.1:
+ resolution: {integrity: sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==}
+ engines: {node: '>= 0.8'}
+ dependencies:
+ ee-first: 1.1.1
+ dev: true
+
+ /once@1.4.0:
+ resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==}
+ dependencies:
+ wrappy: 1.0.2
+ dev: true
+
+ /one-time@1.0.0:
+ resolution: {integrity: sha512-5DXOiRKwuSEcQ/l0kGCF6Q3jcADFv5tSmRaJck/OqkVFcOzutB134KRSfF0xDrL39MNnqxbHBbUUcjZIhTgb2g==}
+ dependencies:
+ fn.name: 1.1.0
+ dev: true
+
+ /onetime@5.1.2:
+ resolution: {integrity: sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==}
+ engines: {node: '>=6'}
+ dependencies:
+ mimic-fn: 2.1.0
+ dev: true
+
+ /optionator@0.9.4:
+ resolution: {integrity: sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==}
+ engines: {node: '>= 0.8.0'}
+ dependencies:
+ deep-is: 0.1.4
+ fast-levenshtein: 2.0.6
+ levn: 0.4.1
+ prelude-ls: 1.2.1
+ type-check: 0.4.0
+ word-wrap: 1.2.5
+ dev: true
+
+ /os-locale@1.4.0:
+ resolution: {integrity: sha512-PRT7ZORmwu2MEFt4/fv3Q+mEfN4zetKxufQrkShY2oGvUms9r8otu5HfdyIFHkYXjO7laNsoVGmM2MANfuTA8g==}
+ engines: {node: '>=0.10.0'}
+ dependencies:
+ lcid: 1.0.0
+ dev: true
+
+ /os-tmpdir@1.0.2:
+ resolution: {integrity: sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g==}
+ engines: {node: '>=0.10.0'}
+ dev: true
+
+ /own-keys@1.0.1:
+ resolution: {integrity: sha512-qFOyK5PjiWZd+QQIh+1jhdb9LpxTF0qs7Pm8o5QHYZ0M3vKqSqzsZaEB6oWlxZ+q2sJBMI/Ktgd2N5ZwQoRHfg==}
+ engines: {node: '>= 0.4'}
+ dependencies:
+ get-intrinsic: 1.3.0
+ object-keys: 1.1.1
+ safe-push-apply: 1.0.0
+ dev: true
+
+ /p-cancelable@2.1.1:
+ resolution: {integrity: sha512-BZOr3nRQHOntUjTrH8+Lh54smKHoHyur8We1V8DSMVrl5A2malOOwuJRnKRDjSnkoeBh4at6BwEnb5I7Jl31wg==}
+ engines: {node: '>=8'}
+ dev: true
+
+ /p-cancelable@3.0.0:
+ resolution: {integrity: sha512-mlVgR3PGuzlo0MmTdk4cXqXWlwQDLnONTAg6sm62XkMJEiRxN3GL3SffkYvqwonbkJBcrI7Uvv5Zh9yjvn2iUw==}
+ engines: {node: '>=12.20'}
+ dev: true
+
+ /p-defer@1.0.0:
+ resolution: {integrity: sha512-wB3wfAxZpk2AzOfUMJNL+d36xothRSyj8EXOa4f6GMqYDN9BJaaSISbsk+wS9abmnebVw95C2Kb5t85UmpCxuw==}
+ engines: {node: '>=4'}
+ dev: true
+
+ /p-limit@2.3.0:
+ resolution: {integrity: sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==}
+ engines: {node: '>=6'}
+ dependencies:
+ p-try: 2.2.0
+ dev: true
+
+ /p-limit@3.1.0:
+ resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==}
+ engines: {node: '>=10'}
+ dependencies:
+ yocto-queue: 0.1.0
+ dev: true
+
+ /p-locate@4.1.0:
+ resolution: {integrity: sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==}
+ engines: {node: '>=8'}
+ dependencies:
+ p-limit: 2.3.0
+ dev: true
+
+ /p-locate@5.0.0:
+ resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==}
+ engines: {node: '>=10'}
+ dependencies:
+ p-limit: 3.1.0
+ dev: true
+
+ /p-map@4.0.0:
+ resolution: {integrity: sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==}
+ engines: {node: '>=10'}
+ dependencies:
+ aggregate-error: 3.1.0
+ dev: true
+
+ /p-memoize@4.0.4:
+ resolution: {integrity: sha512-ijdh0DP4Mk6J4FXlOM6vPPoCjPytcEseW8p/k5SDTSSfGV3E9bpt9Yzfifvzp6iohIieoLTkXRb32OWV0fB2Lw==}
+ engines: {node: '>=10'}
+ dependencies:
+ map-age-cleaner: 0.1.3
+ mimic-fn: 3.1.0
+ p-settle: 4.1.1
+ dev: true
+
+ /p-reflect@2.1.0:
+ resolution: {integrity: sha512-paHV8NUz8zDHu5lhr/ngGWQiW067DK/+IbJ+RfZ4k+s8y4EKyYCz8pGYWjxCg35eHztpJAt+NUgvN4L+GCbPlg==}
+ engines: {node: '>=8'}
+ dev: true
+
+ /p-settle@4.1.1:
+ resolution: {integrity: sha512-6THGh13mt3gypcNMm0ADqVNCcYa3BK6DWsuJWFCuEKP1rpY+OKGp7gaZwVmLspmic01+fsg/fN57MfvDzZ/PuQ==}
+ engines: {node: '>=10'}
+ dependencies:
+ p-limit: 2.3.0
+ p-reflect: 2.1.0
+ dev: true
+
+ /p-try@2.2.0:
+ resolution: {integrity: sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==}
+ engines: {node: '>=6'}
+ dev: true
+
+ /package-json@8.1.1:
+ resolution: {integrity: sha512-cbH9IAIJHNj9uXi196JVsRlt7cHKak6u/e6AkL/bkRelZ7rlL3X1YKxsZwa36xipOEKAsdtmaG6aAJoM1fx2zA==}
+ engines: {node: '>=14.16'}
+ dependencies:
+ got: 12.6.1
+ registry-auth-token: 5.1.0
+ registry-url: 6.0.1
+ semver: 7.7.3
+ dev: true
+
+ /pako@2.1.0:
+ resolution: {integrity: sha512-w+eufiZ1WuJYgPXbV/PO3NCMEc3xqylkKHzp8bxp1uW4qaSNQUkwmLLEc3kKsfz8lpV1F8Ht3U1Cm+9Srog2ug==}
+ dev: true
+
+ /parent-module@1.0.1:
+ resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==}
+ engines: {node: '>=6'}
+ dependencies:
+ callsites: 3.1.0
+ dev: true
+
+ /parse-headers@2.0.6:
+ resolution: {integrity: sha512-Tz11t3uKztEW5FEVZnj1ox8GKblWn+PvHY9TmJV5Mll2uHEwRdR/5Li1OlXoECjLYkApdhWy44ocONwXLiKO5A==}
+ dev: true
+
+ /parse-json@2.2.0:
+ resolution: {integrity: sha512-QR/GGaKCkhwk1ePQNYDRKYZ3mwU9ypsKhB0XyFnLQdomyEqk3e8wpW3V5Jp88zbxK4n5ST1nqo+g9juTpownhQ==}
+ engines: {node: '>=0.10.0'}
+ dependencies:
+ error-ex: 1.3.4
+ dev: true
+
+ /parse-json@5.2.0:
+ resolution: {integrity: sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==}
+ engines: {node: '>=8'}
+ dependencies:
+ '@babel/code-frame': 7.27.1
+ error-ex: 1.3.4
+ json-parse-even-better-errors: 2.3.1
+ lines-and-columns: 1.2.4
+ dev: true
+
+ /parseurl@1.3.3:
+ resolution: {integrity: sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==}
+ engines: {node: '>= 0.8'}
+ dev: true
+
+ /patch-console@1.0.0:
+ resolution: {integrity: sha512-nxl9nrnLQmh64iTzMfyylSlRozL7kAXIaxw1fVcLYdyhNkJCRUzirRZTikXGJsg+hc4fqpneTK6iU2H1Q8THSA==}
+ engines: {node: '>=10'}
+ dev: true
+
+ /path-browserify@1.0.1:
+ resolution: {integrity: sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g==}
+ dev: true
+
+ /path-exists@2.1.0:
+ resolution: {integrity: sha512-yTltuKuhtNeFJKa1PiRzfLAU5182q1y4Eb4XCJ3PBqyzEDkAZRzBrKKBct682ls9reBVHf9udYLN5Nd+K1B9BQ==}
+ engines: {node: '>=0.10.0'}
+ dependencies:
+ pinkie-promise: 2.0.1
+ dev: true
+
+ /path-exists@4.0.0:
+ resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==}
+ engines: {node: '>=8'}
+ dev: true
+
+ /path-is-absolute@1.0.1:
+ resolution: {integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==}
+ engines: {node: '>=0.10.0'}
+ dev: true
+
+ /path-key@3.1.1:
+ resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==}
+ engines: {node: '>=8'}
+ dev: true
+
+ /path-parse@1.0.7:
+ resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==}
+ dev: true
+
+ /path-to-regexp@0.1.12:
+ resolution: {integrity: sha512-RA1GjUVMnvYFxuqovrEqZoxxW5NUZqbwKtYz/Tt7nXerk0LbLblQmrsgdeOxV5SFHf0UDggjS/bSeOZwt1pmEQ==}
+ dev: true
+
+ /path-type@1.1.0:
+ resolution: {integrity: sha512-S4eENJz1pkiQn9Znv33Q+deTOKmbl+jj1Fl+qiP/vYezj+S8x+J3Uo0ISrx/QoEvIlOaDWJhPaRd1flJ9HXZqg==}
+ engines: {node: '>=0.10.0'}
+ dependencies:
+ graceful-fs: 4.2.11
+ pify: 2.3.0
+ pinkie-promise: 2.0.1
+ dev: true
+
+ /path-type@4.0.0:
+ resolution: {integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==}
+ engines: {node: '>=8'}
+ dev: true
+
+ /pathval@1.1.1:
+ resolution: {integrity: sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ==}
+ dev: true
+
+ /pbkdf2@3.1.5:
+ resolution: {integrity: sha512-Q3CG/cYvCO1ye4QKkuH7EXxs3VC/rI1/trd+qX2+PolbaKG0H+bgcZzrTt96mMyRtejk+JMCiLUn3y29W8qmFQ==}
+ engines: {node: '>= 0.10'}
+ dependencies:
+ create-hash: 1.2.0
+ create-hmac: 1.1.7
+ ripemd160: 2.0.3
+ safe-buffer: 5.2.1
+ sha.js: 2.4.12
+ to-buffer: 1.2.2
+ dev: true
+
+ /performance-now@2.1.0:
+ resolution: {integrity: sha512-7EAHlyLHI56VEIdK57uwHdHKIaAGbnXPiw0yWbarQZOKaKpvUIgW0jWRVLiatnM+XXlSwsanIBH/hzGMJulMow==}
+ dev: true
+
+ /picocolors@1.0.0:
+ resolution: {integrity: sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==}
+ dev: true
+
+ /picocolors@1.1.1:
+ resolution: {integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==}
+ dev: true
+
+ /picomatch@2.3.1:
+ resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==}
+ engines: {node: '>=8.6'}
+ dev: true
+
+ /picomatch@4.0.3:
+ resolution: {integrity: sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==}
+ engines: {node: '>=12'}
+ dev: true
+
+ /pify@2.3.0:
+ resolution: {integrity: sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==}
+ engines: {node: '>=0.10.0'}
+ dev: true
+
+ /pinkie-promise@2.0.1:
+ resolution: {integrity: sha512-0Gni6D4UcLTbv9c57DfxDGdr41XfgUjqWZu492f0cIGr16zDU06BWP/RAEvOuo7CQ0CNjHaLlM59YJJFm3NWlw==}
+ engines: {node: '>=0.10.0'}
+ dependencies:
+ pinkie: 2.0.4
+ dev: true
+
+ /pinkie@2.0.4:
+ resolution: {integrity: sha512-MnUuEycAemtSaeFSjXKW/aroV7akBbY+Sv+RkyqFjgAe73F+MR0TBWKBRDkmfWq/HiFmdavfZ1G7h4SPZXaCSg==}
+ engines: {node: '>=0.10.0'}
+ dev: true
+
+ /pino-abstract-transport@1.2.0:
+ resolution: {integrity: sha512-Guhh8EZfPCfH+PMXAb6rKOjGQEoy0xlAIn+irODG5kgfYV+BQ0rGYYWTIel3P5mmyXqkYkPmdIkywsn6QKUR1Q==}
+ dependencies:
+ readable-stream: 4.7.0
+ split2: 4.2.0
+ dev: true
+
+ /pino-std-serializers@6.2.2:
+ resolution: {integrity: sha512-cHjPPsE+vhj/tnhCy/wiMh3M3z3h/j15zHQX+S9GkTBgqJuTuJzYJ4gUyACLhDaJ7kk9ba9iRDmbH2tJU03OiA==}
+ dev: true
+
+ /pino@8.21.0:
+ resolution: {integrity: sha512-ip4qdzjkAyDDZklUaZkcRFb2iA118H9SgRh8yzTkSQK8HilsOJF7rSY8HoW5+I0M46AZgX/pxbprf2vvzQCE0Q==}
+ hasBin: true
+ dependencies:
+ atomic-sleep: 1.0.0
+ fast-redact: 3.5.0
+ on-exit-leak-free: 2.1.2
+ pino-abstract-transport: 1.2.0
+ pino-std-serializers: 6.2.2
+ process-warning: 3.0.0
+ quick-format-unescaped: 4.0.4
+ real-require: 0.2.0
+ safe-stable-stringify: 2.5.0
+ sonic-boom: 3.8.1
+ thread-stream: 2.7.0
+ dev: true
+
+ /pirates@4.0.7:
+ resolution: {integrity: sha512-TfySrs/5nm8fQJDcBDuUng3VOUKsd7S+zqvbOTiGXHfxX4wK31ard+hoNuvkicM/2YFzlpDgABOevKSsB4G/FA==}
+ engines: {node: '>= 6'}
+ dev: true
+
+ /pkg-dir@4.2.0:
+ resolution: {integrity: sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==}
+ engines: {node: '>=8'}
+ dependencies:
+ find-up: 4.1.0
+ dev: true
+
+ /pluralize@8.0.0:
+ resolution: {integrity: sha512-Nc3IT5yHzflTfbjgqWcCPpo7DaKy4FnpB0l/zCAW0Tc7jxAiuqSxHasntB3D7887LSrA93kDJ9IXovxJYxyLCA==}
+ engines: {node: '>=4'}
+ dev: true
+
+ /poseidon-lite@0.2.1:
+ resolution: {integrity: sha512-xIr+G6HeYfOhCuswdqcFpSX47SPhm0EpisWJ6h7fHlWwaVIvH3dLnejpatrtw6Xc6HaLrpq05y7VRfvDmDGIog==}
+ dev: true
+
+ /possible-typed-array-names@1.1.0:
+ resolution: {integrity: sha512-/+5VFTchJDoVj3bhoqi6UeymcD00DAwb1nJwamzPvHEszJ4FpF6SNNbUbOS8yI56qHzdV8eK0qEfOSiodkTdxg==}
+ engines: {node: '>= 0.4'}
+ dev: true
+
+ /prelude-ls@1.2.1:
+ resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==}
+ engines: {node: '>= 0.8.0'}
+ dev: true
+
+ /prettier-linter-helpers@1.0.0:
+ resolution: {integrity: sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w==}
+ engines: {node: '>=6.0.0'}
+ dependencies:
+ fast-diff: 1.3.0
+ dev: true
+
+ /prettier-plugin-packagejson@2.5.19(prettier@3.6.2):
+ resolution: {integrity: sha512-Qsqp4+jsZbKMpEGZB1UP1pxeAT8sCzne2IwnKkr+QhUe665EXUo3BAvTf1kAPCqyMv9kg3ZmO0+7eOni/C6Uag==}
+ peerDependencies:
+ prettier: '>= 1.16.0'
+ peerDependenciesMeta:
+ prettier:
+ optional: true
+ dependencies:
+ prettier: 3.6.2
+ sort-package-json: 3.4.0
+ synckit: 0.11.11
+ dev: true
+
+ /prettier-plugin-solidity@1.4.3(prettier@3.6.2):
+ resolution: {integrity: sha512-Mrr/iiR9f9IaeGRMZY2ApumXcn/C5Gs3S7B7hWB3gigBFML06C0yEyW86oLp0eqiA0qg+46FaChgLPJCj/pIlg==}
+ engines: {node: '>=18'}
+ peerDependencies:
+ prettier: '>=2.3.0'
+ dependencies:
+ '@solidity-parser/parser': 0.20.2
+ prettier: 3.6.2
+ semver: 7.7.3
+ dev: true
+
+ /prettier@2.8.8:
+ resolution: {integrity: sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q==}
+ engines: {node: '>=10.13.0'}
+ hasBin: true
+ dev: true
+
+ /prettier@3.6.2:
+ resolution: {integrity: sha512-I7AIg5boAr5R0FFtJ6rCfD+LFsWHp81dolrFD8S79U9tb8Az2nGrJncnMSnys+bpQJfRUzqs9hnA81OAA3hCuQ==}
+ engines: {node: '>=14'}
+ hasBin: true
+ dev: true
+
+ /pretty-format@29.7.0:
+ resolution: {integrity: sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==}
+ engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
+ dependencies:
+ '@jest/schemas': 29.6.3
+ ansi-styles: 5.2.0
+ react-is: 18.3.1
+ dev: true
+
+ /process-nextick-args@2.0.1:
+ resolution: {integrity: sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==}
+ dev: true
+
+ /process-warning@3.0.0:
+ resolution: {integrity: sha512-mqn0kFRl0EoqhnL0GQ0veqFHyIN1yig9RHh/InzORTUiZHFRAur+aMtRkELNwGs9aNwKS6tg/An4NYBPGwvtzQ==}
+ dev: true
+
+ /process@0.11.10:
+ resolution: {integrity: sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==}
+ engines: {node: '>= 0.6.0'}
+ dev: true
+
+ /prompts@2.4.2:
+ resolution: {integrity: sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==}
+ engines: {node: '>= 6'}
+ dependencies:
+ kleur: 3.0.3
+ sisteransi: 1.0.5
+ dev: true
+
+ /prop-types@15.8.1:
+ resolution: {integrity: sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==}
+ dependencies:
+ loose-envify: 1.4.0
+ object-assign: 4.1.1
+ react-is: 16.13.1
+ dev: true
+
+ /proto-list@1.2.4:
+ resolution: {integrity: sha512-vtK/94akxsTMhe0/cbfpR+syPuszcuwhqVjJq26CuNDgFGj682oRBXOP5MJpv2r7JtE8MsiepGIqvvOTBwn2vA==}
+ dev: true
+
+ /protobufjs@7.5.4:
+ resolution: {integrity: sha512-CvexbZtbov6jW2eXAvLukXjXUW1TzFaivC46BpWc/3BpcCysb5Vffu+B3XHMm8lVEuy2Mm4XGex8hBSg1yapPg==}
+ engines: {node: '>=12.0.0'}
+ requiresBuild: true
+ dependencies:
+ '@protobufjs/aspromise': 1.1.2
+ '@protobufjs/base64': 1.1.2
+ '@protobufjs/codegen': 2.0.4
+ '@protobufjs/eventemitter': 1.1.0
+ '@protobufjs/fetch': 1.1.0
+ '@protobufjs/float': 1.0.2
+ '@protobufjs/inquire': 1.1.0
+ '@protobufjs/path': 1.1.2
+ '@protobufjs/pool': 1.1.0
+ '@protobufjs/utf8': 1.1.0
+ '@types/node': 18.18.14
+ long: 5.3.2
+ dev: true
+
+ /proxy-addr@2.0.7:
+ resolution: {integrity: sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==}
+ engines: {node: '>= 0.10'}
+ dependencies:
+ forwarded: 0.2.0
+ ipaddr.js: 1.9.1
+ dev: true
+
+ /proxy-from-env@1.1.0:
+ resolution: {integrity: sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==}
+ dev: true
+
+ /prr@1.0.1:
+ resolution: {integrity: sha512-yPw4Sng1gWghHQWj0B3ZggWUm4qVbPwPFcRG8KyxiU7J2OHFSoEHKS+EZ3fv5l1t9CyCiop6l/ZYeWbrgoQejw==}
+ dev: true
+
+ /psl@1.15.0:
+ resolution: {integrity: sha512-JZd3gMVBAVQkSs6HdNZo9Sdo0LNcQeMNP3CozBJb3JYC/QUYZTnKxP+f8oWRX4rHP5EurWxqAHTSwUCjlNKa1w==}
+ dependencies:
+ punycode: 2.3.1
+ dev: true
+
+ /pump@3.0.3:
+ resolution: {integrity: sha512-todwxLMY7/heScKmntwQG8CXVkWUOdYxIvY2s0VWAAMh/nd8SoYiRaKjlr7+iCs984f2P8zvrfWcDDYVb73NfA==}
+ dependencies:
+ end-of-stream: 1.4.5
+ once: 1.4.0
+ dev: true
+
+ /punycode@1.4.1:
+ resolution: {integrity: sha512-jmYNElW7yvO7TV33CjSmvSiE2yco3bV2czu/OzDKdMNVZQWfxCblURLhf+47syQRBntjfLdd/H0egrzIG+oaFQ==}
+ dev: true
+
+ /punycode@2.1.0:
+ resolution: {integrity: sha512-Yxz2kRwT90aPiWEMHVYnEf4+rhwF1tBmmZ4KepCP+Wkium9JxtWnUm1nqGwpiAHr/tnTSeHqr3wb++jgSkXjhA==}
+ engines: {node: '>=6'}
+ dev: true
+
+ /punycode@2.3.1:
+ resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==}
+ engines: {node: '>=6'}
+ dev: true
+
+ /pure-rand@6.1.0:
+ resolution: {integrity: sha512-bVWawvoZoBYpp6yIoQtQXHZjmz35RSVHnUOTefl8Vcjr8snTPY1wnpSPMWekcFwbxI6gtmT7rSYPFvz71ldiOA==}
+ dev: true
+
+ /qs@6.13.0:
+ resolution: {integrity: sha512-+38qI9SOr8tfZ4QmJNplMUxqjbe7LKvvZgWdExBOmd+egZTtjLB67Gu0HRX3u/XOq7UU2Nx6nsjvS16Z9uwfpg==}
+ engines: {node: '>=0.6'}
+ dependencies:
+ side-channel: 1.1.0
+ dev: true
+
+ /qs@6.14.0:
+ resolution: {integrity: sha512-YWWTjgABSKcvs/nWBi9PycY/JiPJqOD4JA6o9Sej2AtvSGarXxKC3OQSk4pAarbdQlKAh5D4FCQkJNkW+GAn3w==}
+ engines: {node: '>=0.6'}
+ dependencies:
+ side-channel: 1.1.0
+ dev: true
+
+ /qs@6.5.3:
+ resolution: {integrity: sha512-qxXIEh4pCGfHICj1mAJQ2/2XVZkjCDTcEgfoSQxc/fYivUZxTkk7L3bDBJSoNrEzXI17oUO5Dp07ktqE5KzczA==}
+ engines: {node: '>=0.6'}
+ dev: true
+
+ /query-string@5.1.1:
+ resolution: {integrity: sha512-gjWOsm2SoGlgLEdAGt7a6slVOk9mGiXmPFMqrEhLQ68rhQuBnpfs3+EmlvqKyxnCo9/PPlF+9MtY02S1aFg+Jw==}
+ engines: {node: '>=0.10.0'}
+ dependencies:
+ decode-uri-component: 0.2.2
+ object-assign: 4.1.1
+ strict-uri-encode: 1.1.0
+ dev: true
+
+ /querystring-es3@0.2.1:
+ resolution: {integrity: sha512-773xhDQnZBMFobEiztv8LIl70ch5MSF/jUQVlhwFyBILqq96anmoctVIYz+ZRp0qbCKATTn6ev02M3r7Ga5vqA==}
+ engines: {node: '>=0.4.x'}
+ dev: true
+
+ /queue-microtask@1.2.3:
+ resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==}
+ dev: true
+
+ /quick-format-unescaped@4.0.4:
+ resolution: {integrity: sha512-tYC1Q1hgyRuHgloV/YXs2w15unPVh8qfu/qCTfhTYamaw7fyhumKa2yGpdSo87vY32rIclj+4fWYQXUMs9EHvg==}
+ dev: true
+
+ /quick-lru@5.1.1:
+ resolution: {integrity: sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==}
+ engines: {node: '>=10'}
+ dev: true
+
+ /randombytes@2.1.0:
+ resolution: {integrity: sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==}
+ dependencies:
+ safe-buffer: 5.2.1
+ dev: true
+
+ /range-parser@1.2.1:
+ resolution: {integrity: sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==}
+ engines: {node: '>= 0.6'}
+ dev: true
+
+ /raw-body@2.5.2:
+ resolution: {integrity: sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==}
+ engines: {node: '>= 0.8'}
+ dependencies:
+ bytes: 3.1.2
+ http-errors: 2.0.0
+ iconv-lite: 0.4.24
+ unpipe: 1.0.0
+ dev: true
+
+ /rc@1.2.8:
+ resolution: {integrity: sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==}
+ hasBin: true
+ dependencies:
+ deep-extend: 0.6.0
+ ini: 1.3.8
+ minimist: 1.2.8
+ strip-json-comments: 2.0.1
+ dev: true
+
+ /react-devtools-core@4.28.5:
+ resolution: {integrity: sha512-cq/o30z9W2Wb4rzBefjv5fBalHU0rJGZCHAkf/RHSBWSSYwh8PlQTqqOJmgIIbBtpj27T6FIPXeomIjZtCNVqA==}
+ dependencies:
+ shell-quote: 1.8.3
+ ws: 7.5.10
+ transitivePeerDependencies:
+ - bufferutil
+ - utf-8-validate
+ dev: true
+
+ /react-is@16.13.1:
+ resolution: {integrity: sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==}
+ dev: true
+
+ /react-is@18.3.1:
+ resolution: {integrity: sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==}
+ dev: true
+
+ /react-reconciler@0.26.2(react@17.0.2):
+ resolution: {integrity: sha512-nK6kgY28HwrMNwDnMui3dvm3rCFjZrcGiuwLc5COUipBK5hWHLOxMJhSnSomirqWwjPBJKV1QcbkI0VJr7Gl1Q==}
+ engines: {node: '>=0.10.0'}
+ peerDependencies:
+ react: ^17.0.2
+ dependencies:
+ loose-envify: 1.4.0
+ object-assign: 4.1.1
+ react: 17.0.2
+ scheduler: 0.20.2
+ dev: true
+
+ /react@17.0.2:
+ resolution: {integrity: sha512-gnhPt75i/dq/z3/6q/0asP78D0u592D5L1pd7M8P+dck6Fu/jJeL6iVVK23fptSUZj8Vjf++7wXA8UNclGQcbA==}
+ engines: {node: '>=0.10.0'}
+ dependencies:
+ loose-envify: 1.4.0
+ object-assign: 4.1.1
+ dev: true
+
+ /read-pkg-up@1.0.1:
+ resolution: {integrity: sha512-WD9MTlNtI55IwYUS27iHh9tK3YoIVhxis8yKhLpTqWtml739uXc9NWTpxoHkfZf3+DkCCsXox94/VWZniuZm6A==}
+ engines: {node: '>=0.10.0'}
+ dependencies:
+ find-up: 1.1.2
+ read-pkg: 1.1.0
+ dev: true
+
+ /read-pkg@1.1.0:
+ resolution: {integrity: sha512-7BGwRHqt4s/uVbuyoeejRn4YmFnYZiFl4AuaeXHlgZf3sONF0SOGlxs2Pw8g6hCKupo08RafIO5YXFNOKTfwsQ==}
+ engines: {node: '>=0.10.0'}
+ dependencies:
+ load-json-file: 1.1.0
+ normalize-package-data: 2.5.0
+ path-type: 1.1.0
+ dev: true
+
+ /readable-stream@2.3.8:
+ resolution: {integrity: sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==}
+ dependencies:
+ core-util-is: 1.0.3
+ inherits: 2.0.4
+ isarray: 1.0.0
+ process-nextick-args: 2.0.1
+ safe-buffer: 5.1.2
+ string_decoder: 1.1.1
+ util-deprecate: 1.0.2
+ dev: true
+
+ /readable-stream@3.6.2:
+ resolution: {integrity: sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==}
+ engines: {node: '>= 6'}
+ dependencies:
+ inherits: 2.0.4
+ string_decoder: 1.3.0
+ util-deprecate: 1.0.2
+ dev: true
+
+ /readable-stream@4.7.0:
+ resolution: {integrity: sha512-oIGGmcpTLwPga8Bn6/Z75SVaH1z5dUut2ibSyAMVhmUggWpmDn2dapB0n7f8nwaSiRtepAsfJyfXIO5DCVAODg==}
+ engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
+ dependencies:
+ abort-controller: 3.0.0
+ buffer: 6.0.3
+ events: 3.3.0
+ process: 0.11.10
+ string_decoder: 1.3.0
+ dev: true
+
+ /readdirp@3.6.0:
+ resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==}
+ engines: {node: '>=8.10.0'}
+ dependencies:
+ picomatch: 2.3.1
+ dev: true
+
+ /readdirp@4.1.2:
+ resolution: {integrity: sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg==}
+ engines: {node: '>= 14.18.0'}
+ dev: true
+
+ /real-require@0.2.0:
+ resolution: {integrity: sha512-57frrGM/OCTLqLOAh0mhVA9VBMHd+9U7Zb2THMGdBUoZVOtGbJzjxsYGDJ3A9AYYCP4hn6y1TVbaOfzWtm5GFg==}
+ engines: {node: '>= 12.13.0'}
+ dev: true
+
+ /reduce-flatten@2.0.0:
+ resolution: {integrity: sha512-EJ4UNY/U1t2P/2k6oqotuX2Cc3T6nxJwsM0N0asT7dhrtH1ltUxDn4NalSYmPE2rCkVpcf/X6R0wDwcFpzhd4w==}
+ engines: {node: '>=6'}
+ dev: true
+
+ /reflect.getprototypeof@1.0.10:
+ resolution: {integrity: sha512-00o4I+DVrefhv+nX0ulyi3biSHCPDe+yLv5o/p6d/UVlirijB8E16FtfwSAi4g3tcqrQ4lRAqQSoFEZJehYEcw==}
+ engines: {node: '>= 0.4'}
+ dependencies:
+ call-bind: 1.0.8
+ define-properties: 1.2.1
+ es-abstract: 1.24.0
+ es-errors: 1.3.0
+ es-object-atoms: 1.1.1
+ get-intrinsic: 1.3.0
+ get-proto: 1.0.1
+ which-builtin-type: 1.2.1
+ dev: true
+
+ /regexp.prototype.flags@1.5.4:
+ resolution: {integrity: sha512-dYqgNSZbDwkaJ2ceRd9ojCGjBq+mOm9LmtXnAnEGyHhN/5R7iDW2TRw3h+o/jCFxus3P2LfWIIiwowAjANm7IA==}
+ engines: {node: '>= 0.4'}
+ dependencies:
+ call-bind: 1.0.8
+ define-properties: 1.2.1
+ es-errors: 1.3.0
+ get-proto: 1.0.1
+ gopd: 1.2.0
+ set-function-name: 2.0.2
+ dev: true
+
+ /registry-auth-token@5.1.0:
+ resolution: {integrity: sha512-GdekYuwLXLxMuFTwAPg5UKGLW/UXzQrZvH/Zj791BQif5T05T0RsaLfHc9q3ZOKi7n+BoprPD9mJ0O0k4xzUlw==}
+ engines: {node: '>=14'}
+ dependencies:
+ '@pnpm/npm-conf': 2.3.1
+ dev: true
+
+ /registry-url@6.0.1:
+ resolution: {integrity: sha512-+crtS5QjFRqFCoQmvGduwYWEBng99ZvmFvF+cUJkGYF1L1BfU8C6Zp9T7f5vPAwyLkUExpvK+ANVZmGU49qi4Q==}
+ engines: {node: '>=12'}
+ dependencies:
+ rc: 1.2.8
+ dev: true
+
+ /request@2.88.2:
+ resolution: {integrity: sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw==}
+ engines: {node: '>= 6'}
+ deprecated: request has been deprecated, see https://github.com/request/request/issues/3142
+ dependencies:
+ aws-sign2: 0.7.0
+ aws4: 1.13.2
+ caseless: 0.12.0
+ combined-stream: 1.0.8
+ extend: 3.0.2
+ forever-agent: 0.6.1
+ form-data: 2.3.3
+ har-validator: 5.1.5
+ http-signature: 1.2.0
+ is-typedarray: 1.0.0
+ isstream: 0.1.2
+ json-stringify-safe: 5.0.1
+ mime-types: 2.1.35
+ oauth-sign: 0.9.0
+ performance-now: 2.1.0
+ qs: 6.5.3
+ safe-buffer: 5.2.1
+ tough-cookie: 2.5.0
+ tunnel-agent: 0.6.0
+ uuid: 3.4.0
+ dev: true
+
+ /require-directory@2.1.1:
+ resolution: {integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==}
+ engines: {node: '>=0.10.0'}
+ dev: true
+
+ /require-from-string@1.2.1:
+ resolution: {integrity: sha512-H7AkJWMobeskkttHyhTVtS0fxpFLjxhbfMa6Bk3wimP7sdPRGL3EyCg3sAQenFfAe+xQ+oAc85Nmtvq0ROM83Q==}
+ engines: {node: '>=0.10.0'}
+ dev: true
+
+ /require-from-string@2.0.2:
+ resolution: {integrity: sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==}
+ engines: {node: '>=0.10.0'}
+ dev: true
+
+ /require-main-filename@1.0.1:
+ resolution: {integrity: sha512-IqSUtOVP4ksd1C/ej5zeEh/BIP2ajqpn8c5x+q99gvcIG/Qf0cud5raVnE/Dwd0ua9TXYDoDc0RE5hBSdz22Ug==}
+ dev: true
+
+ /resolve-alpn@1.2.1:
+ resolution: {integrity: sha512-0a1F4l73/ZFZOakJnQ3FvkJ2+gSTQWz/r2KE5OdDY0TxPm5h4GkqkWWfM47T7HsbnOtcJVEF4epCVy6u7Q3K+g==}
+ dev: true
+
+ /resolve-cwd@3.0.0:
+ resolution: {integrity: sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==}
+ engines: {node: '>=8'}
+ dependencies:
+ resolve-from: 5.0.0
+ dev: true
+
+ /resolve-from@4.0.0:
+ resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==}
+ engines: {node: '>=4'}
+ dev: true
+
+ /resolve-from@5.0.0:
+ resolution: {integrity: sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==}
+ engines: {node: '>=8'}
+ dev: true
+
+ /resolve-pkg-maps@1.0.0:
+ resolution: {integrity: sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==}
+ dev: true
+
+ /resolve.exports@2.0.3:
+ resolution: {integrity: sha512-OcXjMsGdhL4XnbShKpAcSqPMzQoYkYyhbEaeSko47MjRP9NfEQMhZkXL1DoFlt9LWQn4YttrdnV6X2OiyzBi+A==}
+ engines: {node: '>=10'}
+ dev: true
+
+ /resolve@1.17.0:
+ resolution: {integrity: sha512-ic+7JYiV8Vi2yzQGFWOkiZD5Z9z7O2Zhm9XMaTxdJExKasieFCr+yXZ/WmXsckHiKl12ar0y6XiXDx3m4RHn1w==}
+ dependencies:
+ path-parse: 1.0.7
+ dev: true
+
+ /resolve@1.22.11:
+ resolution: {integrity: sha512-RfqAvLnMl313r7c9oclB1HhUEAezcpLjz95wFH4LVuhk9JF/r22qmVP9AMmOU4vMX7Q8pN8jwNg/CSpdFnMjTQ==}
+ engines: {node: '>= 0.4'}
+ hasBin: true
+ dependencies:
+ is-core-module: 2.16.1
+ path-parse: 1.0.7
+ supports-preserve-symlinks-flag: 1.0.0
+ dev: true
+
+ /responselike@2.0.1:
+ resolution: {integrity: sha512-4gl03wn3hj1HP3yzgdI7d3lCkF95F21Pz4BPGvKHinyQzALR5CapwC8yIi0Rh58DEMQ/SguC03wFj2k0M/mHhw==}
+ dependencies:
+ lowercase-keys: 2.0.0
+ dev: true
+
+ /responselike@3.0.0:
+ resolution: {integrity: sha512-40yHxbNcl2+rzXvZuVkrYohathsSJlMTXKryG5y8uciHv1+xDLHQpgjG64JUO9nrEq2jGLH6IZ8BcZyw3wrweg==}
+ engines: {node: '>=14.16'}
+ dependencies:
+ lowercase-keys: 3.0.0
+ dev: true
+
+ /restore-cursor@3.1.0:
+ resolution: {integrity: sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==}
+ engines: {node: '>=8'}
+ dependencies:
+ onetime: 5.1.2
+ signal-exit: 3.0.7
+ dev: true
+
+ /reusify@1.1.0:
+ resolution: {integrity: sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==}
+ engines: {iojs: '>=1.0.0', node: '>=0.10.0'}
+ dev: true
+
+ /rimraf@2.7.1:
+ resolution: {integrity: sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==}
+ deprecated: Rimraf versions prior to v4 are no longer supported
+ hasBin: true
+ dependencies:
+ glob: 7.2.3
+ dev: true
+
+ /rimraf@3.0.2:
+ resolution: {integrity: sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==}
+ deprecated: Rimraf versions prior to v4 are no longer supported
+ hasBin: true
+ dependencies:
+ glob: 7.2.3
+ dev: true
+
+ /ripemd160@2.0.3:
+ resolution: {integrity: sha512-5Di9UC0+8h1L6ZD2d7awM7E/T4uA1fJRlx6zk/NvdCCVEoAnFqvHmCuNeIKoCeIixBX/q8uM+6ycDvF8woqosA==}
+ engines: {node: '>= 0.8'}
+ dependencies:
+ hash-base: 3.1.2
+ inherits: 2.0.4
+ dev: true
+
+ /rlp@2.2.6:
+ resolution: {integrity: sha512-HAfAmL6SDYNWPUOJNrM500x4Thn4PZsEy5pijPh40U9WfNk0z15hUYzO9xVIMAdIHdFtD8CBDHd75Td1g36Mjg==}
+ hasBin: true
+ dependencies:
+ bn.js: 4.12.2
+ dev: true
+
+ /rlp@2.2.7:
+ resolution: {integrity: sha512-d5gdPmgQ0Z+AklL2NVXr/IoSjNZFfTVvQWzL/AM2AOcSzYP2xjlb0AC8YyCLc41MSNf6P6QVtjgPdmVtzb+4lQ==}
+ hasBin: true
+ dependencies:
+ bn.js: 5.2.2
+ dev: true
+
+ /rpc-websockets@9.2.0:
+ resolution: {integrity: sha512-DS/XHdPxplQTtNRKiBCRWGBJfjOk56W7fyFUpiYi9fSTWTzoEMbUkn3J4gB0IMniIEVeAGR1/rzFQogzD5MxvQ==}
+ dependencies:
+ '@swc/helpers': 0.5.17
+ '@types/uuid': 8.3.4
+ '@types/ws': 8.18.1
+ buffer: 6.0.3
+ eventemitter3: 5.0.1
+ uuid: 8.3.2
+ ws: 8.18.3(bufferutil@4.0.9)(utf-8-validate@5.0.10)
+ optionalDependencies:
+ bufferutil: 4.0.9
+ utf-8-validate: 5.0.10
+ dev: true
+
+ /run-parallel@1.2.0:
+ resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==}
+ dependencies:
+ queue-microtask: 1.2.3
+ dev: true
+
+ /rustbn.js@0.2.0:
+ resolution: {integrity: sha512-4VlvkRUuCJvr2J6Y0ImW7NvTCriMi7ErOAqWk1y69vAdoNIzCF3yPmgeNzx+RQTLEDFq5sHfscn1MwHxP9hNfA==}
+ dev: true
+
+ /rxjs@7.8.2:
+ resolution: {integrity: sha512-dhKf903U/PQZY6boNNtAGdWbG85WAbjT/1xYoZIC7FAY0yWapOBQVsVrDl58W86//e1VpMNBtRV4MaXfdMySFA==}
+ dependencies:
+ tslib: 2.8.1
+ dev: true
+
+ /safe-array-concat@1.1.3:
+ resolution: {integrity: sha512-AURm5f0jYEOydBj7VQlVvDrjeFgthDdEF5H1dP+6mNpoXOMo1quQqJ4wvJDyRZ9+pO3kGWoOdmV08cSv2aJV6Q==}
+ engines: {node: '>=0.4'}
+ dependencies:
+ call-bind: 1.0.8
+ call-bound: 1.0.4
+ get-intrinsic: 1.3.0
+ has-symbols: 1.1.0
+ isarray: 2.0.5
+ dev: true
+
+ /safe-buffer@5.1.2:
+ resolution: {integrity: sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==}
+ dev: true
+
+ /safe-buffer@5.2.1:
+ resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==}
+ dev: true
+
+ /safe-push-apply@1.0.0:
+ resolution: {integrity: sha512-iKE9w/Z7xCzUMIZqdBsp6pEQvwuEebH4vdpjcDWnyzaI6yl6O9FHvVpmGelvEHNsoY6wGblkxR6Zty/h00WiSA==}
+ engines: {node: '>= 0.4'}
+ dependencies:
+ es-errors: 1.3.0
+ isarray: 2.0.5
+ dev: true
+
+ /safe-regex-test@1.1.0:
+ resolution: {integrity: sha512-x/+Cz4YrimQxQccJf5mKEbIa1NzeCRNI5Ecl/ekmlYaampdNLPalVyIcCZNNH3MvmqBugV5TMYZXv0ljslUlaw==}
+ engines: {node: '>= 0.4'}
+ dependencies:
+ call-bound: 1.0.4
+ es-errors: 1.3.0
+ is-regex: 1.2.1
+ dev: true
+
+ /safe-stable-stringify@2.5.0:
+ resolution: {integrity: sha512-b3rppTKm9T+PsVCBEOUR46GWI7fdOs00VKZ1+9c1EWDaDMvjQc6tUwuFyIprgGgTcWoVHSKrU8H31ZHA2e0RHA==}
+ engines: {node: '>=10'}
+ dev: true
+
+ /safer-buffer@2.1.2:
+ resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==}
+ dev: true
+
+ /scheduler@0.20.2:
+ resolution: {integrity: sha512-2eWfGgAqqWFGqtdMmcL5zCMK1U8KlXv8SQFGglL3CEtd0aDVDWgeF/YoCmvln55m5zSk3J/20hTaSBeSObsQDQ==}
+ dependencies:
+ loose-envify: 1.4.0
+ object-assign: 4.1.1
+ dev: true
+
+ /scrypt-js@3.0.1:
+ resolution: {integrity: sha512-cdwTTnqPu0Hyvf5in5asVdZocVDTNRmR7XEcJuIzMjJeSHybHl7vpB66AzwTaIg6CLSbtjcxc8fqcySfnTkccA==}
+ dev: true
+
+ /secp256k1@4.0.4:
+ resolution: {integrity: sha512-6JfvwvjUOn8F/jUoBY2Q1v5WY5XS+rj8qSe0v8Y4ezH4InLgTEeOOPQsRll9OV429Pvo6BCHGavIyJfr3TAhsw==}
+ engines: {node: '>=18.0.0'}
+ requiresBuild: true
+ dependencies:
+ elliptic: 6.6.1
+ node-addon-api: 5.1.0
+ node-gyp-build: 4.8.4
+ dev: true
+
+ /secp256k1@5.0.1:
+ resolution: {integrity: sha512-lDFs9AAIaWP9UCdtWrotXWWF9t8PWgQDcxqgAnpM9rMqxb3Oaq2J0thzPVSxBwdJgyQtkU/sYtFtbM1RSt/iYA==}
+ engines: {node: '>=18.0.0'}
+ requiresBuild: true
+ dependencies:
+ elliptic: 6.6.1
+ node-addon-api: 5.1.0
+ node-gyp-build: 4.8.4
+ dev: true
+
+ /seedrandom@3.0.5:
+ resolution: {integrity: sha512-8OwmbklUNzwezjGInmZ+2clQmExQPvomqjL7LFqOYqtmuxRgQYqOD3mHaU+MvZn5FLUeVxVfQjwLZW/n/JFuqg==}
+ dev: true
+
+ /semaphore-async-await@1.5.1:
+ resolution: {integrity: sha512-b/ptP11hETwYWpeilHXXQiV5UJNJl7ZWWooKRE5eBIYWoom6dZ0SluCIdCtKycsMtZgKWE01/qAw6jblw1YVhg==}
+ engines: {node: '>=4.1'}
+ dev: true
+
+ /semver@5.7.2:
+ resolution: {integrity: sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==}
+ hasBin: true
+ dev: true
+
+ /semver@6.3.1:
+ resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==}
+ hasBin: true
+ dev: true
+
+ /semver@7.7.3:
+ resolution: {integrity: sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==}
+ engines: {node: '>=10'}
+ hasBin: true
+ dev: true
+
+ /send@0.19.0:
+ resolution: {integrity: sha512-dW41u5VfLXu8SJh5bwRmyYUbAoSB3c9uQh6L8h/KtsFREPWpbX1lrljJo186Jc4nmci/sGUZ9a0a0J2zgfq2hw==}
+ engines: {node: '>= 0.8.0'}
+ dependencies:
+ debug: 2.6.9
+ depd: 2.0.0
+ destroy: 1.2.0
+ encodeurl: 1.0.2
+ escape-html: 1.0.3
+ etag: 1.8.1
+ fresh: 0.5.2
+ http-errors: 2.0.0
+ mime: 1.6.0
+ ms: 2.1.3
+ on-finished: 2.4.1
+ range-parser: 1.2.1
+ statuses: 2.0.1
+ transitivePeerDependencies:
+ - supports-color
+ dev: true
+
+ /serialize-javascript@6.0.2:
+ resolution: {integrity: sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g==}
+ dependencies:
+ randombytes: 2.1.0
+ dev: true
+
+ /serve-static@1.16.2:
+ resolution: {integrity: sha512-VqpjJZKadQB/PEbEwvFdO43Ax5dFBZ2UECszz8bQ7pi7wt//PWe1P6MN7eCnjsatYtBT6EuiClbjSWP2WrIoTw==}
+ engines: {node: '>= 0.8.0'}
+ dependencies:
+ encodeurl: 2.0.0
+ escape-html: 1.0.3
+ parseurl: 1.3.3
+ send: 0.19.0
+ transitivePeerDependencies:
+ - supports-color
+ dev: true
+
+ /servify@0.1.12:
+ resolution: {integrity: sha512-/xE6GvsKKqyo1BAY+KxOWXcLpPsUUyji7Qg3bVD7hh1eRze5bR1uYiuDA/k3Gof1s9BTzQZEJK8sNcNGFIzeWw==}
+ engines: {node: '>=6'}
+ dependencies:
+ body-parser: 1.20.3
+ cors: 2.8.5
+ express: 4.21.2
+ request: 2.88.2
+ xhr: 2.6.0
+ transitivePeerDependencies:
+ - supports-color
+ dev: true
+
+ /set-blocking@2.0.0:
+ resolution: {integrity: sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==}
+ dev: true
+
+ /set-function-length@1.2.2:
+ resolution: {integrity: sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==}
+ engines: {node: '>= 0.4'}
+ dependencies:
+ define-data-property: 1.1.4
+ es-errors: 1.3.0
+ function-bind: 1.1.2
+ get-intrinsic: 1.3.0
+ gopd: 1.2.0
+ has-property-descriptors: 1.0.2
+ dev: true
+
+ /set-function-name@2.0.2:
+ resolution: {integrity: sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ==}
+ engines: {node: '>= 0.4'}
+ dependencies:
+ define-data-property: 1.1.4
+ es-errors: 1.3.0
+ functions-have-names: 1.2.3
+ has-property-descriptors: 1.0.2
+ dev: true
+
+ /set-proto@1.0.0:
+ resolution: {integrity: sha512-RJRdvCo6IAnPdsvP/7m6bsQqNnn1FCBX5ZNtFL98MmFF/4xAIJTIg1YbHW5DC2W5SKZanrC6i4HsJqlajw/dZw==}
+ engines: {node: '>= 0.4'}
+ dependencies:
+ dunder-proto: 1.0.1
+ es-errors: 1.3.0
+ es-object-atoms: 1.1.1
+ dev: true
+
+ /setimmediate@1.0.5:
+ resolution: {integrity: sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA==}
+ dev: true
+
+ /setprototypeof@1.2.0:
+ resolution: {integrity: sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==}
+ dev: true
+
+ /sha.js@2.4.12:
+ resolution: {integrity: sha512-8LzC5+bvI45BjpfXU8V5fdU2mfeKiQe1D1gIMn7XUlF3OTUrpdJpPPH4EMAnF0DsHHdSZqCdSss5qCmJKuiO3w==}
+ engines: {node: '>= 0.10'}
+ hasBin: true
+ dependencies:
+ inherits: 2.0.4
+ safe-buffer: 5.2.1
+ to-buffer: 1.2.2
+ dev: true
+
+ /shebang-command@2.0.0:
+ resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==}
+ engines: {node: '>=8'}
+ dependencies:
+ shebang-regex: 3.0.0
+ dev: true
+
+ /shebang-regex@3.0.0:
+ resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==}
+ engines: {node: '>=8'}
+ dev: true
+
+ /shell-quote@1.8.3:
+ resolution: {integrity: sha512-ObmnIF4hXNg1BqhnHmgbDETF8dLPCggZWBjkQfhZpbszZnYur5DUljTcCHii5LC3J5E0yeO/1LIMyH+UvHQgyw==}
+ engines: {node: '>= 0.4'}
+ dev: true
+
+ /side-channel-list@1.0.0:
+ resolution: {integrity: sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==}
+ engines: {node: '>= 0.4'}
+ dependencies:
+ es-errors: 1.3.0
+ object-inspect: 1.13.4
+ dev: true
+
+ /side-channel-map@1.0.1:
+ resolution: {integrity: sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==}
+ engines: {node: '>= 0.4'}
+ dependencies:
+ call-bound: 1.0.4
+ es-errors: 1.3.0
+ get-intrinsic: 1.3.0
+ object-inspect: 1.13.4
+ dev: true
+
+ /side-channel-weakmap@1.0.2:
+ resolution: {integrity: sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==}
+ engines: {node: '>= 0.4'}
+ dependencies:
+ call-bound: 1.0.4
+ es-errors: 1.3.0
+ get-intrinsic: 1.3.0
+ object-inspect: 1.13.4
+ side-channel-map: 1.0.1
+ dev: true
+
+ /side-channel@1.1.0:
+ resolution: {integrity: sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==}
+ engines: {node: '>= 0.4'}
+ dependencies:
+ es-errors: 1.3.0
+ object-inspect: 1.13.4
+ side-channel-list: 1.0.0
+ side-channel-map: 1.0.1
+ side-channel-weakmap: 1.0.2
+ dev: true
+
+ /signal-exit@3.0.7:
+ resolution: {integrity: sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==}
+ dev: true
+
+ /simple-concat@1.0.1:
+ resolution: {integrity: sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q==}
+ dev: true
+
+ /simple-get@2.8.2:
+ resolution: {integrity: sha512-Ijd/rV5o+mSBBs4F/x9oDPtTx9Zb6X9brmnXvMW4J7IR15ngi9q5xxqWBKU744jTZiaXtxaPL7uHG6vtN8kUkw==}
+ dependencies:
+ decompress-response: 3.3.0
+ once: 1.4.0
+ simple-concat: 1.0.1
+ dev: true
+
+ /sisteransi@1.0.5:
+ resolution: {integrity: sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==}
+ dev: true
+
+ /slash@3.0.0:
+ resolution: {integrity: sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==}
+ engines: {node: '>=8'}
+ dev: true
+
+ /slice-ansi@3.0.0:
+ resolution: {integrity: sha512-pSyv7bSTC7ig9Dcgbw9AuRNUb5k5V6oDudjZoMBSr13qpLBG7tB+zgCkARjq7xIUgdz5P1Qe8u+rSGdouOOIyQ==}
+ engines: {node: '>=8'}
+ dependencies:
+ ansi-styles: 4.3.0
+ astral-regex: 2.0.0
+ is-fullwidth-code-point: 3.0.0
+ dev: true
+
+ /slice-ansi@4.0.0:
+ resolution: {integrity: sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==}
+ engines: {node: '>=10'}
+ dependencies:
+ ansi-styles: 4.3.0
+ astral-regex: 2.0.0
+ is-fullwidth-code-point: 3.0.0
+ dev: true
+
+ /snake-case@3.0.4:
+ resolution: {integrity: sha512-LAOh4z89bGQvl9pFfNF8V146i7o7/CqFPbqzYgP+yYzDIDeS9HaNFtXABamRW+AQzEVODcvE79ljJ+8a9YSdMg==}
+ dependencies:
+ dot-case: 3.0.4
+ tslib: 2.8.1
+ dev: true
+
+ /solc@0.4.26:
+ resolution: {integrity: sha512-o+c6FpkiHd+HPjmjEVpQgH7fqZ14tJpXhho+/bQXlXbliLIS/xjXb42Vxh+qQY1WCSTMQ0+a5vR9vi0MfhU6mA==}
+ hasBin: true
+ dependencies:
+ fs-extra: 0.30.0
+ memorystream: 0.3.1
+ require-from-string: 1.2.1
+ semver: 5.7.2
+ yargs: 4.8.1
+ dev: true
+
+ /solc@0.8.15:
+ resolution: {integrity: sha512-Riv0GNHNk/SddN/JyEuFKwbcWcEeho15iyupTSHw5Np6WuXA5D8kEHbyzDHi6sqmvLzu2l+8b1YmL8Ytple+8w==}
+ engines: {node: '>=10.0.0'}
+ hasBin: true
+ dependencies:
+ command-exists: 1.2.9
+ commander: 8.3.0
+ follow-redirects: 1.15.11(debug@4.4.3)
+ js-sha3: 0.8.0
+ memorystream: 0.3.1
+ semver: 5.7.2
+ tmp: 0.0.33
+ transitivePeerDependencies:
+ - debug
+ dev: true
+
+ /solc@0.8.26(debug@4.4.3):
+ resolution: {integrity: sha512-yiPQNVf5rBFHwN6SIf3TUUvVAFKcQqmSUFeq+fb6pNRCo0ZCgpYOZDi3BVoezCPIAcKrVYd/qXlBLUP9wVrZ9g==}
+ engines: {node: '>=10.0.0'}
+ hasBin: true
+ dependencies:
+ command-exists: 1.2.9
+ commander: 8.3.0
+ follow-redirects: 1.15.11(debug@4.4.3)
+ js-sha3: 0.8.0
+ memorystream: 0.3.1
+ semver: 5.7.2
+ tmp: 0.0.33
+ transitivePeerDependencies:
+ - debug
+ dev: true
+
+ /solhint@4.5.4(typescript@5.9.3):
+ resolution: {integrity: sha512-Cu1XiJXub2q1eCr9kkJ9VPv1sGcmj3V7Zb76B0CoezDOB9bu3DxKIFFH7ggCl9fWpEPD6xBmRLfZrYijkVmujQ==}
+ hasBin: true
+ dependencies:
+ '@solidity-parser/parser': 0.18.0
+ ajv: 6.12.6
+ antlr4: 4.13.2
+ ast-parents: 0.0.1
+ chalk: 4.1.2
+ commander: 10.0.1
+ cosmiconfig: 8.3.6(typescript@5.9.3)
+ fast-diff: 1.3.0
+ glob: 8.1.0
+ ignore: 5.3.2
+ js-yaml: 4.1.0
+ latest-version: 7.0.0
+ lodash: 4.17.21
+ pluralize: 8.0.0
+ semver: 7.7.3
+ strip-ansi: 6.0.1
+ table: 6.9.0
+ text-table: 0.2.0
+ optionalDependencies:
+ prettier: 2.8.8
+ transitivePeerDependencies:
+ - typescript
+ dev: true
+
+ /solidity-bytes-utils@0.8.4:
+ resolution: {integrity: sha512-/bjac5YR12i0plOKvGlhE51F5IWGP6rI8DJetCQlXcnwKWz/Hgf/vr+Qlk1BWz56xVcwVhmhCaDkTMnx5xvt0g==}
+ dev: true
+
+ /sonic-boom@3.8.1:
+ resolution: {integrity: sha512-y4Z8LCDBuum+PBP3lSV7RHrXscqksve/bi0as7mhwVnBW+/wUqKT/2Kb7um8yqcFy0duYbbPxzt89Zy2nOCaxg==}
+ dependencies:
+ atomic-sleep: 1.0.0
+ dev: true
+
+ /sort-object-keys@1.1.3:
+ resolution: {integrity: sha512-855pvK+VkU7PaKYPc+Jjnmt4EzejQHyhhF33q31qG8x7maDzkeFhAAThdCYay11CISO+qAMwjOBP+fPZe0IPyg==}
+ dev: true
+
+ /sort-package-json@3.4.0:
+ resolution: {integrity: sha512-97oFRRMM2/Js4oEA9LJhjyMlde+2ewpZQf53pgue27UkbEXfHJnDzHlUxQ/DWUkzqmp7DFwJp8D+wi/TYeQhpA==}
+ engines: {node: '>=20'}
+ hasBin: true
+ dependencies:
+ detect-indent: 7.0.2
+ detect-newline: 4.0.1
+ git-hooks-list: 4.1.1
+ is-plain-obj: 4.1.0
+ semver: 7.7.3
+ sort-object-keys: 1.1.3
+ tinyglobby: 0.2.15
+ dev: true
+
+ /source-map-support@0.5.13:
+ resolution: {integrity: sha512-SHSKFHadjVA5oR4PPqhtAVdcBWwRYVd6g6cAXnIbRiIwc2EhPrTuKUBdSLvlEKyIP3GCf89fltvcZiP9MMFA1w==}
+ dependencies:
+ buffer-from: 1.1.2
+ source-map: 0.6.1
+ dev: true
+
+ /source-map-support@0.5.21:
+ resolution: {integrity: sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==}
+ dependencies:
+ buffer-from: 1.1.2
+ source-map: 0.6.1
+ dev: true
+
+ /source-map@0.6.1:
+ resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==}
+ engines: {node: '>=0.10.0'}
+ dev: true
+
+ /spdx-correct@3.2.0:
+ resolution: {integrity: sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==}
+ dependencies:
+ spdx-expression-parse: 3.0.1
+ spdx-license-ids: 3.0.22
+ dev: true
+
+ /spdx-exceptions@2.5.0:
+ resolution: {integrity: sha512-PiU42r+xO4UbUS1buo3LPJkjlO7430Xn5SVAhdpzzsPHsjbYVflnnFdATgabnLude+Cqu25p6N+g2lw/PFsa4w==}
+ dev: true
+
+ /spdx-expression-parse@3.0.1:
+ resolution: {integrity: sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==}
+ dependencies:
+ spdx-exceptions: 2.5.0
+ spdx-license-ids: 3.0.22
+ dev: true
+
+ /spdx-license-ids@3.0.22:
+ resolution: {integrity: sha512-4PRT4nh1EImPbt2jASOKHX7PB7I+e4IWNLvkKFDxNhJlfjbYlleYQh285Z/3mPTHSAK/AvdMmw5BNNuYH8ShgQ==}
+ dev: true
+
+ /split2@4.2.0:
+ resolution: {integrity: sha512-UcjcJOWknrNkF6PLX83qcHM6KHgVKNkV62Y8a5uYDVv9ydGQVwAHMKqHdJje1VTWpljG0WYpCDhrCdAOYH4TWg==}
+ engines: {node: '>= 10.x'}
+ dev: true
+
+ /sprintf-js@1.0.3:
+ resolution: {integrity: sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==}
+ dev: true
+
+ /sshpk@1.18.0:
+ resolution: {integrity: sha512-2p2KJZTSqQ/I3+HX42EpYOa2l3f8Erv8MWKsy2I9uf4wA7yFIkXRffYdsx86y6z4vHtV8u7g+pPlr8/4ouAxsQ==}
+ engines: {node: '>=0.10.0'}
+ hasBin: true
+ dependencies:
+ asn1: 0.2.6
+ assert-plus: 1.0.0
+ bcrypt-pbkdf: 1.0.2
+ dashdash: 1.14.1
+ ecc-jsbn: 0.1.2
+ getpass: 0.1.7
+ jsbn: 0.1.1
+ safer-buffer: 2.1.2
+ tweetnacl: 0.14.5
+ dev: true
+
+ /stable-hash@0.0.5:
+ resolution: {integrity: sha512-+L3ccpzibovGXFK+Ap/f8LOS0ahMrHTf3xu7mMLSpEGU0EO9ucaysSylKo9eRDFNhWve/y275iPmIZ4z39a9iA==}
+ dev: true
+
+ /stack-trace@0.0.10:
+ resolution: {integrity: sha512-KGzahc7puUKkzyMt+IqAep+TVNbKP+k2Lmwhub39m1AsTSkaDutx56aDCo+HLDzf/D26BIHTJWNiTG1KAJiQCg==}
+ dev: true
+
+ /stack-utils@2.0.6:
+ resolution: {integrity: sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ==}
+ engines: {node: '>=10'}
+ dependencies:
+ escape-string-regexp: 2.0.0
+ dev: true
+
+ /stacktrace-parser@0.1.11:
+ resolution: {integrity: sha512-WjlahMgHmCJpqzU8bIBy4qtsZdU9lRlcZE3Lvyej6t4tuOuv1vk57OW3MBrj6hXBFx/nNoC9MPMTcr5YA7NQbg==}
+ engines: {node: '>=6'}
+ dependencies:
+ type-fest: 0.7.1
+ dev: true
+
+ /statuses@2.0.1:
+ resolution: {integrity: sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==}
+ engines: {node: '>= 0.8'}
+ dev: true
+
+ /stop-iteration-iterator@1.1.0:
+ resolution: {integrity: sha512-eLoXW/DHyl62zxY4SCaIgnRhuMr6ri4juEYARS8E6sCEqzKpOiE521Ucofdx+KnDZl5xmvGYaaKCk5FEOxJCoQ==}
+ engines: {node: '>= 0.4'}
+ dependencies:
+ es-errors: 1.3.0
+ internal-slot: 1.1.0
+ dev: true
+
+ /stream-chain@2.2.5:
+ resolution: {integrity: sha512-1TJmBx6aSWqZ4tx7aTpBDXK0/e2hhcNSTV8+CbFJtDjbb+I1mZ8lHit0Grw9GRT+6JbIrrDd8esncgBi8aBXGA==}
+ dev: true
+
+ /stream-json@1.9.1:
+ resolution: {integrity: sha512-uWkjJ+2Nt/LO9Z/JyKZbMusL8Dkh97uUBTv3AJQ74y07lVahLY4eEFsPsE97pxYBwr8nnjMAIch5eqI0gPShyw==}
+ dependencies:
+ stream-chain: 2.2.5
+ dev: true
+
+ /strict-uri-encode@1.1.0:
+ resolution: {integrity: sha512-R3f198pcvnB+5IpnBlRkphuE9n46WyVl8I39W/ZUTZLz4nqSP/oLYUrcnJrw462Ds8he4YKMov2efsTIw1BDGQ==}
+ engines: {node: '>=0.10.0'}
+ dev: true
+
+ /string-format@2.0.0:
+ resolution: {integrity: sha512-bbEs3scLeYNXLecRRuk6uJxdXUSj6le/8rNPHChIJTn2V79aXVTR1EH2OH5zLKKoz0V02fOUKZZcw01pLUShZA==}
+ dev: true
+
+ /string-length@4.0.2:
+ resolution: {integrity: sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ==}
+ engines: {node: '>=10'}
+ dependencies:
+ char-regex: 1.0.2
+ strip-ansi: 6.0.1
+ dev: true
+
+ /string-similarity@4.0.4:
+ resolution: {integrity: sha512-/q/8Q4Bl4ZKAPjj8WerIBJWALKkaPRfrvhfF8k/B23i4nzrlRj2/go1m90In7nG/3XDSbOo0+pu6RvCTM9RGMQ==}
+ deprecated: Package no longer supported. Contact Support at https://www.npmjs.com/support for more info.
+ dev: true
+
+ /string-width@1.0.2:
+ resolution: {integrity: sha512-0XsVpQLnVCXHJfyEs8tC0zpTVIr5PKKsQtkT29IwupnPTjtPmQ3xT/4yCREF9hYkV/3M3kzcUTSAZT6a6h81tw==}
+ engines: {node: '>=0.10.0'}
+ dependencies:
+ code-point-at: 1.1.0
+ is-fullwidth-code-point: 1.0.0
+ strip-ansi: 3.0.1
+ dev: true
+
+ /string-width@4.2.3:
+ resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==}
+ engines: {node: '>=8'}
+ dependencies:
+ emoji-regex: 8.0.0
+ is-fullwidth-code-point: 3.0.0
+ strip-ansi: 6.0.1
+ dev: true
+
+ /string.prototype.trim@1.2.10:
+ resolution: {integrity: sha512-Rs66F0P/1kedk5lyYyH9uBzuiI/kNRmwJAR9quK6VOtIpZ2G+hMZd+HQbbv25MgCA6gEffoMZYxlTod4WcdrKA==}
+ engines: {node: '>= 0.4'}
+ dependencies:
+ call-bind: 1.0.8
+ call-bound: 1.0.4
+ define-data-property: 1.1.4
+ define-properties: 1.2.1
+ es-abstract: 1.24.0
+ es-object-atoms: 1.1.1
+ has-property-descriptors: 1.0.2
+ dev: true
+
+ /string.prototype.trimend@1.0.9:
+ resolution: {integrity: sha512-G7Ok5C6E/j4SGfyLCloXTrngQIQU3PWtXGst3yM7Bea9FRURf1S42ZHlZZtsNque2FN2PoUhfZXYLNWwEr4dLQ==}
+ engines: {node: '>= 0.4'}
+ dependencies:
+ call-bind: 1.0.8
+ call-bound: 1.0.4
+ define-properties: 1.2.1
+ es-object-atoms: 1.1.1
+ dev: true
+
+ /string.prototype.trimstart@1.0.8:
+ resolution: {integrity: sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg==}
+ engines: {node: '>= 0.4'}
+ dependencies:
+ call-bind: 1.0.8
+ define-properties: 1.2.1
+ es-object-atoms: 1.1.1
+ dev: true
+
+ /string_decoder@1.1.1:
+ resolution: {integrity: sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==}
+ dependencies:
+ safe-buffer: 5.1.2
+ dev: true
+
+ /string_decoder@1.3.0:
+ resolution: {integrity: sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==}
+ dependencies:
+ safe-buffer: 5.2.1
+ dev: true
+
+ /strip-ansi@3.0.1:
+ resolution: {integrity: sha512-VhumSSbBqDTP8p2ZLKj40UjBCV4+v8bUSEpUb4KjRgWk9pbqGF4REFj6KEagidb2f/M6AzC0EmFyDNGaw9OCzg==}
+ engines: {node: '>=0.10.0'}
+ dependencies:
+ ansi-regex: 2.1.1
+ dev: true
+
+ /strip-ansi@6.0.1:
+ resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==}
+ engines: {node: '>=8'}
+ dependencies:
+ ansi-regex: 5.0.1
+ dev: true
+
+ /strip-bom@2.0.0:
+ resolution: {integrity: sha512-kwrX1y7czp1E69n2ajbG65mIo9dqvJ+8aBQXOGVxqwvNbsXdFM6Lq37dLAY3mknUwru8CfcCbfOLL/gMo+fi3g==}
+ engines: {node: '>=0.10.0'}
+ dependencies:
+ is-utf8: 0.2.1
+ dev: true
+
+ /strip-bom@3.0.0:
+ resolution: {integrity: sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==}
+ engines: {node: '>=4'}
+ dev: true
+
+ /strip-bom@4.0.0:
+ resolution: {integrity: sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==}
+ engines: {node: '>=8'}
+ dev: true
+
+ /strip-final-newline@2.0.0:
+ resolution: {integrity: sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==}
+ engines: {node: '>=6'}
+ dev: true
+
+ /strip-hex-prefix@1.0.0:
+ resolution: {integrity: sha512-q8d4ue7JGEiVcypji1bALTos+0pWtyGlivAWyPuTkHzuTCJqrK9sWxYQZUq6Nq3cuyv3bm734IhHvHtGGURU6A==}
+ engines: {node: '>=6.5.0', npm: '>=3'}
+ dependencies:
+ is-hex-prefixed: 1.0.0
+ dev: true
+
+ /strip-json-comments@2.0.1:
+ resolution: {integrity: sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==}
+ engines: {node: '>=0.10.0'}
+ dev: true
+
+ /strip-json-comments@3.1.1:
+ resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==}
+ engines: {node: '>=8'}
+ dev: true
+
+ /superstruct@0.15.5:
+ resolution: {integrity: sha512-4AOeU+P5UuE/4nOUkmcQdW5y7i9ndt1cQd/3iUe+LTz3RxESf/W/5lg4B74HbDMMv8PHnPnGCQFH45kBcrQYoQ==}
+ dev: true
+
+ /superstruct@2.0.2:
+ resolution: {integrity: sha512-uV+TFRZdXsqXTL2pRvujROjdZQ4RAlBUS5BTh9IGm+jTqQntYThciG/qu57Gs69yjnVUSqdxF9YLmSnpupBW9A==}
+ engines: {node: '>=14.0.0'}
+ dev: true
+
+ /supports-color@5.5.0:
+ resolution: {integrity: sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==}
+ engines: {node: '>=4'}
+ dependencies:
+ has-flag: 3.0.0
+ dev: true
+
+ /supports-color@7.2.0:
+ resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==}
+ engines: {node: '>=8'}
+ dependencies:
+ has-flag: 4.0.0
+ dev: true
+
+ /supports-color@8.1.1:
+ resolution: {integrity: sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==}
+ engines: {node: '>=10'}
+ dependencies:
+ has-flag: 4.0.0
+ dev: true
+
+ /supports-preserve-symlinks-flag@1.0.0:
+ resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==}
+ engines: {node: '>= 0.4'}
+ dev: true
+
+ /swarm-js@0.1.42:
+ resolution: {integrity: sha512-BV7c/dVlA3R6ya1lMlSSNPLYrntt0LUq4YMgy3iwpCIc6rZnS5W2wUoctarZ5pXlpKtxDDf9hNziEkcfrxdhqQ==}
+ dependencies:
+ bluebird: 3.7.2
+ buffer: 5.7.1
+ eth-lib: 0.1.29
+ fs-extra: 4.0.3
+ got: 11.8.6
+ mime-types: 2.1.35
+ mkdirp-promise: 5.0.1
+ mock-fs: 4.14.0
+ setimmediate: 1.0.5
+ tar: 4.4.19
+ xhr-request: 1.1.0
+ transitivePeerDependencies:
+ - bufferutil
+ - supports-color
+ - utf-8-validate
+ dev: true
+
+ /symbol.inspect@1.0.1:
+ resolution: {integrity: sha512-YQSL4duoHmLhsTD1Pw8RW6TZ5MaTX5rXJnqacJottr2P2LZBF/Yvrc3ku4NUpMOm8aM0KOCqM+UAkMA5HWQCzQ==}
+ dev: true
+
+ /synckit@0.11.11:
+ resolution: {integrity: sha512-MeQTA1r0litLUf0Rp/iisCaL8761lKAZHaimlbGK4j0HysC4PLfqygQj9srcs0m2RdtDYnF8UuYyKpbjHYp7Jw==}
+ engines: {node: ^14.18.0 || >=16.0.0}
+ dependencies:
+ '@pkgr/core': 0.2.9
+ dev: true
+
+ /table-layout@1.0.2:
+ resolution: {integrity: sha512-qd/R7n5rQTRFi+Zf2sk5XVVd9UQl6ZkduPFC3S7WEGJAmetDTjY3qPN50eSKzwuzEyQKy5TN2TiZdkIjos2L6A==}
+ engines: {node: '>=8.0.0'}
+ dependencies:
+ array-back: 4.0.2
+ deep-extend: 0.6.0
+ typical: 5.2.0
+ wordwrapjs: 4.0.1
+ dev: true
+
+ /table@6.8.2:
+ resolution: {integrity: sha512-w2sfv80nrAh2VCbqR5AK27wswXhqcck2AhfnNW76beQXskGZ1V12GwS//yYVa3d3fcvAip2OUnbDAjW2k3v9fA==}
+ engines: {node: '>=10.0.0'}
+ dependencies:
+ ajv: 8.17.1
+ lodash.truncate: 4.4.2
+ slice-ansi: 4.0.0
+ string-width: 4.2.3
+ strip-ansi: 6.0.1
+ dev: true
+
+ /table@6.9.0:
+ resolution: {integrity: sha512-9kY+CygyYM6j02t5YFHbNz2FN5QmYGv9zAjVp4lCDjlCw7amdckXlEt/bjMhUIfj4ThGRE4gCUH5+yGnNuPo5A==}
+ engines: {node: '>=10.0.0'}
+ dependencies:
+ ajv: 8.17.1
+ lodash.truncate: 4.4.2
+ slice-ansi: 4.0.0
+ string-width: 4.2.3
+ strip-ansi: 6.0.1
+ dev: true
+
+ /tar@4.4.19:
+ resolution: {integrity: sha512-a20gEsvHnWe0ygBY8JbxoM4w3SJdhc7ZAuxkLqh+nvNQN2IOt0B5lLgM490X5Hl8FF0dl0tOf2ewFYAlIFgzVA==}
+ engines: {node: '>=4.5'}
+ dependencies:
+ chownr: 1.1.4
+ fs-minipass: 1.2.7
+ minipass: 2.9.0
+ minizlib: 1.3.3
+ mkdirp: 0.5.6
+ safe-buffer: 5.2.1
+ yallist: 3.1.1
+ dev: true
+
+ /teslabot@1.5.0:
+ resolution: {integrity: sha512-e2MmELhCgrgZEGo7PQu/6bmYG36IDH+YrBI1iGm6jovXkeDIGa3pZ2WSqRjzkuw2vt1EqfkZoV5GpXgqL8QJVg==}
+ dev: true
+
+ /test-exclude@6.0.0:
+ resolution: {integrity: sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==}
+ engines: {node: '>=8'}
+ dependencies:
+ '@istanbuljs/schema': 0.1.3
+ glob: 7.2.3
+ minimatch: 3.1.2
+ dev: true
+
+ /testrpc@0.0.1:
+ resolution: {integrity: sha512-afH1hO+SQ/VPlmaLUFj2636QMeDvPCeQMc/9RBMW0IfjNe9gFD9Ra3ShqYkB7py0do1ZcCna/9acHyzTJ+GcNA==}
+ deprecated: testrpc has been renamed to ganache-cli, please use this package from now on.
+ dev: true
+
+ /text-encoding-utf-8@1.0.2:
+ resolution: {integrity: sha512-8bw4MY9WjdsD2aMtO0OzOCY3pXGYNx2d2FfHRVUKkiCPDWjKuOlhLVASS+pD7VkLTVjW268LYJHwsnPFlBpbAg==}
+ dev: true
+
+ /text-hex@1.0.0:
+ resolution: {integrity: sha512-uuVGNWzgJ4yhRaNSiubPY7OjISw4sw4E5Uv0wbjp+OzcbmVU/rsT8ujgcXJhn9ypzsgr5vlzpPqP+MBBKcGvbg==}
+ dev: true
+
+ /text-table@0.2.0:
+ resolution: {integrity: sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==}
+ dev: true
+
+ /thread-stream@2.7.0:
+ resolution: {integrity: sha512-qQiRWsU/wvNolI6tbbCKd9iKaTnCXsTwVxhhKM6nctPdujTyztjlbUkUTUymidWcMnZ5pWR0ej4a0tjsW021vw==}
+ dependencies:
+ real-require: 0.2.0
+ dev: true
+
+ /timed-out@4.0.1:
+ resolution: {integrity: sha512-G7r3AhovYtr5YKOWQkta8RKAPb+J9IsO4uVmzjl8AZwfhs8UcUwTiD6gcJYSgOtzyjvQKrKYn41syHbUWMkafA==}
+ engines: {node: '>=0.10.0'}
+ dev: true
+
+ /timers-ext@0.1.8:
+ resolution: {integrity: sha512-wFH7+SEAcKfJpfLPkrgMPvvwnEtj8W4IurvEyrKsDleXnKLCDw71w8jltvfLa8Rm4qQxxT4jmDBYbJG/z7qoww==}
+ engines: {node: '>=0.12'}
+ dependencies:
+ es5-ext: 0.10.64
+ next-tick: 1.1.0
+ dev: true
+
+ /tiny-invariant@1.3.3:
+ resolution: {integrity: sha512-+FbBPE1o9QAYvviau/qC5SE3caw21q3xkvWKBtja5vgqOWIHHJ3ioaq1VPfn/Szqctz2bU/oYeKd9/z5BL+PVg==}
+ dev: true
+
+ /tinycolor2@1.6.0:
+ resolution: {integrity: sha512-XPaBkWQJdsf3pLKJV9p4qN/S+fm2Oj8AIPo1BTUhg5oxkvm9+SVEGFdhyOz7tTdUTfvxMiAs4sp6/eZO2Ew+pw==}
+ dev: true
+
+ /tinyglobby@0.2.15:
+ resolution: {integrity: sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ==}
+ engines: {node: '>=12.0.0'}
+ dependencies:
+ fdir: 6.5.0(picomatch@4.0.3)
+ picomatch: 4.0.3
+ dev: true
+
+ /tinygradient@0.4.3:
+ resolution: {integrity: sha512-tBPYQSs6eWukzzAITBSmqcOwZCKACvRa/XjPPh1mj4mnx4G3Drm51HxyCTU/TKnY8kG4hmTe5QlOh9O82aNtJQ==}
+ dependencies:
+ '@types/tinycolor2': 1.4.6
+ tinycolor2: 1.6.0
+ dev: true
+
+ /tmp@0.0.33:
+ resolution: {integrity: sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==}
+ engines: {node: '>=0.6.0'}
+ dependencies:
+ os-tmpdir: 1.0.2
+ dev: true
+
+ /tmpl@1.0.5:
+ resolution: {integrity: sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw==}
+ dev: true
+
+ /to-buffer@1.2.2:
+ resolution: {integrity: sha512-db0E3UJjcFhpDhAF4tLo03oli3pwl3dbnzXOUIlRKrp+ldk/VUxzpWYZENsw2SZiuBjHAk7DfB0VU7NKdpb6sw==}
+ engines: {node: '>= 0.4'}
+ dependencies:
+ isarray: 2.0.5
+ safe-buffer: 5.2.1
+ typed-array-buffer: 1.0.3
+ dev: true
+
+ /to-regex-range@5.0.1:
+ resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==}
+ engines: {node: '>=8.0'}
+ dependencies:
+ is-number: 7.0.0
+ dev: true
+
+ /toidentifier@1.0.1:
+ resolution: {integrity: sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==}
+ engines: {node: '>=0.6'}
+ dev: true
+
+ /toml@3.0.0:
+ resolution: {integrity: sha512-y/mWCZinnvxjTKYhJ+pYxwD0mRLVvOtdS2Awbgxln6iEnt4rk0yBxeSBHkGJcPucRiG0e55mwWp+g/05rsrd6w==}
+ dev: true
+
+ /tough-cookie@2.5.0:
+ resolution: {integrity: sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==}
+ engines: {node: '>=0.8'}
+ dependencies:
+ psl: 1.15.0
+ punycode: 2.3.1
+ dev: true
+
+ /tr46@0.0.3:
+ resolution: {integrity: sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==}
+ dev: true
+
+ /tree-kill@1.2.2:
+ resolution: {integrity: sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==}
+ hasBin: true
+ dev: true
+
+ /triple-beam@1.4.1:
+ resolution: {integrity: sha512-aZbgViZrg1QNcG+LULa7nhZpJTZSLm/mXnHXnbAbjmN5aSa0y7V+wvv6+4WaBtpISJzThKy+PIPxc1Nq1EJ9mg==}
+ engines: {node: '>= 14.0.0'}
+ dev: true
+
+ /tronweb@5.3.4:
+ resolution: {integrity: sha512-79HEnwSAqyCKrT7QB8dkxad0RqYx3dSulEg4dfBQQVwzhRr+AqdE1yz+nfTUpftu54RejqaHjqz40ZzWNy077w==}
+ dependencies:
+ '@babel/runtime': 7.28.4
+ '@ethersproject/abi': 5.8.0
+ '@tronweb3/google-protobuf': 3.21.4
+ axios: 1.13.1
+ bignumber.js: 9.3.1
+ ethereum-cryptography: 2.2.1
+ ethers: 5.8.0
+ eventemitter3: 3.1.2
+ injectpromise: 1.0.0
+ lodash: 4.17.21
+ querystring-es3: 0.2.1
+ semver: 5.7.2
+ validator: 13.15.20
+ transitivePeerDependencies:
+ - bufferutil
+ - debug
+ - utf-8-validate
+ dev: true
+
+ /ts-api-utils@1.4.3(typescript@5.9.3):
+ resolution: {integrity: sha512-i3eMG77UTMD0hZhgRS562pv83RC6ukSAC2GMNWc+9dieh/+jDM5u5YG+NHX6VNDRHQcHwmsTHctP9LhbC3WxVw==}
+ engines: {node: '>=16'}
+ peerDependencies:
+ typescript: '>=4.2.0'
+ dependencies:
+ typescript: 5.9.3
+ dev: true
+
+ /ts-command-line-args@2.5.1:
+ resolution: {integrity: sha512-H69ZwTw3rFHb5WYpQya40YAX2/w7Ut75uUECbgBIsLmM+BNuYnxsltfyyLMxy6sEeKxgijLTnQtLd0nKd6+IYw==}
+ hasBin: true
+ dependencies:
+ chalk: 4.1.2
+ command-line-args: 5.2.1
+ command-line-usage: 6.1.3
+ string-format: 2.0.0
+ dev: true
+
+ /ts-essentials@7.0.3(typescript@5.9.3):
+ resolution: {integrity: sha512-8+gr5+lqO3G84KdiTSMRLtuyJ+nTBVRKuCrK4lidMPdVeEp0uqC875uE5NMcaA7YYMN7XsNiFQuMvasF8HT/xQ==}
+ peerDependencies:
+ typescript: '>=3.7.0'
+ dependencies:
+ typescript: 5.9.3
+ dev: true
+
+ /ts-node@10.9.2(@swc/core@1.14.0)(@types/node@18.18.14)(typescript@5.9.3):
+ resolution: {integrity: sha512-f0FFpIdcHgn8zcPSbf1dRevwt047YMnaiJM3u2w2RewrB+fob/zePZcrOyQoLMMO7aBIddLcQIEK5dYjkLnGrQ==}
+ hasBin: true
+ peerDependencies:
+ '@swc/core': '>=1.2.50'
+ '@swc/wasm': '>=1.2.50'
+ '@types/node': '*'
+ typescript: '>=2.7'
+ peerDependenciesMeta:
+ '@swc/core':
+ optional: true
+ '@swc/wasm':
+ optional: true
+ dependencies:
+ '@cspotcode/source-map-support': 0.8.1
+ '@swc/core': 1.14.0
+ '@tsconfig/node10': 1.0.11
+ '@tsconfig/node12': 1.0.11
+ '@tsconfig/node14': 1.0.3
+ '@tsconfig/node16': 1.0.4
+ '@types/node': 18.18.14
+ acorn: 8.15.0
+ acorn-walk: 8.3.4
+ arg: 4.1.3
+ create-require: 1.1.1
+ diff: 4.0.2
+ make-error: 1.3.6
+ typescript: 5.9.3
+ v8-compile-cache-lib: 3.0.1
+ yn: 3.1.1
+ dev: true
+
+ /tsconfig-paths@3.15.0:
+ resolution: {integrity: sha512-2Ac2RgzDe/cn48GvOe3M+o82pEFewD3UPbyoUHHdKasHwJKjds4fLXWf/Ux5kATBKN20oaFGu+jbElp1pos0mg==}
+ dependencies:
+ '@types/json5': 0.0.29
+ json5: 1.0.2
+ minimist: 1.2.8
+ strip-bom: 3.0.0
+ dev: true
+
+ /tslib@1.14.1:
+ resolution: {integrity: sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==}
+ dev: true
+
+ /tslib@2.8.1:
+ resolution: {integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==}
+ dev: true
+
+ /tsort@0.0.1:
+ resolution: {integrity: sha512-Tyrf5mxF8Ofs1tNoxA13lFeZ2Zrbd6cKbuH3V+MQ5sb6DtBj5FjrXVsRWT8YvNAQTqNoz66dz1WsbigI22aEnw==}
+ dev: true
+
+ /tsutils@3.21.0(typescript@5.9.3):
+ resolution: {integrity: sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==}
+ engines: {node: '>= 6'}
+ peerDependencies:
+ typescript: '>=2.8.0 || >= 3.2.0-dev || >= 3.3.0-dev || >= 3.4.0-dev || >= 3.5.0-dev || >= 3.6.0-dev || >= 3.6.0-beta || >= 3.7.0-dev || >= 3.7.0-beta'
+ dependencies:
+ tslib: 1.14.1
+ typescript: 5.9.3
+ dev: true
+
+ /tunnel-agent@0.6.0:
+ resolution: {integrity: sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==}
+ dependencies:
+ safe-buffer: 5.2.1
+ dev: true
+
+ /tweetnacl@0.14.5:
+ resolution: {integrity: sha512-KXXFFdAbFXY4geFIwoyNK+f5Z1b7swfXABfL7HXCmoIWMKU3dmS26672A4EeQtDzLKy7SXmfBu51JolvEKwtGA==}
+ dev: true
+
+ /tweetnacl@1.0.3:
+ resolution: {integrity: sha512-6rt+RN7aOi1nGMyC4Xa5DdYiukl2UWCbcJft7YhxReBGQD7OAM8Pbxw6YMo4r2diNEA8FEmu32YOn9rhaiE5yw==}
+ dev: true
+
+ /type-check@0.4.0:
+ resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==}
+ engines: {node: '>= 0.8.0'}
+ dependencies:
+ prelude-ls: 1.2.1
+ dev: true
+
+ /type-detect@4.0.8:
+ resolution: {integrity: sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==}
+ engines: {node: '>=4'}
+ dev: true
+
+ /type-detect@4.1.0:
+ resolution: {integrity: sha512-Acylog8/luQ8L7il+geoSxhEkazvkslg7PSNKOX59mbB9cOveP5aq9h74Y7YU8yDpJwetzQQrfIwtf4Wp4LKcw==}
+ engines: {node: '>=4'}
+ dev: true
+
+ /type-fest@0.12.0:
+ resolution: {integrity: sha512-53RyidyjvkGpnWPMF9bQgFtWp+Sl8O2Rp13VavmJgfAP9WWG6q6TkrKU8iyJdnwnfgHI6k2hTlgqH4aSdjoTbg==}
+ engines: {node: '>=10'}
+ dev: true
+
+ /type-fest@0.20.2:
+ resolution: {integrity: sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==}
+ engines: {node: '>=10'}
+ dev: true
+
+ /type-fest@0.21.3:
+ resolution: {integrity: sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==}
+ engines: {node: '>=10'}
+ dev: true
+
+ /type-fest@0.7.1:
+ resolution: {integrity: sha512-Ne2YiiGN8bmrmJJEuTWTLJR32nh/JdL1+PSicowtNb0WFpn59GK8/lfD61bVtzguz7b3PBt74nxpv/Pw5po5Rg==}
+ engines: {node: '>=8'}
+ dev: true
+
+ /type-is@1.6.18:
+ resolution: {integrity: sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==}
+ engines: {node: '>= 0.6'}
+ dependencies:
+ media-typer: 0.3.0
+ mime-types: 2.1.35
+ dev: true
+
+ /type@2.7.3:
+ resolution: {integrity: sha512-8j+1QmAbPvLZow5Qpi6NCaN8FB60p/6x8/vfNqOk/hC+HuvFZhL4+WfekuhQLiqFZXOgQdrs3B+XxEmCc6b3FQ==}
+ dev: true
+
+ /typechain@8.3.2(typescript@5.9.3):
+ resolution: {integrity: sha512-x/sQYr5w9K7yv3es7jo4KTX05CLxOf7TRWwoHlrjRh8H82G64g+k7VuWPJlgMo6qrjfCulOdfBjiaDtmhFYD/Q==}
+ hasBin: true
+ peerDependencies:
+ typescript: '>=4.3.0'
+ dependencies:
+ '@types/prettier': 2.7.3
+ debug: 4.4.3(supports-color@8.1.1)
+ fs-extra: 7.0.1
+ glob: 7.1.7
+ js-sha3: 0.8.0
+ lodash: 4.17.21
+ mkdirp: 1.0.4
+ prettier: 2.8.8
+ ts-command-line-args: 2.5.1
+ ts-essentials: 7.0.3(typescript@5.9.3)
+ typescript: 5.9.3
+ transitivePeerDependencies:
+ - supports-color
+ dev: true
+
+ /typed-array-buffer@1.0.3:
+ resolution: {integrity: sha512-nAYYwfY3qnzX30IkA6AQZjVbtK6duGontcQm1WSG1MD94YLqK0515GNApXkoxKOWMusVssAHWLh9SeaoefYFGw==}
+ engines: {node: '>= 0.4'}
+ dependencies:
+ call-bound: 1.0.4
+ es-errors: 1.3.0
+ is-typed-array: 1.1.15
+ dev: true
+
+ /typed-array-byte-length@1.0.3:
+ resolution: {integrity: sha512-BaXgOuIxz8n8pIq3e7Atg/7s+DpiYrxn4vdot3w9KbnBhcRQq6o3xemQdIfynqSeXeDrF32x+WvfzmOjPiY9lg==}
+ engines: {node: '>= 0.4'}
+ dependencies:
+ call-bind: 1.0.8
+ for-each: 0.3.5
+ gopd: 1.2.0
+ has-proto: 1.2.0
+ is-typed-array: 1.1.15
+ dev: true
+
+ /typed-array-byte-offset@1.0.4:
+ resolution: {integrity: sha512-bTlAFB/FBYMcuX81gbL4OcpH5PmlFHqlCCpAl8AlEzMz5k53oNDvN8p1PNOWLEmI2x4orp3raOFB51tv9X+MFQ==}
+ engines: {node: '>= 0.4'}
+ dependencies:
+ available-typed-arrays: 1.0.7
+ call-bind: 1.0.8
+ for-each: 0.3.5
+ gopd: 1.2.0
+ has-proto: 1.2.0
+ is-typed-array: 1.1.15
+ reflect.getprototypeof: 1.0.10
+ dev: true
+
+ /typed-array-length@1.0.7:
+ resolution: {integrity: sha512-3KS2b+kL7fsuk/eJZ7EQdnEmQoaho/r6KUef7hxvltNA5DR8NAUM+8wJMbJyZ4G9/7i3v5zPBIMN5aybAh2/Jg==}
+ engines: {node: '>= 0.4'}
+ dependencies:
+ call-bind: 1.0.8
+ for-each: 0.3.5
+ gopd: 1.2.0
+ is-typed-array: 1.1.15
+ possible-typed-array-names: 1.1.0
+ reflect.getprototypeof: 1.0.10
+ dev: true
+
+ /typedarray-to-buffer@3.1.5:
+ resolution: {integrity: sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==}
+ dependencies:
+ is-typedarray: 1.0.0
+ dev: true
+
+ /typescript@5.9.3:
+ resolution: {integrity: sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==}
+ engines: {node: '>=14.17'}
+ hasBin: true
+ dev: true
+
+ /typical@4.0.0:
+ resolution: {integrity: sha512-VAH4IvQ7BDFYglMd7BPRDfLgxZZX4O4TFcRDA6EN5X7erNJJq+McIEp8np9aVtxrCJ6qx4GTYVfOWNjcqwZgRw==}
+ engines: {node: '>=8'}
+ dev: true
+
+ /typical@5.2.0:
+ resolution: {integrity: sha512-dvdQgNDNJo+8B2uBQoqdb11eUCE1JQXhvjC/CZtgvZseVd5TYMXnq0+vuUemXbd/Se29cTaUuPX3YIc2xgbvIg==}
+ engines: {node: '>=8'}
+ dev: true
+
+ /uint8array-tools@0.0.8:
+ resolution: {integrity: sha512-xS6+s8e0Xbx++5/0L+yyexukU7pz//Yg6IHg3BKhXotg1JcYtgxVcUctQ0HxLByiJzpAkNFawz1Nz5Xadzo82g==}
+ engines: {node: '>=14.0.0'}
+ dev: true
+
+ /ultron@1.1.1:
+ resolution: {integrity: sha512-UIEXBNeYmKptWH6z8ZnqTeS8fV74zG0/eRU9VGkpzz+LIJNs8W/zM/L+7ctCkRrgbNnnR0xxw4bKOr0cW0N0Og==}
+ dev: true
+
+ /unbox-primitive@1.1.0:
+ resolution: {integrity: sha512-nWJ91DjeOkej/TA8pXQ3myruKpKEYgqvpw9lz4OPHj/NWFNluYrjbz9j01CJ8yKQd2g4jFoOkINCTW2I5LEEyw==}
+ engines: {node: '>= 0.4'}
+ dependencies:
+ call-bound: 1.0.4
+ has-bigints: 1.1.0
+ has-symbols: 1.1.0
+ which-boxed-primitive: 1.1.1
+ dev: true
+
+ /undici-types@5.26.5:
+ resolution: {integrity: sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==}
+ dev: true
+
+ /undici@5.29.0:
+ resolution: {integrity: sha512-raqeBD6NQK4SkWhQzeYKd1KmIG6dllBOTt55Rmkt4HtI9mwdWtJljnrXjAFUBLTSN67HWrOIZ3EPF4kjUw80Bg==}
+ engines: {node: '>=14.0'}
+ dependencies:
+ '@fastify/busboy': 2.1.1
+ dev: true
+
+ /universalify@0.1.2:
+ resolution: {integrity: sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==}
+ engines: {node: '>= 4.0.0'}
+ dev: true
+
+ /universalify@2.0.1:
+ resolution: {integrity: sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==}
+ engines: {node: '>= 10.0.0'}
+ dev: true
+
+ /unpipe@1.0.0:
+ resolution: {integrity: sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==}
+ engines: {node: '>= 0.8'}
+ dev: true
+
+ /unrs-resolver@1.11.1:
+ resolution: {integrity: sha512-bSjt9pjaEBnNiGgc9rUiHGKv5l4/TGzDmYw3RhnkJGtLhbnnA/5qJj7x3dNDCRx/PJxu774LlH8lCOlB4hEfKg==}
+ requiresBuild: true
+ dependencies:
+ napi-postinstall: 0.3.4
+ optionalDependencies:
+ '@unrs/resolver-binding-android-arm-eabi': 1.11.1
+ '@unrs/resolver-binding-android-arm64': 1.11.1
+ '@unrs/resolver-binding-darwin-arm64': 1.11.1
+ '@unrs/resolver-binding-darwin-x64': 1.11.1
+ '@unrs/resolver-binding-freebsd-x64': 1.11.1
+ '@unrs/resolver-binding-linux-arm-gnueabihf': 1.11.1
+ '@unrs/resolver-binding-linux-arm-musleabihf': 1.11.1
+ '@unrs/resolver-binding-linux-arm64-gnu': 1.11.1
+ '@unrs/resolver-binding-linux-arm64-musl': 1.11.1
+ '@unrs/resolver-binding-linux-ppc64-gnu': 1.11.1
+ '@unrs/resolver-binding-linux-riscv64-gnu': 1.11.1
+ '@unrs/resolver-binding-linux-riscv64-musl': 1.11.1
+ '@unrs/resolver-binding-linux-s390x-gnu': 1.11.1
+ '@unrs/resolver-binding-linux-x64-gnu': 1.11.1
+ '@unrs/resolver-binding-linux-x64-musl': 1.11.1
+ '@unrs/resolver-binding-wasm32-wasi': 1.11.1
+ '@unrs/resolver-binding-win32-arm64-msvc': 1.11.1
+ '@unrs/resolver-binding-win32-ia32-msvc': 1.11.1
+ '@unrs/resolver-binding-win32-x64-msvc': 1.11.1
+ dev: true
+
+ /update-browserslist-db@1.1.4(browserslist@4.27.0):
+ resolution: {integrity: sha512-q0SPT4xyU84saUX+tomz1WLkxUbuaJnR1xWt17M7fJtEJigJeWUNGUqrauFXsHnqev9y9JTRGwk13tFBuKby4A==}
+ hasBin: true
+ peerDependencies:
+ browserslist: '>= 4.21.0'
+ dependencies:
+ browserslist: 4.27.0
+ escalade: 3.2.0
+ picocolors: 1.1.1
+ dev: true
+
+ /uri-js@4.4.1:
+ resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==}
+ dependencies:
+ punycode: 2.3.1
+ dev: true
+
+ /url-set-query@1.0.0:
+ resolution: {integrity: sha512-3AChu4NiXquPfeckE5R5cGdiHCMWJx1dwCWOmWIL4KHAziJNOFIYJlpGFeKDvwLPHovZRCxK3cYlwzqI9Vp+Gg==}
+ dev: true
+
+ /url@0.11.4:
+ resolution: {integrity: sha512-oCwdVC7mTuWiPyjLUz/COz5TLk6wgp0RCsN+wHZ2Ekneac9w8uuV0njcbbie2ME+Vs+d6duwmYuR3HgQXs1fOg==}
+ engines: {node: '>= 0.4'}
+ dependencies:
+ punycode: 1.4.1
+ qs: 6.14.0
+ dev: true
+
+ /utf-8-validate@5.0.10:
+ resolution: {integrity: sha512-Z6czzLq4u8fPOyx7TU6X3dvUZVvoJmxSQ+IcrlmagKhilxlhZgxPK6C5Jqbkw1IDUmFTM+cz9QDnnLTwDz/2gQ==}
+ engines: {node: '>=6.14.2'}
+ requiresBuild: true
+ dependencies:
+ node-gyp-build: 4.8.4
+ dev: true
+
+ /utf-8-validate@5.0.7:
+ resolution: {integrity: sha512-vLt1O5Pp+flcArHGIyKEQq883nBt8nN8tVBcoL0qUXj2XT1n7p70yGIq2VK98I5FdZ1YHc0wk/koOnHjnXWk1Q==}
+ engines: {node: '>=6.14.2'}
+ requiresBuild: true
+ dependencies:
+ node-gyp-build: 4.8.4
+ dev: true
+ optional: true
+
+ /utf8@3.0.0:
+ resolution: {integrity: sha512-E8VjFIQ/TyQgp+TZfS6l8yp/xWppSAHzidGiRrqe4bK4XP9pTRyKFgGJpO3SN7zdX4DeomTrwaseCHovfpFcqQ==}
+ dev: true
+
+ /util-deprecate@1.0.2:
+ resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==}
+ dev: true
+
+ /util@0.12.5:
+ resolution: {integrity: sha512-kZf/K6hEIrWHI6XqOFUiiMa+79wE/D8Q+NCNAWclkyg3b4d2k7s0QGepNjiABc+aR3N1PAyHL7p6UcLY6LmrnA==}
+ dependencies:
+ inherits: 2.0.4
+ is-arguments: 1.2.0
+ is-generator-function: 1.1.2
+ is-typed-array: 1.1.15
+ which-typed-array: 1.1.19
+ dev: true
+
+ /utils-merge@1.0.1:
+ resolution: {integrity: sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==}
+ engines: {node: '>= 0.4.0'}
+ dev: true
+
+ /uuid@3.4.0:
+ resolution: {integrity: sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==}
+ deprecated: Please upgrade to version 7 or higher. Older versions may use Math.random() in certain circumstances, which is known to be problematic. See https://v8.dev/blog/math-random for details.
+ hasBin: true
+ dev: true
+
+ /uuid@8.3.2:
+ resolution: {integrity: sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==}
+ hasBin: true
+ dev: true
+
+ /uuid@9.0.1:
+ resolution: {integrity: sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA==}
+ hasBin: true
+ dev: true
+
+ /v8-compile-cache-lib@3.0.1:
+ resolution: {integrity: sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==}
+ dev: true
+
+ /v8-to-istanbul@9.3.0:
+ resolution: {integrity: sha512-kiGUalWN+rgBJ/1OHZsBtU4rXZOfj/7rKQxULKlIzwzQSvMJUUNgPwJEEh7gU6xEVxC0ahoOBvN2YI8GH6FNgA==}
+ engines: {node: '>=10.12.0'}
+ dependencies:
+ '@jridgewell/trace-mapping': 0.3.31
+ '@types/istanbul-lib-coverage': 2.0.6
+ convert-source-map: 2.0.0
+ dev: true
+
+ /valibot@0.36.0:
+ resolution: {integrity: sha512-CjF1XN4sUce8sBK9TixrDqFM7RwNkuXdJu174/AwmQUB62QbCQADg5lLe8ldBalFgtj1uKj+pKwDJiNo4Mn+eQ==}
+ dev: true
+
+ /valibot@0.37.0(typescript@5.9.3):
+ resolution: {integrity: sha512-FQz52I8RXgFgOHym3XHYSREbNtkgSjF9prvMFH1nBsRyfL6SfCzoT1GuSDTlbsuPubM7/6Kbw0ZMQb8A+V+VsQ==}
+ peerDependencies:
+ typescript: '>=5'
+ peerDependenciesMeta:
+ typescript:
+ optional: true
+ dependencies:
+ typescript: 5.9.3
+ dev: true
+
+ /validate-npm-package-license@3.0.4:
+ resolution: {integrity: sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==}
+ dependencies:
+ spdx-correct: 3.2.0
+ spdx-expression-parse: 3.0.1
+ dev: true
+
+ /validator@13.15.20:
+ resolution: {integrity: sha512-KxPOq3V2LmfQPP4eqf3Mq/zrT0Dqp2Vmx2Bn285LwVahLc+CsxOM0crBHczm8ijlcjZ0Q5Xd6LW3z3odTPnlrw==}
+ engines: {node: '>= 0.10'}
+ dev: true
+
+ /varint@5.0.2:
+ resolution: {integrity: sha512-lKxKYG6H03yCZUpAGOPOsMcGxd1RHCu1iKvEHYDPmTyq2HueGhD73ssNBqqQWfvYs04G9iUFRvmAVLW20Jw6ow==}
+ dev: true
+
+ /vary@1.1.2:
+ resolution: {integrity: sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==}
+ engines: {node: '>= 0.8'}
+ dev: true
+
+ /verror@1.10.0:
+ resolution: {integrity: sha512-ZZKSmDAEFOijERBLkmYfJ+vmk3w+7hOLYDNkRCuRuMJGEmqYNCNLyBBFwWKVMhfwaEF3WOd0Zlw86U/WC/+nYw==}
+ engines: {'0': node >=0.6.0}
+ dependencies:
+ assert-plus: 1.0.0
+ core-util-is: 1.0.2
+ extsprintf: 1.3.0
+ dev: true
+
+ /walker@1.0.8:
+ resolution: {integrity: sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ==}
+ dependencies:
+ makeerror: 1.0.12
+ dev: true
+
+ /web3-bzz@1.10.4:
+ resolution: {integrity: sha512-ZZ/X4sJ0Uh2teU9lAGNS8EjveEppoHNQiKlOXAjedsrdWuaMErBPdLQjXfcrYvN6WM6Su9PMsAxf3FXXZ+HwQw==}
+ engines: {node: '>=8.0.0'}
+ requiresBuild: true
+ dependencies:
+ '@types/node': 12.20.55
+ got: 12.1.0
+ swarm-js: 0.1.42
+ transitivePeerDependencies:
+ - bufferutil
+ - supports-color
+ - utf-8-validate
+ dev: true
+
+ /web3-core-helpers@1.10.4:
+ resolution: {integrity: sha512-r+L5ylA17JlD1vwS8rjhWr0qg7zVoVMDvWhajWA5r5+USdh91jRUYosp19Kd1m2vE034v7Dfqe1xYRoH2zvG0g==}
+ engines: {node: '>=8.0.0'}
+ dependencies:
+ web3-eth-iban: 1.10.4
+ web3-utils: 1.10.4
+ dev: true
+
+ /web3-core-method@1.10.4:
+ resolution: {integrity: sha512-uZTb7flr+Xl6LaDsyTeE2L1TylokCJwTDrIVfIfnrGmnwLc6bmTWCCrm71sSrQ0hqs6vp/MKbQYIYqUN0J8WyA==}
+ engines: {node: '>=8.0.0'}
+ dependencies:
+ '@ethersproject/transactions': 5.8.0
+ web3-core-helpers: 1.10.4
+ web3-core-promievent: 1.10.4
+ web3-core-subscriptions: 1.10.4
+ web3-utils: 1.10.4
+ dev: true
+
+ /web3-core-promievent@1.10.4:
+ resolution: {integrity: sha512-2de5WnJQ72YcIhYwV/jHLc4/cWJnznuoGTJGD29ncFQHAfwW/MItHFSVKPPA5v8AhJe+r6y4Y12EKvZKjQVBvQ==}
+ engines: {node: '>=8.0.0'}
+ dependencies:
+ eventemitter3: 4.0.4
+ dev: true
+
+ /web3-core-requestmanager@1.10.4:
+ resolution: {integrity: sha512-vqP6pKH8RrhT/2MoaU+DY/OsYK9h7HmEBNCdoMj+4ZwujQtw/Mq2JifjwsJ7gits7Q+HWJwx8q6WmQoVZAWugg==}
+ engines: {node: '>=8.0.0'}
+ dependencies:
+ util: 0.12.5
+ web3-core-helpers: 1.10.4
+ web3-providers-http: 1.10.4
+ web3-providers-ipc: 1.10.4
+ web3-providers-ws: 1.10.4
+ transitivePeerDependencies:
+ - encoding
+ - supports-color
+ dev: true
+
+ /web3-core-subscriptions@1.10.4:
+ resolution: {integrity: sha512-o0lSQo/N/f7/L76C0HV63+S54loXiE9fUPfHFcTtpJRQNDBVsSDdWRdePbWwR206XlsBqD5VHApck1//jEafTw==}
+ engines: {node: '>=8.0.0'}
+ dependencies:
+ eventemitter3: 4.0.4
+ web3-core-helpers: 1.10.4
+ dev: true
+
+ /web3-core@1.10.4:
+ resolution: {integrity: sha512-B6elffYm81MYZDTrat7aEhnhdtVE3lDBUZft16Z8awYMZYJDbnykEbJVS+l3mnA7AQTnSDr/1MjWofGDLBJPww==}
+ engines: {node: '>=8.0.0'}
+ dependencies:
+ '@types/bn.js': 5.2.0
+ '@types/node': 12.20.55
+ bignumber.js: 9.3.1
+ web3-core-helpers: 1.10.4
+ web3-core-method: 1.10.4
+ web3-core-requestmanager: 1.10.4
+ web3-utils: 1.10.4
+ transitivePeerDependencies:
+ - encoding
+ - supports-color
+ dev: true
+
+ /web3-eth-abi@1.10.4:
+ resolution: {integrity: sha512-cZ0q65eJIkd/jyOlQPDjr8X4fU6CRL1eWgdLwbWEpo++MPU/2P4PFk5ZLAdye9T5Sdp+MomePPJ/gHjLMj2VfQ==}
+ engines: {node: '>=8.0.0'}
+ dependencies:
+ '@ethersproject/abi': 5.8.0
+ web3-utils: 1.10.4
+ dev: true
+
+ /web3-eth-accounts@1.10.4:
+ resolution: {integrity: sha512-ysy5sVTg9snYS7tJjxVoQAH6DTOTkRGR8emEVCWNGLGiB9txj+qDvSeT0izjurS/g7D5xlMAgrEHLK1Vi6I3yg==}
+ engines: {node: '>=8.0.0'}
+ dependencies:
+ '@ethereumjs/common': 2.6.5
+ '@ethereumjs/tx': 3.5.2
+ '@ethereumjs/util': 8.1.0
+ eth-lib: 0.2.8
+ scrypt-js: 3.0.1
+ uuid: 9.0.1
+ web3-core: 1.10.4
+ web3-core-helpers: 1.10.4
+ web3-core-method: 1.10.4
+ web3-utils: 1.10.4
+ transitivePeerDependencies:
+ - encoding
+ - supports-color
+ dev: true
+
+ /web3-eth-contract@1.10.4:
+ resolution: {integrity: sha512-Q8PfolOJ4eV9TvnTj1TGdZ4RarpSLmHnUnzVxZ/6/NiTfe4maJz99R0ISgwZkntLhLRtw0C7LRJuklzGYCNN3A==}
+ engines: {node: '>=8.0.0'}
+ dependencies:
+ '@types/bn.js': 5.2.0
+ web3-core: 1.10.4
+ web3-core-helpers: 1.10.4
+ web3-core-method: 1.10.4
+ web3-core-promievent: 1.10.4
+ web3-core-subscriptions: 1.10.4
+ web3-eth-abi: 1.10.4
+ web3-utils: 1.10.4
+ transitivePeerDependencies:
+ - encoding
+ - supports-color
+ dev: true
+
+ /web3-eth-ens@1.10.4:
+ resolution: {integrity: sha512-LLrvxuFeVooRVZ9e5T6OWKVflHPFgrVjJ/jtisRWcmI7KN/b64+D/wJzXqgmp6CNsMQcE7rpmf4CQmJCrTdsgg==}
+ engines: {node: '>=8.0.0'}
+ dependencies:
+ content-hash: 2.5.2
+ eth-ens-namehash: 2.0.8
+ web3-core: 1.10.4
+ web3-core-helpers: 1.10.4
+ web3-core-promievent: 1.10.4
+ web3-eth-abi: 1.10.4
+ web3-eth-contract: 1.10.4
+ web3-utils: 1.10.4
+ transitivePeerDependencies:
+ - encoding
+ - supports-color
+ dev: true
+
+ /web3-eth-iban@1.10.4:
+ resolution: {integrity: sha512-0gE5iNmOkmtBmbKH2aTodeompnNE8jEyvwFJ6s/AF6jkw9ky9Op9cqfzS56AYAbrqEFuClsqB/AoRves7LDELw==}
+ engines: {node: '>=8.0.0'}
+ dependencies:
+ bn.js: 5.2.2
+ web3-utils: 1.10.4
+ dev: true
+
+ /web3-eth-personal@1.10.4:
+ resolution: {integrity: sha512-BRa/hs6jU1hKHz+AC/YkM71RP3f0Yci1dPk4paOic53R4ZZG4MgwKRkJhgt3/GPuPliwS46f/i5A7fEGBT4F9w==}
+ engines: {node: '>=8.0.0'}
+ dependencies:
+ '@types/node': 12.20.55
+ web3-core: 1.10.4
+ web3-core-helpers: 1.10.4
+ web3-core-method: 1.10.4
+ web3-net: 1.10.4
+ web3-utils: 1.10.4
+ transitivePeerDependencies:
+ - encoding
+ - supports-color
+ dev: true
+
+ /web3-eth@1.10.4:
+ resolution: {integrity: sha512-Sql2kYKmgt+T/cgvg7b9ce24uLS7xbFrxE4kuuor1zSCGrjhTJ5rRNG8gTJUkAJGKJc7KgnWmgW+cOfMBPUDSA==}
+ engines: {node: '>=8.0.0'}
+ dependencies:
+ web3-core: 1.10.4
+ web3-core-helpers: 1.10.4
+ web3-core-method: 1.10.4
+ web3-core-subscriptions: 1.10.4
+ web3-eth-abi: 1.10.4
+ web3-eth-accounts: 1.10.4
+ web3-eth-contract: 1.10.4
+ web3-eth-ens: 1.10.4
+ web3-eth-iban: 1.10.4
+ web3-eth-personal: 1.10.4
+ web3-net: 1.10.4
+ web3-utils: 1.10.4
+ transitivePeerDependencies:
+ - encoding
+ - supports-color
+ dev: true
+
+ /web3-net@1.10.4:
+ resolution: {integrity: sha512-mKINnhOOnZ4koA+yV2OT5s5ztVjIx7IY9a03w6s+yao/BUn+Luuty0/keNemZxTr1E8Ehvtn28vbOtW7Ids+Ow==}
+ engines: {node: '>=8.0.0'}
+ dependencies:
+ web3-core: 1.10.4
+ web3-core-method: 1.10.4
+ web3-utils: 1.10.4
+ transitivePeerDependencies:
+ - encoding
+ - supports-color
+ dev: true
+
+ /web3-providers-http@1.10.4:
+ resolution: {integrity: sha512-m2P5Idc8hdiO0l60O6DSCPw0kw64Zgi0pMjbEFRmxKIck2Py57RQMu4bxvkxJwkF06SlGaEQF8rFZBmuX7aagQ==}
+ engines: {node: '>=8.0.0'}
+ dependencies:
+ abortcontroller-polyfill: 1.7.8
+ cross-fetch: 4.1.0
+ es6-promise: 4.2.8
+ web3-core-helpers: 1.10.4
+ transitivePeerDependencies:
+ - encoding
+ dev: true
+
+ /web3-providers-ipc@1.10.4:
+ resolution: {integrity: sha512-YRF/bpQk9z3WwjT+A6FI/GmWRCASgd+gC0si7f9zbBWLXjwzYAKG73bQBaFRAHex1hl4CVcM5WUMaQXf3Opeuw==}
+ engines: {node: '>=8.0.0'}
+ dependencies:
+ oboe: 2.1.5
+ web3-core-helpers: 1.10.4
+ dev: true
+
+ /web3-providers-ws@1.10.4:
+ resolution: {integrity: sha512-j3FBMifyuFFmUIPVQR4pj+t5ILhAexAui0opgcpu9R5LxQrLRUZxHSnU+YO25UycSOa/NAX8A+qkqZNpcFAlxA==}
+ engines: {node: '>=8.0.0'}
+ dependencies:
+ eventemitter3: 4.0.4
+ web3-core-helpers: 1.10.4
+ websocket: 1.0.35
+ transitivePeerDependencies:
+ - supports-color
+ dev: true
+
+ /web3-shh@1.10.4:
+ resolution: {integrity: sha512-cOH6iFFM71lCNwSQrC3niqDXagMqrdfFW85hC9PFUrAr3PUrIem8TNstTc3xna2bwZeWG6OBy99xSIhBvyIACw==}
+ engines: {node: '>=8.0.0'}
+ requiresBuild: true
+ dependencies:
+ web3-core: 1.10.4
+ web3-core-method: 1.10.4
+ web3-core-subscriptions: 1.10.4
+ web3-net: 1.10.4
+ transitivePeerDependencies:
+ - encoding
+ - supports-color
+ dev: true
+
+ /web3-utils@1.10.4:
+ resolution: {integrity: sha512-tsu8FiKJLk2PzhDl9fXbGUWTkkVXYhtTA+SmEFkKft+9BgwLxfCRpU96sWv7ICC8zixBNd3JURVoiR3dUXgP8A==}
+ engines: {node: '>=8.0.0'}
+ dependencies:
+ '@ethereumjs/util': 8.1.0
+ bn.js: 5.2.2
+ ethereum-bloom-filters: 1.2.0
+ ethereum-cryptography: 2.2.1
+ ethjs-unit: 0.1.6
+ number-to-bn: 1.7.0
+ randombytes: 2.1.0
+ utf8: 3.0.0
+ dev: true
+
+ /web3@1.10.4:
+ resolution: {integrity: sha512-kgJvQZjkmjOEKimx/tJQsqWfRDPTTcBfYPa9XletxuHLpHcXdx67w8EFn5AW3eVxCutE9dTVHgGa9VYe8vgsEA==}
+ engines: {node: '>=8.0.0'}
+ requiresBuild: true
+ dependencies:
+ web3-bzz: 1.10.4
+ web3-core: 1.10.4
+ web3-eth: 1.10.4
+ web3-eth-personal: 1.10.4
+ web3-net: 1.10.4
+ web3-shh: 1.10.4
+ web3-utils: 1.10.4
+ transitivePeerDependencies:
+ - bufferutil
+ - encoding
+ - supports-color
+ - utf-8-validate
+ dev: true
+
+ /webidl-conversions@3.0.1:
+ resolution: {integrity: sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==}
+ dev: true
+
+ /websocket@1.0.35:
+ resolution: {integrity: sha512-/REy6amwPZl44DDzvRCkaI1q1bIiQB0mEFQLUrhz3z2EK91cp3n72rAjUlrTP0zV22HJIUOVHQGPxhFRjxjt+Q==}
+ engines: {node: '>=4.0.0'}
+ dependencies:
+ bufferutil: 4.0.9
+ debug: 2.6.9
+ es5-ext: 0.10.64
+ typedarray-to-buffer: 3.1.5
+ utf-8-validate: 5.0.10
+ yaeti: 0.0.6
+ transitivePeerDependencies:
+ - supports-color
+ dev: true
+
+ /whatwg-url@5.0.0:
+ resolution: {integrity: sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==}
+ dependencies:
+ tr46: 0.0.3
+ webidl-conversions: 3.0.1
+ dev: true
+
+ /which-boxed-primitive@1.1.1:
+ resolution: {integrity: sha512-TbX3mj8n0odCBFVlY8AxkqcHASw3L60jIuF8jFP78az3C2YhmGvqbHBpAjTRH2/xqYunrJ9g1jSyjCjpoWzIAA==}
+ engines: {node: '>= 0.4'}
+ dependencies:
+ is-bigint: 1.1.0
+ is-boolean-object: 1.2.2
+ is-number-object: 1.1.1
+ is-string: 1.1.1
+ is-symbol: 1.1.1
+ dev: true
+
+ /which-builtin-type@1.2.1:
+ resolution: {integrity: sha512-6iBczoX+kDQ7a3+YJBnh3T+KZRxM/iYNPXicqk66/Qfm1b93iu+yOImkg0zHbj5LNOcNv1TEADiZ0xa34B4q6Q==}
+ engines: {node: '>= 0.4'}
+ dependencies:
+ call-bound: 1.0.4
+ function.prototype.name: 1.1.8
+ has-tostringtag: 1.0.2
+ is-async-function: 2.1.1
+ is-date-object: 1.1.0
+ is-finalizationregistry: 1.1.1
+ is-generator-function: 1.1.2
+ is-regex: 1.2.1
+ is-weakref: 1.1.1
+ isarray: 2.0.5
+ which-boxed-primitive: 1.1.1
+ which-collection: 1.0.2
+ which-typed-array: 1.1.19
+ dev: true
+
+ /which-collection@1.0.2:
+ resolution: {integrity: sha512-K4jVyjnBdgvc86Y6BkaLZEN933SwYOuBFkdmBu9ZfkcAbdVbpITnDmjvZ/aQjRXQrv5EPkTnD1s39GiiqbngCw==}
+ engines: {node: '>= 0.4'}
+ dependencies:
+ is-map: 2.0.3
+ is-set: 2.0.3
+ is-weakmap: 2.0.2
+ is-weakset: 2.0.4
+ dev: true
+
+ /which-module@1.0.0:
+ resolution: {integrity: sha512-F6+WgncZi/mJDrammbTuHe1q0R5hOXv/mBaiNA2TCNT/LTHusX0V+CJnj9XT8ki5ln2UZyyddDgHfCzyrOH7MQ==}
+ dev: true
+
+ /which-typed-array@1.1.19:
+ resolution: {integrity: sha512-rEvr90Bck4WZt9HHFC4DJMsjvu7x+r6bImz0/BrbWb7A2djJ8hnZMrWnHo9F8ssv0OMErasDhftrfROTyqSDrw==}
+ engines: {node: '>= 0.4'}
+ dependencies:
+ available-typed-arrays: 1.0.7
+ call-bind: 1.0.8
+ call-bound: 1.0.4
+ for-each: 0.3.5
+ get-proto: 1.0.1
+ gopd: 1.2.0
+ has-tostringtag: 1.0.2
+ dev: true
+
+ /which@2.0.2:
+ resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==}
+ engines: {node: '>= 8'}
+ hasBin: true
+ dependencies:
+ isexe: 2.0.0
+ dev: true
+
+ /widest-line@3.1.0:
+ resolution: {integrity: sha512-NsmoXalsWVDMGupxZ5R08ka9flZjjiLvHVAWYOKtiKM8ujtZWr9cRffak+uSE48+Ob8ObalXpwyeUiyDD6QFgg==}
+ engines: {node: '>=8'}
+ dependencies:
+ string-width: 4.2.3
+ dev: true
+
+ /wif@5.0.0:
+ resolution: {integrity: sha512-iFzrC/9ne740qFbNjTZ2FciSRJlHIXoxqk/Y5EnE08QOXu1WjJyCCswwDTYbohAOEnlCtLaAAQBhyaLRFh2hMA==}
+ dependencies:
+ bs58check: 4.0.0
+ dev: true
+
+ /window-size@0.2.0:
+ resolution: {integrity: sha512-UD7d8HFA2+PZsbKyaOCEy8gMh1oDtHgJh1LfgjQ4zVXmYjAT/kvz3PueITKuqDiIXQe7yzpPnxX3lNc+AhQMyw==}
+ engines: {node: '>= 0.10.0'}
+ hasBin: true
+ dev: true
+
+ /winston-transport@4.9.0:
+ resolution: {integrity: sha512-8drMJ4rkgaPo1Me4zD/3WLfI/zPdA9o2IipKODunnGDcuqbHwjsbB79ylv04LCGGzU0xQ6vTznOMpQGaLhhm6A==}
+ engines: {node: '>= 12.0.0'}
+ dependencies:
+ logform: 2.7.0
+ readable-stream: 3.6.2
+ triple-beam: 1.4.1
+ dev: true
+
+ /winston@3.18.3:
+ resolution: {integrity: sha512-NoBZauFNNWENgsnC9YpgyYwOVrl2m58PpQ8lNHjV3kosGs7KJ7Npk9pCUE+WJlawVSe8mykWDKWFSVfs3QO9ww==}
+ engines: {node: '>= 12.0.0'}
+ dependencies:
+ '@colors/colors': 1.6.0
+ '@dabh/diagnostics': 2.0.8
+ async: 3.2.6
+ is-stream: 2.0.1
+ logform: 2.7.0
+ one-time: 1.0.0
+ readable-stream: 3.6.2
+ safe-stable-stringify: 2.5.0
+ stack-trace: 0.0.10
+ triple-beam: 1.4.1
+ winston-transport: 4.9.0
+ dev: true
+
+ /word-wrap@1.2.5:
+ resolution: {integrity: sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==}
+ engines: {node: '>=0.10.0'}
+ dev: true
+
+ /wordwrapjs@4.0.1:
+ resolution: {integrity: sha512-kKlNACbvHrkpIw6oPeYDSmdCTu2hdMHoyXLTcUKala++lx5Y+wjJ/e474Jqv5abnVmwxw08DiTuHmw69lJGksA==}
+ engines: {node: '>=8.0.0'}
+ dependencies:
+ reduce-flatten: 2.0.0
+ typical: 5.2.0
+ dev: true
+
+ /workerpool@6.5.1:
+ resolution: {integrity: sha512-Fs4dNYcsdpYSAfVxhnl1L5zTksjvOJxtC5hzMNl+1t9B8hTJTdKDyZ5ju7ztgPy+ft9tBFXoOlDNiOT9WUXZlA==}
+ dev: true
+
+ /wrap-ansi@2.1.0:
+ resolution: {integrity: sha512-vAaEaDM946gbNpH5pLVNR+vX2ht6n0Bt3GXwVB1AuAqZosOvHNF3P7wDnh8KLkSqgUh0uh77le7Owgoz+Z9XBw==}
+ engines: {node: '>=0.10.0'}
+ dependencies:
+ string-width: 1.0.2
+ strip-ansi: 3.0.1
+ dev: true
+
+ /wrap-ansi@6.2.0:
+ resolution: {integrity: sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==}
+ engines: {node: '>=8'}
+ dependencies:
+ ansi-styles: 4.3.0
+ string-width: 4.2.3
+ strip-ansi: 6.0.1
+ dev: true
+
+ /wrap-ansi@7.0.0:
+ resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==}
+ engines: {node: '>=10'}
+ dependencies:
+ ansi-styles: 4.3.0
+ string-width: 4.2.3
+ strip-ansi: 6.0.1
+ dev: true
+
+ /wrappy@1.0.2:
+ resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==}
+ dev: true
+
+ /write-file-atomic@4.0.2:
+ resolution: {integrity: sha512-7KxauUdBmSdWnmpaGFg+ppNjKF8uNLry8LyzjauQDOVONfFLNKrKvQOxZ/VuTIcS/gge/YNahf5RIIQWTSarlg==}
+ engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0}
+ dependencies:
+ imurmurhash: 0.1.4
+ signal-exit: 3.0.7
+ dev: true
+
+ /ws@3.3.3:
+ resolution: {integrity: sha512-nnWLa/NwZSt4KQJu51MYlCcSQ5g7INpOrOMt4XV8j4dqTXdmlUmSHQ8/oLC069ckre0fRsgfvsKwbTdtKLCDkA==}
+ peerDependencies:
+ bufferutil: ^4.0.1
+ utf-8-validate: ^5.0.2
+ peerDependenciesMeta:
+ bufferutil:
+ optional: true
+ utf-8-validate:
+ optional: true
+ dependencies:
+ async-limiter: 1.0.1
+ safe-buffer: 5.1.2
+ ultron: 1.1.1
+ dev: true
+
+ /ws@7.5.10:
+ resolution: {integrity: sha512-+dbF1tHwZpXcbOJdVOkzLDxZP1ailvSxM6ZweXTegylPny803bFhA+vqBYw4s31NSAk4S2Qz+AKXK9a4wkdjcQ==}
+ engines: {node: '>=8.3.0'}
+ peerDependencies:
+ bufferutil: ^4.0.1
+ utf-8-validate: ^5.0.2
+ peerDependenciesMeta:
+ bufferutil:
+ optional: true
+ utf-8-validate:
+ optional: true
+ dev: true
+
+ /ws@8.18.0:
+ resolution: {integrity: sha512-8VbfWfHLbbwu3+N6OKsOMpBdT4kXPDDB9cJk2bJ6mh9ucxdlnNvH1e+roYkKmN9Nxw2yjz7VzeO9oOz2zJ04Pw==}
+ engines: {node: '>=10.0.0'}
+ peerDependencies:
+ bufferutil: ^4.0.1
+ utf-8-validate: '>=5.0.2'
+ peerDependenciesMeta:
+ bufferutil:
+ optional: true
+ utf-8-validate:
+ optional: true
+ dev: true
+
+ /ws@8.18.3(bufferutil@4.0.9)(utf-8-validate@5.0.10):
+ resolution: {integrity: sha512-PEIGCY5tSlUt50cqyMXfCzX+oOPqN0vuGqWzbcJ2xvnkzkq46oOpz7dQaTDBdfICb4N14+GARUDw2XV2N4tvzg==}
+ engines: {node: '>=10.0.0'}
+ peerDependencies:
+ bufferutil: ^4.0.1
+ utf-8-validate: '>=5.0.2'
+ peerDependenciesMeta:
+ bufferutil:
+ optional: true
+ utf-8-validate:
+ optional: true
+ dependencies:
+ bufferutil: 4.0.9
+ utf-8-validate: 5.0.10
+ dev: true
+
+ /xhr-request-promise@0.1.3:
+ resolution: {integrity: sha512-YUBytBsuwgitWtdRzXDDkWAXzhdGB8bYm0sSzMPZT7Z2MBjMSTHFsyCT1yCRATY+XC69DUrQraRAEgcoCRaIPg==}
+ dependencies:
+ xhr-request: 1.1.0
+ dev: true
+
+ /xhr-request@1.1.0:
+ resolution: {integrity: sha512-Y7qzEaR3FDtL3fP30k9wO/e+FBnBByZeybKOhASsGP30NIkRAAkKD/sCnLvgEfAIEC1rcmK7YG8f4oEnIrrWzA==}
+ dependencies:
+ buffer-to-arraybuffer: 0.0.5
+ object-assign: 4.1.1
+ query-string: 5.1.1
+ simple-get: 2.8.2
+ timed-out: 4.0.1
+ url-set-query: 1.0.0
+ xhr: 2.6.0
+ dev: true
+
+ /xhr@2.6.0:
+ resolution: {integrity: sha512-/eCGLb5rxjx5e3mF1A7s+pLlR6CGyqWN91fv1JgER5mVWg1MZmlhBvy9kjcsOdRk8RrIujotWyJamfyrp+WIcA==}
+ dependencies:
+ global: 4.4.0
+ is-function: 1.0.2
+ parse-headers: 2.0.6
+ xtend: 4.0.2
+ dev: true
+
+ /xtend@4.0.2:
+ resolution: {integrity: sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==}
+ engines: {node: '>=0.4'}
+ dev: true
+
+ /y18n@3.2.2:
+ resolution: {integrity: sha512-uGZHXkHnhF0XeeAPgnKfPv1bgKAYyVvmNL1xlKsPYZPaIHxGti2hHqvOCQv71XMsLxu1QjergkqogUnms5D3YQ==}
+ dev: true
+
+ /y18n@5.0.8:
+ resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==}
+ engines: {node: '>=10'}
+ dev: true
+
+ /yaeti@0.0.6:
+ resolution: {integrity: sha512-MvQa//+KcZCUkBTIC9blM+CU9J2GzuTytsOUwf2lidtvkx/6gnEp1QvJv34t9vdjhFmha/mUiNDbN0D0mJWdug==}
+ engines: {node: '>=0.10.32'}
+ deprecated: Package no longer supported. Contact Support at https://www.npmjs.com/support for more info.
+ dev: true
+
+ /yallist@3.1.1:
+ resolution: {integrity: sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==}
+ dev: true
+
+ /yargs-parser@2.4.1:
+ resolution: {integrity: sha512-9pIKIJhnI5tonzG6OnCFlz/yln8xHYcGl+pn3xR0Vzff0vzN1PbNRaelgfgRUwZ3s4i3jvxT9WhmUGL4whnasA==}
+ dependencies:
+ camelcase: 3.0.0
+ lodash.assign: 4.2.0
+ dev: true
+
+ /yargs-parser@20.2.9:
+ resolution: {integrity: sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==}
+ engines: {node: '>=10'}
+ dev: true
+
+ /yargs-parser@21.1.1:
+ resolution: {integrity: sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==}
+ engines: {node: '>=12'}
+ dev: true
+
+ /yargs-unparser@2.0.0:
+ resolution: {integrity: sha512-7pRTIA9Qc1caZ0bZ6RYRGbHJthJWuakf+WmHK0rVeLkNrrGhfoabBNdue6kdINI6r4if7ocq9aD/n7xwKOdzOA==}
+ engines: {node: '>=10'}
+ dependencies:
+ camelcase: 6.3.0
+ decamelize: 4.0.0
+ flat: 5.0.2
+ is-plain-obj: 2.1.0
+ dev: true
+
+ /yargs@16.2.0:
+ resolution: {integrity: sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==}
+ engines: {node: '>=10'}
+ dependencies:
+ cliui: 7.0.4
+ escalade: 3.2.0
+ get-caller-file: 2.0.5
+ require-directory: 2.1.1
+ string-width: 4.2.3
+ y18n: 5.0.8
+ yargs-parser: 20.2.9
+ dev: true
+
+ /yargs@17.7.2:
+ resolution: {integrity: sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==}
+ engines: {node: '>=12'}
+ dependencies:
+ cliui: 8.0.1
+ escalade: 3.2.0
+ get-caller-file: 2.0.5
+ require-directory: 2.1.1
+ string-width: 4.2.3
+ y18n: 5.0.8
+ yargs-parser: 21.1.1
+ dev: true
+
+ /yargs@4.8.1:
+ resolution: {integrity: sha512-LqodLrnIDM3IFT+Hf/5sxBnEGECrfdC1uIbgZeJmESCSo4HoCAaKEus8MylXHAkdacGc0ye+Qa+dpkuom8uVYA==}
+ dependencies:
+ cliui: 3.2.0
+ decamelize: 1.2.0
+ get-caller-file: 1.0.3
+ lodash.assign: 4.2.0
+ os-locale: 1.4.0
+ read-pkg-up: 1.0.1
+ require-directory: 2.1.1
+ require-main-filename: 1.0.1
+ set-blocking: 2.0.0
+ string-width: 1.0.2
+ which-module: 1.0.0
+ window-size: 0.2.0
+ y18n: 3.2.2
+ yargs-parser: 2.4.1
+ dev: true
+
+ /yn@3.1.1:
+ resolution: {integrity: sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==}
+ engines: {node: '>=6'}
+ dev: true
+
+ /yocto-queue@0.1.0:
+ resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==}
+ engines: {node: '>=10'}
+ dev: true
+
+ /yoga-layout-prebuilt@1.10.0:
+ resolution: {integrity: sha512-YnOmtSbv4MTf7RGJMK0FvZ+KD8OEe/J5BNnR0GHhD8J/XcG/Qvxgszm0Un6FTHWW4uHlTgP0IztiXQnGyIR45g==}
+ engines: {node: '>=8'}
+ dependencies:
+ '@types/yoga-layout': 1.9.2
+ dev: true
+
+ /zksync-ethers@5.11.0(ethers@5.8.0):
+ resolution: {integrity: sha512-oLwfjfVfHYjxMeDjmB3Kb+I0W0fwau5k6ZFSJJS0/gEYyu5A6AZIJV08NP/RnG30V5XP46u6Ld3Dw6HYkESJ+A==}
+ engines: {node: '>=16.0.0'}
+ peerDependencies:
+ ethers: ^5.7.2
+ dependencies:
+ ethers: 5.8.0
+ dev: true
+
+ /zksync-web3@0.14.4(ethers@5.8.0):
+ resolution: {integrity: sha512-kYehMD/S6Uhe1g434UnaMN+sBr9nQm23Ywn0EUP5BfQCsbjcr3ORuS68PosZw8xUTu3pac7G6YMSnNHk+fwzvg==}
+ deprecated: This package has been deprecated in favor of zksync-ethers@5.0.0
+ peerDependencies:
+ ethers: ^5.7.2
+ dependencies:
+ ethers: 5.8.0
+ dev: true
+
+ /zod@3.25.76:
+ resolution: {integrity: sha512-gzUt/qt81nXsFGKIFcC3YnfEAx5NkunCfnDlvuBSSFS02bcXu4Lmea0AFIUwbLWxWPx3d9p8S5QoaujKcNQxcQ==}
+ dev: true
diff --git a/examples/oft-main/programs/endpoint-mock/Cargo.toml b/examples/oft-main/programs/endpoint-mock/Cargo.toml
new file mode 100644
index 0000000000..d886ecb0e6
--- /dev/null
+++ b/examples/oft-main/programs/endpoint-mock/Cargo.toml
@@ -0,0 +1,21 @@
+[package]
+name = "endpoint-mock"
+version = "0.1.0"
+description = "Endpoint Mock"
+edition = "2021"
+
+[lib]
+crate-type = ["cdylib", "lib"]
+name = "endpoint"
+
+[features]
+no-entrypoint = []
+no-idl = []
+no-log-ix-name = []
+cpi = ["no-entrypoint"]
+default = []
+idl-build = ["anchor-lang/idl-build"]
+
+[dependencies]
+anchor-lang = { version = "0.31.1", features = ["event-cpi"] }
+cpi-helper = { git = "https://github.com/LayerZero-Labs/LayerZero-v2.git", rev = "34321ac15e47e0dafd25d66659e2f3d1b9b6db8f" }
diff --git a/examples/oft-main/programs/endpoint-mock/Xargo.toml b/examples/oft-main/programs/endpoint-mock/Xargo.toml
new file mode 100644
index 0000000000..475fb71ed1
--- /dev/null
+++ b/examples/oft-main/programs/endpoint-mock/Xargo.toml
@@ -0,0 +1,2 @@
+[target.bpfel-unknown-unknown.dependencies.std]
+features = []
diff --git a/examples/oft-main/programs/endpoint-mock/src/instructions/mod.rs b/examples/oft-main/programs/endpoint-mock/src/instructions/mod.rs
new file mode 100644
index 0000000000..7e79a19da7
--- /dev/null
+++ b/examples/oft-main/programs/endpoint-mock/src/instructions/mod.rs
@@ -0,0 +1,3 @@
+pub mod oapp;
+
+pub use oapp::*;
diff --git a/examples/oft-main/programs/endpoint-mock/src/instructions/oapp/mod.rs b/examples/oft-main/programs/endpoint-mock/src/instructions/oapp/mod.rs
new file mode 100644
index 0000000000..54d7fe2130
--- /dev/null
+++ b/examples/oft-main/programs/endpoint-mock/src/instructions/oapp/mod.rs
@@ -0,0 +1,3 @@
+pub mod register_oapp;
+
+pub use register_oapp::*;
diff --git a/examples/oft-main/programs/endpoint-mock/src/instructions/oapp/register_oapp.rs b/examples/oft-main/programs/endpoint-mock/src/instructions/oapp/register_oapp.rs
new file mode 100644
index 0000000000..5da8dfd3ee
--- /dev/null
+++ b/examples/oft-main/programs/endpoint-mock/src/instructions/oapp/register_oapp.rs
@@ -0,0 +1,35 @@
+use crate::*;
+
+use cpi_helper::CpiContext;
+
+#[event_cpi]
+#[derive(CpiContext, Accounts)]
+#[instruction(params: RegisterOAppParams)]
+pub struct RegisterOApp<'info> {
+ #[account(mut)]
+ pub payer: Signer<'info>,
+ /// The PDA of the OApp
+ pub oapp: Signer<'info>,
+ #[account(
+ init,
+ payer = payer,
+ space = 8 + OAppRegistry::INIT_SPACE,
+ seeds = [OAPP_SEED, oapp.key.as_ref()],
+ bump
+ )]
+ pub oapp_registry: Account<'info, OAppRegistry>,
+ pub system_program: Program<'info, System>,
+}
+
+impl RegisterOApp<'_> {
+ pub fn apply(ctx: &mut Context, params: &RegisterOAppParams) -> Result<()> {
+ ctx.accounts.oapp_registry.delegate = params.delegate;
+ ctx.accounts.oapp_registry.bump = ctx.bumps.oapp_registry;
+ Ok(())
+ }
+}
+
+#[derive(Clone, AnchorSerialize, AnchorDeserialize)]
+pub struct RegisterOAppParams {
+ pub delegate: Pubkey,
+}
diff --git a/examples/oft-main/programs/endpoint-mock/src/lib.rs b/examples/oft-main/programs/endpoint-mock/src/lib.rs
new file mode 100644
index 0000000000..2afd6555e6
--- /dev/null
+++ b/examples/oft-main/programs/endpoint-mock/src/lib.rs
@@ -0,0 +1,19 @@
+pub mod instructions;
+pub mod state;
+
+use anchor_lang::prelude::*;
+use instructions::*;
+use state::*;
+
+declare_id!("6xmPjYnXyxz36xcKkv2zCrZc72LK5hQ9xzY3EjeZ59MV");
+
+pub const OAPP_SEED: &[u8] = b"OApp";
+
+#[program]
+pub mod endpoint {
+ use super::*;
+
+ pub fn register_oapp(mut ctx: Context, params: RegisterOAppParams) -> Result<()> {
+ RegisterOApp::apply(&mut ctx, ¶ms)
+ }
+}
diff --git a/examples/oft-main/programs/endpoint-mock/src/state/endpoint.rs b/examples/oft-main/programs/endpoint-mock/src/state/endpoint.rs
new file mode 100644
index 0000000000..42ff5cbd63
--- /dev/null
+++ b/examples/oft-main/programs/endpoint-mock/src/state/endpoint.rs
@@ -0,0 +1,8 @@
+use crate::*;
+
+#[account]
+#[derive(InitSpace)]
+pub struct OAppRegistry {
+ pub delegate: Pubkey,
+ pub bump: u8,
+}
diff --git a/examples/oft-main/programs/endpoint-mock/src/state/mod.rs b/examples/oft-main/programs/endpoint-mock/src/state/mod.rs
new file mode 100644
index 0000000000..86edb11f43
--- /dev/null
+++ b/examples/oft-main/programs/endpoint-mock/src/state/mod.rs
@@ -0,0 +1,3 @@
+pub mod endpoint;
+
+pub use endpoint::*;
diff --git a/examples/oft-main/programs/oft/Cargo.toml b/examples/oft-main/programs/oft/Cargo.toml
new file mode 100644
index 0000000000..b6c491c859
--- /dev/null
+++ b/examples/oft-main/programs/oft/Cargo.toml
@@ -0,0 +1,24 @@
+[package]
+name = "oft"
+version = "0.1.0"
+description = "Created with Anchor"
+edition = "2021"
+
+[lib]
+crate-type = ["cdylib", "lib"]
+name = "oft"
+
+[features]
+no-entrypoint = []
+no-idl = []
+no-log-ix-name = []
+cpi = ["no-entrypoint"]
+default = []
+idl-build = ["anchor-lang/idl-build", "anchor-spl/idl-build", "oapp/idl-build"]
+
+[dependencies]
+anchor-lang = { version = "0.31.1", features = ["init-if-needed"] }
+anchor-spl = "0.31.1"
+oapp = { package = "oapp-latest", git = "https://github.com/LayerZero-Labs/LayerZero-v2.git", rev = "c09287a" }
+utils = { package = "utils-latest", git = "https://github.com/LayerZero-Labs/LayerZero-v2.git", rev = "c09287a" }
+solana-helper = "0.1.0"
\ No newline at end of file
diff --git a/examples/oft-main/programs/oft/Xargo.toml b/examples/oft-main/programs/oft/Xargo.toml
new file mode 100644
index 0000000000..475fb71ed1
--- /dev/null
+++ b/examples/oft-main/programs/oft/Xargo.toml
@@ -0,0 +1,2 @@
+[target.bpfel-unknown-unknown.dependencies.std]
+features = []
diff --git a/examples/oft-main/programs/oft/build.rs b/examples/oft-main/programs/oft/build.rs
new file mode 100644
index 0000000000..8859933ee3
--- /dev/null
+++ b/examples/oft-main/programs/oft/build.rs
@@ -0,0 +1,3 @@
+fn main() {
+ println!("cargo:rerun-if-env-changed=OFT_ID");
+}
diff --git a/examples/oft-main/programs/oft/src/compose_msg_codec.rs b/examples/oft-main/programs/oft/src/compose_msg_codec.rs
new file mode 100644
index 0000000000..7716b37325
--- /dev/null
+++ b/examples/oft-main/programs/oft/src/compose_msg_codec.rs
@@ -0,0 +1,51 @@
+const NONCE_OFFSET: usize = 0;
+const SRC_EID_OFFSET: usize = 8;
+const AMOUNT_LD_OFFSET: usize = 12;
+const COMPOSE_FROM_OFFSET: usize = 20;
+const COMPOSE_MSG_OFFSET: usize = 52;
+
+pub fn encode(
+ nonce: u64,
+ src_eid: u32,
+ amount_ld: u64,
+ compose_msg: &Vec, // [composeFrom][composeMsg]
+) -> Vec {
+ let mut encoded = Vec::with_capacity(20 + compose_msg.len()); // 8 + 4 + 8
+ encoded.extend_from_slice(&nonce.to_be_bytes());
+ encoded.extend_from_slice(&src_eid.to_be_bytes());
+ encoded.extend_from_slice(&amount_ld.to_be_bytes());
+ encoded.extend_from_slice(&compose_msg);
+ encoded
+}
+
+pub fn nonce(message: &[u8]) -> u64 {
+ let mut nonce_bytes = [0; 8];
+ nonce_bytes.copy_from_slice(&message[NONCE_OFFSET..SRC_EID_OFFSET]);
+ u64::from_be_bytes(nonce_bytes)
+}
+
+pub fn src_eid(message: &[u8]) -> u32 {
+ let mut src_eid_bytes = [0; 4];
+ src_eid_bytes.copy_from_slice(&message[SRC_EID_OFFSET..AMOUNT_LD_OFFSET]);
+ u32::from_be_bytes(src_eid_bytes)
+}
+
+pub fn amount_ld(message: &[u8]) -> u64 {
+ let mut amount_ld_bytes = [0; 8];
+ amount_ld_bytes.copy_from_slice(&message[AMOUNT_LD_OFFSET..COMPOSE_FROM_OFFSET]);
+ u64::from_be_bytes(amount_ld_bytes)
+}
+
+pub fn compose_from(message: &[u8]) -> [u8; 32] {
+ let mut compose_from = [0; 32];
+ compose_from.copy_from_slice(&message[COMPOSE_FROM_OFFSET..COMPOSE_MSG_OFFSET]);
+ compose_from
+}
+
+pub fn compose_msg(message: &[u8]) -> Vec {
+ if message.len() > COMPOSE_MSG_OFFSET {
+ message[COMPOSE_MSG_OFFSET..].to_vec()
+ } else {
+ Vec::new()
+ }
+}
diff --git a/examples/oft-main/programs/oft/src/errors.rs b/examples/oft-main/programs/oft/src/errors.rs
new file mode 100644
index 0000000000..92d764507b
--- /dev/null
+++ b/examples/oft-main/programs/oft/src/errors.rs
@@ -0,0 +1,14 @@
+use anchor_lang::prelude::error_code;
+
+#[error_code]
+pub enum OFTError {
+ Unauthorized,
+ InvalidSender,
+ InvalidDecimals,
+ SlippageExceeded,
+ InvalidTokenDest,
+ RateLimitExceeded,
+ InvalidFee,
+ InvalidMintAuthority,
+ Paused,
+}
diff --git a/examples/oft-main/programs/oft/src/events.rs b/examples/oft-main/programs/oft/src/events.rs
new file mode 100644
index 0000000000..367df4572f
--- /dev/null
+++ b/examples/oft-main/programs/oft/src/events.rs
@@ -0,0 +1,18 @@
+use crate::*;
+
+#[event]
+pub struct OFTSent {
+ pub guid: [u8; 32],
+ pub dst_eid: u32,
+ pub from: Pubkey,
+ pub amount_sent_ld: u64,
+ pub amount_received_ld: u64,
+}
+
+#[event]
+pub struct OFTReceived {
+ pub guid: [u8; 32],
+ pub src_eid: u32,
+ pub to: Pubkey,
+ pub amount_received_ld: u64,
+}
diff --git a/examples/oft-main/programs/oft/src/instructions/init_oft.rs b/examples/oft-main/programs/oft/src/instructions/init_oft.rs
new file mode 100644
index 0000000000..95ba9966f7
--- /dev/null
+++ b/examples/oft-main/programs/oft/src/instructions/init_oft.rs
@@ -0,0 +1,86 @@
+use crate::*;
+use anchor_spl::token_interface::{Mint, TokenAccount, TokenInterface};
+use oapp::endpoint::{instructions::RegisterOAppParams, ID as ENDPOINT_ID};
+
+#[derive(Accounts)]
+pub struct InitOFT<'info> {
+ #[account(mut)]
+ pub payer: Signer<'info>,
+ #[account(
+ init,
+ payer = payer,
+ space = 8 + OFTStore::INIT_SPACE,
+ seeds = [OFT_SEED, token_escrow.key().as_ref()],
+ bump
+ )]
+ pub oft_store: Account<'info, OFTStore>,
+ #[account(
+ init,
+ payer = payer,
+ space = 8 + LzReceiveTypesAccounts::INIT_SPACE,
+ seeds = [LZ_RECEIVE_TYPES_SEED, oft_store.key().as_ref()],
+ bump
+ )]
+ pub lz_receive_types_accounts: Account<'info, LzReceiveTypesAccounts>,
+ #[account(mint::token_program = token_program)]
+ pub token_mint: InterfaceAccount<'info, Mint>,
+ #[account(
+ init,
+ payer = payer,
+ token::authority = oft_store,
+ token::mint = token_mint,
+ token::token_program = token_program,
+ )]
+ pub token_escrow: InterfaceAccount<'info, TokenAccount>,
+ pub token_program: Interface<'info, TokenInterface>,
+ pub system_program: Program<'info, System>,
+}
+
+impl InitOFT<'_> {
+ pub fn apply(ctx: &mut Context, params: &InitOFTParams) -> Result<()> {
+ // Initialize the oft_store
+ ctx.accounts.oft_store.oft_type = params.oft_type.clone();
+ require!(
+ ctx.accounts.token_mint.decimals >= params.shared_decimals,
+ OFTError::InvalidDecimals
+ );
+ ctx.accounts.oft_store.ld2sd_rate =
+ 10u64.pow((ctx.accounts.token_mint.decimals - params.shared_decimals) as u32);
+ ctx.accounts.oft_store.token_mint = ctx.accounts.token_mint.key();
+ ctx.accounts.oft_store.token_escrow = ctx.accounts.token_escrow.key();
+ ctx.accounts.oft_store.endpoint_program =
+ if let Some(endpoint_program) = params.endpoint_program {
+ endpoint_program
+ } else {
+ ENDPOINT_ID
+ };
+ ctx.accounts.oft_store.bump = ctx.bumps.oft_store;
+ ctx.accounts.oft_store.tvl_ld = 0;
+ ctx.accounts.oft_store.admin = params.admin;
+ ctx.accounts.oft_store.default_fee_bps = 0;
+ ctx.accounts.oft_store.paused = false;
+ ctx.accounts.oft_store.pauser = None;
+ ctx.accounts.oft_store.unpauser = None;
+
+ // Initialize the lz_receive_types_accounts
+ ctx.accounts.lz_receive_types_accounts.oft_store = ctx.accounts.oft_store.key();
+ ctx.accounts.lz_receive_types_accounts.token_mint = ctx.accounts.token_mint.key();
+
+ // Register the oapp
+ oapp::endpoint_cpi::register_oapp(
+ ctx.accounts.oft_store.endpoint_program,
+ ctx.accounts.oft_store.key(),
+ ctx.remaining_accounts,
+ &[OFT_SEED, ctx.accounts.token_escrow.key().as_ref(), &[ctx.bumps.oft_store]],
+ RegisterOAppParams { delegate: params.admin },
+ )
+ }
+}
+
+#[derive(Clone, AnchorSerialize, AnchorDeserialize)]
+pub struct InitOFTParams {
+ pub oft_type: OFTType,
+ pub admin: Pubkey,
+ pub shared_decimals: u8,
+ pub endpoint_program: Option,
+}
diff --git a/examples/oft-main/programs/oft/src/instructions/lz_receive.rs b/examples/oft-main/programs/oft/src/instructions/lz_receive.rs
new file mode 100644
index 0000000000..2059d7adfb
--- /dev/null
+++ b/examples/oft-main/programs/oft/src/instructions/lz_receive.rs
@@ -0,0 +1,183 @@
+use crate::*;
+use anchor_lang::solana_program;
+use anchor_spl::{
+ associated_token::AssociatedToken,
+ token_2022::spl_token_2022::{self, solana_program::program_option::COption},
+ token_interface::{self, Mint, TokenAccount, TokenInterface, TransferChecked},
+};
+use oapp::endpoint::{
+ cpi::accounts::Clear,
+ instructions::{ClearParams, SendComposeParams},
+ ConstructCPIContext,
+};
+
+#[event_cpi]
+#[derive(Accounts)]
+#[instruction(params: LzReceiveParams)]
+pub struct LzReceive<'info> {
+ #[account(mut)]
+ pub payer: Signer<'info>,
+ #[account(
+ mut,
+ seeds = [
+ PEER_SEED,
+ oft_store.key().as_ref(),
+ ¶ms.src_eid.to_be_bytes()
+ ],
+ bump = peer.bump,
+ constraint = peer.peer_address == params.sender @OFTError::InvalidSender
+ )]
+ pub peer: Account<'info, PeerConfig>,
+ #[account(
+ mut,
+ seeds = [OFT_SEED, oft_store.token_escrow.as_ref()],
+ bump = oft_store.bump
+ )]
+ pub oft_store: Account<'info, OFTStore>,
+ #[account(
+ mut,
+ address = oft_store.token_escrow,
+ token::authority = oft_store,
+ token::mint = token_mint,
+ token::token_program = token_program
+ )]
+ pub token_escrow: InterfaceAccount<'info, TokenAccount>,
+ /// CHECK: the wallet address to receive the token
+ #[account(address = Pubkey::from(msg_codec::send_to(¶ms.message)) @OFTError::InvalidTokenDest)]
+ pub to_address: AccountInfo<'info>,
+ #[account(
+ init_if_needed,
+ payer = payer,
+ associated_token::mint = token_mint,
+ associated_token::authority = to_address,
+ associated_token::token_program = token_program
+ )]
+ pub token_dest: InterfaceAccount<'info, TokenAccount>,
+ #[account(
+ mut,
+ address = oft_store.token_mint,
+ mint::token_program = token_program
+ )]
+ pub token_mint: InterfaceAccount<'info, Mint>,
+ // Only used for native mint, the mint authority can be:
+ // 1. a spl-token multisig account with oft_store as one of the signers, and the quorum **MUST** be 1-of-n. (recommended)
+ // 2. or the mint_authority is oft_store itself.
+ #[account(constraint = token_mint.mint_authority == COption::Some(mint_authority.key()) @OFTError::InvalidMintAuthority)]
+ pub mint_authority: Option>,
+ pub token_program: Interface<'info, TokenInterface>,
+ pub associated_token_program: Program<'info, AssociatedToken>,
+ pub system_program: Program<'info, System>,
+}
+
+impl LzReceive<'_> {
+ pub fn apply(ctx: &mut Context, params: &LzReceiveParams) -> Result<()> {
+ require!(!ctx.accounts.oft_store.paused, OFTError::Paused);
+
+ let oft_store_seed = ctx.accounts.token_escrow.key();
+ let seeds: &[&[u8]] = &[OFT_SEED, oft_store_seed.as_ref(), &[ctx.accounts.oft_store.bump]];
+
+ // Validate and clear the payload
+ let accounts_for_clear = &ctx.remaining_accounts[0..Clear::MIN_ACCOUNTS_LEN];
+ let _ = oapp::endpoint_cpi::clear(
+ ctx.accounts.oft_store.endpoint_program,
+ ctx.accounts.oft_store.key(),
+ accounts_for_clear,
+ seeds,
+ ClearParams {
+ receiver: ctx.accounts.oft_store.key(),
+ src_eid: params.src_eid,
+ sender: params.sender,
+ nonce: params.nonce,
+ guid: params.guid,
+ message: params.message.clone(),
+ },
+ )?;
+
+ // Convert the amount from sd to ld
+ let amount_sd = msg_codec::amount_sd(¶ms.message);
+ let mut amount_received_ld = ctx.accounts.oft_store.sd2ld(amount_sd);
+
+ // Consume the inbound rate limiter
+ if let Some(rate_limiter) = ctx.accounts.peer.inbound_rate_limiter.as_mut() {
+ rate_limiter.try_consume(amount_received_ld)?;
+ }
+ // Refill the outbound rate limiter
+ if let Some(rate_limiter) = ctx.accounts.peer.outbound_rate_limiter.as_mut() {
+ rate_limiter.refill(amount_received_ld)?;
+ }
+
+ if ctx.accounts.oft_store.oft_type == OFTType::Adapter {
+ // unlock from escrow
+ ctx.accounts.oft_store.tvl_ld -= amount_received_ld;
+ token_interface::transfer_checked(
+ CpiContext::new(
+ ctx.accounts.token_program.to_account_info(),
+ TransferChecked {
+ from: ctx.accounts.token_escrow.to_account_info(),
+ mint: ctx.accounts.token_mint.to_account_info(),
+ to: ctx.accounts.token_dest.to_account_info(),
+ authority: ctx.accounts.oft_store.to_account_info(),
+ },
+ )
+ .with_signer(&[&seeds]),
+ amount_received_ld,
+ ctx.accounts.token_mint.decimals,
+ )?;
+
+ // update the amount_received_ld with the post transfer fee amount
+ amount_received_ld =
+ get_post_fee_amount_ld(&ctx.accounts.token_mint, amount_received_ld)?
+ } else if let Some(mint_authority) = &ctx.accounts.mint_authority {
+ // Native type
+ // mint
+ let ix = spl_token_2022::instruction::mint_to(
+ ctx.accounts.token_program.key,
+ &ctx.accounts.token_mint.key(),
+ &ctx.accounts.token_dest.key(),
+ mint_authority.key,
+ &[&ctx.accounts.oft_store.key()],
+ amount_received_ld,
+ )?;
+ solana_program::program::invoke_signed(
+ &ix,
+ &[
+ ctx.accounts.token_dest.to_account_info(),
+ ctx.accounts.token_mint.to_account_info(),
+ mint_authority.to_account_info(),
+ ctx.accounts.oft_store.to_account_info(),
+ ],
+ &[&seeds],
+ )?;
+ } else {
+ return Err(OFTError::InvalidMintAuthority.into());
+ }
+
+ if let Some(message) = msg_codec::compose_msg(¶ms.message) {
+ oapp::endpoint_cpi::send_compose(
+ ctx.accounts.oft_store.endpoint_program,
+ ctx.accounts.oft_store.key(),
+ &ctx.remaining_accounts[Clear::MIN_ACCOUNTS_LEN..],
+ seeds,
+ SendComposeParams {
+ to: ctx.accounts.to_address.key(),
+ guid: params.guid,
+ index: 0, // only 1 compose msg per lzReceive
+ message: compose_msg_codec::encode(
+ params.nonce,
+ params.src_eid,
+ amount_received_ld,
+ &message,
+ ),
+ },
+ )?;
+ }
+
+ emit_cpi!(OFTReceived {
+ guid: params.guid,
+ src_eid: params.src_eid,
+ to: ctx.accounts.to_address.key(),
+ amount_received_ld,
+ });
+ Ok(())
+ }
+}
diff --git a/examples/oft-main/programs/oft/src/instructions/lz_receive_types.rs b/examples/oft-main/programs/oft/src/instructions/lz_receive_types.rs
new file mode 100644
index 0000000000..a63ee61334
--- /dev/null
+++ b/examples/oft-main/programs/oft/src/instructions/lz_receive_types.rs
@@ -0,0 +1,139 @@
+use crate::*;
+use anchor_lang::solana_program;
+use anchor_spl::{
+ associated_token::{get_associated_token_address_with_program_id, ID as ASSOCIATED_TOKEN_ID},
+ token_2022::spl_token_2022::solana_program::program_option::COption,
+ token_interface::Mint,
+};
+use oapp::endpoint_cpi::LzAccount;
+
+#[derive(Accounts)]
+pub struct LzReceiveTypes<'info> {
+ #[account(
+ seeds = [OFT_SEED, oft_store.token_escrow.as_ref()],
+ bump = oft_store.bump
+ )]
+ pub oft_store: Account<'info, OFTStore>,
+ #[account(address = oft_store.token_mint)]
+ pub token_mint: InterfaceAccount<'info, Mint>,
+}
+
+// account structure
+// account 0 - payer (executor)
+// account 1 - peer
+// account 2 - oft store
+// account 3 - token escrow
+// account 4 - to address / wallet address
+// account 5 - token dest
+// account 6 - token mint
+// account 7 - mint authority (optional)
+// account 8 - token program
+// account 9 - associated token program
+// account 10 - system program
+// account 11 - event authority
+// account 12 - this program
+// account remaining accounts
+// 0..9 - accounts for clear
+// 9..16 - accounts for compose
+impl LzReceiveTypes<'_> {
+ pub fn apply(
+ ctx: &Context,
+ params: &LzReceiveParams,
+ ) -> Result> {
+ let (peer, _) = Pubkey::find_program_address(
+ &[PEER_SEED, ctx.accounts.oft_store.key().as_ref(), ¶ms.src_eid.to_be_bytes()],
+ ctx.program_id,
+ );
+
+ // account 0..3
+ let mut accounts = vec![
+ LzAccount { pubkey: Pubkey::default(), is_signer: true, is_writable: true }, // 0
+ LzAccount { pubkey: peer, is_signer: false, is_writable: true }, // 1
+ LzAccount { pubkey: ctx.accounts.oft_store.key(), is_signer: false, is_writable: true }, // 2
+ LzAccount {
+ pubkey: ctx.accounts.oft_store.token_escrow.key(),
+ is_signer: false,
+ is_writable: true,
+ }, // 3
+ ];
+
+ // account 4..9
+ let to_address = Pubkey::from(msg_codec::send_to(¶ms.message));
+ let token_program = ctx.accounts.token_mint.to_account_info().owner;
+ let token_dest = get_associated_token_address_with_program_id(
+ &to_address,
+ &ctx.accounts.oft_store.token_mint,
+ token_program,
+ );
+ let mint_authority =
+ if let COption::Some(mint_authority) = ctx.accounts.token_mint.mint_authority {
+ mint_authority
+ } else {
+ ctx.program_id.key()
+ };
+ accounts.extend_from_slice(&[
+ LzAccount { pubkey: to_address, is_signer: false, is_writable: false }, // 4
+ LzAccount { pubkey: token_dest, is_signer: false, is_writable: true }, // 5
+ LzAccount {
+ pubkey: ctx.accounts.token_mint.key(),
+ is_signer: false,
+ is_writable: true,
+ }, // 6
+ LzAccount { pubkey: mint_authority, is_signer: false, is_writable: false }, // 7
+ LzAccount { pubkey: *token_program, is_signer: false, is_writable: false }, // 8
+ LzAccount { pubkey: ASSOCIATED_TOKEN_ID, is_signer: false, is_writable: false }, // 9
+ ]);
+
+ // account 10..12
+ let (event_authority_account, _) =
+ Pubkey::find_program_address(&[oapp::endpoint_cpi::EVENT_SEED], &ctx.program_id);
+ accounts.extend_from_slice(&[
+ LzAccount {
+ pubkey: solana_program::system_program::ID,
+ is_signer: false,
+ is_writable: false,
+ }, // 10
+ LzAccount { pubkey: event_authority_account, is_signer: false, is_writable: false }, // 11
+ LzAccount { pubkey: ctx.program_id.key(), is_signer: false, is_writable: false }, // 12
+ ]);
+
+ let endpoint_program = ctx.accounts.oft_store.endpoint_program;
+ // remaining accounts 0..9
+ let accounts_for_clear = oapp::endpoint_cpi::get_accounts_for_clear(
+ endpoint_program,
+ &ctx.accounts.oft_store.key(),
+ params.src_eid,
+ ¶ms.sender,
+ params.nonce,
+ );
+ accounts.extend(accounts_for_clear);
+
+ // remaining accounts 9..16
+ if let Some(message) = msg_codec::compose_msg(¶ms.message) {
+ let amount_sd = msg_codec::amount_sd(¶ms.message);
+ let amount_ld = ctx.accounts.oft_store.sd2ld(amount_sd);
+ let amount_received_ld = if ctx.accounts.oft_store.oft_type == OFTType::Native {
+ amount_ld
+ } else {
+ get_post_fee_amount_ld(&ctx.accounts.token_mint, amount_ld)?
+ };
+
+ let accounts_for_composing = oapp::endpoint_cpi::get_accounts_for_send_compose(
+ endpoint_program,
+ &ctx.accounts.oft_store.key(),
+ &to_address,
+ ¶ms.guid,
+ 0,
+ &compose_msg_codec::encode(
+ params.nonce,
+ params.src_eid,
+ amount_received_ld,
+ &message,
+ ),
+ );
+ accounts.extend(accounts_for_composing);
+ }
+
+ Ok(accounts)
+ }
+}
diff --git a/examples/oft-main/programs/oft/src/instructions/mod.rs b/examples/oft-main/programs/oft/src/instructions/mod.rs
new file mode 100644
index 0000000000..7030177db4
--- /dev/null
+++ b/examples/oft-main/programs/oft/src/instructions/mod.rs
@@ -0,0 +1,21 @@
+pub mod init_oft;
+pub mod lz_receive;
+pub mod lz_receive_types;
+pub mod quote_oft;
+pub mod quote_send;
+pub mod send;
+pub mod set_oft_config;
+pub mod set_pause;
+pub mod set_peer_config;
+pub mod withdraw_fee;
+
+pub use init_oft::*;
+pub use lz_receive::*;
+pub use lz_receive_types::*;
+pub use quote_oft::*;
+pub use quote_send::*;
+pub use send::*;
+pub use set_oft_config::*;
+pub use set_pause::*;
+pub use set_peer_config::*;
+pub use withdraw_fee::*;
diff --git a/examples/oft-main/programs/oft/src/instructions/quote_oft.rs b/examples/oft-main/programs/oft/src/instructions/quote_oft.rs
new file mode 100644
index 0000000000..aba5707a73
--- /dev/null
+++ b/examples/oft-main/programs/oft/src/instructions/quote_oft.rs
@@ -0,0 +1,92 @@
+use crate::*;
+use anchor_spl::token_interface::Mint;
+
+#[derive(Accounts)]
+#[instruction(params: QuoteOFTParams)]
+pub struct QuoteOFT<'info> {
+ #[account(
+ seeds = [OFT_SEED, oft_store.token_escrow.as_ref()],
+ bump = oft_store.bump
+ )]
+ pub oft_store: Account<'info, OFTStore>,
+ #[account(
+ seeds = [
+ PEER_SEED,
+ oft_store.key().as_ref(),
+ ¶ms.dst_eid.to_be_bytes()
+ ],
+ bump = peer.bump
+ )]
+ pub peer: Account<'info, PeerConfig>,
+ #[account(address = oft_store.token_mint)]
+ pub token_mint: InterfaceAccount<'info, Mint>,
+}
+
+impl QuoteOFT<'_> {
+ pub fn apply(ctx: &Context, params: &QuoteOFTParams) -> Result {
+ require!(!ctx.accounts.oft_store.paused, OFTError::Paused);
+
+ let (amount_sent_ld, amount_received_ld, oft_fee_ld) = compute_fee_and_adjust_amount(
+ params.amount_ld,
+ &ctx.accounts.oft_store,
+ &ctx.accounts.token_mint,
+ ctx.accounts.peer.fee_bps,
+ )?;
+ require!(amount_received_ld >= params.min_amount_ld, OFTError::SlippageExceeded);
+
+ let oft_limits = OFTLimits { min_amount_ld: 0, max_amount_ld: 0xffffffffffffffff };
+ let mut oft_fee_details = if amount_received_ld + oft_fee_ld < amount_sent_ld {
+ vec![OFTFeeDetail {
+ fee_amount_ld: amount_sent_ld - oft_fee_ld - amount_received_ld,
+ description: "Token2022 Transfer Fee".to_string(),
+ }]
+ } else {
+ vec![]
+ };
+ // cross chain fee
+ if oft_fee_ld > 0 {
+ oft_fee_details.push(OFTFeeDetail {
+ fee_amount_ld: oft_fee_ld,
+ description: "Cross Chain Fee".to_string(),
+ });
+ }
+ let oft_receipt = OFTReceipt { amount_sent_ld, amount_received_ld };
+ Ok(QuoteOFTResult { oft_limits, oft_fee_details, oft_receipt })
+ }
+}
+
+#[derive(Clone, AnchorSerialize, AnchorDeserialize)]
+pub struct QuoteOFTParams {
+ pub dst_eid: u32,
+ pub to: [u8; 32],
+ pub amount_ld: u64,
+ pub min_amount_ld: u64,
+ pub options: Vec,
+ pub compose_msg: Option>,
+ pub pay_in_lz_token: bool,
+}
+
+#[derive(Clone, AnchorSerialize, AnchorDeserialize)]
+pub struct QuoteOFTResult {
+ pub oft_limits: OFTLimits,
+ pub oft_fee_details: Vec,
+ pub oft_receipt: OFTReceipt,
+}
+
+#[derive(Clone, AnchorSerialize, AnchorDeserialize)]
+pub struct OFTFeeDetail {
+ pub fee_amount_ld: u64,
+ pub description: String,
+}
+
+#[derive(Clone, AnchorSerialize, AnchorDeserialize)]
+pub struct OFTReceipt {
+ pub amount_sent_ld: u64,
+ pub amount_received_ld: u64,
+}
+
+#[derive(Clone, AnchorSerialize, AnchorDeserialize)]
+pub struct OFTLimits {
+ pub min_amount_ld: u64,
+ pub max_amount_ld: u64,
+}
diff --git a/examples/oft-main/programs/oft/src/instructions/quote_send.rs b/examples/oft-main/programs/oft/src/instructions/quote_send.rs
new file mode 100644
index 0000000000..efedefb9b4
--- /dev/null
+++ b/examples/oft-main/programs/oft/src/instructions/quote_send.rs
@@ -0,0 +1,193 @@
+use crate::*;
+use oapp::endpoint::{instructions::QuoteParams, MessagingFee};
+
+use anchor_spl::{
+ token_2022::spl_token_2022::{
+ extension::{
+ transfer_fee::{TransferFee, TransferFeeConfig},
+ BaseStateWithExtensions, StateWithExtensions,
+ },
+ state::Mint as MintState,
+ },
+ token_interface::Mint,
+};
+
+#[derive(Accounts)]
+#[instruction(params: QuoteSendParams)]
+pub struct QuoteSend<'info> {
+ #[account(
+ seeds = [OFT_SEED, oft_store.token_escrow.as_ref()],
+ bump = oft_store.bump
+ )]
+ pub oft_store: Account<'info, OFTStore>,
+ #[account(
+ seeds = [
+ PEER_SEED,
+ oft_store.key().as_ref(),
+ ¶ms.dst_eid.to_be_bytes()
+ ],
+ bump = peer.bump
+ )]
+ pub peer: Account<'info, PeerConfig>,
+ #[account(address = oft_store.token_mint)]
+ pub token_mint: InterfaceAccount<'info, Mint>,
+}
+
+impl QuoteSend<'_> {
+ pub fn apply(ctx: &Context, params: &QuoteSendParams) -> Result {
+ require!(!ctx.accounts.oft_store.paused, OFTError::Paused);
+
+ let (_, amount_received_ld, _) = compute_fee_and_adjust_amount(
+ params.amount_ld,
+ &ctx.accounts.oft_store,
+ &ctx.accounts.token_mint,
+ ctx.accounts.peer.fee_bps,
+ )?;
+ require!(amount_received_ld >= params.min_amount_ld, OFTError::SlippageExceeded);
+
+ // calling endpoint cpi
+ oapp::endpoint_cpi::quote(
+ ctx.accounts.oft_store.endpoint_program,
+ ctx.remaining_accounts,
+ QuoteParams {
+ sender: ctx.accounts.oft_store.key(),
+ dst_eid: params.dst_eid,
+ receiver: ctx.accounts.peer.peer_address,
+ message: msg_codec::encode(
+ params.to,
+ amount_received_ld,
+ Pubkey::default(),
+ ¶ms.compose_msg,
+ ),
+ pay_in_lz_token: params.pay_in_lz_token,
+ options: ctx
+ .accounts
+ .peer
+ .enforced_options
+ .combine_options(¶ms.compose_msg, ¶ms.options)?,
+ },
+ )
+ }
+}
+
+pub fn compute_fee_and_adjust_amount(
+ amount_ld: u64,
+ oft_store: &OFTStore,
+ token_mint: &InterfaceAccount,
+ fee_bps: Option,
+) -> Result<(u64, u64, u64)> {
+ let (amount_sent_ld, amount_received_ld, oft_fee_ld) = if OFTType::Adapter == oft_store.oft_type
+ {
+ let mut amount_received_ld =
+ oft_store.remove_dust(get_post_fee_amount_ld(token_mint, amount_ld)?);
+ let amount_sent_ld = get_pre_fee_amount_ld(token_mint, amount_received_ld)?;
+
+ // remove the oft fee from the amount_received_ld
+ let oft_fee_ld = oft_store.remove_dust(calculate_fee(
+ amount_received_ld,
+ oft_store.default_fee_bps,
+ fee_bps,
+ ));
+ amount_received_ld -= oft_fee_ld;
+ (amount_sent_ld, amount_received_ld, oft_fee_ld)
+ } else {
+ // if it is Native OFT, there is no transfer fee
+ let amount_sent_ld = oft_store.remove_dust(amount_ld);
+ let oft_fee_ld = oft_store.remove_dust(calculate_fee(
+ amount_sent_ld,
+ oft_store.default_fee_bps,
+ fee_bps,
+ ));
+ let amount_received_ld = amount_sent_ld - oft_fee_ld;
+ (amount_sent_ld, amount_received_ld, oft_fee_ld)
+ };
+ Ok((amount_sent_ld, amount_received_ld, oft_fee_ld))
+}
+
+fn calculate_fee(pre_fee_amount: u64, default_fee_bps: u16, fee_bps: Option) -> u64 {
+ let final_fee_bps = if let Some(bps) = fee_bps { bps as u128 } else { default_fee_bps as u128 };
+ if final_fee_bps == 0 || pre_fee_amount == 0 {
+ 0
+ } else {
+ // pre_fee_amount * final_fee_bps / ONE_IN_BASIS_POINTS
+ let fee = (pre_fee_amount as u128) * final_fee_bps;
+ (fee / ONE_IN_BASIS_POINTS) as u64
+ }
+}
+
+pub fn get_post_fee_amount_ld(token_mint: &InterfaceAccount, amount_ld: u64) -> Result {
+ let token_mint_info = token_mint.to_account_info();
+ let token_mint_data = token_mint_info.try_borrow_data()?;
+ let token_mint_ext = StateWithExtensions::::unpack(&token_mint_data)?;
+ let post_amount_ld =
+ if let Ok(transfer_fee_config) = token_mint_ext.get_extension::() {
+ transfer_fee_config
+ .get_epoch_fee(Clock::get()?.epoch)
+ .calculate_post_fee_amount(amount_ld)
+ .ok_or(ProgramError::InvalidArgument)?
+ } else {
+ amount_ld
+ };
+ Ok(post_amount_ld)
+}
+
+// Calculate the amount_sent_ld necessary to receive amount_received_ld
+// Does *not* de-dust any inputs or outputs.
+fn get_pre_fee_amount_ld(token_mint: &InterfaceAccount, amount_ld: u64) -> Result {
+ let token_mint_info = token_mint.to_account_info();
+ let token_mint_data = token_mint_info.try_borrow_data()?;
+ let token_mint_ext = StateWithExtensions::::unpack(&token_mint_data)?;
+ let pre_amount_ld =
+ if let Ok(transfer_fee) = token_mint_ext.get_extension::() {
+ calculate_pre_fee_amount(transfer_fee.get_epoch_fee(Clock::get()?.epoch), amount_ld)
+ .ok_or(ProgramError::InvalidArgument)?
+ } else {
+ amount_ld
+ };
+ Ok(pre_amount_ld)
+}
+
+// DO NOT CHANGE THIS CODE!!!
+// bug reported on token2022: https://github.com/solana-labs/solana-program-library/pull/6704/files
+// copy code over as fix has not been published
+pub const MAX_FEE_BASIS_POINTS: u16 = 10_000;
+const ONE_IN_BASIS_POINTS: u128 = MAX_FEE_BASIS_POINTS as u128;
+fn calculate_pre_fee_amount(fee: &TransferFee, post_fee_amount: u64) -> Option {
+ let maximum_fee = u64::from(fee.maximum_fee);
+ let transfer_fee_basis_points = u16::from(fee.transfer_fee_basis_points) as u128;
+ match (transfer_fee_basis_points, post_fee_amount) {
+ // no fee, same amount
+ (0, _) => Some(post_fee_amount),
+ // 0 zero out, 0 in
+ (_, 0) => Some(0),
+ // 100%, cap at max fee
+ (ONE_IN_BASIS_POINTS, _) => maximum_fee.checked_add(post_fee_amount),
+ _ => {
+ let numerator = (post_fee_amount as u128).checked_mul(ONE_IN_BASIS_POINTS)?;
+ let denominator = ONE_IN_BASIS_POINTS.checked_sub(transfer_fee_basis_points)?;
+ let raw_pre_fee_amount = ceil_div(numerator, denominator)?;
+
+ if raw_pre_fee_amount.checked_sub(post_fee_amount as u128)? >= maximum_fee as u128 {
+ post_fee_amount.checked_add(maximum_fee)
+ } else {
+ // should return `None` if `pre_fee_amount` overflows
+ u64::try_from(raw_pre_fee_amount).ok()
+ }
+ },
+ }
+}
+
+fn ceil_div(numerator: u128, denominator: u128) -> Option {
+ numerator.checked_add(denominator)?.checked_sub(1)?.checked_div(denominator)
+}
+
+#[derive(Clone, AnchorSerialize, AnchorDeserialize)]
+pub struct QuoteSendParams {
+ pub dst_eid: u32,
+ pub to: [u8; 32],
+ pub amount_ld: u64,
+ pub min_amount_ld: u64,
+ pub options: Vec,
+ pub compose_msg: Option>,
+ pub pay_in_lz_token: bool,
+}
diff --git a/examples/oft-main/programs/oft/src/instructions/send.rs b/examples/oft-main/programs/oft/src/instructions/send.rs
new file mode 100644
index 0000000000..4a839ca189
--- /dev/null
+++ b/examples/oft-main/programs/oft/src/instructions/send.rs
@@ -0,0 +1,175 @@
+use crate::*;
+use anchor_spl::token_interface::{
+ self, Burn, Mint, TokenAccount, TokenInterface, TransferChecked,
+};
+use oapp::endpoint::{instructions::SendParams as EndpointSendParams, MessagingReceipt};
+
+#[event_cpi]
+#[derive(Accounts)]
+#[instruction(params: SendParams)]
+pub struct Send<'info> {
+ pub signer: Signer<'info>,
+ #[account(
+ mut,
+ seeds = [
+ PEER_SEED,
+ oft_store.key().as_ref(),
+ ¶ms.dst_eid.to_be_bytes()
+ ],
+ bump = peer.bump
+ )]
+ pub peer: Account<'info, PeerConfig>,
+ #[account(
+ mut,
+ seeds = [OFT_SEED, oft_store.token_escrow.as_ref()],
+ bump = oft_store.bump
+ )]
+ pub oft_store: Account<'info, OFTStore>,
+ #[account(
+ mut,
+ token::authority = signer,
+ token::mint = token_mint,
+ token::token_program = token_program
+ )]
+ pub token_source: InterfaceAccount<'info, TokenAccount>,
+ #[account(
+ mut,
+ address = oft_store.token_escrow,
+ token::authority = oft_store.key(),
+ token::mint = token_mint,
+ token::token_program = token_program
+ )]
+ pub token_escrow: InterfaceAccount<'info, TokenAccount>,
+ #[account(
+ mut,
+ address = oft_store.token_mint,
+ mint::token_program = token_program
+ )]
+ pub token_mint: InterfaceAccount<'info, Mint>,
+ pub token_program: Interface<'info, TokenInterface>,
+}
+
+impl Send<'_> {
+ pub fn apply(
+ ctx: &mut Context,
+ params: &SendParams,
+ ) -> Result<(MessagingReceipt, OFTReceipt)> {
+ require!(!ctx.accounts.oft_store.paused, OFTError::Paused);
+
+ let (amount_sent_ld, amount_received_ld, oft_fee_ld) = compute_fee_and_adjust_amount(
+ params.amount_ld,
+ &ctx.accounts.oft_store,
+ &ctx.accounts.token_mint,
+ ctx.accounts.peer.fee_bps,
+ )?;
+ require!(amount_received_ld >= params.min_amount_ld, OFTError::SlippageExceeded);
+
+ if let Some(rate_limiter) = ctx.accounts.peer.outbound_rate_limiter.as_mut() {
+ rate_limiter.try_consume(amount_received_ld)?;
+ }
+ if let Some(rate_limiter) = ctx.accounts.peer.inbound_rate_limiter.as_mut() {
+ rate_limiter.refill(amount_received_ld)?;
+ }
+
+ if ctx.accounts.oft_store.oft_type == OFTType::Adapter {
+ // transfer all tokens to escrow with fee
+ ctx.accounts.oft_store.tvl_ld += amount_received_ld;
+ token_interface::transfer_checked(
+ CpiContext::new(
+ ctx.accounts.token_program.to_account_info(),
+ TransferChecked {
+ from: ctx.accounts.token_source.to_account_info(),
+ mint: ctx.accounts.token_mint.to_account_info(),
+ to: ctx.accounts.token_escrow.to_account_info(),
+ authority: ctx.accounts.signer.to_account_info(),
+ },
+ ),
+ amount_sent_ld,
+ ctx.accounts.token_mint.decimals,
+ )?;
+ } else {
+ // Native type
+ // burn
+ token_interface::burn(
+ CpiContext::new(
+ ctx.accounts.token_program.to_account_info(),
+ Burn {
+ mint: ctx.accounts.token_mint.to_account_info(),
+ from: ctx.accounts.token_source.to_account_info(),
+ authority: ctx.accounts.signer.to_account_info(),
+ },
+ ),
+ amount_sent_ld - oft_fee_ld,
+ )?;
+
+ // transfer fee to escrow
+ if oft_fee_ld > 0 {
+ token_interface::transfer_checked(
+ CpiContext::new(
+ ctx.accounts.token_program.to_account_info(),
+ TransferChecked {
+ from: ctx.accounts.token_source.to_account_info(),
+ mint: ctx.accounts.token_mint.to_account_info(),
+ to: ctx.accounts.token_escrow.to_account_info(),
+ authority: ctx.accounts.signer.to_account_info(),
+ },
+ ),
+ oft_fee_ld,
+ ctx.accounts.token_mint.decimals,
+ )?;
+ }
+ }
+
+ // send message to endpoint
+ require!(
+ ctx.accounts.oft_store.key() == ctx.remaining_accounts[1].key(),
+ OFTError::InvalidSender
+ );
+ let amount_sd = ctx.accounts.oft_store.ld2sd(amount_received_ld);
+ let msg_receipt = oapp::endpoint_cpi::send(
+ ctx.accounts.oft_store.endpoint_program,
+ ctx.accounts.oft_store.key(),
+ ctx.remaining_accounts,
+ &[OFT_SEED, ctx.accounts.token_escrow.key().as_ref(), &[ctx.accounts.oft_store.bump]],
+ EndpointSendParams {
+ dst_eid: params.dst_eid,
+ receiver: ctx.accounts.peer.peer_address,
+ message: msg_codec::encode(
+ params.to,
+ amount_sd,
+ ctx.accounts.signer.key(),
+ ¶ms.compose_msg,
+ ),
+ options: ctx
+ .accounts
+ .peer
+ .enforced_options
+ .combine_options(¶ms.compose_msg, ¶ms.options)?,
+ native_fee: params.native_fee,
+ lz_token_fee: params.lz_token_fee,
+ },
+ )?;
+
+ emit_cpi!(OFTSent {
+ guid: msg_receipt.guid,
+ dst_eid: params.dst_eid,
+ from: ctx.accounts.token_source.key(),
+ amount_sent_ld,
+ amount_received_ld
+ });
+
+ Ok((msg_receipt, OFTReceipt { amount_sent_ld, amount_received_ld }))
+ }
+}
+
+#[derive(Clone, AnchorSerialize, AnchorDeserialize)]
+pub struct SendParams {
+ pub dst_eid: u32,
+ pub to: [u8; 32],
+ pub amount_ld: u64,
+ pub min_amount_ld: u64,
+ pub options: Vec,
+ pub compose_msg: Option>,
+ pub native_fee: u64,
+ pub lz_token_fee: u64,
+}
diff --git a/examples/oft-main/programs/oft/src/instructions/set_oft_config.rs b/examples/oft-main/programs/oft/src/instructions/set_oft_config.rs
new file mode 100644
index 0000000000..d554a69abf
--- /dev/null
+++ b/examples/oft-main/programs/oft/src/instructions/set_oft_config.rs
@@ -0,0 +1,60 @@
+use crate::*;
+use oapp::endpoint::instructions::SetDelegateParams;
+
+#[derive(Accounts)]
+pub struct SetOFTConfig<'info> {
+ pub admin: Signer<'info>,
+ #[account(
+ mut,
+ seeds = [OFT_SEED, oft_store.token_escrow.as_ref()],
+ bump = oft_store.bump,
+ has_one = admin @OFTError::Unauthorized
+ )]
+ pub oft_store: Account<'info, OFTStore>,
+}
+
+impl SetOFTConfig<'_> {
+ pub fn apply(ctx: &mut Context, params: &SetOFTConfigParams) -> Result<()> {
+ match params.clone() {
+ SetOFTConfigParams::Admin(admin) => {
+ ctx.accounts.oft_store.admin = admin;
+ },
+ SetOFTConfigParams::Delegate(delegate) => {
+ let oft_store_seed = ctx.accounts.oft_store.token_escrow.key();
+ let seeds: &[&[u8]] =
+ &[OFT_SEED, &oft_store_seed.to_bytes(), &[ctx.accounts.oft_store.bump]];
+ let _ = oapp::endpoint_cpi::set_delegate(
+ ctx.accounts.oft_store.endpoint_program,
+ ctx.accounts.oft_store.key(),
+ &ctx.remaining_accounts,
+ seeds,
+ SetDelegateParams { delegate },
+ )?;
+ },
+ SetOFTConfigParams::DefaultFee(fee_bps) => {
+ require!(fee_bps < MAX_FEE_BASIS_POINTS, OFTError::InvalidFee);
+ ctx.accounts.oft_store.default_fee_bps = fee_bps;
+ },
+ SetOFTConfigParams::Paused(paused) => {
+ ctx.accounts.oft_store.paused = paused;
+ },
+ SetOFTConfigParams::Pauser(pauser) => {
+ ctx.accounts.oft_store.pauser = pauser;
+ },
+ SetOFTConfigParams::Unpauser(unpauser) => {
+ ctx.accounts.oft_store.unpauser = unpauser;
+ },
+ }
+ Ok(())
+ }
+}
+
+#[derive(Clone, AnchorSerialize, AnchorDeserialize)]
+pub enum SetOFTConfigParams {
+ Admin(Pubkey),
+ Delegate(Pubkey), // OApp delegate for the endpoint
+ DefaultFee(u16),
+ Paused(bool),
+ Pauser(Option),
+ Unpauser(Option),
+}
diff --git a/examples/oft-main/programs/oft/src/instructions/set_pause.rs b/examples/oft-main/programs/oft/src/instructions/set_pause.rs
new file mode 100644
index 0000000000..dfac3a113a
--- /dev/null
+++ b/examples/oft-main/programs/oft/src/instructions/set_pause.rs
@@ -0,0 +1,35 @@
+use crate::*;
+
+#[derive(Accounts)]
+#[instruction(params: SetPauseParams)]
+pub struct SetPause<'info> {
+ /// pauser or unpauser
+ pub signer: Signer<'info>,
+ #[account(
+ mut,
+ seeds = [OFT_SEED, oft_store.token_escrow.as_ref()],
+ bump = oft_store.bump,
+ constraint = is_valid_signer(signer.key(), &oft_store, params.paused) @OFTError::Unauthorized
+ )]
+ pub oft_store: Account<'info, OFTStore>,
+}
+
+impl SetPause<'_> {
+ pub fn apply(ctx: &mut Context, params: &SetPauseParams) -> Result<()> {
+ ctx.accounts.oft_store.paused = params.paused;
+ Ok(())
+ }
+}
+
+#[derive(Clone, AnchorSerialize, AnchorDeserialize)]
+pub struct SetPauseParams {
+ pub paused: bool,
+}
+
+fn is_valid_signer(signer: Pubkey, oft_store: &OFTStore, paused: bool) -> bool {
+ if paused {
+ oft_store.pauser == Some(signer)
+ } else {
+ oft_store.unpauser == Some(signer)
+ }
+}
diff --git a/examples/oft-main/programs/oft/src/instructions/set_peer_config.rs b/examples/oft-main/programs/oft/src/instructions/set_peer_config.rs
new file mode 100644
index 0000000000..d4d4ee58cd
--- /dev/null
+++ b/examples/oft-main/programs/oft/src/instructions/set_peer_config.rs
@@ -0,0 +1,99 @@
+use crate::*;
+
+#[derive(Accounts)]
+#[instruction(params: SetPeerConfigParams)]
+pub struct SetPeerConfig<'info> {
+ #[account(mut)]
+ pub admin: Signer<'info>,
+ #[account(
+ init_if_needed,
+ payer = admin,
+ space = 8 + PeerConfig::INIT_SPACE,
+ seeds = [PEER_SEED, oft_store.key().as_ref(), ¶ms.remote_eid.to_be_bytes()],
+ bump
+ )]
+ pub peer: Account<'info, PeerConfig>,
+ #[account(
+ seeds = [OFT_SEED, oft_store.token_escrow.as_ref()],
+ bump = oft_store.bump,
+ has_one = admin @OFTError::Unauthorized
+ )]
+ pub oft_store: Account<'info, OFTStore>,
+ pub system_program: Program<'info, System>,
+}
+
+impl SetPeerConfig<'_> {
+ pub fn apply(ctx: &mut Context, params: &SetPeerConfigParams) -> Result<()> {
+ match params.config.clone() {
+ PeerConfigParam::PeerAddress(peer_address) => {
+ ctx.accounts.peer.peer_address = peer_address;
+ },
+ PeerConfigParam::FeeBps(fee_bps) => {
+ if let Some(fee_bps) = fee_bps {
+ require!(fee_bps < MAX_FEE_BASIS_POINTS, OFTError::InvalidFee);
+ }
+ ctx.accounts.peer.fee_bps = fee_bps;
+ },
+ PeerConfigParam::EnforcedOptions { send, send_and_call } => {
+ oapp::options::assert_type_3(&send)?;
+ ctx.accounts.peer.enforced_options.send = send;
+ oapp::options::assert_type_3(&send_and_call)?;
+ ctx.accounts.peer.enforced_options.send_and_call = send_and_call;
+ },
+ PeerConfigParam::OutboundRateLimit(rate_limit_params) => {
+ Self::update_rate_limiter(
+ &mut ctx.accounts.peer.outbound_rate_limiter,
+ &rate_limit_params,
+ )?;
+ },
+ PeerConfigParam::InboundRateLimit(rate_limit_params) => {
+ Self::update_rate_limiter(
+ &mut ctx.accounts.peer.inbound_rate_limiter,
+ &rate_limit_params,
+ )?;
+ },
+ }
+ ctx.accounts.peer.bump = ctx.bumps.peer;
+ Ok(())
+ }
+
+ fn update_rate_limiter(
+ rate_limiter: &mut Option,
+ params: &Option,
+ ) -> Result<()> {
+ if let Some(param) = params {
+ let mut limiter = rate_limiter.clone().unwrap_or_default();
+ if let Some(capacity) = param.capacity {
+ limiter.set_capacity(capacity)?;
+ }
+ if let Some(refill_rate) = param.refill_per_second {
+ limiter.set_rate(refill_rate)?;
+ }
+ *rate_limiter = Some(limiter);
+ } else {
+ *rate_limiter = None;
+ }
+ Ok(())
+ }
+}
+
+#[derive(Clone, AnchorSerialize, AnchorDeserialize)]
+pub struct SetPeerConfigParams {
+ pub remote_eid: u32,
+ pub config: PeerConfigParam,
+}
+
+#[derive(Clone, AnchorSerialize, AnchorDeserialize)]
+pub enum PeerConfigParam {
+ PeerAddress([u8; 32]),
+ FeeBps(Option),
+ EnforcedOptions { send: Vec, send_and_call: Vec },
+ OutboundRateLimit(Option),
+ InboundRateLimit(Option),
+}
+
+#[derive(Clone, AnchorSerialize, AnchorDeserialize)]
+pub struct RateLimitParams {
+ pub refill_per_second: Option,
+ pub capacity: Option,
+}
diff --git a/examples/oft-main/programs/oft/src/instructions/withdraw_fee.rs b/examples/oft-main/programs/oft/src/instructions/withdraw_fee.rs
new file mode 100644
index 0000000000..762c46ae63
--- /dev/null
+++ b/examples/oft-main/programs/oft/src/instructions/withdraw_fee.rs
@@ -0,0 +1,67 @@
+use crate::*;
+use anchor_spl::token_interface::{self, Mint, TokenAccount, TokenInterface, TransferChecked};
+
+#[derive(Accounts)]
+pub struct WithdrawFee<'info> {
+ pub admin: Signer<'info>,
+ #[account(
+ seeds = [OFT_SEED, oft_store.token_escrow.as_ref()],
+ bump = oft_store.bump,
+ has_one = admin @OFTError::Unauthorized
+ )]
+ pub oft_store: Account<'info, OFTStore>,
+ #[account(
+ address = oft_store.token_mint,
+ mint::token_program = token_program
+ )]
+ pub token_mint: InterfaceAccount<'info, Mint>,
+ #[account(
+ mut,
+ address = oft_store.token_escrow,
+ token::authority = oft_store,
+ token::mint = token_mint,
+ token::token_program = token_program
+ )]
+ pub token_escrow: InterfaceAccount<'info, TokenAccount>,
+ #[account(
+ mut,
+ token::mint = token_mint,
+ token::token_program = token_program
+ )]
+ pub token_dest: InterfaceAccount<'info, TokenAccount>,
+ pub token_program: Interface<'info, TokenInterface>,
+}
+
+impl WithdrawFee<'_> {
+ pub fn apply(ctx: &mut Context, params: &WithdrawFeeParams) -> Result<()> {
+ require!(
+ ctx.accounts.token_escrow.amount - ctx.accounts.oft_store.tvl_ld >= params.fee_ld,
+ OFTError::InvalidFee
+ );
+ let seeds: &[&[u8]] = &[
+ OFT_SEED,
+ &ctx.accounts.token_escrow.key().to_bytes(),
+ &[ctx.accounts.oft_store.bump],
+ ];
+ token_interface::transfer_checked(
+ CpiContext::new(
+ ctx.accounts.token_program.to_account_info(),
+ TransferChecked {
+ from: ctx.accounts.token_escrow.to_account_info(),
+ mint: ctx.accounts.token_mint.to_account_info(),
+ to: ctx.accounts.token_dest.to_account_info(),
+ authority: ctx.accounts.oft_store.to_account_info(),
+ },
+ )
+ .with_signer(&[&seeds]),
+ params.fee_ld,
+ ctx.accounts.token_mint.decimals,
+ )?;
+ Ok(())
+ }
+}
+
+#[derive(Clone, AnchorSerialize, AnchorDeserialize)]
+pub struct WithdrawFeeParams {
+ pub fee_ld: u64,
+}
diff --git a/examples/oft-main/programs/oft/src/lib.rs b/examples/oft-main/programs/oft/src/lib.rs
new file mode 100644
index 0000000000..68b54b928f
--- /dev/null
+++ b/examples/oft-main/programs/oft/src/lib.rs
@@ -0,0 +1,101 @@
+use anchor_lang::prelude::*;
+
+pub mod compose_msg_codec;
+pub mod errors;
+pub mod events;
+pub mod instructions;
+pub mod msg_codec;
+pub mod state;
+
+use errors::*;
+use events::*;
+use instructions::*;
+use oapp::{
+ endpoint::{MessagingFee, MessagingReceipt},
+ LzReceiveParams,
+};
+use solana_helper::program_id_from_env;
+use state::*;
+
+declare_id!(Pubkey::new_from_array(program_id_from_env!(
+ "OFT_ID",
+ "9UovNrJD8pQyBLheeHNayuG1wJSEAoxkmM14vw5gcsTT"
+)));
+
+pub const OFT_SEED: &[u8] = b"OFT";
+pub const PEER_SEED: &[u8] = b"Peer";
+pub const ENFORCED_OPTIONS_SEED: &[u8] = b"EnforcedOptions";
+pub const LZ_RECEIVE_TYPES_SEED: &[u8] = oapp::LZ_RECEIVE_TYPES_SEED;
+
+#[program]
+pub mod oft {
+ use super::*;
+
+ pub fn oft_version(_ctx: Context) -> Result {
+ Ok(Version { interface: 2, message: 1 })
+ }
+
+ pub fn init_oft(mut ctx: Context, params: InitOFTParams) -> Result<()> {
+ InitOFT::apply(&mut ctx, ¶ms)
+ }
+
+ // ============================== Admin ==============================
+ pub fn set_oft_config(
+ mut ctx: Context,
+ params: SetOFTConfigParams,
+ ) -> Result<()> {
+ SetOFTConfig::apply(&mut ctx, ¶ms)
+ }
+
+ pub fn set_peer_config(
+ mut ctx: Context,
+ params: SetPeerConfigParams,
+ ) -> Result<()> {
+ SetPeerConfig::apply(&mut ctx, ¶ms)
+ }
+
+ pub fn set_pause(mut ctx: Context, params: SetPauseParams) -> Result<()> {
+ SetPause::apply(&mut ctx, ¶ms)
+ }
+
+ pub fn withdraw_fee(mut ctx: Context, params: WithdrawFeeParams) -> Result<()> {
+ WithdrawFee::apply(&mut ctx, ¶ms)
+ }
+
+ // ============================== Public ==============================
+
+ pub fn quote_oft(ctx: Context, params: QuoteOFTParams) -> Result {
+ QuoteOFT::apply(&ctx, ¶ms)
+ }
+
+ pub fn quote_send(ctx: Context, params: QuoteSendParams) -> Result {
+ QuoteSend::apply(&ctx, ¶ms)
+ }
+
+ pub fn send(
+ mut ctx: Context,
+ params: SendParams,
+ ) -> Result<(MessagingReceipt, OFTReceipt)> {
+ Send::apply(&mut ctx, ¶ms)
+ }
+
+ pub fn lz_receive(mut ctx: Context, params: LzReceiveParams) -> Result<()> {
+ LzReceive::apply(&mut ctx, ¶ms)
+ }
+
+ pub fn lz_receive_types(
+ ctx: Context,
+ params: LzReceiveParams,
+ ) -> Result> {
+ LzReceiveTypes::apply(&ctx, ¶ms)
+ }
+}
+
+#[derive(Accounts)]
+pub struct OFTVersion {}
+
+#[derive(Clone, AnchorSerialize, AnchorDeserialize)]
+pub struct Version {
+ pub interface: u64,
+ pub message: u64,
+}
diff --git a/examples/oft-main/programs/oft/src/msg_codec.rs b/examples/oft-main/programs/oft/src/msg_codec.rs
new file mode 100644
index 0000000000..47771d5900
--- /dev/null
+++ b/examples/oft-main/programs/oft/src/msg_codec.rs
@@ -0,0 +1,46 @@
+use crate::*;
+
+const SEND_TO_OFFSET: usize = 0;
+const SEND_AMOUNT_SD_OFFSET: usize = 32;
+const COMPOSE_MSG_OFFSET: usize = 40;
+
+pub fn encode(
+ send_to: [u8; 32],
+ amount_sd: u64,
+ sender: Pubkey,
+ compose_msg: &Option>,
+) -> Vec {
+ if let Some(msg) = compose_msg {
+ let mut encoded = Vec::with_capacity(72 + msg.len()); // 32 + 8 + 32
+ encoded.extend_from_slice(&send_to);
+ encoded.extend_from_slice(&amount_sd.to_be_bytes());
+ encoded.extend_from_slice(sender.to_bytes().as_ref());
+ encoded.extend_from_slice(&msg);
+ encoded
+ } else {
+ let mut encoded = Vec::with_capacity(40); // 32 + 8
+ encoded.extend_from_slice(&send_to);
+ encoded.extend_from_slice(&amount_sd.to_be_bytes());
+ encoded
+ }
+}
+
+pub fn send_to(message: &[u8]) -> [u8; 32] {
+ let mut send_to = [0; 32];
+ send_to.copy_from_slice(&message[SEND_TO_OFFSET..SEND_AMOUNT_SD_OFFSET]);
+ send_to
+}
+
+pub fn amount_sd(message: &[u8]) -> u64 {
+ let mut amount_sd_bytes = [0; 8];
+ amount_sd_bytes.copy_from_slice(&message[SEND_AMOUNT_SD_OFFSET..COMPOSE_MSG_OFFSET]);
+ u64::from_be_bytes(amount_sd_bytes)
+}
+
+pub fn compose_msg(message: &[u8]) -> Option> {
+ if message.len() > COMPOSE_MSG_OFFSET {
+ Some(message[COMPOSE_MSG_OFFSET..].to_vec())
+ } else {
+ None
+ }
+}
diff --git a/examples/oft-main/programs/oft/src/state/mod.rs b/examples/oft-main/programs/oft/src/state/mod.rs
new file mode 100644
index 0000000000..66db5699ba
--- /dev/null
+++ b/examples/oft-main/programs/oft/src/state/mod.rs
@@ -0,0 +1,5 @@
+pub mod oft;
+pub mod peer_config;
+
+pub use oft::*;
+pub use peer_config::*;
diff --git a/examples/oft-main/programs/oft/src/state/oft.rs b/examples/oft-main/programs/oft/src/state/oft.rs
new file mode 100644
index 0000000000..6cb97b5da5
--- /dev/null
+++ b/examples/oft-main/programs/oft/src/state/oft.rs
@@ -0,0 +1,50 @@
+use crate::*;
+
+#[account]
+#[derive(InitSpace)]
+pub struct OFTStore {
+ // immutable
+ pub oft_type: OFTType,
+ pub ld2sd_rate: u64,
+ pub token_mint: Pubkey,
+ pub token_escrow: Pubkey, // this account is used to hold TVL and fees
+ pub endpoint_program: Pubkey,
+ pub bump: u8,
+ // mutable
+ pub tvl_ld: u64, // total value locked. if oft_type is Native, it is always 0.
+ // configurable
+ pub admin: Pubkey,
+ pub default_fee_bps: u16,
+ pub paused: bool,
+ pub pauser: Option,
+ pub unpauser: Option,
+}
+
+#[derive(InitSpace, Clone, AnchorSerialize, AnchorDeserialize, PartialEq, Eq)]
+pub enum OFTType {
+ Native,
+ Adapter,
+}
+
+impl OFTStore {
+ pub fn ld2sd(&self, amount_ld: u64) -> u64 {
+ amount_ld / self.ld2sd_rate
+ }
+
+ pub fn sd2ld(&self, amount_sd: u64) -> u64 {
+ amount_sd * self.ld2sd_rate
+ }
+
+ pub fn remove_dust(&self, amount_ld: u64) -> u64 {
+ amount_ld - amount_ld % self.ld2sd_rate
+ }
+}
+
+/// LzReceiveTypesAccounts includes accounts that are used in the LzReceiveTypes
+/// instruction.
+#[account]
+#[derive(InitSpace)]
+pub struct LzReceiveTypesAccounts {
+ pub oft_store: Pubkey,
+ pub token_mint: Pubkey,
+}
diff --git a/examples/oft-main/programs/oft/src/state/peer_config.rs b/examples/oft-main/programs/oft/src/state/peer_config.rs
new file mode 100644
index 0000000000..2a64340874
--- /dev/null
+++ b/examples/oft-main/programs/oft/src/state/peer_config.rs
@@ -0,0 +1,92 @@
+use crate::*;
+
+pub const ENFORCED_OPTIONS_SEND_MAX_LEN: usize = 512;
+pub const ENFORCED_OPTIONS_SEND_AND_CALL_MAX_LEN: usize = 1024;
+
+#[account]
+#[derive(InitSpace)]
+pub struct PeerConfig {
+ pub peer_address: [u8; 32],
+ pub enforced_options: EnforcedOptions,
+ pub outbound_rate_limiter: Option,
+ pub inbound_rate_limiter: Option,
+ pub fee_bps: Option,
+ pub bump: u8,
+}
+
+#[derive(Clone, Default, AnchorSerialize, AnchorDeserialize, InitSpace)]
+pub struct RateLimiter {
+ pub capacity: u64,
+ pub tokens: u64,
+ pub refill_per_second: u64,
+ pub last_refill_time: u64,
+}
+
+impl RateLimiter {
+ pub fn set_rate(&mut self, refill_per_second: u64) -> Result<()> {
+ self.refill(0)?;
+ self.refill_per_second = refill_per_second;
+ Ok(())
+ }
+
+ pub fn set_capacity(&mut self, capacity: u64) -> Result<()> {
+ self.capacity = capacity;
+ self.tokens = capacity;
+ self.last_refill_time = Clock::get()?.unix_timestamp.try_into().unwrap();
+ Ok(())
+ }
+
+ pub fn refill(&mut self, extra_tokens: u64) -> Result<()> {
+ let mut new_tokens = extra_tokens;
+ let current_time: u64 = Clock::get()?.unix_timestamp.try_into().unwrap();
+ if current_time > self.last_refill_time {
+ let time_elapsed_in_seconds = current_time - self.last_refill_time;
+ new_tokens = new_tokens
+ .saturating_add(time_elapsed_in_seconds.saturating_mul(self.refill_per_second));
+ }
+ self.tokens = std::cmp::min(self.capacity, self.tokens.saturating_add(new_tokens));
+
+ self.last_refill_time = current_time;
+ Ok(())
+ }
+
+ pub fn try_consume(&mut self, amount: u64) -> Result<()> {
+ self.refill(0)?;
+ match self.tokens.checked_sub(amount) {
+ Some(new_tokens) => {
+ self.tokens = new_tokens;
+ Ok(())
+ },
+ None => Err(error!(OFTError::RateLimitExceeded)),
+ }
+ }
+}
+
+#[derive(Clone, Default, AnchorSerialize, AnchorDeserialize, InitSpace)]
+pub struct EnforcedOptions {
+ #[max_len(ENFORCED_OPTIONS_SEND_MAX_LEN)]
+ pub send: Vec,
+ #[max_len(ENFORCED_OPTIONS_SEND_AND_CALL_MAX_LEN)]
+ pub send_and_call: Vec,
+}
+
+impl EnforcedOptions {
+ pub fn get_enforced_options(&self, composed_msg: &Option>) -> Vec {
+ if composed_msg.is_none() {
+ self.send.clone()
+ } else {
+ self.send_and_call.clone()
+ }
+ }
+
+ pub fn combine_options(
+ &self,
+ compose_msg: &Option>,
+ extra_options: &Vec,
+ ) -> Result> {
+ let enforced_options = self.get_enforced_options(compose_msg);
+ oapp::options::combine_options(enforced_options, extra_options)
+ }
+}
+
+utils::generate_account_size_test!(EnforcedOptions, enforced_options_test);
diff --git a/examples/oft-main/programs/oft/tests/msg_codec.rs b/examples/oft-main/programs/oft/tests/msg_codec.rs
new file mode 100644
index 0000000000..edf8f236ce
--- /dev/null
+++ b/examples/oft-main/programs/oft/tests/msg_codec.rs
@@ -0,0 +1,55 @@
+#[cfg(test)]
+mod test_msg_codec {
+ use anchor_lang::prelude::Pubkey;
+ use oft::compose_msg_codec;
+ use oft::msg_codec;
+
+ #[test]
+ fn test_msg_codec_with_compose_msg() {
+ let send_to: [u8; 32] = [1; 32];
+ let amount_sd: u64 = 123456789;
+ let sender: Pubkey = Pubkey::new_unique();
+ let compose_msg: Option> = Some(vec![1, 2, 3, 4, 5, 6, 7, 8, 9, 0]);
+ let encoded = msg_codec::encode(send_to, amount_sd, sender, &compose_msg);
+ assert_eq!(encoded.len(), 72 + compose_msg.clone().unwrap().len());
+ assert_eq!(msg_codec::send_to(&encoded), send_to);
+ assert_eq!(msg_codec::amount_sd(&encoded), amount_sd);
+ assert_eq!(
+ msg_codec::compose_msg(&encoded),
+ Some([sender.to_bytes().as_ref(), compose_msg.unwrap().as_slice()].concat())
+ );
+ }
+
+ #[test]
+ fn test_msg_codec_without_compose_msg() {
+ let send_to: [u8; 32] = [1; 32];
+ let amount_sd: u64 = 123456789;
+ let sender: Pubkey = Pubkey::new_unique();
+ let compose_msg: Option> = None;
+ let encoded = msg_codec::encode(send_to, amount_sd, sender, &compose_msg);
+ assert_eq!(encoded.len(), 40);
+ assert_eq!(msg_codec::send_to(&encoded), send_to);
+ assert_eq!(msg_codec::amount_sd(&encoded), amount_sd);
+ assert_eq!(msg_codec::compose_msg(&encoded), None);
+ }
+
+ #[test]
+ fn test_compose_msg_codec() {
+ let nonce: u64 = 123456789;
+ let src_eid: u32 = 987654321;
+ let amount_ld: u64 = 123456789;
+ let compose_from: [u8; 32] = [1; 32];
+ let compose_msg: Vec = vec![1, 2, 3, 4, 5, 6, 7, 8, 9, 0];
+ let encoded = compose_msg_codec::encode(
+ nonce,
+ src_eid,
+ amount_ld,
+ &[&compose_from[..], &compose_msg].concat(),
+ );
+ assert_eq!(encoded.len(), 20 + [&compose_from[..], &compose_msg].concat().len());
+ assert_eq!(compose_msg_codec::nonce(&encoded), nonce);
+ assert_eq!(compose_msg_codec::src_eid(&encoded), src_eid);
+ assert_eq!(compose_msg_codec::amount_ld(&encoded), amount_ld);
+ assert_eq!(compose_msg_codec::compose_msg(&encoded), compose_msg);
+ }
+}
diff --git a/examples/oft-main/rust-toolchain.toml b/examples/oft-main/rust-toolchain.toml
new file mode 100644
index 0000000000..f06204d128
--- /dev/null
+++ b/examples/oft-main/rust-toolchain.toml
@@ -0,0 +1,3 @@
+[toolchain]
+channel = "1.84.1"
+components = ["rustfmt", "clippy"]
diff --git a/examples/oft-main/solhint.config.js b/examples/oft-main/solhint.config.js
new file mode 100644
index 0000000000..52efe629c0
--- /dev/null
+++ b/examples/oft-main/solhint.config.js
@@ -0,0 +1 @@
+module.exports = require('@layerzerolabs/solhint-config');
diff --git a/examples/oft-main/starknet/deploy-starknet-mainnet.js b/examples/oft-main/starknet/deploy-starknet-mainnet.js
new file mode 100644
index 0000000000..dc3ebc350b
--- /dev/null
+++ b/examples/oft-main/starknet/deploy-starknet-mainnet.js
@@ -0,0 +1,160 @@
+#!/usr/bin/env node
+const fs = require('fs');
+const path = require('path');
+
+const { Account, CallData, Contract, RpcProvider, shortString } = require('starknet');
+
+const ENV_PATH = path.join(__dirname, '..', '.env');
+const envData = fs.readFileSync(ENV_PATH, 'utf8');
+const readEnv = (key) => {
+ const match = envData.match(new RegExp(`^${key}=\\s*'?([^\\n']+)'?`, 'm'));
+ return match ? match[1].trim() : undefined;
+};
+
+const RPC_URL = readEnv('RPC_URL_STARKNET');
+const ACCOUNT_ADDRESS = readEnv('STARKNET_ACCOUNT_ADDRESS');
+const PRIVATE_KEY = readEnv('STARKNET_PRIVATE_KEY');
+
+if (!RPC_URL || !ACCOUNT_ADDRESS || !PRIVATE_KEY) {
+ throw new Error('RPC_URL_STARKNET, STARKNET_ACCOUNT_ADDRESS, and STARKNET_PRIVATE_KEY are required in .env');
+}
+
+console.log('Starknet RPC:', RPC_URL);
+console.log('Starknet account:', ACCOUNT_ADDRESS);
+
+const ERC20_CLASS_HASH = '0x01bea3900ebe975f332083d441cac55f807cf5de7b1aa0b7ccbda1de53268500';
+const OFT_CLASS_HASH = '0x07c02E3797d2c7B848FA94820FfB335617820d2c44D82d6B8Cf71c71fbE7dd6E';
+const ENDPOINT_ADDRESS = '0x524e065abff21d225fb7b28f26ec2f48314ace6094bc085f0a7cf1dc2660f68';
+const STRK_TOKEN_ADDRESS = '0x04718f5a0fc34cc1af16a1cdee98ffb20c31f5cd61d6ab07201858f4287c938d';
+const SHARED_DECIMALS = 6;
+
+const ERC20_NAME = 'MyToken';
+const ERC20_SYMBOL = 'MTK';
+const ERC20_DECIMALS = 18;
+
+const pkgEntry = require.resolve('@layerzerolabs/oft-mint-burn-starknet');
+const pkgRoot = path.resolve(path.dirname(pkgEntry), '..');
+const erc20AbiModule = require(path.join(pkgRoot, 'dist/generated/abi/e-r-c20-mint-burn-upgradeable.cjs'));
+const ERC20_ABI = erc20AbiModule.eRC20MintBurnUpgradeable ?? erc20AbiModule.default ?? erc20AbiModule;
+
+const DEPLOY_PATH = path.join(__dirname, 'deploy.json');
+
+const loadExistingDeploy = () => {
+ if (!fs.existsSync(DEPLOY_PATH)) return undefined;
+ try {
+ return JSON.parse(fs.readFileSync(DEPLOY_PATH, 'utf8'));
+ } catch {
+ return undefined;
+ }
+};
+
+async function main() {
+ const provider = new RpcProvider({ nodeUrl: RPC_URL });
+ const account = new Account({ provider, address: ACCOUNT_ADDRESS, signer: PRIVATE_KEY });
+ if (!Array.isArray(ERC20_ABI)) {
+ throw new Error('ERC20 ABI not found or invalid in oft-mint-burn-starknet package');
+ }
+ console.log('ERC20 ABI entries:', ERC20_ABI.length);
+ const txDetails = {
+ tip: 0n,
+ resourceBounds: {
+ l1_gas: { max_amount: 80_000n, max_price_per_unit: 60_000_000_000_000n },
+ l2_gas: { max_amount: 1_000_000n, max_price_per_unit: 10_000_000_000n },
+ l1_data_gas: { max_amount: 80_000n, max_price_per_unit: 60_000_000_000_000n },
+ },
+ };
+
+ const existing = loadExistingDeploy();
+ let erc20Address = process.env.STARKNET_ERC20_ADDRESS || existing?.erc20Address;
+ let oftAddress = process.env.STARKNET_OFT_ADDRESS || existing?.oftAddress;
+ let erc20DeployTx = existing?.erc20DeployTx;
+ let oftDeployTx = existing?.oftDeployTx;
+
+ if (!erc20Address) {
+ console.log('Deploying ERC20MintBurnUpgradeable...');
+ const erc20ConstructorCalldata = new CallData(ERC20_ABI).compile('constructor', {
+ name: ERC20_NAME,
+ symbol: ERC20_SYMBOL,
+ decimals: ERC20_DECIMALS,
+ default_admin: ACCOUNT_ADDRESS,
+ });
+ const erc20Deploy = await account.deploy(
+ {
+ classHash: ERC20_CLASS_HASH,
+ constructorCalldata: erc20ConstructorCalldata,
+ },
+ txDetails
+ );
+ await provider.waitForTransaction(erc20Deploy.transaction_hash);
+ erc20Address = Array.isArray(erc20Deploy.contract_address)
+ ? erc20Deploy.contract_address[0]
+ : erc20Deploy.contract_address;
+ if (!erc20Address) {
+ throw new Error(`ERC20 deploy did not return contract address. Tx: ${erc20Deploy.transaction_hash}`);
+ }
+ erc20DeployTx = erc20Deploy.transaction_hash;
+ console.log('ERC20 deployed:', erc20Address);
+ } else {
+ console.log('Using existing ERC20:', erc20Address);
+ }
+
+ if (!oftAddress) {
+ console.log('Deploying OFTMintBurnAdapter...');
+ const oftDeploy = await account.deploy(
+ {
+ classHash: OFT_CLASS_HASH,
+ constructorCalldata: [
+ erc20Address,
+ erc20Address,
+ ENDPOINT_ADDRESS,
+ ACCOUNT_ADDRESS,
+ STRK_TOKEN_ADDRESS,
+ SHARED_DECIMALS,
+ ],
+ },
+ txDetails
+ );
+ await provider.waitForTransaction(oftDeploy.transaction_hash);
+ oftAddress = Array.isArray(oftDeploy.contract_address)
+ ? oftDeploy.contract_address[0]
+ : oftDeploy.contract_address;
+ if (!oftAddress) {
+ throw new Error(`OFT deploy did not return contract address. Tx: ${oftDeploy.transaction_hash}`);
+ }
+ oftDeployTx = oftDeploy.transaction_hash;
+ console.log('OFT deployed:', oftAddress);
+ } else {
+ console.log('Using existing OFT:', oftAddress);
+ }
+
+ const erc20 = new Contract({ abi: ERC20_ABI, address: erc20Address, providerOrAccount: account });
+
+ const minterRole = shortString.encodeShortString('MINTER_ROLE');
+ const burnerRole = shortString.encodeShortString('BURNER_ROLE');
+
+ console.log('Granting MINTER_ROLE...');
+ const grantMinter = erc20.populateTransaction.grant_role(minterRole, oftAddress);
+ const grantMinterTx = await account.execute([grantMinter], txDetails);
+ await provider.waitForTransaction(grantMinterTx.transaction_hash);
+
+ console.log('Granting BURNER_ROLE...');
+ const grantBurner = erc20.populateTransaction.grant_role(burnerRole, oftAddress);
+ const grantBurnerTx = await account.execute([grantBurner], txDetails);
+ await provider.waitForTransaction(grantBurnerTx.transaction_hash);
+
+ const out = {
+ erc20Address,
+ oftAddress,
+ erc20DeployTx,
+ oftDeployTx,
+ grantMinterTx: grantMinterTx.transaction_hash,
+ grantBurnerTx: grantBurnerTx.transaction_hash,
+ };
+ fs.writeFileSync(DEPLOY_PATH, JSON.stringify(out, null, 2));
+ console.log(`Saved deployment info to ${DEPLOY_PATH}`);
+}
+
+main().catch((err) => {
+ console.error(err);
+ process.exit(1);
+});
diff --git a/examples/oft-main/starknet/deploy.json.bak b/examples/oft-main/starknet/deploy.json.bak
new file mode 100644
index 0000000000..159d744fd8
--- /dev/null
+++ b/examples/oft-main/starknet/deploy.json.bak
@@ -0,0 +1,6 @@
+{
+ "erc20Address": "0x3882dbc85193279a21216ab5040be14f285ce80e0b4f54f78243ebc38dac778",
+ "oftAddress": "0x5e10925af15db70e24c1f2ad9339b9d8d4ad661e04865fd4c9a078b50cf7a63",
+ "grantMinterTx": "0x443000d7967642efb31d25a9c6acacbd1f98d78e6ae6d50a735410d152ed5b8",
+ "grantBurnerTx": "0x5dfcfc2110d558f93025f5e13f77d713b9ce6cdcabec4061a7d3df8a16ea711"
+}
\ No newline at end of file
diff --git a/examples/oft-main/starknet/deploy.json.bak.1769208885 b/examples/oft-main/starknet/deploy.json.bak.1769208885
new file mode 100644
index 0000000000..c4fdb950a9
--- /dev/null
+++ b/examples/oft-main/starknet/deploy.json.bak.1769208885
@@ -0,0 +1,8 @@
+{
+ "erc20Address": "0x35b85d4aa73ab7f4d437e7c269b0d624dc69fe9c6b98f187ccadbc0013793c3",
+ "oftAddress": "0x4df7f5fce8c6b3c09ee33ecb49dda6142f7caaf47870bd6e1865190707f05df",
+ "erc20DeployTx": "0x7313f56582dbc6025db57a948e6463cdcedb106843605d7b1b73fde2129950e",
+ "oftDeployTx": "0x6a72f511a332ea66a781c0891cde1d5e5f6fc45e4911bcf34cce494aa39cd1c",
+ "grantMinterTx": "0x20c797ec0085fce766d2d46c4aae566f9bd0d5b6ac50b76548d100d7f4e97c2",
+ "grantBurnerTx": "0x60cd9b40c3c8b188d64a0924b6c24a7fd4b69b2295a215b7992c9ef55c7b0a3"
+}
\ No newline at end of file
diff --git a/examples/oft-main/starknet/deploy.json.bak.1769209481 b/examples/oft-main/starknet/deploy.json.bak.1769209481
new file mode 100644
index 0000000000..d964105a50
--- /dev/null
+++ b/examples/oft-main/starknet/deploy.json.bak.1769209481
@@ -0,0 +1,8 @@
+{
+ "erc20Address": "0x1b86d4f61ce69edbb68ff34f6af3734fec5949320b35276d3d8b0738cddd510",
+ "oftAddress": "0x4728fd95523757637c38a6fe8f0b7d2fa14edc999068d4ac20bb7f5f0779eae",
+ "erc20DeployTx": "0x5c1ec96e9d344f6404be63fc8f7aa7d4ccf0d26581ec8321985e821770d6252",
+ "oftDeployTx": "0x63c15c6a5cbe50265bb0964114aace8340a586a50da76b20a88829ffdc017a3",
+ "grantMinterTx": "0x5c5232365191e17ade74f5599d4161061483259595d706171795e24230b3f31",
+ "grantBurnerTx": "0x356905d0474cb9bde62dd23fe6217c23e5c4ad8acf62cbfd3ada271b6d99092"
+}
\ No newline at end of file
diff --git a/examples/oft-main/starknet/deploy.json.bak.1769209606 b/examples/oft-main/starknet/deploy.json.bak.1769209606
new file mode 100644
index 0000000000..56a5fccdc2
--- /dev/null
+++ b/examples/oft-main/starknet/deploy.json.bak.1769209606
@@ -0,0 +1,8 @@
+{
+ "erc20Address": "0x5b174287588fc400fcb23b7dbc6e8727c322a96da8d925e72770abec53717eb",
+ "oftAddress": "0x20ca935478891da837225b34263154e1bcdc2df8a979df4767ff13270c56c",
+ "erc20DeployTx": "0x5bee4c92e83a6280e53b2e292894fd32cc29f408c0c56550368f68d00ef2e4f",
+ "oftDeployTx": "0x56ce5ab4f543a7afa8f0a13735b6e6321c95fea78e1ff2af97592f04234e749",
+ "grantMinterTx": "0x5325958ecefcba87084c6ecf828564bad4bd5e25d67865a0e64e3e3e088ad6a",
+ "grantBurnerTx": "0x7f88997865af7fe7b9c4bee56dd60d101ffc975906004b27bc0ded68a1f8be2"
+}
\ No newline at end of file
diff --git a/examples/oft-main/sui/deploy.json.example b/examples/oft-main/sui/deploy.json.example
new file mode 100644
index 0000000000..c1b1275997
--- /dev/null
+++ b/examples/oft-main/sui/deploy.json.example
@@ -0,0 +1,8 @@
+{
+ "oftPackageId": "0x",
+ "oappObjectId": "0x",
+ "oftObjectId": "0x",
+ "tokenType": "0x::::",
+ "initTx": "",
+ "registerTx": ""
+}
diff --git a/examples/oft-main/sui/init-and-register.js b/examples/oft-main/sui/init-and-register.js
new file mode 100644
index 0000000000..0eec40be37
--- /dev/null
+++ b/examples/oft-main/sui/init-and-register.js
@@ -0,0 +1,115 @@
+const fs = require('fs');
+const path = require('path');
+
+const { SuiClient } = require('@mysten/sui/client');
+const { decodeSuiPrivateKey } = require('@mysten/sui/cryptography');
+const { Ed25519Keypair } = require('@mysten/sui/keypairs/ed25519');
+const { Transaction } = require('@mysten/sui/transactions');
+
+const { Stage } = require('@layerzerolabs/lz-definitions');
+const { OFT } = require('@layerzerolabs/lz-sui-oft-sdk-v2');
+const { SDK } = require('@layerzerolabs/lz-sui-sdk-v2');
+
+const ENV_PATH = path.join(__dirname, '..', '.env');
+const envData = fs.readFileSync(ENV_PATH, 'utf8');
+const readEnv = (key) => {
+ const match = envData.match(new RegExp(`^${key}=\\s*'?([^\\n']+)'?`, 'm'));
+ return match ? match[1].trim() : undefined;
+};
+
+const RPC_URL = readEnv('RPC_URL_SUI');
+const SUI_PRIVATE_KEY = readEnv('SUI_PRIVATE_KEY');
+
+const OFT_PACKAGE_ID = process.env.SUI_OFT_PACKAGE_ID;
+const OAPP_OBJECT_ID = process.env.SUI_OAPP_OBJECT_ID;
+const OFT_INIT_TICKET = process.env.SUI_OFT_INIT_TICKET;
+const TREASURY_CAP = process.env.SUI_TREASURY_CAP;
+const COIN_METADATA = process.env.SUI_COIN_METADATA;
+const TOKEN_TYPE = process.env.SUI_TOKEN_TYPE;
+const SHARED_DECIMALS = Number(process.env.SUI_SHARED_DECIMALS ?? 6);
+const COMPOSER_MANAGER =
+ process.env.SUI_COMPOSER_MANAGER || '0xfbece0b75d097c31b9963402a66e49074b0d3a2a64dd0ed666187ca6911a4d12';
+
+if (!RPC_URL || !SUI_PRIVATE_KEY) {
+ throw new Error('RPC_URL_SUI and SUI_PRIVATE_KEY are required in examples/oft-main/.env');
+}
+
+for (const [key, value] of Object.entries({
+ SUI_OFT_PACKAGE_ID: OFT_PACKAGE_ID,
+ SUI_OAPP_OBJECT_ID: OAPP_OBJECT_ID,
+ SUI_OFT_INIT_TICKET: OFT_INIT_TICKET,
+ SUI_TREASURY_CAP: TREASURY_CAP,
+ SUI_COIN_METADATA: COIN_METADATA,
+ SUI_TOKEN_TYPE: TOKEN_TYPE,
+})) {
+ if (!value) {
+ throw new Error(`Missing ${key} environment variable`);
+ }
+}
+
+async function main() {
+ const { secretKey } = decodeSuiPrivateKey(SUI_PRIVATE_KEY);
+ const keypair = Ed25519Keypair.fromSecretKey(secretKey);
+ const sender = keypair.getPublicKey().toSuiAddress();
+
+ const client = new SuiClient({ url: RPC_URL });
+ const sdk = new SDK({ client, stage: Stage.MAINNET });
+
+ const initTx = new Transaction();
+ const initOft = new OFT(sdk, OFT_PACKAGE_ID, undefined, TOKEN_TYPE, OAPP_OBJECT_ID);
+
+ const [adminCap, migrationCap] = initOft.initOftMoveCall(
+ initTx,
+ TOKEN_TYPE,
+ OFT_INIT_TICKET,
+ OAPP_OBJECT_ID,
+ TREASURY_CAP,
+ COIN_METADATA,
+ SHARED_DECIMALS
+ );
+ initTx.transferObjects([adminCap, migrationCap], sender);
+
+ const initResult = await client.signAndExecuteTransaction({
+ transaction: initTx,
+ signer: keypair,
+ options: { showObjectChanges: true },
+ });
+ await client.waitForTransaction({ digest: initResult.digest });
+
+ const oftObject = initResult.objectChanges?.find(
+ (change) => change.type === 'created' && String(change.objectType).includes('::oft::OFT<')
+ );
+ if (!oftObject) {
+ throw new Error('Failed to locate OFT object ID in init transaction');
+ }
+ const oftObjectId = oftObject.objectId;
+ console.log('OFT object ID:', oftObjectId);
+
+ const regTx = new Transaction();
+ const regOft = new OFT(sdk, OFT_PACKAGE_ID, oftObjectId, TOKEN_TYPE, OAPP_OBJECT_ID);
+ await regOft.registerOAppMoveCall(regTx, TOKEN_TYPE, oftObjectId, OAPP_OBJECT_ID, COMPOSER_MANAGER);
+
+ const regResult = await client.signAndExecuteTransaction({
+ transaction: regTx,
+ signer: keypair,
+ options: { showObjectChanges: true },
+ });
+ await client.waitForTransaction({ digest: regResult.digest });
+
+ const deployInfo = {
+ oftPackageId: OFT_PACKAGE_ID,
+ oappObjectId: OAPP_OBJECT_ID,
+ oftObjectId,
+ tokenType: TOKEN_TYPE,
+ initTx: initResult.digest,
+ registerTx: regResult.digest,
+ };
+ const outPath = path.join(__dirname, 'deploy.json');
+ fs.writeFileSync(outPath, JSON.stringify(deployInfo, null, 2));
+ console.log(`Saved deployment info to ${outPath}`);
+}
+
+main().catch((err) => {
+ console.error(err);
+ process.exit(1);
+});
diff --git a/examples/oft-main/sui/oft/Move.lock b/examples/oft-main/sui/oft/Move.lock
new file mode 100644
index 0000000000..a57ed657df
--- /dev/null
+++ b/examples/oft-main/sui/oft/Move.lock
@@ -0,0 +1,169 @@
+# @generated by Move, please check-in and do not edit manually.
+
+[move]
+version = 3
+manifest_digest = "B83C406FE4D1A5F86527F7D3327EAD58325C07DB22FB2FBF21C12191776045AA"
+deps_digest = "04732BFEF428F74DE262001DC455D76B909EBC394B034A9A15CC095E4BDD9CEF"
+dependencies = [
+ { id = "Bridge", name = "Bridge" },
+ { id = "MoveStdlib", name = "MoveStdlib" },
+ { id = "OApp", name = "OApp" },
+ { id = "OFTCommon", name = "OFTCommon" },
+ { id = "PtbMoveCall", name = "PtbMoveCall" },
+ { id = "Sui", name = "Sui" },
+ { id = "SuiSystem", name = "SuiSystem" },
+]
+dev-dependencies = [
+ { id = "SimpleMessageLib", name = "SimpleMessageLib" },
+]
+
+[[move.package]]
+id = "Bridge"
+source = { git = "https://github.com/MystenLabs/sui.git", rev = "61dcfdbe2ddc7ad05d27fc10cd09d4c6cc151acd", subdir = "crates/sui-framework/packages/bridge" }
+
+dependencies = [
+ { id = "MoveStdlib", name = "MoveStdlib" },
+ { id = "Sui", name = "Sui" },
+ { id = "SuiSystem", name = "SuiSystem" },
+]
+
+[[move.package]]
+id = "Call"
+source = { git = "https://github.com/LayerZero-Labs/LayerZero-v2.git", rev = "main", subdir = "packages/layerzero-v2/sui/contracts/dynamic-call/call" }
+
+dependencies = [
+ { id = "Bridge", name = "Bridge" },
+ { id = "MoveStdlib", name = "MoveStdlib" },
+ { id = "Sui", name = "Sui" },
+ { id = "SuiSystem", name = "SuiSystem" },
+ { id = "Utils", name = "Utils" },
+]
+
+[[move.package]]
+id = "EndpointV2"
+source = { git = "https://github.com/LayerZero-Labs/LayerZero-v2.git", rev = "main", subdir = "packages/layerzero-v2/sui/contracts/endpoint-v2" }
+
+dependencies = [
+ { id = "Bridge", name = "Bridge" },
+ { id = "Call", name = "Call" },
+ { id = "MoveStdlib", name = "MoveStdlib" },
+ { id = "Sui", name = "Sui" },
+ { id = "SuiSystem", name = "SuiSystem" },
+ { id = "Zro", name = "Zro" },
+]
+
+[[move.package]]
+id = "MessageLibCommon"
+source = { git = "https://github.com/LayerZero-Labs/LayerZero-v2.git", rev = "main", subdir = "packages/layerzero-v2/sui/contracts/message-libs/message-lib-common" }
+
+dependencies = [
+ { id = "Bridge", name = "Bridge" },
+ { id = "EndpointV2", name = "EndpointV2" },
+ { id = "MoveStdlib", name = "MoveStdlib" },
+ { id = "Sui", name = "Sui" },
+ { id = "SuiSystem", name = "SuiSystem" },
+]
+
+[[move.package]]
+id = "MoveStdlib"
+source = { git = "https://github.com/MystenLabs/sui.git", rev = "61dcfdbe2ddc7ad05d27fc10cd09d4c6cc151acd", subdir = "crates/sui-framework/packages/move-stdlib" }
+
+[[move.package]]
+id = "OApp"
+source = { git = "https://github.com/LayerZero-Labs/LayerZero-v2.git", rev = "main", subdir = "packages/layerzero-v2/sui/contracts/oapps/oapp" }
+
+dependencies = [
+ { id = "Bridge", name = "Bridge" },
+ { id = "EndpointV2", name = "EndpointV2" },
+ { id = "MoveStdlib", name = "MoveStdlib" },
+ { id = "Sui", name = "Sui" },
+ { id = "SuiSystem", name = "SuiSystem" },
+]
+
+[[move.package]]
+id = "OFTCommon"
+source = { git = "https://github.com/LayerZero-Labs/LayerZero-v2.git", rev = "main", subdir = "packages/layerzero-v2/sui/contracts/oapps/oft/oft-common" }
+
+dependencies = [
+ { id = "Bridge", name = "Bridge" },
+ { id = "Call", name = "Call" },
+ { id = "MoveStdlib", name = "MoveStdlib" },
+ { id = "Sui", name = "Sui" },
+ { id = "SuiSystem", name = "SuiSystem" },
+]
+
+[[move.package]]
+id = "PtbMoveCall"
+source = { git = "https://github.com/LayerZero-Labs/LayerZero-v2.git", rev = "main", subdir = "packages/layerzero-v2/sui/contracts/ptb-builders/ptb-move-call" }
+
+dependencies = [
+ { id = "Bridge", name = "Bridge" },
+ { id = "MoveStdlib", name = "MoveStdlib" },
+ { id = "Sui", name = "Sui" },
+ { id = "SuiSystem", name = "SuiSystem" },
+ { id = "Utils", name = "Utils" },
+]
+
+[[move.package]]
+id = "SimpleMessageLib"
+source = { git = "https://github.com/LayerZero-Labs/LayerZero-v2.git", rev = "main", subdir = "packages/layerzero-v2/sui/contracts/message-libs/simple-message-lib" }
+
+dependencies = [
+ { id = "Bridge", name = "Bridge" },
+ { id = "MessageLibCommon", name = "MessageLibCommon" },
+ { id = "MoveStdlib", name = "MoveStdlib" },
+ { id = "Sui", name = "Sui" },
+ { id = "SuiSystem", name = "SuiSystem" },
+]
+
+[[move.package]]
+id = "Sui"
+source = { git = "https://github.com/MystenLabs/sui.git", rev = "61dcfdbe2ddc7ad05d27fc10cd09d4c6cc151acd", subdir = "crates/sui-framework/packages/sui-framework" }
+
+dependencies = [
+ { id = "MoveStdlib", name = "MoveStdlib" },
+]
+
+[[move.package]]
+id = "SuiSystem"
+source = { git = "https://github.com/MystenLabs/sui.git", rev = "61dcfdbe2ddc7ad05d27fc10cd09d4c6cc151acd", subdir = "crates/sui-framework/packages/sui-system" }
+
+dependencies = [
+ { id = "MoveStdlib", name = "MoveStdlib" },
+ { id = "Sui", name = "Sui" },
+]
+
+[[move.package]]
+id = "Utils"
+source = { git = "https://github.com/LayerZero-Labs/LayerZero-v2.git", rev = "main", subdir = "packages/layerzero-v2/sui/contracts/utils" }
+
+dependencies = [
+ { id = "Bridge", name = "Bridge" },
+ { id = "MoveStdlib", name = "MoveStdlib" },
+ { id = "Sui", name = "Sui" },
+ { id = "SuiSystem", name = "SuiSystem" },
+]
+
+[[move.package]]
+id = "Zro"
+source = { git = "https://github.com/LayerZero-Labs/LayerZero-v2.git", rev = "main", subdir = "packages/layerzero-v2/sui/contracts/zro" }
+
+dependencies = [
+ { id = "Bridge", name = "Bridge" },
+ { id = "MoveStdlib", name = "MoveStdlib" },
+ { id = "Sui", name = "Sui" },
+ { id = "SuiSystem", name = "SuiSystem" },
+]
+
+[move.toolchain-version]
+compiler-version = "1.59.0"
+edition = "2024.beta"
+flavor = "sui"
+
+[env]
+
+[env.mainnet]
+chain-id = "35834a8a"
+original-published-id = "0xebad3daff012b6d2d1dec70ab0da494e2f355944e343502488c9bb202b06a919"
+latest-published-id = "0xebad3daff012b6d2d1dec70ab0da494e2f355944e343502488c9bb202b06a919"
+published-version = "1"
diff --git a/examples/oft-main/sui/oft/Move.toml b/examples/oft-main/sui/oft/Move.toml
new file mode 100644
index 0000000000..eca074bd63
--- /dev/null
+++ b/examples/oft-main/sui/oft/Move.toml
@@ -0,0 +1,16 @@
+[package]
+name = "OFT"
+version = "0.0.1"
+edition = "2024.beta"
+license = "MIT"
+
+[dependencies]
+OApp = { git = "https://github.com/LayerZero-Labs/LayerZero-v2.git", subdir = "packages/layerzero-v2/sui/contracts/oapps/oapp", rev = "main" }
+OFTCommon = { git = "https://github.com/LayerZero-Labs/LayerZero-v2.git", subdir = "packages/layerzero-v2/sui/contracts/oapps/oft/oft-common", rev = "main" }
+PtbMoveCall = { git = "https://github.com/LayerZero-Labs/LayerZero-v2.git", subdir = "packages/layerzero-v2/sui/contracts/ptb-builders/ptb-move-call", rev = "main" }
+
+[addresses]
+oft = "0x0"
+
+[dev-dependencies]
+SimpleMessageLib = { git = "https://github.com/LayerZero-Labs/LayerZero-v2.git", subdir = "packages/layerzero-v2/sui/contracts/message-libs/simple-message-lib", rev = "main" }
diff --git a/examples/oft-main/sui/oft/README.md b/examples/oft-main/sui/oft/README.md
new file mode 100644
index 0000000000..76c6bbea30
--- /dev/null
+++ b/examples/oft-main/sui/oft/README.md
@@ -0,0 +1,15 @@
+# Sui OFT Package
+
+Populate `sources/` by copying the LayerZero OFT Move sources:
+
+```bash
+git clone https://github.com/LayerZero-Labs/LayerZero-v2.git --depth 1
+cp -r LayerZero-v2/packages/layerzero-v2/sui/contracts/oapps/oft/oft/sources ./sources
+rm -rf LayerZero-v2
+```
+
+Then publish the package:
+
+```bash
+sui client publish --gas-budget 1000000000 --json > oft_deploy.json
+```
diff --git a/examples/oft-main/sui/oft/sources/codec/oft_msg_codec.move b/examples/oft-main/sui/oft/sources/codec/oft_msg_codec.move
new file mode 100644
index 0000000000..b66bd10d59
--- /dev/null
+++ b/examples/oft-main/sui/oft/sources/codec/oft_msg_codec.move
@@ -0,0 +1,84 @@
+module oft::oft_msg_codec;
+
+use utils::{buffer_reader, buffer_writer, bytes32::Bytes32};
+
+// === Structs ===
+
+/// Decoded OFT message containing transfer details and optional compose data
+public struct OFTMessage has copy, drop {
+ /// Recipient address on the destination chain
+ send_to: address,
+ /// Amount to transfer in shared decimals (normalized cross-chain format)
+ amount_sd: u64,
+ /// Address that initiated the compose call (optional)
+ compose_from: Option,
+ /// Compose message payload for additional logic (optional)
+ compose_msg: Option>,
+}
+
+// === Codec Functions ===
+
+/// Encodes OFT message data into a byte vector for cross-chain transmission
+/// Format: [send_to(32)] [amount_sd(8)] [compose_from(32)] [compose_msg(variable)]
+/// Compose fields are only included if both are provided
+public fun encode(
+ send_to: Bytes32,
+ amount_sd: u64,
+ compose_from: Option,
+ compose_msg: Option>,
+): vector {
+ let mut writer = buffer_writer::new();
+ writer.write_bytes32(send_to).write_u64(amount_sd);
+ if (compose_from.is_some() && compose_msg.is_some()) {
+ writer.write_bytes32(compose_from.destroy_some());
+ writer.write_bytes(compose_msg.destroy_some());
+ };
+ writer.to_bytes()
+}
+
+/// Decodes byte vector into OFTMessage struct
+/// Automatically detects presence of compose data based on remaining length
+public fun decode(msg: vector): OFTMessage {
+ let mut reader = buffer_reader::create(msg);
+ let send_to = reader.read_address();
+ let amount_sd = reader.read_u64();
+ if (reader.remaining_length() > 0) {
+ let compose_from = reader.read_bytes32();
+ let compose_msg = reader.read_bytes_until_end();
+ OFTMessage {
+ send_to,
+ amount_sd,
+ compose_from: option::some(compose_from),
+ compose_msg: option::some(compose_msg),
+ }
+ } else {
+ OFTMessage { send_to, amount_sd, compose_from: option::none(), compose_msg: option::none() }
+ }
+}
+
+// === Getters ===
+
+/// Returns the recipient address on the destination chain
+public fun send_to(self: &OFTMessage): address {
+ self.send_to
+}
+
+/// Returns the transfer amount in shared decimals (normalized format)
+public fun amount_sd(self: &OFTMessage): u64 {
+ self.amount_sd
+}
+
+/// Returns the compose initiator address (if compose is enabled)
+public fun compose_from(self: &OFTMessage): Option {
+ self.compose_from
+}
+
+/// Returns the compose message payload (if compose is enabled)
+public fun compose_msg(self: &OFTMessage): &Option> {
+ &self.compose_msg
+}
+
+/// Returns true if this message includes compose functionality
+public fun is_composed(self: &OFTMessage): bool {
+ self.compose_from.is_some() && self.compose_msg.is_some()
+}
diff --git a/examples/oft-main/sui/oft/sources/internal/oft_fee.move b/examples/oft-main/sui/oft/sources/internal/oft_fee.move
new file mode 100644
index 0000000000..0d63696ec4
--- /dev/null
+++ b/examples/oft-main/sui/oft/sources/internal/oft_fee.move
@@ -0,0 +1,166 @@
+/// OFT Fee Management Module
+///
+/// This module provides destination chain specific fee calculation and management functionality for OFT (Omnichain
+/// Fungible Token) transfers.
+/// It implements a basis point (BPS) based fee system where fees are calculated as a percentage of the transfer amount,
+/// with the ability to set different fee rates for different destination chains or use a default fee rate.
+module oft::oft_fee;
+
+use sui::{event, table::{Self, Table}};
+use utils::table_ext;
+
+// === Constants ===
+
+/// Base fee in basis points (10,000 BPS = 100%)
+/// Used as denominator in fee calculations
+const BASE_FEE_BPS: u64 = 10_000;
+
+// === Errors ===
+
+const EInvalidFeeBps: u64 = 1;
+const EInvalidFeeDepositAddress: u64 = 2;
+const ENotFound: u64 = 3;
+const ESameValue: u64 = 4;
+
+// === Structs ===
+
+/// OFT fee configuration structure with support for destination-specific fees
+public struct OFTFee has store {
+ /// Default fee rate in basis points (0-10,000, where 10,000 = 100%)
+ /// Applied to destinations without specific fee configuration
+ default_fee_bps: u64,
+ /// Destination-specific fee rates mapped by endpoint ID (eid)
+ fee_bps: Table,
+ /// Address where collected fees will be deposited
+ fee_deposit_address: address,
+}
+
+// === Events ===
+
+public struct DefaultFeeBpsSetEvent has copy, drop {
+ /// Default fee rate in basis points (0-10,000, where 10,000 = 100%)
+ fee_bps: u64,
+}
+
+public struct FeeBpsSetEvent has copy, drop {
+ /// Destination endpoint ID
+ dst_eid: u32,
+ /// New fee rate in basis points (0-10,000, where 10,000 = 100%)
+ fee_bps: u64,
+}
+
+public struct FeeBpsUnsetEvent has copy, drop {
+ /// Destination endpoint ID
+ dst_eid: u32,
+}
+
+public struct FeeDepositAddressSetEvent has copy, drop {
+ /// Address where collected fees will be deposited
+ fee_deposit_address: address,
+}
+
+// === Creation Functions ===
+
+/// Creates a new OFTFee instance with zero fee rate and zero address
+/// Initial state: no fees are charged and no deposit address is set
+public(package) fun new(ctx: &mut TxContext): OFTFee {
+ OFTFee { default_fee_bps: 0, fee_bps: table::new(ctx), fee_deposit_address: @0x0 }
+}
+
+// === Core Functions ===
+
+/// Applies the configured fee to the given amount and returns the amount after fee deduction
+///
+/// **Parameters**:
+/// - `dst_eid`: Destination endpoint ID to determine which fee rate to apply
+/// - `amount_ld`: The original amount in local decimals
+///
+/// **Returns**:
+/// The amount after fee deduction (original amount - calculated fee)
+public(package) fun apply_fee(self: &OFTFee, dst_eid: u32, amount_ld: u64): u64 {
+ assert!(self.fee_deposit_address != @0x0, EInvalidFeeDepositAddress);
+ let fee_bps = self.effective_fee_bps(dst_eid);
+ let preliminary_fee = ((amount_ld as u128) * (fee_bps as u128)) / (BASE_FEE_BPS as u128);
+ amount_ld - (preliminary_fee as u64)
+}
+
+// === Management Functions ===
+
+/// Sets the fee deposit address where collected fees will be sent
+///
+/// **Parameters**:
+/// - `fee_deposit_address`: New address for fee deposits (cannot be zero address)
+public(package) fun set_fee_deposit_address(self: &mut OFTFee, fee_deposit_address: address) {
+ assert!(fee_deposit_address != @0x0, EInvalidFeeDepositAddress);
+ assert!(self.fee_deposit_address != fee_deposit_address, ESameValue);
+ self.fee_deposit_address = fee_deposit_address;
+ event::emit(FeeDepositAddressSetEvent { fee_deposit_address });
+}
+
+/// Sets the default fee rate that applies to all destinations without specific configuration
+///
+/// **Parameters**:
+/// - `fee_bps`: Default fee rate in basis points (0-10,000)
+public(package) fun set_default_fee_bps(self: &mut OFTFee, fee_bps: u64) {
+ assert!(fee_bps <= BASE_FEE_BPS, EInvalidFeeBps);
+ assert!(self.default_fee_bps != fee_bps, ESameValue);
+ self.default_fee_bps = fee_bps;
+ event::emit(DefaultFeeBpsSetEvent { fee_bps });
+}
+
+/// Sets the fee rate for a specific destination chain
+///
+/// **Parameters**:
+/// - `dst_eid`: Destination endpoint ID
+/// - `fee_bps`: Fee rate in basis points (0-10,000)
+public(package) fun set_fee_bps(self: &mut OFTFee, dst_eid: u32, fee_bps: u64) {
+ assert!(fee_bps <= BASE_FEE_BPS, EInvalidFeeBps);
+ assert!(!self.fee_bps.contains(dst_eid) || self.fee_bps[dst_eid] != fee_bps, ESameValue);
+ table_ext::upsert!(&mut self.fee_bps, dst_eid, fee_bps);
+ event::emit(FeeBpsSetEvent { dst_eid, fee_bps });
+}
+
+/// Unset the fee rate for a specific destination chain
+///
+/// **Parameters**:
+/// - `dst_eid`: Destination endpoint ID
+public(package) fun unset_fee_bps(self: &mut OFTFee, dst_eid: u32) {
+ assert!(self.fee_bps.contains(dst_eid), ENotFound);
+ self.fee_bps.remove(dst_eid);
+ event::emit(FeeBpsUnsetEvent { dst_eid });
+}
+
+// === Drop Function ===
+
+/// Drop the OFTFee instance and clean up its resources
+public(package) fun drop(self: OFTFee) {
+ let OFTFee { fee_bps, .. } = self;
+ fee_bps.drop();
+}
+
+// === View Functions ===
+
+/// Returns true if the OFT has a fee rate greater than 0 for the specified destination
+public(package) fun has_oft_fee(self: &OFTFee, dst_eid: u32): bool {
+ self.effective_fee_bps(dst_eid) > 0
+}
+
+/// Returns the effective fee rate for a specific destination chain
+public(package) fun effective_fee_bps(self: &OFTFee, dst_eid: u32): u64 {
+ *table_ext::borrow_with_default!(&self.fee_bps, dst_eid, &self.default_fee_bps)
+}
+
+/// Returns the default fee rate
+public(package) fun default_fee_bps(self: &OFTFee): u64 {
+ self.default_fee_bps
+}
+
+/// Returns the fee rate for a specific destination chain
+public(package) fun fee_bps(self: &OFTFee, dst_eid: u32): u64 {
+ self.fee_bps[dst_eid]
+}
+
+/// Returns the current fee deposit address
+public(package) fun fee_deposit_address(self: &OFTFee): address {
+ self.fee_deposit_address
+}
diff --git a/examples/oft-main/sui/oft/sources/internal/pausable.move b/examples/oft-main/sui/oft/sources/internal/pausable.move
new file mode 100644
index 0000000000..86b190c443
--- /dev/null
+++ b/examples/oft-main/sui/oft/sources/internal/pausable.move
@@ -0,0 +1,59 @@
+/// Pausable Module
+///
+/// This module provides emergency pause functionality for OFT operations.
+/// When paused, critical operations like send/receive transfers are blocked,
+/// allowing administrators to halt operations during emergencies or maintenance.
+module oft::pausable;
+
+use sui::event;
+
+// === Errors ===
+
+const EPaused: u64 = 1;
+const EPauseUnchanged: u64 = 2;
+
+// === Structs ===
+
+/// Pausable state container that can be embedded in OFT structs.
+public struct Pausable has drop, store {
+ /// Current pause state - true means operations are suspended
+ paused: bool,
+}
+
+// === Events ===
+
+public struct PausedSetEvent has copy, drop {
+ /// New pause state - true indicates operations are suspended, false indicates normal operation
+ paused: bool,
+}
+
+// === Creation ===
+
+/// Creates a new Pausable instance in the unpaused state.
+public(package) fun new(): Pausable {
+ Pausable { paused: false }
+}
+
+// === Management Functions ===
+
+/// Updates the pause state and emits a state change event.
+///
+/// **Parameters**:
+/// * `paused` - New pause state to set
+public(package) fun set_pause(self: &mut Pausable, paused: bool) {
+ assert!(self.paused != paused, EPauseUnchanged);
+ self.paused = paused;
+ event::emit(PausedSetEvent { paused });
+}
+
+// === View Functions ===
+
+/// Returns the current pause state.
+public(package) fun is_paused(self: &Pausable): bool {
+ self.paused
+}
+
+/// Asserts that operations are not currently paused.
+public(package) fun assert_not_paused(self: &Pausable) {
+ assert!(!self.paused, EPaused);
+}
diff --git a/examples/oft-main/sui/oft/sources/internal/rate_limiter.move b/examples/oft-main/sui/oft/sources/internal/rate_limiter.move
new file mode 100644
index 0000000000..d880d14ebd
--- /dev/null
+++ b/examples/oft-main/sui/oft/sources/internal/rate_limiter.move
@@ -0,0 +1,226 @@
+/// Rate Limiter Implementation for OFT
+///
+/// This module provides rate limiting functionality for cross-chain token transfers,
+/// implementing a sliding window rate limiter that decays linearly over time.
+module oft::rate_limiter;
+
+use std::u64;
+use sui::{clock::Clock, event, table::{Self, Table}};
+use utils::table_ext;
+
+// === Errors ===
+
+const EExceededRateLimit: u64 = 1;
+const EInvalidTimestamp: u64 = 2;
+const EInvalidWindowSeconds: u64 = 3;
+const ESameValue: u64 = 4;
+
+// === Structs ===
+
+/// Rate limiter containing all rate limits indexed by endpoint ID
+public struct RateLimiter has store {
+ /// Direction of the rate limit
+ direction: Direction,
+ /// Table mapping endpoint IDs to their rate limit configurations
+ rate_limit_by_eid: Table,
+}
+
+/// Rate limit configuration for a specific endpoint
+public struct RateLimit has copy, drop, store {
+ /// Maximum amount that can be in-flight within the time window
+ limit: u64,
+ /// Time window in seconds for the rate limit
+ window_seconds: u64,
+ /// Amount in-flight at the last checkpoint
+ in_flight_on_last_update: u64,
+ /// Timestamp of the last update in seconds
+ last_update: u64,
+}
+
+public enum Direction has copy, drop, store {
+ Inbound,
+ Outbound,
+}
+
+// === Events ===
+
+/// Emitted when a new rate limit is set for an endpoint
+public struct RateLimitSetEvent has copy, drop {
+ /// Direction of the rate limit
+ direction: Direction,
+ /// Remote endpoint ID
+ eid: u32,
+ /// Rate limit amount
+ limit: u64,
+ /// Time window in seconds
+ window_seconds: u64,
+}
+
+/// Emitted when an existing rate limit is updated
+public struct RateLimitUpdatedEvent has copy, drop {
+ /// Direction of the rate limit
+ direction: Direction,
+ /// Remote endpoint ID
+ eid: u32,
+ /// New rate limit amount
+ limit: u64,
+ /// New time window in seconds
+ window_seconds: u64,
+}
+
+/// Emitted when a rate limit is removed
+public struct RateLimitUnsetEvent has copy, drop {
+ /// Direction of the rate limit
+ direction: Direction,
+ /// Remote endpoint ID for which rate limit was removed
+ eid: u32,
+}
+
+// === Creation ===
+
+/// Creates a new rate limiter
+public(package) fun create(inbound: bool, ctx: &mut tx_context::TxContext): RateLimiter {
+ RateLimiter {
+ rate_limit_by_eid: table::new(ctx),
+ direction: if (inbound) Direction::Inbound else Direction::Outbound,
+ }
+}
+
+// === Rate Limit Core Functions ===
+
+/// Consume rate limit capacity for a given EID or abort if the capacity is exceeded
+public(package) fun try_consume_rate_limit_capacity(self: &mut RateLimiter, eid: u32, amount: u64, clock: &Clock) {
+ if (!self.has_rate_limit(eid)) return;
+
+ self.checkpoint_rate_limit_in_flight(eid, clock);
+ let rate_limit = &mut self.rate_limit_by_eid[eid];
+ assert!(rate_limit.in_flight_on_last_update + amount <= rate_limit.limit, EExceededRateLimit);
+ rate_limit.in_flight_on_last_update = rate_limit.in_flight_on_last_update + amount;
+}
+
+/// Release rate limit capacity for a given EID
+/// This is used when wanting to rate limit by net inflow - outflow
+/// This will release the capacity back to the rate limit up to the limit itself
+public(package) fun release_rate_limit_capacity(self: &mut RateLimiter, eid: u32, amount: u64, clock: &Clock) {
+ if (!self.has_rate_limit(eid)) return;
+
+ self.checkpoint_rate_limit_in_flight(eid, clock);
+ let rate_limit = &mut self.rate_limit_by_eid[eid];
+ if (amount >= rate_limit.in_flight_on_last_update) {
+ rate_limit.in_flight_on_last_update = 0;
+ } else {
+ rate_limit.in_flight_on_last_update = rate_limit.in_flight_on_last_update - amount;
+ }
+}
+
+// === Rate Limit Management ===
+
+/// Set the rate limit and the window at the current timestamp
+/// The capacity of the rate limit increases by limit/window_s until it reaches the limit and stays there
+public(package) fun set_rate_limit(self: &mut RateLimiter, eid: u32, limit: u64, window_seconds: u64, clock: &Clock) {
+ assert!(window_seconds > 0, EInvalidWindowSeconds);
+ // If the rate limit is already set, checkpoint the in-flight amount before updating the rate limit
+ if (self.has_rate_limit(eid)) {
+ let (prior_limit, prior_window_seconds) = self.rate_limit_config(eid);
+ assert!(limit != prior_limit || window_seconds != prior_window_seconds, ESameValue);
+
+ // Checkpoint the in-flight amount before updating the rate settings. If this is not saved, it could change
+ // the in-flight calculation amount retroactively
+ self.checkpoint_rate_limit_in_flight(eid, clock);
+
+ let rate_limit = &mut self.rate_limit_by_eid[eid];
+ rate_limit.limit = limit;
+ rate_limit.window_seconds = window_seconds;
+ event::emit(RateLimitUpdatedEvent { direction: self.direction, eid, limit, window_seconds });
+ } else {
+ table_ext::upsert!(
+ &mut self.rate_limit_by_eid,
+ eid,
+ RateLimit { limit, window_seconds, in_flight_on_last_update: 0, last_update: timestamp_seconds(clock) },
+ );
+ event::emit(RateLimitSetEvent { direction: self.direction, eid, limit, window_seconds });
+ }
+}
+
+/// Unset the rate limit for a given EID
+public(package) fun unset_rate_limit(self: &mut RateLimiter, eid: u32) {
+ assert!(self.has_rate_limit(eid), ESameValue);
+ self.rate_limit_by_eid.remove(eid);
+ event::emit(RateLimitUnsetEvent { direction: self.direction, eid });
+}
+
+// === Drop Function ===
+
+public(package) fun drop(self: RateLimiter) {
+ let RateLimiter { rate_limit_by_eid, .. } = self;
+ rate_limit_by_eid.drop();
+}
+
+// === View Functions ===
+
+/// Get the rate limit and window (in seconds) for a given EID
+public(package) fun rate_limit_config(self: &RateLimiter, eid: u32): (u64, u64) {
+ if (!self.has_rate_limit(eid)) {
+ (0, 0)
+ } else {
+ let rate_limit = &self.rate_limit_by_eid[eid];
+ (rate_limit.limit, rate_limit.window_seconds)
+ }
+}
+
+/// Get the in-flight amount for a given EID at present
+public(package) fun in_flight(self: &RateLimiter, eid: u32, clock: &Clock): u64 {
+ if (!self.has_rate_limit(eid)) {
+ 0
+ } else {
+ let rate_limit = &self.rate_limit_by_eid[eid];
+ let timestamp = timestamp_seconds(clock);
+ assert!(timestamp >= rate_limit.last_update, EInvalidTimestamp);
+ // If the timestamp is greater than the last update, calculate the decayed in-flight amount
+ let elapsed = timestamp - rate_limit.last_update;
+ let decay = ((((elapsed as u128) * (rate_limit.limit as u128)) / (rate_limit.window_seconds as u128)) as u64);
+
+ // Ensure the decayed in-flight amount is not negative
+ if (decay < rate_limit.in_flight_on_last_update) {
+ rate_limit.in_flight_on_last_update - decay
+ } else {
+ 0
+ }
+ }
+}
+
+/// Calculate the spare rate limit capacity for a given EID at present
+public(package) fun rate_limit_capacity(self: &RateLimiter, eid: u32, clock: &Clock): u64 {
+ if (!self.has_rate_limit(eid)) {
+ u64::max_value!()
+ } else {
+ let rate_limit = &self.rate_limit_by_eid[eid];
+ let current_in_flight = self.in_flight(eid, clock);
+ if (rate_limit.limit > current_in_flight) {
+ rate_limit.limit - current_in_flight
+ } else {
+ 0
+ }
+ }
+}
+
+// === Internal Functions ===
+
+/// Checkpoint the in-flight amount for a given EID for the provided timestamp
+/// This should be called whenever there is a change in rate limit or before consuming rate limit capacity
+fun checkpoint_rate_limit_in_flight(self: &mut RateLimiter, eid: u32, clock: &Clock) {
+ let inflight = self.in_flight(eid, clock);
+ let rate_limit = &mut self.rate_limit_by_eid[eid];
+ rate_limit.in_flight_on_last_update = inflight;
+ rate_limit.last_update = timestamp_seconds(clock);
+}
+
+/// Check if a rate limit is set for a given EID
+fun has_rate_limit(self: &RateLimiter, eid: u32): bool {
+ self.rate_limit_by_eid.contains(eid)
+}
+
+/// Convert clock timestamp from milliseconds to seconds
+fun timestamp_seconds(clock: &Clock): u64 {
+ clock.timestamp_ms() / 1000
+}
diff --git a/examples/oft-main/sui/oft/sources/oft-infos/oft_info_v1.move b/examples/oft-main/sui/oft/sources/oft-infos/oft_info_v1.move
new file mode 100644
index 0000000000..d06d6768dd
--- /dev/null
+++ b/examples/oft-main/sui/oft/sources/oft-infos/oft_info_v1.move
@@ -0,0 +1,81 @@
+/// OFT Info Module
+///
+/// This module defines the OFTInfo struct and related functions for encoding and decoding
+/// OFT (Omnichain Fungible Token) metadata. The OFTInfo is used to carry essential
+/// information about an OFT instance during cross-chain operations and endpoint registration.
+///
+/// The primary use case is to provide the LayerZero endpoint with information about
+/// the OFT object address for proper message routing and execution context.
+module oft::oft_info_v1;
+
+use sui::bcs;
+use utils::{buffer_reader, buffer_writer};
+
+// === Constants ===
+
+/// Version identifier for OFT info encoding format stored in oapp_info_v1.extra_info.
+/// - **Version 1**: Extended `oapp_info_v1.extra_info` to store complete OFTInfo structure
+/// containing oft_object.
+const INFO_VERSION: u16 = 1;
+
+// === Errors ===
+
+const EInvalidData: u64 = 1;
+const EInvalidVersion: u64 = 2;
+
+// === Structs ===
+
+/// Container for OFT metadata used in cross-chain operations.
+public struct OFTInfoV1 has copy, drop, store {
+ /// Address of the latest OFT package.
+ /// This may differ from the original package address if the OFT has been
+ /// migrated or upgraded to a new package version.
+ oft_package: address,
+ /// Address of the OFT object instance
+ oft_object: address,
+}
+
+// === Creation Functions ===
+
+/// Creates a new OFTInfoV1 instance with the specified OFT object address.
+public fun create(oft_package: address, oft_object: address): OFTInfoV1 {
+ OFTInfoV1 { oft_package, oft_object }
+}
+
+// === View Functions ===
+
+/// Returns the OFT latest package address
+public fun oft_package(self: &OFTInfoV1): address {
+ self.oft_package
+}
+
+/// Returns the OFT object address
+public fun oft_object(self: &OFTInfoV1): address {
+ self.oft_object
+}
+
+// === Serialization Functions ===
+
+/// Encodes OFTInfoV1 into a byte vector for cross-chain transmission.
+public fun encode(self: &OFTInfoV1): vector {
+ let mut writer = buffer_writer::new();
+ writer.write_u16(INFO_VERSION).write_bytes(bcs::to_bytes(self));
+ writer.to_bytes()
+}
+
+/// Decodes a byte vector back into an OFTInfoV1 struct.
+public fun decode(bytes: vector): OFTInfoV1 {
+ let mut reader = buffer_reader::create(bytes);
+
+ let version = reader.read_u16();
+ assert!(version == INFO_VERSION, EInvalidVersion);
+
+ let oft_info_bytes = reader.read_bytes_until_end();
+ let mut bcs_reader = bcs::new(oft_info_bytes);
+ let oft_package = bcs_reader.peel_address();
+ let oft_object = bcs_reader.peel_address();
+
+ assert!(bcs_reader.into_remainder_bytes().is_empty(), EInvalidData);
+
+ OFTInfoV1 { oft_package, oft_object }
+}
diff --git a/examples/oft-main/sui/oft/sources/oft.move b/examples/oft-main/sui/oft/sources/oft.move
new file mode 100644
index 0000000000..c27234a6b4
--- /dev/null
+++ b/examples/oft-main/sui/oft/sources/oft.move
@@ -0,0 +1,1062 @@
+/// Omnichain Fungible Token (OFT) Implementation
+///
+/// This module provides a comprehensive implementation of LayerZero's Omnichain Fungible Token (OFT)
+/// standard, enabling seamless cross-chain token transfers with advanced composability features.
+module oft::oft;
+
+use call::{call::{Call, Void}, call_cap::CallCap};
+use endpoint_v2::{
+ endpoint_quote::QuoteParam as EndpointQuoteParam,
+ endpoint_send::SendParam as EndpointSendParam,
+ endpoint_v2::{Self, EndpointV2},
+ lz_receive::LzReceiveParam,
+ messaging_composer::ComposeQueue,
+ messaging_fee::MessagingFee,
+ messaging_receipt::MessagingReceipt,
+ utils
+};
+use oapp::{endpoint_calls, oapp::{AdminCap, OApp}, oapp_info_v1};
+use oft::{
+ oft_fee::{Self, OFTFee},
+ oft_fee_detail::{Self, OFTFeeDetail},
+ oft_info_v1,
+ oft_limit::{Self, OFTLimit},
+ oft_msg_codec::{Self, OFTMessage},
+ oft_receipt::{Self, OFTReceipt},
+ oft_send_context::{Self, OFTSendContext},
+ oft_sender::OFTSender,
+ pausable::{Self, Pausable},
+ rate_limiter::{Self, RateLimiter},
+ send_param::SendParam
+};
+use oft_common::{
+ migration::{Self, MigrationTicket, MigrationCap},
+ oft_compose_msg_codec,
+ oft_composer_manager::OFTComposerManager
+};
+use std::u64;
+use sui::{bag, balance::{Self, Balance}, clock::Clock, coin::{Self, Coin, CoinMetadata, TreasuryCap}, event, sui::SUI};
+use utils::{bytes32::{Self, Bytes32}, package};
+use zro::zro::ZRO;
+
+// === Errors ===
+
+const EComposeMsgNotAllowed: u64 = 1;
+const EComposeMsgRequired: u64 = 2;
+const EInsufficientBalance: u64 = 3;
+const EInvalidAdminCap: u64 = 4;
+const EInvalidComposeQueue: u64 = 5;
+const EInvalidLocalDecimals: u64 = 6;
+const EInvalidMigrationCap: u64 = 7;
+const EInvalidSendContext: u64 = 8;
+const ESlippageExceeded: u64 = 9;
+const EWrongUpgradeVersion: u64 = 10;
+
+// === Constants ===
+
+/// Current version of the OFT package
+const UPGRADE_VERSION: u64 = 1;
+
+/// Message type for basic token transfers
+const SEND_TYPE: u16 = 1;
+/// Message type for token transfers with compose functionality
+const SEND_AND_CALL_TYPE: u16 = 2;
+
+// === Structs ===
+
+/// Omnichain Fungible Token (OFT) - Core contract enabling seamless cross-chain token transfers.
+public struct OFT has key {
+ /// Unique identifier for this OFT instance
+ id: UID,
+ /// Upgrade version used for upgrade compatibility(SUI native upgrade mechanism)
+ upgrade_version: u64,
+ /// Address of the associated OApp object
+ oapp_object: address,
+ /// Address of the admin capability
+ admin_cap: address,
+ /// Address of the migration capability(migrate to a completely new OFT contract)
+ migration_cap: address,
+ /// Capability granting this OFT authorization to make cross-chain calls via LayerZero
+ oft_cap: CallCap,
+ /// Token management strategy determining mint/burn vs escrow/release behavior
+ treasury: OFTTreasury,
+ /// Address reference to the coin metadata object for this token type
+ coin_metadata: address,
+ /// Multiplier for converting between local decimals and shared decimals (10^(local-shared))
+ decimal_conversion_rate: u64,
+ /// Standardized decimal precision used for cross-chain transfers (≤ local decimals)
+ shared_decimals: u8,
+ /// Emergency pausable functionality - when paused, blocks all send/receive operations
+ pausable: Pausable,
+ /// Manages fee configurations & fee application logic on sending
+ fee: OFTFee,
+ /// Manages ratelimit settings and inbound/outbound transfer flow control by token amount
+ inbound_rate_limiter: RateLimiter,
+ outbound_rate_limiter: RateLimiter,
+}
+
+/// Token management strategy defining how cross-chain transfers handle token supply.
+public enum OFTTreasury has store {
+ /// Standard OFT that mints/burns tokens using treasury capability.
+ OFT {
+ /// Treasury capability granting mint/burn privileges for the token type T
+ treasury_cap: TreasuryCap,
+ },
+ /// Adapter OFT that escrows/releases existing tokens from a balance pool.
+ OFTAdapter {
+ /// Token balance pool used for escrow (outbound) and release (inbound) operations
+ escrow: Balance,
+ },
+}
+
+// === Events ===
+
+public struct OFTInitedEvent has copy, drop {
+ /// Address of the associated OApp object
+ oapp_object: address,
+ /// Address of the newly initialized OFT object instance
+ oft_object: address,
+ /// Address of the associated coin metadata object defining token properties
+ coin_metadata: address,
+ /// Whether the OFT is an adapter OFT
+ is_adapter: bool,
+}
+
+public struct OFTSentEvent has copy, drop {
+ /// Unique identifier for this cross-chain message, used for tracking and correlation
+ guid: Bytes32,
+ /// Destination endpoint ID where tokens are being sent
+ dst_eid: u32,
+ /// Address that initiated the transfer (ctx.sender() or call_cap holder)
+ from_address: address,
+ /// Actual amount debited from sender in local decimals (after dust removal)
+ amount_sent_ld: u64,
+ /// Amount that will be credited to recipient in local decimals
+ amount_received_ld: u64,
+}
+
+public struct OFTReceivedEvent has copy, drop {
+ /// Unique identifier linking this receipt to the original send transaction
+ guid: Bytes32,
+ /// Source endpoint ID where tokens originated
+ src_eid: u32,
+ /// Address that will receive the credited tokens
+ to_address: address,
+ /// Amount credited to recipient in local decimals
+ amount_received_ld: u64,
+}
+
+// === OFT Initialization ===
+
+/// Initializes a standard OFT implementation using the mint/burn treasury model.
+///
+/// **Parameters**:
+/// - `oapp`: Configured OApp instance for cross-chain messaging
+/// - `oft_cap`: CallCap granting authorization for LayerZero operations
+/// - `treasury_cap`: Treasury capability enabling mint/burn operations
+/// - `coin_metadata`: Metadata object defining token properties and decimals
+/// - `shared_decimals`: Standardized decimal precision for cross-chain transfers
+///
+/// **Returns**: Migration capability for future migrations of this OFT
+public(package) fun init_oft(
+ oapp: &OApp,
+ oft_cap: CallCap,
+ treasury_cap: TreasuryCap,
+ coin_metadata: &CoinMetadata,
+ shared_decimals: u8,
+ ctx: &mut TxContext,
+): MigrationCap {
+ oapp.assert_oapp_cap(&oft_cap);
+ let (oft, migration_cap) = init_oft_internal(
+ oapp,
+ oft_cap,
+ coin_metadata,
+ shared_decimals,
+ OFTTreasury::OFT { treasury_cap },
+ false,
+ ctx,
+ );
+ transfer::share_object(oft);
+ migration_cap
+}
+
+/// Initializes an adapter OFT implementation using the escrow/release treasury model.
+///
+/// **Parameters**:
+/// - `oapp`: Configured OApp instance for cross-chain messaging
+/// - `oft_cap`: CallCap granting authorization for LayerZero operations
+/// - `coin_metadata`: Metadata object defining token properties and decimals
+/// - `shared_decimals`: Standardized decimal precision for cross-chain transfers
+///
+/// **Returns**: Migration capability for future migrations of this OFT adapter
+public(package) fun init_oft_adapter(
+ oapp: &OApp,
+ oft_cap: CallCap,
+ coin_metadata: &CoinMetadata,
+ shared_decimals: u8,
+ ctx: &mut TxContext,
+): MigrationCap {
+ oapp.assert_oapp_cap(&oft_cap);
+ let (oft, migration_cap) = init_oft_internal(
+ oapp,
+ oft_cap,
+ coin_metadata,
+ shared_decimals,
+ OFTTreasury::OFTAdapter { escrow: balance::zero() },
+ true,
+ ctx,
+ );
+ transfer::share_object(oft);
+ migration_cap
+}
+
+// === OFT Functions ===
+
+/// Provides a comprehensive quote for OFT send operations without executing the transaction.
+///
+/// **Parameters**:
+/// - `send_param`: Complete send parameters including amounts and destination
+///
+/// **Returns**: Tuple of (send_limits, fee_details, amount_receipt)
+/// - `OFTLimit`: Send restrictions and limits
+/// - `vector`: Fee details
+/// - `OFTReceipt`: Final amounts after dust removal and validation
+public fun quote_oft(
+ self: &OFT,
+ send_param: &SendParam,
+ clock: &Clock,
+): (OFTLimit, vector, OFTReceipt) {
+ self.assert_upgrade_version();
+ self.pausable.assert_not_paused();
+
+ // Outbound rate limit capacity
+ let max_amount_ld = self.outbound_rate_limiter.rate_limit_capacity(send_param.dst_eid(), clock);
+ let oft_limit = oft_limit::create(0, max_amount_ld);
+
+ // Fee details
+ let (amount_sent_ld, amount_received_ld) = self.debit_view(
+ send_param.dst_eid(),
+ send_param.amount_ld(),
+ send_param.min_amount_ld(),
+ );
+ let oft_fee_details = if (amount_sent_ld > amount_received_ld) {
+ vector[oft_fee_detail::create(amount_sent_ld - amount_received_ld, false, b"OFT Fee".to_ascii_string())]
+ } else {
+ vector[]
+ };
+
+ // Receipt
+ let oft_receipt = oft_receipt::create(amount_sent_ld, amount_received_ld);
+
+ (oft_limit, oft_fee_details, oft_receipt)
+}
+
+/// Quotes LayerZero messaging fees required for cross-chain token transfers.
+///
+/// **Parameters**:
+/// - `oapp`: Associated OApp instance that can only be called by this OFT object
+/// - `sender`: Address that will send the transfer (for message attribution)
+/// - `send_param`: Complete transfer parameters including destination and execution options
+/// - `pay_in_zro`: Whether to use ZRO tokens for fee payment
+///
+/// **Returns**: Quote call to send to the endpoint to get the messaging fees
+public fun quote_send(
+ self: &OFT,
+ oapp: &OApp,
+ sender: address,
+ send_param: &SendParam,
+ pay_in_zro: bool,
+ ctx: &mut TxContext,
+): Call {
+ self.assert_upgrade_version();
+ self.pausable.assert_not_paused();
+ let (_, amount_received_ld) = self.debit_view(
+ send_param.dst_eid(),
+ send_param.amount_ld(),
+ send_param.min_amount_ld(),
+ );
+ let (message, options) = self.build_msg_and_options(oapp, sender, send_param, amount_received_ld);
+ oapp.quote(&self.oft_cap, send_param.dst_eid(), message, options, pay_in_zro, ctx)
+}
+
+/// Confirms and extracts results from a quote operation.
+///
+/// This function consumes a Call object returned by `quote_send()` to extract the
+/// quote parameters and messaging fee, providing access to the quote results.
+///
+/// **Parameters**
+/// - `oapp`: Associated OApp instance that can only be called by this OFT object with the hold of the oft_cap
+/// - `call`: Completed Call object from `quote_send()` execution
+///
+/// **Returns**
+/// - `MessagingFee`: Fee required for sending the message
+public fun confirm_quote_send(
+ self: &OFT,
+ oapp: &OApp,
+ call: Call,
+): MessagingFee {
+ self.assert_upgrade_version();
+ let (_, fee) = oapp.confirm_quote(&self.oft_cap, call);
+ fee
+}
+
+/// Initiates a cross-chain token transfer with flexible sender options.
+///
+/// **Parameters**:
+/// - `oapp`: Associated OApp instance that can only be called by this OFT object
+/// - `sender`: Reference to OFTSender (Context or CallCap) specifying the sender address
+/// - `send_param`: Transfer parameters (destination, amount, options, etc.)
+/// - `coin_provided`: Coin to debit tokens from (must have sufficient balance)
+/// - `native_coin_fee`: SUI tokens for paying messaging fees
+/// - `zro_coin_fee`: Optional ZRO tokens for alternative fee payment
+/// - `refund_address`: Optional address to auto refund unspent fee tokens, if not provided, return Coins to the caller
+/// - `clock`: Clock object for rate limiting and timestamp-based operations
+///
+/// **Returns**:
+/// - `Call`: Endpoint call for message sending (execute this first)
+/// - `OFTSendContext`: Send context containing the OFTReceipt and sender info required for `confirm_send()`
+public fun send(
+ self: &mut OFT,
+ oapp: &mut OApp,
+ sender: &OFTSender,
+ send_param: &SendParam,
+ coin_provided: &mut Coin,
+ native_coin_fee: Coin,
+ zro_coin_fee: Option>,
+ refund_address: Option,
+ clock: &Clock,
+ ctx: &mut TxContext,
+): (Call, OFTSendContext) {
+ self.assert_upgrade_version();
+ self.pausable.assert_not_paused();
+
+ let (amount_sent_ld, amount_received_ld) = self.debit(
+ coin_provided,
+ send_param.dst_eid(),
+ send_param.amount_ld(),
+ send_param.min_amount_ld(),
+ ctx,
+ );
+ let oft_receipt = oft_receipt::create(amount_sent_ld, amount_received_ld);
+
+ // Release rate limit capacity for the pathway (net inflow), based on the amount received on the other side
+ self.inbound_rate_limiter.release_rate_limit_capacity(send_param.dst_eid(), amount_received_ld, clock);
+ // Consume rate limit capacity for the pathway (net outflow), based on the amount received on the other side
+ self.outbound_rate_limiter.try_consume_rate_limit_capacity(send_param.dst_eid(), amount_received_ld, clock);
+
+ let (message, options) = self.build_msg_and_options(oapp, sender.get_address(), send_param, amount_received_ld);
+ let ep_call = oapp.lz_send(
+ &self.oft_cap,
+ send_param.dst_eid(),
+ message,
+ options,
+ native_coin_fee,
+ zro_coin_fee,
+ refund_address,
+ ctx,
+ );
+
+ let call_id = ep_call.id();
+ (ep_call, oft_send_context::create(oft_receipt, sender.get_address(), call_id))
+}
+
+/// Confirms and finalizes a token send operation with flexible fee handling.
+///
+/// This function must be called after executing a `Call` returned by `send()`.
+/// It performs final validation of the send operation, resets the OApp's sending state, and
+/// either transfers unspent fees to a refund address (if provided) or returns them to the caller.
+///
+/// **Parameters:**
+/// - `oapp`: Associated OApp instance that can only be called by this OFT object with the hold of the oft_cap
+/// - `call`: The completed Call object returned from LayerZero endpoint execution
+/// - `sender`: Reference to OFTSender used for authorization validation
+/// - `send_context`: OFTSendContext created by the corresponding `send()` call
+///
+/// **Returns**
+/// - `MessagingReceipt`: Receipt containing message details (nonce, fee, etc.)
+/// - `OFTReceipt`: Receipt containing OFT-specific transfer details
+/// - `Option>`: Unspent native token fees (None if auto-refunded, Some if returned to caller)
+/// - `Option>`: Unspent ZRO token fees (None if auto-refunded, Some if returned to caller)
+public fun confirm_send(
+ self: &OFT,
+ oapp: &mut OApp,
+ sender: &OFTSender,
+ call: Call,
+ send_context: OFTSendContext,
+): (MessagingReceipt, OFTReceipt, Option>, Option>) {
+ self.assert_upgrade_version();
+ let (oft_receipt, from_address, call_id) = send_context.destroy();
+ assert!(sender.get_address() == from_address && call.id() == call_id, EInvalidSendContext);
+
+ let (param, messaging_receipt) = oapp.confirm_lz_send(&self.oft_cap, call);
+ event::emit(OFTSentEvent {
+ guid: messaging_receipt.guid(),
+ dst_eid: param.dst_eid(),
+ from_address,
+ amount_sent_ld: oft_receipt.amount_sent_ld(),
+ amount_received_ld: oft_receipt.amount_received_ld(),
+ });
+
+ // Refund the tokens to the refund address if provided.
+ let (native_token, zro_token) = if (param.refund_address().is_some()) {
+ let refund_address = param.refund_address().destroy_some();
+ let (native_token, zro_token) = param.destroy();
+ utils::transfer_coin(native_token, refund_address);
+ utils::transfer_coin_option(zro_token, refund_address);
+ (option::none(), option::none())
+ } else {
+ let (native_token, zro_token) = param.destroy();
+ (option::some(native_token), zro_token)
+ };
+ (messaging_receipt, oft_receipt, native_token, zro_token)
+}
+
+/// Processes inbound cross-chain token transfers and delivers tokens directly to the recipient.
+///
+/// **Parameters**:
+/// - `oapp`: Associated OApp instance that can only be called by this OFT object
+/// - `call`: LayerZero receive call containing the verified cross-chain message
+/// - `clock`: Clock object for rate limiting and timestamp-based operations
+///
+/// **Note**: For transfers with compose functionality, use `lz_receive_with_compose` instead
+public fun lz_receive(
+ self: &mut OFT,
+ oapp: &OApp,
+ call: Call,
+ clock: &Clock,
+ ctx: &mut TxContext,
+) {
+ self.assert_upgrade_version();
+ self.pausable.assert_not_paused();
+
+ let (_src_eid, _nonce, _guid, coin_credited, oft_msg) = self.lz_receive_internal(oapp, call, clock, ctx);
+ assert!(!oft_msg.is_composed(), EComposeMsgNotAllowed);
+ utils::transfer_coin(coin_credited, oft_msg.send_to());
+}
+
+/// Processes inbound cross-chain token transfers with compose functionality for advanced workflows.
+///
+/// **Parameters**:
+/// - `oapp`: Associated OApp instance that can only be called by this OFT object
+/// - `compose_queue`: The composer's message queue for sequencing operations
+/// - `composer_manager`: Manager managing token deposits for composers
+/// - `call`: LayerZero receive call containing the verified cross-chain message
+/// - `clock`: Clock object for rate limiting and timestamp-based operations
+///
+/// **Note**: For simple transfers without compose, use `lz_receive` instead
+public fun lz_receive_with_compose(
+ self: &mut OFT,
+ oapp: &OApp,
+ compose_queue: &mut ComposeQueue,
+ composer_manager: &mut OFTComposerManager,
+ call: Call,
+ clock: &Clock,
+ ctx: &mut TxContext,
+) {
+ self.assert_upgrade_version();
+ self.pausable.assert_not_paused();
+
+ let (src_eid, nonce, guid, coin_credited, oft_msg) = self.lz_receive_internal(oapp, call, clock, ctx);
+ assert!(oft_msg.is_composed(), EComposeMsgRequired);
+ let composer = endpoint_v2::get_composer(compose_queue);
+ assert!(oft_msg.send_to() == composer, EInvalidComposeQueue);
+ let compose_msg = oft_compose_msg_codec::encode(
+ nonce,
+ src_eid,
+ coin_credited.value(),
+ oft_msg.compose_from().destroy_some(),
+ *oft_msg.compose_msg().borrow(),
+ );
+ composer_manager.send_to_composer(&self.oft_cap, guid, composer, coin_credited, ctx);
+ endpoint_v2::send_compose(&self.oft_cap, compose_queue, guid, 0, compose_msg);
+}
+
+// === Admin Functions ===
+
+/// Registers an OApp with the LayerZero v2 endpoint using extended OAppInfo.
+///
+/// **Parameters**:
+/// - `oapp`: Associated OApp instance that can only be called by this OFT object
+/// - `admin_cap`: Admin capability for authorization
+/// - `endpoint`: LayerZero v2 endpoint for registration
+/// - `lz_receive_info`: Original PTB execution instructions generated by `oft_ptb_builder`
+public fun register_oapp(
+ self: &OFT,
+ oapp: &OApp,
+ admin_cap: &AdminCap,
+ endpoint: &mut EndpointV2,
+ lz_receive_info: vector,
+ ctx: &mut TxContext,
+) {
+ self.assert_upgrade_version();
+ oapp.assert_oapp_cap(&self.oft_cap);
+ let oapp_info = oapp_info_v1::create(
+ object::id_address(oapp),
+ vector[],
+ lz_receive_info,
+ oft_info_v1::create(package::package_of_type>(), object::id_address(self)).encode(),
+ );
+ endpoint_calls::register_oapp(oapp, admin_cap, endpoint, oapp_info.encode(), ctx);
+}
+
+/// Controls the pause state of OFT operations for emergency situations.
+///
+/// **Parameters**:
+/// - `admin`: Admin capability proving authorization
+/// - `paused`: New pause state (true to pause, false to unpause)
+public fun set_pause(self: &mut OFT, admin: &AdminCap, paused: bool) {
+ self.assert_upgrade_version();
+ self.assert_admin(admin);
+ self.pausable.set_pause(paused);
+}
+
+// === Fee Management Admin Functions ===
+
+/// Sets the OFT fee deposit address where collected fees will be sent
+///
+/// **Parameters**:
+/// - `admin`: Admin capability proving authorization
+/// - `fee_deposit_address`: New address for fee deposits (cannot be zero address)
+public fun set_fee_deposit_address(self: &mut OFT, admin: &AdminCap, fee_deposit_address: address) {
+ self.assert_upgrade_version();
+ self.assert_admin(admin);
+ self.fee.set_fee_deposit_address(fee_deposit_address);
+}
+
+/// Sets the fee rate for a specific destination chain
+///
+/// **Parameters**:
+/// - `admin`: Admin capability proving authorization
+/// - `dst_eid`: Destination endpoint ID
+/// - `fee_bps`: Fee rate in basis points (0-10,000, where 10,000 = 100%)
+public fun set_fee_bps(self: &mut OFT, admin: &AdminCap, dst_eid: u32, fee_bps: u64) {
+ self.assert_upgrade_version();
+ self.assert_admin(admin);
+ self.fee.set_fee_bps(dst_eid, fee_bps);
+}
+
+/// Unset the fee rate for a specific destination chain
+///
+/// **Parameters**:
+/// - `admin`: Admin capability proving authorization
+/// - `dst_eid`: Destination endpoint ID
+public fun unset_fee_bps(self: &mut OFT, admin: &AdminCap, dst_eid: u32) {
+ self.assert_upgrade_version();
+ self.assert_admin(admin);
+ self.fee.unset_fee_bps(dst_eid);
+}
+
+/// Set the default fee rate for all destinations
+///
+/// **Parameters**:
+/// - `admin`: Admin capability proving authorization
+/// - `default_fee_bps`: Default fee rate in basis points (0-10,000)
+public fun set_default_fee_bps(self: &mut OFT, admin: &AdminCap, default_fee_bps: u64) {
+ self.assert_upgrade_version();
+ self.assert_admin(admin);
+ self.fee.set_default_fee_bps(default_fee_bps);
+}
+
+// === Rate Limiter Admin Functions ===
+
+/// Sets the rate limit for a specific endpoint
+///
+/// **Parameters**:
+/// - `admin`: Admin capability proving authorization
+/// - `eid`: Remote endpoint ID to set the rate limit for
+/// - `inbound`: Whether to set the inbound (true) or outbound (false) rate limit
+/// - `rate_limit`: Maximum token amount allowed per window
+/// - `window_seconds`: Duration of the rate limit window in seconds
+/// - `clock`: Clock object for timestamp-based rate limit calculations
+public fun set_rate_limit(
+ self: &mut OFT,
+ admin: &AdminCap,
+ eid: u32,
+ inbound: bool,
+ rate_limit: u64,
+ window_seconds: u64,
+ clock: &Clock,
+) {
+ self.assert_upgrade_version();
+ self.assert_admin(admin);
+ if (inbound) {
+ self.inbound_rate_limiter.set_rate_limit(eid, rate_limit, window_seconds, clock);
+ } else {
+ self.outbound_rate_limiter.set_rate_limit(eid, rate_limit, window_seconds, clock);
+ }
+}
+
+/// Unset the rate limit for a specific endpoint
+///
+/// **Parameters**:
+/// - `admin`: Admin capability proving authorization
+/// - `eid`: Remote endpoint ID to unset the rate limit for
+/// - `inbound`: Whether to unset the inbound (true) or outbound (false) rate limit
+public fun unset_rate_limit(self: &mut OFT, admin: &AdminCap, eid: u32, inbound: bool) {
+ self.assert_upgrade_version();
+ self.assert_admin(admin);
+ if (inbound) {
+ self.inbound_rate_limiter.unset_rate_limit(eid);
+ } else {
+ self.outbound_rate_limiter.unset_rate_limit(eid);
+ }
+}
+
+// === Migration Functions ===
+
+/// Dismantles an OFT instance and prepares its components for migration to a new contract.
+///
+/// **Parameters**:
+/// - `migration_cap`: Migration capability proving authorization to perform the operation
+///
+/// **Returns**:
+/// - `MigrationTicket`: Packaged components ready for migration
+public fun migrate(self: OFT, migration_cap: &MigrationCap, ctx: &mut TxContext): MigrationTicket {
+ self.assert_upgrade_version();
+ assert!(self.migration_cap == object::id_address(migration_cap), EInvalidMigrationCap);
+
+ let OFT { id, oft_cap, treasury, inbound_rate_limiter, outbound_rate_limiter, fee, .. } = self;
+ id.delete();
+ fee.drop();
+ inbound_rate_limiter.drop();
+ outbound_rate_limiter.drop();
+
+ let (treasury_cap, escrow) = match (treasury) {
+ OFTTreasury::OFT { treasury_cap } => (option::some(treasury_cap), option::none()),
+ OFTTreasury::OFTAdapter { escrow } => (option::none(), option::some(escrow)),
+ };
+ migration_cap.create_migration_ticket(oft_cap, treasury_cap, escrow, bag::new(ctx))
+}
+
+// === OFT View Functions ===
+
+/// Returns the OFT standard version (major, minor)
+public fun oft_version(self: &OFT): (u64, u64) {
+ self.assert_upgrade_version();
+ (1, 1)
+}
+
+/// Returns the upgrade version of this OFT instance
+public fun upgrade_version(self: &OFT): u64 {
+ self.assert_upgrade_version();
+ self.upgrade_version
+}
+
+/// Returns the address of the associated OApp object
+public fun oapp_object(self: &OFT): address {
+ self.assert_upgrade_version();
+ self.oapp_object
+}
+
+/// Returns the admin address for this OFT & OApp
+public fun admin_cap(self: &OFT): address {
+ self.assert_upgrade_version();
+ self.admin_cap
+}
+
+/// Returns the CallCap's identifier for this OFT.
+/// This serves as the OFT's unique contract identity in the LayerZero system.
+public fun oft_cap_id(self: &OFT): address {
+ self.assert_upgrade_version();
+ self.oft_cap.id()
+}
+
+/// Returns the migration capability address for this OFT
+public fun migration_cap(self: &OFT): address {
+ self.assert_upgrade_version();
+ self.migration_cap
+}
+
+/// Returns the address of the coin metadata object
+public fun coin_metadata(self: &OFT): address {
+ self.assert_upgrade_version();
+ self.coin_metadata
+}
+
+/// Returns the number of decimals used for cross-chain transfers
+public fun shared_decimals(self: &OFT): u8 {
+ self.assert_upgrade_version();
+ self.shared_decimals
+}
+
+/// Returns the decimal conversion rate
+public fun decimal_conversion_rate(self: &OFT): u64 {
+ self.assert_upgrade_version();
+ self.decimal_conversion_rate
+}
+
+/// Returns true if this is an adapter OFT (escrow model), false if standard OFT (mint/burn model)
+public fun is_adapter(self: &OFT): bool {
+ self.assert_upgrade_version();
+ match (&self.treasury) {
+ OFTTreasury::OFTAdapter { escrow: _ } => true,
+ OFTTreasury::OFT { treasury_cap: _ } => false,
+ }
+}
+
+// === Pausable View Functions ===
+
+/// Returns whether the OFT is currently paused
+public fun is_paused(self: &OFT): bool {
+ self.assert_upgrade_version();
+ self.pausable.is_paused()
+}
+
+// === Fee Management View Functions ===
+
+/// Returns true if the OFT has a fee rate greater than 0 for the specified destination
+public fun has_oft_fee(self: &OFT, dst_eid: u32): bool {
+ self.assert_upgrade_version();
+ self.fee.has_oft_fee(dst_eid)
+}
+
+/// Returns the effective fee rate for a specific destination chain
+public fun effective_fee_bps(self: &OFT, dst_eid: u32): u64 {
+ self.assert_upgrade_version();
+ self.fee.effective_fee_bps(dst_eid)
+}
+
+/// Returns the default fee rate
+public fun default_fee_bps(self: &OFT): u64 {
+ self.assert_upgrade_version();
+ self.fee.default_fee_bps()
+}
+
+/// Returns the fee rate for a specific destination chain
+public fun fee_bps(self: &OFT, dst_eid: u32): u64 {
+ self.assert_upgrade_version();
+ self.fee.fee_bps(dst_eid)
+}
+
+/// Returns the current fee deposit address
+public fun fee_deposit_address(self: &OFT): address {
+ self.assert_upgrade_version();
+ self.fee.fee_deposit_address()
+}
+
+// === Rate Limiter View Functions ===
+
+/// Returns the rate limit configuration for a specific endpoint ID
+public fun rate_limit_config(self: &OFT, eid: u32, inbound: bool): (u64, u64) {
+ self.assert_upgrade_version();
+ if (inbound) {
+ self.inbound_rate_limiter.rate_limit_config(eid)
+ } else {
+ self.outbound_rate_limiter.rate_limit_config(eid)
+ }
+}
+
+/// Returns the current amount in-flight for a specific endpoint ID's rate limit
+public fun rate_limit_in_flight(self: &OFT, eid: u32, inbound: bool, clock: &Clock): u64 {
+ self.assert_upgrade_version();
+ if (inbound) {
+ self.inbound_rate_limiter.in_flight(eid, clock)
+ } else {
+ self.outbound_rate_limiter.in_flight(eid, clock)
+ }
+}
+
+/// Returns the available rate limit capacity for a specific endpoint ID
+public fun rate_limit_capacity(self: &OFT, eid: u32, inbound: bool, clock: &Clock): u64 {
+ self.assert_upgrade_version();
+ if (inbound) {
+ self.inbound_rate_limiter.rate_limit_capacity(eid, clock)
+ } else {
+ self.outbound_rate_limiter.rate_limit_capacity(eid, clock)
+ }
+}
+
+// === Internal Functions ===
+
+/// Internal function to create OFT instances with common logic
+fun init_oft_internal(
+ oapp: &OApp,
+ oft_cap: CallCap,
+ coin_metadata: &CoinMetadata,
+ shared_decimals: u8,
+ treasury: OFTTreasury,
+ is_adapter: bool,
+ ctx: &mut TxContext,
+): (OFT, MigrationCap) {
+ let local_decimals = coin_metadata.get_decimals();
+ assert!(local_decimals >= shared_decimals, EInvalidLocalDecimals);
+ let decimal_conversion_rate = u64::pow(10, (local_decimals - shared_decimals));
+ let migration_cap = migration::new_migration_cap(ctx);
+
+ let oft = OFT {
+ id: object::new(ctx),
+ upgrade_version: UPGRADE_VERSION,
+ oapp_object: object::id_address(oapp),
+ admin_cap: oapp.admin_cap(),
+ migration_cap: object::id_address(&migration_cap),
+ oft_cap,
+ treasury,
+ coin_metadata: object::id_address(coin_metadata),
+ decimal_conversion_rate,
+ shared_decimals,
+ pausable: pausable::new(),
+ fee: oft_fee::new(ctx),
+ inbound_rate_limiter: rate_limiter::create(true, ctx),
+ outbound_rate_limiter: rate_limiter::create(false, ctx),
+ };
+
+ event::emit(OFTInitedEvent {
+ oapp_object: oft.oapp_object,
+ oft_object: object::id_address(&oft),
+ coin_metadata: object::id_address(coin_metadata),
+ is_adapter,
+ });
+
+ (oft, migration_cap)
+}
+
+/// Internal implementation of cross-chain token receive logic.
+fun lz_receive_internal(
+ self: &mut OFT,
+ oapp: &OApp,
+ call: Call,
+ clock: &Clock,
+ ctx: &mut TxContext,
+): (u32, u64, Bytes32, Coin, OFTMessage) {
+ // SECURITY: Delegate to OApp for LayerZero message validation and peer verification
+ // This ensures the message comes from a trusted source and passes all security checks
+ let lz_receive_param = oapp.lz_receive(&self.oft_cap, call);
+ let (src_eid, _, nonce, guid, message, _, _, value) = lz_receive_param.destroy();
+
+ // Decode OFT-specific payload and convert amounts to local precision
+ let oft_msg = oft_msg_codec::decode(message);
+ let amount_received_ld = self.to_ld(oft_msg.amount_sd());
+
+ // Release rate limit capacity for the pathway (net outflow)
+ self.outbound_rate_limiter.release_rate_limit_capacity(src_eid, amount_received_ld, clock);
+ // Consume rate limit capacity for the pathway (net inflow)
+ self.inbound_rate_limiter.try_consume_rate_limit_capacity(src_eid, amount_received_ld, clock);
+
+ // CRITICAL: Credit tokens according to treasury model (mint or release from escrow)
+ let coin_credited = self.credit(amount_received_ld, ctx);
+
+ event::emit(OFTReceivedEvent { guid, src_eid, to_address: oft_msg.send_to(), amount_received_ld });
+
+ // CLEANUP: Return any unintended native tokens to the executor
+ // This handles cases where the executor mistakenly sent native tokens with the message
+ utils::transfer_coin_option(value, ctx.sender());
+
+ (src_eid, nonce, guid, coin_credited, oft_msg)
+}
+
+/// Calculates final transfer amounts without executing the debit operation.
+/// Uses destination-specific fee if configured, otherwise no fee is applied.
+fun debit_view(self: &OFT, dst_eid: u32, amount_ld: u64, min_amount_ld: u64): (u64, u64) {
+ if (self.has_oft_fee(dst_eid)) {
+ debit_view_with_fee(self, dst_eid, amount_ld, min_amount_ld)
+ } else {
+ no_fee_debit_view(self, amount_ld, min_amount_ld)
+ }
+}
+
+/// Calculates final transfer amounts with destination-specific fee deduction.
+fun debit_view_with_fee(self: &OFT, dst_eid: u32, amount_ld: u64, min_amount_ld: u64): (u64, u64) {
+ let amount_ld_after_fee = self.fee.apply_fee(dst_eid, amount_ld);
+ let amount_received_ld = self.remove_dust(amount_ld_after_fee);
+ assert!(amount_received_ld >= min_amount_ld, ESlippageExceeded);
+ (amount_ld, amount_received_ld)
+}
+
+/// Calculates final transfer amounts without fee deduction.
+fun no_fee_debit_view(self: &OFT, amount_ld: u64, min_amount_ld: u64): (u64, u64) {
+ let amount_sent_ld = self.remove_dust(amount_ld);
+ let amount_received_ld = amount_sent_ld;
+ assert!(amount_received_ld >= min_amount_ld, ESlippageExceeded);
+ (amount_sent_ld, amount_received_ld)
+}
+
+/// Executes token debit operation based on OFT model (burn vs. escrow).
+fun debit(
+ self: &mut OFT,
+ coin: &mut Coin,
+ dst_eid: u32,
+ amount_ld: u64,
+ min_amount_ld: u64,
+ ctx: &mut TxContext,
+): (u64, u64) {
+ let (amount_sent_ld, amount_received_ld) = self.debit_view(dst_eid, amount_ld, min_amount_ld);
+ let coin_to_debit = coin.split(amount_received_ld, ctx);
+ if (amount_sent_ld > amount_received_ld) {
+ let fee_coin = coin.split(amount_sent_ld - amount_received_ld, ctx);
+ utils::transfer_coin(fee_coin, self.fee.fee_deposit_address());
+ };
+
+ // Execute treasury-model-specific debit operation
+ // SECURITY: This is the critical point where tokens leave circulation (burn) or availability (escrow)
+ match (&mut self.treasury) {
+ OFTTreasury::OFT { treasury_cap } => {
+ // Standard OFT: Burn tokens to reduce total supply across all chains
+ // This approach is suitable for tokens where the protocol controls total supply
+ treasury_cap.burn(coin_to_debit);
+ },
+ OFTTreasury::OFTAdapter { escrow } => {
+ // Adapter OFT: Escrow tokens to maintain fixed total supply
+ // Tokens remain in existence but are locked until released on message receipt
+ let escrowed_balance = coin_to_debit.into_balance();
+ escrow.join(escrowed_balance);
+ },
+ };
+
+ (amount_sent_ld, amount_received_ld)
+}
+
+/// Executes token credit operation based on OFT model (mint vs. release from escrow).
+fun credit(self: &mut OFT, amount_ld: u64, ctx: &mut TxContext): Coin {
+ // Execute treasury-model-specific credit operation
+ // SECURITY: This is where tokens enter circulation (mint) or availability (release from escrow)
+ match (&mut self.treasury) {
+ OFTTreasury::OFT { treasury_cap } => {
+ // Standard OFT: Mint new tokens, increasing total supply
+ // Only possible if this OFT instance holds the treasury capability
+ treasury_cap.mint(amount_ld, ctx)
+ },
+ OFTTreasury::OFTAdapter { escrow } => {
+ // Adapter OFT: Release tokens from escrow balance
+ // CRITICAL: Must have sufficient escrowed tokens from previous inbound transfers
+ assert!(escrow.value() >= amount_ld, EInsufficientBalance);
+ let released_balance = escrow.split(amount_ld);
+ coin::from_balance(released_balance, ctx)
+ },
+ }
+}
+
+/// Constructs the LayerZero message payload and execution options for cross-chain transmission.
+fun build_msg_and_options(
+ self: &OFT,
+ oapp: &OApp,
+ sender: address,
+ send_param: &SendParam,
+ amount_ld: u64,
+): (vector, vector